diff --git a/scripts/generate_unicode_data.cr b/scripts/generate_unicode_data.cr index cc04c816dcfc..5adb4bcd036c 100644 --- a/scripts/generate_unicode_data.cr +++ b/scripts/generate_unicode_data.cr @@ -8,12 +8,20 @@ require "../src/compiler/crystal/formatter" UCD_ROOT = "http://www.unicode.org/Public/#{Unicode::VERSION}/ucd/" +enum DecompositionType + None + Canonical + Compatibility +end + # Each entry in UnicodeData.txt # (some info is missing but we don't use it yet) record Entry, codepoint : Int32, name : String, general_category : String, + decomposition_type : DecompositionType, + decomposition_mapping : Array(Int32)?, upcase : Int32?, downcase : Int32?, casefold : Int32? @@ -25,6 +33,8 @@ record SpecialCase, record CaseRange, low : Int32, high : Int32, delta : Int32 record AlternateRange, low : Int32, high : Int32 record Stride, low : Int32, high : Int32, stride : Int32 +record CanonicalCombiningClassRange, low : Int32, high : Int32, ccc : UInt8 +record QuickCheckRange, low : Int32, high : Int32, result : Unicode::QuickCheckResult def case_ranges(entries, &block) ranges = [] of CaseRange @@ -140,6 +150,9 @@ special_cases_downcase = [] of SpecialCase special_cases_upcase = [] of SpecialCase special_cases_casefold = [] of SpecialCase casefold_mapping = Hash(Int32, Int32).new +canonical_combining_classes = [] of CanonicalCombiningClassRange +full_composition_exclusions = Set(Int32).new +quick_checks = Unicode::NormalizationForm.values.to_h { |kind| {kind, Array(QuickCheckRange).new} } url = "#{UCD_ROOT}CaseFolding.txt" body = HTTP::Client.get(url).body @@ -175,10 +188,29 @@ body.each_line do |line| codepoint = pieces[0].to_i(16) name = pieces[1] general_category = pieces[2] + # don't read CanonicalCombiningClass here; the derived properties file has + # exact ranges + decomposition = pieces[5] + if decomposition.starts_with?('<') + decomposition_mapping = decomposition.partition("> ")[2].split.map(&.to_i(16)) + decomposition_type = DecompositionType::Compatibility + else + decomposition_mapping = decomposition.presence.try &.split.map(&.to_i(16)) + decomposition_type = decomposition_mapping.nil? ? DecompositionType::None : DecompositionType::Canonical + end upcase = pieces[12].to_i?(16) downcase = pieces[13].to_i?(16) casefold = casefold_mapping[codepoint]? - entries << Entry.new(codepoint, name, general_category, upcase, downcase, casefold) + entries << Entry.new( + codepoint: codepoint, + name: name, + general_category: general_category, + decomposition_type: decomposition_type, + decomposition_mapping: decomposition_mapping, + upcase: upcase, + downcase: downcase, + casefold: casefold, + ) end url = "#{UCD_ROOT}SpecialCasing.txt" @@ -209,6 +241,39 @@ body.each_line do |line| end end +url = "#{UCD_ROOT}extracted/DerivedCombiningClass.txt" +body = HTTP::Client.get(url).body +body.each_line do |line| + line = line.strip + + if m = line.match(/^([0-9A-F]+)(?:\.\.([0-9A-F]+))?\s*;\s*(\d+)/) + ccc = m[3].to_u8 + next if ccc == 0 + low = m[1].to_i(16) + high = m[2]?.try(&.to_i(16)) || low + canonical_combining_classes << CanonicalCombiningClassRange.new(low, high, ccc) + end +end + +url = "#{UCD_ROOT}DerivedNormalizationProps.txt" +body = HTTP::Client.get(url).body +body.each_line do |line| + line = line.strip + break if line.starts_with?("# Derived Property: Expands_On_NFD") + + if m = line.match(/^([0-9A-F]+)(?:\.\.([0-9A-F]+))?\s*;\s*Full_Composition_Exclusion/) + low = m[1].to_i(16) + high = m[2]?.try(&.to_i(16)) || low + (low..high).each { |codepoint| full_composition_exclusions << codepoint } + elsif m = line.match(/^([0-9A-F]+)(?:\.\.([0-9A-F]+))?\s*;\s*(NFC|NFD|NFKC|NFKD)_QC\s*;\s*(N|M)/) + low = m[1].to_i(16) + high = m[2]?.try(&.to_i(16)) || low + quick_check = quick_checks[Unicode::NormalizationForm.parse(m[3])] + result = m[4] == "M" ? Unicode::QuickCheckResult::Maybe : Unicode::QuickCheckResult::No + quick_check << QuickCheckRange.new(low, high, result) + end +end + downcase_ranges = case_ranges entries, &.downcase downcase_one_ranges, downcase_ranges = downcase_ranges.partition { |r| r.delta == 1 } @@ -226,8 +291,47 @@ categories.each do |category| all_strides[category] = strides entries, category, &.general_category end -output = String.build do |str| - ECR.embed "#{__DIR__}/unicode_data.ecr", str +canonical_combining_classes.sort_by! &.low + +canonical_decompositions = entries.compact_map do |entry| + next unless entry.decomposition_type.canonical? + mapping = entry.decomposition_mapping.not_nil! + raise "BUG: mapping longer than 2 codepoints" unless mapping.size <= 2 + {entry.codepoint, mapping[0], mapping[1]? || 0} end + +# Instead of storing the codepoints for each compatibility decomposition as an +# individual `Array`, we store all of them in a single `Array` and refer to its +# subsequences using index and count. +compatibility_decomposition_data = [] of Int32 +compatibility_decompositions = entries.compact_map do |entry| + next unless entry.decomposition_type.compatibility? + mapping = entry.decomposition_mapping.not_nil! + + # We try to reuse any existing subsequences in the table that match this + # entry's decomposition mapping. This reduces the table size by over 40%, + # mainly due to singleton decompositions. It can be further optimized by + # solving the shortest common superstring problem. + index = (0..compatibility_decomposition_data.size - mapping.size).find do |i| + (0...mapping.size).all? do |j| + mapping[j] == compatibility_decomposition_data[i + j] + end + end + unless index + index = compatibility_decomposition_data.size + compatibility_decomposition_data.concat(mapping) + end + + {entry.codepoint, index, mapping.size} +end + +canonical_compositions = canonical_decompositions.compact_map do |codepoint, first, second| + next if second == 0 || full_composition_exclusions.includes?(codepoint) + {(first.to_i64 << 21) | second, codepoint} +end + +quick_checks.each_value &.sort_by! &.low + +output = ECR.render "#{__DIR__}/unicode_data.ecr" output = Crystal.format(output) File.write("#{__DIR__}/../src/unicode/data.cr", output) diff --git a/scripts/unicode_data.ecr b/scripts/unicode_data.ecr index b8c695799d46..e48559408926 100644 --- a/scripts/unicode_data.ecr +++ b/scripts/unicode_data.ecr @@ -7,45 +7,33 @@ module Unicode # Most case conversions map a range to another range. # Here we store: {from, to, delta} - @@upcase_ranges : Array({Int32, Int32, Int32})? - - private def self.upcase_ranges - @@upcase_ranges ||= begin - data = Array({Int32, Int32, Int32}).new(<%= upcase_ranges.size %>) - <%- upcase_ranges.each do |range| -%> - put(data, <%= range.low %>, <%= range.high %>, <%= range.delta %>) - <%- end -%> - data - end + private class_getter upcase_ranges : Array({Int32, Int32, Int32}) do + data = Array({Int32, Int32, Int32}).new(<%= upcase_ranges.size %>) + <%- upcase_ranges.each do |range| -%> + put(data, <%= range.low %>, <%= range.high %>, <%= range.delta %>) + <%- end -%> + data end # Most case conversions map a range to another range. # Here we store: {from, to, delta} - @@downcase_ranges : Array({Int32, Int32, Int32})? - - private def self.downcase_ranges - @@downcase_ranges ||= begin - data = Array({Int32, Int32, Int32}).new(<%= downcase_ranges.size %>) - <%- downcase_ranges.each do |range| -%> - put(data, <%= range.low %>, <%= range.high %>, <%= range.delta %>) - <%- end -%> - data - end + private class_getter downcase_ranges : Array({Int32, Int32, Int32}) do + data = Array({Int32, Int32, Int32}).new(<%= downcase_ranges.size %>) + <%- downcase_ranges.each do |range| -%> + put(data, <%= range.low %>, <%= range.high %>, <%= range.delta %>) + <%- end -%> + data end # Other case conversions run in an alternated range # of uppercase/lowercase transformations # Here we store {from, to} - @@alternate_ranges : Array({Int32, Int32})? - - private def self.alternate_ranges - @@alternate_ranges ||= begin - data = Array({Int32, Int32}).new(<%= alternate_ranges.size %>) - <%- alternate_ranges.each do |range| -%> - put(data, <%= range.low %>, <%= range.high %>) - <%- end -%> - data - end + private class_getter alternate_ranges : Array({Int32, Int32}) do + data = Array({Int32, Int32}).new(<%= alternate_ranges.size %>) + <%- alternate_ranges.each do |range| -%> + put(data, <%= range.low %>, <%= range.high %>) + <%- end -%> + data end # We store categories as consecutive strides {from, to, stride} @@ -58,85 +46,178 @@ module Unicode # The values are: 1..10, 11, 13, 15 <%- all_strides.each do |category, strides| -%> - @@category_<%= category %> : Array({Int32, Int32, Int32})? - - private def self.category_<%= category %> - @@category_<%= category %> ||= begin - data = Array({Int32, Int32, Int32}).new(<%= strides.size %>) - <%- strides.each do |stride| -%> - put(data, <%= stride.low %>, <%= stride.high %>, <%= stride.stride %>) - <%- end -%> - data - end + private class_getter category_<%= category %> : Array({Int32, Int32, Int32}) do + data = Array({Int32, Int32, Int32}).new(<%= strides.size %>) + <%- strides.each do |stride| -%> + put(data, <%= stride.low %>, <%= stride.high %>, <%= stride.stride %>) + <%- end -%> + data end <%- end %> # Most casefold conversions map a range to another range. # Here we store: {from, to, delta} - @@casefold_ranges : Array({Int32, Int32, Int32})? - - private def self.casefold_ranges - @@casefold_ranges ||= begin - data = Array({Int32, Int32, Int32}).new(<%= casefold_ranges.size %>) - <%- casefold_ranges.each do |range| -%> - put(data, <%= range.low %>, <%= range.high %>, <%= range.delta %>) - <%- end -%> - data - end + private class_getter casefold_ranges : Array({Int32, Int32, Int32}) do + data = Array({Int32, Int32, Int32}).new(<%= casefold_ranges.size %>) + <%- casefold_ranges.each do |range| -%> + put(data, <%= range.low %>, <%= range.high %>, <%= range.delta %>) + <%- end -%> + data end # Special downcase transformation that involve mapping a codepoint # to multiple codepoints. The maximum transformation is always 3 # codepoints, so we store them all as 3 codepoints and 0 means end. - @@special_cases_downcase : Hash(Int32, {Int32, Int32, Int32})? - - private def self.special_cases_downcase - @@special_cases_downcase ||= begin - data = Hash(Int32, {Int32, Int32, Int32}).new(initial_capacity: <%= special_cases_downcase.size %>) - <%- special_cases_downcase.each do |a_case| -%> - put(data, <%= a_case.codepoint %>, <%= a_case.value.join(", ") %>) - <%- end %> - data - end + private class_getter special_cases_downcase : Hash(Int32, {Int32, Int32, Int32}) do + data = Hash(Int32, {Int32, Int32, Int32}).new(initial_capacity: <%= special_cases_downcase.size %>) + <%- special_cases_downcase.each do |a_case| -%> + put(data, <%= a_case.codepoint %>, <%= a_case.value.join(", ") %>) + <%- end %> + data end # Special upcase transformation that involve mapping a codepoint # to multiple codepoints. The maximum transformation is always 3 # codepoints, so we store them all as 3 codepoints and 0 means end. - @@special_cases_upcase : Hash(Int32, {Int32, Int32, Int32})? - - private def self.special_cases_upcase - @@special_cases_upcase ||= begin - data = Hash(Int32, {Int32, Int32, Int32}).new(initial_capacity: <%= special_cases_upcase.size %>) - <%- special_cases_upcase.each do |a_case| -%> - put(data, <%= a_case.codepoint %>, <%= a_case.value.join(", ") %>) - <%- end %> - data - end + private class_getter special_cases_upcase : Hash(Int32, {Int32, Int32, Int32}) do + data = Hash(Int32, {Int32, Int32, Int32}).new(initial_capacity: <%= special_cases_upcase.size %>) + <%- special_cases_upcase.each do |a_case| -%> + put(data, <%= a_case.codepoint %>, <%= a_case.value.join(", ") %>) + <%- end %> + data end # Fold case transformation that involve mapping a codepoint # to multiple codepoints. The maximum transformation is always 4 # codepoints, so we store them all as 4 codepoints and 0 means end. - @@fold_cases : Hash(Int32, {Int32, Int32, Int32, Int32})? - private def self.fold_cases - @@fold_cases ||= begin - data = Hash(Int32, {Int32, Int32, Int32, Int32}).new(initial_capacity: <%= special_cases_casefold.size %>) - <%- special_cases_casefold.each do |a_case| -%> - put(data, <%= a_case.codepoint %>, <%= a_case.value.join(", ") %>) - <%- end -%> - data - end + private class_getter fold_cases : Hash(Int32, {Int32, Int32, Int32, Int32}) do + data = Hash(Int32, {Int32, Int32, Int32, Int32}).new(initial_capacity: <%= special_cases_casefold.size %>) + <%- special_cases_casefold.each do |a_case| -%> + put(data, <%= a_case.codepoint %>, <%= a_case.value.join(", ") %>) + <%- end -%> + data + end + + # Canonical combining classes. Only non-zero entries are stored. Unicode + # guarantees that all class values are within `0..254`. + # Here we store: {from, to, class} + private class_getter canonical_combining_classes : Array({Int32, Int32, UInt8}) do + data = Array({Int32, Int32, UInt8}).new(<%= canonical_combining_classes.size %>) + <%- canonical_combining_classes.each do |range| -%> + put(data, <%= range.low %>, <%= range.high %>, <%= range.ccc %>_u8) + <%- end -%> + data + end + + # Canonical decomposition mappings, excluding Hangul syllables. The maximum + # transformation is always 2 codepoints, so we store them all as 2 codepoints + # and 0 means end. + private class_getter canonical_decompositions : Hash(Int32, {Int32, Int32}) do + data = Hash(Int32, {Int32, Int32}).new(initial_capacity: <%= canonical_decompositions.size %>) + <%- canonical_decompositions.each do |decomp| -%> + put(data, <%= decomp.join(", ") %>) + <%- end -%> + data + end + + # Codepoints for compatibility decomposition mappings. + private class_getter compatibility_decomposition_data : Array(Int32) do + data = Array(Int32).new(<%= compatibility_decomposition_data.size %>) + <%- compatibility_decomposition_data.each do |codepoint| -%> + put(data, <%= codepoint %>) + <%- end -%> + data + end + + # Compatibility decomposition mappings, represented as subsequences of + # `compatibility_decomposition_data`. The maximum transformation is 18 + # codepoints. + # Here we store: codepoint => {index, count} + private class_getter compatibility_decompositions : Hash(Int32, {Int32, Int32}) do + data = Hash(Int32, {Int32, Int32}).new(initial_capacity: <%= compatibility_decompositions.size %>) + <%- compatibility_decompositions.each do |codepoint, index, count| -%> + put(data, <%= codepoint %>, <%= index %>, <%= count %>) + <%- end -%> + data + end + + # Reverse mapping of the canonical decompositions, excluding the full + # composition exclusions. + # Here we store: (first << 21 | second) => codepoint + private class_getter canonical_compositions : Hash(Int64, Int32) do + data = Hash(Int64, Int32).new(initial_capacity: <%= canonical_compositions.size %>) + <%- canonical_compositions.each do |first_second, codepoint| -%> + put(data, <%= first_second %>_i64, <%= codepoint %>) + <%- end -%> + data + end + + # Used to quickly determine whether a codepoint may appear under Normalization + # Form C (yes if absent in this table). + # Here we store: {low, high, result (no or maybe)} + private class_getter nfc_quick_check : Array({Int32, Int32, QuickCheckResult}) do + <%- quick_check = quick_checks[Unicode::NormalizationForm::NFC] -%> + data = Array({Int32, Int32, QuickCheckResult}).new(<%= quick_check.size %>) + <%- quick_check.each do |range| -%> + put(data, <%= range.low %>, <%= range.high %>, QuickCheckResult::<%= range.result %>) + <%- end -%> + data + end + + # Used to quickly determine whether a codepoint may appear under Normalization + # Form KC (yes if absent in this table). + # Here we store: {low, high, result (no or maybe)} + private class_getter nfkc_quick_check : Array({Int32, Int32, QuickCheckResult}) do + <%- quick_check = quick_checks[Unicode::NormalizationForm::NFKC] -%> + data = Array({Int32, Int32, QuickCheckResult}).new(<%= quick_check.size %>) + <%- quick_check.each do |range| -%> + put(data, <%= range.low %>, <%= range.high %>, QuickCheckResult::<%= range.result %>) + <%- end -%> + data + end + + # Used to quickly determine whether a codepoint may appear under Normalization + # Form D (yes if absent in this table). There are no "maybe" values; + # codepoints contained here may not appear under NFD. + # Here we store: {low, high} + private class_getter nfd_quick_check : Array({Int32, Int32}) do + <%- quick_check = quick_checks[Unicode::NormalizationForm::NFD] -%> + data = Array({Int32, Int32}).new(<%= quick_check.size %>) + <%- quick_check.each do |range| -%> + put(data, <%= range.low %>, <%= range.high %>) + <%- end -%> + data + end + + # Used to quickly determine whether a codepoint may appear under Normalization + # Form KD (yes if absent in this table). There are no "maybe" values; + # codepoints contained here may not appear under NFKD. + # Here we store: {low, high} + private class_getter nfkd_quick_check : Array({Int32, Int32}) do + <%- quick_check = quick_checks[Unicode::NormalizationForm::NFKD] -%> + data = Array({Int32, Int32}).new(<%= quick_check.size %>) + <%- quick_check.each do |range| -%> + put(data, <%= range.low %>, <%= range.high %>) + <%- end -%> + data end # TODO: this is needed to avoid generating lots of allocas # in LLVM, which makes LLVM really slow. The compiler should # try to avoid/reuse temporary allocas. # Explanation: https://github.com/crystal-lang/crystal/issues/4516#issuecomment-306226171 + private def self.put(array : Array, value) : Nil + array << value + end + private def self.put(array : Array, *values) : Nil array << values end + private def self.put(hash : Hash, key, value) : Nil + hash[key] = value + end + private def self.put(hash : Hash, key, *values) : Nil hash[key] = values end diff --git a/spec/manual/string_normalize_spec.cr b/spec/manual/string_normalize_spec.cr new file mode 100644 index 000000000000..dcde8339b646 --- /dev/null +++ b/spec/manual/string_normalize_spec.cr @@ -0,0 +1,132 @@ +require "spec" +require "http/client" +require "../support/string" + +UCD_ROOT = "http://www.unicode.org/Public/#{Unicode::VERSION}/ucd/" + +private struct CodepointsEqualExpectation + @expected_value : Array(Int32) + + def initialize(str : String, @desc : String) + @expected_value = str.codepoints + end + + def match(actual_value) + @expected_value == actual_value.codepoints + end + + def failure_message(actual_value) + expected = @expected_value.join(", ") { |x| "U+%04X" % x } + got = actual_value.codepoints.join(", ") { |x| "U+%04X" % x } + "While testing #{@desc}:\nexpected: [#{expected}]\n got: [#{got}]" + end + + def negative_failure_message(actual_value) + expected = @expected_value.join(", ") { |x| "U+%04X" % x } + "While testing #{@desc}:\nexpected: actual_value.codepoints != [#{expected}]" + end +end + +# same as `assert_prints`, but uses `CodepointsEqualExpectation` instead of `eq` +private macro assert_prints_codepoints(call, str, desc, *, file = __FILE__, line = __LINE__) + %expectation = CodepointsEqualExpectation.new(({{ str }}).as(String), {{ desc }}) + + %result = {{ call }} + %result.should be_a(String), file: {{ file }}, line: {{ line }} + %result.should %expectation, file: {{ file }}, line: {{ line }} + + String.build do |io| + {% if call.receiver %}{{ call.receiver }}.{% end %}{{ call.name }}( + io, + {% for arg in call.args %} {{ arg }}, {% end %} + {% if call.named_args %} {% for narg in call.named_args %} {{ narg.name }}: {{ narg.value }}, {% end %} {% end %} + ) {{ call.block }} + end.should %expectation, file: {{ file }}, line: {{ line }} + + {% unless flag?(:win32) %} + string_build_via_utf16 do |io| + {% if call.receiver %}{{ call.receiver }}.{% end %}{{ call.name }}( + io, + {% for arg in call.args %} {{ arg }}, {% end %} + {% if call.named_args %} {% for narg in call.named_args %} {{ narg.name }}: {{ narg.value }}, {% end %} {% end %} + ) {{ call.block }} + end.should %expectation, file: {{ file }}, line: {{ line }} + {% end %} +end + +private def assert_normalized(source, target, form : Unicode::NormalizationForm, *, file = __FILE__, line = __LINE__) + normalized = source.unicode_normalized?(form) + equal = (source == target) + return if normalized == equal + + got = source.codepoints.join(", ") { |x| "U+%04X" % x } + kind = form.to_s.upcase + if equal # !normalized + fail <<-ERROR, file: file, line: line + Expected: is#{kind}(str) == false + got: str == to#{kind}(str) + str == [#{got}]" + ERROR + else # !equal && normalized + expected = target.codepoints.join(", ") { |x| "U+%04X" % x } + fail <<-ERROR, file: file, line: line + Expected: is#{kind}(str) == true + got: str != to#{kind}(str) + str == [#{got}] + to#{kind}(str) == [#{expected}]" + ERROR + end +end + +private def assert_normalizes(source, nfc_str, nfd_str, nfkc_str, nfkd_str, *, file = __FILE__, line = __LINE__) + assert_normalized source, nfc_str, :nfc, file: file, line: line + assert_normalized source, nfd_str, :nfd, file: file, line: line + assert_normalized source, nfkc_str, :nfkc, file: file, line: line + assert_normalized source, nfkd_str, :nfkd, file: file, line: line + + assert_prints_codepoints source.unicode_normalize(:nfc), nfc_str, "c2 == toNFC(c1)", file: file, line: line + assert_prints_codepoints nfc_str.unicode_normalize(:nfc), nfc_str, "c2 == toNFC(c2)", file: file, line: line + assert_prints_codepoints nfd_str.unicode_normalize(:nfc), nfc_str, "c2 == toNFC(c3)", file: file, line: line + assert_prints_codepoints nfkc_str.unicode_normalize(:nfc), nfkc_str, "c4 == toNFC(c4)", file: file, line: line + assert_prints_codepoints nfkd_str.unicode_normalize(:nfc), nfkc_str, "c4 == toNFC(c5)", file: file, line: line + + assert_prints_codepoints source.unicode_normalize(:nfd), nfd_str, "c3 == toNFD(c1)", file: file, line: line + assert_prints_codepoints nfc_str.unicode_normalize(:nfd), nfd_str, "c3 == toNFD(c2)", file: file, line: line + assert_prints_codepoints nfd_str.unicode_normalize(:nfd), nfd_str, "c3 == toNFD(c3)", file: file, line: line + assert_prints_codepoints nfkc_str.unicode_normalize(:nfd), nfkd_str, "c5 == toNFD(c4)", file: file, line: line + assert_prints_codepoints nfkd_str.unicode_normalize(:nfd), nfkd_str, "c5 == toNFD(c5)", file: file, line: line + + assert_prints_codepoints source.unicode_normalize(:nfkc), nfkc_str, "c4 == toNFKC(c1)", file: file, line: line + assert_prints_codepoints nfc_str.unicode_normalize(:nfkc), nfkc_str, "c4 == toNFKC(c2)", file: file, line: line + assert_prints_codepoints nfd_str.unicode_normalize(:nfkc), nfkc_str, "c4 == toNFKC(c3)", file: file, line: line + assert_prints_codepoints nfkc_str.unicode_normalize(:nfkc), nfkc_str, "c4 == toNFKC(c4)", file: file, line: line + assert_prints_codepoints nfkd_str.unicode_normalize(:nfkc), nfkc_str, "c4 == toNFKC(c5)", file: file, line: line + + assert_prints_codepoints source.unicode_normalize(:nfkd), nfkd_str, "c5 == toNFKD(c1)", file: file, line: line + assert_prints_codepoints nfc_str.unicode_normalize(:nfkd), nfkd_str, "c5 == toNFKD(c2)", file: file, line: line + assert_prints_codepoints nfd_str.unicode_normalize(:nfkd), nfkd_str, "c5 == toNFKD(c3)", file: file, line: line + assert_prints_codepoints nfkc_str.unicode_normalize(:nfkd), nfkd_str, "c5 == toNFKD(c4)", file: file, line: line + assert_prints_codepoints nfkd_str.unicode_normalize(:nfkd), nfkd_str, "c5 == toNFKD(c5)", file: file, line: line +end + +describe String do + describe "#unicode_normalize" do + context "official test cases" do + url = "#{UCD_ROOT}NormalizationTest.txt" + body = HTTP::Client.get(url).body + body.each_line do |line| + line = line.strip + next if line.empty? + next if line.starts_with?('#') || line.starts_with?('@') + + it line do + pieces = line.split(';', limit: 6) + (0..4).each do |i| + pieces[i] = pieces[i].split(' ').join &.to_i(16).chr + end + assert_normalizes pieces[0], pieces[1], pieces[2], pieces[3], pieces[4] + end + end + end + end +end diff --git a/src/string.cr b/src/string.cr index 9601de923b36..7e72da3b141b 100644 --- a/src/string.cr +++ b/src/string.cr @@ -1474,6 +1474,77 @@ class String end end + # Returns the result of normalizing this `String` according to the given + # [Unicode normalization form](https://unicode.org/reports/tr15/). + # + # ``` + # str = "\u{1E9B}\u{0323}" # => "ẛ̣" + # str.unicode_normalize.codepoints # => [0x1E9B, 0x0323] + # str.unicode_normalize(:nfd).codepoints # => [0x017F, 0x0323, 0x0307] + # str.unicode_normalize(:nfkc).codepoints # => [0x1E69] + # str.unicode_normalize(:nfkd).codepoints # => [0x0073, 0x0323, 0x0307] + # ``` + def unicode_normalize(form : Unicode::NormalizationForm = :nfc) : String + return self if Unicode.quick_check_normalized(self, form).yes? + String.build { |io| do_unicode_normalize(io, form) } + end + + # Normalizes this `String` according to the given + # [Unicode normalization form](https://unicode.org/reports/tr15/) and + # writes the result to the given *io*. + def unicode_normalize(io : IO, form : Unicode::NormalizationForm = :nfc) : Nil + return io << self if Unicode.quick_check_normalized(self, form).yes? + do_unicode_normalize(io, form) + end + + private def do_unicode_normalize(io, form) + # the maximum number of code points after any normalization is `3 * size` as + # required by the Unicode standard; allow a single reallocation as the + # majority of strings have only few characters that aren't normalized + codepoints = Array(Int32).new((size * 3 + 1) // 2) + + each_char do |char| + case form + in .nfc?, .nfd? + Unicode.canonical_decompose(codepoints, char) + in .nfkc?, .nfkd? + Unicode.compatibility_decompose(codepoints, char) + end + end + + Unicode.canonical_order!(codepoints) + + case form + in .nfc?, .nfkc? + Unicode.canonical_compose!(codepoints) { |char| io << char } + in .nfd?, .nfkd? + codepoints.each { |codepoint| io << codepoint.unsafe_chr } + end + end + + # Returns whether this `String` is in the given + # [Unicode normalization form](https://unicode.org/reports/tr15/). + # + # ``` + # foo = "\u{00E0}" # => "à" + # foo.unicode_normalized? # => true + # foo.unicode_normalized?(:nfd) # => false + # + # bar = "\u{0061}\u{0300}" # => "à" + # bar.unicode_normalized? # => false + # bar.unicode_normalized?(:nfd) # => true + # ``` + def unicode_normalized?(form : Unicode::NormalizationForm = :nfc) : Bool + case Unicode.quick_check_normalized(self, form) + in .yes? + true + in .no? + false + in .maybe? + self == String.build { |io| do_unicode_normalize(io, form) } + end + end + # Returns a new `String` with the last carriage return removed (that is, it # will remove \n, \r, and \r\n). # diff --git a/src/unicode/data.cr b/src/unicode/data.cr index 2dae0885d8e7..c82dccbfb9b8 100644 --- a/src/unicode/data.cr +++ b/src/unicode/data.cr @@ -7,362 +7,350 @@ module Unicode # Most case conversions map a range to another range. # Here we store: {from, to, delta} - @@upcase_ranges : Array({Int32, Int32, Int32})? - - private def self.upcase_ranges - @@upcase_ranges ||= begin - data = Array({Int32, Int32, Int32}).new(141) - put(data, 97, 122, -32) - put(data, 181, 181, 743) - put(data, 224, 246, -32) - put(data, 248, 254, -32) - put(data, 255, 255, 121) - put(data, 305, 305, -232) - put(data, 383, 383, -300) - put(data, 384, 384, 195) - put(data, 405, 405, 97) - put(data, 410, 410, 163) - put(data, 414, 414, 130) - put(data, 447, 447, 56) - put(data, 454, 454, -2) - put(data, 457, 457, -2) - put(data, 460, 460, -2) - put(data, 477, 477, -79) - put(data, 499, 499, -2) - put(data, 575, 576, 10815) - put(data, 592, 592, 10783) - put(data, 593, 593, 10780) - put(data, 594, 594, 10782) - put(data, 595, 595, -210) - put(data, 596, 596, -206) - put(data, 598, 599, -205) - put(data, 601, 601, -202) - put(data, 603, 603, -203) - put(data, 604, 604, 42319) - put(data, 608, 608, -205) - put(data, 609, 609, 42315) - put(data, 611, 611, -207) - put(data, 613, 613, 42280) - put(data, 614, 614, 42308) - put(data, 616, 616, -209) - put(data, 617, 617, -211) - put(data, 618, 618, 42308) - put(data, 619, 619, 10743) - put(data, 620, 620, 42305) - put(data, 623, 623, -211) - put(data, 625, 625, 10749) - put(data, 626, 626, -213) - put(data, 629, 629, -214) - put(data, 637, 637, 10727) - put(data, 640, 640, -218) - put(data, 642, 642, 42307) - put(data, 643, 643, -218) - put(data, 647, 647, 42282) - put(data, 648, 648, -218) - put(data, 649, 649, -69) - put(data, 650, 651, -217) - put(data, 652, 652, -71) - put(data, 658, 658, -219) - put(data, 669, 669, 42261) - put(data, 670, 670, 42258) - put(data, 837, 837, 84) - put(data, 891, 893, 130) - put(data, 940, 940, -38) - put(data, 941, 943, -37) - put(data, 945, 961, -32) - put(data, 962, 962, -31) - put(data, 963, 971, -32) - put(data, 972, 972, -64) - put(data, 973, 974, -63) - put(data, 976, 976, -62) - put(data, 977, 977, -57) - put(data, 981, 981, -47) - put(data, 982, 982, -54) - put(data, 983, 983, -8) - put(data, 1008, 1008, -86) - put(data, 1009, 1009, -80) - put(data, 1010, 1010, 7) - put(data, 1011, 1011, -116) - put(data, 1013, 1013, -96) - put(data, 1072, 1103, -32) - put(data, 1104, 1119, -80) - put(data, 1231, 1231, -15) - put(data, 1377, 1414, -48) - put(data, 4304, 4346, 3008) - put(data, 4349, 4351, 3008) - put(data, 5112, 5117, -8) - put(data, 7296, 7296, -6254) - put(data, 7297, 7297, -6253) - put(data, 7298, 7298, -6244) - put(data, 7299, 7300, -6242) - put(data, 7301, 7301, -6243) - put(data, 7302, 7302, -6236) - put(data, 7303, 7303, -6181) - put(data, 7304, 7304, 35266) - put(data, 7545, 7545, 35332) - put(data, 7549, 7549, 3814) - put(data, 7566, 7566, 35384) - put(data, 7835, 7835, -59) - put(data, 7936, 7943, 8) - put(data, 7952, 7957, 8) - put(data, 7968, 7975, 8) - put(data, 7984, 7991, 8) - put(data, 8000, 8005, 8) - put(data, 8017, 8017, 8) - put(data, 8019, 8019, 8) - put(data, 8021, 8021, 8) - put(data, 8023, 8023, 8) - put(data, 8032, 8039, 8) - put(data, 8048, 8049, 74) - put(data, 8050, 8053, 86) - put(data, 8054, 8055, 100) - put(data, 8056, 8057, 128) - put(data, 8058, 8059, 112) - put(data, 8060, 8061, 126) - put(data, 8064, 8071, 8) - put(data, 8080, 8087, 8) - put(data, 8096, 8103, 8) - put(data, 8112, 8113, 8) - put(data, 8115, 8115, 9) - put(data, 8126, 8126, -7205) - put(data, 8131, 8131, 9) - put(data, 8144, 8145, 8) - put(data, 8160, 8161, 8) - put(data, 8165, 8165, 7) - put(data, 8179, 8179, 9) - put(data, 8526, 8526, -28) - put(data, 8560, 8575, -16) - put(data, 9424, 9449, -26) - put(data, 11312, 11359, -48) - put(data, 11365, 11365, -10795) - put(data, 11366, 11366, -10792) - put(data, 11520, 11557, -7264) - put(data, 11559, 11559, -7264) - put(data, 11565, 11565, -7264) - put(data, 42900, 42900, 48) - put(data, 43859, 43859, -928) - put(data, 43888, 43967, -38864) - put(data, 65345, 65370, -32) - put(data, 66600, 66639, -40) - put(data, 66776, 66811, -40) - put(data, 66967, 66977, -39) - put(data, 66979, 66993, -39) - put(data, 66995, 67001, -39) - put(data, 67003, 67004, -39) - put(data, 68800, 68850, -64) - put(data, 71872, 71903, -32) - put(data, 93792, 93823, -32) - put(data, 125218, 125251, -34) - data - end + private class_getter upcase_ranges : Array({Int32, Int32, Int32}) do + data = Array({Int32, Int32, Int32}).new(141) + put(data, 97, 122, -32) + put(data, 181, 181, 743) + put(data, 224, 246, -32) + put(data, 248, 254, -32) + put(data, 255, 255, 121) + put(data, 305, 305, -232) + put(data, 383, 383, -300) + put(data, 384, 384, 195) + put(data, 405, 405, 97) + put(data, 410, 410, 163) + put(data, 414, 414, 130) + put(data, 447, 447, 56) + put(data, 454, 454, -2) + put(data, 457, 457, -2) + put(data, 460, 460, -2) + put(data, 477, 477, -79) + put(data, 499, 499, -2) + put(data, 575, 576, 10815) + put(data, 592, 592, 10783) + put(data, 593, 593, 10780) + put(data, 594, 594, 10782) + put(data, 595, 595, -210) + put(data, 596, 596, -206) + put(data, 598, 599, -205) + put(data, 601, 601, -202) + put(data, 603, 603, -203) + put(data, 604, 604, 42319) + put(data, 608, 608, -205) + put(data, 609, 609, 42315) + put(data, 611, 611, -207) + put(data, 613, 613, 42280) + put(data, 614, 614, 42308) + put(data, 616, 616, -209) + put(data, 617, 617, -211) + put(data, 618, 618, 42308) + put(data, 619, 619, 10743) + put(data, 620, 620, 42305) + put(data, 623, 623, -211) + put(data, 625, 625, 10749) + put(data, 626, 626, -213) + put(data, 629, 629, -214) + put(data, 637, 637, 10727) + put(data, 640, 640, -218) + put(data, 642, 642, 42307) + put(data, 643, 643, -218) + put(data, 647, 647, 42282) + put(data, 648, 648, -218) + put(data, 649, 649, -69) + put(data, 650, 651, -217) + put(data, 652, 652, -71) + put(data, 658, 658, -219) + put(data, 669, 669, 42261) + put(data, 670, 670, 42258) + put(data, 837, 837, 84) + put(data, 891, 893, 130) + put(data, 940, 940, -38) + put(data, 941, 943, -37) + put(data, 945, 961, -32) + put(data, 962, 962, -31) + put(data, 963, 971, -32) + put(data, 972, 972, -64) + put(data, 973, 974, -63) + put(data, 976, 976, -62) + put(data, 977, 977, -57) + put(data, 981, 981, -47) + put(data, 982, 982, -54) + put(data, 983, 983, -8) + put(data, 1008, 1008, -86) + put(data, 1009, 1009, -80) + put(data, 1010, 1010, 7) + put(data, 1011, 1011, -116) + put(data, 1013, 1013, -96) + put(data, 1072, 1103, -32) + put(data, 1104, 1119, -80) + put(data, 1231, 1231, -15) + put(data, 1377, 1414, -48) + put(data, 4304, 4346, 3008) + put(data, 4349, 4351, 3008) + put(data, 5112, 5117, -8) + put(data, 7296, 7296, -6254) + put(data, 7297, 7297, -6253) + put(data, 7298, 7298, -6244) + put(data, 7299, 7300, -6242) + put(data, 7301, 7301, -6243) + put(data, 7302, 7302, -6236) + put(data, 7303, 7303, -6181) + put(data, 7304, 7304, 35266) + put(data, 7545, 7545, 35332) + put(data, 7549, 7549, 3814) + put(data, 7566, 7566, 35384) + put(data, 7835, 7835, -59) + put(data, 7936, 7943, 8) + put(data, 7952, 7957, 8) + put(data, 7968, 7975, 8) + put(data, 7984, 7991, 8) + put(data, 8000, 8005, 8) + put(data, 8017, 8017, 8) + put(data, 8019, 8019, 8) + put(data, 8021, 8021, 8) + put(data, 8023, 8023, 8) + put(data, 8032, 8039, 8) + put(data, 8048, 8049, 74) + put(data, 8050, 8053, 86) + put(data, 8054, 8055, 100) + put(data, 8056, 8057, 128) + put(data, 8058, 8059, 112) + put(data, 8060, 8061, 126) + put(data, 8064, 8071, 8) + put(data, 8080, 8087, 8) + put(data, 8096, 8103, 8) + put(data, 8112, 8113, 8) + put(data, 8115, 8115, 9) + put(data, 8126, 8126, -7205) + put(data, 8131, 8131, 9) + put(data, 8144, 8145, 8) + put(data, 8160, 8161, 8) + put(data, 8165, 8165, 7) + put(data, 8179, 8179, 9) + put(data, 8526, 8526, -28) + put(data, 8560, 8575, -16) + put(data, 9424, 9449, -26) + put(data, 11312, 11359, -48) + put(data, 11365, 11365, -10795) + put(data, 11366, 11366, -10792) + put(data, 11520, 11557, -7264) + put(data, 11559, 11559, -7264) + put(data, 11565, 11565, -7264) + put(data, 42900, 42900, 48) + put(data, 43859, 43859, -928) + put(data, 43888, 43967, -38864) + put(data, 65345, 65370, -32) + put(data, 66600, 66639, -40) + put(data, 66776, 66811, -40) + put(data, 66967, 66977, -39) + put(data, 66979, 66993, -39) + put(data, 66995, 67001, -39) + put(data, 67003, 67004, -39) + put(data, 68800, 68850, -64) + put(data, 71872, 71903, -32) + put(data, 93792, 93823, -32) + put(data, 125218, 125251, -34) + data end # Most case conversions map a range to another range. # Here we store: {from, to, delta} - @@downcase_ranges : Array({Int32, Int32, Int32})? - - private def self.downcase_ranges - @@downcase_ranges ||= begin - data = Array({Int32, Int32, Int32}).new(125) - put(data, 65, 90, 32) - put(data, 192, 214, 32) - put(data, 216, 222, 32) - put(data, 304, 304, -199) - put(data, 376, 376, -121) - put(data, 385, 385, 210) - put(data, 390, 390, 206) - put(data, 393, 394, 205) - put(data, 398, 398, 79) - put(data, 399, 399, 202) - put(data, 400, 400, 203) - put(data, 403, 403, 205) - put(data, 404, 404, 207) - put(data, 406, 406, 211) - put(data, 407, 407, 209) - put(data, 412, 412, 211) - put(data, 413, 413, 213) - put(data, 415, 415, 214) - put(data, 422, 422, 218) - put(data, 425, 425, 218) - put(data, 430, 430, 218) - put(data, 433, 434, 217) - put(data, 439, 439, 219) - put(data, 452, 452, 2) - put(data, 455, 455, 2) - put(data, 458, 458, 2) - put(data, 497, 497, 2) - put(data, 502, 502, -97) - put(data, 503, 503, -56) - put(data, 544, 544, -130) - put(data, 570, 570, 10795) - put(data, 573, 573, -163) - put(data, 574, 574, 10792) - put(data, 579, 579, -195) - put(data, 580, 580, 69) - put(data, 581, 581, 71) - put(data, 895, 895, 116) - put(data, 902, 902, 38) - put(data, 904, 906, 37) - put(data, 908, 908, 64) - put(data, 910, 911, 63) - put(data, 913, 929, 32) - put(data, 931, 939, 32) - put(data, 975, 975, 8) - put(data, 1012, 1012, -60) - put(data, 1017, 1017, -7) - put(data, 1021, 1023, -130) - put(data, 1024, 1039, 80) - put(data, 1040, 1071, 32) - put(data, 1216, 1216, 15) - put(data, 1329, 1366, 48) - put(data, 4256, 4293, 7264) - put(data, 4295, 4295, 7264) - put(data, 4301, 4301, 7264) - put(data, 5024, 5103, 38864) - put(data, 5104, 5109, 8) - put(data, 7312, 7354, -3008) - put(data, 7357, 7359, -3008) - put(data, 7838, 7838, -7615) - put(data, 7944, 7951, -8) - put(data, 7960, 7965, -8) - put(data, 7976, 7983, -8) - put(data, 7992, 7999, -8) - put(data, 8008, 8013, -8) - put(data, 8025, 8025, -8) - put(data, 8027, 8027, -8) - put(data, 8029, 8029, -8) - put(data, 8031, 8031, -8) - put(data, 8040, 8047, -8) - put(data, 8072, 8079, -8) - put(data, 8088, 8095, -8) - put(data, 8104, 8111, -8) - put(data, 8120, 8121, -8) - put(data, 8122, 8123, -74) - put(data, 8124, 8124, -9) - put(data, 8136, 8139, -86) - put(data, 8140, 8140, -9) - put(data, 8152, 8153, -8) - put(data, 8154, 8155, -100) - put(data, 8168, 8169, -8) - put(data, 8170, 8171, -112) - put(data, 8172, 8172, -7) - put(data, 8184, 8185, -128) - put(data, 8186, 8187, -126) - put(data, 8188, 8188, -9) - put(data, 8486, 8486, -7517) - put(data, 8490, 8490, -8383) - put(data, 8491, 8491, -8262) - put(data, 8498, 8498, 28) - put(data, 8544, 8559, 16) - put(data, 9398, 9423, 26) - put(data, 11264, 11311, 48) - put(data, 11362, 11362, -10743) - put(data, 11363, 11363, -3814) - put(data, 11364, 11364, -10727) - put(data, 11373, 11373, -10780) - put(data, 11374, 11374, -10749) - put(data, 11375, 11375, -10783) - put(data, 11376, 11376, -10782) - put(data, 11390, 11391, -10815) - put(data, 42877, 42877, -35332) - put(data, 42893, 42893, -42280) - put(data, 42922, 42922, -42308) - put(data, 42923, 42923, -42319) - put(data, 42924, 42924, -42315) - put(data, 42925, 42925, -42305) - put(data, 42926, 42926, -42308) - put(data, 42928, 42928, -42258) - put(data, 42929, 42929, -42282) - put(data, 42930, 42930, -42261) - put(data, 42931, 42931, 928) - put(data, 42948, 42948, -48) - put(data, 42949, 42949, -42307) - put(data, 42950, 42950, -35384) - put(data, 65313, 65338, 32) - put(data, 66560, 66599, 40) - put(data, 66736, 66771, 40) - put(data, 66928, 66938, 39) - put(data, 66940, 66954, 39) - put(data, 66956, 66962, 39) - put(data, 66964, 66965, 39) - put(data, 68736, 68786, 64) - put(data, 71840, 71871, 32) - put(data, 93760, 93791, 32) - put(data, 125184, 125217, 34) - data - end + private class_getter downcase_ranges : Array({Int32, Int32, Int32}) do + data = Array({Int32, Int32, Int32}).new(125) + put(data, 65, 90, 32) + put(data, 192, 214, 32) + put(data, 216, 222, 32) + put(data, 304, 304, -199) + put(data, 376, 376, -121) + put(data, 385, 385, 210) + put(data, 390, 390, 206) + put(data, 393, 394, 205) + put(data, 398, 398, 79) + put(data, 399, 399, 202) + put(data, 400, 400, 203) + put(data, 403, 403, 205) + put(data, 404, 404, 207) + put(data, 406, 406, 211) + put(data, 407, 407, 209) + put(data, 412, 412, 211) + put(data, 413, 413, 213) + put(data, 415, 415, 214) + put(data, 422, 422, 218) + put(data, 425, 425, 218) + put(data, 430, 430, 218) + put(data, 433, 434, 217) + put(data, 439, 439, 219) + put(data, 452, 452, 2) + put(data, 455, 455, 2) + put(data, 458, 458, 2) + put(data, 497, 497, 2) + put(data, 502, 502, -97) + put(data, 503, 503, -56) + put(data, 544, 544, -130) + put(data, 570, 570, 10795) + put(data, 573, 573, -163) + put(data, 574, 574, 10792) + put(data, 579, 579, -195) + put(data, 580, 580, 69) + put(data, 581, 581, 71) + put(data, 895, 895, 116) + put(data, 902, 902, 38) + put(data, 904, 906, 37) + put(data, 908, 908, 64) + put(data, 910, 911, 63) + put(data, 913, 929, 32) + put(data, 931, 939, 32) + put(data, 975, 975, 8) + put(data, 1012, 1012, -60) + put(data, 1017, 1017, -7) + put(data, 1021, 1023, -130) + put(data, 1024, 1039, 80) + put(data, 1040, 1071, 32) + put(data, 1216, 1216, 15) + put(data, 1329, 1366, 48) + put(data, 4256, 4293, 7264) + put(data, 4295, 4295, 7264) + put(data, 4301, 4301, 7264) + put(data, 5024, 5103, 38864) + put(data, 5104, 5109, 8) + put(data, 7312, 7354, -3008) + put(data, 7357, 7359, -3008) + put(data, 7838, 7838, -7615) + put(data, 7944, 7951, -8) + put(data, 7960, 7965, -8) + put(data, 7976, 7983, -8) + put(data, 7992, 7999, -8) + put(data, 8008, 8013, -8) + put(data, 8025, 8025, -8) + put(data, 8027, 8027, -8) + put(data, 8029, 8029, -8) + put(data, 8031, 8031, -8) + put(data, 8040, 8047, -8) + put(data, 8072, 8079, -8) + put(data, 8088, 8095, -8) + put(data, 8104, 8111, -8) + put(data, 8120, 8121, -8) + put(data, 8122, 8123, -74) + put(data, 8124, 8124, -9) + put(data, 8136, 8139, -86) + put(data, 8140, 8140, -9) + put(data, 8152, 8153, -8) + put(data, 8154, 8155, -100) + put(data, 8168, 8169, -8) + put(data, 8170, 8171, -112) + put(data, 8172, 8172, -7) + put(data, 8184, 8185, -128) + put(data, 8186, 8187, -126) + put(data, 8188, 8188, -9) + put(data, 8486, 8486, -7517) + put(data, 8490, 8490, -8383) + put(data, 8491, 8491, -8262) + put(data, 8498, 8498, 28) + put(data, 8544, 8559, 16) + put(data, 9398, 9423, 26) + put(data, 11264, 11311, 48) + put(data, 11362, 11362, -10743) + put(data, 11363, 11363, -3814) + put(data, 11364, 11364, -10727) + put(data, 11373, 11373, -10780) + put(data, 11374, 11374, -10749) + put(data, 11375, 11375, -10783) + put(data, 11376, 11376, -10782) + put(data, 11390, 11391, -10815) + put(data, 42877, 42877, -35332) + put(data, 42893, 42893, -42280) + put(data, 42922, 42922, -42308) + put(data, 42923, 42923, -42319) + put(data, 42924, 42924, -42315) + put(data, 42925, 42925, -42305) + put(data, 42926, 42926, -42308) + put(data, 42928, 42928, -42258) + put(data, 42929, 42929, -42282) + put(data, 42930, 42930, -42261) + put(data, 42931, 42931, 928) + put(data, 42948, 42948, -48) + put(data, 42949, 42949, -42307) + put(data, 42950, 42950, -35384) + put(data, 65313, 65338, 32) + put(data, 66560, 66599, 40) + put(data, 66736, 66771, 40) + put(data, 66928, 66938, 39) + put(data, 66940, 66954, 39) + put(data, 66956, 66962, 39) + put(data, 66964, 66965, 39) + put(data, 68736, 68786, 64) + put(data, 71840, 71871, 32) + put(data, 93760, 93791, 32) + put(data, 125184, 125217, 34) + data end # Other case conversions run in an alternated range # of uppercase/lowercase transformations # Here we store {from, to} - @@alternate_ranges : Array({Int32, Int32})? - - private def self.alternate_ranges - @@alternate_ranges ||= begin - data = Array({Int32, Int32}).new(60) - put(data, 256, 303) - put(data, 306, 311) - put(data, 313, 328) - put(data, 330, 375) - put(data, 377, 382) - put(data, 386, 389) - put(data, 391, 392) - put(data, 395, 396) - put(data, 401, 402) - put(data, 408, 409) - put(data, 416, 421) - put(data, 423, 424) - put(data, 428, 429) - put(data, 431, 432) - put(data, 435, 438) - put(data, 440, 441) - put(data, 444, 445) - put(data, 453, 454) - put(data, 456, 457) - put(data, 459, 476) - put(data, 478, 495) - put(data, 498, 501) - put(data, 504, 543) - put(data, 546, 563) - put(data, 571, 572) - put(data, 577, 578) - put(data, 582, 591) - put(data, 880, 883) - put(data, 886, 887) - put(data, 984, 1007) - put(data, 1015, 1016) - put(data, 1018, 1019) - put(data, 1120, 1153) - put(data, 1162, 1215) - put(data, 1217, 1230) - put(data, 1232, 1327) - put(data, 7680, 7829) - put(data, 7840, 7935) - put(data, 8579, 8580) - put(data, 11360, 11361) - put(data, 11367, 11372) - put(data, 11378, 11379) - put(data, 11381, 11382) - put(data, 11392, 11491) - put(data, 11499, 11502) - put(data, 11506, 11507) - put(data, 42560, 42605) - put(data, 42624, 42651) - put(data, 42786, 42799) - put(data, 42802, 42863) - put(data, 42873, 42876) - put(data, 42878, 42887) - put(data, 42891, 42892) - put(data, 42896, 42899) - put(data, 42902, 42921) - put(data, 42932, 42947) - put(data, 42951, 42954) - put(data, 42960, 42961) - put(data, 42966, 42969) - put(data, 42997, 42998) - data - end + private class_getter alternate_ranges : Array({Int32, Int32}) do + data = Array({Int32, Int32}).new(60) + put(data, 256, 303) + put(data, 306, 311) + put(data, 313, 328) + put(data, 330, 375) + put(data, 377, 382) + put(data, 386, 389) + put(data, 391, 392) + put(data, 395, 396) + put(data, 401, 402) + put(data, 408, 409) + put(data, 416, 421) + put(data, 423, 424) + put(data, 428, 429) + put(data, 431, 432) + put(data, 435, 438) + put(data, 440, 441) + put(data, 444, 445) + put(data, 453, 454) + put(data, 456, 457) + put(data, 459, 476) + put(data, 478, 495) + put(data, 498, 501) + put(data, 504, 543) + put(data, 546, 563) + put(data, 571, 572) + put(data, 577, 578) + put(data, 582, 591) + put(data, 880, 883) + put(data, 886, 887) + put(data, 984, 1007) + put(data, 1015, 1016) + put(data, 1018, 1019) + put(data, 1120, 1153) + put(data, 1162, 1215) + put(data, 1217, 1230) + put(data, 1232, 1327) + put(data, 7680, 7829) + put(data, 7840, 7935) + put(data, 8579, 8580) + put(data, 11360, 11361) + put(data, 11367, 11372) + put(data, 11378, 11379) + put(data, 11381, 11382) + put(data, 11392, 11491) + put(data, 11499, 11502) + put(data, 11506, 11507) + put(data, 42560, 42605) + put(data, 42624, 42651) + put(data, 42786, 42799) + put(data, 42802, 42863) + put(data, 42873, 42876) + put(data, 42878, 42887) + put(data, 42891, 42892) + put(data, 42896, 42899) + put(data, 42902, 42921) + put(data, 42932, 42947) + put(data, 42951, 42954) + put(data, 42960, 42961) + put(data, 42966, 42969) + put(data, 42997, 42998) + data end # We store categories as consecutive strides {from, to, stride} @@ -374,2604 +362,14229 @@ module Unicode # # The values are: 1..10, 11, 13, 15 - @@category_Lu : Array({Int32, Int32, Int32})? - - private def self.category_Lu - @@category_Lu ||= begin - data = Array({Int32, Int32, Int32}).new(149) - put(data, 65, 90, 1) - put(data, 192, 214, 1) - put(data, 216, 222, 1) - put(data, 256, 310, 2) - put(data, 313, 327, 2) - put(data, 330, 376, 2) - put(data, 377, 381, 2) - put(data, 385, 386, 1) - put(data, 388, 390, 2) - put(data, 391, 393, 2) - put(data, 394, 395, 1) - put(data, 398, 401, 1) - put(data, 403, 404, 1) - put(data, 406, 408, 1) - put(data, 412, 413, 1) - put(data, 415, 416, 1) - put(data, 418, 422, 2) - put(data, 423, 425, 2) - put(data, 428, 430, 2) - put(data, 431, 433, 2) - put(data, 434, 435, 1) - put(data, 437, 439, 2) - put(data, 440, 444, 4) - put(data, 452, 461, 3) - put(data, 463, 475, 2) - put(data, 478, 494, 2) - put(data, 497, 500, 3) - put(data, 502, 504, 1) - put(data, 506, 562, 2) - put(data, 570, 571, 1) - put(data, 573, 574, 1) - put(data, 577, 579, 2) - put(data, 580, 582, 1) - put(data, 584, 590, 2) - put(data, 880, 882, 2) - put(data, 886, 895, 9) - put(data, 902, 904, 2) - put(data, 905, 906, 1) - put(data, 908, 910, 2) - put(data, 911, 913, 2) - put(data, 914, 929, 1) - put(data, 931, 939, 1) - put(data, 975, 978, 3) - put(data, 979, 980, 1) - put(data, 984, 1006, 2) - put(data, 1012, 1015, 3) - put(data, 1017, 1018, 1) - put(data, 1021, 1071, 1) - put(data, 1120, 1152, 2) - put(data, 1162, 1216, 2) - put(data, 1217, 1229, 2) - put(data, 1232, 1326, 2) - put(data, 1329, 1366, 1) - put(data, 4256, 4293, 1) - put(data, 4295, 4301, 6) - put(data, 5024, 5109, 1) - put(data, 7312, 7354, 1) - put(data, 7357, 7359, 1) - put(data, 7680, 7828, 2) - put(data, 7838, 7934, 2) - put(data, 7944, 7951, 1) - put(data, 7960, 7965, 1) - put(data, 7976, 7983, 1) - put(data, 7992, 7999, 1) - put(data, 8008, 8013, 1) - put(data, 8025, 8031, 2) - put(data, 8040, 8047, 1) - put(data, 8120, 8123, 1) - put(data, 8136, 8139, 1) - put(data, 8152, 8155, 1) - put(data, 8168, 8172, 1) - put(data, 8184, 8187, 1) - put(data, 8450, 8455, 5) - put(data, 8459, 8461, 1) - put(data, 8464, 8466, 1) - put(data, 8469, 8473, 4) - put(data, 8474, 8477, 1) - put(data, 8484, 8490, 2) - put(data, 8491, 8493, 1) - put(data, 8496, 8499, 1) - put(data, 8510, 8511, 1) - put(data, 8517, 8579, 62) - put(data, 11264, 11311, 1) - put(data, 11360, 11362, 2) - put(data, 11363, 11364, 1) - put(data, 11367, 11373, 2) - put(data, 11374, 11376, 1) - put(data, 11378, 11381, 3) - put(data, 11390, 11392, 1) - put(data, 11394, 11490, 2) - put(data, 11499, 11501, 2) - put(data, 11506, 42560, 31054) - put(data, 42562, 42604, 2) - put(data, 42624, 42650, 2) - put(data, 42786, 42798, 2) - put(data, 42802, 42862, 2) - put(data, 42873, 42877, 2) - put(data, 42878, 42886, 2) - put(data, 42891, 42893, 2) - put(data, 42896, 42898, 2) - put(data, 42902, 42922, 2) - put(data, 42923, 42926, 1) - put(data, 42928, 42932, 1) - put(data, 42934, 42948, 2) - put(data, 42949, 42951, 1) - put(data, 42953, 42960, 7) - put(data, 42966, 42968, 2) - put(data, 42997, 65313, 22316) - put(data, 65314, 65338, 1) - put(data, 66560, 66599, 1) - put(data, 66736, 66771, 1) - put(data, 66928, 66938, 1) - put(data, 66940, 66954, 1) - put(data, 66956, 66962, 1) - put(data, 66964, 66965, 1) - put(data, 68736, 68786, 1) - put(data, 71840, 71871, 1) - put(data, 93760, 93791, 1) - put(data, 119808, 119833, 1) - put(data, 119860, 119885, 1) - put(data, 119912, 119937, 1) - put(data, 119964, 119966, 2) - put(data, 119967, 119973, 3) - put(data, 119974, 119977, 3) - put(data, 119978, 119980, 1) - put(data, 119982, 119989, 1) - put(data, 120016, 120041, 1) - put(data, 120068, 120069, 1) - put(data, 120071, 120074, 1) - put(data, 120077, 120084, 1) - put(data, 120086, 120092, 1) - put(data, 120120, 120121, 1) - put(data, 120123, 120126, 1) - put(data, 120128, 120132, 1) - put(data, 120134, 120138, 4) - put(data, 120139, 120144, 1) - put(data, 120172, 120197, 1) - put(data, 120224, 120249, 1) - put(data, 120276, 120301, 1) - put(data, 120328, 120353, 1) - put(data, 120380, 120405, 1) - put(data, 120432, 120457, 1) - put(data, 120488, 120512, 1) - put(data, 120546, 120570, 1) - put(data, 120604, 120628, 1) - put(data, 120662, 120686, 1) - put(data, 120720, 120744, 1) - put(data, 120778, 125184, 4406) - put(data, 125185, 125217, 1) - data - end + private class_getter category_Lu : Array({Int32, Int32, Int32}) do + data = Array({Int32, Int32, Int32}).new(149) + put(data, 65, 90, 1) + put(data, 192, 214, 1) + put(data, 216, 222, 1) + put(data, 256, 310, 2) + put(data, 313, 327, 2) + put(data, 330, 376, 2) + put(data, 377, 381, 2) + put(data, 385, 386, 1) + put(data, 388, 390, 2) + put(data, 391, 393, 2) + put(data, 394, 395, 1) + put(data, 398, 401, 1) + put(data, 403, 404, 1) + put(data, 406, 408, 1) + put(data, 412, 413, 1) + put(data, 415, 416, 1) + put(data, 418, 422, 2) + put(data, 423, 425, 2) + put(data, 428, 430, 2) + put(data, 431, 433, 2) + put(data, 434, 435, 1) + put(data, 437, 439, 2) + put(data, 440, 444, 4) + put(data, 452, 461, 3) + put(data, 463, 475, 2) + put(data, 478, 494, 2) + put(data, 497, 500, 3) + put(data, 502, 504, 1) + put(data, 506, 562, 2) + put(data, 570, 571, 1) + put(data, 573, 574, 1) + put(data, 577, 579, 2) + put(data, 580, 582, 1) + put(data, 584, 590, 2) + put(data, 880, 882, 2) + put(data, 886, 895, 9) + put(data, 902, 904, 2) + put(data, 905, 906, 1) + put(data, 908, 910, 2) + put(data, 911, 913, 2) + put(data, 914, 929, 1) + put(data, 931, 939, 1) + put(data, 975, 978, 3) + put(data, 979, 980, 1) + put(data, 984, 1006, 2) + put(data, 1012, 1015, 3) + put(data, 1017, 1018, 1) + put(data, 1021, 1071, 1) + put(data, 1120, 1152, 2) + put(data, 1162, 1216, 2) + put(data, 1217, 1229, 2) + put(data, 1232, 1326, 2) + put(data, 1329, 1366, 1) + put(data, 4256, 4293, 1) + put(data, 4295, 4301, 6) + put(data, 5024, 5109, 1) + put(data, 7312, 7354, 1) + put(data, 7357, 7359, 1) + put(data, 7680, 7828, 2) + put(data, 7838, 7934, 2) + put(data, 7944, 7951, 1) + put(data, 7960, 7965, 1) + put(data, 7976, 7983, 1) + put(data, 7992, 7999, 1) + put(data, 8008, 8013, 1) + put(data, 8025, 8031, 2) + put(data, 8040, 8047, 1) + put(data, 8120, 8123, 1) + put(data, 8136, 8139, 1) + put(data, 8152, 8155, 1) + put(data, 8168, 8172, 1) + put(data, 8184, 8187, 1) + put(data, 8450, 8455, 5) + put(data, 8459, 8461, 1) + put(data, 8464, 8466, 1) + put(data, 8469, 8473, 4) + put(data, 8474, 8477, 1) + put(data, 8484, 8490, 2) + put(data, 8491, 8493, 1) + put(data, 8496, 8499, 1) + put(data, 8510, 8511, 1) + put(data, 8517, 8579, 62) + put(data, 11264, 11311, 1) + put(data, 11360, 11362, 2) + put(data, 11363, 11364, 1) + put(data, 11367, 11373, 2) + put(data, 11374, 11376, 1) + put(data, 11378, 11381, 3) + put(data, 11390, 11392, 1) + put(data, 11394, 11490, 2) + put(data, 11499, 11501, 2) + put(data, 11506, 42560, 31054) + put(data, 42562, 42604, 2) + put(data, 42624, 42650, 2) + put(data, 42786, 42798, 2) + put(data, 42802, 42862, 2) + put(data, 42873, 42877, 2) + put(data, 42878, 42886, 2) + put(data, 42891, 42893, 2) + put(data, 42896, 42898, 2) + put(data, 42902, 42922, 2) + put(data, 42923, 42926, 1) + put(data, 42928, 42932, 1) + put(data, 42934, 42948, 2) + put(data, 42949, 42951, 1) + put(data, 42953, 42960, 7) + put(data, 42966, 42968, 2) + put(data, 42997, 65313, 22316) + put(data, 65314, 65338, 1) + put(data, 66560, 66599, 1) + put(data, 66736, 66771, 1) + put(data, 66928, 66938, 1) + put(data, 66940, 66954, 1) + put(data, 66956, 66962, 1) + put(data, 66964, 66965, 1) + put(data, 68736, 68786, 1) + put(data, 71840, 71871, 1) + put(data, 93760, 93791, 1) + put(data, 119808, 119833, 1) + put(data, 119860, 119885, 1) + put(data, 119912, 119937, 1) + put(data, 119964, 119966, 2) + put(data, 119967, 119973, 3) + put(data, 119974, 119977, 3) + put(data, 119978, 119980, 1) + put(data, 119982, 119989, 1) + put(data, 120016, 120041, 1) + put(data, 120068, 120069, 1) + put(data, 120071, 120074, 1) + put(data, 120077, 120084, 1) + put(data, 120086, 120092, 1) + put(data, 120120, 120121, 1) + put(data, 120123, 120126, 1) + put(data, 120128, 120132, 1) + put(data, 120134, 120138, 4) + put(data, 120139, 120144, 1) + put(data, 120172, 120197, 1) + put(data, 120224, 120249, 1) + put(data, 120276, 120301, 1) + put(data, 120328, 120353, 1) + put(data, 120380, 120405, 1) + put(data, 120432, 120457, 1) + put(data, 120488, 120512, 1) + put(data, 120546, 120570, 1) + put(data, 120604, 120628, 1) + put(data, 120662, 120686, 1) + put(data, 120720, 120744, 1) + put(data, 120778, 125184, 4406) + put(data, 125185, 125217, 1) + data end - - @@category_Ll : Array({Int32, Int32, Int32})? - - private def self.category_Ll - @@category_Ll ||= begin - data = Array({Int32, Int32, Int32}).new(162) - put(data, 97, 122, 1) - put(data, 181, 223, 42) - put(data, 224, 246, 1) - put(data, 248, 255, 1) - put(data, 257, 311, 2) - put(data, 312, 328, 2) - put(data, 329, 375, 2) - put(data, 378, 382, 2) - put(data, 383, 384, 1) - put(data, 387, 389, 2) - put(data, 392, 396, 4) - put(data, 397, 402, 5) - put(data, 405, 409, 4) - put(data, 410, 411, 1) - put(data, 414, 417, 3) - put(data, 419, 421, 2) - put(data, 424, 426, 2) - put(data, 427, 429, 2) - put(data, 432, 436, 4) - put(data, 438, 441, 3) - put(data, 442, 445, 3) - put(data, 446, 447, 1) - put(data, 454, 460, 3) - put(data, 462, 476, 2) - put(data, 477, 495, 2) - put(data, 496, 499, 3) - put(data, 501, 505, 4) - put(data, 507, 563, 2) - put(data, 564, 569, 1) - put(data, 572, 575, 3) - put(data, 576, 578, 2) - put(data, 583, 591, 2) - put(data, 592, 659, 1) - put(data, 661, 687, 1) - put(data, 881, 883, 2) - put(data, 887, 891, 4) - put(data, 892, 893, 1) - put(data, 912, 940, 28) - put(data, 941, 974, 1) - put(data, 976, 977, 1) - put(data, 981, 983, 1) - put(data, 985, 1007, 2) - put(data, 1008, 1011, 1) - put(data, 1013, 1019, 3) - put(data, 1020, 1072, 52) - put(data, 1073, 1119, 1) - put(data, 1121, 1153, 2) - put(data, 1163, 1215, 2) - put(data, 1218, 1230, 2) - put(data, 1231, 1327, 2) - put(data, 1376, 1416, 1) - put(data, 4304, 4346, 1) - put(data, 4349, 4351, 1) - put(data, 5112, 5117, 1) - put(data, 7296, 7304, 1) - put(data, 7424, 7467, 1) - put(data, 7531, 7543, 1) - put(data, 7545, 7578, 1) - put(data, 7681, 7829, 2) - put(data, 7830, 7837, 1) - put(data, 7839, 7935, 2) - put(data, 7936, 7943, 1) - put(data, 7952, 7957, 1) - put(data, 7968, 7975, 1) - put(data, 7984, 7991, 1) - put(data, 8000, 8005, 1) - put(data, 8016, 8023, 1) - put(data, 8032, 8039, 1) - put(data, 8048, 8061, 1) - put(data, 8064, 8071, 1) - put(data, 8080, 8087, 1) - put(data, 8096, 8103, 1) - put(data, 8112, 8116, 1) - put(data, 8118, 8119, 1) - put(data, 8126, 8130, 4) - put(data, 8131, 8132, 1) - put(data, 8134, 8135, 1) - put(data, 8144, 8147, 1) - put(data, 8150, 8151, 1) - put(data, 8160, 8167, 1) - put(data, 8178, 8180, 1) - put(data, 8182, 8183, 1) - put(data, 8458, 8462, 4) - put(data, 8463, 8467, 4) - put(data, 8495, 8505, 5) - put(data, 8508, 8509, 1) - put(data, 8518, 8521, 1) - put(data, 8526, 8580, 54) - put(data, 11312, 11359, 1) - put(data, 11361, 11365, 4) - put(data, 11366, 11372, 2) - put(data, 11377, 11379, 2) - put(data, 11380, 11382, 2) - put(data, 11383, 11387, 1) - put(data, 11393, 11491, 2) - put(data, 11492, 11500, 8) - put(data, 11502, 11507, 5) - put(data, 11520, 11557, 1) - put(data, 11559, 11565, 6) - put(data, 42561, 42605, 2) - put(data, 42625, 42651, 2) - put(data, 42787, 42799, 2) - put(data, 42800, 42801, 1) - put(data, 42803, 42865, 2) - put(data, 42866, 42872, 1) - put(data, 42874, 42876, 2) - put(data, 42879, 42887, 2) - put(data, 42892, 42894, 2) - put(data, 42897, 42899, 2) - put(data, 42900, 42901, 1) - put(data, 42903, 42921, 2) - put(data, 42927, 42933, 6) - put(data, 42935, 42947, 2) - put(data, 42952, 42954, 2) - put(data, 42961, 42969, 2) - put(data, 42998, 43002, 4) - put(data, 43824, 43866, 1) - put(data, 43872, 43880, 1) - put(data, 43888, 43967, 1) - put(data, 64256, 64262, 1) - put(data, 64275, 64279, 1) - put(data, 65345, 65370, 1) - put(data, 66600, 66639, 1) - put(data, 66776, 66811, 1) - put(data, 66967, 66977, 1) - put(data, 66979, 66993, 1) - put(data, 66995, 67001, 1) - put(data, 67003, 67004, 1) - put(data, 68800, 68850, 1) - put(data, 71872, 71903, 1) - put(data, 93792, 93823, 1) - put(data, 119834, 119859, 1) - put(data, 119886, 119892, 1) - put(data, 119894, 119911, 1) - put(data, 119938, 119963, 1) - put(data, 119990, 119993, 1) - put(data, 119995, 119997, 2) - put(data, 119998, 120003, 1) - put(data, 120005, 120015, 1) - put(data, 120042, 120067, 1) - put(data, 120094, 120119, 1) - put(data, 120146, 120171, 1) - put(data, 120198, 120223, 1) - put(data, 120250, 120275, 1) - put(data, 120302, 120327, 1) - put(data, 120354, 120379, 1) - put(data, 120406, 120431, 1) - put(data, 120458, 120485, 1) - put(data, 120514, 120538, 1) - put(data, 120540, 120545, 1) - put(data, 120572, 120596, 1) - put(data, 120598, 120603, 1) - put(data, 120630, 120654, 1) - put(data, 120656, 120661, 1) - put(data, 120688, 120712, 1) - put(data, 120714, 120719, 1) - put(data, 120746, 120770, 1) - put(data, 120772, 120777, 1) - put(data, 120779, 122624, 1845) - put(data, 122625, 122633, 1) - put(data, 122635, 122654, 1) - put(data, 125218, 125251, 1) - data - end + private class_getter category_Ll : Array({Int32, Int32, Int32}) do + data = Array({Int32, Int32, Int32}).new(162) + put(data, 97, 122, 1) + put(data, 181, 223, 42) + put(data, 224, 246, 1) + put(data, 248, 255, 1) + put(data, 257, 311, 2) + put(data, 312, 328, 2) + put(data, 329, 375, 2) + put(data, 378, 382, 2) + put(data, 383, 384, 1) + put(data, 387, 389, 2) + put(data, 392, 396, 4) + put(data, 397, 402, 5) + put(data, 405, 409, 4) + put(data, 410, 411, 1) + put(data, 414, 417, 3) + put(data, 419, 421, 2) + put(data, 424, 426, 2) + put(data, 427, 429, 2) + put(data, 432, 436, 4) + put(data, 438, 441, 3) + put(data, 442, 445, 3) + put(data, 446, 447, 1) + put(data, 454, 460, 3) + put(data, 462, 476, 2) + put(data, 477, 495, 2) + put(data, 496, 499, 3) + put(data, 501, 505, 4) + put(data, 507, 563, 2) + put(data, 564, 569, 1) + put(data, 572, 575, 3) + put(data, 576, 578, 2) + put(data, 583, 591, 2) + put(data, 592, 659, 1) + put(data, 661, 687, 1) + put(data, 881, 883, 2) + put(data, 887, 891, 4) + put(data, 892, 893, 1) + put(data, 912, 940, 28) + put(data, 941, 974, 1) + put(data, 976, 977, 1) + put(data, 981, 983, 1) + put(data, 985, 1007, 2) + put(data, 1008, 1011, 1) + put(data, 1013, 1019, 3) + put(data, 1020, 1072, 52) + put(data, 1073, 1119, 1) + put(data, 1121, 1153, 2) + put(data, 1163, 1215, 2) + put(data, 1218, 1230, 2) + put(data, 1231, 1327, 2) + put(data, 1376, 1416, 1) + put(data, 4304, 4346, 1) + put(data, 4349, 4351, 1) + put(data, 5112, 5117, 1) + put(data, 7296, 7304, 1) + put(data, 7424, 7467, 1) + put(data, 7531, 7543, 1) + put(data, 7545, 7578, 1) + put(data, 7681, 7829, 2) + put(data, 7830, 7837, 1) + put(data, 7839, 7935, 2) + put(data, 7936, 7943, 1) + put(data, 7952, 7957, 1) + put(data, 7968, 7975, 1) + put(data, 7984, 7991, 1) + put(data, 8000, 8005, 1) + put(data, 8016, 8023, 1) + put(data, 8032, 8039, 1) + put(data, 8048, 8061, 1) + put(data, 8064, 8071, 1) + put(data, 8080, 8087, 1) + put(data, 8096, 8103, 1) + put(data, 8112, 8116, 1) + put(data, 8118, 8119, 1) + put(data, 8126, 8130, 4) + put(data, 8131, 8132, 1) + put(data, 8134, 8135, 1) + put(data, 8144, 8147, 1) + put(data, 8150, 8151, 1) + put(data, 8160, 8167, 1) + put(data, 8178, 8180, 1) + put(data, 8182, 8183, 1) + put(data, 8458, 8462, 4) + put(data, 8463, 8467, 4) + put(data, 8495, 8505, 5) + put(data, 8508, 8509, 1) + put(data, 8518, 8521, 1) + put(data, 8526, 8580, 54) + put(data, 11312, 11359, 1) + put(data, 11361, 11365, 4) + put(data, 11366, 11372, 2) + put(data, 11377, 11379, 2) + put(data, 11380, 11382, 2) + put(data, 11383, 11387, 1) + put(data, 11393, 11491, 2) + put(data, 11492, 11500, 8) + put(data, 11502, 11507, 5) + put(data, 11520, 11557, 1) + put(data, 11559, 11565, 6) + put(data, 42561, 42605, 2) + put(data, 42625, 42651, 2) + put(data, 42787, 42799, 2) + put(data, 42800, 42801, 1) + put(data, 42803, 42865, 2) + put(data, 42866, 42872, 1) + put(data, 42874, 42876, 2) + put(data, 42879, 42887, 2) + put(data, 42892, 42894, 2) + put(data, 42897, 42899, 2) + put(data, 42900, 42901, 1) + put(data, 42903, 42921, 2) + put(data, 42927, 42933, 6) + put(data, 42935, 42947, 2) + put(data, 42952, 42954, 2) + put(data, 42961, 42969, 2) + put(data, 42998, 43002, 4) + put(data, 43824, 43866, 1) + put(data, 43872, 43880, 1) + put(data, 43888, 43967, 1) + put(data, 64256, 64262, 1) + put(data, 64275, 64279, 1) + put(data, 65345, 65370, 1) + put(data, 66600, 66639, 1) + put(data, 66776, 66811, 1) + put(data, 66967, 66977, 1) + put(data, 66979, 66993, 1) + put(data, 66995, 67001, 1) + put(data, 67003, 67004, 1) + put(data, 68800, 68850, 1) + put(data, 71872, 71903, 1) + put(data, 93792, 93823, 1) + put(data, 119834, 119859, 1) + put(data, 119886, 119892, 1) + put(data, 119894, 119911, 1) + put(data, 119938, 119963, 1) + put(data, 119990, 119993, 1) + put(data, 119995, 119997, 2) + put(data, 119998, 120003, 1) + put(data, 120005, 120015, 1) + put(data, 120042, 120067, 1) + put(data, 120094, 120119, 1) + put(data, 120146, 120171, 1) + put(data, 120198, 120223, 1) + put(data, 120250, 120275, 1) + put(data, 120302, 120327, 1) + put(data, 120354, 120379, 1) + put(data, 120406, 120431, 1) + put(data, 120458, 120485, 1) + put(data, 120514, 120538, 1) + put(data, 120540, 120545, 1) + put(data, 120572, 120596, 1) + put(data, 120598, 120603, 1) + put(data, 120630, 120654, 1) + put(data, 120656, 120661, 1) + put(data, 120688, 120712, 1) + put(data, 120714, 120719, 1) + put(data, 120746, 120770, 1) + put(data, 120772, 120777, 1) + put(data, 120779, 122624, 1845) + put(data, 122625, 122633, 1) + put(data, 122635, 122654, 1) + put(data, 125218, 125251, 1) + data end - - @@category_Lt : Array({Int32, Int32, Int32})? - - private def self.category_Lt - @@category_Lt ||= begin - data = Array({Int32, Int32, Int32}).new(7) - put(data, 453, 459, 3) - put(data, 498, 8072, 7574) - put(data, 8073, 8079, 1) - put(data, 8088, 8095, 1) - put(data, 8104, 8111, 1) - put(data, 8124, 8140, 16) - put(data, 8188, 8188, 1) - data - end + private class_getter category_Lt : Array({Int32, Int32, Int32}) do + data = Array({Int32, Int32, Int32}).new(7) + put(data, 453, 459, 3) + put(data, 498, 8072, 7574) + put(data, 8073, 8079, 1) + put(data, 8088, 8095, 1) + put(data, 8104, 8111, 1) + put(data, 8124, 8140, 16) + put(data, 8188, 8188, 1) + data end - - @@category_Lm : Array({Int32, Int32, Int32})? - - private def self.category_Lm - @@category_Lm ||= begin - data = Array({Int32, Int32, Int32}).new(53) - put(data, 688, 705, 1) - put(data, 710, 721, 1) - put(data, 736, 740, 1) - put(data, 748, 750, 2) - put(data, 884, 890, 6) - put(data, 1369, 1600, 231) - put(data, 1765, 1766, 1) - put(data, 2036, 2037, 1) - put(data, 2042, 2074, 32) - put(data, 2084, 2088, 4) - put(data, 2249, 2417, 168) - put(data, 3654, 3782, 128) - put(data, 4348, 6103, 1755) - put(data, 6211, 6823, 612) - put(data, 7288, 7293, 1) - put(data, 7468, 7530, 1) - put(data, 7544, 7579, 35) - put(data, 7580, 7615, 1) - put(data, 8305, 8319, 14) - put(data, 8336, 8348, 1) - put(data, 11388, 11389, 1) - put(data, 11631, 11823, 192) - put(data, 12293, 12337, 44) - put(data, 12338, 12341, 1) - put(data, 12347, 12445, 98) - put(data, 12446, 12540, 94) - put(data, 12541, 12542, 1) - put(data, 40981, 42232, 1251) - put(data, 42233, 42237, 1) - put(data, 42508, 42623, 115) - put(data, 42652, 42653, 1) - put(data, 42775, 42783, 1) - put(data, 42864, 42888, 24) - put(data, 42994, 42996, 1) - put(data, 43000, 43001, 1) - put(data, 43471, 43494, 23) - put(data, 43632, 43741, 109) - put(data, 43763, 43764, 1) - put(data, 43868, 43871, 1) - put(data, 43881, 65392, 21511) - put(data, 65438, 65439, 1) - put(data, 67456, 67461, 1) - put(data, 67463, 67504, 1) - put(data, 67506, 67514, 1) - put(data, 92992, 92995, 1) - put(data, 94099, 94111, 1) - put(data, 94176, 94177, 1) - put(data, 94179, 110576, 16397) - put(data, 110577, 110579, 1) - put(data, 110581, 110587, 1) - put(data, 110589, 110590, 1) - put(data, 123191, 123197, 1) - put(data, 125259, 125259, 1) - data - end + private class_getter category_Lm : Array({Int32, Int32, Int32}) do + data = Array({Int32, Int32, Int32}).new(53) + put(data, 688, 705, 1) + put(data, 710, 721, 1) + put(data, 736, 740, 1) + put(data, 748, 750, 2) + put(data, 884, 890, 6) + put(data, 1369, 1600, 231) + put(data, 1765, 1766, 1) + put(data, 2036, 2037, 1) + put(data, 2042, 2074, 32) + put(data, 2084, 2088, 4) + put(data, 2249, 2417, 168) + put(data, 3654, 3782, 128) + put(data, 4348, 6103, 1755) + put(data, 6211, 6823, 612) + put(data, 7288, 7293, 1) + put(data, 7468, 7530, 1) + put(data, 7544, 7579, 35) + put(data, 7580, 7615, 1) + put(data, 8305, 8319, 14) + put(data, 8336, 8348, 1) + put(data, 11388, 11389, 1) + put(data, 11631, 11823, 192) + put(data, 12293, 12337, 44) + put(data, 12338, 12341, 1) + put(data, 12347, 12445, 98) + put(data, 12446, 12540, 94) + put(data, 12541, 12542, 1) + put(data, 40981, 42232, 1251) + put(data, 42233, 42237, 1) + put(data, 42508, 42623, 115) + put(data, 42652, 42653, 1) + put(data, 42775, 42783, 1) + put(data, 42864, 42888, 24) + put(data, 42994, 42996, 1) + put(data, 43000, 43001, 1) + put(data, 43471, 43494, 23) + put(data, 43632, 43741, 109) + put(data, 43763, 43764, 1) + put(data, 43868, 43871, 1) + put(data, 43881, 65392, 21511) + put(data, 65438, 65439, 1) + put(data, 67456, 67461, 1) + put(data, 67463, 67504, 1) + put(data, 67506, 67514, 1) + put(data, 92992, 92995, 1) + put(data, 94099, 94111, 1) + put(data, 94176, 94177, 1) + put(data, 94179, 110576, 16397) + put(data, 110577, 110579, 1) + put(data, 110581, 110587, 1) + put(data, 110589, 110590, 1) + put(data, 123191, 123197, 1) + put(data, 125259, 125259, 1) + data end - - @@category_Lo : Array({Int32, Int32, Int32})? - - private def self.category_Lo - @@category_Lo ||= begin - data = Array({Int32, Int32, Int32}).new(476) - put(data, 170, 186, 16) - put(data, 443, 448, 5) - put(data, 449, 451, 1) - put(data, 660, 1488, 828) - put(data, 1489, 1514, 1) - put(data, 1519, 1522, 1) - put(data, 1568, 1599, 1) - put(data, 1601, 1610, 1) - put(data, 1646, 1647, 1) - put(data, 1649, 1747, 1) - put(data, 1749, 1774, 25) - put(data, 1775, 1786, 11) - put(data, 1787, 1788, 1) - put(data, 1791, 1808, 17) - put(data, 1810, 1839, 1) - put(data, 1869, 1957, 1) - put(data, 1969, 1994, 25) - put(data, 1995, 2026, 1) - put(data, 2048, 2069, 1) - put(data, 2112, 2136, 1) - put(data, 2144, 2154, 1) - put(data, 2160, 2183, 1) - put(data, 2185, 2190, 1) - put(data, 2208, 2248, 1) - put(data, 2308, 2361, 1) - put(data, 2365, 2384, 19) - put(data, 2392, 2401, 1) - put(data, 2418, 2432, 1) - put(data, 2437, 2444, 1) - put(data, 2447, 2448, 1) - put(data, 2451, 2472, 1) - put(data, 2474, 2480, 1) - put(data, 2482, 2486, 4) - put(data, 2487, 2489, 1) - put(data, 2493, 2510, 17) - put(data, 2524, 2525, 1) - put(data, 2527, 2529, 1) - put(data, 2544, 2545, 1) - put(data, 2556, 2565, 9) - put(data, 2566, 2570, 1) - put(data, 2575, 2576, 1) - put(data, 2579, 2600, 1) - put(data, 2602, 2608, 1) - put(data, 2610, 2611, 1) - put(data, 2613, 2614, 1) - put(data, 2616, 2617, 1) - put(data, 2649, 2652, 1) - put(data, 2654, 2674, 20) - put(data, 2675, 2676, 1) - put(data, 2693, 2701, 1) - put(data, 2703, 2705, 1) - put(data, 2707, 2728, 1) - put(data, 2730, 2736, 1) - put(data, 2738, 2739, 1) - put(data, 2741, 2745, 1) - put(data, 2749, 2768, 19) - put(data, 2784, 2785, 1) - put(data, 2809, 2821, 12) - put(data, 2822, 2828, 1) - put(data, 2831, 2832, 1) - put(data, 2835, 2856, 1) - put(data, 2858, 2864, 1) - put(data, 2866, 2867, 1) - put(data, 2869, 2873, 1) - put(data, 2877, 2908, 31) - put(data, 2909, 2911, 2) - put(data, 2912, 2913, 1) - put(data, 2929, 2947, 18) - put(data, 2949, 2954, 1) - put(data, 2958, 2960, 1) - put(data, 2962, 2965, 1) - put(data, 2969, 2970, 1) - put(data, 2972, 2974, 2) - put(data, 2975, 2979, 4) - put(data, 2980, 2984, 4) - put(data, 2985, 2986, 1) - put(data, 2990, 3001, 1) - put(data, 3024, 3077, 53) - put(data, 3078, 3084, 1) - put(data, 3086, 3088, 1) - put(data, 3090, 3112, 1) - put(data, 3114, 3129, 1) - put(data, 3133, 3160, 27) - put(data, 3161, 3162, 1) - put(data, 3165, 3168, 3) - put(data, 3169, 3200, 31) - put(data, 3205, 3212, 1) - put(data, 3214, 3216, 1) - put(data, 3218, 3240, 1) - put(data, 3242, 3251, 1) - put(data, 3253, 3257, 1) - put(data, 3261, 3293, 32) - put(data, 3294, 3296, 2) - put(data, 3297, 3313, 16) - put(data, 3314, 3332, 18) - put(data, 3333, 3340, 1) - put(data, 3342, 3344, 1) - put(data, 3346, 3386, 1) - put(data, 3389, 3406, 17) - put(data, 3412, 3414, 1) - put(data, 3423, 3425, 1) - put(data, 3450, 3455, 1) - put(data, 3461, 3478, 1) - put(data, 3482, 3505, 1) - put(data, 3507, 3515, 1) - put(data, 3517, 3520, 3) - put(data, 3521, 3526, 1) - put(data, 3585, 3632, 1) - put(data, 3634, 3635, 1) - put(data, 3648, 3653, 1) - put(data, 3713, 3714, 1) - put(data, 3716, 3718, 2) - put(data, 3719, 3722, 1) - put(data, 3724, 3747, 1) - put(data, 3749, 3751, 2) - put(data, 3752, 3760, 1) - put(data, 3762, 3763, 1) - put(data, 3773, 3776, 3) - put(data, 3777, 3780, 1) - put(data, 3804, 3807, 1) - put(data, 3840, 3904, 64) - put(data, 3905, 3911, 1) - put(data, 3913, 3948, 1) - put(data, 3976, 3980, 1) - put(data, 4096, 4138, 1) - put(data, 4159, 4176, 17) - put(data, 4177, 4181, 1) - put(data, 4186, 4189, 1) - put(data, 4193, 4197, 4) - put(data, 4198, 4206, 8) - put(data, 4207, 4208, 1) - put(data, 4213, 4225, 1) - put(data, 4238, 4352, 114) - put(data, 4353, 4680, 1) - put(data, 4682, 4685, 1) - put(data, 4688, 4694, 1) - put(data, 4696, 4698, 2) - put(data, 4699, 4701, 1) - put(data, 4704, 4744, 1) - put(data, 4746, 4749, 1) - put(data, 4752, 4784, 1) - put(data, 4786, 4789, 1) - put(data, 4792, 4798, 1) - put(data, 4800, 4802, 2) - put(data, 4803, 4805, 1) - put(data, 4808, 4822, 1) - put(data, 4824, 4880, 1) - put(data, 4882, 4885, 1) - put(data, 4888, 4954, 1) - put(data, 4992, 5007, 1) - put(data, 5121, 5740, 1) - put(data, 5743, 5759, 1) - put(data, 5761, 5786, 1) - put(data, 5792, 5866, 1) - put(data, 5873, 5880, 1) - put(data, 5888, 5905, 1) - put(data, 5919, 5937, 1) - put(data, 5952, 5969, 1) - put(data, 5984, 5996, 1) - put(data, 5998, 6000, 1) - put(data, 6016, 6067, 1) - put(data, 6108, 6176, 68) - put(data, 6177, 6210, 1) - put(data, 6212, 6264, 1) - put(data, 6272, 6276, 1) - put(data, 6279, 6312, 1) - put(data, 6314, 6320, 6) - put(data, 6321, 6389, 1) - put(data, 6400, 6430, 1) - put(data, 6480, 6509, 1) - put(data, 6512, 6516, 1) - put(data, 6528, 6571, 1) - put(data, 6576, 6601, 1) - put(data, 6656, 6678, 1) - put(data, 6688, 6740, 1) - put(data, 6917, 6963, 1) - put(data, 6981, 6988, 1) - put(data, 7043, 7072, 1) - put(data, 7086, 7087, 1) - put(data, 7098, 7141, 1) - put(data, 7168, 7203, 1) - put(data, 7245, 7247, 1) - put(data, 7258, 7287, 1) - put(data, 7401, 7404, 1) - put(data, 7406, 7411, 1) - put(data, 7413, 7414, 1) - put(data, 7418, 8501, 1083) - put(data, 8502, 8504, 1) - put(data, 11568, 11623, 1) - put(data, 11648, 11670, 1) - put(data, 11680, 11686, 1) - put(data, 11688, 11694, 1) - put(data, 11696, 11702, 1) - put(data, 11704, 11710, 1) - put(data, 11712, 11718, 1) - put(data, 11720, 11726, 1) - put(data, 11728, 11734, 1) - put(data, 11736, 11742, 1) - put(data, 12294, 12348, 54) - put(data, 12353, 12438, 1) - put(data, 12447, 12449, 2) - put(data, 12450, 12538, 1) - put(data, 12543, 12549, 6) - put(data, 12550, 12591, 1) - put(data, 12593, 12686, 1) - put(data, 12704, 12735, 1) - put(data, 12784, 12799, 1) - put(data, 13312, 19903, 1) - put(data, 19968, 40959, 1) - put(data, 40960, 40980, 1) - put(data, 40982, 42124, 1) - put(data, 42192, 42231, 1) - put(data, 42240, 42507, 1) - put(data, 42512, 42527, 1) - put(data, 42538, 42539, 1) - put(data, 42606, 42656, 50) - put(data, 42657, 42725, 1) - put(data, 42895, 42999, 104) - put(data, 43003, 43009, 1) - put(data, 43011, 43013, 1) - put(data, 43015, 43018, 1) - put(data, 43020, 43042, 1) - put(data, 43072, 43123, 1) - put(data, 43138, 43187, 1) - put(data, 43250, 43255, 1) - put(data, 43259, 43261, 2) - put(data, 43262, 43274, 12) - put(data, 43275, 43301, 1) - put(data, 43312, 43334, 1) - put(data, 43360, 43388, 1) - put(data, 43396, 43442, 1) - put(data, 43488, 43492, 1) - put(data, 43495, 43503, 1) - put(data, 43514, 43518, 1) - put(data, 43520, 43560, 1) - put(data, 43584, 43586, 1) - put(data, 43588, 43595, 1) - put(data, 43616, 43631, 1) - put(data, 43633, 43638, 1) - put(data, 43642, 43646, 4) - put(data, 43647, 43695, 1) - put(data, 43697, 43701, 4) - put(data, 43702, 43705, 3) - put(data, 43706, 43709, 1) - put(data, 43712, 43714, 2) - put(data, 43739, 43740, 1) - put(data, 43744, 43754, 1) - put(data, 43762, 43777, 15) - put(data, 43778, 43782, 1) - put(data, 43785, 43790, 1) - put(data, 43793, 43798, 1) - put(data, 43808, 43814, 1) - put(data, 43816, 43822, 1) - put(data, 43968, 44002, 1) - put(data, 44032, 55203, 1) - put(data, 55216, 55238, 1) - put(data, 55243, 55291, 1) - put(data, 63744, 64109, 1) - put(data, 64112, 64217, 1) - put(data, 64285, 64287, 2) - put(data, 64288, 64296, 1) - put(data, 64298, 64310, 1) - put(data, 64312, 64316, 1) - put(data, 64318, 64320, 2) - put(data, 64321, 64323, 2) - put(data, 64324, 64326, 2) - put(data, 64327, 64433, 1) - put(data, 64467, 64829, 1) - put(data, 64848, 64911, 1) - put(data, 64914, 64967, 1) - put(data, 65008, 65019, 1) - put(data, 65136, 65140, 1) - put(data, 65142, 65276, 1) - put(data, 65382, 65391, 1) - put(data, 65393, 65437, 1) - put(data, 65440, 65470, 1) - put(data, 65474, 65479, 1) - put(data, 65482, 65487, 1) - put(data, 65490, 65495, 1) - put(data, 65498, 65500, 1) - put(data, 65536, 65547, 1) - put(data, 65549, 65574, 1) - put(data, 65576, 65594, 1) - put(data, 65596, 65597, 1) - put(data, 65599, 65613, 1) - put(data, 65616, 65629, 1) - put(data, 65664, 65786, 1) - put(data, 66176, 66204, 1) - put(data, 66208, 66256, 1) - put(data, 66304, 66335, 1) - put(data, 66349, 66368, 1) - put(data, 66370, 66377, 1) - put(data, 66384, 66421, 1) - put(data, 66432, 66461, 1) - put(data, 66464, 66499, 1) - put(data, 66504, 66511, 1) - put(data, 66640, 66717, 1) - put(data, 66816, 66855, 1) - put(data, 66864, 66915, 1) - put(data, 67072, 67382, 1) - put(data, 67392, 67413, 1) - put(data, 67424, 67431, 1) - put(data, 67584, 67589, 1) - put(data, 67592, 67594, 2) - put(data, 67595, 67637, 1) - put(data, 67639, 67640, 1) - put(data, 67644, 67647, 3) - put(data, 67648, 67669, 1) - put(data, 67680, 67702, 1) - put(data, 67712, 67742, 1) - put(data, 67808, 67826, 1) - put(data, 67828, 67829, 1) - put(data, 67840, 67861, 1) - put(data, 67872, 67897, 1) - put(data, 67968, 68023, 1) - put(data, 68030, 68031, 1) - put(data, 68096, 68112, 16) - put(data, 68113, 68115, 1) - put(data, 68117, 68119, 1) - put(data, 68121, 68149, 1) - put(data, 68192, 68220, 1) - put(data, 68224, 68252, 1) - put(data, 68288, 68295, 1) - put(data, 68297, 68324, 1) - put(data, 68352, 68405, 1) - put(data, 68416, 68437, 1) - put(data, 68448, 68466, 1) - put(data, 68480, 68497, 1) - put(data, 68608, 68680, 1) - put(data, 68864, 68899, 1) - put(data, 69248, 69289, 1) - put(data, 69296, 69297, 1) - put(data, 69376, 69404, 1) - put(data, 69415, 69424, 9) - put(data, 69425, 69445, 1) - put(data, 69488, 69505, 1) - put(data, 69552, 69572, 1) - put(data, 69600, 69622, 1) - put(data, 69635, 69687, 1) - put(data, 69745, 69746, 1) - put(data, 69749, 69763, 14) - put(data, 69764, 69807, 1) - put(data, 69840, 69864, 1) - put(data, 69891, 69926, 1) - put(data, 69956, 69959, 3) - put(data, 69968, 70002, 1) - put(data, 70006, 70019, 13) - put(data, 70020, 70066, 1) - put(data, 70081, 70084, 1) - put(data, 70106, 70108, 2) - put(data, 70144, 70161, 1) - put(data, 70163, 70187, 1) - put(data, 70272, 70278, 1) - put(data, 70280, 70282, 2) - put(data, 70283, 70285, 1) - put(data, 70287, 70301, 1) - put(data, 70303, 70312, 1) - put(data, 70320, 70366, 1) - put(data, 70405, 70412, 1) - put(data, 70415, 70416, 1) - put(data, 70419, 70440, 1) - put(data, 70442, 70448, 1) - put(data, 70450, 70451, 1) - put(data, 70453, 70457, 1) - put(data, 70461, 70480, 19) - put(data, 70493, 70497, 1) - put(data, 70656, 70708, 1) - put(data, 70727, 70730, 1) - put(data, 70751, 70753, 1) - put(data, 70784, 70831, 1) - put(data, 70852, 70853, 1) - put(data, 70855, 71040, 185) - put(data, 71041, 71086, 1) - put(data, 71128, 71131, 1) - put(data, 71168, 71215, 1) - put(data, 71236, 71296, 60) - put(data, 71297, 71338, 1) - put(data, 71352, 71424, 72) - put(data, 71425, 71450, 1) - put(data, 71488, 71494, 1) - put(data, 71680, 71723, 1) - put(data, 71935, 71942, 1) - put(data, 71945, 71948, 3) - put(data, 71949, 71955, 1) - put(data, 71957, 71958, 1) - put(data, 71960, 71983, 1) - put(data, 71999, 72001, 2) - put(data, 72096, 72103, 1) - put(data, 72106, 72144, 1) - put(data, 72161, 72163, 2) - put(data, 72192, 72203, 11) - put(data, 72204, 72242, 1) - put(data, 72250, 72272, 22) - put(data, 72284, 72329, 1) - put(data, 72349, 72368, 19) - put(data, 72369, 72440, 1) - put(data, 72704, 72712, 1) - put(data, 72714, 72750, 1) - put(data, 72768, 72818, 50) - put(data, 72819, 72847, 1) - put(data, 72960, 72966, 1) - put(data, 72968, 72969, 1) - put(data, 72971, 73008, 1) - put(data, 73030, 73056, 26) - put(data, 73057, 73061, 1) - put(data, 73063, 73064, 1) - put(data, 73066, 73097, 1) - put(data, 73112, 73440, 328) - put(data, 73441, 73458, 1) - put(data, 73648, 73728, 80) - put(data, 73729, 74649, 1) - put(data, 74880, 75075, 1) - put(data, 77712, 77808, 1) - put(data, 77824, 78894, 1) - put(data, 82944, 83526, 1) - put(data, 92160, 92728, 1) - put(data, 92736, 92766, 1) - put(data, 92784, 92862, 1) - put(data, 92880, 92909, 1) - put(data, 92928, 92975, 1) - put(data, 93027, 93047, 1) - put(data, 93053, 93071, 1) - put(data, 93952, 94026, 1) - put(data, 94032, 94208, 176) - put(data, 100343, 100352, 9) - put(data, 100353, 101589, 1) - put(data, 101632, 101640, 1) - put(data, 110592, 110882, 1) - put(data, 110928, 110930, 1) - put(data, 110948, 110951, 1) - put(data, 110960, 111355, 1) - put(data, 113664, 113770, 1) - put(data, 113776, 113788, 1) - put(data, 113792, 113800, 1) - put(data, 113808, 113817, 1) - put(data, 122634, 123136, 502) - put(data, 123137, 123180, 1) - put(data, 123214, 123536, 322) - put(data, 123537, 123565, 1) - put(data, 123584, 123627, 1) - put(data, 124896, 124902, 1) - put(data, 124904, 124907, 1) - put(data, 124909, 124910, 1) - put(data, 124912, 124926, 1) - put(data, 124928, 125124, 1) - put(data, 126464, 126467, 1) - put(data, 126469, 126495, 1) - put(data, 126497, 126498, 1) - put(data, 126500, 126503, 3) - put(data, 126505, 126514, 1) - put(data, 126516, 126519, 1) - put(data, 126521, 126523, 2) - put(data, 126530, 126535, 5) - put(data, 126537, 126541, 2) - put(data, 126542, 126543, 1) - put(data, 126545, 126546, 1) - put(data, 126548, 126551, 3) - put(data, 126553, 126561, 2) - put(data, 126562, 126564, 2) - put(data, 126567, 126570, 1) - put(data, 126572, 126578, 1) - put(data, 126580, 126583, 1) - put(data, 126585, 126588, 1) - put(data, 126590, 126592, 2) - put(data, 126593, 126601, 1) - put(data, 126603, 126619, 1) - put(data, 126625, 126627, 1) - put(data, 126629, 126633, 1) - put(data, 126635, 126651, 1) - put(data, 131072, 173791, 1) - put(data, 173824, 177976, 1) - put(data, 177984, 178205, 1) - put(data, 178208, 183969, 1) - put(data, 183984, 191456, 1) - put(data, 194560, 195101, 1) - put(data, 196608, 201546, 1) - data - end + private class_getter category_Lo : Array({Int32, Int32, Int32}) do + data = Array({Int32, Int32, Int32}).new(476) + put(data, 170, 186, 16) + put(data, 443, 448, 5) + put(data, 449, 451, 1) + put(data, 660, 1488, 828) + put(data, 1489, 1514, 1) + put(data, 1519, 1522, 1) + put(data, 1568, 1599, 1) + put(data, 1601, 1610, 1) + put(data, 1646, 1647, 1) + put(data, 1649, 1747, 1) + put(data, 1749, 1774, 25) + put(data, 1775, 1786, 11) + put(data, 1787, 1788, 1) + put(data, 1791, 1808, 17) + put(data, 1810, 1839, 1) + put(data, 1869, 1957, 1) + put(data, 1969, 1994, 25) + put(data, 1995, 2026, 1) + put(data, 2048, 2069, 1) + put(data, 2112, 2136, 1) + put(data, 2144, 2154, 1) + put(data, 2160, 2183, 1) + put(data, 2185, 2190, 1) + put(data, 2208, 2248, 1) + put(data, 2308, 2361, 1) + put(data, 2365, 2384, 19) + put(data, 2392, 2401, 1) + put(data, 2418, 2432, 1) + put(data, 2437, 2444, 1) + put(data, 2447, 2448, 1) + put(data, 2451, 2472, 1) + put(data, 2474, 2480, 1) + put(data, 2482, 2486, 4) + put(data, 2487, 2489, 1) + put(data, 2493, 2510, 17) + put(data, 2524, 2525, 1) + put(data, 2527, 2529, 1) + put(data, 2544, 2545, 1) + put(data, 2556, 2565, 9) + put(data, 2566, 2570, 1) + put(data, 2575, 2576, 1) + put(data, 2579, 2600, 1) + put(data, 2602, 2608, 1) + put(data, 2610, 2611, 1) + put(data, 2613, 2614, 1) + put(data, 2616, 2617, 1) + put(data, 2649, 2652, 1) + put(data, 2654, 2674, 20) + put(data, 2675, 2676, 1) + put(data, 2693, 2701, 1) + put(data, 2703, 2705, 1) + put(data, 2707, 2728, 1) + put(data, 2730, 2736, 1) + put(data, 2738, 2739, 1) + put(data, 2741, 2745, 1) + put(data, 2749, 2768, 19) + put(data, 2784, 2785, 1) + put(data, 2809, 2821, 12) + put(data, 2822, 2828, 1) + put(data, 2831, 2832, 1) + put(data, 2835, 2856, 1) + put(data, 2858, 2864, 1) + put(data, 2866, 2867, 1) + put(data, 2869, 2873, 1) + put(data, 2877, 2908, 31) + put(data, 2909, 2911, 2) + put(data, 2912, 2913, 1) + put(data, 2929, 2947, 18) + put(data, 2949, 2954, 1) + put(data, 2958, 2960, 1) + put(data, 2962, 2965, 1) + put(data, 2969, 2970, 1) + put(data, 2972, 2974, 2) + put(data, 2975, 2979, 4) + put(data, 2980, 2984, 4) + put(data, 2985, 2986, 1) + put(data, 2990, 3001, 1) + put(data, 3024, 3077, 53) + put(data, 3078, 3084, 1) + put(data, 3086, 3088, 1) + put(data, 3090, 3112, 1) + put(data, 3114, 3129, 1) + put(data, 3133, 3160, 27) + put(data, 3161, 3162, 1) + put(data, 3165, 3168, 3) + put(data, 3169, 3200, 31) + put(data, 3205, 3212, 1) + put(data, 3214, 3216, 1) + put(data, 3218, 3240, 1) + put(data, 3242, 3251, 1) + put(data, 3253, 3257, 1) + put(data, 3261, 3293, 32) + put(data, 3294, 3296, 2) + put(data, 3297, 3313, 16) + put(data, 3314, 3332, 18) + put(data, 3333, 3340, 1) + put(data, 3342, 3344, 1) + put(data, 3346, 3386, 1) + put(data, 3389, 3406, 17) + put(data, 3412, 3414, 1) + put(data, 3423, 3425, 1) + put(data, 3450, 3455, 1) + put(data, 3461, 3478, 1) + put(data, 3482, 3505, 1) + put(data, 3507, 3515, 1) + put(data, 3517, 3520, 3) + put(data, 3521, 3526, 1) + put(data, 3585, 3632, 1) + put(data, 3634, 3635, 1) + put(data, 3648, 3653, 1) + put(data, 3713, 3714, 1) + put(data, 3716, 3718, 2) + put(data, 3719, 3722, 1) + put(data, 3724, 3747, 1) + put(data, 3749, 3751, 2) + put(data, 3752, 3760, 1) + put(data, 3762, 3763, 1) + put(data, 3773, 3776, 3) + put(data, 3777, 3780, 1) + put(data, 3804, 3807, 1) + put(data, 3840, 3904, 64) + put(data, 3905, 3911, 1) + put(data, 3913, 3948, 1) + put(data, 3976, 3980, 1) + put(data, 4096, 4138, 1) + put(data, 4159, 4176, 17) + put(data, 4177, 4181, 1) + put(data, 4186, 4189, 1) + put(data, 4193, 4197, 4) + put(data, 4198, 4206, 8) + put(data, 4207, 4208, 1) + put(data, 4213, 4225, 1) + put(data, 4238, 4352, 114) + put(data, 4353, 4680, 1) + put(data, 4682, 4685, 1) + put(data, 4688, 4694, 1) + put(data, 4696, 4698, 2) + put(data, 4699, 4701, 1) + put(data, 4704, 4744, 1) + put(data, 4746, 4749, 1) + put(data, 4752, 4784, 1) + put(data, 4786, 4789, 1) + put(data, 4792, 4798, 1) + put(data, 4800, 4802, 2) + put(data, 4803, 4805, 1) + put(data, 4808, 4822, 1) + put(data, 4824, 4880, 1) + put(data, 4882, 4885, 1) + put(data, 4888, 4954, 1) + put(data, 4992, 5007, 1) + put(data, 5121, 5740, 1) + put(data, 5743, 5759, 1) + put(data, 5761, 5786, 1) + put(data, 5792, 5866, 1) + put(data, 5873, 5880, 1) + put(data, 5888, 5905, 1) + put(data, 5919, 5937, 1) + put(data, 5952, 5969, 1) + put(data, 5984, 5996, 1) + put(data, 5998, 6000, 1) + put(data, 6016, 6067, 1) + put(data, 6108, 6176, 68) + put(data, 6177, 6210, 1) + put(data, 6212, 6264, 1) + put(data, 6272, 6276, 1) + put(data, 6279, 6312, 1) + put(data, 6314, 6320, 6) + put(data, 6321, 6389, 1) + put(data, 6400, 6430, 1) + put(data, 6480, 6509, 1) + put(data, 6512, 6516, 1) + put(data, 6528, 6571, 1) + put(data, 6576, 6601, 1) + put(data, 6656, 6678, 1) + put(data, 6688, 6740, 1) + put(data, 6917, 6963, 1) + put(data, 6981, 6988, 1) + put(data, 7043, 7072, 1) + put(data, 7086, 7087, 1) + put(data, 7098, 7141, 1) + put(data, 7168, 7203, 1) + put(data, 7245, 7247, 1) + put(data, 7258, 7287, 1) + put(data, 7401, 7404, 1) + put(data, 7406, 7411, 1) + put(data, 7413, 7414, 1) + put(data, 7418, 8501, 1083) + put(data, 8502, 8504, 1) + put(data, 11568, 11623, 1) + put(data, 11648, 11670, 1) + put(data, 11680, 11686, 1) + put(data, 11688, 11694, 1) + put(data, 11696, 11702, 1) + put(data, 11704, 11710, 1) + put(data, 11712, 11718, 1) + put(data, 11720, 11726, 1) + put(data, 11728, 11734, 1) + put(data, 11736, 11742, 1) + put(data, 12294, 12348, 54) + put(data, 12353, 12438, 1) + put(data, 12447, 12449, 2) + put(data, 12450, 12538, 1) + put(data, 12543, 12549, 6) + put(data, 12550, 12591, 1) + put(data, 12593, 12686, 1) + put(data, 12704, 12735, 1) + put(data, 12784, 12799, 1) + put(data, 13312, 19903, 1) + put(data, 19968, 40959, 1) + put(data, 40960, 40980, 1) + put(data, 40982, 42124, 1) + put(data, 42192, 42231, 1) + put(data, 42240, 42507, 1) + put(data, 42512, 42527, 1) + put(data, 42538, 42539, 1) + put(data, 42606, 42656, 50) + put(data, 42657, 42725, 1) + put(data, 42895, 42999, 104) + put(data, 43003, 43009, 1) + put(data, 43011, 43013, 1) + put(data, 43015, 43018, 1) + put(data, 43020, 43042, 1) + put(data, 43072, 43123, 1) + put(data, 43138, 43187, 1) + put(data, 43250, 43255, 1) + put(data, 43259, 43261, 2) + put(data, 43262, 43274, 12) + put(data, 43275, 43301, 1) + put(data, 43312, 43334, 1) + put(data, 43360, 43388, 1) + put(data, 43396, 43442, 1) + put(data, 43488, 43492, 1) + put(data, 43495, 43503, 1) + put(data, 43514, 43518, 1) + put(data, 43520, 43560, 1) + put(data, 43584, 43586, 1) + put(data, 43588, 43595, 1) + put(data, 43616, 43631, 1) + put(data, 43633, 43638, 1) + put(data, 43642, 43646, 4) + put(data, 43647, 43695, 1) + put(data, 43697, 43701, 4) + put(data, 43702, 43705, 3) + put(data, 43706, 43709, 1) + put(data, 43712, 43714, 2) + put(data, 43739, 43740, 1) + put(data, 43744, 43754, 1) + put(data, 43762, 43777, 15) + put(data, 43778, 43782, 1) + put(data, 43785, 43790, 1) + put(data, 43793, 43798, 1) + put(data, 43808, 43814, 1) + put(data, 43816, 43822, 1) + put(data, 43968, 44002, 1) + put(data, 44032, 55203, 1) + put(data, 55216, 55238, 1) + put(data, 55243, 55291, 1) + put(data, 63744, 64109, 1) + put(data, 64112, 64217, 1) + put(data, 64285, 64287, 2) + put(data, 64288, 64296, 1) + put(data, 64298, 64310, 1) + put(data, 64312, 64316, 1) + put(data, 64318, 64320, 2) + put(data, 64321, 64323, 2) + put(data, 64324, 64326, 2) + put(data, 64327, 64433, 1) + put(data, 64467, 64829, 1) + put(data, 64848, 64911, 1) + put(data, 64914, 64967, 1) + put(data, 65008, 65019, 1) + put(data, 65136, 65140, 1) + put(data, 65142, 65276, 1) + put(data, 65382, 65391, 1) + put(data, 65393, 65437, 1) + put(data, 65440, 65470, 1) + put(data, 65474, 65479, 1) + put(data, 65482, 65487, 1) + put(data, 65490, 65495, 1) + put(data, 65498, 65500, 1) + put(data, 65536, 65547, 1) + put(data, 65549, 65574, 1) + put(data, 65576, 65594, 1) + put(data, 65596, 65597, 1) + put(data, 65599, 65613, 1) + put(data, 65616, 65629, 1) + put(data, 65664, 65786, 1) + put(data, 66176, 66204, 1) + put(data, 66208, 66256, 1) + put(data, 66304, 66335, 1) + put(data, 66349, 66368, 1) + put(data, 66370, 66377, 1) + put(data, 66384, 66421, 1) + put(data, 66432, 66461, 1) + put(data, 66464, 66499, 1) + put(data, 66504, 66511, 1) + put(data, 66640, 66717, 1) + put(data, 66816, 66855, 1) + put(data, 66864, 66915, 1) + put(data, 67072, 67382, 1) + put(data, 67392, 67413, 1) + put(data, 67424, 67431, 1) + put(data, 67584, 67589, 1) + put(data, 67592, 67594, 2) + put(data, 67595, 67637, 1) + put(data, 67639, 67640, 1) + put(data, 67644, 67647, 3) + put(data, 67648, 67669, 1) + put(data, 67680, 67702, 1) + put(data, 67712, 67742, 1) + put(data, 67808, 67826, 1) + put(data, 67828, 67829, 1) + put(data, 67840, 67861, 1) + put(data, 67872, 67897, 1) + put(data, 67968, 68023, 1) + put(data, 68030, 68031, 1) + put(data, 68096, 68112, 16) + put(data, 68113, 68115, 1) + put(data, 68117, 68119, 1) + put(data, 68121, 68149, 1) + put(data, 68192, 68220, 1) + put(data, 68224, 68252, 1) + put(data, 68288, 68295, 1) + put(data, 68297, 68324, 1) + put(data, 68352, 68405, 1) + put(data, 68416, 68437, 1) + put(data, 68448, 68466, 1) + put(data, 68480, 68497, 1) + put(data, 68608, 68680, 1) + put(data, 68864, 68899, 1) + put(data, 69248, 69289, 1) + put(data, 69296, 69297, 1) + put(data, 69376, 69404, 1) + put(data, 69415, 69424, 9) + put(data, 69425, 69445, 1) + put(data, 69488, 69505, 1) + put(data, 69552, 69572, 1) + put(data, 69600, 69622, 1) + put(data, 69635, 69687, 1) + put(data, 69745, 69746, 1) + put(data, 69749, 69763, 14) + put(data, 69764, 69807, 1) + put(data, 69840, 69864, 1) + put(data, 69891, 69926, 1) + put(data, 69956, 69959, 3) + put(data, 69968, 70002, 1) + put(data, 70006, 70019, 13) + put(data, 70020, 70066, 1) + put(data, 70081, 70084, 1) + put(data, 70106, 70108, 2) + put(data, 70144, 70161, 1) + put(data, 70163, 70187, 1) + put(data, 70272, 70278, 1) + put(data, 70280, 70282, 2) + put(data, 70283, 70285, 1) + put(data, 70287, 70301, 1) + put(data, 70303, 70312, 1) + put(data, 70320, 70366, 1) + put(data, 70405, 70412, 1) + put(data, 70415, 70416, 1) + put(data, 70419, 70440, 1) + put(data, 70442, 70448, 1) + put(data, 70450, 70451, 1) + put(data, 70453, 70457, 1) + put(data, 70461, 70480, 19) + put(data, 70493, 70497, 1) + put(data, 70656, 70708, 1) + put(data, 70727, 70730, 1) + put(data, 70751, 70753, 1) + put(data, 70784, 70831, 1) + put(data, 70852, 70853, 1) + put(data, 70855, 71040, 185) + put(data, 71041, 71086, 1) + put(data, 71128, 71131, 1) + put(data, 71168, 71215, 1) + put(data, 71236, 71296, 60) + put(data, 71297, 71338, 1) + put(data, 71352, 71424, 72) + put(data, 71425, 71450, 1) + put(data, 71488, 71494, 1) + put(data, 71680, 71723, 1) + put(data, 71935, 71942, 1) + put(data, 71945, 71948, 3) + put(data, 71949, 71955, 1) + put(data, 71957, 71958, 1) + put(data, 71960, 71983, 1) + put(data, 71999, 72001, 2) + put(data, 72096, 72103, 1) + put(data, 72106, 72144, 1) + put(data, 72161, 72163, 2) + put(data, 72192, 72203, 11) + put(data, 72204, 72242, 1) + put(data, 72250, 72272, 22) + put(data, 72284, 72329, 1) + put(data, 72349, 72368, 19) + put(data, 72369, 72440, 1) + put(data, 72704, 72712, 1) + put(data, 72714, 72750, 1) + put(data, 72768, 72818, 50) + put(data, 72819, 72847, 1) + put(data, 72960, 72966, 1) + put(data, 72968, 72969, 1) + put(data, 72971, 73008, 1) + put(data, 73030, 73056, 26) + put(data, 73057, 73061, 1) + put(data, 73063, 73064, 1) + put(data, 73066, 73097, 1) + put(data, 73112, 73440, 328) + put(data, 73441, 73458, 1) + put(data, 73648, 73728, 80) + put(data, 73729, 74649, 1) + put(data, 74880, 75075, 1) + put(data, 77712, 77808, 1) + put(data, 77824, 78894, 1) + put(data, 82944, 83526, 1) + put(data, 92160, 92728, 1) + put(data, 92736, 92766, 1) + put(data, 92784, 92862, 1) + put(data, 92880, 92909, 1) + put(data, 92928, 92975, 1) + put(data, 93027, 93047, 1) + put(data, 93053, 93071, 1) + put(data, 93952, 94026, 1) + put(data, 94032, 94208, 176) + put(data, 100343, 100352, 9) + put(data, 100353, 101589, 1) + put(data, 101632, 101640, 1) + put(data, 110592, 110882, 1) + put(data, 110928, 110930, 1) + put(data, 110948, 110951, 1) + put(data, 110960, 111355, 1) + put(data, 113664, 113770, 1) + put(data, 113776, 113788, 1) + put(data, 113792, 113800, 1) + put(data, 113808, 113817, 1) + put(data, 122634, 123136, 502) + put(data, 123137, 123180, 1) + put(data, 123214, 123536, 322) + put(data, 123537, 123565, 1) + put(data, 123584, 123627, 1) + put(data, 124896, 124902, 1) + put(data, 124904, 124907, 1) + put(data, 124909, 124910, 1) + put(data, 124912, 124926, 1) + put(data, 124928, 125124, 1) + put(data, 126464, 126467, 1) + put(data, 126469, 126495, 1) + put(data, 126497, 126498, 1) + put(data, 126500, 126503, 3) + put(data, 126505, 126514, 1) + put(data, 126516, 126519, 1) + put(data, 126521, 126523, 2) + put(data, 126530, 126535, 5) + put(data, 126537, 126541, 2) + put(data, 126542, 126543, 1) + put(data, 126545, 126546, 1) + put(data, 126548, 126551, 3) + put(data, 126553, 126561, 2) + put(data, 126562, 126564, 2) + put(data, 126567, 126570, 1) + put(data, 126572, 126578, 1) + put(data, 126580, 126583, 1) + put(data, 126585, 126588, 1) + put(data, 126590, 126592, 2) + put(data, 126593, 126601, 1) + put(data, 126603, 126619, 1) + put(data, 126625, 126627, 1) + put(data, 126629, 126633, 1) + put(data, 126635, 126651, 1) + put(data, 131072, 173791, 1) + put(data, 173824, 177976, 1) + put(data, 177984, 178205, 1) + put(data, 178208, 183969, 1) + put(data, 183984, 191456, 1) + put(data, 194560, 195101, 1) + put(data, 196608, 201546, 1) + data end - - @@category_Mn : Array({Int32, Int32, Int32})? - - private def self.category_Mn - @@category_Mn ||= begin - data = Array({Int32, Int32, Int32}).new(300) - put(data, 768, 879, 1) - put(data, 1155, 1159, 1) - put(data, 1425, 1469, 1) - put(data, 1471, 1473, 2) - put(data, 1474, 1476, 2) - put(data, 1477, 1479, 2) - put(data, 1552, 1562, 1) - put(data, 1611, 1631, 1) - put(data, 1648, 1750, 102) - put(data, 1751, 1756, 1) - put(data, 1759, 1764, 1) - put(data, 1767, 1768, 1) - put(data, 1770, 1773, 1) - put(data, 1809, 1840, 31) - put(data, 1841, 1866, 1) - put(data, 1958, 1968, 1) - put(data, 2027, 2035, 1) - put(data, 2045, 2070, 25) - put(data, 2071, 2073, 1) - put(data, 2075, 2083, 1) - put(data, 2085, 2087, 1) - put(data, 2089, 2093, 1) - put(data, 2137, 2139, 1) - put(data, 2200, 2207, 1) - put(data, 2250, 2273, 1) - put(data, 2275, 2306, 1) - put(data, 2362, 2364, 2) - put(data, 2369, 2376, 1) - put(data, 2381, 2385, 4) - put(data, 2386, 2391, 1) - put(data, 2402, 2403, 1) - put(data, 2433, 2492, 59) - put(data, 2497, 2500, 1) - put(data, 2509, 2530, 21) - put(data, 2531, 2558, 27) - put(data, 2561, 2562, 1) - put(data, 2620, 2625, 5) - put(data, 2626, 2631, 5) - put(data, 2632, 2635, 3) - put(data, 2636, 2637, 1) - put(data, 2641, 2672, 31) - put(data, 2673, 2677, 4) - put(data, 2689, 2690, 1) - put(data, 2748, 2753, 5) - put(data, 2754, 2757, 1) - put(data, 2759, 2760, 1) - put(data, 2765, 2786, 21) - put(data, 2787, 2810, 23) - put(data, 2811, 2815, 1) - put(data, 2817, 2876, 59) - put(data, 2879, 2881, 2) - put(data, 2882, 2884, 1) - put(data, 2893, 2901, 8) - put(data, 2902, 2914, 12) - put(data, 2915, 2946, 31) - put(data, 3008, 3021, 13) - put(data, 3072, 3076, 4) - put(data, 3132, 3134, 2) - put(data, 3135, 3136, 1) - put(data, 3142, 3144, 1) - put(data, 3146, 3149, 1) - put(data, 3157, 3158, 1) - put(data, 3170, 3171, 1) - put(data, 3201, 3260, 59) - put(data, 3263, 3270, 7) - put(data, 3276, 3277, 1) - put(data, 3298, 3299, 1) - put(data, 3328, 3329, 1) - put(data, 3387, 3388, 1) - put(data, 3393, 3396, 1) - put(data, 3405, 3426, 21) - put(data, 3427, 3457, 30) - put(data, 3530, 3538, 8) - put(data, 3539, 3540, 1) - put(data, 3542, 3633, 91) - put(data, 3636, 3642, 1) - put(data, 3655, 3662, 1) - put(data, 3761, 3764, 3) - put(data, 3765, 3772, 1) - put(data, 3784, 3789, 1) - put(data, 3864, 3865, 1) - put(data, 3893, 3897, 2) - put(data, 3953, 3966, 1) - put(data, 3968, 3972, 1) - put(data, 3974, 3975, 1) - put(data, 3981, 3991, 1) - put(data, 3993, 4028, 1) - put(data, 4038, 4141, 103) - put(data, 4142, 4144, 1) - put(data, 4146, 4151, 1) - put(data, 4153, 4154, 1) - put(data, 4157, 4158, 1) - put(data, 4184, 4185, 1) - put(data, 4190, 4192, 1) - put(data, 4209, 4212, 1) - put(data, 4226, 4229, 3) - put(data, 4230, 4237, 7) - put(data, 4253, 4957, 704) - put(data, 4958, 4959, 1) - put(data, 5906, 5908, 1) - put(data, 5938, 5939, 1) - put(data, 5970, 5971, 1) - put(data, 6002, 6003, 1) - put(data, 6068, 6069, 1) - put(data, 6071, 6077, 1) - put(data, 6086, 6089, 3) - put(data, 6090, 6099, 1) - put(data, 6109, 6155, 46) - put(data, 6156, 6157, 1) - put(data, 6159, 6277, 118) - put(data, 6278, 6313, 35) - put(data, 6432, 6434, 1) - put(data, 6439, 6440, 1) - put(data, 6450, 6457, 7) - put(data, 6458, 6459, 1) - put(data, 6679, 6680, 1) - put(data, 6683, 6742, 59) - put(data, 6744, 6750, 1) - put(data, 6752, 6754, 2) - put(data, 6757, 6764, 1) - put(data, 6771, 6780, 1) - put(data, 6783, 6832, 49) - put(data, 6833, 6845, 1) - put(data, 6847, 6862, 1) - put(data, 6912, 6915, 1) - put(data, 6964, 6966, 2) - put(data, 6967, 6970, 1) - put(data, 6972, 6978, 6) - put(data, 7019, 7027, 1) - put(data, 7040, 7041, 1) - put(data, 7074, 7077, 1) - put(data, 7080, 7081, 1) - put(data, 7083, 7085, 1) - put(data, 7142, 7144, 2) - put(data, 7145, 7149, 4) - put(data, 7151, 7153, 1) - put(data, 7212, 7219, 1) - put(data, 7222, 7223, 1) - put(data, 7376, 7378, 1) - put(data, 7380, 7392, 1) - put(data, 7394, 7400, 1) - put(data, 7405, 7412, 7) - put(data, 7416, 7417, 1) - put(data, 7616, 7679, 1) - put(data, 8400, 8412, 1) - put(data, 8417, 8421, 4) - put(data, 8422, 8432, 1) - put(data, 11503, 11505, 1) - put(data, 11647, 11744, 97) - put(data, 11745, 11775, 1) - put(data, 12330, 12333, 1) - put(data, 12441, 12442, 1) - put(data, 42607, 42612, 5) - put(data, 42613, 42621, 1) - put(data, 42654, 42655, 1) - put(data, 42736, 42737, 1) - put(data, 43010, 43014, 4) - put(data, 43019, 43045, 26) - put(data, 43046, 43052, 6) - put(data, 43204, 43205, 1) - put(data, 43232, 43249, 1) - put(data, 43263, 43302, 39) - put(data, 43303, 43309, 1) - put(data, 43335, 43345, 1) - put(data, 43392, 43394, 1) - put(data, 43443, 43446, 3) - put(data, 43447, 43449, 1) - put(data, 43452, 43453, 1) - put(data, 43493, 43561, 68) - put(data, 43562, 43566, 1) - put(data, 43569, 43570, 1) - put(data, 43573, 43574, 1) - put(data, 43587, 43596, 9) - put(data, 43644, 43696, 52) - put(data, 43698, 43700, 1) - put(data, 43703, 43704, 1) - put(data, 43710, 43711, 1) - put(data, 43713, 43756, 43) - put(data, 43757, 43766, 9) - put(data, 44005, 44008, 3) - put(data, 44013, 64286, 20273) - put(data, 65024, 65039, 1) - put(data, 65056, 65071, 1) - put(data, 66045, 66272, 227) - put(data, 66422, 66426, 1) - put(data, 68097, 68099, 1) - put(data, 68101, 68102, 1) - put(data, 68108, 68111, 1) - put(data, 68152, 68154, 1) - put(data, 68159, 68325, 166) - put(data, 68326, 68900, 574) - put(data, 68901, 68903, 1) - put(data, 69291, 69292, 1) - put(data, 69446, 69456, 1) - put(data, 69506, 69509, 1) - put(data, 69633, 69688, 55) - put(data, 69689, 69702, 1) - put(data, 69744, 69747, 3) - put(data, 69748, 69759, 11) - put(data, 69760, 69761, 1) - put(data, 69811, 69814, 1) - put(data, 69817, 69818, 1) - put(data, 69826, 69888, 62) - put(data, 69889, 69890, 1) - put(data, 69927, 69931, 1) - put(data, 69933, 69940, 1) - put(data, 70003, 70016, 13) - put(data, 70017, 70070, 53) - put(data, 70071, 70078, 1) - put(data, 70089, 70092, 1) - put(data, 70095, 70191, 96) - put(data, 70192, 70193, 1) - put(data, 70196, 70198, 2) - put(data, 70199, 70206, 7) - put(data, 70367, 70371, 4) - put(data, 70372, 70378, 1) - put(data, 70400, 70401, 1) - put(data, 70459, 70460, 1) - put(data, 70464, 70502, 38) - put(data, 70503, 70508, 1) - put(data, 70512, 70516, 1) - put(data, 70712, 70719, 1) - put(data, 70722, 70724, 1) - put(data, 70726, 70750, 24) - put(data, 70835, 70840, 1) - put(data, 70842, 70847, 5) - put(data, 70848, 70850, 2) - put(data, 70851, 71090, 239) - put(data, 71091, 71093, 1) - put(data, 71100, 71101, 1) - put(data, 71103, 71104, 1) - put(data, 71132, 71133, 1) - put(data, 71219, 71226, 1) - put(data, 71229, 71231, 2) - put(data, 71232, 71339, 107) - put(data, 71341, 71344, 3) - put(data, 71345, 71349, 1) - put(data, 71351, 71453, 102) - put(data, 71454, 71455, 1) - put(data, 71458, 71461, 1) - put(data, 71463, 71467, 1) - put(data, 71727, 71735, 1) - put(data, 71737, 71738, 1) - put(data, 71995, 71996, 1) - put(data, 71998, 72003, 5) - put(data, 72148, 72151, 1) - put(data, 72154, 72155, 1) - put(data, 72160, 72193, 33) - put(data, 72194, 72202, 1) - put(data, 72243, 72248, 1) - put(data, 72251, 72254, 1) - put(data, 72263, 72273, 10) - put(data, 72274, 72278, 1) - put(data, 72281, 72283, 1) - put(data, 72330, 72342, 1) - put(data, 72344, 72345, 1) - put(data, 72752, 72758, 1) - put(data, 72760, 72765, 1) - put(data, 72767, 72850, 83) - put(data, 72851, 72871, 1) - put(data, 72874, 72880, 1) - put(data, 72882, 72883, 1) - put(data, 72885, 72886, 1) - put(data, 73009, 73014, 1) - put(data, 73018, 73020, 2) - put(data, 73021, 73023, 2) - put(data, 73024, 73029, 1) - put(data, 73031, 73104, 73) - put(data, 73105, 73109, 4) - put(data, 73111, 73459, 348) - put(data, 73460, 92912, 19452) - put(data, 92913, 92916, 1) - put(data, 92976, 92982, 1) - put(data, 94031, 94095, 64) - put(data, 94096, 94098, 1) - put(data, 94180, 113821, 19641) - put(data, 113822, 118528, 4706) - put(data, 118529, 118573, 1) - put(data, 118576, 118598, 1) - put(data, 119143, 119145, 1) - put(data, 119163, 119170, 1) - put(data, 119173, 119179, 1) - put(data, 119210, 119213, 1) - put(data, 119362, 119364, 1) - put(data, 121344, 121398, 1) - put(data, 121403, 121452, 1) - put(data, 121461, 121476, 15) - put(data, 121499, 121503, 1) - put(data, 121505, 121519, 1) - put(data, 122880, 122886, 1) - put(data, 122888, 122904, 1) - put(data, 122907, 122913, 1) - put(data, 122915, 122916, 1) - put(data, 122918, 122922, 1) - put(data, 123184, 123190, 1) - put(data, 123566, 123628, 62) - put(data, 123629, 123631, 1) - put(data, 125136, 125142, 1) - put(data, 125252, 125258, 1) - put(data, 917760, 917999, 1) - data - end + private class_getter category_Mn : Array({Int32, Int32, Int32}) do + data = Array({Int32, Int32, Int32}).new(300) + put(data, 768, 879, 1) + put(data, 1155, 1159, 1) + put(data, 1425, 1469, 1) + put(data, 1471, 1473, 2) + put(data, 1474, 1476, 2) + put(data, 1477, 1479, 2) + put(data, 1552, 1562, 1) + put(data, 1611, 1631, 1) + put(data, 1648, 1750, 102) + put(data, 1751, 1756, 1) + put(data, 1759, 1764, 1) + put(data, 1767, 1768, 1) + put(data, 1770, 1773, 1) + put(data, 1809, 1840, 31) + put(data, 1841, 1866, 1) + put(data, 1958, 1968, 1) + put(data, 2027, 2035, 1) + put(data, 2045, 2070, 25) + put(data, 2071, 2073, 1) + put(data, 2075, 2083, 1) + put(data, 2085, 2087, 1) + put(data, 2089, 2093, 1) + put(data, 2137, 2139, 1) + put(data, 2200, 2207, 1) + put(data, 2250, 2273, 1) + put(data, 2275, 2306, 1) + put(data, 2362, 2364, 2) + put(data, 2369, 2376, 1) + put(data, 2381, 2385, 4) + put(data, 2386, 2391, 1) + put(data, 2402, 2403, 1) + put(data, 2433, 2492, 59) + put(data, 2497, 2500, 1) + put(data, 2509, 2530, 21) + put(data, 2531, 2558, 27) + put(data, 2561, 2562, 1) + put(data, 2620, 2625, 5) + put(data, 2626, 2631, 5) + put(data, 2632, 2635, 3) + put(data, 2636, 2637, 1) + put(data, 2641, 2672, 31) + put(data, 2673, 2677, 4) + put(data, 2689, 2690, 1) + put(data, 2748, 2753, 5) + put(data, 2754, 2757, 1) + put(data, 2759, 2760, 1) + put(data, 2765, 2786, 21) + put(data, 2787, 2810, 23) + put(data, 2811, 2815, 1) + put(data, 2817, 2876, 59) + put(data, 2879, 2881, 2) + put(data, 2882, 2884, 1) + put(data, 2893, 2901, 8) + put(data, 2902, 2914, 12) + put(data, 2915, 2946, 31) + put(data, 3008, 3021, 13) + put(data, 3072, 3076, 4) + put(data, 3132, 3134, 2) + put(data, 3135, 3136, 1) + put(data, 3142, 3144, 1) + put(data, 3146, 3149, 1) + put(data, 3157, 3158, 1) + put(data, 3170, 3171, 1) + put(data, 3201, 3260, 59) + put(data, 3263, 3270, 7) + put(data, 3276, 3277, 1) + put(data, 3298, 3299, 1) + put(data, 3328, 3329, 1) + put(data, 3387, 3388, 1) + put(data, 3393, 3396, 1) + put(data, 3405, 3426, 21) + put(data, 3427, 3457, 30) + put(data, 3530, 3538, 8) + put(data, 3539, 3540, 1) + put(data, 3542, 3633, 91) + put(data, 3636, 3642, 1) + put(data, 3655, 3662, 1) + put(data, 3761, 3764, 3) + put(data, 3765, 3772, 1) + put(data, 3784, 3789, 1) + put(data, 3864, 3865, 1) + put(data, 3893, 3897, 2) + put(data, 3953, 3966, 1) + put(data, 3968, 3972, 1) + put(data, 3974, 3975, 1) + put(data, 3981, 3991, 1) + put(data, 3993, 4028, 1) + put(data, 4038, 4141, 103) + put(data, 4142, 4144, 1) + put(data, 4146, 4151, 1) + put(data, 4153, 4154, 1) + put(data, 4157, 4158, 1) + put(data, 4184, 4185, 1) + put(data, 4190, 4192, 1) + put(data, 4209, 4212, 1) + put(data, 4226, 4229, 3) + put(data, 4230, 4237, 7) + put(data, 4253, 4957, 704) + put(data, 4958, 4959, 1) + put(data, 5906, 5908, 1) + put(data, 5938, 5939, 1) + put(data, 5970, 5971, 1) + put(data, 6002, 6003, 1) + put(data, 6068, 6069, 1) + put(data, 6071, 6077, 1) + put(data, 6086, 6089, 3) + put(data, 6090, 6099, 1) + put(data, 6109, 6155, 46) + put(data, 6156, 6157, 1) + put(data, 6159, 6277, 118) + put(data, 6278, 6313, 35) + put(data, 6432, 6434, 1) + put(data, 6439, 6440, 1) + put(data, 6450, 6457, 7) + put(data, 6458, 6459, 1) + put(data, 6679, 6680, 1) + put(data, 6683, 6742, 59) + put(data, 6744, 6750, 1) + put(data, 6752, 6754, 2) + put(data, 6757, 6764, 1) + put(data, 6771, 6780, 1) + put(data, 6783, 6832, 49) + put(data, 6833, 6845, 1) + put(data, 6847, 6862, 1) + put(data, 6912, 6915, 1) + put(data, 6964, 6966, 2) + put(data, 6967, 6970, 1) + put(data, 6972, 6978, 6) + put(data, 7019, 7027, 1) + put(data, 7040, 7041, 1) + put(data, 7074, 7077, 1) + put(data, 7080, 7081, 1) + put(data, 7083, 7085, 1) + put(data, 7142, 7144, 2) + put(data, 7145, 7149, 4) + put(data, 7151, 7153, 1) + put(data, 7212, 7219, 1) + put(data, 7222, 7223, 1) + put(data, 7376, 7378, 1) + put(data, 7380, 7392, 1) + put(data, 7394, 7400, 1) + put(data, 7405, 7412, 7) + put(data, 7416, 7417, 1) + put(data, 7616, 7679, 1) + put(data, 8400, 8412, 1) + put(data, 8417, 8421, 4) + put(data, 8422, 8432, 1) + put(data, 11503, 11505, 1) + put(data, 11647, 11744, 97) + put(data, 11745, 11775, 1) + put(data, 12330, 12333, 1) + put(data, 12441, 12442, 1) + put(data, 42607, 42612, 5) + put(data, 42613, 42621, 1) + put(data, 42654, 42655, 1) + put(data, 42736, 42737, 1) + put(data, 43010, 43014, 4) + put(data, 43019, 43045, 26) + put(data, 43046, 43052, 6) + put(data, 43204, 43205, 1) + put(data, 43232, 43249, 1) + put(data, 43263, 43302, 39) + put(data, 43303, 43309, 1) + put(data, 43335, 43345, 1) + put(data, 43392, 43394, 1) + put(data, 43443, 43446, 3) + put(data, 43447, 43449, 1) + put(data, 43452, 43453, 1) + put(data, 43493, 43561, 68) + put(data, 43562, 43566, 1) + put(data, 43569, 43570, 1) + put(data, 43573, 43574, 1) + put(data, 43587, 43596, 9) + put(data, 43644, 43696, 52) + put(data, 43698, 43700, 1) + put(data, 43703, 43704, 1) + put(data, 43710, 43711, 1) + put(data, 43713, 43756, 43) + put(data, 43757, 43766, 9) + put(data, 44005, 44008, 3) + put(data, 44013, 64286, 20273) + put(data, 65024, 65039, 1) + put(data, 65056, 65071, 1) + put(data, 66045, 66272, 227) + put(data, 66422, 66426, 1) + put(data, 68097, 68099, 1) + put(data, 68101, 68102, 1) + put(data, 68108, 68111, 1) + put(data, 68152, 68154, 1) + put(data, 68159, 68325, 166) + put(data, 68326, 68900, 574) + put(data, 68901, 68903, 1) + put(data, 69291, 69292, 1) + put(data, 69446, 69456, 1) + put(data, 69506, 69509, 1) + put(data, 69633, 69688, 55) + put(data, 69689, 69702, 1) + put(data, 69744, 69747, 3) + put(data, 69748, 69759, 11) + put(data, 69760, 69761, 1) + put(data, 69811, 69814, 1) + put(data, 69817, 69818, 1) + put(data, 69826, 69888, 62) + put(data, 69889, 69890, 1) + put(data, 69927, 69931, 1) + put(data, 69933, 69940, 1) + put(data, 70003, 70016, 13) + put(data, 70017, 70070, 53) + put(data, 70071, 70078, 1) + put(data, 70089, 70092, 1) + put(data, 70095, 70191, 96) + put(data, 70192, 70193, 1) + put(data, 70196, 70198, 2) + put(data, 70199, 70206, 7) + put(data, 70367, 70371, 4) + put(data, 70372, 70378, 1) + put(data, 70400, 70401, 1) + put(data, 70459, 70460, 1) + put(data, 70464, 70502, 38) + put(data, 70503, 70508, 1) + put(data, 70512, 70516, 1) + put(data, 70712, 70719, 1) + put(data, 70722, 70724, 1) + put(data, 70726, 70750, 24) + put(data, 70835, 70840, 1) + put(data, 70842, 70847, 5) + put(data, 70848, 70850, 2) + put(data, 70851, 71090, 239) + put(data, 71091, 71093, 1) + put(data, 71100, 71101, 1) + put(data, 71103, 71104, 1) + put(data, 71132, 71133, 1) + put(data, 71219, 71226, 1) + put(data, 71229, 71231, 2) + put(data, 71232, 71339, 107) + put(data, 71341, 71344, 3) + put(data, 71345, 71349, 1) + put(data, 71351, 71453, 102) + put(data, 71454, 71455, 1) + put(data, 71458, 71461, 1) + put(data, 71463, 71467, 1) + put(data, 71727, 71735, 1) + put(data, 71737, 71738, 1) + put(data, 71995, 71996, 1) + put(data, 71998, 72003, 5) + put(data, 72148, 72151, 1) + put(data, 72154, 72155, 1) + put(data, 72160, 72193, 33) + put(data, 72194, 72202, 1) + put(data, 72243, 72248, 1) + put(data, 72251, 72254, 1) + put(data, 72263, 72273, 10) + put(data, 72274, 72278, 1) + put(data, 72281, 72283, 1) + put(data, 72330, 72342, 1) + put(data, 72344, 72345, 1) + put(data, 72752, 72758, 1) + put(data, 72760, 72765, 1) + put(data, 72767, 72850, 83) + put(data, 72851, 72871, 1) + put(data, 72874, 72880, 1) + put(data, 72882, 72883, 1) + put(data, 72885, 72886, 1) + put(data, 73009, 73014, 1) + put(data, 73018, 73020, 2) + put(data, 73021, 73023, 2) + put(data, 73024, 73029, 1) + put(data, 73031, 73104, 73) + put(data, 73105, 73109, 4) + put(data, 73111, 73459, 348) + put(data, 73460, 92912, 19452) + put(data, 92913, 92916, 1) + put(data, 92976, 92982, 1) + put(data, 94031, 94095, 64) + put(data, 94096, 94098, 1) + put(data, 94180, 113821, 19641) + put(data, 113822, 118528, 4706) + put(data, 118529, 118573, 1) + put(data, 118576, 118598, 1) + put(data, 119143, 119145, 1) + put(data, 119163, 119170, 1) + put(data, 119173, 119179, 1) + put(data, 119210, 119213, 1) + put(data, 119362, 119364, 1) + put(data, 121344, 121398, 1) + put(data, 121403, 121452, 1) + put(data, 121461, 121476, 15) + put(data, 121499, 121503, 1) + put(data, 121505, 121519, 1) + put(data, 122880, 122886, 1) + put(data, 122888, 122904, 1) + put(data, 122907, 122913, 1) + put(data, 122915, 122916, 1) + put(data, 122918, 122922, 1) + put(data, 123184, 123190, 1) + put(data, 123566, 123628, 62) + put(data, 123629, 123631, 1) + put(data, 125136, 125142, 1) + put(data, 125252, 125258, 1) + put(data, 917760, 917999, 1) + data end - - @@category_Mc : Array({Int32, Int32, Int32})? - - private def self.category_Mc - @@category_Mc ||= begin - data = Array({Int32, Int32, Int32}).new(154) - put(data, 2307, 2363, 56) - put(data, 2366, 2368, 1) - put(data, 2377, 2380, 1) - put(data, 2382, 2383, 1) - put(data, 2434, 2435, 1) - put(data, 2494, 2496, 1) - put(data, 2503, 2504, 1) - put(data, 2507, 2508, 1) - put(data, 2519, 2563, 44) - put(data, 2622, 2624, 1) - put(data, 2691, 2750, 59) - put(data, 2751, 2752, 1) - put(data, 2761, 2763, 2) - put(data, 2764, 2818, 54) - put(data, 2819, 2878, 59) - put(data, 2880, 2887, 7) - put(data, 2888, 2891, 3) - put(data, 2892, 2903, 11) - put(data, 3006, 3007, 1) - put(data, 3009, 3010, 1) - put(data, 3014, 3016, 1) - put(data, 3018, 3020, 1) - put(data, 3031, 3073, 42) - put(data, 3074, 3075, 1) - put(data, 3137, 3140, 1) - put(data, 3202, 3203, 1) - put(data, 3262, 3264, 2) - put(data, 3265, 3268, 1) - put(data, 3271, 3272, 1) - put(data, 3274, 3275, 1) - put(data, 3285, 3286, 1) - put(data, 3330, 3331, 1) - put(data, 3390, 3392, 1) - put(data, 3398, 3400, 1) - put(data, 3402, 3404, 1) - put(data, 3415, 3458, 43) - put(data, 3459, 3535, 76) - put(data, 3536, 3537, 1) - put(data, 3544, 3551, 1) - put(data, 3570, 3571, 1) - put(data, 3902, 3903, 1) - put(data, 3967, 4139, 172) - put(data, 4140, 4145, 5) - put(data, 4152, 4155, 3) - put(data, 4156, 4182, 26) - put(data, 4183, 4194, 11) - put(data, 4195, 4196, 1) - put(data, 4199, 4205, 1) - put(data, 4227, 4228, 1) - put(data, 4231, 4236, 1) - put(data, 4239, 4250, 11) - put(data, 4251, 4252, 1) - put(data, 5909, 5940, 31) - put(data, 6070, 6078, 8) - put(data, 6079, 6085, 1) - put(data, 6087, 6088, 1) - put(data, 6435, 6438, 1) - put(data, 6441, 6443, 1) - put(data, 6448, 6449, 1) - put(data, 6451, 6456, 1) - put(data, 6681, 6682, 1) - put(data, 6741, 6743, 2) - put(data, 6753, 6755, 2) - put(data, 6756, 6765, 9) - put(data, 6766, 6770, 1) - put(data, 6916, 6965, 49) - put(data, 6971, 6973, 2) - put(data, 6974, 6977, 1) - put(data, 6979, 6980, 1) - put(data, 7042, 7073, 31) - put(data, 7078, 7079, 1) - put(data, 7082, 7143, 61) - put(data, 7146, 7148, 1) - put(data, 7150, 7154, 4) - put(data, 7155, 7204, 49) - put(data, 7205, 7211, 1) - put(data, 7220, 7221, 1) - put(data, 7393, 7415, 22) - put(data, 12334, 12335, 1) - put(data, 43043, 43044, 1) - put(data, 43047, 43136, 89) - put(data, 43137, 43188, 51) - put(data, 43189, 43203, 1) - put(data, 43346, 43347, 1) - put(data, 43395, 43444, 49) - put(data, 43445, 43450, 5) - put(data, 43451, 43454, 3) - put(data, 43455, 43456, 1) - put(data, 43567, 43568, 1) - put(data, 43571, 43572, 1) - put(data, 43597, 43643, 46) - put(data, 43645, 43755, 110) - put(data, 43758, 43759, 1) - put(data, 43765, 44003, 238) - put(data, 44004, 44006, 2) - put(data, 44007, 44009, 2) - put(data, 44010, 44012, 2) - put(data, 69632, 69634, 2) - put(data, 69762, 69808, 46) - put(data, 69809, 69810, 1) - put(data, 69815, 69816, 1) - put(data, 69932, 69957, 25) - put(data, 69958, 70018, 60) - put(data, 70067, 70069, 1) - put(data, 70079, 70080, 1) - put(data, 70094, 70188, 94) - put(data, 70189, 70190, 1) - put(data, 70194, 70195, 1) - put(data, 70197, 70368, 171) - put(data, 70369, 70370, 1) - put(data, 70402, 70403, 1) - put(data, 70462, 70463, 1) - put(data, 70465, 70468, 1) - put(data, 70471, 70472, 1) - put(data, 70475, 70477, 1) - put(data, 70487, 70498, 11) - put(data, 70499, 70709, 210) - put(data, 70710, 70711, 1) - put(data, 70720, 70721, 1) - put(data, 70725, 70832, 107) - put(data, 70833, 70834, 1) - put(data, 70841, 70843, 2) - put(data, 70844, 70846, 1) - put(data, 70849, 71087, 238) - put(data, 71088, 71089, 1) - put(data, 71096, 71099, 1) - put(data, 71102, 71216, 114) - put(data, 71217, 71218, 1) - put(data, 71227, 71228, 1) - put(data, 71230, 71340, 110) - put(data, 71342, 71343, 1) - put(data, 71350, 71456, 106) - put(data, 71457, 71462, 5) - put(data, 71724, 71726, 1) - put(data, 71736, 71984, 248) - put(data, 71985, 71989, 1) - put(data, 71991, 71992, 1) - put(data, 71997, 72000, 3) - put(data, 72002, 72145, 143) - put(data, 72146, 72147, 1) - put(data, 72156, 72159, 1) - put(data, 72164, 72249, 85) - put(data, 72279, 72280, 1) - put(data, 72343, 72751, 408) - put(data, 72766, 72873, 107) - put(data, 72881, 72884, 3) - put(data, 73098, 73102, 1) - put(data, 73107, 73108, 1) - put(data, 73110, 73461, 351) - put(data, 73462, 94033, 20571) - put(data, 94034, 94087, 1) - put(data, 94192, 94193, 1) - put(data, 119141, 119142, 1) - put(data, 119149, 119154, 1) - data - end + private class_getter category_Mc : Array({Int32, Int32, Int32}) do + data = Array({Int32, Int32, Int32}).new(154) + put(data, 2307, 2363, 56) + put(data, 2366, 2368, 1) + put(data, 2377, 2380, 1) + put(data, 2382, 2383, 1) + put(data, 2434, 2435, 1) + put(data, 2494, 2496, 1) + put(data, 2503, 2504, 1) + put(data, 2507, 2508, 1) + put(data, 2519, 2563, 44) + put(data, 2622, 2624, 1) + put(data, 2691, 2750, 59) + put(data, 2751, 2752, 1) + put(data, 2761, 2763, 2) + put(data, 2764, 2818, 54) + put(data, 2819, 2878, 59) + put(data, 2880, 2887, 7) + put(data, 2888, 2891, 3) + put(data, 2892, 2903, 11) + put(data, 3006, 3007, 1) + put(data, 3009, 3010, 1) + put(data, 3014, 3016, 1) + put(data, 3018, 3020, 1) + put(data, 3031, 3073, 42) + put(data, 3074, 3075, 1) + put(data, 3137, 3140, 1) + put(data, 3202, 3203, 1) + put(data, 3262, 3264, 2) + put(data, 3265, 3268, 1) + put(data, 3271, 3272, 1) + put(data, 3274, 3275, 1) + put(data, 3285, 3286, 1) + put(data, 3330, 3331, 1) + put(data, 3390, 3392, 1) + put(data, 3398, 3400, 1) + put(data, 3402, 3404, 1) + put(data, 3415, 3458, 43) + put(data, 3459, 3535, 76) + put(data, 3536, 3537, 1) + put(data, 3544, 3551, 1) + put(data, 3570, 3571, 1) + put(data, 3902, 3903, 1) + put(data, 3967, 4139, 172) + put(data, 4140, 4145, 5) + put(data, 4152, 4155, 3) + put(data, 4156, 4182, 26) + put(data, 4183, 4194, 11) + put(data, 4195, 4196, 1) + put(data, 4199, 4205, 1) + put(data, 4227, 4228, 1) + put(data, 4231, 4236, 1) + put(data, 4239, 4250, 11) + put(data, 4251, 4252, 1) + put(data, 5909, 5940, 31) + put(data, 6070, 6078, 8) + put(data, 6079, 6085, 1) + put(data, 6087, 6088, 1) + put(data, 6435, 6438, 1) + put(data, 6441, 6443, 1) + put(data, 6448, 6449, 1) + put(data, 6451, 6456, 1) + put(data, 6681, 6682, 1) + put(data, 6741, 6743, 2) + put(data, 6753, 6755, 2) + put(data, 6756, 6765, 9) + put(data, 6766, 6770, 1) + put(data, 6916, 6965, 49) + put(data, 6971, 6973, 2) + put(data, 6974, 6977, 1) + put(data, 6979, 6980, 1) + put(data, 7042, 7073, 31) + put(data, 7078, 7079, 1) + put(data, 7082, 7143, 61) + put(data, 7146, 7148, 1) + put(data, 7150, 7154, 4) + put(data, 7155, 7204, 49) + put(data, 7205, 7211, 1) + put(data, 7220, 7221, 1) + put(data, 7393, 7415, 22) + put(data, 12334, 12335, 1) + put(data, 43043, 43044, 1) + put(data, 43047, 43136, 89) + put(data, 43137, 43188, 51) + put(data, 43189, 43203, 1) + put(data, 43346, 43347, 1) + put(data, 43395, 43444, 49) + put(data, 43445, 43450, 5) + put(data, 43451, 43454, 3) + put(data, 43455, 43456, 1) + put(data, 43567, 43568, 1) + put(data, 43571, 43572, 1) + put(data, 43597, 43643, 46) + put(data, 43645, 43755, 110) + put(data, 43758, 43759, 1) + put(data, 43765, 44003, 238) + put(data, 44004, 44006, 2) + put(data, 44007, 44009, 2) + put(data, 44010, 44012, 2) + put(data, 69632, 69634, 2) + put(data, 69762, 69808, 46) + put(data, 69809, 69810, 1) + put(data, 69815, 69816, 1) + put(data, 69932, 69957, 25) + put(data, 69958, 70018, 60) + put(data, 70067, 70069, 1) + put(data, 70079, 70080, 1) + put(data, 70094, 70188, 94) + put(data, 70189, 70190, 1) + put(data, 70194, 70195, 1) + put(data, 70197, 70368, 171) + put(data, 70369, 70370, 1) + put(data, 70402, 70403, 1) + put(data, 70462, 70463, 1) + put(data, 70465, 70468, 1) + put(data, 70471, 70472, 1) + put(data, 70475, 70477, 1) + put(data, 70487, 70498, 11) + put(data, 70499, 70709, 210) + put(data, 70710, 70711, 1) + put(data, 70720, 70721, 1) + put(data, 70725, 70832, 107) + put(data, 70833, 70834, 1) + put(data, 70841, 70843, 2) + put(data, 70844, 70846, 1) + put(data, 70849, 71087, 238) + put(data, 71088, 71089, 1) + put(data, 71096, 71099, 1) + put(data, 71102, 71216, 114) + put(data, 71217, 71218, 1) + put(data, 71227, 71228, 1) + put(data, 71230, 71340, 110) + put(data, 71342, 71343, 1) + put(data, 71350, 71456, 106) + put(data, 71457, 71462, 5) + put(data, 71724, 71726, 1) + put(data, 71736, 71984, 248) + put(data, 71985, 71989, 1) + put(data, 71991, 71992, 1) + put(data, 71997, 72000, 3) + put(data, 72002, 72145, 143) + put(data, 72146, 72147, 1) + put(data, 72156, 72159, 1) + put(data, 72164, 72249, 85) + put(data, 72279, 72280, 1) + put(data, 72343, 72751, 408) + put(data, 72766, 72873, 107) + put(data, 72881, 72884, 3) + put(data, 73098, 73102, 1) + put(data, 73107, 73108, 1) + put(data, 73110, 73461, 351) + put(data, 73462, 94033, 20571) + put(data, 94034, 94087, 1) + put(data, 94192, 94193, 1) + put(data, 119141, 119142, 1) + put(data, 119149, 119154, 1) + data end - - @@category_Me : Array({Int32, Int32, Int32})? - - private def self.category_Me - @@category_Me ||= begin - data = Array({Int32, Int32, Int32}).new(5) - put(data, 1160, 1161, 1) - put(data, 6846, 8413, 1567) - put(data, 8414, 8416, 1) - put(data, 8418, 8420, 1) - put(data, 42608, 42610, 1) - data - end + private class_getter category_Me : Array({Int32, Int32, Int32}) do + data = Array({Int32, Int32, Int32}).new(5) + put(data, 1160, 1161, 1) + put(data, 6846, 8413, 1567) + put(data, 8414, 8416, 1) + put(data, 8418, 8420, 1) + put(data, 42608, 42610, 1) + data end - - @@category_Nd : Array({Int32, Int32, Int32})? - - private def self.category_Nd - @@category_Nd ||= begin - data = Array({Int32, Int32, Int32}).new(62) - put(data, 48, 57, 1) - put(data, 1632, 1641, 1) - put(data, 1776, 1785, 1) - put(data, 1984, 1993, 1) - put(data, 2406, 2415, 1) - put(data, 2534, 2543, 1) - put(data, 2662, 2671, 1) - put(data, 2790, 2799, 1) - put(data, 2918, 2927, 1) - put(data, 3046, 3055, 1) - put(data, 3174, 3183, 1) - put(data, 3302, 3311, 1) - put(data, 3430, 3439, 1) - put(data, 3558, 3567, 1) - put(data, 3664, 3673, 1) - put(data, 3792, 3801, 1) - put(data, 3872, 3881, 1) - put(data, 4160, 4169, 1) - put(data, 4240, 4249, 1) - put(data, 6112, 6121, 1) - put(data, 6160, 6169, 1) - put(data, 6470, 6479, 1) - put(data, 6608, 6617, 1) - put(data, 6784, 6793, 1) - put(data, 6800, 6809, 1) - put(data, 6992, 7001, 1) - put(data, 7088, 7097, 1) - put(data, 7232, 7241, 1) - put(data, 7248, 7257, 1) - put(data, 42528, 42537, 1) - put(data, 43216, 43225, 1) - put(data, 43264, 43273, 1) - put(data, 43472, 43481, 1) - put(data, 43504, 43513, 1) - put(data, 43600, 43609, 1) - put(data, 44016, 44025, 1) - put(data, 65296, 65305, 1) - put(data, 66720, 66729, 1) - put(data, 68912, 68921, 1) - put(data, 69734, 69743, 1) - put(data, 69872, 69881, 1) - put(data, 69942, 69951, 1) - put(data, 70096, 70105, 1) - put(data, 70384, 70393, 1) - put(data, 70736, 70745, 1) - put(data, 70864, 70873, 1) - put(data, 71248, 71257, 1) - put(data, 71360, 71369, 1) - put(data, 71472, 71481, 1) - put(data, 71904, 71913, 1) - put(data, 72016, 72025, 1) - put(data, 72784, 72793, 1) - put(data, 73040, 73049, 1) - put(data, 73120, 73129, 1) - put(data, 92768, 92777, 1) - put(data, 92864, 92873, 1) - put(data, 93008, 93017, 1) - put(data, 120782, 120831, 1) - put(data, 123200, 123209, 1) - put(data, 123632, 123641, 1) - put(data, 125264, 125273, 1) - put(data, 130032, 130041, 1) - data - end + private class_getter category_Nd : Array({Int32, Int32, Int32}) do + data = Array({Int32, Int32, Int32}).new(62) + put(data, 48, 57, 1) + put(data, 1632, 1641, 1) + put(data, 1776, 1785, 1) + put(data, 1984, 1993, 1) + put(data, 2406, 2415, 1) + put(data, 2534, 2543, 1) + put(data, 2662, 2671, 1) + put(data, 2790, 2799, 1) + put(data, 2918, 2927, 1) + put(data, 3046, 3055, 1) + put(data, 3174, 3183, 1) + put(data, 3302, 3311, 1) + put(data, 3430, 3439, 1) + put(data, 3558, 3567, 1) + put(data, 3664, 3673, 1) + put(data, 3792, 3801, 1) + put(data, 3872, 3881, 1) + put(data, 4160, 4169, 1) + put(data, 4240, 4249, 1) + put(data, 6112, 6121, 1) + put(data, 6160, 6169, 1) + put(data, 6470, 6479, 1) + put(data, 6608, 6617, 1) + put(data, 6784, 6793, 1) + put(data, 6800, 6809, 1) + put(data, 6992, 7001, 1) + put(data, 7088, 7097, 1) + put(data, 7232, 7241, 1) + put(data, 7248, 7257, 1) + put(data, 42528, 42537, 1) + put(data, 43216, 43225, 1) + put(data, 43264, 43273, 1) + put(data, 43472, 43481, 1) + put(data, 43504, 43513, 1) + put(data, 43600, 43609, 1) + put(data, 44016, 44025, 1) + put(data, 65296, 65305, 1) + put(data, 66720, 66729, 1) + put(data, 68912, 68921, 1) + put(data, 69734, 69743, 1) + put(data, 69872, 69881, 1) + put(data, 69942, 69951, 1) + put(data, 70096, 70105, 1) + put(data, 70384, 70393, 1) + put(data, 70736, 70745, 1) + put(data, 70864, 70873, 1) + put(data, 71248, 71257, 1) + put(data, 71360, 71369, 1) + put(data, 71472, 71481, 1) + put(data, 71904, 71913, 1) + put(data, 72016, 72025, 1) + put(data, 72784, 72793, 1) + put(data, 73040, 73049, 1) + put(data, 73120, 73129, 1) + put(data, 92768, 92777, 1) + put(data, 92864, 92873, 1) + put(data, 93008, 93017, 1) + put(data, 120782, 120831, 1) + put(data, 123200, 123209, 1) + put(data, 123632, 123641, 1) + put(data, 125264, 125273, 1) + put(data, 130032, 130041, 1) + data end - - @@category_Nl : Array({Int32, Int32, Int32})? - - private def self.category_Nl - @@category_Nl ||= begin - data = Array({Int32, Int32, Int32}).new(11) - put(data, 5870, 5872, 1) - put(data, 8544, 8578, 1) - put(data, 8581, 8584, 1) - put(data, 12295, 12321, 26) - put(data, 12322, 12329, 1) - put(data, 12344, 12346, 1) - put(data, 42726, 42735, 1) - put(data, 65856, 65908, 1) - put(data, 66369, 66378, 9) - put(data, 66513, 66517, 1) - put(data, 74752, 74862, 1) - data - end + private class_getter category_Nl : Array({Int32, Int32, Int32}) do + data = Array({Int32, Int32, Int32}).new(11) + put(data, 5870, 5872, 1) + put(data, 8544, 8578, 1) + put(data, 8581, 8584, 1) + put(data, 12295, 12321, 26) + put(data, 12322, 12329, 1) + put(data, 12344, 12346, 1) + put(data, 42726, 42735, 1) + put(data, 65856, 65908, 1) + put(data, 66369, 66378, 9) + put(data, 66513, 66517, 1) + put(data, 74752, 74862, 1) + data end - - @@category_No : Array({Int32, Int32, Int32})? - - private def self.category_No - @@category_No ||= begin - data = Array({Int32, Int32, Int32}).new(70) - put(data, 178, 179, 1) - put(data, 185, 188, 3) - put(data, 189, 190, 1) - put(data, 2548, 2553, 1) - put(data, 2930, 2935, 1) - put(data, 3056, 3058, 1) - put(data, 3192, 3198, 1) - put(data, 3416, 3422, 1) - put(data, 3440, 3448, 1) - put(data, 3882, 3891, 1) - put(data, 4969, 4988, 1) - put(data, 6128, 6137, 1) - put(data, 6618, 8304, 1686) - put(data, 8308, 8313, 1) - put(data, 8320, 8329, 1) - put(data, 8528, 8543, 1) - put(data, 8585, 9312, 727) - put(data, 9313, 9371, 1) - put(data, 9450, 9471, 1) - put(data, 10102, 10131, 1) - put(data, 11517, 12690, 1173) - put(data, 12691, 12693, 1) - put(data, 12832, 12841, 1) - put(data, 12872, 12879, 1) - put(data, 12881, 12895, 1) - put(data, 12928, 12937, 1) - put(data, 12977, 12991, 1) - put(data, 43056, 43061, 1) - put(data, 65799, 65843, 1) - put(data, 65909, 65912, 1) - put(data, 65930, 65931, 1) - put(data, 66273, 66299, 1) - put(data, 66336, 66339, 1) - put(data, 67672, 67679, 1) - put(data, 67705, 67711, 1) - put(data, 67751, 67759, 1) - put(data, 67835, 67839, 1) - put(data, 67862, 67867, 1) - put(data, 68028, 68029, 1) - put(data, 68032, 68047, 1) - put(data, 68050, 68095, 1) - put(data, 68160, 68168, 1) - put(data, 68221, 68222, 1) - put(data, 68253, 68255, 1) - put(data, 68331, 68335, 1) - put(data, 68440, 68447, 1) - put(data, 68472, 68479, 1) - put(data, 68521, 68527, 1) - put(data, 68858, 68863, 1) - put(data, 69216, 69246, 1) - put(data, 69405, 69414, 1) - put(data, 69457, 69460, 1) - put(data, 69573, 69579, 1) - put(data, 69714, 69733, 1) - put(data, 70113, 70132, 1) - put(data, 71482, 71483, 1) - put(data, 71914, 71922, 1) - put(data, 72794, 72812, 1) - put(data, 73664, 73684, 1) - put(data, 93019, 93025, 1) - put(data, 93824, 93846, 1) - put(data, 119520, 119539, 1) - put(data, 119648, 119672, 1) - put(data, 125127, 125135, 1) - put(data, 126065, 126123, 1) - put(data, 126125, 126127, 1) - put(data, 126129, 126132, 1) - put(data, 126209, 126253, 1) - put(data, 126255, 126269, 1) - put(data, 127232, 127244, 1) - data - end + private class_getter category_No : Array({Int32, Int32, Int32}) do + data = Array({Int32, Int32, Int32}).new(70) + put(data, 178, 179, 1) + put(data, 185, 188, 3) + put(data, 189, 190, 1) + put(data, 2548, 2553, 1) + put(data, 2930, 2935, 1) + put(data, 3056, 3058, 1) + put(data, 3192, 3198, 1) + put(data, 3416, 3422, 1) + put(data, 3440, 3448, 1) + put(data, 3882, 3891, 1) + put(data, 4969, 4988, 1) + put(data, 6128, 6137, 1) + put(data, 6618, 8304, 1686) + put(data, 8308, 8313, 1) + put(data, 8320, 8329, 1) + put(data, 8528, 8543, 1) + put(data, 8585, 9312, 727) + put(data, 9313, 9371, 1) + put(data, 9450, 9471, 1) + put(data, 10102, 10131, 1) + put(data, 11517, 12690, 1173) + put(data, 12691, 12693, 1) + put(data, 12832, 12841, 1) + put(data, 12872, 12879, 1) + put(data, 12881, 12895, 1) + put(data, 12928, 12937, 1) + put(data, 12977, 12991, 1) + put(data, 43056, 43061, 1) + put(data, 65799, 65843, 1) + put(data, 65909, 65912, 1) + put(data, 65930, 65931, 1) + put(data, 66273, 66299, 1) + put(data, 66336, 66339, 1) + put(data, 67672, 67679, 1) + put(data, 67705, 67711, 1) + put(data, 67751, 67759, 1) + put(data, 67835, 67839, 1) + put(data, 67862, 67867, 1) + put(data, 68028, 68029, 1) + put(data, 68032, 68047, 1) + put(data, 68050, 68095, 1) + put(data, 68160, 68168, 1) + put(data, 68221, 68222, 1) + put(data, 68253, 68255, 1) + put(data, 68331, 68335, 1) + put(data, 68440, 68447, 1) + put(data, 68472, 68479, 1) + put(data, 68521, 68527, 1) + put(data, 68858, 68863, 1) + put(data, 69216, 69246, 1) + put(data, 69405, 69414, 1) + put(data, 69457, 69460, 1) + put(data, 69573, 69579, 1) + put(data, 69714, 69733, 1) + put(data, 70113, 70132, 1) + put(data, 71482, 71483, 1) + put(data, 71914, 71922, 1) + put(data, 72794, 72812, 1) + put(data, 73664, 73684, 1) + put(data, 93019, 93025, 1) + put(data, 93824, 93846, 1) + put(data, 119520, 119539, 1) + put(data, 119648, 119672, 1) + put(data, 125127, 125135, 1) + put(data, 126065, 126123, 1) + put(data, 126125, 126127, 1) + put(data, 126129, 126132, 1) + put(data, 126209, 126253, 1) + put(data, 126255, 126269, 1) + put(data, 127232, 127244, 1) + data end - - @@category_Zs : Array({Int32, Int32, Int32})? - - private def self.category_Zs - @@category_Zs ||= begin - data = Array({Int32, Int32, Int32}).new(5) - put(data, 32, 160, 128) - put(data, 5760, 8192, 2432) - put(data, 8193, 8202, 1) - put(data, 8239, 8287, 48) - put(data, 12288, 12288, 1) - data - end + private class_getter category_Zs : Array({Int32, Int32, Int32}) do + data = Array({Int32, Int32, Int32}).new(5) + put(data, 32, 160, 128) + put(data, 5760, 8192, 2432) + put(data, 8193, 8202, 1) + put(data, 8239, 8287, 48) + put(data, 12288, 12288, 1) + data end - - @@category_Zl : Array({Int32, Int32, Int32})? - - private def self.category_Zl - @@category_Zl ||= begin - data = Array({Int32, Int32, Int32}).new(1) - put(data, 8232, 8232, 1) - data - end + private class_getter category_Zl : Array({Int32, Int32, Int32}) do + data = Array({Int32, Int32, Int32}).new(1) + put(data, 8232, 8232, 1) + data end - - @@category_Zp : Array({Int32, Int32, Int32})? - - private def self.category_Zp - @@category_Zp ||= begin - data = Array({Int32, Int32, Int32}).new(1) - put(data, 8233, 8233, 1) - data - end + private class_getter category_Zp : Array({Int32, Int32, Int32}) do + data = Array({Int32, Int32, Int32}).new(1) + put(data, 8233, 8233, 1) + data end - - @@category_Cc : Array({Int32, Int32, Int32})? - - private def self.category_Cc - @@category_Cc ||= begin - data = Array({Int32, Int32, Int32}).new(2) - put(data, 0, 31, 1) - put(data, 127, 159, 1) - data - end + private class_getter category_Cc : Array({Int32, Int32, Int32}) do + data = Array({Int32, Int32, Int32}).new(2) + put(data, 0, 31, 1) + put(data, 127, 159, 1) + data end - - @@category_Cf : Array({Int32, Int32, Int32})? - - private def self.category_Cf - @@category_Cf ||= begin - data = Array({Int32, Int32, Int32}).new(18) - put(data, 173, 1536, 1363) - put(data, 1537, 1541, 1) - put(data, 1564, 1757, 193) - put(data, 1807, 2192, 385) - put(data, 2193, 2274, 81) - put(data, 6158, 8203, 2045) - put(data, 8204, 8207, 1) - put(data, 8234, 8238, 1) - put(data, 8288, 8292, 1) - put(data, 8294, 8303, 1) - put(data, 65279, 65529, 250) - put(data, 65530, 65531, 1) - put(data, 69821, 69837, 16) - put(data, 78896, 78904, 1) - put(data, 113824, 113827, 1) - put(data, 119155, 119162, 1) - put(data, 917505, 917536, 31) - put(data, 917537, 917631, 1) - data - end + private class_getter category_Cf : Array({Int32, Int32, Int32}) do + data = Array({Int32, Int32, Int32}).new(18) + put(data, 173, 1536, 1363) + put(data, 1537, 1541, 1) + put(data, 1564, 1757, 193) + put(data, 1807, 2192, 385) + put(data, 2193, 2274, 81) + put(data, 6158, 8203, 2045) + put(data, 8204, 8207, 1) + put(data, 8234, 8238, 1) + put(data, 8288, 8292, 1) + put(data, 8294, 8303, 1) + put(data, 65279, 65529, 250) + put(data, 65530, 65531, 1) + put(data, 69821, 69837, 16) + put(data, 78896, 78904, 1) + put(data, 113824, 113827, 1) + put(data, 119155, 119162, 1) + put(data, 917505, 917536, 31) + put(data, 917537, 917631, 1) + data end - - @@category_Cs : Array({Int32, Int32, Int32})? - - private def self.category_Cs - @@category_Cs ||= begin - data = Array({Int32, Int32, Int32}).new(3) - put(data, 55296, 56191, 1) - put(data, 56192, 56319, 1) - put(data, 56320, 57343, 1) - data - end + private class_getter category_Cs : Array({Int32, Int32, Int32}) do + data = Array({Int32, Int32, Int32}).new(3) + put(data, 55296, 56191, 1) + put(data, 56192, 56319, 1) + put(data, 56320, 57343, 1) + data end - - @@category_Co : Array({Int32, Int32, Int32})? - - private def self.category_Co - @@category_Co ||= begin - data = Array({Int32, Int32, Int32}).new(3) - put(data, 57344, 63743, 1) - put(data, 983040, 1048573, 1) - put(data, 1048576, 1114109, 1) - data - end + private class_getter category_Co : Array({Int32, Int32, Int32}) do + data = Array({Int32, Int32, Int32}).new(3) + put(data, 57344, 63743, 1) + put(data, 983040, 1048573, 1) + put(data, 1048576, 1114109, 1) + data end - - @@category_Cn : Array({Int32, Int32, Int32})? - - private def self.category_Cn - @@category_Cn ||= begin - data = Array({Int32, Int32, Int32}).new(0) - data - end + private class_getter category_Cn : Array({Int32, Int32, Int32}) do + data = Array({Int32, Int32, Int32}).new(0) + data end # Most casefold conversions map a range to another range. # Here we store: {from, to, delta} - @@casefold_ranges : Array({Int32, Int32, Int32})? - - private def self.casefold_ranges - @@casefold_ranges ||= begin - data = Array({Int32, Int32, Int32}).new(681) - put(data, 65, 90, 32) - put(data, 181, 181, 775) - put(data, 192, 214, 32) - put(data, 216, 222, 32) - put(data, 256, 256, 1) - put(data, 258, 258, 1) - put(data, 260, 260, 1) - put(data, 262, 262, 1) - put(data, 264, 264, 1) - put(data, 266, 266, 1) - put(data, 268, 268, 1) - put(data, 270, 270, 1) - put(data, 272, 272, 1) - put(data, 274, 274, 1) - put(data, 276, 276, 1) - put(data, 278, 278, 1) - put(data, 280, 280, 1) - put(data, 282, 282, 1) - put(data, 284, 284, 1) - put(data, 286, 286, 1) - put(data, 288, 288, 1) - put(data, 290, 290, 1) - put(data, 292, 292, 1) - put(data, 294, 294, 1) - put(data, 296, 296, 1) - put(data, 298, 298, 1) - put(data, 300, 300, 1) - put(data, 302, 302, 1) - put(data, 306, 306, 1) - put(data, 308, 308, 1) - put(data, 310, 310, 1) - put(data, 313, 313, 1) - put(data, 315, 315, 1) - put(data, 317, 317, 1) - put(data, 319, 319, 1) - put(data, 321, 321, 1) - put(data, 323, 323, 1) - put(data, 325, 325, 1) - put(data, 327, 327, 1) - put(data, 330, 330, 1) - put(data, 332, 332, 1) - put(data, 334, 334, 1) - put(data, 336, 336, 1) - put(data, 338, 338, 1) - put(data, 340, 340, 1) - put(data, 342, 342, 1) - put(data, 344, 344, 1) - put(data, 346, 346, 1) - put(data, 348, 348, 1) - put(data, 350, 350, 1) - put(data, 352, 352, 1) - put(data, 354, 354, 1) - put(data, 356, 356, 1) - put(data, 358, 358, 1) - put(data, 360, 360, 1) - put(data, 362, 362, 1) - put(data, 364, 364, 1) - put(data, 366, 366, 1) - put(data, 368, 368, 1) - put(data, 370, 370, 1) - put(data, 372, 372, 1) - put(data, 374, 374, 1) - put(data, 376, 376, -121) - put(data, 377, 377, 1) - put(data, 379, 379, 1) - put(data, 381, 381, 1) - put(data, 383, 383, -268) - put(data, 385, 385, 210) - put(data, 386, 386, 1) - put(data, 388, 388, 1) - put(data, 390, 390, 206) - put(data, 391, 391, 1) - put(data, 393, 394, 205) - put(data, 395, 395, 1) - put(data, 398, 398, 79) - put(data, 399, 399, 202) - put(data, 400, 400, 203) - put(data, 401, 401, 1) - put(data, 403, 403, 205) - put(data, 404, 404, 207) - put(data, 406, 406, 211) - put(data, 407, 407, 209) - put(data, 408, 408, 1) - put(data, 412, 412, 211) - put(data, 413, 413, 213) - put(data, 415, 415, 214) - put(data, 416, 416, 1) - put(data, 418, 418, 1) - put(data, 420, 420, 1) - put(data, 422, 422, 218) - put(data, 423, 423, 1) - put(data, 425, 425, 218) - put(data, 428, 428, 1) - put(data, 430, 430, 218) - put(data, 431, 431, 1) - put(data, 433, 434, 217) - put(data, 435, 435, 1) - put(data, 437, 437, 1) - put(data, 439, 439, 219) - put(data, 440, 440, 1) - put(data, 444, 444, 1) - put(data, 452, 452, 2) - put(data, 453, 453, 1) - put(data, 455, 455, 2) - put(data, 456, 456, 1) - put(data, 458, 458, 2) - put(data, 459, 459, 1) - put(data, 461, 461, 1) - put(data, 463, 463, 1) - put(data, 465, 465, 1) - put(data, 467, 467, 1) - put(data, 469, 469, 1) - put(data, 471, 471, 1) - put(data, 473, 473, 1) - put(data, 475, 475, 1) - put(data, 478, 478, 1) - put(data, 480, 480, 1) - put(data, 482, 482, 1) - put(data, 484, 484, 1) - put(data, 486, 486, 1) - put(data, 488, 488, 1) - put(data, 490, 490, 1) - put(data, 492, 492, 1) - put(data, 494, 494, 1) - put(data, 497, 497, 2) - put(data, 498, 498, 1) - put(data, 500, 500, 1) - put(data, 502, 502, -97) - put(data, 503, 503, -56) - put(data, 504, 504, 1) - put(data, 506, 506, 1) - put(data, 508, 508, 1) - put(data, 510, 510, 1) - put(data, 512, 512, 1) - put(data, 514, 514, 1) - put(data, 516, 516, 1) - put(data, 518, 518, 1) - put(data, 520, 520, 1) - put(data, 522, 522, 1) - put(data, 524, 524, 1) - put(data, 526, 526, 1) - put(data, 528, 528, 1) - put(data, 530, 530, 1) - put(data, 532, 532, 1) - put(data, 534, 534, 1) - put(data, 536, 536, 1) - put(data, 538, 538, 1) - put(data, 540, 540, 1) - put(data, 542, 542, 1) - put(data, 544, 544, -130) - put(data, 546, 546, 1) - put(data, 548, 548, 1) - put(data, 550, 550, 1) - put(data, 552, 552, 1) - put(data, 554, 554, 1) - put(data, 556, 556, 1) - put(data, 558, 558, 1) - put(data, 560, 560, 1) - put(data, 562, 562, 1) - put(data, 570, 570, 10795) - put(data, 571, 571, 1) - put(data, 573, 573, -163) - put(data, 574, 574, 10792) - put(data, 577, 577, 1) - put(data, 579, 579, -195) - put(data, 580, 580, 69) - put(data, 581, 581, 71) - put(data, 582, 582, 1) - put(data, 584, 584, 1) - put(data, 586, 586, 1) - put(data, 588, 588, 1) - put(data, 590, 590, 1) - put(data, 837, 837, 116) - put(data, 880, 880, 1) - put(data, 882, 882, 1) - put(data, 886, 886, 1) - put(data, 895, 895, 116) - put(data, 902, 902, 38) - put(data, 904, 906, 37) - put(data, 908, 908, 64) - put(data, 910, 911, 63) - put(data, 913, 929, 32) - put(data, 931, 939, 32) - put(data, 962, 962, 1) - put(data, 975, 975, 8) - put(data, 976, 976, -30) - put(data, 977, 977, -25) - put(data, 981, 981, -15) - put(data, 982, 982, -22) - put(data, 984, 984, 1) - put(data, 986, 986, 1) - put(data, 988, 988, 1) - put(data, 990, 990, 1) - put(data, 992, 992, 1) - put(data, 994, 994, 1) - put(data, 996, 996, 1) - put(data, 998, 998, 1) - put(data, 1000, 1000, 1) - put(data, 1002, 1002, 1) - put(data, 1004, 1004, 1) - put(data, 1006, 1006, 1) - put(data, 1008, 1008, -54) - put(data, 1009, 1009, -48) - put(data, 1012, 1012, -60) - put(data, 1013, 1013, -64) - put(data, 1015, 1015, 1) - put(data, 1017, 1017, -7) - put(data, 1018, 1018, 1) - put(data, 1021, 1023, -130) - put(data, 1024, 1039, 80) - put(data, 1040, 1071, 32) - put(data, 1120, 1120, 1) - put(data, 1122, 1122, 1) - put(data, 1124, 1124, 1) - put(data, 1126, 1126, 1) - put(data, 1128, 1128, 1) - put(data, 1130, 1130, 1) - put(data, 1132, 1132, 1) - put(data, 1134, 1134, 1) - put(data, 1136, 1136, 1) - put(data, 1138, 1138, 1) - put(data, 1140, 1140, 1) - put(data, 1142, 1142, 1) - put(data, 1144, 1144, 1) - put(data, 1146, 1146, 1) - put(data, 1148, 1148, 1) - put(data, 1150, 1150, 1) - put(data, 1152, 1152, 1) - put(data, 1162, 1162, 1) - put(data, 1164, 1164, 1) - put(data, 1166, 1166, 1) - put(data, 1168, 1168, 1) - put(data, 1170, 1170, 1) - put(data, 1172, 1172, 1) - put(data, 1174, 1174, 1) - put(data, 1176, 1176, 1) - put(data, 1178, 1178, 1) - put(data, 1180, 1180, 1) - put(data, 1182, 1182, 1) - put(data, 1184, 1184, 1) - put(data, 1186, 1186, 1) - put(data, 1188, 1188, 1) - put(data, 1190, 1190, 1) - put(data, 1192, 1192, 1) - put(data, 1194, 1194, 1) - put(data, 1196, 1196, 1) - put(data, 1198, 1198, 1) - put(data, 1200, 1200, 1) - put(data, 1202, 1202, 1) - put(data, 1204, 1204, 1) - put(data, 1206, 1206, 1) - put(data, 1208, 1208, 1) - put(data, 1210, 1210, 1) - put(data, 1212, 1212, 1) - put(data, 1214, 1214, 1) - put(data, 1216, 1216, 15) - put(data, 1217, 1217, 1) - put(data, 1219, 1219, 1) - put(data, 1221, 1221, 1) - put(data, 1223, 1223, 1) - put(data, 1225, 1225, 1) - put(data, 1227, 1227, 1) - put(data, 1229, 1229, 1) - put(data, 1232, 1232, 1) - put(data, 1234, 1234, 1) - put(data, 1236, 1236, 1) - put(data, 1238, 1238, 1) - put(data, 1240, 1240, 1) - put(data, 1242, 1242, 1) - put(data, 1244, 1244, 1) - put(data, 1246, 1246, 1) - put(data, 1248, 1248, 1) - put(data, 1250, 1250, 1) - put(data, 1252, 1252, 1) - put(data, 1254, 1254, 1) - put(data, 1256, 1256, 1) - put(data, 1258, 1258, 1) - put(data, 1260, 1260, 1) - put(data, 1262, 1262, 1) - put(data, 1264, 1264, 1) - put(data, 1266, 1266, 1) - put(data, 1268, 1268, 1) - put(data, 1270, 1270, 1) - put(data, 1272, 1272, 1) - put(data, 1274, 1274, 1) - put(data, 1276, 1276, 1) - put(data, 1278, 1278, 1) - put(data, 1280, 1280, 1) - put(data, 1282, 1282, 1) - put(data, 1284, 1284, 1) - put(data, 1286, 1286, 1) - put(data, 1288, 1288, 1) - put(data, 1290, 1290, 1) - put(data, 1292, 1292, 1) - put(data, 1294, 1294, 1) - put(data, 1296, 1296, 1) - put(data, 1298, 1298, 1) - put(data, 1300, 1300, 1) - put(data, 1302, 1302, 1) - put(data, 1304, 1304, 1) - put(data, 1306, 1306, 1) - put(data, 1308, 1308, 1) - put(data, 1310, 1310, 1) - put(data, 1312, 1312, 1) - put(data, 1314, 1314, 1) - put(data, 1316, 1316, 1) - put(data, 1318, 1318, 1) - put(data, 1320, 1320, 1) - put(data, 1322, 1322, 1) - put(data, 1324, 1324, 1) - put(data, 1326, 1326, 1) - put(data, 1329, 1366, 48) - put(data, 4256, 4293, 7264) - put(data, 4295, 4295, 7264) - put(data, 4301, 4301, 7264) - put(data, 5112, 5117, -8) - put(data, 7296, 7296, -6222) - put(data, 7297, 7297, -6221) - put(data, 7298, 7298, -6212) - put(data, 7299, 7300, -6210) - put(data, 7301, 7301, -6211) - put(data, 7302, 7302, -6204) - put(data, 7303, 7303, -6180) - put(data, 7304, 7304, 35267) - put(data, 7312, 7354, -3008) - put(data, 7357, 7359, -3008) - put(data, 7680, 7680, 1) - put(data, 7682, 7682, 1) - put(data, 7684, 7684, 1) - put(data, 7686, 7686, 1) - put(data, 7688, 7688, 1) - put(data, 7690, 7690, 1) - put(data, 7692, 7692, 1) - put(data, 7694, 7694, 1) - put(data, 7696, 7696, 1) - put(data, 7698, 7698, 1) - put(data, 7700, 7700, 1) - put(data, 7702, 7702, 1) - put(data, 7704, 7704, 1) - put(data, 7706, 7706, 1) - put(data, 7708, 7708, 1) - put(data, 7710, 7710, 1) - put(data, 7712, 7712, 1) - put(data, 7714, 7714, 1) - put(data, 7716, 7716, 1) - put(data, 7718, 7718, 1) - put(data, 7720, 7720, 1) - put(data, 7722, 7722, 1) - put(data, 7724, 7724, 1) - put(data, 7726, 7726, 1) - put(data, 7728, 7728, 1) - put(data, 7730, 7730, 1) - put(data, 7732, 7732, 1) - put(data, 7734, 7734, 1) - put(data, 7736, 7736, 1) - put(data, 7738, 7738, 1) - put(data, 7740, 7740, 1) - put(data, 7742, 7742, 1) - put(data, 7744, 7744, 1) - put(data, 7746, 7746, 1) - put(data, 7748, 7748, 1) - put(data, 7750, 7750, 1) - put(data, 7752, 7752, 1) - put(data, 7754, 7754, 1) - put(data, 7756, 7756, 1) - put(data, 7758, 7758, 1) - put(data, 7760, 7760, 1) - put(data, 7762, 7762, 1) - put(data, 7764, 7764, 1) - put(data, 7766, 7766, 1) - put(data, 7768, 7768, 1) - put(data, 7770, 7770, 1) - put(data, 7772, 7772, 1) - put(data, 7774, 7774, 1) - put(data, 7776, 7776, 1) - put(data, 7778, 7778, 1) - put(data, 7780, 7780, 1) - put(data, 7782, 7782, 1) - put(data, 7784, 7784, 1) - put(data, 7786, 7786, 1) - put(data, 7788, 7788, 1) - put(data, 7790, 7790, 1) - put(data, 7792, 7792, 1) - put(data, 7794, 7794, 1) - put(data, 7796, 7796, 1) - put(data, 7798, 7798, 1) - put(data, 7800, 7800, 1) - put(data, 7802, 7802, 1) - put(data, 7804, 7804, 1) - put(data, 7806, 7806, 1) - put(data, 7808, 7808, 1) - put(data, 7810, 7810, 1) - put(data, 7812, 7812, 1) - put(data, 7814, 7814, 1) - put(data, 7816, 7816, 1) - put(data, 7818, 7818, 1) - put(data, 7820, 7820, 1) - put(data, 7822, 7822, 1) - put(data, 7824, 7824, 1) - put(data, 7826, 7826, 1) - put(data, 7828, 7828, 1) - put(data, 7835, 7835, -58) - put(data, 7840, 7840, 1) - put(data, 7842, 7842, 1) - put(data, 7844, 7844, 1) - put(data, 7846, 7846, 1) - put(data, 7848, 7848, 1) - put(data, 7850, 7850, 1) - put(data, 7852, 7852, 1) - put(data, 7854, 7854, 1) - put(data, 7856, 7856, 1) - put(data, 7858, 7858, 1) - put(data, 7860, 7860, 1) - put(data, 7862, 7862, 1) - put(data, 7864, 7864, 1) - put(data, 7866, 7866, 1) - put(data, 7868, 7868, 1) - put(data, 7870, 7870, 1) - put(data, 7872, 7872, 1) - put(data, 7874, 7874, 1) - put(data, 7876, 7876, 1) - put(data, 7878, 7878, 1) - put(data, 7880, 7880, 1) - put(data, 7882, 7882, 1) - put(data, 7884, 7884, 1) - put(data, 7886, 7886, 1) - put(data, 7888, 7888, 1) - put(data, 7890, 7890, 1) - put(data, 7892, 7892, 1) - put(data, 7894, 7894, 1) - put(data, 7896, 7896, 1) - put(data, 7898, 7898, 1) - put(data, 7900, 7900, 1) - put(data, 7902, 7902, 1) - put(data, 7904, 7904, 1) - put(data, 7906, 7906, 1) - put(data, 7908, 7908, 1) - put(data, 7910, 7910, 1) - put(data, 7912, 7912, 1) - put(data, 7914, 7914, 1) - put(data, 7916, 7916, 1) - put(data, 7918, 7918, 1) - put(data, 7920, 7920, 1) - put(data, 7922, 7922, 1) - put(data, 7924, 7924, 1) - put(data, 7926, 7926, 1) - put(data, 7928, 7928, 1) - put(data, 7930, 7930, 1) - put(data, 7932, 7932, 1) - put(data, 7934, 7934, 1) - put(data, 7944, 7951, -8) - put(data, 7960, 7965, -8) - put(data, 7976, 7983, -8) - put(data, 7992, 7999, -8) - put(data, 8008, 8013, -8) - put(data, 8025, 8025, -8) - put(data, 8027, 8027, -8) - put(data, 8029, 8029, -8) - put(data, 8031, 8031, -8) - put(data, 8040, 8047, -8) - put(data, 8120, 8121, -8) - put(data, 8122, 8123, -74) - put(data, 8126, 8126, -7173) - put(data, 8136, 8139, -86) - put(data, 8152, 8153, -8) - put(data, 8154, 8155, -100) - put(data, 8168, 8169, -8) - put(data, 8170, 8171, -112) - put(data, 8172, 8172, -7) - put(data, 8184, 8185, -128) - put(data, 8186, 8187, -126) - put(data, 8486, 8486, -7517) - put(data, 8490, 8490, -8383) - put(data, 8491, 8491, -8262) - put(data, 8498, 8498, 28) - put(data, 8544, 8559, 16) - put(data, 8579, 8579, 1) - put(data, 9398, 9423, 26) - put(data, 11264, 11311, 48) - put(data, 11360, 11360, 1) - put(data, 11362, 11362, -10743) - put(data, 11363, 11363, -3814) - put(data, 11364, 11364, -10727) - put(data, 11367, 11367, 1) - put(data, 11369, 11369, 1) - put(data, 11371, 11371, 1) - put(data, 11373, 11373, -10780) - put(data, 11374, 11374, -10749) - put(data, 11375, 11375, -10783) - put(data, 11376, 11376, -10782) - put(data, 11378, 11378, 1) - put(data, 11381, 11381, 1) - put(data, 11390, 11391, -10815) - put(data, 11392, 11392, 1) - put(data, 11394, 11394, 1) - put(data, 11396, 11396, 1) - put(data, 11398, 11398, 1) - put(data, 11400, 11400, 1) - put(data, 11402, 11402, 1) - put(data, 11404, 11404, 1) - put(data, 11406, 11406, 1) - put(data, 11408, 11408, 1) - put(data, 11410, 11410, 1) - put(data, 11412, 11412, 1) - put(data, 11414, 11414, 1) - put(data, 11416, 11416, 1) - put(data, 11418, 11418, 1) - put(data, 11420, 11420, 1) - put(data, 11422, 11422, 1) - put(data, 11424, 11424, 1) - put(data, 11426, 11426, 1) - put(data, 11428, 11428, 1) - put(data, 11430, 11430, 1) - put(data, 11432, 11432, 1) - put(data, 11434, 11434, 1) - put(data, 11436, 11436, 1) - put(data, 11438, 11438, 1) - put(data, 11440, 11440, 1) - put(data, 11442, 11442, 1) - put(data, 11444, 11444, 1) - put(data, 11446, 11446, 1) - put(data, 11448, 11448, 1) - put(data, 11450, 11450, 1) - put(data, 11452, 11452, 1) - put(data, 11454, 11454, 1) - put(data, 11456, 11456, 1) - put(data, 11458, 11458, 1) - put(data, 11460, 11460, 1) - put(data, 11462, 11462, 1) - put(data, 11464, 11464, 1) - put(data, 11466, 11466, 1) - put(data, 11468, 11468, 1) - put(data, 11470, 11470, 1) - put(data, 11472, 11472, 1) - put(data, 11474, 11474, 1) - put(data, 11476, 11476, 1) - put(data, 11478, 11478, 1) - put(data, 11480, 11480, 1) - put(data, 11482, 11482, 1) - put(data, 11484, 11484, 1) - put(data, 11486, 11486, 1) - put(data, 11488, 11488, 1) - put(data, 11490, 11490, 1) - put(data, 11499, 11499, 1) - put(data, 11501, 11501, 1) - put(data, 11506, 11506, 1) - put(data, 42560, 42560, 1) - put(data, 42562, 42562, 1) - put(data, 42564, 42564, 1) - put(data, 42566, 42566, 1) - put(data, 42568, 42568, 1) - put(data, 42570, 42570, 1) - put(data, 42572, 42572, 1) - put(data, 42574, 42574, 1) - put(data, 42576, 42576, 1) - put(data, 42578, 42578, 1) - put(data, 42580, 42580, 1) - put(data, 42582, 42582, 1) - put(data, 42584, 42584, 1) - put(data, 42586, 42586, 1) - put(data, 42588, 42588, 1) - put(data, 42590, 42590, 1) - put(data, 42592, 42592, 1) - put(data, 42594, 42594, 1) - put(data, 42596, 42596, 1) - put(data, 42598, 42598, 1) - put(data, 42600, 42600, 1) - put(data, 42602, 42602, 1) - put(data, 42604, 42604, 1) - put(data, 42624, 42624, 1) - put(data, 42626, 42626, 1) - put(data, 42628, 42628, 1) - put(data, 42630, 42630, 1) - put(data, 42632, 42632, 1) - put(data, 42634, 42634, 1) - put(data, 42636, 42636, 1) - put(data, 42638, 42638, 1) - put(data, 42640, 42640, 1) - put(data, 42642, 42642, 1) - put(data, 42644, 42644, 1) - put(data, 42646, 42646, 1) - put(data, 42648, 42648, 1) - put(data, 42650, 42650, 1) - put(data, 42786, 42786, 1) - put(data, 42788, 42788, 1) - put(data, 42790, 42790, 1) - put(data, 42792, 42792, 1) - put(data, 42794, 42794, 1) - put(data, 42796, 42796, 1) - put(data, 42798, 42798, 1) - put(data, 42802, 42802, 1) - put(data, 42804, 42804, 1) - put(data, 42806, 42806, 1) - put(data, 42808, 42808, 1) - put(data, 42810, 42810, 1) - put(data, 42812, 42812, 1) - put(data, 42814, 42814, 1) - put(data, 42816, 42816, 1) - put(data, 42818, 42818, 1) - put(data, 42820, 42820, 1) - put(data, 42822, 42822, 1) - put(data, 42824, 42824, 1) - put(data, 42826, 42826, 1) - put(data, 42828, 42828, 1) - put(data, 42830, 42830, 1) - put(data, 42832, 42832, 1) - put(data, 42834, 42834, 1) - put(data, 42836, 42836, 1) - put(data, 42838, 42838, 1) - put(data, 42840, 42840, 1) - put(data, 42842, 42842, 1) - put(data, 42844, 42844, 1) - put(data, 42846, 42846, 1) - put(data, 42848, 42848, 1) - put(data, 42850, 42850, 1) - put(data, 42852, 42852, 1) - put(data, 42854, 42854, 1) - put(data, 42856, 42856, 1) - put(data, 42858, 42858, 1) - put(data, 42860, 42860, 1) - put(data, 42862, 42862, 1) - put(data, 42873, 42873, 1) - put(data, 42875, 42875, 1) - put(data, 42877, 42877, -35332) - put(data, 42878, 42878, 1) - put(data, 42880, 42880, 1) - put(data, 42882, 42882, 1) - put(data, 42884, 42884, 1) - put(data, 42886, 42886, 1) - put(data, 42891, 42891, 1) - put(data, 42893, 42893, -42280) - put(data, 42896, 42896, 1) - put(data, 42898, 42898, 1) - put(data, 42902, 42902, 1) - put(data, 42904, 42904, 1) - put(data, 42906, 42906, 1) - put(data, 42908, 42908, 1) - put(data, 42910, 42910, 1) - put(data, 42912, 42912, 1) - put(data, 42914, 42914, 1) - put(data, 42916, 42916, 1) - put(data, 42918, 42918, 1) - put(data, 42920, 42920, 1) - put(data, 42922, 42922, -42308) - put(data, 42923, 42923, -42319) - put(data, 42924, 42924, -42315) - put(data, 42925, 42925, -42305) - put(data, 42926, 42926, -42308) - put(data, 42928, 42928, -42258) - put(data, 42929, 42929, -42282) - put(data, 42930, 42930, -42261) - put(data, 42931, 42931, 928) - put(data, 42932, 42932, 1) - put(data, 42934, 42934, 1) - put(data, 42936, 42936, 1) - put(data, 42938, 42938, 1) - put(data, 42940, 42940, 1) - put(data, 42942, 42942, 1) - put(data, 42944, 42944, 1) - put(data, 42946, 42946, 1) - put(data, 42948, 42948, -48) - put(data, 42949, 42949, -42307) - put(data, 42950, 42950, -35384) - put(data, 42951, 42951, 1) - put(data, 42953, 42953, 1) - put(data, 42960, 42960, 1) - put(data, 42966, 42966, 1) - put(data, 42968, 42968, 1) - put(data, 42997, 42997, 1) - put(data, 43888, 43967, -38864) - put(data, 65313, 65338, 32) - put(data, 66560, 66599, 40) - put(data, 66736, 66771, 40) - put(data, 66928, 66938, 39) - put(data, 66940, 66954, 39) - put(data, 66956, 66962, 39) - put(data, 66964, 66965, 39) - put(data, 68736, 68786, 64) - put(data, 71840, 71871, 32) - put(data, 93760, 93791, 32) - put(data, 125184, 125217, 34) - data - end + private class_getter casefold_ranges : Array({Int32, Int32, Int32}) do + data = Array({Int32, Int32, Int32}).new(681) + put(data, 65, 90, 32) + put(data, 181, 181, 775) + put(data, 192, 214, 32) + put(data, 216, 222, 32) + put(data, 256, 256, 1) + put(data, 258, 258, 1) + put(data, 260, 260, 1) + put(data, 262, 262, 1) + put(data, 264, 264, 1) + put(data, 266, 266, 1) + put(data, 268, 268, 1) + put(data, 270, 270, 1) + put(data, 272, 272, 1) + put(data, 274, 274, 1) + put(data, 276, 276, 1) + put(data, 278, 278, 1) + put(data, 280, 280, 1) + put(data, 282, 282, 1) + put(data, 284, 284, 1) + put(data, 286, 286, 1) + put(data, 288, 288, 1) + put(data, 290, 290, 1) + put(data, 292, 292, 1) + put(data, 294, 294, 1) + put(data, 296, 296, 1) + put(data, 298, 298, 1) + put(data, 300, 300, 1) + put(data, 302, 302, 1) + put(data, 306, 306, 1) + put(data, 308, 308, 1) + put(data, 310, 310, 1) + put(data, 313, 313, 1) + put(data, 315, 315, 1) + put(data, 317, 317, 1) + put(data, 319, 319, 1) + put(data, 321, 321, 1) + put(data, 323, 323, 1) + put(data, 325, 325, 1) + put(data, 327, 327, 1) + put(data, 330, 330, 1) + put(data, 332, 332, 1) + put(data, 334, 334, 1) + put(data, 336, 336, 1) + put(data, 338, 338, 1) + put(data, 340, 340, 1) + put(data, 342, 342, 1) + put(data, 344, 344, 1) + put(data, 346, 346, 1) + put(data, 348, 348, 1) + put(data, 350, 350, 1) + put(data, 352, 352, 1) + put(data, 354, 354, 1) + put(data, 356, 356, 1) + put(data, 358, 358, 1) + put(data, 360, 360, 1) + put(data, 362, 362, 1) + put(data, 364, 364, 1) + put(data, 366, 366, 1) + put(data, 368, 368, 1) + put(data, 370, 370, 1) + put(data, 372, 372, 1) + put(data, 374, 374, 1) + put(data, 376, 376, -121) + put(data, 377, 377, 1) + put(data, 379, 379, 1) + put(data, 381, 381, 1) + put(data, 383, 383, -268) + put(data, 385, 385, 210) + put(data, 386, 386, 1) + put(data, 388, 388, 1) + put(data, 390, 390, 206) + put(data, 391, 391, 1) + put(data, 393, 394, 205) + put(data, 395, 395, 1) + put(data, 398, 398, 79) + put(data, 399, 399, 202) + put(data, 400, 400, 203) + put(data, 401, 401, 1) + put(data, 403, 403, 205) + put(data, 404, 404, 207) + put(data, 406, 406, 211) + put(data, 407, 407, 209) + put(data, 408, 408, 1) + put(data, 412, 412, 211) + put(data, 413, 413, 213) + put(data, 415, 415, 214) + put(data, 416, 416, 1) + put(data, 418, 418, 1) + put(data, 420, 420, 1) + put(data, 422, 422, 218) + put(data, 423, 423, 1) + put(data, 425, 425, 218) + put(data, 428, 428, 1) + put(data, 430, 430, 218) + put(data, 431, 431, 1) + put(data, 433, 434, 217) + put(data, 435, 435, 1) + put(data, 437, 437, 1) + put(data, 439, 439, 219) + put(data, 440, 440, 1) + put(data, 444, 444, 1) + put(data, 452, 452, 2) + put(data, 453, 453, 1) + put(data, 455, 455, 2) + put(data, 456, 456, 1) + put(data, 458, 458, 2) + put(data, 459, 459, 1) + put(data, 461, 461, 1) + put(data, 463, 463, 1) + put(data, 465, 465, 1) + put(data, 467, 467, 1) + put(data, 469, 469, 1) + put(data, 471, 471, 1) + put(data, 473, 473, 1) + put(data, 475, 475, 1) + put(data, 478, 478, 1) + put(data, 480, 480, 1) + put(data, 482, 482, 1) + put(data, 484, 484, 1) + put(data, 486, 486, 1) + put(data, 488, 488, 1) + put(data, 490, 490, 1) + put(data, 492, 492, 1) + put(data, 494, 494, 1) + put(data, 497, 497, 2) + put(data, 498, 498, 1) + put(data, 500, 500, 1) + put(data, 502, 502, -97) + put(data, 503, 503, -56) + put(data, 504, 504, 1) + put(data, 506, 506, 1) + put(data, 508, 508, 1) + put(data, 510, 510, 1) + put(data, 512, 512, 1) + put(data, 514, 514, 1) + put(data, 516, 516, 1) + put(data, 518, 518, 1) + put(data, 520, 520, 1) + put(data, 522, 522, 1) + put(data, 524, 524, 1) + put(data, 526, 526, 1) + put(data, 528, 528, 1) + put(data, 530, 530, 1) + put(data, 532, 532, 1) + put(data, 534, 534, 1) + put(data, 536, 536, 1) + put(data, 538, 538, 1) + put(data, 540, 540, 1) + put(data, 542, 542, 1) + put(data, 544, 544, -130) + put(data, 546, 546, 1) + put(data, 548, 548, 1) + put(data, 550, 550, 1) + put(data, 552, 552, 1) + put(data, 554, 554, 1) + put(data, 556, 556, 1) + put(data, 558, 558, 1) + put(data, 560, 560, 1) + put(data, 562, 562, 1) + put(data, 570, 570, 10795) + put(data, 571, 571, 1) + put(data, 573, 573, -163) + put(data, 574, 574, 10792) + put(data, 577, 577, 1) + put(data, 579, 579, -195) + put(data, 580, 580, 69) + put(data, 581, 581, 71) + put(data, 582, 582, 1) + put(data, 584, 584, 1) + put(data, 586, 586, 1) + put(data, 588, 588, 1) + put(data, 590, 590, 1) + put(data, 837, 837, 116) + put(data, 880, 880, 1) + put(data, 882, 882, 1) + put(data, 886, 886, 1) + put(data, 895, 895, 116) + put(data, 902, 902, 38) + put(data, 904, 906, 37) + put(data, 908, 908, 64) + put(data, 910, 911, 63) + put(data, 913, 929, 32) + put(data, 931, 939, 32) + put(data, 962, 962, 1) + put(data, 975, 975, 8) + put(data, 976, 976, -30) + put(data, 977, 977, -25) + put(data, 981, 981, -15) + put(data, 982, 982, -22) + put(data, 984, 984, 1) + put(data, 986, 986, 1) + put(data, 988, 988, 1) + put(data, 990, 990, 1) + put(data, 992, 992, 1) + put(data, 994, 994, 1) + put(data, 996, 996, 1) + put(data, 998, 998, 1) + put(data, 1000, 1000, 1) + put(data, 1002, 1002, 1) + put(data, 1004, 1004, 1) + put(data, 1006, 1006, 1) + put(data, 1008, 1008, -54) + put(data, 1009, 1009, -48) + put(data, 1012, 1012, -60) + put(data, 1013, 1013, -64) + put(data, 1015, 1015, 1) + put(data, 1017, 1017, -7) + put(data, 1018, 1018, 1) + put(data, 1021, 1023, -130) + put(data, 1024, 1039, 80) + put(data, 1040, 1071, 32) + put(data, 1120, 1120, 1) + put(data, 1122, 1122, 1) + put(data, 1124, 1124, 1) + put(data, 1126, 1126, 1) + put(data, 1128, 1128, 1) + put(data, 1130, 1130, 1) + put(data, 1132, 1132, 1) + put(data, 1134, 1134, 1) + put(data, 1136, 1136, 1) + put(data, 1138, 1138, 1) + put(data, 1140, 1140, 1) + put(data, 1142, 1142, 1) + put(data, 1144, 1144, 1) + put(data, 1146, 1146, 1) + put(data, 1148, 1148, 1) + put(data, 1150, 1150, 1) + put(data, 1152, 1152, 1) + put(data, 1162, 1162, 1) + put(data, 1164, 1164, 1) + put(data, 1166, 1166, 1) + put(data, 1168, 1168, 1) + put(data, 1170, 1170, 1) + put(data, 1172, 1172, 1) + put(data, 1174, 1174, 1) + put(data, 1176, 1176, 1) + put(data, 1178, 1178, 1) + put(data, 1180, 1180, 1) + put(data, 1182, 1182, 1) + put(data, 1184, 1184, 1) + put(data, 1186, 1186, 1) + put(data, 1188, 1188, 1) + put(data, 1190, 1190, 1) + put(data, 1192, 1192, 1) + put(data, 1194, 1194, 1) + put(data, 1196, 1196, 1) + put(data, 1198, 1198, 1) + put(data, 1200, 1200, 1) + put(data, 1202, 1202, 1) + put(data, 1204, 1204, 1) + put(data, 1206, 1206, 1) + put(data, 1208, 1208, 1) + put(data, 1210, 1210, 1) + put(data, 1212, 1212, 1) + put(data, 1214, 1214, 1) + put(data, 1216, 1216, 15) + put(data, 1217, 1217, 1) + put(data, 1219, 1219, 1) + put(data, 1221, 1221, 1) + put(data, 1223, 1223, 1) + put(data, 1225, 1225, 1) + put(data, 1227, 1227, 1) + put(data, 1229, 1229, 1) + put(data, 1232, 1232, 1) + put(data, 1234, 1234, 1) + put(data, 1236, 1236, 1) + put(data, 1238, 1238, 1) + put(data, 1240, 1240, 1) + put(data, 1242, 1242, 1) + put(data, 1244, 1244, 1) + put(data, 1246, 1246, 1) + put(data, 1248, 1248, 1) + put(data, 1250, 1250, 1) + put(data, 1252, 1252, 1) + put(data, 1254, 1254, 1) + put(data, 1256, 1256, 1) + put(data, 1258, 1258, 1) + put(data, 1260, 1260, 1) + put(data, 1262, 1262, 1) + put(data, 1264, 1264, 1) + put(data, 1266, 1266, 1) + put(data, 1268, 1268, 1) + put(data, 1270, 1270, 1) + put(data, 1272, 1272, 1) + put(data, 1274, 1274, 1) + put(data, 1276, 1276, 1) + put(data, 1278, 1278, 1) + put(data, 1280, 1280, 1) + put(data, 1282, 1282, 1) + put(data, 1284, 1284, 1) + put(data, 1286, 1286, 1) + put(data, 1288, 1288, 1) + put(data, 1290, 1290, 1) + put(data, 1292, 1292, 1) + put(data, 1294, 1294, 1) + put(data, 1296, 1296, 1) + put(data, 1298, 1298, 1) + put(data, 1300, 1300, 1) + put(data, 1302, 1302, 1) + put(data, 1304, 1304, 1) + put(data, 1306, 1306, 1) + put(data, 1308, 1308, 1) + put(data, 1310, 1310, 1) + put(data, 1312, 1312, 1) + put(data, 1314, 1314, 1) + put(data, 1316, 1316, 1) + put(data, 1318, 1318, 1) + put(data, 1320, 1320, 1) + put(data, 1322, 1322, 1) + put(data, 1324, 1324, 1) + put(data, 1326, 1326, 1) + put(data, 1329, 1366, 48) + put(data, 4256, 4293, 7264) + put(data, 4295, 4295, 7264) + put(data, 4301, 4301, 7264) + put(data, 5112, 5117, -8) + put(data, 7296, 7296, -6222) + put(data, 7297, 7297, -6221) + put(data, 7298, 7298, -6212) + put(data, 7299, 7300, -6210) + put(data, 7301, 7301, -6211) + put(data, 7302, 7302, -6204) + put(data, 7303, 7303, -6180) + put(data, 7304, 7304, 35267) + put(data, 7312, 7354, -3008) + put(data, 7357, 7359, -3008) + put(data, 7680, 7680, 1) + put(data, 7682, 7682, 1) + put(data, 7684, 7684, 1) + put(data, 7686, 7686, 1) + put(data, 7688, 7688, 1) + put(data, 7690, 7690, 1) + put(data, 7692, 7692, 1) + put(data, 7694, 7694, 1) + put(data, 7696, 7696, 1) + put(data, 7698, 7698, 1) + put(data, 7700, 7700, 1) + put(data, 7702, 7702, 1) + put(data, 7704, 7704, 1) + put(data, 7706, 7706, 1) + put(data, 7708, 7708, 1) + put(data, 7710, 7710, 1) + put(data, 7712, 7712, 1) + put(data, 7714, 7714, 1) + put(data, 7716, 7716, 1) + put(data, 7718, 7718, 1) + put(data, 7720, 7720, 1) + put(data, 7722, 7722, 1) + put(data, 7724, 7724, 1) + put(data, 7726, 7726, 1) + put(data, 7728, 7728, 1) + put(data, 7730, 7730, 1) + put(data, 7732, 7732, 1) + put(data, 7734, 7734, 1) + put(data, 7736, 7736, 1) + put(data, 7738, 7738, 1) + put(data, 7740, 7740, 1) + put(data, 7742, 7742, 1) + put(data, 7744, 7744, 1) + put(data, 7746, 7746, 1) + put(data, 7748, 7748, 1) + put(data, 7750, 7750, 1) + put(data, 7752, 7752, 1) + put(data, 7754, 7754, 1) + put(data, 7756, 7756, 1) + put(data, 7758, 7758, 1) + put(data, 7760, 7760, 1) + put(data, 7762, 7762, 1) + put(data, 7764, 7764, 1) + put(data, 7766, 7766, 1) + put(data, 7768, 7768, 1) + put(data, 7770, 7770, 1) + put(data, 7772, 7772, 1) + put(data, 7774, 7774, 1) + put(data, 7776, 7776, 1) + put(data, 7778, 7778, 1) + put(data, 7780, 7780, 1) + put(data, 7782, 7782, 1) + put(data, 7784, 7784, 1) + put(data, 7786, 7786, 1) + put(data, 7788, 7788, 1) + put(data, 7790, 7790, 1) + put(data, 7792, 7792, 1) + put(data, 7794, 7794, 1) + put(data, 7796, 7796, 1) + put(data, 7798, 7798, 1) + put(data, 7800, 7800, 1) + put(data, 7802, 7802, 1) + put(data, 7804, 7804, 1) + put(data, 7806, 7806, 1) + put(data, 7808, 7808, 1) + put(data, 7810, 7810, 1) + put(data, 7812, 7812, 1) + put(data, 7814, 7814, 1) + put(data, 7816, 7816, 1) + put(data, 7818, 7818, 1) + put(data, 7820, 7820, 1) + put(data, 7822, 7822, 1) + put(data, 7824, 7824, 1) + put(data, 7826, 7826, 1) + put(data, 7828, 7828, 1) + put(data, 7835, 7835, -58) + put(data, 7840, 7840, 1) + put(data, 7842, 7842, 1) + put(data, 7844, 7844, 1) + put(data, 7846, 7846, 1) + put(data, 7848, 7848, 1) + put(data, 7850, 7850, 1) + put(data, 7852, 7852, 1) + put(data, 7854, 7854, 1) + put(data, 7856, 7856, 1) + put(data, 7858, 7858, 1) + put(data, 7860, 7860, 1) + put(data, 7862, 7862, 1) + put(data, 7864, 7864, 1) + put(data, 7866, 7866, 1) + put(data, 7868, 7868, 1) + put(data, 7870, 7870, 1) + put(data, 7872, 7872, 1) + put(data, 7874, 7874, 1) + put(data, 7876, 7876, 1) + put(data, 7878, 7878, 1) + put(data, 7880, 7880, 1) + put(data, 7882, 7882, 1) + put(data, 7884, 7884, 1) + put(data, 7886, 7886, 1) + put(data, 7888, 7888, 1) + put(data, 7890, 7890, 1) + put(data, 7892, 7892, 1) + put(data, 7894, 7894, 1) + put(data, 7896, 7896, 1) + put(data, 7898, 7898, 1) + put(data, 7900, 7900, 1) + put(data, 7902, 7902, 1) + put(data, 7904, 7904, 1) + put(data, 7906, 7906, 1) + put(data, 7908, 7908, 1) + put(data, 7910, 7910, 1) + put(data, 7912, 7912, 1) + put(data, 7914, 7914, 1) + put(data, 7916, 7916, 1) + put(data, 7918, 7918, 1) + put(data, 7920, 7920, 1) + put(data, 7922, 7922, 1) + put(data, 7924, 7924, 1) + put(data, 7926, 7926, 1) + put(data, 7928, 7928, 1) + put(data, 7930, 7930, 1) + put(data, 7932, 7932, 1) + put(data, 7934, 7934, 1) + put(data, 7944, 7951, -8) + put(data, 7960, 7965, -8) + put(data, 7976, 7983, -8) + put(data, 7992, 7999, -8) + put(data, 8008, 8013, -8) + put(data, 8025, 8025, -8) + put(data, 8027, 8027, -8) + put(data, 8029, 8029, -8) + put(data, 8031, 8031, -8) + put(data, 8040, 8047, -8) + put(data, 8120, 8121, -8) + put(data, 8122, 8123, -74) + put(data, 8126, 8126, -7173) + put(data, 8136, 8139, -86) + put(data, 8152, 8153, -8) + put(data, 8154, 8155, -100) + put(data, 8168, 8169, -8) + put(data, 8170, 8171, -112) + put(data, 8172, 8172, -7) + put(data, 8184, 8185, -128) + put(data, 8186, 8187, -126) + put(data, 8486, 8486, -7517) + put(data, 8490, 8490, -8383) + put(data, 8491, 8491, -8262) + put(data, 8498, 8498, 28) + put(data, 8544, 8559, 16) + put(data, 8579, 8579, 1) + put(data, 9398, 9423, 26) + put(data, 11264, 11311, 48) + put(data, 11360, 11360, 1) + put(data, 11362, 11362, -10743) + put(data, 11363, 11363, -3814) + put(data, 11364, 11364, -10727) + put(data, 11367, 11367, 1) + put(data, 11369, 11369, 1) + put(data, 11371, 11371, 1) + put(data, 11373, 11373, -10780) + put(data, 11374, 11374, -10749) + put(data, 11375, 11375, -10783) + put(data, 11376, 11376, -10782) + put(data, 11378, 11378, 1) + put(data, 11381, 11381, 1) + put(data, 11390, 11391, -10815) + put(data, 11392, 11392, 1) + put(data, 11394, 11394, 1) + put(data, 11396, 11396, 1) + put(data, 11398, 11398, 1) + put(data, 11400, 11400, 1) + put(data, 11402, 11402, 1) + put(data, 11404, 11404, 1) + put(data, 11406, 11406, 1) + put(data, 11408, 11408, 1) + put(data, 11410, 11410, 1) + put(data, 11412, 11412, 1) + put(data, 11414, 11414, 1) + put(data, 11416, 11416, 1) + put(data, 11418, 11418, 1) + put(data, 11420, 11420, 1) + put(data, 11422, 11422, 1) + put(data, 11424, 11424, 1) + put(data, 11426, 11426, 1) + put(data, 11428, 11428, 1) + put(data, 11430, 11430, 1) + put(data, 11432, 11432, 1) + put(data, 11434, 11434, 1) + put(data, 11436, 11436, 1) + put(data, 11438, 11438, 1) + put(data, 11440, 11440, 1) + put(data, 11442, 11442, 1) + put(data, 11444, 11444, 1) + put(data, 11446, 11446, 1) + put(data, 11448, 11448, 1) + put(data, 11450, 11450, 1) + put(data, 11452, 11452, 1) + put(data, 11454, 11454, 1) + put(data, 11456, 11456, 1) + put(data, 11458, 11458, 1) + put(data, 11460, 11460, 1) + put(data, 11462, 11462, 1) + put(data, 11464, 11464, 1) + put(data, 11466, 11466, 1) + put(data, 11468, 11468, 1) + put(data, 11470, 11470, 1) + put(data, 11472, 11472, 1) + put(data, 11474, 11474, 1) + put(data, 11476, 11476, 1) + put(data, 11478, 11478, 1) + put(data, 11480, 11480, 1) + put(data, 11482, 11482, 1) + put(data, 11484, 11484, 1) + put(data, 11486, 11486, 1) + put(data, 11488, 11488, 1) + put(data, 11490, 11490, 1) + put(data, 11499, 11499, 1) + put(data, 11501, 11501, 1) + put(data, 11506, 11506, 1) + put(data, 42560, 42560, 1) + put(data, 42562, 42562, 1) + put(data, 42564, 42564, 1) + put(data, 42566, 42566, 1) + put(data, 42568, 42568, 1) + put(data, 42570, 42570, 1) + put(data, 42572, 42572, 1) + put(data, 42574, 42574, 1) + put(data, 42576, 42576, 1) + put(data, 42578, 42578, 1) + put(data, 42580, 42580, 1) + put(data, 42582, 42582, 1) + put(data, 42584, 42584, 1) + put(data, 42586, 42586, 1) + put(data, 42588, 42588, 1) + put(data, 42590, 42590, 1) + put(data, 42592, 42592, 1) + put(data, 42594, 42594, 1) + put(data, 42596, 42596, 1) + put(data, 42598, 42598, 1) + put(data, 42600, 42600, 1) + put(data, 42602, 42602, 1) + put(data, 42604, 42604, 1) + put(data, 42624, 42624, 1) + put(data, 42626, 42626, 1) + put(data, 42628, 42628, 1) + put(data, 42630, 42630, 1) + put(data, 42632, 42632, 1) + put(data, 42634, 42634, 1) + put(data, 42636, 42636, 1) + put(data, 42638, 42638, 1) + put(data, 42640, 42640, 1) + put(data, 42642, 42642, 1) + put(data, 42644, 42644, 1) + put(data, 42646, 42646, 1) + put(data, 42648, 42648, 1) + put(data, 42650, 42650, 1) + put(data, 42786, 42786, 1) + put(data, 42788, 42788, 1) + put(data, 42790, 42790, 1) + put(data, 42792, 42792, 1) + put(data, 42794, 42794, 1) + put(data, 42796, 42796, 1) + put(data, 42798, 42798, 1) + put(data, 42802, 42802, 1) + put(data, 42804, 42804, 1) + put(data, 42806, 42806, 1) + put(data, 42808, 42808, 1) + put(data, 42810, 42810, 1) + put(data, 42812, 42812, 1) + put(data, 42814, 42814, 1) + put(data, 42816, 42816, 1) + put(data, 42818, 42818, 1) + put(data, 42820, 42820, 1) + put(data, 42822, 42822, 1) + put(data, 42824, 42824, 1) + put(data, 42826, 42826, 1) + put(data, 42828, 42828, 1) + put(data, 42830, 42830, 1) + put(data, 42832, 42832, 1) + put(data, 42834, 42834, 1) + put(data, 42836, 42836, 1) + put(data, 42838, 42838, 1) + put(data, 42840, 42840, 1) + put(data, 42842, 42842, 1) + put(data, 42844, 42844, 1) + put(data, 42846, 42846, 1) + put(data, 42848, 42848, 1) + put(data, 42850, 42850, 1) + put(data, 42852, 42852, 1) + put(data, 42854, 42854, 1) + put(data, 42856, 42856, 1) + put(data, 42858, 42858, 1) + put(data, 42860, 42860, 1) + put(data, 42862, 42862, 1) + put(data, 42873, 42873, 1) + put(data, 42875, 42875, 1) + put(data, 42877, 42877, -35332) + put(data, 42878, 42878, 1) + put(data, 42880, 42880, 1) + put(data, 42882, 42882, 1) + put(data, 42884, 42884, 1) + put(data, 42886, 42886, 1) + put(data, 42891, 42891, 1) + put(data, 42893, 42893, -42280) + put(data, 42896, 42896, 1) + put(data, 42898, 42898, 1) + put(data, 42902, 42902, 1) + put(data, 42904, 42904, 1) + put(data, 42906, 42906, 1) + put(data, 42908, 42908, 1) + put(data, 42910, 42910, 1) + put(data, 42912, 42912, 1) + put(data, 42914, 42914, 1) + put(data, 42916, 42916, 1) + put(data, 42918, 42918, 1) + put(data, 42920, 42920, 1) + put(data, 42922, 42922, -42308) + put(data, 42923, 42923, -42319) + put(data, 42924, 42924, -42315) + put(data, 42925, 42925, -42305) + put(data, 42926, 42926, -42308) + put(data, 42928, 42928, -42258) + put(data, 42929, 42929, -42282) + put(data, 42930, 42930, -42261) + put(data, 42931, 42931, 928) + put(data, 42932, 42932, 1) + put(data, 42934, 42934, 1) + put(data, 42936, 42936, 1) + put(data, 42938, 42938, 1) + put(data, 42940, 42940, 1) + put(data, 42942, 42942, 1) + put(data, 42944, 42944, 1) + put(data, 42946, 42946, 1) + put(data, 42948, 42948, -48) + put(data, 42949, 42949, -42307) + put(data, 42950, 42950, -35384) + put(data, 42951, 42951, 1) + put(data, 42953, 42953, 1) + put(data, 42960, 42960, 1) + put(data, 42966, 42966, 1) + put(data, 42968, 42968, 1) + put(data, 42997, 42997, 1) + put(data, 43888, 43967, -38864) + put(data, 65313, 65338, 32) + put(data, 66560, 66599, 40) + put(data, 66736, 66771, 40) + put(data, 66928, 66938, 39) + put(data, 66940, 66954, 39) + put(data, 66956, 66962, 39) + put(data, 66964, 66965, 39) + put(data, 68736, 68786, 64) + put(data, 71840, 71871, 32) + put(data, 93760, 93791, 32) + put(data, 125184, 125217, 34) + data end # Special downcase transformation that involve mapping a codepoint # to multiple codepoints. The maximum transformation is always 3 # codepoints, so we store them all as 3 codepoints and 0 means end. - @@special_cases_downcase : Hash(Int32, {Int32, Int32, Int32})? - - private def self.special_cases_downcase - @@special_cases_downcase ||= begin - data = Hash(Int32, {Int32, Int32, Int32}).new(initial_capacity: 1) - put(data, 304, 105, 775, 0) + private class_getter special_cases_downcase : Hash(Int32, {Int32, Int32, Int32}) do + data = Hash(Int32, {Int32, Int32, Int32}).new(initial_capacity: 1) + put(data, 304, 105, 775, 0) - data - end + data end # Special upcase transformation that involve mapping a codepoint # to multiple codepoints. The maximum transformation is always 3 # codepoints, so we store them all as 3 codepoints and 0 means end. - @@special_cases_upcase : Hash(Int32, {Int32, Int32, Int32})? + private class_getter special_cases_upcase : Hash(Int32, {Int32, Int32, Int32}) do + data = Hash(Int32, {Int32, Int32, Int32}).new(initial_capacity: 102) + put(data, 223, 83, 83, 0) + put(data, 64256, 70, 70, 0) + put(data, 64257, 70, 73, 0) + put(data, 64258, 70, 76, 0) + put(data, 64259, 70, 70, 73) + put(data, 64260, 70, 70, 76) + put(data, 64261, 83, 84, 0) + put(data, 64262, 83, 84, 0) + put(data, 1415, 1333, 1362, 0) + put(data, 64275, 1348, 1350, 0) + put(data, 64276, 1348, 1333, 0) + put(data, 64277, 1348, 1339, 0) + put(data, 64278, 1358, 1350, 0) + put(data, 64279, 1348, 1341, 0) + put(data, 329, 700, 78, 0) + put(data, 912, 921, 776, 769) + put(data, 944, 933, 776, 769) + put(data, 496, 74, 780, 0) + put(data, 7830, 72, 817, 0) + put(data, 7831, 84, 776, 0) + put(data, 7832, 87, 778, 0) + put(data, 7833, 89, 778, 0) + put(data, 7834, 65, 702, 0) + put(data, 8016, 933, 787, 0) + put(data, 8018, 933, 787, 768) + put(data, 8020, 933, 787, 769) + put(data, 8022, 933, 787, 834) + put(data, 8118, 913, 834, 0) + put(data, 8134, 919, 834, 0) + put(data, 8146, 921, 776, 768) + put(data, 8147, 921, 776, 769) + put(data, 8150, 921, 834, 0) + put(data, 8151, 921, 776, 834) + put(data, 8162, 933, 776, 768) + put(data, 8163, 933, 776, 769) + put(data, 8164, 929, 787, 0) + put(data, 8166, 933, 834, 0) + put(data, 8167, 933, 776, 834) + put(data, 8182, 937, 834, 0) + put(data, 8064, 7944, 921, 0) + put(data, 8065, 7945, 921, 0) + put(data, 8066, 7946, 921, 0) + put(data, 8067, 7947, 921, 0) + put(data, 8068, 7948, 921, 0) + put(data, 8069, 7949, 921, 0) + put(data, 8070, 7950, 921, 0) + put(data, 8071, 7951, 921, 0) + put(data, 8072, 7944, 921, 0) + put(data, 8073, 7945, 921, 0) + put(data, 8074, 7946, 921, 0) + put(data, 8075, 7947, 921, 0) + put(data, 8076, 7948, 921, 0) + put(data, 8077, 7949, 921, 0) + put(data, 8078, 7950, 921, 0) + put(data, 8079, 7951, 921, 0) + put(data, 8080, 7976, 921, 0) + put(data, 8081, 7977, 921, 0) + put(data, 8082, 7978, 921, 0) + put(data, 8083, 7979, 921, 0) + put(data, 8084, 7980, 921, 0) + put(data, 8085, 7981, 921, 0) + put(data, 8086, 7982, 921, 0) + put(data, 8087, 7983, 921, 0) + put(data, 8088, 7976, 921, 0) + put(data, 8089, 7977, 921, 0) + put(data, 8090, 7978, 921, 0) + put(data, 8091, 7979, 921, 0) + put(data, 8092, 7980, 921, 0) + put(data, 8093, 7981, 921, 0) + put(data, 8094, 7982, 921, 0) + put(data, 8095, 7983, 921, 0) + put(data, 8096, 8040, 921, 0) + put(data, 8097, 8041, 921, 0) + put(data, 8098, 8042, 921, 0) + put(data, 8099, 8043, 921, 0) + put(data, 8100, 8044, 921, 0) + put(data, 8101, 8045, 921, 0) + put(data, 8102, 8046, 921, 0) + put(data, 8103, 8047, 921, 0) + put(data, 8104, 8040, 921, 0) + put(data, 8105, 8041, 921, 0) + put(data, 8106, 8042, 921, 0) + put(data, 8107, 8043, 921, 0) + put(data, 8108, 8044, 921, 0) + put(data, 8109, 8045, 921, 0) + put(data, 8110, 8046, 921, 0) + put(data, 8111, 8047, 921, 0) + put(data, 8115, 913, 921, 0) + put(data, 8124, 913, 921, 0) + put(data, 8131, 919, 921, 0) + put(data, 8140, 919, 921, 0) + put(data, 8179, 937, 921, 0) + put(data, 8188, 937, 921, 0) + put(data, 8114, 8122, 921, 0) + put(data, 8116, 902, 921, 0) + put(data, 8130, 8138, 921, 0) + put(data, 8132, 905, 921, 0) + put(data, 8178, 8186, 921, 0) + put(data, 8180, 911, 921, 0) + put(data, 8119, 913, 834, 921) + put(data, 8135, 919, 834, 921) + put(data, 8183, 937, 834, 921) - private def self.special_cases_upcase - @@special_cases_upcase ||= begin - data = Hash(Int32, {Int32, Int32, Int32}).new(initial_capacity: 102) - put(data, 223, 83, 83, 0) - put(data, 64256, 70, 70, 0) - put(data, 64257, 70, 73, 0) - put(data, 64258, 70, 76, 0) - put(data, 64259, 70, 70, 73) - put(data, 64260, 70, 70, 76) - put(data, 64261, 83, 84, 0) - put(data, 64262, 83, 84, 0) - put(data, 1415, 1333, 1362, 0) - put(data, 64275, 1348, 1350, 0) - put(data, 64276, 1348, 1333, 0) - put(data, 64277, 1348, 1339, 0) - put(data, 64278, 1358, 1350, 0) - put(data, 64279, 1348, 1341, 0) - put(data, 329, 700, 78, 0) - put(data, 912, 921, 776, 769) - put(data, 944, 933, 776, 769) - put(data, 496, 74, 780, 0) - put(data, 7830, 72, 817, 0) - put(data, 7831, 84, 776, 0) - put(data, 7832, 87, 778, 0) - put(data, 7833, 89, 778, 0) - put(data, 7834, 65, 702, 0) - put(data, 8016, 933, 787, 0) - put(data, 8018, 933, 787, 768) - put(data, 8020, 933, 787, 769) - put(data, 8022, 933, 787, 834) - put(data, 8118, 913, 834, 0) - put(data, 8134, 919, 834, 0) - put(data, 8146, 921, 776, 768) - put(data, 8147, 921, 776, 769) - put(data, 8150, 921, 834, 0) - put(data, 8151, 921, 776, 834) - put(data, 8162, 933, 776, 768) - put(data, 8163, 933, 776, 769) - put(data, 8164, 929, 787, 0) - put(data, 8166, 933, 834, 0) - put(data, 8167, 933, 776, 834) - put(data, 8182, 937, 834, 0) - put(data, 8064, 7944, 921, 0) - put(data, 8065, 7945, 921, 0) - put(data, 8066, 7946, 921, 0) - put(data, 8067, 7947, 921, 0) - put(data, 8068, 7948, 921, 0) - put(data, 8069, 7949, 921, 0) - put(data, 8070, 7950, 921, 0) - put(data, 8071, 7951, 921, 0) - put(data, 8072, 7944, 921, 0) - put(data, 8073, 7945, 921, 0) - put(data, 8074, 7946, 921, 0) - put(data, 8075, 7947, 921, 0) - put(data, 8076, 7948, 921, 0) - put(data, 8077, 7949, 921, 0) - put(data, 8078, 7950, 921, 0) - put(data, 8079, 7951, 921, 0) - put(data, 8080, 7976, 921, 0) - put(data, 8081, 7977, 921, 0) - put(data, 8082, 7978, 921, 0) - put(data, 8083, 7979, 921, 0) - put(data, 8084, 7980, 921, 0) - put(data, 8085, 7981, 921, 0) - put(data, 8086, 7982, 921, 0) - put(data, 8087, 7983, 921, 0) - put(data, 8088, 7976, 921, 0) - put(data, 8089, 7977, 921, 0) - put(data, 8090, 7978, 921, 0) - put(data, 8091, 7979, 921, 0) - put(data, 8092, 7980, 921, 0) - put(data, 8093, 7981, 921, 0) - put(data, 8094, 7982, 921, 0) - put(data, 8095, 7983, 921, 0) - put(data, 8096, 8040, 921, 0) - put(data, 8097, 8041, 921, 0) - put(data, 8098, 8042, 921, 0) - put(data, 8099, 8043, 921, 0) - put(data, 8100, 8044, 921, 0) - put(data, 8101, 8045, 921, 0) - put(data, 8102, 8046, 921, 0) - put(data, 8103, 8047, 921, 0) - put(data, 8104, 8040, 921, 0) - put(data, 8105, 8041, 921, 0) - put(data, 8106, 8042, 921, 0) - put(data, 8107, 8043, 921, 0) - put(data, 8108, 8044, 921, 0) - put(data, 8109, 8045, 921, 0) - put(data, 8110, 8046, 921, 0) - put(data, 8111, 8047, 921, 0) - put(data, 8115, 913, 921, 0) - put(data, 8124, 913, 921, 0) - put(data, 8131, 919, 921, 0) - put(data, 8140, 919, 921, 0) - put(data, 8179, 937, 921, 0) - put(data, 8188, 937, 921, 0) - put(data, 8114, 8122, 921, 0) - put(data, 8116, 902, 921, 0) - put(data, 8130, 8138, 921, 0) - put(data, 8132, 905, 921, 0) - put(data, 8178, 8186, 921, 0) - put(data, 8180, 911, 921, 0) - put(data, 8119, 913, 834, 921) - put(data, 8135, 919, 834, 921) - put(data, 8183, 937, 834, 921) - - data - end + data end # Fold case transformation that involve mapping a codepoint # to multiple codepoints. The maximum transformation is always 4 # codepoints, so we store them all as 4 codepoints and 0 means end. - @@fold_cases : Hash(Int32, {Int32, Int32, Int32, Int32})? + private class_getter fold_cases : Hash(Int32, {Int32, Int32, Int32, Int32}) do + data = Hash(Int32, {Int32, Int32, Int32, Int32}).new(initial_capacity: 104) + put(data, 223, 115, 115, 0, 0) + put(data, 304, 105, 775, 0, 0) + put(data, 329, 700, 110, 0, 0) + put(data, 496, 106, 780, 0, 0) + put(data, 912, 953, 776, 769, 0) + put(data, 944, 965, 776, 769, 0) + put(data, 1415, 1381, 1410, 0, 0) + put(data, 7830, 104, 817, 0, 0) + put(data, 7831, 116, 776, 0, 0) + put(data, 7832, 119, 778, 0, 0) + put(data, 7833, 121, 778, 0, 0) + put(data, 7834, 97, 702, 0, 0) + put(data, 7838, 115, 115, 0, 0) + put(data, 8016, 965, 787, 0, 0) + put(data, 8018, 965, 787, 768, 0) + put(data, 8020, 965, 787, 769, 0) + put(data, 8022, 965, 787, 834, 0) + put(data, 8064, 7936, 953, 0, 0) + put(data, 8065, 7937, 953, 0, 0) + put(data, 8066, 7938, 953, 0, 0) + put(data, 8067, 7939, 953, 0, 0) + put(data, 8068, 7940, 953, 0, 0) + put(data, 8069, 7941, 953, 0, 0) + put(data, 8070, 7942, 953, 0, 0) + put(data, 8071, 7943, 953, 0, 0) + put(data, 8072, 7936, 953, 0, 0) + put(data, 8073, 7937, 953, 0, 0) + put(data, 8074, 7938, 953, 0, 0) + put(data, 8075, 7939, 953, 0, 0) + put(data, 8076, 7940, 953, 0, 0) + put(data, 8077, 7941, 953, 0, 0) + put(data, 8078, 7942, 953, 0, 0) + put(data, 8079, 7943, 953, 0, 0) + put(data, 8080, 7968, 953, 0, 0) + put(data, 8081, 7969, 953, 0, 0) + put(data, 8082, 7970, 953, 0, 0) + put(data, 8083, 7971, 953, 0, 0) + put(data, 8084, 7972, 953, 0, 0) + put(data, 8085, 7973, 953, 0, 0) + put(data, 8086, 7974, 953, 0, 0) + put(data, 8087, 7975, 953, 0, 0) + put(data, 8088, 7968, 953, 0, 0) + put(data, 8089, 7969, 953, 0, 0) + put(data, 8090, 7970, 953, 0, 0) + put(data, 8091, 7971, 953, 0, 0) + put(data, 8092, 7972, 953, 0, 0) + put(data, 8093, 7973, 953, 0, 0) + put(data, 8094, 7974, 953, 0, 0) + put(data, 8095, 7975, 953, 0, 0) + put(data, 8096, 8032, 953, 0, 0) + put(data, 8097, 8033, 953, 0, 0) + put(data, 8098, 8034, 953, 0, 0) + put(data, 8099, 8035, 953, 0, 0) + put(data, 8100, 8036, 953, 0, 0) + put(data, 8101, 8037, 953, 0, 0) + put(data, 8102, 8038, 953, 0, 0) + put(data, 8103, 8039, 953, 0, 0) + put(data, 8104, 8032, 953, 0, 0) + put(data, 8105, 8033, 953, 0, 0) + put(data, 8106, 8034, 953, 0, 0) + put(data, 8107, 8035, 953, 0, 0) + put(data, 8108, 8036, 953, 0, 0) + put(data, 8109, 8037, 953, 0, 0) + put(data, 8110, 8038, 953, 0, 0) + put(data, 8111, 8039, 953, 0, 0) + put(data, 8114, 8048, 953, 0, 0) + put(data, 8115, 945, 953, 0, 0) + put(data, 8116, 940, 953, 0, 0) + put(data, 8118, 945, 834, 0, 0) + put(data, 8119, 945, 834, 953, 0) + put(data, 8124, 945, 953, 0, 0) + put(data, 8130, 8052, 953, 0, 0) + put(data, 8131, 951, 953, 0, 0) + put(data, 8132, 942, 953, 0, 0) + put(data, 8134, 951, 834, 0, 0) + put(data, 8135, 951, 834, 953, 0) + put(data, 8140, 951, 953, 0, 0) + put(data, 8146, 953, 776, 768, 0) + put(data, 8147, 953, 776, 769, 0) + put(data, 8150, 953, 834, 0, 0) + put(data, 8151, 953, 776, 834, 0) + put(data, 8162, 965, 776, 768, 0) + put(data, 8163, 965, 776, 769, 0) + put(data, 8164, 961, 787, 0, 0) + put(data, 8166, 965, 834, 0, 0) + put(data, 8167, 965, 776, 834, 0) + put(data, 8178, 8060, 953, 0, 0) + put(data, 8179, 969, 953, 0, 0) + put(data, 8180, 974, 953, 0, 0) + put(data, 8182, 969, 834, 0, 0) + put(data, 8183, 969, 834, 953, 0) + put(data, 8188, 969, 953, 0, 0) + put(data, 64256, 102, 102, 0, 0) + put(data, 64257, 102, 105, 0, 0) + put(data, 64258, 102, 108, 0, 0) + put(data, 64259, 102, 102, 105, 0) + put(data, 64260, 102, 102, 108, 0) + put(data, 64261, 115, 116, 0, 0) + put(data, 64262, 115, 116, 0, 0) + put(data, 64275, 1396, 1398, 0, 0) + put(data, 64276, 1396, 1381, 0, 0) + put(data, 64277, 1396, 1387, 0, 0) + put(data, 64278, 1406, 1398, 0, 0) + put(data, 64279, 1396, 1389, 0, 0) + data + end + + # Canonical combining classes. Only non-zero entries are stored. Unicode + # guarantees that all class values are within `0..254`. + # Here we store: {from, to, class} + private class_getter canonical_combining_classes : Array({Int32, Int32, UInt8}) do + data = Array({Int32, Int32, UInt8}).new(385) + put(data, 768, 788, 230_u8) + put(data, 789, 789, 232_u8) + put(data, 790, 793, 220_u8) + put(data, 794, 794, 232_u8) + put(data, 795, 795, 216_u8) + put(data, 796, 800, 220_u8) + put(data, 801, 802, 202_u8) + put(data, 803, 806, 220_u8) + put(data, 807, 808, 202_u8) + put(data, 809, 819, 220_u8) + put(data, 820, 824, 1_u8) + put(data, 825, 828, 220_u8) + put(data, 829, 836, 230_u8) + put(data, 837, 837, 240_u8) + put(data, 838, 838, 230_u8) + put(data, 839, 841, 220_u8) + put(data, 842, 844, 230_u8) + put(data, 845, 846, 220_u8) + put(data, 848, 850, 230_u8) + put(data, 851, 854, 220_u8) + put(data, 855, 855, 230_u8) + put(data, 856, 856, 232_u8) + put(data, 857, 858, 220_u8) + put(data, 859, 859, 230_u8) + put(data, 860, 860, 233_u8) + put(data, 861, 862, 234_u8) + put(data, 863, 863, 233_u8) + put(data, 864, 865, 234_u8) + put(data, 866, 866, 233_u8) + put(data, 867, 879, 230_u8) + put(data, 1155, 1159, 230_u8) + put(data, 1425, 1425, 220_u8) + put(data, 1426, 1429, 230_u8) + put(data, 1430, 1430, 220_u8) + put(data, 1431, 1433, 230_u8) + put(data, 1434, 1434, 222_u8) + put(data, 1435, 1435, 220_u8) + put(data, 1436, 1441, 230_u8) + put(data, 1442, 1447, 220_u8) + put(data, 1448, 1449, 230_u8) + put(data, 1450, 1450, 220_u8) + put(data, 1451, 1452, 230_u8) + put(data, 1453, 1453, 222_u8) + put(data, 1454, 1454, 228_u8) + put(data, 1455, 1455, 230_u8) + put(data, 1456, 1456, 10_u8) + put(data, 1457, 1457, 11_u8) + put(data, 1458, 1458, 12_u8) + put(data, 1459, 1459, 13_u8) + put(data, 1460, 1460, 14_u8) + put(data, 1461, 1461, 15_u8) + put(data, 1462, 1462, 16_u8) + put(data, 1463, 1463, 17_u8) + put(data, 1464, 1464, 18_u8) + put(data, 1465, 1466, 19_u8) + put(data, 1467, 1467, 20_u8) + put(data, 1468, 1468, 21_u8) + put(data, 1469, 1469, 22_u8) + put(data, 1471, 1471, 23_u8) + put(data, 1473, 1473, 24_u8) + put(data, 1474, 1474, 25_u8) + put(data, 1476, 1476, 230_u8) + put(data, 1477, 1477, 220_u8) + put(data, 1479, 1479, 18_u8) + put(data, 1552, 1559, 230_u8) + put(data, 1560, 1560, 30_u8) + put(data, 1561, 1561, 31_u8) + put(data, 1562, 1562, 32_u8) + put(data, 1611, 1611, 27_u8) + put(data, 1612, 1612, 28_u8) + put(data, 1613, 1613, 29_u8) + put(data, 1614, 1614, 30_u8) + put(data, 1615, 1615, 31_u8) + put(data, 1616, 1616, 32_u8) + put(data, 1617, 1617, 33_u8) + put(data, 1618, 1618, 34_u8) + put(data, 1619, 1620, 230_u8) + put(data, 1621, 1622, 220_u8) + put(data, 1623, 1627, 230_u8) + put(data, 1628, 1628, 220_u8) + put(data, 1629, 1630, 230_u8) + put(data, 1631, 1631, 220_u8) + put(data, 1648, 1648, 35_u8) + put(data, 1750, 1756, 230_u8) + put(data, 1759, 1762, 230_u8) + put(data, 1763, 1763, 220_u8) + put(data, 1764, 1764, 230_u8) + put(data, 1767, 1768, 230_u8) + put(data, 1770, 1770, 220_u8) + put(data, 1771, 1772, 230_u8) + put(data, 1773, 1773, 220_u8) + put(data, 1809, 1809, 36_u8) + put(data, 1840, 1840, 230_u8) + put(data, 1841, 1841, 220_u8) + put(data, 1842, 1843, 230_u8) + put(data, 1844, 1844, 220_u8) + put(data, 1845, 1846, 230_u8) + put(data, 1847, 1849, 220_u8) + put(data, 1850, 1850, 230_u8) + put(data, 1851, 1852, 220_u8) + put(data, 1853, 1853, 230_u8) + put(data, 1854, 1854, 220_u8) + put(data, 1855, 1857, 230_u8) + put(data, 1858, 1858, 220_u8) + put(data, 1859, 1859, 230_u8) + put(data, 1860, 1860, 220_u8) + put(data, 1861, 1861, 230_u8) + put(data, 1862, 1862, 220_u8) + put(data, 1863, 1863, 230_u8) + put(data, 1864, 1864, 220_u8) + put(data, 1865, 1866, 230_u8) + put(data, 2027, 2033, 230_u8) + put(data, 2034, 2034, 220_u8) + put(data, 2035, 2035, 230_u8) + put(data, 2045, 2045, 220_u8) + put(data, 2070, 2073, 230_u8) + put(data, 2075, 2083, 230_u8) + put(data, 2085, 2087, 230_u8) + put(data, 2089, 2093, 230_u8) + put(data, 2137, 2139, 220_u8) + put(data, 2200, 2200, 230_u8) + put(data, 2201, 2203, 220_u8) + put(data, 2204, 2207, 230_u8) + put(data, 2250, 2254, 230_u8) + put(data, 2255, 2259, 220_u8) + put(data, 2260, 2273, 230_u8) + put(data, 2275, 2275, 220_u8) + put(data, 2276, 2277, 230_u8) + put(data, 2278, 2278, 220_u8) + put(data, 2279, 2280, 230_u8) + put(data, 2281, 2281, 220_u8) + put(data, 2282, 2284, 230_u8) + put(data, 2285, 2287, 220_u8) + put(data, 2288, 2288, 27_u8) + put(data, 2289, 2289, 28_u8) + put(data, 2290, 2290, 29_u8) + put(data, 2291, 2293, 230_u8) + put(data, 2294, 2294, 220_u8) + put(data, 2295, 2296, 230_u8) + put(data, 2297, 2298, 220_u8) + put(data, 2299, 2303, 230_u8) + put(data, 2364, 2364, 7_u8) + put(data, 2381, 2381, 9_u8) + put(data, 2385, 2385, 230_u8) + put(data, 2386, 2386, 220_u8) + put(data, 2387, 2388, 230_u8) + put(data, 2492, 2492, 7_u8) + put(data, 2509, 2509, 9_u8) + put(data, 2558, 2558, 230_u8) + put(data, 2620, 2620, 7_u8) + put(data, 2637, 2637, 9_u8) + put(data, 2748, 2748, 7_u8) + put(data, 2765, 2765, 9_u8) + put(data, 2876, 2876, 7_u8) + put(data, 2893, 2893, 9_u8) + put(data, 3021, 3021, 9_u8) + put(data, 3132, 3132, 7_u8) + put(data, 3149, 3149, 9_u8) + put(data, 3157, 3157, 84_u8) + put(data, 3158, 3158, 91_u8) + put(data, 3260, 3260, 7_u8) + put(data, 3277, 3277, 9_u8) + put(data, 3387, 3388, 9_u8) + put(data, 3405, 3405, 9_u8) + put(data, 3530, 3530, 9_u8) + put(data, 3640, 3641, 103_u8) + put(data, 3642, 3642, 9_u8) + put(data, 3656, 3659, 107_u8) + put(data, 3768, 3769, 118_u8) + put(data, 3770, 3770, 9_u8) + put(data, 3784, 3787, 122_u8) + put(data, 3864, 3865, 220_u8) + put(data, 3893, 3893, 220_u8) + put(data, 3895, 3895, 220_u8) + put(data, 3897, 3897, 216_u8) + put(data, 3953, 3953, 129_u8) + put(data, 3954, 3954, 130_u8) + put(data, 3956, 3956, 132_u8) + put(data, 3962, 3965, 130_u8) + put(data, 3968, 3968, 130_u8) + put(data, 3970, 3971, 230_u8) + put(data, 3972, 3972, 9_u8) + put(data, 3974, 3975, 230_u8) + put(data, 4038, 4038, 220_u8) + put(data, 4151, 4151, 7_u8) + put(data, 4153, 4154, 9_u8) + put(data, 4237, 4237, 220_u8) + put(data, 4957, 4959, 230_u8) + put(data, 5908, 5908, 9_u8) + put(data, 5909, 5909, 9_u8) + put(data, 5940, 5940, 9_u8) + put(data, 6098, 6098, 9_u8) + put(data, 6109, 6109, 230_u8) + put(data, 6313, 6313, 228_u8) + put(data, 6457, 6457, 222_u8) + put(data, 6458, 6458, 230_u8) + put(data, 6459, 6459, 220_u8) + put(data, 6679, 6679, 230_u8) + put(data, 6680, 6680, 220_u8) + put(data, 6752, 6752, 9_u8) + put(data, 6773, 6780, 230_u8) + put(data, 6783, 6783, 220_u8) + put(data, 6832, 6836, 230_u8) + put(data, 6837, 6842, 220_u8) + put(data, 6843, 6844, 230_u8) + put(data, 6845, 6845, 220_u8) + put(data, 6847, 6848, 220_u8) + put(data, 6849, 6850, 230_u8) + put(data, 6851, 6852, 220_u8) + put(data, 6853, 6857, 230_u8) + put(data, 6858, 6858, 220_u8) + put(data, 6859, 6862, 230_u8) + put(data, 6964, 6964, 7_u8) + put(data, 6980, 6980, 9_u8) + put(data, 7019, 7019, 230_u8) + put(data, 7020, 7020, 220_u8) + put(data, 7021, 7027, 230_u8) + put(data, 7082, 7082, 9_u8) + put(data, 7083, 7083, 9_u8) + put(data, 7142, 7142, 7_u8) + put(data, 7154, 7155, 9_u8) + put(data, 7223, 7223, 7_u8) + put(data, 7376, 7378, 230_u8) + put(data, 7380, 7380, 1_u8) + put(data, 7381, 7385, 220_u8) + put(data, 7386, 7387, 230_u8) + put(data, 7388, 7391, 220_u8) + put(data, 7392, 7392, 230_u8) + put(data, 7394, 7400, 1_u8) + put(data, 7405, 7405, 220_u8) + put(data, 7412, 7412, 230_u8) + put(data, 7416, 7417, 230_u8) + put(data, 7616, 7617, 230_u8) + put(data, 7618, 7618, 220_u8) + put(data, 7619, 7625, 230_u8) + put(data, 7626, 7626, 220_u8) + put(data, 7627, 7628, 230_u8) + put(data, 7629, 7629, 234_u8) + put(data, 7630, 7630, 214_u8) + put(data, 7631, 7631, 220_u8) + put(data, 7632, 7632, 202_u8) + put(data, 7633, 7669, 230_u8) + put(data, 7670, 7670, 232_u8) + put(data, 7671, 7672, 228_u8) + put(data, 7673, 7673, 220_u8) + put(data, 7674, 7674, 218_u8) + put(data, 7675, 7675, 230_u8) + put(data, 7676, 7676, 233_u8) + put(data, 7677, 7677, 220_u8) + put(data, 7678, 7678, 230_u8) + put(data, 7679, 7679, 220_u8) + put(data, 8400, 8401, 230_u8) + put(data, 8402, 8403, 1_u8) + put(data, 8404, 8407, 230_u8) + put(data, 8408, 8410, 1_u8) + put(data, 8411, 8412, 230_u8) + put(data, 8417, 8417, 230_u8) + put(data, 8421, 8422, 1_u8) + put(data, 8423, 8423, 230_u8) + put(data, 8424, 8424, 220_u8) + put(data, 8425, 8425, 230_u8) + put(data, 8426, 8427, 1_u8) + put(data, 8428, 8431, 220_u8) + put(data, 8432, 8432, 230_u8) + put(data, 11503, 11505, 230_u8) + put(data, 11647, 11647, 9_u8) + put(data, 11744, 11775, 230_u8) + put(data, 12330, 12330, 218_u8) + put(data, 12331, 12331, 228_u8) + put(data, 12332, 12332, 232_u8) + put(data, 12333, 12333, 222_u8) + put(data, 12334, 12335, 224_u8) + put(data, 12441, 12442, 8_u8) + put(data, 42607, 42607, 230_u8) + put(data, 42612, 42621, 230_u8) + put(data, 42654, 42655, 230_u8) + put(data, 42736, 42737, 230_u8) + put(data, 43014, 43014, 9_u8) + put(data, 43052, 43052, 9_u8) + put(data, 43204, 43204, 9_u8) + put(data, 43232, 43249, 230_u8) + put(data, 43307, 43309, 220_u8) + put(data, 43347, 43347, 9_u8) + put(data, 43443, 43443, 7_u8) + put(data, 43456, 43456, 9_u8) + put(data, 43696, 43696, 230_u8) + put(data, 43698, 43699, 230_u8) + put(data, 43700, 43700, 220_u8) + put(data, 43703, 43704, 230_u8) + put(data, 43710, 43711, 230_u8) + put(data, 43713, 43713, 230_u8) + put(data, 43766, 43766, 9_u8) + put(data, 44013, 44013, 9_u8) + put(data, 64286, 64286, 26_u8) + put(data, 65056, 65062, 230_u8) + put(data, 65063, 65069, 220_u8) + put(data, 65070, 65071, 230_u8) + put(data, 66045, 66045, 220_u8) + put(data, 66272, 66272, 220_u8) + put(data, 66422, 66426, 230_u8) + put(data, 68109, 68109, 220_u8) + put(data, 68111, 68111, 230_u8) + put(data, 68152, 68152, 230_u8) + put(data, 68153, 68153, 1_u8) + put(data, 68154, 68154, 220_u8) + put(data, 68159, 68159, 9_u8) + put(data, 68325, 68325, 230_u8) + put(data, 68326, 68326, 220_u8) + put(data, 68900, 68903, 230_u8) + put(data, 69291, 69292, 230_u8) + put(data, 69446, 69447, 220_u8) + put(data, 69448, 69450, 230_u8) + put(data, 69451, 69451, 220_u8) + put(data, 69452, 69452, 230_u8) + put(data, 69453, 69456, 220_u8) + put(data, 69506, 69506, 230_u8) + put(data, 69507, 69507, 220_u8) + put(data, 69508, 69508, 230_u8) + put(data, 69509, 69509, 220_u8) + put(data, 69702, 69702, 9_u8) + put(data, 69744, 69744, 9_u8) + put(data, 69759, 69759, 9_u8) + put(data, 69817, 69817, 9_u8) + put(data, 69818, 69818, 7_u8) + put(data, 69888, 69890, 230_u8) + put(data, 69939, 69940, 9_u8) + put(data, 70003, 70003, 7_u8) + put(data, 70080, 70080, 9_u8) + put(data, 70090, 70090, 7_u8) + put(data, 70197, 70197, 9_u8) + put(data, 70198, 70198, 7_u8) + put(data, 70377, 70377, 7_u8) + put(data, 70378, 70378, 9_u8) + put(data, 70459, 70460, 7_u8) + put(data, 70477, 70477, 9_u8) + put(data, 70502, 70508, 230_u8) + put(data, 70512, 70516, 230_u8) + put(data, 70722, 70722, 9_u8) + put(data, 70726, 70726, 7_u8) + put(data, 70750, 70750, 230_u8) + put(data, 70850, 70850, 9_u8) + put(data, 70851, 70851, 7_u8) + put(data, 71103, 71103, 9_u8) + put(data, 71104, 71104, 7_u8) + put(data, 71231, 71231, 9_u8) + put(data, 71350, 71350, 9_u8) + put(data, 71351, 71351, 7_u8) + put(data, 71467, 71467, 9_u8) + put(data, 71737, 71737, 9_u8) + put(data, 71738, 71738, 7_u8) + put(data, 71997, 71997, 9_u8) + put(data, 71998, 71998, 9_u8) + put(data, 72003, 72003, 7_u8) + put(data, 72160, 72160, 9_u8) + put(data, 72244, 72244, 9_u8) + put(data, 72263, 72263, 9_u8) + put(data, 72345, 72345, 9_u8) + put(data, 72767, 72767, 9_u8) + put(data, 73026, 73026, 7_u8) + put(data, 73028, 73029, 9_u8) + put(data, 73111, 73111, 9_u8) + put(data, 92912, 92916, 1_u8) + put(data, 92976, 92982, 230_u8) + put(data, 94192, 94193, 6_u8) + put(data, 113822, 113822, 1_u8) + put(data, 119141, 119142, 216_u8) + put(data, 119143, 119145, 1_u8) + put(data, 119149, 119149, 226_u8) + put(data, 119150, 119154, 216_u8) + put(data, 119163, 119170, 220_u8) + put(data, 119173, 119177, 230_u8) + put(data, 119178, 119179, 220_u8) + put(data, 119210, 119213, 230_u8) + put(data, 119362, 119364, 230_u8) + put(data, 122880, 122886, 230_u8) + put(data, 122888, 122904, 230_u8) + put(data, 122907, 122913, 230_u8) + put(data, 122915, 122916, 230_u8) + put(data, 122918, 122922, 230_u8) + put(data, 123184, 123190, 230_u8) + put(data, 123566, 123566, 230_u8) + put(data, 123628, 123631, 230_u8) + put(data, 125136, 125142, 220_u8) + put(data, 125252, 125257, 230_u8) + put(data, 125258, 125258, 7_u8) + data + end + + # Canonical decomposition mappings, excluding Hangul syllables. The maximum + # transformation is always 2 codepoints, so we store them all as 2 codepoints + # and 0 means end. + private class_getter canonical_decompositions : Hash(Int32, {Int32, Int32}) do + data = Hash(Int32, {Int32, Int32}).new(initial_capacity: 2061) + put(data, 192, 65, 768) + put(data, 193, 65, 769) + put(data, 194, 65, 770) + put(data, 195, 65, 771) + put(data, 196, 65, 776) + put(data, 197, 65, 778) + put(data, 199, 67, 807) + put(data, 200, 69, 768) + put(data, 201, 69, 769) + put(data, 202, 69, 770) + put(data, 203, 69, 776) + put(data, 204, 73, 768) + put(data, 205, 73, 769) + put(data, 206, 73, 770) + put(data, 207, 73, 776) + put(data, 209, 78, 771) + put(data, 210, 79, 768) + put(data, 211, 79, 769) + put(data, 212, 79, 770) + put(data, 213, 79, 771) + put(data, 214, 79, 776) + put(data, 217, 85, 768) + put(data, 218, 85, 769) + put(data, 219, 85, 770) + put(data, 220, 85, 776) + put(data, 221, 89, 769) + put(data, 224, 97, 768) + put(data, 225, 97, 769) + put(data, 226, 97, 770) + put(data, 227, 97, 771) + put(data, 228, 97, 776) + put(data, 229, 97, 778) + put(data, 231, 99, 807) + put(data, 232, 101, 768) + put(data, 233, 101, 769) + put(data, 234, 101, 770) + put(data, 235, 101, 776) + put(data, 236, 105, 768) + put(data, 237, 105, 769) + put(data, 238, 105, 770) + put(data, 239, 105, 776) + put(data, 241, 110, 771) + put(data, 242, 111, 768) + put(data, 243, 111, 769) + put(data, 244, 111, 770) + put(data, 245, 111, 771) + put(data, 246, 111, 776) + put(data, 249, 117, 768) + put(data, 250, 117, 769) + put(data, 251, 117, 770) + put(data, 252, 117, 776) + put(data, 253, 121, 769) + put(data, 255, 121, 776) + put(data, 256, 65, 772) + put(data, 257, 97, 772) + put(data, 258, 65, 774) + put(data, 259, 97, 774) + put(data, 260, 65, 808) + put(data, 261, 97, 808) + put(data, 262, 67, 769) + put(data, 263, 99, 769) + put(data, 264, 67, 770) + put(data, 265, 99, 770) + put(data, 266, 67, 775) + put(data, 267, 99, 775) + put(data, 268, 67, 780) + put(data, 269, 99, 780) + put(data, 270, 68, 780) + put(data, 271, 100, 780) + put(data, 274, 69, 772) + put(data, 275, 101, 772) + put(data, 276, 69, 774) + put(data, 277, 101, 774) + put(data, 278, 69, 775) + put(data, 279, 101, 775) + put(data, 280, 69, 808) + put(data, 281, 101, 808) + put(data, 282, 69, 780) + put(data, 283, 101, 780) + put(data, 284, 71, 770) + put(data, 285, 103, 770) + put(data, 286, 71, 774) + put(data, 287, 103, 774) + put(data, 288, 71, 775) + put(data, 289, 103, 775) + put(data, 290, 71, 807) + put(data, 291, 103, 807) + put(data, 292, 72, 770) + put(data, 293, 104, 770) + put(data, 296, 73, 771) + put(data, 297, 105, 771) + put(data, 298, 73, 772) + put(data, 299, 105, 772) + put(data, 300, 73, 774) + put(data, 301, 105, 774) + put(data, 302, 73, 808) + put(data, 303, 105, 808) + put(data, 304, 73, 775) + put(data, 308, 74, 770) + put(data, 309, 106, 770) + put(data, 310, 75, 807) + put(data, 311, 107, 807) + put(data, 313, 76, 769) + put(data, 314, 108, 769) + put(data, 315, 76, 807) + put(data, 316, 108, 807) + put(data, 317, 76, 780) + put(data, 318, 108, 780) + put(data, 323, 78, 769) + put(data, 324, 110, 769) + put(data, 325, 78, 807) + put(data, 326, 110, 807) + put(data, 327, 78, 780) + put(data, 328, 110, 780) + put(data, 332, 79, 772) + put(data, 333, 111, 772) + put(data, 334, 79, 774) + put(data, 335, 111, 774) + put(data, 336, 79, 779) + put(data, 337, 111, 779) + put(data, 340, 82, 769) + put(data, 341, 114, 769) + put(data, 342, 82, 807) + put(data, 343, 114, 807) + put(data, 344, 82, 780) + put(data, 345, 114, 780) + put(data, 346, 83, 769) + put(data, 347, 115, 769) + put(data, 348, 83, 770) + put(data, 349, 115, 770) + put(data, 350, 83, 807) + put(data, 351, 115, 807) + put(data, 352, 83, 780) + put(data, 353, 115, 780) + put(data, 354, 84, 807) + put(data, 355, 116, 807) + put(data, 356, 84, 780) + put(data, 357, 116, 780) + put(data, 360, 85, 771) + put(data, 361, 117, 771) + put(data, 362, 85, 772) + put(data, 363, 117, 772) + put(data, 364, 85, 774) + put(data, 365, 117, 774) + put(data, 366, 85, 778) + put(data, 367, 117, 778) + put(data, 368, 85, 779) + put(data, 369, 117, 779) + put(data, 370, 85, 808) + put(data, 371, 117, 808) + put(data, 372, 87, 770) + put(data, 373, 119, 770) + put(data, 374, 89, 770) + put(data, 375, 121, 770) + put(data, 376, 89, 776) + put(data, 377, 90, 769) + put(data, 378, 122, 769) + put(data, 379, 90, 775) + put(data, 380, 122, 775) + put(data, 381, 90, 780) + put(data, 382, 122, 780) + put(data, 416, 79, 795) + put(data, 417, 111, 795) + put(data, 431, 85, 795) + put(data, 432, 117, 795) + put(data, 461, 65, 780) + put(data, 462, 97, 780) + put(data, 463, 73, 780) + put(data, 464, 105, 780) + put(data, 465, 79, 780) + put(data, 466, 111, 780) + put(data, 467, 85, 780) + put(data, 468, 117, 780) + put(data, 469, 220, 772) + put(data, 470, 252, 772) + put(data, 471, 220, 769) + put(data, 472, 252, 769) + put(data, 473, 220, 780) + put(data, 474, 252, 780) + put(data, 475, 220, 768) + put(data, 476, 252, 768) + put(data, 478, 196, 772) + put(data, 479, 228, 772) + put(data, 480, 550, 772) + put(data, 481, 551, 772) + put(data, 482, 198, 772) + put(data, 483, 230, 772) + put(data, 486, 71, 780) + put(data, 487, 103, 780) + put(data, 488, 75, 780) + put(data, 489, 107, 780) + put(data, 490, 79, 808) + put(data, 491, 111, 808) + put(data, 492, 490, 772) + put(data, 493, 491, 772) + put(data, 494, 439, 780) + put(data, 495, 658, 780) + put(data, 496, 106, 780) + put(data, 500, 71, 769) + put(data, 501, 103, 769) + put(data, 504, 78, 768) + put(data, 505, 110, 768) + put(data, 506, 197, 769) + put(data, 507, 229, 769) + put(data, 508, 198, 769) + put(data, 509, 230, 769) + put(data, 510, 216, 769) + put(data, 511, 248, 769) + put(data, 512, 65, 783) + put(data, 513, 97, 783) + put(data, 514, 65, 785) + put(data, 515, 97, 785) + put(data, 516, 69, 783) + put(data, 517, 101, 783) + put(data, 518, 69, 785) + put(data, 519, 101, 785) + put(data, 520, 73, 783) + put(data, 521, 105, 783) + put(data, 522, 73, 785) + put(data, 523, 105, 785) + put(data, 524, 79, 783) + put(data, 525, 111, 783) + put(data, 526, 79, 785) + put(data, 527, 111, 785) + put(data, 528, 82, 783) + put(data, 529, 114, 783) + put(data, 530, 82, 785) + put(data, 531, 114, 785) + put(data, 532, 85, 783) + put(data, 533, 117, 783) + put(data, 534, 85, 785) + put(data, 535, 117, 785) + put(data, 536, 83, 806) + put(data, 537, 115, 806) + put(data, 538, 84, 806) + put(data, 539, 116, 806) + put(data, 542, 72, 780) + put(data, 543, 104, 780) + put(data, 550, 65, 775) + put(data, 551, 97, 775) + put(data, 552, 69, 807) + put(data, 553, 101, 807) + put(data, 554, 214, 772) + put(data, 555, 246, 772) + put(data, 556, 213, 772) + put(data, 557, 245, 772) + put(data, 558, 79, 775) + put(data, 559, 111, 775) + put(data, 560, 558, 772) + put(data, 561, 559, 772) + put(data, 562, 89, 772) + put(data, 563, 121, 772) + put(data, 832, 768, 0) + put(data, 833, 769, 0) + put(data, 835, 787, 0) + put(data, 836, 776, 769) + put(data, 884, 697, 0) + put(data, 894, 59, 0) + put(data, 901, 168, 769) + put(data, 902, 913, 769) + put(data, 903, 183, 0) + put(data, 904, 917, 769) + put(data, 905, 919, 769) + put(data, 906, 921, 769) + put(data, 908, 927, 769) + put(data, 910, 933, 769) + put(data, 911, 937, 769) + put(data, 912, 970, 769) + put(data, 938, 921, 776) + put(data, 939, 933, 776) + put(data, 940, 945, 769) + put(data, 941, 949, 769) + put(data, 942, 951, 769) + put(data, 943, 953, 769) + put(data, 944, 971, 769) + put(data, 970, 953, 776) + put(data, 971, 965, 776) + put(data, 972, 959, 769) + put(data, 973, 965, 769) + put(data, 974, 969, 769) + put(data, 979, 978, 769) + put(data, 980, 978, 776) + put(data, 1024, 1045, 768) + put(data, 1025, 1045, 776) + put(data, 1027, 1043, 769) + put(data, 1031, 1030, 776) + put(data, 1036, 1050, 769) + put(data, 1037, 1048, 768) + put(data, 1038, 1059, 774) + put(data, 1049, 1048, 774) + put(data, 1081, 1080, 774) + put(data, 1104, 1077, 768) + put(data, 1105, 1077, 776) + put(data, 1107, 1075, 769) + put(data, 1111, 1110, 776) + put(data, 1116, 1082, 769) + put(data, 1117, 1080, 768) + put(data, 1118, 1091, 774) + put(data, 1142, 1140, 783) + put(data, 1143, 1141, 783) + put(data, 1217, 1046, 774) + put(data, 1218, 1078, 774) + put(data, 1232, 1040, 774) + put(data, 1233, 1072, 774) + put(data, 1234, 1040, 776) + put(data, 1235, 1072, 776) + put(data, 1238, 1045, 774) + put(data, 1239, 1077, 774) + put(data, 1242, 1240, 776) + put(data, 1243, 1241, 776) + put(data, 1244, 1046, 776) + put(data, 1245, 1078, 776) + put(data, 1246, 1047, 776) + put(data, 1247, 1079, 776) + put(data, 1250, 1048, 772) + put(data, 1251, 1080, 772) + put(data, 1252, 1048, 776) + put(data, 1253, 1080, 776) + put(data, 1254, 1054, 776) + put(data, 1255, 1086, 776) + put(data, 1258, 1256, 776) + put(data, 1259, 1257, 776) + put(data, 1260, 1069, 776) + put(data, 1261, 1101, 776) + put(data, 1262, 1059, 772) + put(data, 1263, 1091, 772) + put(data, 1264, 1059, 776) + put(data, 1265, 1091, 776) + put(data, 1266, 1059, 779) + put(data, 1267, 1091, 779) + put(data, 1268, 1063, 776) + put(data, 1269, 1095, 776) + put(data, 1272, 1067, 776) + put(data, 1273, 1099, 776) + put(data, 1570, 1575, 1619) + put(data, 1571, 1575, 1620) + put(data, 1572, 1608, 1620) + put(data, 1573, 1575, 1621) + put(data, 1574, 1610, 1620) + put(data, 1728, 1749, 1620) + put(data, 1730, 1729, 1620) + put(data, 1747, 1746, 1620) + put(data, 2345, 2344, 2364) + put(data, 2353, 2352, 2364) + put(data, 2356, 2355, 2364) + put(data, 2392, 2325, 2364) + put(data, 2393, 2326, 2364) + put(data, 2394, 2327, 2364) + put(data, 2395, 2332, 2364) + put(data, 2396, 2337, 2364) + put(data, 2397, 2338, 2364) + put(data, 2398, 2347, 2364) + put(data, 2399, 2351, 2364) + put(data, 2507, 2503, 2494) + put(data, 2508, 2503, 2519) + put(data, 2524, 2465, 2492) + put(data, 2525, 2466, 2492) + put(data, 2527, 2479, 2492) + put(data, 2611, 2610, 2620) + put(data, 2614, 2616, 2620) + put(data, 2649, 2582, 2620) + put(data, 2650, 2583, 2620) + put(data, 2651, 2588, 2620) + put(data, 2654, 2603, 2620) + put(data, 2888, 2887, 2902) + put(data, 2891, 2887, 2878) + put(data, 2892, 2887, 2903) + put(data, 2908, 2849, 2876) + put(data, 2909, 2850, 2876) + put(data, 2964, 2962, 3031) + put(data, 3018, 3014, 3006) + put(data, 3019, 3015, 3006) + put(data, 3020, 3014, 3031) + put(data, 3144, 3142, 3158) + put(data, 3264, 3263, 3285) + put(data, 3271, 3270, 3285) + put(data, 3272, 3270, 3286) + put(data, 3274, 3270, 3266) + put(data, 3275, 3274, 3285) + put(data, 3402, 3398, 3390) + put(data, 3403, 3399, 3390) + put(data, 3404, 3398, 3415) + put(data, 3546, 3545, 3530) + put(data, 3548, 3545, 3535) + put(data, 3549, 3548, 3530) + put(data, 3550, 3545, 3551) + put(data, 3907, 3906, 4023) + put(data, 3917, 3916, 4023) + put(data, 3922, 3921, 4023) + put(data, 3927, 3926, 4023) + put(data, 3932, 3931, 4023) + put(data, 3945, 3904, 4021) + put(data, 3955, 3953, 3954) + put(data, 3957, 3953, 3956) + put(data, 3958, 4018, 3968) + put(data, 3960, 4019, 3968) + put(data, 3969, 3953, 3968) + put(data, 3987, 3986, 4023) + put(data, 3997, 3996, 4023) + put(data, 4002, 4001, 4023) + put(data, 4007, 4006, 4023) + put(data, 4012, 4011, 4023) + put(data, 4025, 3984, 4021) + put(data, 4134, 4133, 4142) + put(data, 6918, 6917, 6965) + put(data, 6920, 6919, 6965) + put(data, 6922, 6921, 6965) + put(data, 6924, 6923, 6965) + put(data, 6926, 6925, 6965) + put(data, 6930, 6929, 6965) + put(data, 6971, 6970, 6965) + put(data, 6973, 6972, 6965) + put(data, 6976, 6974, 6965) + put(data, 6977, 6975, 6965) + put(data, 6979, 6978, 6965) + put(data, 7680, 65, 805) + put(data, 7681, 97, 805) + put(data, 7682, 66, 775) + put(data, 7683, 98, 775) + put(data, 7684, 66, 803) + put(data, 7685, 98, 803) + put(data, 7686, 66, 817) + put(data, 7687, 98, 817) + put(data, 7688, 199, 769) + put(data, 7689, 231, 769) + put(data, 7690, 68, 775) + put(data, 7691, 100, 775) + put(data, 7692, 68, 803) + put(data, 7693, 100, 803) + put(data, 7694, 68, 817) + put(data, 7695, 100, 817) + put(data, 7696, 68, 807) + put(data, 7697, 100, 807) + put(data, 7698, 68, 813) + put(data, 7699, 100, 813) + put(data, 7700, 274, 768) + put(data, 7701, 275, 768) + put(data, 7702, 274, 769) + put(data, 7703, 275, 769) + put(data, 7704, 69, 813) + put(data, 7705, 101, 813) + put(data, 7706, 69, 816) + put(data, 7707, 101, 816) + put(data, 7708, 552, 774) + put(data, 7709, 553, 774) + put(data, 7710, 70, 775) + put(data, 7711, 102, 775) + put(data, 7712, 71, 772) + put(data, 7713, 103, 772) + put(data, 7714, 72, 775) + put(data, 7715, 104, 775) + put(data, 7716, 72, 803) + put(data, 7717, 104, 803) + put(data, 7718, 72, 776) + put(data, 7719, 104, 776) + put(data, 7720, 72, 807) + put(data, 7721, 104, 807) + put(data, 7722, 72, 814) + put(data, 7723, 104, 814) + put(data, 7724, 73, 816) + put(data, 7725, 105, 816) + put(data, 7726, 207, 769) + put(data, 7727, 239, 769) + put(data, 7728, 75, 769) + put(data, 7729, 107, 769) + put(data, 7730, 75, 803) + put(data, 7731, 107, 803) + put(data, 7732, 75, 817) + put(data, 7733, 107, 817) + put(data, 7734, 76, 803) + put(data, 7735, 108, 803) + put(data, 7736, 7734, 772) + put(data, 7737, 7735, 772) + put(data, 7738, 76, 817) + put(data, 7739, 108, 817) + put(data, 7740, 76, 813) + put(data, 7741, 108, 813) + put(data, 7742, 77, 769) + put(data, 7743, 109, 769) + put(data, 7744, 77, 775) + put(data, 7745, 109, 775) + put(data, 7746, 77, 803) + put(data, 7747, 109, 803) + put(data, 7748, 78, 775) + put(data, 7749, 110, 775) + put(data, 7750, 78, 803) + put(data, 7751, 110, 803) + put(data, 7752, 78, 817) + put(data, 7753, 110, 817) + put(data, 7754, 78, 813) + put(data, 7755, 110, 813) + put(data, 7756, 213, 769) + put(data, 7757, 245, 769) + put(data, 7758, 213, 776) + put(data, 7759, 245, 776) + put(data, 7760, 332, 768) + put(data, 7761, 333, 768) + put(data, 7762, 332, 769) + put(data, 7763, 333, 769) + put(data, 7764, 80, 769) + put(data, 7765, 112, 769) + put(data, 7766, 80, 775) + put(data, 7767, 112, 775) + put(data, 7768, 82, 775) + put(data, 7769, 114, 775) + put(data, 7770, 82, 803) + put(data, 7771, 114, 803) + put(data, 7772, 7770, 772) + put(data, 7773, 7771, 772) + put(data, 7774, 82, 817) + put(data, 7775, 114, 817) + put(data, 7776, 83, 775) + put(data, 7777, 115, 775) + put(data, 7778, 83, 803) + put(data, 7779, 115, 803) + put(data, 7780, 346, 775) + put(data, 7781, 347, 775) + put(data, 7782, 352, 775) + put(data, 7783, 353, 775) + put(data, 7784, 7778, 775) + put(data, 7785, 7779, 775) + put(data, 7786, 84, 775) + put(data, 7787, 116, 775) + put(data, 7788, 84, 803) + put(data, 7789, 116, 803) + put(data, 7790, 84, 817) + put(data, 7791, 116, 817) + put(data, 7792, 84, 813) + put(data, 7793, 116, 813) + put(data, 7794, 85, 804) + put(data, 7795, 117, 804) + put(data, 7796, 85, 816) + put(data, 7797, 117, 816) + put(data, 7798, 85, 813) + put(data, 7799, 117, 813) + put(data, 7800, 360, 769) + put(data, 7801, 361, 769) + put(data, 7802, 362, 776) + put(data, 7803, 363, 776) + put(data, 7804, 86, 771) + put(data, 7805, 118, 771) + put(data, 7806, 86, 803) + put(data, 7807, 118, 803) + put(data, 7808, 87, 768) + put(data, 7809, 119, 768) + put(data, 7810, 87, 769) + put(data, 7811, 119, 769) + put(data, 7812, 87, 776) + put(data, 7813, 119, 776) + put(data, 7814, 87, 775) + put(data, 7815, 119, 775) + put(data, 7816, 87, 803) + put(data, 7817, 119, 803) + put(data, 7818, 88, 775) + put(data, 7819, 120, 775) + put(data, 7820, 88, 776) + put(data, 7821, 120, 776) + put(data, 7822, 89, 775) + put(data, 7823, 121, 775) + put(data, 7824, 90, 770) + put(data, 7825, 122, 770) + put(data, 7826, 90, 803) + put(data, 7827, 122, 803) + put(data, 7828, 90, 817) + put(data, 7829, 122, 817) + put(data, 7830, 104, 817) + put(data, 7831, 116, 776) + put(data, 7832, 119, 778) + put(data, 7833, 121, 778) + put(data, 7835, 383, 775) + put(data, 7840, 65, 803) + put(data, 7841, 97, 803) + put(data, 7842, 65, 777) + put(data, 7843, 97, 777) + put(data, 7844, 194, 769) + put(data, 7845, 226, 769) + put(data, 7846, 194, 768) + put(data, 7847, 226, 768) + put(data, 7848, 194, 777) + put(data, 7849, 226, 777) + put(data, 7850, 194, 771) + put(data, 7851, 226, 771) + put(data, 7852, 7840, 770) + put(data, 7853, 7841, 770) + put(data, 7854, 258, 769) + put(data, 7855, 259, 769) + put(data, 7856, 258, 768) + put(data, 7857, 259, 768) + put(data, 7858, 258, 777) + put(data, 7859, 259, 777) + put(data, 7860, 258, 771) + put(data, 7861, 259, 771) + put(data, 7862, 7840, 774) + put(data, 7863, 7841, 774) + put(data, 7864, 69, 803) + put(data, 7865, 101, 803) + put(data, 7866, 69, 777) + put(data, 7867, 101, 777) + put(data, 7868, 69, 771) + put(data, 7869, 101, 771) + put(data, 7870, 202, 769) + put(data, 7871, 234, 769) + put(data, 7872, 202, 768) + put(data, 7873, 234, 768) + put(data, 7874, 202, 777) + put(data, 7875, 234, 777) + put(data, 7876, 202, 771) + put(data, 7877, 234, 771) + put(data, 7878, 7864, 770) + put(data, 7879, 7865, 770) + put(data, 7880, 73, 777) + put(data, 7881, 105, 777) + put(data, 7882, 73, 803) + put(data, 7883, 105, 803) + put(data, 7884, 79, 803) + put(data, 7885, 111, 803) + put(data, 7886, 79, 777) + put(data, 7887, 111, 777) + put(data, 7888, 212, 769) + put(data, 7889, 244, 769) + put(data, 7890, 212, 768) + put(data, 7891, 244, 768) + put(data, 7892, 212, 777) + put(data, 7893, 244, 777) + put(data, 7894, 212, 771) + put(data, 7895, 244, 771) + put(data, 7896, 7884, 770) + put(data, 7897, 7885, 770) + put(data, 7898, 416, 769) + put(data, 7899, 417, 769) + put(data, 7900, 416, 768) + put(data, 7901, 417, 768) + put(data, 7902, 416, 777) + put(data, 7903, 417, 777) + put(data, 7904, 416, 771) + put(data, 7905, 417, 771) + put(data, 7906, 416, 803) + put(data, 7907, 417, 803) + put(data, 7908, 85, 803) + put(data, 7909, 117, 803) + put(data, 7910, 85, 777) + put(data, 7911, 117, 777) + put(data, 7912, 431, 769) + put(data, 7913, 432, 769) + put(data, 7914, 431, 768) + put(data, 7915, 432, 768) + put(data, 7916, 431, 777) + put(data, 7917, 432, 777) + put(data, 7918, 431, 771) + put(data, 7919, 432, 771) + put(data, 7920, 431, 803) + put(data, 7921, 432, 803) + put(data, 7922, 89, 768) + put(data, 7923, 121, 768) + put(data, 7924, 89, 803) + put(data, 7925, 121, 803) + put(data, 7926, 89, 777) + put(data, 7927, 121, 777) + put(data, 7928, 89, 771) + put(data, 7929, 121, 771) + put(data, 7936, 945, 787) + put(data, 7937, 945, 788) + put(data, 7938, 7936, 768) + put(data, 7939, 7937, 768) + put(data, 7940, 7936, 769) + put(data, 7941, 7937, 769) + put(data, 7942, 7936, 834) + put(data, 7943, 7937, 834) + put(data, 7944, 913, 787) + put(data, 7945, 913, 788) + put(data, 7946, 7944, 768) + put(data, 7947, 7945, 768) + put(data, 7948, 7944, 769) + put(data, 7949, 7945, 769) + put(data, 7950, 7944, 834) + put(data, 7951, 7945, 834) + put(data, 7952, 949, 787) + put(data, 7953, 949, 788) + put(data, 7954, 7952, 768) + put(data, 7955, 7953, 768) + put(data, 7956, 7952, 769) + put(data, 7957, 7953, 769) + put(data, 7960, 917, 787) + put(data, 7961, 917, 788) + put(data, 7962, 7960, 768) + put(data, 7963, 7961, 768) + put(data, 7964, 7960, 769) + put(data, 7965, 7961, 769) + put(data, 7968, 951, 787) + put(data, 7969, 951, 788) + put(data, 7970, 7968, 768) + put(data, 7971, 7969, 768) + put(data, 7972, 7968, 769) + put(data, 7973, 7969, 769) + put(data, 7974, 7968, 834) + put(data, 7975, 7969, 834) + put(data, 7976, 919, 787) + put(data, 7977, 919, 788) + put(data, 7978, 7976, 768) + put(data, 7979, 7977, 768) + put(data, 7980, 7976, 769) + put(data, 7981, 7977, 769) + put(data, 7982, 7976, 834) + put(data, 7983, 7977, 834) + put(data, 7984, 953, 787) + put(data, 7985, 953, 788) + put(data, 7986, 7984, 768) + put(data, 7987, 7985, 768) + put(data, 7988, 7984, 769) + put(data, 7989, 7985, 769) + put(data, 7990, 7984, 834) + put(data, 7991, 7985, 834) + put(data, 7992, 921, 787) + put(data, 7993, 921, 788) + put(data, 7994, 7992, 768) + put(data, 7995, 7993, 768) + put(data, 7996, 7992, 769) + put(data, 7997, 7993, 769) + put(data, 7998, 7992, 834) + put(data, 7999, 7993, 834) + put(data, 8000, 959, 787) + put(data, 8001, 959, 788) + put(data, 8002, 8000, 768) + put(data, 8003, 8001, 768) + put(data, 8004, 8000, 769) + put(data, 8005, 8001, 769) + put(data, 8008, 927, 787) + put(data, 8009, 927, 788) + put(data, 8010, 8008, 768) + put(data, 8011, 8009, 768) + put(data, 8012, 8008, 769) + put(data, 8013, 8009, 769) + put(data, 8016, 965, 787) + put(data, 8017, 965, 788) + put(data, 8018, 8016, 768) + put(data, 8019, 8017, 768) + put(data, 8020, 8016, 769) + put(data, 8021, 8017, 769) + put(data, 8022, 8016, 834) + put(data, 8023, 8017, 834) + put(data, 8025, 933, 788) + put(data, 8027, 8025, 768) + put(data, 8029, 8025, 769) + put(data, 8031, 8025, 834) + put(data, 8032, 969, 787) + put(data, 8033, 969, 788) + put(data, 8034, 8032, 768) + put(data, 8035, 8033, 768) + put(data, 8036, 8032, 769) + put(data, 8037, 8033, 769) + put(data, 8038, 8032, 834) + put(data, 8039, 8033, 834) + put(data, 8040, 937, 787) + put(data, 8041, 937, 788) + put(data, 8042, 8040, 768) + put(data, 8043, 8041, 768) + put(data, 8044, 8040, 769) + put(data, 8045, 8041, 769) + put(data, 8046, 8040, 834) + put(data, 8047, 8041, 834) + put(data, 8048, 945, 768) + put(data, 8049, 940, 0) + put(data, 8050, 949, 768) + put(data, 8051, 941, 0) + put(data, 8052, 951, 768) + put(data, 8053, 942, 0) + put(data, 8054, 953, 768) + put(data, 8055, 943, 0) + put(data, 8056, 959, 768) + put(data, 8057, 972, 0) + put(data, 8058, 965, 768) + put(data, 8059, 973, 0) + put(data, 8060, 969, 768) + put(data, 8061, 974, 0) + put(data, 8064, 7936, 837) + put(data, 8065, 7937, 837) + put(data, 8066, 7938, 837) + put(data, 8067, 7939, 837) + put(data, 8068, 7940, 837) + put(data, 8069, 7941, 837) + put(data, 8070, 7942, 837) + put(data, 8071, 7943, 837) + put(data, 8072, 7944, 837) + put(data, 8073, 7945, 837) + put(data, 8074, 7946, 837) + put(data, 8075, 7947, 837) + put(data, 8076, 7948, 837) + put(data, 8077, 7949, 837) + put(data, 8078, 7950, 837) + put(data, 8079, 7951, 837) + put(data, 8080, 7968, 837) + put(data, 8081, 7969, 837) + put(data, 8082, 7970, 837) + put(data, 8083, 7971, 837) + put(data, 8084, 7972, 837) + put(data, 8085, 7973, 837) + put(data, 8086, 7974, 837) + put(data, 8087, 7975, 837) + put(data, 8088, 7976, 837) + put(data, 8089, 7977, 837) + put(data, 8090, 7978, 837) + put(data, 8091, 7979, 837) + put(data, 8092, 7980, 837) + put(data, 8093, 7981, 837) + put(data, 8094, 7982, 837) + put(data, 8095, 7983, 837) + put(data, 8096, 8032, 837) + put(data, 8097, 8033, 837) + put(data, 8098, 8034, 837) + put(data, 8099, 8035, 837) + put(data, 8100, 8036, 837) + put(data, 8101, 8037, 837) + put(data, 8102, 8038, 837) + put(data, 8103, 8039, 837) + put(data, 8104, 8040, 837) + put(data, 8105, 8041, 837) + put(data, 8106, 8042, 837) + put(data, 8107, 8043, 837) + put(data, 8108, 8044, 837) + put(data, 8109, 8045, 837) + put(data, 8110, 8046, 837) + put(data, 8111, 8047, 837) + put(data, 8112, 945, 774) + put(data, 8113, 945, 772) + put(data, 8114, 8048, 837) + put(data, 8115, 945, 837) + put(data, 8116, 940, 837) + put(data, 8118, 945, 834) + put(data, 8119, 8118, 837) + put(data, 8120, 913, 774) + put(data, 8121, 913, 772) + put(data, 8122, 913, 768) + put(data, 8123, 902, 0) + put(data, 8124, 913, 837) + put(data, 8126, 953, 0) + put(data, 8129, 168, 834) + put(data, 8130, 8052, 837) + put(data, 8131, 951, 837) + put(data, 8132, 942, 837) + put(data, 8134, 951, 834) + put(data, 8135, 8134, 837) + put(data, 8136, 917, 768) + put(data, 8137, 904, 0) + put(data, 8138, 919, 768) + put(data, 8139, 905, 0) + put(data, 8140, 919, 837) + put(data, 8141, 8127, 768) + put(data, 8142, 8127, 769) + put(data, 8143, 8127, 834) + put(data, 8144, 953, 774) + put(data, 8145, 953, 772) + put(data, 8146, 970, 768) + put(data, 8147, 912, 0) + put(data, 8150, 953, 834) + put(data, 8151, 970, 834) + put(data, 8152, 921, 774) + put(data, 8153, 921, 772) + put(data, 8154, 921, 768) + put(data, 8155, 906, 0) + put(data, 8157, 8190, 768) + put(data, 8158, 8190, 769) + put(data, 8159, 8190, 834) + put(data, 8160, 965, 774) + put(data, 8161, 965, 772) + put(data, 8162, 971, 768) + put(data, 8163, 944, 0) + put(data, 8164, 961, 787) + put(data, 8165, 961, 788) + put(data, 8166, 965, 834) + put(data, 8167, 971, 834) + put(data, 8168, 933, 774) + put(data, 8169, 933, 772) + put(data, 8170, 933, 768) + put(data, 8171, 910, 0) + put(data, 8172, 929, 788) + put(data, 8173, 168, 768) + put(data, 8174, 901, 0) + put(data, 8175, 96, 0) + put(data, 8178, 8060, 837) + put(data, 8179, 969, 837) + put(data, 8180, 974, 837) + put(data, 8182, 969, 834) + put(data, 8183, 8182, 837) + put(data, 8184, 927, 768) + put(data, 8185, 908, 0) + put(data, 8186, 937, 768) + put(data, 8187, 911, 0) + put(data, 8188, 937, 837) + put(data, 8189, 180, 0) + put(data, 8192, 8194, 0) + put(data, 8193, 8195, 0) + put(data, 8486, 937, 0) + put(data, 8490, 75, 0) + put(data, 8491, 197, 0) + put(data, 8602, 8592, 824) + put(data, 8603, 8594, 824) + put(data, 8622, 8596, 824) + put(data, 8653, 8656, 824) + put(data, 8654, 8660, 824) + put(data, 8655, 8658, 824) + put(data, 8708, 8707, 824) + put(data, 8713, 8712, 824) + put(data, 8716, 8715, 824) + put(data, 8740, 8739, 824) + put(data, 8742, 8741, 824) + put(data, 8769, 8764, 824) + put(data, 8772, 8771, 824) + put(data, 8775, 8773, 824) + put(data, 8777, 8776, 824) + put(data, 8800, 61, 824) + put(data, 8802, 8801, 824) + put(data, 8813, 8781, 824) + put(data, 8814, 60, 824) + put(data, 8815, 62, 824) + put(data, 8816, 8804, 824) + put(data, 8817, 8805, 824) + put(data, 8820, 8818, 824) + put(data, 8821, 8819, 824) + put(data, 8824, 8822, 824) + put(data, 8825, 8823, 824) + put(data, 8832, 8826, 824) + put(data, 8833, 8827, 824) + put(data, 8836, 8834, 824) + put(data, 8837, 8835, 824) + put(data, 8840, 8838, 824) + put(data, 8841, 8839, 824) + put(data, 8876, 8866, 824) + put(data, 8877, 8872, 824) + put(data, 8878, 8873, 824) + put(data, 8879, 8875, 824) + put(data, 8928, 8828, 824) + put(data, 8929, 8829, 824) + put(data, 8930, 8849, 824) + put(data, 8931, 8850, 824) + put(data, 8938, 8882, 824) + put(data, 8939, 8883, 824) + put(data, 8940, 8884, 824) + put(data, 8941, 8885, 824) + put(data, 9001, 12296, 0) + put(data, 9002, 12297, 0) + put(data, 10972, 10973, 824) + put(data, 12364, 12363, 12441) + put(data, 12366, 12365, 12441) + put(data, 12368, 12367, 12441) + put(data, 12370, 12369, 12441) + put(data, 12372, 12371, 12441) + put(data, 12374, 12373, 12441) + put(data, 12376, 12375, 12441) + put(data, 12378, 12377, 12441) + put(data, 12380, 12379, 12441) + put(data, 12382, 12381, 12441) + put(data, 12384, 12383, 12441) + put(data, 12386, 12385, 12441) + put(data, 12389, 12388, 12441) + put(data, 12391, 12390, 12441) + put(data, 12393, 12392, 12441) + put(data, 12400, 12399, 12441) + put(data, 12401, 12399, 12442) + put(data, 12403, 12402, 12441) + put(data, 12404, 12402, 12442) + put(data, 12406, 12405, 12441) + put(data, 12407, 12405, 12442) + put(data, 12409, 12408, 12441) + put(data, 12410, 12408, 12442) + put(data, 12412, 12411, 12441) + put(data, 12413, 12411, 12442) + put(data, 12436, 12358, 12441) + put(data, 12446, 12445, 12441) + put(data, 12460, 12459, 12441) + put(data, 12462, 12461, 12441) + put(data, 12464, 12463, 12441) + put(data, 12466, 12465, 12441) + put(data, 12468, 12467, 12441) + put(data, 12470, 12469, 12441) + put(data, 12472, 12471, 12441) + put(data, 12474, 12473, 12441) + put(data, 12476, 12475, 12441) + put(data, 12478, 12477, 12441) + put(data, 12480, 12479, 12441) + put(data, 12482, 12481, 12441) + put(data, 12485, 12484, 12441) + put(data, 12487, 12486, 12441) + put(data, 12489, 12488, 12441) + put(data, 12496, 12495, 12441) + put(data, 12497, 12495, 12442) + put(data, 12499, 12498, 12441) + put(data, 12500, 12498, 12442) + put(data, 12502, 12501, 12441) + put(data, 12503, 12501, 12442) + put(data, 12505, 12504, 12441) + put(data, 12506, 12504, 12442) + put(data, 12508, 12507, 12441) + put(data, 12509, 12507, 12442) + put(data, 12532, 12454, 12441) + put(data, 12535, 12527, 12441) + put(data, 12536, 12528, 12441) + put(data, 12537, 12529, 12441) + put(data, 12538, 12530, 12441) + put(data, 12542, 12541, 12441) + put(data, 63744, 35912, 0) + put(data, 63745, 26356, 0) + put(data, 63746, 36554, 0) + put(data, 63747, 36040, 0) + put(data, 63748, 28369, 0) + put(data, 63749, 20018, 0) + put(data, 63750, 21477, 0) + put(data, 63751, 40860, 0) + put(data, 63752, 40860, 0) + put(data, 63753, 22865, 0) + put(data, 63754, 37329, 0) + put(data, 63755, 21895, 0) + put(data, 63756, 22856, 0) + put(data, 63757, 25078, 0) + put(data, 63758, 30313, 0) + put(data, 63759, 32645, 0) + put(data, 63760, 34367, 0) + put(data, 63761, 34746, 0) + put(data, 63762, 35064, 0) + put(data, 63763, 37007, 0) + put(data, 63764, 27138, 0) + put(data, 63765, 27931, 0) + put(data, 63766, 28889, 0) + put(data, 63767, 29662, 0) + put(data, 63768, 33853, 0) + put(data, 63769, 37226, 0) + put(data, 63770, 39409, 0) + put(data, 63771, 20098, 0) + put(data, 63772, 21365, 0) + put(data, 63773, 27396, 0) + put(data, 63774, 29211, 0) + put(data, 63775, 34349, 0) + put(data, 63776, 40478, 0) + put(data, 63777, 23888, 0) + put(data, 63778, 28651, 0) + put(data, 63779, 34253, 0) + put(data, 63780, 35172, 0) + put(data, 63781, 25289, 0) + put(data, 63782, 33240, 0) + put(data, 63783, 34847, 0) + put(data, 63784, 24266, 0) + put(data, 63785, 26391, 0) + put(data, 63786, 28010, 0) + put(data, 63787, 29436, 0) + put(data, 63788, 37070, 0) + put(data, 63789, 20358, 0) + put(data, 63790, 20919, 0) + put(data, 63791, 21214, 0) + put(data, 63792, 25796, 0) + put(data, 63793, 27347, 0) + put(data, 63794, 29200, 0) + put(data, 63795, 30439, 0) + put(data, 63796, 32769, 0) + put(data, 63797, 34310, 0) + put(data, 63798, 34396, 0) + put(data, 63799, 36335, 0) + put(data, 63800, 38706, 0) + put(data, 63801, 39791, 0) + put(data, 63802, 40442, 0) + put(data, 63803, 30860, 0) + put(data, 63804, 31103, 0) + put(data, 63805, 32160, 0) + put(data, 63806, 33737, 0) + put(data, 63807, 37636, 0) + put(data, 63808, 40575, 0) + put(data, 63809, 35542, 0) + put(data, 63810, 22751, 0) + put(data, 63811, 24324, 0) + put(data, 63812, 31840, 0) + put(data, 63813, 32894, 0) + put(data, 63814, 29282, 0) + put(data, 63815, 30922, 0) + put(data, 63816, 36034, 0) + put(data, 63817, 38647, 0) + put(data, 63818, 22744, 0) + put(data, 63819, 23650, 0) + put(data, 63820, 27155, 0) + put(data, 63821, 28122, 0) + put(data, 63822, 28431, 0) + put(data, 63823, 32047, 0) + put(data, 63824, 32311, 0) + put(data, 63825, 38475, 0) + put(data, 63826, 21202, 0) + put(data, 63827, 32907, 0) + put(data, 63828, 20956, 0) + put(data, 63829, 20940, 0) + put(data, 63830, 31260, 0) + put(data, 63831, 32190, 0) + put(data, 63832, 33777, 0) + put(data, 63833, 38517, 0) + put(data, 63834, 35712, 0) + put(data, 63835, 25295, 0) + put(data, 63836, 27138, 0) + put(data, 63837, 35582, 0) + put(data, 63838, 20025, 0) + put(data, 63839, 23527, 0) + put(data, 63840, 24594, 0) + put(data, 63841, 29575, 0) + put(data, 63842, 30064, 0) + put(data, 63843, 21271, 0) + put(data, 63844, 30971, 0) + put(data, 63845, 20415, 0) + put(data, 63846, 24489, 0) + put(data, 63847, 19981, 0) + put(data, 63848, 27852, 0) + put(data, 63849, 25976, 0) + put(data, 63850, 32034, 0) + put(data, 63851, 21443, 0) + put(data, 63852, 22622, 0) + put(data, 63853, 30465, 0) + put(data, 63854, 33865, 0) + put(data, 63855, 35498, 0) + put(data, 63856, 27578, 0) + put(data, 63857, 36784, 0) + put(data, 63858, 27784, 0) + put(data, 63859, 25342, 0) + put(data, 63860, 33509, 0) + put(data, 63861, 25504, 0) + put(data, 63862, 30053, 0) + put(data, 63863, 20142, 0) + put(data, 63864, 20841, 0) + put(data, 63865, 20937, 0) + put(data, 63866, 26753, 0) + put(data, 63867, 31975, 0) + put(data, 63868, 33391, 0) + put(data, 63869, 35538, 0) + put(data, 63870, 37327, 0) + put(data, 63871, 21237, 0) + put(data, 63872, 21570, 0) + put(data, 63873, 22899, 0) + put(data, 63874, 24300, 0) + put(data, 63875, 26053, 0) + put(data, 63876, 28670, 0) + put(data, 63877, 31018, 0) + put(data, 63878, 38317, 0) + put(data, 63879, 39530, 0) + put(data, 63880, 40599, 0) + put(data, 63881, 40654, 0) + put(data, 63882, 21147, 0) + put(data, 63883, 26310, 0) + put(data, 63884, 27511, 0) + put(data, 63885, 36706, 0) + put(data, 63886, 24180, 0) + put(data, 63887, 24976, 0) + put(data, 63888, 25088, 0) + put(data, 63889, 25754, 0) + put(data, 63890, 28451, 0) + put(data, 63891, 29001, 0) + put(data, 63892, 29833, 0) + put(data, 63893, 31178, 0) + put(data, 63894, 32244, 0) + put(data, 63895, 32879, 0) + put(data, 63896, 36646, 0) + put(data, 63897, 34030, 0) + put(data, 63898, 36899, 0) + put(data, 63899, 37706, 0) + put(data, 63900, 21015, 0) + put(data, 63901, 21155, 0) + put(data, 63902, 21693, 0) + put(data, 63903, 28872, 0) + put(data, 63904, 35010, 0) + put(data, 63905, 35498, 0) + put(data, 63906, 24265, 0) + put(data, 63907, 24565, 0) + put(data, 63908, 25467, 0) + put(data, 63909, 27566, 0) + put(data, 63910, 31806, 0) + put(data, 63911, 29557, 0) + put(data, 63912, 20196, 0) + put(data, 63913, 22265, 0) + put(data, 63914, 23527, 0) + put(data, 63915, 23994, 0) + put(data, 63916, 24604, 0) + put(data, 63917, 29618, 0) + put(data, 63918, 29801, 0) + put(data, 63919, 32666, 0) + put(data, 63920, 32838, 0) + put(data, 63921, 37428, 0) + put(data, 63922, 38646, 0) + put(data, 63923, 38728, 0) + put(data, 63924, 38936, 0) + put(data, 63925, 20363, 0) + put(data, 63926, 31150, 0) + put(data, 63927, 37300, 0) + put(data, 63928, 38584, 0) + put(data, 63929, 24801, 0) + put(data, 63930, 20102, 0) + put(data, 63931, 20698, 0) + put(data, 63932, 23534, 0) + put(data, 63933, 23615, 0) + put(data, 63934, 26009, 0) + put(data, 63935, 27138, 0) + put(data, 63936, 29134, 0) + put(data, 63937, 30274, 0) + put(data, 63938, 34044, 0) + put(data, 63939, 36988, 0) + put(data, 63940, 40845, 0) + put(data, 63941, 26248, 0) + put(data, 63942, 38446, 0) + put(data, 63943, 21129, 0) + put(data, 63944, 26491, 0) + put(data, 63945, 26611, 0) + put(data, 63946, 27969, 0) + put(data, 63947, 28316, 0) + put(data, 63948, 29705, 0) + put(data, 63949, 30041, 0) + put(data, 63950, 30827, 0) + put(data, 63951, 32016, 0) + put(data, 63952, 39006, 0) + put(data, 63953, 20845, 0) + put(data, 63954, 25134, 0) + put(data, 63955, 38520, 0) + put(data, 63956, 20523, 0) + put(data, 63957, 23833, 0) + put(data, 63958, 28138, 0) + put(data, 63959, 36650, 0) + put(data, 63960, 24459, 0) + put(data, 63961, 24900, 0) + put(data, 63962, 26647, 0) + put(data, 63963, 29575, 0) + put(data, 63964, 38534, 0) + put(data, 63965, 21033, 0) + put(data, 63966, 21519, 0) + put(data, 63967, 23653, 0) + put(data, 63968, 26131, 0) + put(data, 63969, 26446, 0) + put(data, 63970, 26792, 0) + put(data, 63971, 27877, 0) + put(data, 63972, 29702, 0) + put(data, 63973, 30178, 0) + put(data, 63974, 32633, 0) + put(data, 63975, 35023, 0) + put(data, 63976, 35041, 0) + put(data, 63977, 37324, 0) + put(data, 63978, 38626, 0) + put(data, 63979, 21311, 0) + put(data, 63980, 28346, 0) + put(data, 63981, 21533, 0) + put(data, 63982, 29136, 0) + put(data, 63983, 29848, 0) + put(data, 63984, 34298, 0) + put(data, 63985, 38563, 0) + put(data, 63986, 40023, 0) + put(data, 63987, 40607, 0) + put(data, 63988, 26519, 0) + put(data, 63989, 28107, 0) + put(data, 63990, 33256, 0) + put(data, 63991, 31435, 0) + put(data, 63992, 31520, 0) + put(data, 63993, 31890, 0) + put(data, 63994, 29376, 0) + put(data, 63995, 28825, 0) + put(data, 63996, 35672, 0) + put(data, 63997, 20160, 0) + put(data, 63998, 33590, 0) + put(data, 63999, 21050, 0) + put(data, 64000, 20999, 0) + put(data, 64001, 24230, 0) + put(data, 64002, 25299, 0) + put(data, 64003, 31958, 0) + put(data, 64004, 23429, 0) + put(data, 64005, 27934, 0) + put(data, 64006, 26292, 0) + put(data, 64007, 36667, 0) + put(data, 64008, 34892, 0) + put(data, 64009, 38477, 0) + put(data, 64010, 35211, 0) + put(data, 64011, 24275, 0) + put(data, 64012, 20800, 0) + put(data, 64013, 21952, 0) + put(data, 64016, 22618, 0) + put(data, 64018, 26228, 0) + put(data, 64021, 20958, 0) + put(data, 64022, 29482, 0) + put(data, 64023, 30410, 0) + put(data, 64024, 31036, 0) + put(data, 64025, 31070, 0) + put(data, 64026, 31077, 0) + put(data, 64027, 31119, 0) + put(data, 64028, 38742, 0) + put(data, 64029, 31934, 0) + put(data, 64030, 32701, 0) + put(data, 64032, 34322, 0) + put(data, 64034, 35576, 0) + put(data, 64037, 36920, 0) + put(data, 64038, 37117, 0) + put(data, 64042, 39151, 0) + put(data, 64043, 39164, 0) + put(data, 64044, 39208, 0) + put(data, 64045, 40372, 0) + put(data, 64046, 37086, 0) + put(data, 64047, 38583, 0) + put(data, 64048, 20398, 0) + put(data, 64049, 20711, 0) + put(data, 64050, 20813, 0) + put(data, 64051, 21193, 0) + put(data, 64052, 21220, 0) + put(data, 64053, 21329, 0) + put(data, 64054, 21917, 0) + put(data, 64055, 22022, 0) + put(data, 64056, 22120, 0) + put(data, 64057, 22592, 0) + put(data, 64058, 22696, 0) + put(data, 64059, 23652, 0) + put(data, 64060, 23662, 0) + put(data, 64061, 24724, 0) + put(data, 64062, 24936, 0) + put(data, 64063, 24974, 0) + put(data, 64064, 25074, 0) + put(data, 64065, 25935, 0) + put(data, 64066, 26082, 0) + put(data, 64067, 26257, 0) + put(data, 64068, 26757, 0) + put(data, 64069, 28023, 0) + put(data, 64070, 28186, 0) + put(data, 64071, 28450, 0) + put(data, 64072, 29038, 0) + put(data, 64073, 29227, 0) + put(data, 64074, 29730, 0) + put(data, 64075, 30865, 0) + put(data, 64076, 31038, 0) + put(data, 64077, 31049, 0) + put(data, 64078, 31048, 0) + put(data, 64079, 31056, 0) + put(data, 64080, 31062, 0) + put(data, 64081, 31069, 0) + put(data, 64082, 31117, 0) + put(data, 64083, 31118, 0) + put(data, 64084, 31296, 0) + put(data, 64085, 31361, 0) + put(data, 64086, 31680, 0) + put(data, 64087, 32244, 0) + put(data, 64088, 32265, 0) + put(data, 64089, 32321, 0) + put(data, 64090, 32626, 0) + put(data, 64091, 32773, 0) + put(data, 64092, 33261, 0) + put(data, 64093, 33401, 0) + put(data, 64094, 33401, 0) + put(data, 64095, 33879, 0) + put(data, 64096, 35088, 0) + put(data, 64097, 35222, 0) + put(data, 64098, 35585, 0) + put(data, 64099, 35641, 0) + put(data, 64100, 36051, 0) + put(data, 64101, 36104, 0) + put(data, 64102, 36790, 0) + put(data, 64103, 36920, 0) + put(data, 64104, 38627, 0) + put(data, 64105, 38911, 0) + put(data, 64106, 38971, 0) + put(data, 64107, 24693, 0) + put(data, 64108, 148206, 0) + put(data, 64109, 33304, 0) + put(data, 64112, 20006, 0) + put(data, 64113, 20917, 0) + put(data, 64114, 20840, 0) + put(data, 64115, 20352, 0) + put(data, 64116, 20805, 0) + put(data, 64117, 20864, 0) + put(data, 64118, 21191, 0) + put(data, 64119, 21242, 0) + put(data, 64120, 21917, 0) + put(data, 64121, 21845, 0) + put(data, 64122, 21913, 0) + put(data, 64123, 21986, 0) + put(data, 64124, 22618, 0) + put(data, 64125, 22707, 0) + put(data, 64126, 22852, 0) + put(data, 64127, 22868, 0) + put(data, 64128, 23138, 0) + put(data, 64129, 23336, 0) + put(data, 64130, 24274, 0) + put(data, 64131, 24281, 0) + put(data, 64132, 24425, 0) + put(data, 64133, 24493, 0) + put(data, 64134, 24792, 0) + put(data, 64135, 24910, 0) + put(data, 64136, 24840, 0) + put(data, 64137, 24974, 0) + put(data, 64138, 24928, 0) + put(data, 64139, 25074, 0) + put(data, 64140, 25140, 0) + put(data, 64141, 25540, 0) + put(data, 64142, 25628, 0) + put(data, 64143, 25682, 0) + put(data, 64144, 25942, 0) + put(data, 64145, 26228, 0) + put(data, 64146, 26391, 0) + put(data, 64147, 26395, 0) + put(data, 64148, 26454, 0) + put(data, 64149, 27513, 0) + put(data, 64150, 27578, 0) + put(data, 64151, 27969, 0) + put(data, 64152, 28379, 0) + put(data, 64153, 28363, 0) + put(data, 64154, 28450, 0) + put(data, 64155, 28702, 0) + put(data, 64156, 29038, 0) + put(data, 64157, 30631, 0) + put(data, 64158, 29237, 0) + put(data, 64159, 29359, 0) + put(data, 64160, 29482, 0) + put(data, 64161, 29809, 0) + put(data, 64162, 29958, 0) + put(data, 64163, 30011, 0) + put(data, 64164, 30237, 0) + put(data, 64165, 30239, 0) + put(data, 64166, 30410, 0) + put(data, 64167, 30427, 0) + put(data, 64168, 30452, 0) + put(data, 64169, 30538, 0) + put(data, 64170, 30528, 0) + put(data, 64171, 30924, 0) + put(data, 64172, 31409, 0) + put(data, 64173, 31680, 0) + put(data, 64174, 31867, 0) + put(data, 64175, 32091, 0) + put(data, 64176, 32244, 0) + put(data, 64177, 32574, 0) + put(data, 64178, 32773, 0) + put(data, 64179, 33618, 0) + put(data, 64180, 33775, 0) + put(data, 64181, 34681, 0) + put(data, 64182, 35137, 0) + put(data, 64183, 35206, 0) + put(data, 64184, 35222, 0) + put(data, 64185, 35519, 0) + put(data, 64186, 35576, 0) + put(data, 64187, 35531, 0) + put(data, 64188, 35585, 0) + put(data, 64189, 35582, 0) + put(data, 64190, 35565, 0) + put(data, 64191, 35641, 0) + put(data, 64192, 35722, 0) + put(data, 64193, 36104, 0) + put(data, 64194, 36664, 0) + put(data, 64195, 36978, 0) + put(data, 64196, 37273, 0) + put(data, 64197, 37494, 0) + put(data, 64198, 38524, 0) + put(data, 64199, 38627, 0) + put(data, 64200, 38742, 0) + put(data, 64201, 38875, 0) + put(data, 64202, 38911, 0) + put(data, 64203, 38923, 0) + put(data, 64204, 38971, 0) + put(data, 64205, 39698, 0) + put(data, 64206, 40860, 0) + put(data, 64207, 141386, 0) + put(data, 64208, 141380, 0) + put(data, 64209, 144341, 0) + put(data, 64210, 15261, 0) + put(data, 64211, 16408, 0) + put(data, 64212, 16441, 0) + put(data, 64213, 152137, 0) + put(data, 64214, 154832, 0) + put(data, 64215, 163539, 0) + put(data, 64216, 40771, 0) + put(data, 64217, 40846, 0) + put(data, 64285, 1497, 1460) + put(data, 64287, 1522, 1463) + put(data, 64298, 1513, 1473) + put(data, 64299, 1513, 1474) + put(data, 64300, 64329, 1473) + put(data, 64301, 64329, 1474) + put(data, 64302, 1488, 1463) + put(data, 64303, 1488, 1464) + put(data, 64304, 1488, 1468) + put(data, 64305, 1489, 1468) + put(data, 64306, 1490, 1468) + put(data, 64307, 1491, 1468) + put(data, 64308, 1492, 1468) + put(data, 64309, 1493, 1468) + put(data, 64310, 1494, 1468) + put(data, 64312, 1496, 1468) + put(data, 64313, 1497, 1468) + put(data, 64314, 1498, 1468) + put(data, 64315, 1499, 1468) + put(data, 64316, 1500, 1468) + put(data, 64318, 1502, 1468) + put(data, 64320, 1504, 1468) + put(data, 64321, 1505, 1468) + put(data, 64323, 1507, 1468) + put(data, 64324, 1508, 1468) + put(data, 64326, 1510, 1468) + put(data, 64327, 1511, 1468) + put(data, 64328, 1512, 1468) + put(data, 64329, 1513, 1468) + put(data, 64330, 1514, 1468) + put(data, 64331, 1493, 1465) + put(data, 64332, 1489, 1471) + put(data, 64333, 1499, 1471) + put(data, 64334, 1508, 1471) + put(data, 69786, 69785, 69818) + put(data, 69788, 69787, 69818) + put(data, 69803, 69797, 69818) + put(data, 69934, 69937, 69927) + put(data, 69935, 69938, 69927) + put(data, 70475, 70471, 70462) + put(data, 70476, 70471, 70487) + put(data, 70843, 70841, 70842) + put(data, 70844, 70841, 70832) + put(data, 70846, 70841, 70845) + put(data, 71098, 71096, 71087) + put(data, 71099, 71097, 71087) + put(data, 71992, 71989, 71984) + put(data, 119134, 119127, 119141) + put(data, 119135, 119128, 119141) + put(data, 119136, 119135, 119150) + put(data, 119137, 119135, 119151) + put(data, 119138, 119135, 119152) + put(data, 119139, 119135, 119153) + put(data, 119140, 119135, 119154) + put(data, 119227, 119225, 119141) + put(data, 119228, 119226, 119141) + put(data, 119229, 119227, 119150) + put(data, 119230, 119228, 119150) + put(data, 119231, 119227, 119151) + put(data, 119232, 119228, 119151) + put(data, 194560, 20029, 0) + put(data, 194561, 20024, 0) + put(data, 194562, 20033, 0) + put(data, 194563, 131362, 0) + put(data, 194564, 20320, 0) + put(data, 194565, 20398, 0) + put(data, 194566, 20411, 0) + put(data, 194567, 20482, 0) + put(data, 194568, 20602, 0) + put(data, 194569, 20633, 0) + put(data, 194570, 20711, 0) + put(data, 194571, 20687, 0) + put(data, 194572, 13470, 0) + put(data, 194573, 132666, 0) + put(data, 194574, 20813, 0) + put(data, 194575, 20820, 0) + put(data, 194576, 20836, 0) + put(data, 194577, 20855, 0) + put(data, 194578, 132380, 0) + put(data, 194579, 13497, 0) + put(data, 194580, 20839, 0) + put(data, 194581, 20877, 0) + put(data, 194582, 132427, 0) + put(data, 194583, 20887, 0) + put(data, 194584, 20900, 0) + put(data, 194585, 20172, 0) + put(data, 194586, 20908, 0) + put(data, 194587, 20917, 0) + put(data, 194588, 168415, 0) + put(data, 194589, 20981, 0) + put(data, 194590, 20995, 0) + put(data, 194591, 13535, 0) + put(data, 194592, 21051, 0) + put(data, 194593, 21062, 0) + put(data, 194594, 21106, 0) + put(data, 194595, 21111, 0) + put(data, 194596, 13589, 0) + put(data, 194597, 21191, 0) + put(data, 194598, 21193, 0) + put(data, 194599, 21220, 0) + put(data, 194600, 21242, 0) + put(data, 194601, 21253, 0) + put(data, 194602, 21254, 0) + put(data, 194603, 21271, 0) + put(data, 194604, 21321, 0) + put(data, 194605, 21329, 0) + put(data, 194606, 21338, 0) + put(data, 194607, 21363, 0) + put(data, 194608, 21373, 0) + put(data, 194609, 21375, 0) + put(data, 194610, 21375, 0) + put(data, 194611, 21375, 0) + put(data, 194612, 133676, 0) + put(data, 194613, 28784, 0) + put(data, 194614, 21450, 0) + put(data, 194615, 21471, 0) + put(data, 194616, 133987, 0) + put(data, 194617, 21483, 0) + put(data, 194618, 21489, 0) + put(data, 194619, 21510, 0) + put(data, 194620, 21662, 0) + put(data, 194621, 21560, 0) + put(data, 194622, 21576, 0) + put(data, 194623, 21608, 0) + put(data, 194624, 21666, 0) + put(data, 194625, 21750, 0) + put(data, 194626, 21776, 0) + put(data, 194627, 21843, 0) + put(data, 194628, 21859, 0) + put(data, 194629, 21892, 0) + put(data, 194630, 21892, 0) + put(data, 194631, 21913, 0) + put(data, 194632, 21931, 0) + put(data, 194633, 21939, 0) + put(data, 194634, 21954, 0) + put(data, 194635, 22294, 0) + put(data, 194636, 22022, 0) + put(data, 194637, 22295, 0) + put(data, 194638, 22097, 0) + put(data, 194639, 22132, 0) + put(data, 194640, 20999, 0) + put(data, 194641, 22766, 0) + put(data, 194642, 22478, 0) + put(data, 194643, 22516, 0) + put(data, 194644, 22541, 0) + put(data, 194645, 22411, 0) + put(data, 194646, 22578, 0) + put(data, 194647, 22577, 0) + put(data, 194648, 22700, 0) + put(data, 194649, 136420, 0) + put(data, 194650, 22770, 0) + put(data, 194651, 22775, 0) + put(data, 194652, 22790, 0) + put(data, 194653, 22810, 0) + put(data, 194654, 22818, 0) + put(data, 194655, 22882, 0) + put(data, 194656, 136872, 0) + put(data, 194657, 136938, 0) + put(data, 194658, 23020, 0) + put(data, 194659, 23067, 0) + put(data, 194660, 23079, 0) + put(data, 194661, 23000, 0) + put(data, 194662, 23142, 0) + put(data, 194663, 14062, 0) + put(data, 194664, 14076, 0) + put(data, 194665, 23304, 0) + put(data, 194666, 23358, 0) + put(data, 194667, 23358, 0) + put(data, 194668, 137672, 0) + put(data, 194669, 23491, 0) + put(data, 194670, 23512, 0) + put(data, 194671, 23527, 0) + put(data, 194672, 23539, 0) + put(data, 194673, 138008, 0) + put(data, 194674, 23551, 0) + put(data, 194675, 23558, 0) + put(data, 194676, 24403, 0) + put(data, 194677, 23586, 0) + put(data, 194678, 14209, 0) + put(data, 194679, 23648, 0) + put(data, 194680, 23662, 0) + put(data, 194681, 23744, 0) + put(data, 194682, 23693, 0) + put(data, 194683, 138724, 0) + put(data, 194684, 23875, 0) + put(data, 194685, 138726, 0) + put(data, 194686, 23918, 0) + put(data, 194687, 23915, 0) + put(data, 194688, 23932, 0) + put(data, 194689, 24033, 0) + put(data, 194690, 24034, 0) + put(data, 194691, 14383, 0) + put(data, 194692, 24061, 0) + put(data, 194693, 24104, 0) + put(data, 194694, 24125, 0) + put(data, 194695, 24169, 0) + put(data, 194696, 14434, 0) + put(data, 194697, 139651, 0) + put(data, 194698, 14460, 0) + put(data, 194699, 24240, 0) + put(data, 194700, 24243, 0) + put(data, 194701, 24246, 0) + put(data, 194702, 24266, 0) + put(data, 194703, 172946, 0) + put(data, 194704, 24318, 0) + put(data, 194705, 140081, 0) + put(data, 194706, 140081, 0) + put(data, 194707, 33281, 0) + put(data, 194708, 24354, 0) + put(data, 194709, 24354, 0) + put(data, 194710, 14535, 0) + put(data, 194711, 144056, 0) + put(data, 194712, 156122, 0) + put(data, 194713, 24418, 0) + put(data, 194714, 24427, 0) + put(data, 194715, 14563, 0) + put(data, 194716, 24474, 0) + put(data, 194717, 24525, 0) + put(data, 194718, 24535, 0) + put(data, 194719, 24569, 0) + put(data, 194720, 24705, 0) + put(data, 194721, 14650, 0) + put(data, 194722, 14620, 0) + put(data, 194723, 24724, 0) + put(data, 194724, 141012, 0) + put(data, 194725, 24775, 0) + put(data, 194726, 24904, 0) + put(data, 194727, 24908, 0) + put(data, 194728, 24910, 0) + put(data, 194729, 24908, 0) + put(data, 194730, 24954, 0) + put(data, 194731, 24974, 0) + put(data, 194732, 25010, 0) + put(data, 194733, 24996, 0) + put(data, 194734, 25007, 0) + put(data, 194735, 25054, 0) + put(data, 194736, 25074, 0) + put(data, 194737, 25078, 0) + put(data, 194738, 25104, 0) + put(data, 194739, 25115, 0) + put(data, 194740, 25181, 0) + put(data, 194741, 25265, 0) + put(data, 194742, 25300, 0) + put(data, 194743, 25424, 0) + put(data, 194744, 142092, 0) + put(data, 194745, 25405, 0) + put(data, 194746, 25340, 0) + put(data, 194747, 25448, 0) + put(data, 194748, 25475, 0) + put(data, 194749, 25572, 0) + put(data, 194750, 142321, 0) + put(data, 194751, 25634, 0) + put(data, 194752, 25541, 0) + put(data, 194753, 25513, 0) + put(data, 194754, 14894, 0) + put(data, 194755, 25705, 0) + put(data, 194756, 25726, 0) + put(data, 194757, 25757, 0) + put(data, 194758, 25719, 0) + put(data, 194759, 14956, 0) + put(data, 194760, 25935, 0) + put(data, 194761, 25964, 0) + put(data, 194762, 143370, 0) + put(data, 194763, 26083, 0) + put(data, 194764, 26360, 0) + put(data, 194765, 26185, 0) + put(data, 194766, 15129, 0) + put(data, 194767, 26257, 0) + put(data, 194768, 15112, 0) + put(data, 194769, 15076, 0) + put(data, 194770, 20882, 0) + put(data, 194771, 20885, 0) + put(data, 194772, 26368, 0) + put(data, 194773, 26268, 0) + put(data, 194774, 32941, 0) + put(data, 194775, 17369, 0) + put(data, 194776, 26391, 0) + put(data, 194777, 26395, 0) + put(data, 194778, 26401, 0) + put(data, 194779, 26462, 0) + put(data, 194780, 26451, 0) + put(data, 194781, 144323, 0) + put(data, 194782, 15177, 0) + put(data, 194783, 26618, 0) + put(data, 194784, 26501, 0) + put(data, 194785, 26706, 0) + put(data, 194786, 26757, 0) + put(data, 194787, 144493, 0) + put(data, 194788, 26766, 0) + put(data, 194789, 26655, 0) + put(data, 194790, 26900, 0) + put(data, 194791, 15261, 0) + put(data, 194792, 26946, 0) + put(data, 194793, 27043, 0) + put(data, 194794, 27114, 0) + put(data, 194795, 27304, 0) + put(data, 194796, 145059, 0) + put(data, 194797, 27355, 0) + put(data, 194798, 15384, 0) + put(data, 194799, 27425, 0) + put(data, 194800, 145575, 0) + put(data, 194801, 27476, 0) + put(data, 194802, 15438, 0) + put(data, 194803, 27506, 0) + put(data, 194804, 27551, 0) + put(data, 194805, 27578, 0) + put(data, 194806, 27579, 0) + put(data, 194807, 146061, 0) + put(data, 194808, 138507, 0) + put(data, 194809, 146170, 0) + put(data, 194810, 27726, 0) + put(data, 194811, 146620, 0) + put(data, 194812, 27839, 0) + put(data, 194813, 27853, 0) + put(data, 194814, 27751, 0) + put(data, 194815, 27926, 0) + put(data, 194816, 27966, 0) + put(data, 194817, 28023, 0) + put(data, 194818, 27969, 0) + put(data, 194819, 28009, 0) + put(data, 194820, 28024, 0) + put(data, 194821, 28037, 0) + put(data, 194822, 146718, 0) + put(data, 194823, 27956, 0) + put(data, 194824, 28207, 0) + put(data, 194825, 28270, 0) + put(data, 194826, 15667, 0) + put(data, 194827, 28363, 0) + put(data, 194828, 28359, 0) + put(data, 194829, 147153, 0) + put(data, 194830, 28153, 0) + put(data, 194831, 28526, 0) + put(data, 194832, 147294, 0) + put(data, 194833, 147342, 0) + put(data, 194834, 28614, 0) + put(data, 194835, 28729, 0) + put(data, 194836, 28702, 0) + put(data, 194837, 28699, 0) + put(data, 194838, 15766, 0) + put(data, 194839, 28746, 0) + put(data, 194840, 28797, 0) + put(data, 194841, 28791, 0) + put(data, 194842, 28845, 0) + put(data, 194843, 132389, 0) + put(data, 194844, 28997, 0) + put(data, 194845, 148067, 0) + put(data, 194846, 29084, 0) + put(data, 194847, 148395, 0) + put(data, 194848, 29224, 0) + put(data, 194849, 29237, 0) + put(data, 194850, 29264, 0) + put(data, 194851, 149000, 0) + put(data, 194852, 29312, 0) + put(data, 194853, 29333, 0) + put(data, 194854, 149301, 0) + put(data, 194855, 149524, 0) + put(data, 194856, 29562, 0) + put(data, 194857, 29579, 0) + put(data, 194858, 16044, 0) + put(data, 194859, 29605, 0) + put(data, 194860, 16056, 0) + put(data, 194861, 16056, 0) + put(data, 194862, 29767, 0) + put(data, 194863, 29788, 0) + put(data, 194864, 29809, 0) + put(data, 194865, 29829, 0) + put(data, 194866, 29898, 0) + put(data, 194867, 16155, 0) + put(data, 194868, 29988, 0) + put(data, 194869, 150582, 0) + put(data, 194870, 30014, 0) + put(data, 194871, 150674, 0) + put(data, 194872, 30064, 0) + put(data, 194873, 139679, 0) + put(data, 194874, 30224, 0) + put(data, 194875, 151457, 0) + put(data, 194876, 151480, 0) + put(data, 194877, 151620, 0) + put(data, 194878, 16380, 0) + put(data, 194879, 16392, 0) + put(data, 194880, 30452, 0) + put(data, 194881, 151795, 0) + put(data, 194882, 151794, 0) + put(data, 194883, 151833, 0) + put(data, 194884, 151859, 0) + put(data, 194885, 30494, 0) + put(data, 194886, 30495, 0) + put(data, 194887, 30495, 0) + put(data, 194888, 30538, 0) + put(data, 194889, 16441, 0) + put(data, 194890, 30603, 0) + put(data, 194891, 16454, 0) + put(data, 194892, 16534, 0) + put(data, 194893, 152605, 0) + put(data, 194894, 30798, 0) + put(data, 194895, 30860, 0) + put(data, 194896, 30924, 0) + put(data, 194897, 16611, 0) + put(data, 194898, 153126, 0) + put(data, 194899, 31062, 0) + put(data, 194900, 153242, 0) + put(data, 194901, 153285, 0) + put(data, 194902, 31119, 0) + put(data, 194903, 31211, 0) + put(data, 194904, 16687, 0) + put(data, 194905, 31296, 0) + put(data, 194906, 31306, 0) + put(data, 194907, 31311, 0) + put(data, 194908, 153980, 0) + put(data, 194909, 154279, 0) + put(data, 194910, 154279, 0) + put(data, 194911, 31470, 0) + put(data, 194912, 16898, 0) + put(data, 194913, 154539, 0) + put(data, 194914, 31686, 0) + put(data, 194915, 31689, 0) + put(data, 194916, 16935, 0) + put(data, 194917, 154752, 0) + put(data, 194918, 31954, 0) + put(data, 194919, 17056, 0) + put(data, 194920, 31976, 0) + put(data, 194921, 31971, 0) + put(data, 194922, 32000, 0) + put(data, 194923, 155526, 0) + put(data, 194924, 32099, 0) + put(data, 194925, 17153, 0) + put(data, 194926, 32199, 0) + put(data, 194927, 32258, 0) + put(data, 194928, 32325, 0) + put(data, 194929, 17204, 0) + put(data, 194930, 156200, 0) + put(data, 194931, 156231, 0) + put(data, 194932, 17241, 0) + put(data, 194933, 156377, 0) + put(data, 194934, 32634, 0) + put(data, 194935, 156478, 0) + put(data, 194936, 32661, 0) + put(data, 194937, 32762, 0) + put(data, 194938, 32773, 0) + put(data, 194939, 156890, 0) + put(data, 194940, 156963, 0) + put(data, 194941, 32864, 0) + put(data, 194942, 157096, 0) + put(data, 194943, 32880, 0) + put(data, 194944, 144223, 0) + put(data, 194945, 17365, 0) + put(data, 194946, 32946, 0) + put(data, 194947, 33027, 0) + put(data, 194948, 17419, 0) + put(data, 194949, 33086, 0) + put(data, 194950, 23221, 0) + put(data, 194951, 157607, 0) + put(data, 194952, 157621, 0) + put(data, 194953, 144275, 0) + put(data, 194954, 144284, 0) + put(data, 194955, 33281, 0) + put(data, 194956, 33284, 0) + put(data, 194957, 36766, 0) + put(data, 194958, 17515, 0) + put(data, 194959, 33425, 0) + put(data, 194960, 33419, 0) + put(data, 194961, 33437, 0) + put(data, 194962, 21171, 0) + put(data, 194963, 33457, 0) + put(data, 194964, 33459, 0) + put(data, 194965, 33469, 0) + put(data, 194966, 33510, 0) + put(data, 194967, 158524, 0) + put(data, 194968, 33509, 0) + put(data, 194969, 33565, 0) + put(data, 194970, 33635, 0) + put(data, 194971, 33709, 0) + put(data, 194972, 33571, 0) + put(data, 194973, 33725, 0) + put(data, 194974, 33767, 0) + put(data, 194975, 33879, 0) + put(data, 194976, 33619, 0) + put(data, 194977, 33738, 0) + put(data, 194978, 33740, 0) + put(data, 194979, 33756, 0) + put(data, 194980, 158774, 0) + put(data, 194981, 159083, 0) + put(data, 194982, 158933, 0) + put(data, 194983, 17707, 0) + put(data, 194984, 34033, 0) + put(data, 194985, 34035, 0) + put(data, 194986, 34070, 0) + put(data, 194987, 160714, 0) + put(data, 194988, 34148, 0) + put(data, 194989, 159532, 0) + put(data, 194990, 17757, 0) + put(data, 194991, 17761, 0) + put(data, 194992, 159665, 0) + put(data, 194993, 159954, 0) + put(data, 194994, 17771, 0) + put(data, 194995, 34384, 0) + put(data, 194996, 34396, 0) + put(data, 194997, 34407, 0) + put(data, 194998, 34409, 0) + put(data, 194999, 34473, 0) + put(data, 195000, 34440, 0) + put(data, 195001, 34574, 0) + put(data, 195002, 34530, 0) + put(data, 195003, 34681, 0) + put(data, 195004, 34600, 0) + put(data, 195005, 34667, 0) + put(data, 195006, 34694, 0) + put(data, 195007, 17879, 0) + put(data, 195008, 34785, 0) + put(data, 195009, 34817, 0) + put(data, 195010, 17913, 0) + put(data, 195011, 34912, 0) + put(data, 195012, 34915, 0) + put(data, 195013, 161383, 0) + put(data, 195014, 35031, 0) + put(data, 195015, 35038, 0) + put(data, 195016, 17973, 0) + put(data, 195017, 35066, 0) + put(data, 195018, 13499, 0) + put(data, 195019, 161966, 0) + put(data, 195020, 162150, 0) + put(data, 195021, 18110, 0) + put(data, 195022, 18119, 0) + put(data, 195023, 35488, 0) + put(data, 195024, 35565, 0) + put(data, 195025, 35722, 0) + put(data, 195026, 35925, 0) + put(data, 195027, 162984, 0) + put(data, 195028, 36011, 0) + put(data, 195029, 36033, 0) + put(data, 195030, 36123, 0) + put(data, 195031, 36215, 0) + put(data, 195032, 163631, 0) + put(data, 195033, 133124, 0) + put(data, 195034, 36299, 0) + put(data, 195035, 36284, 0) + put(data, 195036, 36336, 0) + put(data, 195037, 133342, 0) + put(data, 195038, 36564, 0) + put(data, 195039, 36664, 0) + put(data, 195040, 165330, 0) + put(data, 195041, 165357, 0) + put(data, 195042, 37012, 0) + put(data, 195043, 37105, 0) + put(data, 195044, 37137, 0) + put(data, 195045, 165678, 0) + put(data, 195046, 37147, 0) + put(data, 195047, 37432, 0) + put(data, 195048, 37591, 0) + put(data, 195049, 37592, 0) + put(data, 195050, 37500, 0) + put(data, 195051, 37881, 0) + put(data, 195052, 37909, 0) + put(data, 195053, 166906, 0) + put(data, 195054, 38283, 0) + put(data, 195055, 18837, 0) + put(data, 195056, 38327, 0) + put(data, 195057, 167287, 0) + put(data, 195058, 18918, 0) + put(data, 195059, 38595, 0) + put(data, 195060, 23986, 0) + put(data, 195061, 38691, 0) + put(data, 195062, 168261, 0) + put(data, 195063, 168474, 0) + put(data, 195064, 19054, 0) + put(data, 195065, 19062, 0) + put(data, 195066, 38880, 0) + put(data, 195067, 168970, 0) + put(data, 195068, 19122, 0) + put(data, 195069, 169110, 0) + put(data, 195070, 38923, 0) + put(data, 195071, 38923, 0) + put(data, 195072, 38953, 0) + put(data, 195073, 169398, 0) + put(data, 195074, 39138, 0) + put(data, 195075, 19251, 0) + put(data, 195076, 39209, 0) + put(data, 195077, 39335, 0) + put(data, 195078, 39362, 0) + put(data, 195079, 39422, 0) + put(data, 195080, 19406, 0) + put(data, 195081, 170800, 0) + put(data, 195082, 39698, 0) + put(data, 195083, 40000, 0) + put(data, 195084, 40189, 0) + put(data, 195085, 19662, 0) + put(data, 195086, 19693, 0) + put(data, 195087, 40295, 0) + put(data, 195088, 172238, 0) + put(data, 195089, 19704, 0) + put(data, 195090, 172293, 0) + put(data, 195091, 172558, 0) + put(data, 195092, 172689, 0) + put(data, 195093, 40635, 0) + put(data, 195094, 19798, 0) + put(data, 195095, 40697, 0) + put(data, 195096, 40702, 0) + put(data, 195097, 40709, 0) + put(data, 195098, 40719, 0) + put(data, 195099, 40726, 0) + put(data, 195100, 40763, 0) + put(data, 195101, 173568, 0) + data + end - private def self.fold_cases - @@fold_cases ||= begin - data = Hash(Int32, {Int32, Int32, Int32, Int32}).new(initial_capacity: 104) - put(data, 223, 115, 115, 0, 0) - put(data, 304, 105, 775, 0, 0) - put(data, 329, 700, 110, 0, 0) - put(data, 496, 106, 780, 0, 0) - put(data, 912, 953, 776, 769, 0) - put(data, 944, 965, 776, 769, 0) - put(data, 1415, 1381, 1410, 0, 0) - put(data, 7830, 104, 817, 0, 0) - put(data, 7831, 116, 776, 0, 0) - put(data, 7832, 119, 778, 0, 0) - put(data, 7833, 121, 778, 0, 0) - put(data, 7834, 97, 702, 0, 0) - put(data, 7838, 115, 115, 0, 0) - put(data, 8016, 965, 787, 0, 0) - put(data, 8018, 965, 787, 768, 0) - put(data, 8020, 965, 787, 769, 0) - put(data, 8022, 965, 787, 834, 0) - put(data, 8064, 7936, 953, 0, 0) - put(data, 8065, 7937, 953, 0, 0) - put(data, 8066, 7938, 953, 0, 0) - put(data, 8067, 7939, 953, 0, 0) - put(data, 8068, 7940, 953, 0, 0) - put(data, 8069, 7941, 953, 0, 0) - put(data, 8070, 7942, 953, 0, 0) - put(data, 8071, 7943, 953, 0, 0) - put(data, 8072, 7936, 953, 0, 0) - put(data, 8073, 7937, 953, 0, 0) - put(data, 8074, 7938, 953, 0, 0) - put(data, 8075, 7939, 953, 0, 0) - put(data, 8076, 7940, 953, 0, 0) - put(data, 8077, 7941, 953, 0, 0) - put(data, 8078, 7942, 953, 0, 0) - put(data, 8079, 7943, 953, 0, 0) - put(data, 8080, 7968, 953, 0, 0) - put(data, 8081, 7969, 953, 0, 0) - put(data, 8082, 7970, 953, 0, 0) - put(data, 8083, 7971, 953, 0, 0) - put(data, 8084, 7972, 953, 0, 0) - put(data, 8085, 7973, 953, 0, 0) - put(data, 8086, 7974, 953, 0, 0) - put(data, 8087, 7975, 953, 0, 0) - put(data, 8088, 7968, 953, 0, 0) - put(data, 8089, 7969, 953, 0, 0) - put(data, 8090, 7970, 953, 0, 0) - put(data, 8091, 7971, 953, 0, 0) - put(data, 8092, 7972, 953, 0, 0) - put(data, 8093, 7973, 953, 0, 0) - put(data, 8094, 7974, 953, 0, 0) - put(data, 8095, 7975, 953, 0, 0) - put(data, 8096, 8032, 953, 0, 0) - put(data, 8097, 8033, 953, 0, 0) - put(data, 8098, 8034, 953, 0, 0) - put(data, 8099, 8035, 953, 0, 0) - put(data, 8100, 8036, 953, 0, 0) - put(data, 8101, 8037, 953, 0, 0) - put(data, 8102, 8038, 953, 0, 0) - put(data, 8103, 8039, 953, 0, 0) - put(data, 8104, 8032, 953, 0, 0) - put(data, 8105, 8033, 953, 0, 0) - put(data, 8106, 8034, 953, 0, 0) - put(data, 8107, 8035, 953, 0, 0) - put(data, 8108, 8036, 953, 0, 0) - put(data, 8109, 8037, 953, 0, 0) - put(data, 8110, 8038, 953, 0, 0) - put(data, 8111, 8039, 953, 0, 0) - put(data, 8114, 8048, 953, 0, 0) - put(data, 8115, 945, 953, 0, 0) - put(data, 8116, 940, 953, 0, 0) - put(data, 8118, 945, 834, 0, 0) - put(data, 8119, 945, 834, 953, 0) - put(data, 8124, 945, 953, 0, 0) - put(data, 8130, 8052, 953, 0, 0) - put(data, 8131, 951, 953, 0, 0) - put(data, 8132, 942, 953, 0, 0) - put(data, 8134, 951, 834, 0, 0) - put(data, 8135, 951, 834, 953, 0) - put(data, 8140, 951, 953, 0, 0) - put(data, 8146, 953, 776, 768, 0) - put(data, 8147, 953, 776, 769, 0) - put(data, 8150, 953, 834, 0, 0) - put(data, 8151, 953, 776, 834, 0) - put(data, 8162, 965, 776, 768, 0) - put(data, 8163, 965, 776, 769, 0) - put(data, 8164, 961, 787, 0, 0) - put(data, 8166, 965, 834, 0, 0) - put(data, 8167, 965, 776, 834, 0) - put(data, 8178, 8060, 953, 0, 0) - put(data, 8179, 969, 953, 0, 0) - put(data, 8180, 974, 953, 0, 0) - put(data, 8182, 969, 834, 0, 0) - put(data, 8183, 969, 834, 953, 0) - put(data, 8188, 969, 953, 0, 0) - put(data, 64256, 102, 102, 0, 0) - put(data, 64257, 102, 105, 0, 0) - put(data, 64258, 102, 108, 0, 0) - put(data, 64259, 102, 102, 105, 0) - put(data, 64260, 102, 102, 108, 0) - put(data, 64261, 115, 116, 0, 0) - put(data, 64262, 115, 116, 0, 0) - put(data, 64275, 1396, 1398, 0, 0) - put(data, 64276, 1396, 1381, 0, 0) - put(data, 64277, 1396, 1387, 0, 0) - put(data, 64278, 1406, 1398, 0, 0) - put(data, 64279, 1396, 1389, 0, 0) - data - end + # Codepoints for compatibility decomposition mappings. + private class_getter compatibility_decomposition_data : Array(Int32) do + data = Array(Int32).new(3191) + put(data, 32) + put(data, 32) + put(data, 776) + put(data, 97) + put(data, 32) + put(data, 772) + put(data, 50) + put(data, 51) + put(data, 32) + put(data, 769) + put(data, 956) + put(data, 32) + put(data, 807) + put(data, 49) + put(data, 111) + put(data, 49) + put(data, 8260) + put(data, 52) + put(data, 49) + put(data, 8260) + put(data, 50) + put(data, 51) + put(data, 8260) + put(data, 52) + put(data, 73) + put(data, 74) + put(data, 105) + put(data, 106) + put(data, 76) + put(data, 183) + put(data, 108) + put(data, 183) + put(data, 700) + put(data, 110) + put(data, 115) + put(data, 68) + put(data, 381) + put(data, 68) + put(data, 382) + put(data, 100) + put(data, 382) + put(data, 76) + put(data, 74) + put(data, 76) + put(data, 106) + put(data, 108) + put(data, 106) + put(data, 78) + put(data, 74) + put(data, 78) + put(data, 106) + put(data, 110) + put(data, 106) + put(data, 68) + put(data, 90) + put(data, 68) + put(data, 122) + put(data, 100) + put(data, 122) + put(data, 104) + put(data, 614) + put(data, 114) + put(data, 633) + put(data, 635) + put(data, 641) + put(data, 119) + put(data, 121) + put(data, 32) + put(data, 774) + put(data, 32) + put(data, 775) + put(data, 32) + put(data, 778) + put(data, 32) + put(data, 808) + put(data, 32) + put(data, 771) + put(data, 32) + put(data, 779) + put(data, 611) + put(data, 120) + put(data, 661) + put(data, 32) + put(data, 837) + put(data, 946) + put(data, 952) + put(data, 933) + put(data, 966) + put(data, 960) + put(data, 954) + put(data, 961) + put(data, 962) + put(data, 920) + put(data, 949) + put(data, 931) + put(data, 1381) + put(data, 1410) + put(data, 1575) + put(data, 1652) + put(data, 1608) + put(data, 1652) + put(data, 1735) + put(data, 1652) + put(data, 1610) + put(data, 1652) + put(data, 3661) + put(data, 3634) + put(data, 3789) + put(data, 3762) + put(data, 3755) + put(data, 3737) + put(data, 3755) + put(data, 3745) + put(data, 3851) + put(data, 4018) + put(data, 3969) + put(data, 4019) + put(data, 3969) + put(data, 4316) + put(data, 65) + put(data, 198) + put(data, 66) + put(data, 69) + put(data, 398) + put(data, 71) + put(data, 72) + put(data, 75) + put(data, 77) + put(data, 79) + put(data, 546) + put(data, 80) + put(data, 82) + put(data, 84) + put(data, 85) + put(data, 87) + put(data, 592) + put(data, 593) + put(data, 7426) + put(data, 98) + put(data, 101) + put(data, 601) + put(data, 603) + put(data, 604) + put(data, 103) + put(data, 107) + put(data, 109) + put(data, 331) + put(data, 596) + put(data, 7446) + put(data, 7447) + put(data, 112) + put(data, 116) + put(data, 117) + put(data, 7453) + put(data, 623) + put(data, 118) + put(data, 7461) + put(data, 947) + put(data, 948) + put(data, 967) + put(data, 1085) + put(data, 594) + put(data, 99) + put(data, 597) + put(data, 240) + put(data, 102) + put(data, 607) + put(data, 609) + put(data, 613) + put(data, 616) + put(data, 617) + put(data, 618) + put(data, 7547) + put(data, 669) + put(data, 621) + put(data, 7557) + put(data, 671) + put(data, 625) + put(data, 624) + put(data, 626) + put(data, 627) + put(data, 628) + put(data, 629) + put(data, 632) + put(data, 642) + put(data, 643) + put(data, 427) + put(data, 649) + put(data, 650) + put(data, 7452) + put(data, 651) + put(data, 652) + put(data, 656) + put(data, 657) + put(data, 658) + put(data, 97) + put(data, 702) + put(data, 32) + put(data, 787) + put(data, 32) + put(data, 834) + put(data, 32) + put(data, 788) + put(data, 8208) + put(data, 32) + put(data, 819) + put(data, 46) + put(data, 46) + put(data, 46) + put(data, 8242) + put(data, 8242) + put(data, 8242) + put(data, 8242) + put(data, 8242) + put(data, 8245) + put(data, 8245) + put(data, 8245) + put(data, 8245) + put(data, 8245) + put(data, 33) + put(data, 33) + put(data, 32) + put(data, 773) + put(data, 63) + put(data, 63) + put(data, 63) + put(data, 33) + put(data, 33) + put(data, 63) + put(data, 48) + put(data, 53) + put(data, 54) + put(data, 55) + put(data, 56) + put(data, 57) + put(data, 43) + put(data, 8722) + put(data, 61) + put(data, 40) + put(data, 41) + put(data, 82) + put(data, 115) + put(data, 97) + put(data, 47) + put(data, 99) + put(data, 97) + put(data, 47) + put(data, 115) + put(data, 67) + put(data, 176) + put(data, 67) + put(data, 99) + put(data, 47) + put(data, 111) + put(data, 99) + put(data, 47) + put(data, 117) + put(data, 400) + put(data, 176) + put(data, 70) + put(data, 295) + put(data, 78) + put(data, 111) + put(data, 81) + put(data, 83) + put(data, 77) + put(data, 84) + put(data, 69) + put(data, 76) + put(data, 84) + put(data, 77) + put(data, 1488) + put(data, 1489) + put(data, 1490) + put(data, 1491) + put(data, 70) + put(data, 65) + put(data, 88) + put(data, 915) + put(data, 928) + put(data, 8721) + put(data, 49) + put(data, 8260) + put(data, 55) + put(data, 49) + put(data, 8260) + put(data, 57) + put(data, 49) + put(data, 8260) + put(data, 49) + put(data, 48) + put(data, 49) + put(data, 8260) + put(data, 51) + put(data, 50) + put(data, 8260) + put(data, 51) + put(data, 49) + put(data, 8260) + put(data, 53) + put(data, 50) + put(data, 8260) + put(data, 53) + put(data, 51) + put(data, 8260) + put(data, 53) + put(data, 52) + put(data, 8260) + put(data, 53) + put(data, 49) + put(data, 8260) + put(data, 54) + put(data, 53) + put(data, 8260) + put(data, 54) + put(data, 49) + put(data, 8260) + put(data, 56) + put(data, 51) + put(data, 8260) + put(data, 56) + put(data, 53) + put(data, 8260) + put(data, 56) + put(data, 55) + put(data, 8260) + put(data, 56) + put(data, 73) + put(data, 73) + put(data, 73) + put(data, 73) + put(data, 73) + put(data, 73) + put(data, 86) + put(data, 86) + put(data, 73) + put(data, 86) + put(data, 73) + put(data, 73) + put(data, 86) + put(data, 73) + put(data, 73) + put(data, 73) + put(data, 73) + put(data, 88) + put(data, 88) + put(data, 73) + put(data, 88) + put(data, 73) + put(data, 73) + put(data, 105) + put(data, 105) + put(data, 105) + put(data, 105) + put(data, 105) + put(data, 105) + put(data, 118) + put(data, 118) + put(data, 105) + put(data, 118) + put(data, 105) + put(data, 105) + put(data, 118) + put(data, 105) + put(data, 105) + put(data, 105) + put(data, 105) + put(data, 120) + put(data, 120) + put(data, 105) + put(data, 120) + put(data, 105) + put(data, 105) + put(data, 48) + put(data, 8260) + put(data, 51) + put(data, 8747) + put(data, 8747) + put(data, 8747) + put(data, 8747) + put(data, 8747) + put(data, 8750) + put(data, 8750) + put(data, 8750) + put(data, 8750) + put(data, 8750) + put(data, 49) + put(data, 49) + put(data, 49) + put(data, 50) + put(data, 49) + put(data, 51) + put(data, 49) + put(data, 52) + put(data, 49) + put(data, 53) + put(data, 49) + put(data, 54) + put(data, 49) + put(data, 55) + put(data, 49) + put(data, 56) + put(data, 49) + put(data, 57) + put(data, 50) + put(data, 48) + put(data, 40) + put(data, 49) + put(data, 41) + put(data, 40) + put(data, 50) + put(data, 41) + put(data, 40) + put(data, 51) + put(data, 41) + put(data, 40) + put(data, 52) + put(data, 41) + put(data, 40) + put(data, 53) + put(data, 41) + put(data, 40) + put(data, 54) + put(data, 41) + put(data, 40) + put(data, 55) + put(data, 41) + put(data, 40) + put(data, 56) + put(data, 41) + put(data, 40) + put(data, 57) + put(data, 41) + put(data, 40) + put(data, 49) + put(data, 48) + put(data, 41) + put(data, 40) + put(data, 49) + put(data, 49) + put(data, 41) + put(data, 40) + put(data, 49) + put(data, 50) + put(data, 41) + put(data, 40) + put(data, 49) + put(data, 51) + put(data, 41) + put(data, 40) + put(data, 49) + put(data, 52) + put(data, 41) + put(data, 40) + put(data, 49) + put(data, 53) + put(data, 41) + put(data, 40) + put(data, 49) + put(data, 54) + put(data, 41) + put(data, 40) + put(data, 49) + put(data, 55) + put(data, 41) + put(data, 40) + put(data, 49) + put(data, 56) + put(data, 41) + put(data, 40) + put(data, 49) + put(data, 57) + put(data, 41) + put(data, 40) + put(data, 50) + put(data, 48) + put(data, 41) + put(data, 49) + put(data, 46) + put(data, 50) + put(data, 46) + put(data, 51) + put(data, 46) + put(data, 52) + put(data, 46) + put(data, 53) + put(data, 46) + put(data, 54) + put(data, 46) + put(data, 55) + put(data, 46) + put(data, 56) + put(data, 46) + put(data, 57) + put(data, 46) + put(data, 49) + put(data, 48) + put(data, 46) + put(data, 49) + put(data, 49) + put(data, 46) + put(data, 49) + put(data, 50) + put(data, 46) + put(data, 49) + put(data, 51) + put(data, 46) + put(data, 49) + put(data, 52) + put(data, 46) + put(data, 49) + put(data, 53) + put(data, 46) + put(data, 49) + put(data, 54) + put(data, 46) + put(data, 49) + put(data, 55) + put(data, 46) + put(data, 49) + put(data, 56) + put(data, 46) + put(data, 49) + put(data, 57) + put(data, 46) + put(data, 50) + put(data, 48) + put(data, 46) + put(data, 40) + put(data, 97) + put(data, 41) + put(data, 40) + put(data, 98) + put(data, 41) + put(data, 40) + put(data, 99) + put(data, 41) + put(data, 40) + put(data, 100) + put(data, 41) + put(data, 40) + put(data, 101) + put(data, 41) + put(data, 40) + put(data, 102) + put(data, 41) + put(data, 40) + put(data, 103) + put(data, 41) + put(data, 40) + put(data, 104) + put(data, 41) + put(data, 40) + put(data, 105) + put(data, 41) + put(data, 40) + put(data, 106) + put(data, 41) + put(data, 40) + put(data, 107) + put(data, 41) + put(data, 40) + put(data, 108) + put(data, 41) + put(data, 40) + put(data, 109) + put(data, 41) + put(data, 40) + put(data, 110) + put(data, 41) + put(data, 40) + put(data, 111) + put(data, 41) + put(data, 40) + put(data, 112) + put(data, 41) + put(data, 40) + put(data, 113) + put(data, 41) + put(data, 40) + put(data, 114) + put(data, 41) + put(data, 40) + put(data, 115) + put(data, 41) + put(data, 40) + put(data, 116) + put(data, 41) + put(data, 40) + put(data, 117) + put(data, 41) + put(data, 40) + put(data, 118) + put(data, 41) + put(data, 40) + put(data, 119) + put(data, 41) + put(data, 40) + put(data, 120) + put(data, 41) + put(data, 40) + put(data, 121) + put(data, 41) + put(data, 40) + put(data, 122) + put(data, 41) + put(data, 89) + put(data, 58) + put(data, 58) + put(data, 61) + put(data, 61) + put(data, 61) + put(data, 11617) + put(data, 27597) + put(data, 40863) + put(data, 19968) + put(data, 20008) + put(data, 20022) + put(data, 20031) + put(data, 20057) + put(data, 20101) + put(data, 20108) + put(data, 20128) + put(data, 20154) + put(data, 20799) + put(data, 20837) + put(data, 20843) + put(data, 20866) + put(data, 20886) + put(data, 20907) + put(data, 20960) + put(data, 20981) + put(data, 20992) + put(data, 21147) + put(data, 21241) + put(data, 21269) + put(data, 21274) + put(data, 21304) + put(data, 21313) + put(data, 21340) + put(data, 21353) + put(data, 21378) + put(data, 21430) + put(data, 21448) + put(data, 21475) + put(data, 22231) + put(data, 22303) + put(data, 22763) + put(data, 22786) + put(data, 22794) + put(data, 22805) + put(data, 22823) + put(data, 22899) + put(data, 23376) + put(data, 23424) + put(data, 23544) + put(data, 23567) + put(data, 23586) + put(data, 23608) + put(data, 23662) + put(data, 23665) + put(data, 24027) + put(data, 24037) + put(data, 24049) + put(data, 24062) + put(data, 24178) + put(data, 24186) + put(data, 24191) + put(data, 24308) + put(data, 24318) + put(data, 24331) + put(data, 24339) + put(data, 24400) + put(data, 24417) + put(data, 24435) + put(data, 24515) + put(data, 25096) + put(data, 25142) + put(data, 25163) + put(data, 25903) + put(data, 25908) + put(data, 25991) + put(data, 26007) + put(data, 26020) + put(data, 26041) + put(data, 26080) + put(data, 26085) + put(data, 26352) + put(data, 26376) + put(data, 26408) + put(data, 27424) + put(data, 27490) + put(data, 27513) + put(data, 27571) + put(data, 27595) + put(data, 27604) + put(data, 27611) + put(data, 27663) + put(data, 27668) + put(data, 27700) + put(data, 28779) + put(data, 29226) + put(data, 29238) + put(data, 29243) + put(data, 29247) + put(data, 29255) + put(data, 29273) + put(data, 29275) + put(data, 29356) + put(data, 29572) + put(data, 29577) + put(data, 29916) + put(data, 29926) + put(data, 29976) + put(data, 29983) + put(data, 29992) + put(data, 30000) + put(data, 30091) + put(data, 30098) + put(data, 30326) + put(data, 30333) + put(data, 30382) + put(data, 30399) + put(data, 30446) + put(data, 30683) + put(data, 30690) + put(data, 30707) + put(data, 31034) + put(data, 31160) + put(data, 31166) + put(data, 31348) + put(data, 31435) + put(data, 31481) + put(data, 31859) + put(data, 31992) + put(data, 32566) + put(data, 32593) + put(data, 32650) + put(data, 32701) + put(data, 32769) + put(data, 32780) + put(data, 32786) + put(data, 32819) + put(data, 32895) + put(data, 32905) + put(data, 33251) + put(data, 33258) + put(data, 33267) + put(data, 33276) + put(data, 33292) + put(data, 33307) + put(data, 33311) + put(data, 33390) + put(data, 33394) + put(data, 33400) + put(data, 34381) + put(data, 34411) + put(data, 34880) + put(data, 34892) + put(data, 34915) + put(data, 35198) + put(data, 35211) + put(data, 35282) + put(data, 35328) + put(data, 35895) + put(data, 35910) + put(data, 35925) + put(data, 35960) + put(data, 35997) + put(data, 36196) + put(data, 36208) + put(data, 36275) + put(data, 36523) + put(data, 36554) + put(data, 36763) + put(data, 36784) + put(data, 36789) + put(data, 37009) + put(data, 37193) + put(data, 37318) + put(data, 37324) + put(data, 37329) + put(data, 38263) + put(data, 38272) + put(data, 38428) + put(data, 38582) + put(data, 38585) + put(data, 38632) + put(data, 38737) + put(data, 38750) + put(data, 38754) + put(data, 38761) + put(data, 38859) + put(data, 38893) + put(data, 38899) + put(data, 38913) + put(data, 39080) + put(data, 39131) + put(data, 39135) + put(data, 39318) + put(data, 39321) + put(data, 39340) + put(data, 39592) + put(data, 39640) + put(data, 39647) + put(data, 39717) + put(data, 39727) + put(data, 39730) + put(data, 39740) + put(data, 39770) + put(data, 40165) + put(data, 40565) + put(data, 40575) + put(data, 40613) + put(data, 40635) + put(data, 40643) + put(data, 40653) + put(data, 40657) + put(data, 40697) + put(data, 40701) + put(data, 40718) + put(data, 40723) + put(data, 40736) + put(data, 40763) + put(data, 40778) + put(data, 40786) + put(data, 40845) + put(data, 40860) + put(data, 40864) + put(data, 12306) + put(data, 21316) + put(data, 21317) + put(data, 32) + put(data, 12441) + put(data, 32) + put(data, 12442) + put(data, 12424) + put(data, 12426) + put(data, 12467) + put(data, 12488) + put(data, 4352) + put(data, 4353) + put(data, 4522) + put(data, 4354) + put(data, 4524) + put(data, 4525) + put(data, 4355) + put(data, 4356) + put(data, 4357) + put(data, 4528) + put(data, 4529) + put(data, 4530) + put(data, 4531) + put(data, 4532) + put(data, 4533) + put(data, 4378) + put(data, 4358) + put(data, 4359) + put(data, 4360) + put(data, 4385) + put(data, 4361) + put(data, 4362) + put(data, 4363) + put(data, 4364) + put(data, 4365) + put(data, 4366) + put(data, 4367) + put(data, 4368) + put(data, 4369) + put(data, 4370) + put(data, 4449) + put(data, 4450) + put(data, 4451) + put(data, 4452) + put(data, 4453) + put(data, 4454) + put(data, 4455) + put(data, 4456) + put(data, 4457) + put(data, 4458) + put(data, 4459) + put(data, 4460) + put(data, 4461) + put(data, 4462) + put(data, 4463) + put(data, 4464) + put(data, 4465) + put(data, 4466) + put(data, 4467) + put(data, 4468) + put(data, 4469) + put(data, 4448) + put(data, 4372) + put(data, 4373) + put(data, 4551) + put(data, 4552) + put(data, 4556) + put(data, 4558) + put(data, 4563) + put(data, 4567) + put(data, 4569) + put(data, 4380) + put(data, 4573) + put(data, 4575) + put(data, 4381) + put(data, 4382) + put(data, 4384) + put(data, 4386) + put(data, 4387) + put(data, 4391) + put(data, 4393) + put(data, 4395) + put(data, 4396) + put(data, 4397) + put(data, 4398) + put(data, 4399) + put(data, 4402) + put(data, 4406) + put(data, 4416) + put(data, 4423) + put(data, 4428) + put(data, 4593) + put(data, 4594) + put(data, 4439) + put(data, 4440) + put(data, 4441) + put(data, 4484) + put(data, 4485) + put(data, 4488) + put(data, 4497) + put(data, 4498) + put(data, 4500) + put(data, 4510) + put(data, 4513) + put(data, 19977) + put(data, 22235) + put(data, 19978) + put(data, 20013) + put(data, 19979) + put(data, 30002) + put(data, 19993) + put(data, 19969) + put(data, 22825) + put(data, 22320) + put(data, 40) + put(data, 4352) + put(data, 41) + put(data, 40) + put(data, 4354) + put(data, 41) + put(data, 40) + put(data, 4355) + put(data, 41) + put(data, 40) + put(data, 4357) + put(data, 41) + put(data, 40) + put(data, 4358) + put(data, 41) + put(data, 40) + put(data, 4359) + put(data, 41) + put(data, 40) + put(data, 4361) + put(data, 41) + put(data, 40) + put(data, 4363) + put(data, 41) + put(data, 40) + put(data, 4364) + put(data, 41) + put(data, 40) + put(data, 4366) + put(data, 41) + put(data, 40) + put(data, 4367) + put(data, 41) + put(data, 40) + put(data, 4368) + put(data, 41) + put(data, 40) + put(data, 4369) + put(data, 41) + put(data, 40) + put(data, 4370) + put(data, 41) + put(data, 40) + put(data, 4352) + put(data, 4449) + put(data, 41) + put(data, 40) + put(data, 4354) + put(data, 4449) + put(data, 41) + put(data, 40) + put(data, 4355) + put(data, 4449) + put(data, 41) + put(data, 40) + put(data, 4357) + put(data, 4449) + put(data, 41) + put(data, 40) + put(data, 4358) + put(data, 4449) + put(data, 41) + put(data, 40) + put(data, 4359) + put(data, 4449) + put(data, 41) + put(data, 40) + put(data, 4361) + put(data, 4449) + put(data, 41) + put(data, 40) + put(data, 4363) + put(data, 4449) + put(data, 41) + put(data, 40) + put(data, 4364) + put(data, 4449) + put(data, 41) + put(data, 40) + put(data, 4366) + put(data, 4449) + put(data, 41) + put(data, 40) + put(data, 4367) + put(data, 4449) + put(data, 41) + put(data, 40) + put(data, 4368) + put(data, 4449) + put(data, 41) + put(data, 40) + put(data, 4369) + put(data, 4449) + put(data, 41) + put(data, 40) + put(data, 4370) + put(data, 4449) + put(data, 41) + put(data, 40) + put(data, 4364) + put(data, 4462) + put(data, 41) + put(data, 40) + put(data, 4363) + put(data, 4457) + put(data, 4364) + put(data, 4453) + put(data, 4523) + put(data, 41) + put(data, 40) + put(data, 4363) + put(data, 4457) + put(data, 4370) + put(data, 4462) + put(data, 41) + put(data, 40) + put(data, 19968) + put(data, 41) + put(data, 40) + put(data, 20108) + put(data, 41) + put(data, 40) + put(data, 19977) + put(data, 41) + put(data, 40) + put(data, 22235) + put(data, 41) + put(data, 40) + put(data, 20116) + put(data, 41) + put(data, 40) + put(data, 20845) + put(data, 41) + put(data, 40) + put(data, 19971) + put(data, 41) + put(data, 40) + put(data, 20843) + put(data, 41) + put(data, 40) + put(data, 20061) + put(data, 41) + put(data, 40) + put(data, 21313) + put(data, 41) + put(data, 40) + put(data, 26376) + put(data, 41) + put(data, 40) + put(data, 28779) + put(data, 41) + put(data, 40) + put(data, 27700) + put(data, 41) + put(data, 40) + put(data, 26408) + put(data, 41) + put(data, 40) + put(data, 37329) + put(data, 41) + put(data, 40) + put(data, 22303) + put(data, 41) + put(data, 40) + put(data, 26085) + put(data, 41) + put(data, 40) + put(data, 26666) + put(data, 41) + put(data, 40) + put(data, 26377) + put(data, 41) + put(data, 40) + put(data, 31038) + put(data, 41) + put(data, 40) + put(data, 21517) + put(data, 41) + put(data, 40) + put(data, 29305) + put(data, 41) + put(data, 40) + put(data, 36001) + put(data, 41) + put(data, 40) + put(data, 31069) + put(data, 41) + put(data, 40) + put(data, 21172) + put(data, 41) + put(data, 40) + put(data, 20195) + put(data, 41) + put(data, 40) + put(data, 21628) + put(data, 41) + put(data, 40) + put(data, 23398) + put(data, 41) + put(data, 40) + put(data, 30435) + put(data, 41) + put(data, 40) + put(data, 20225) + put(data, 41) + put(data, 40) + put(data, 36039) + put(data, 41) + put(data, 40) + put(data, 21332) + put(data, 41) + put(data, 40) + put(data, 31085) + put(data, 41) + put(data, 40) + put(data, 20241) + put(data, 41) + put(data, 40) + put(data, 33258) + put(data, 41) + put(data, 40) + put(data, 33267) + put(data, 41) + put(data, 21839) + put(data, 24188) + put(data, 31631) + put(data, 80) + put(data, 84) + put(data, 69) + put(data, 50) + put(data, 50) + put(data, 50) + put(data, 52) + put(data, 50) + put(data, 53) + put(data, 50) + put(data, 54) + put(data, 50) + put(data, 55) + put(data, 50) + put(data, 56) + put(data, 50) + put(data, 57) + put(data, 51) + put(data, 48) + put(data, 51) + put(data, 51) + put(data, 51) + put(data, 52) + put(data, 51) + put(data, 53) + put(data, 4366) + put(data, 4449) + put(data, 4535) + put(data, 4352) + put(data, 4457) + put(data, 4364) + put(data, 4462) + put(data, 4363) + put(data, 4468) + put(data, 4363) + put(data, 4462) + put(data, 31192) + put(data, 30007) + put(data, 36969) + put(data, 20778) + put(data, 21360) + put(data, 27880) + put(data, 38917) + put(data, 20889) + put(data, 27491) + put(data, 24038) + put(data, 21491) + put(data, 21307) + put(data, 23447) + put(data, 22812) + put(data, 51) + put(data, 54) + put(data, 51) + put(data, 55) + put(data, 51) + put(data, 56) + put(data, 51) + put(data, 57) + put(data, 52) + put(data, 48) + put(data, 52) + put(data, 52) + put(data, 52) + put(data, 53) + put(data, 52) + put(data, 54) + put(data, 52) + put(data, 55) + put(data, 52) + put(data, 56) + put(data, 52) + put(data, 57) + put(data, 53) + put(data, 48) + put(data, 49) + put(data, 26376) + put(data, 50) + put(data, 26376) + put(data, 51) + put(data, 26376) + put(data, 52) + put(data, 26376) + put(data, 53) + put(data, 26376) + put(data, 54) + put(data, 26376) + put(data, 55) + put(data, 26376) + put(data, 56) + put(data, 26376) + put(data, 57) + put(data, 26376) + put(data, 49) + put(data, 48) + put(data, 26376) + put(data, 49) + put(data, 49) + put(data, 26376) + put(data, 49) + put(data, 50) + put(data, 26376) + put(data, 72) + put(data, 103) + put(data, 101) + put(data, 114) + put(data, 103) + put(data, 101) + put(data, 86) + put(data, 76) + put(data, 84) + put(data, 68) + put(data, 12450) + put(data, 12452) + put(data, 12454) + put(data, 12456) + put(data, 12458) + put(data, 12459) + put(data, 12461) + put(data, 12463) + put(data, 12465) + put(data, 12469) + put(data, 12471) + put(data, 12473) + put(data, 12475) + put(data, 12477) + put(data, 12479) + put(data, 12481) + put(data, 12484) + put(data, 12486) + put(data, 12490) + put(data, 12491) + put(data, 12492) + put(data, 12493) + put(data, 12494) + put(data, 12495) + put(data, 12498) + put(data, 12501) + put(data, 12504) + put(data, 12507) + put(data, 12510) + put(data, 12511) + put(data, 12512) + put(data, 12513) + put(data, 12514) + put(data, 12516) + put(data, 12518) + put(data, 12520) + put(data, 12521) + put(data, 12522) + put(data, 12523) + put(data, 12524) + put(data, 12525) + put(data, 12527) + put(data, 12528) + put(data, 12529) + put(data, 12530) + put(data, 20196) + put(data, 21644) + put(data, 12450) + put(data, 12497) + put(data, 12540) + put(data, 12488) + put(data, 12450) + put(data, 12523) + put(data, 12501) + put(data, 12449) + put(data, 12450) + put(data, 12531) + put(data, 12506) + put(data, 12450) + put(data, 12450) + put(data, 12540) + put(data, 12523) + put(data, 12452) + put(data, 12491) + put(data, 12531) + put(data, 12464) + put(data, 12452) + put(data, 12531) + put(data, 12481) + put(data, 12454) + put(data, 12457) + put(data, 12531) + put(data, 12456) + put(data, 12473) + put(data, 12463) + put(data, 12540) + put(data, 12489) + put(data, 12456) + put(data, 12540) + put(data, 12459) + put(data, 12540) + put(data, 12458) + put(data, 12531) + put(data, 12473) + put(data, 12458) + put(data, 12540) + put(data, 12512) + put(data, 12459) + put(data, 12452) + put(data, 12522) + put(data, 12459) + put(data, 12521) + put(data, 12483) + put(data, 12488) + put(data, 12459) + put(data, 12525) + put(data, 12522) + put(data, 12540) + put(data, 12460) + put(data, 12525) + put(data, 12531) + put(data, 12460) + put(data, 12531) + put(data, 12510) + put(data, 12462) + put(data, 12460) + put(data, 12462) + put(data, 12491) + put(data, 12540) + put(data, 12461) + put(data, 12517) + put(data, 12522) + put(data, 12540) + put(data, 12462) + put(data, 12523) + put(data, 12480) + put(data, 12540) + put(data, 12461) + put(data, 12525) + put(data, 12461) + put(data, 12525) + put(data, 12464) + put(data, 12521) + put(data, 12512) + put(data, 12461) + put(data, 12525) + put(data, 12513) + put(data, 12540) + put(data, 12488) + put(data, 12523) + put(data, 12461) + put(data, 12525) + put(data, 12527) + put(data, 12483) + put(data, 12488) + put(data, 12464) + put(data, 12521) + put(data, 12512) + put(data, 12488) + put(data, 12531) + put(data, 12463) + put(data, 12523) + put(data, 12476) + put(data, 12452) + put(data, 12525) + put(data, 12463) + put(data, 12525) + put(data, 12540) + put(data, 12493) + put(data, 12465) + put(data, 12540) + put(data, 12473) + put(data, 12467) + put(data, 12523) + put(data, 12490) + put(data, 12467) + put(data, 12540) + put(data, 12509) + put(data, 12469) + put(data, 12452) + put(data, 12463) + put(data, 12523) + put(data, 12469) + put(data, 12531) + put(data, 12481) + put(data, 12540) + put(data, 12512) + put(data, 12471) + put(data, 12522) + put(data, 12531) + put(data, 12464) + put(data, 12475) + put(data, 12531) + put(data, 12481) + put(data, 12475) + put(data, 12531) + put(data, 12488) + put(data, 12480) + put(data, 12540) + put(data, 12473) + put(data, 12487) + put(data, 12471) + put(data, 12489) + put(data, 12523) + put(data, 12490) + put(data, 12494) + put(data, 12494) + put(data, 12483) + put(data, 12488) + put(data, 12495) + put(data, 12452) + put(data, 12484) + put(data, 12497) + put(data, 12540) + put(data, 12475) + put(data, 12531) + put(data, 12488) + put(data, 12497) + put(data, 12540) + put(data, 12484) + put(data, 12496) + put(data, 12540) + put(data, 12524) + put(data, 12523) + put(data, 12500) + put(data, 12450) + put(data, 12473) + put(data, 12488) + put(data, 12523) + put(data, 12500) + put(data, 12463) + put(data, 12523) + put(data, 12500) + put(data, 12467) + put(data, 12499) + put(data, 12523) + put(data, 12501) + put(data, 12449) + put(data, 12521) + put(data, 12483) + put(data, 12489) + put(data, 12501) + put(data, 12451) + put(data, 12540) + put(data, 12488) + put(data, 12502) + put(data, 12483) + put(data, 12471) + put(data, 12455) + put(data, 12523) + put(data, 12501) + put(data, 12521) + put(data, 12531) + put(data, 12504) + put(data, 12463) + put(data, 12479) + put(data, 12540) + put(data, 12523) + put(data, 12506) + put(data, 12477) + put(data, 12506) + put(data, 12491) + put(data, 12498) + put(data, 12504) + put(data, 12523) + put(data, 12484) + put(data, 12506) + put(data, 12531) + put(data, 12473) + put(data, 12506) + put(data, 12540) + put(data, 12472) + put(data, 12505) + put(data, 12540) + put(data, 12479) + put(data, 12509) + put(data, 12452) + put(data, 12531) + put(data, 12488) + put(data, 12508) + put(data, 12523) + put(data, 12488) + put(data, 12507) + put(data, 12531) + put(data, 12509) + put(data, 12531) + put(data, 12489) + put(data, 12507) + put(data, 12540) + put(data, 12523) + put(data, 12507) + put(data, 12540) + put(data, 12531) + put(data, 12510) + put(data, 12452) + put(data, 12463) + put(data, 12525) + put(data, 12510) + put(data, 12452) + put(data, 12523) + put(data, 12510) + put(data, 12483) + put(data, 12495) + put(data, 12510) + put(data, 12523) + put(data, 12463) + put(data, 12510) + put(data, 12531) + put(data, 12471) + put(data, 12519) + put(data, 12531) + put(data, 12511) + put(data, 12463) + put(data, 12525) + put(data, 12531) + put(data, 12511) + put(data, 12522) + put(data, 12511) + put(data, 12522) + put(data, 12496) + put(data, 12540) + put(data, 12523) + put(data, 12513) + put(data, 12460) + put(data, 12513) + put(data, 12460) + put(data, 12488) + put(data, 12531) + put(data, 12516) + put(data, 12540) + put(data, 12489) + put(data, 12516) + put(data, 12540) + put(data, 12523) + put(data, 12518) + put(data, 12450) + put(data, 12531) + put(data, 12522) + put(data, 12483) + put(data, 12488) + put(data, 12523) + put(data, 12522) + put(data, 12521) + put(data, 12523) + put(data, 12500) + put(data, 12540) + put(data, 12523) + put(data, 12540) + put(data, 12502) + put(data, 12523) + put(data, 12524) + put(data, 12512) + put(data, 12524) + put(data, 12531) + put(data, 12488) + put(data, 12466) + put(data, 12531) + put(data, 48) + put(data, 28857) + put(data, 49) + put(data, 28857) + put(data, 50) + put(data, 28857) + put(data, 51) + put(data, 28857) + put(data, 52) + put(data, 28857) + put(data, 53) + put(data, 28857) + put(data, 54) + put(data, 28857) + put(data, 55) + put(data, 28857) + put(data, 56) + put(data, 28857) + put(data, 57) + put(data, 28857) + put(data, 49) + put(data, 48) + put(data, 28857) + put(data, 49) + put(data, 49) + put(data, 28857) + put(data, 49) + put(data, 50) + put(data, 28857) + put(data, 49) + put(data, 51) + put(data, 28857) + put(data, 49) + put(data, 52) + put(data, 28857) + put(data, 49) + put(data, 53) + put(data, 28857) + put(data, 49) + put(data, 54) + put(data, 28857) + put(data, 49) + put(data, 55) + put(data, 28857) + put(data, 49) + put(data, 56) + put(data, 28857) + put(data, 49) + put(data, 57) + put(data, 28857) + put(data, 50) + put(data, 48) + put(data, 28857) + put(data, 50) + put(data, 49) + put(data, 28857) + put(data, 50) + put(data, 50) + put(data, 28857) + put(data, 50) + put(data, 51) + put(data, 28857) + put(data, 50) + put(data, 52) + put(data, 28857) + put(data, 104) + put(data, 80) + put(data, 97) + put(data, 100) + put(data, 97) + put(data, 65) + put(data, 85) + put(data, 98) + put(data, 97) + put(data, 114) + put(data, 111) + put(data, 86) + put(data, 112) + put(data, 99) + put(data, 100) + put(data, 109) + put(data, 100) + put(data, 109) + put(data, 178) + put(data, 100) + put(data, 109) + put(data, 179) + put(data, 73) + put(data, 85) + put(data, 24179) + put(data, 25104) + put(data, 26157) + put(data, 21644) + put(data, 22823) + put(data, 27491) + put(data, 26126) + put(data, 27835) + put(data, 26666) + put(data, 24335) + put(data, 20250) + put(data, 31038) + put(data, 112) + put(data, 65) + put(data, 110) + put(data, 65) + put(data, 956) + put(data, 65) + put(data, 109) + put(data, 65) + put(data, 107) + put(data, 65) + put(data, 75) + put(data, 66) + put(data, 77) + put(data, 66) + put(data, 71) + put(data, 66) + put(data, 99) + put(data, 97) + put(data, 108) + put(data, 107) + put(data, 99) + put(data, 97) + put(data, 108) + put(data, 112) + put(data, 70) + put(data, 110) + put(data, 70) + put(data, 956) + put(data, 70) + put(data, 956) + put(data, 103) + put(data, 109) + put(data, 103) + put(data, 107) + put(data, 103) + put(data, 72) + put(data, 122) + put(data, 107) + put(data, 72) + put(data, 122) + put(data, 77) + put(data, 72) + put(data, 122) + put(data, 71) + put(data, 72) + put(data, 122) + put(data, 84) + put(data, 72) + put(data, 122) + put(data, 956) + put(data, 8467) + put(data, 109) + put(data, 8467) + put(data, 100) + put(data, 8467) + put(data, 107) + put(data, 8467) + put(data, 102) + put(data, 109) + put(data, 110) + put(data, 109) + put(data, 956) + put(data, 109) + put(data, 109) + put(data, 109) + put(data, 99) + put(data, 109) + put(data, 109) + put(data, 109) + put(data, 178) + put(data, 99) + put(data, 109) + put(data, 178) + put(data, 107) + put(data, 109) + put(data, 178) + put(data, 109) + put(data, 109) + put(data, 179) + put(data, 99) + put(data, 109) + put(data, 179) + put(data, 107) + put(data, 109) + put(data, 179) + put(data, 109) + put(data, 8725) + put(data, 115) + put(data, 109) + put(data, 8725) + put(data, 115) + put(data, 178) + put(data, 107) + put(data, 80) + put(data, 97) + put(data, 77) + put(data, 80) + put(data, 97) + put(data, 71) + put(data, 80) + put(data, 97) + put(data, 114) + put(data, 97) + put(data, 100) + put(data, 114) + put(data, 97) + put(data, 100) + put(data, 8725) + put(data, 115) + put(data, 114) + put(data, 97) + put(data, 100) + put(data, 8725) + put(data, 115) + put(data, 178) + put(data, 112) + put(data, 115) + put(data, 956) + put(data, 115) + put(data, 109) + put(data, 115) + put(data, 112) + put(data, 86) + put(data, 110) + put(data, 86) + put(data, 956) + put(data, 86) + put(data, 109) + put(data, 86) + put(data, 107) + put(data, 86) + put(data, 77) + put(data, 86) + put(data, 112) + put(data, 87) + put(data, 110) + put(data, 87) + put(data, 956) + put(data, 87) + put(data, 109) + put(data, 87) + put(data, 107) + put(data, 87) + put(data, 77) + put(data, 87) + put(data, 107) + put(data, 937) + put(data, 77) + put(data, 937) + put(data, 97) + put(data, 46) + put(data, 109) + put(data, 46) + put(data, 66) + put(data, 113) + put(data, 99) + put(data, 99) + put(data, 67) + put(data, 8725) + put(data, 107) + put(data, 103) + put(data, 67) + put(data, 111) + put(data, 46) + put(data, 100) + put(data, 66) + put(data, 71) + put(data, 121) + put(data, 104) + put(data, 97) + put(data, 72) + put(data, 80) + put(data, 105) + put(data, 110) + put(data, 75) + put(data, 75) + put(data, 107) + put(data, 116) + put(data, 108) + put(data, 109) + put(data, 108) + put(data, 110) + put(data, 108) + put(data, 111) + put(data, 103) + put(data, 108) + put(data, 120) + put(data, 109) + put(data, 98) + put(data, 109) + put(data, 105) + put(data, 108) + put(data, 109) + put(data, 111) + put(data, 108) + put(data, 80) + put(data, 72) + put(data, 112) + put(data, 46) + put(data, 109) + put(data, 46) + put(data, 80) + put(data, 80) + put(data, 77) + put(data, 83) + put(data, 118) + put(data, 87) + put(data, 98) + put(data, 86) + put(data, 8725) + put(data, 109) + put(data, 65) + put(data, 8725) + put(data, 109) + put(data, 49) + put(data, 26085) + put(data, 50) + put(data, 26085) + put(data, 51) + put(data, 26085) + put(data, 52) + put(data, 26085) + put(data, 53) + put(data, 26085) + put(data, 54) + put(data, 26085) + put(data, 55) + put(data, 26085) + put(data, 56) + put(data, 26085) + put(data, 57) + put(data, 26085) + put(data, 49) + put(data, 48) + put(data, 26085) + put(data, 49) + put(data, 49) + put(data, 26085) + put(data, 49) + put(data, 50) + put(data, 26085) + put(data, 49) + put(data, 51) + put(data, 26085) + put(data, 49) + put(data, 52) + put(data, 26085) + put(data, 49) + put(data, 53) + put(data, 26085) + put(data, 49) + put(data, 54) + put(data, 26085) + put(data, 49) + put(data, 55) + put(data, 26085) + put(data, 49) + put(data, 56) + put(data, 26085) + put(data, 49) + put(data, 57) + put(data, 26085) + put(data, 50) + put(data, 48) + put(data, 26085) + put(data, 50) + put(data, 49) + put(data, 26085) + put(data, 50) + put(data, 50) + put(data, 26085) + put(data, 50) + put(data, 51) + put(data, 26085) + put(data, 50) + put(data, 52) + put(data, 26085) + put(data, 50) + put(data, 53) + put(data, 26085) + put(data, 50) + put(data, 54) + put(data, 26085) + put(data, 50) + put(data, 55) + put(data, 26085) + put(data, 50) + put(data, 56) + put(data, 26085) + put(data, 50) + put(data, 57) + put(data, 26085) + put(data, 51) + put(data, 48) + put(data, 26085) + put(data, 51) + put(data, 49) + put(data, 26085) + put(data, 103) + put(data, 97) + put(data, 108) + put(data, 1098) + put(data, 1100) + put(data, 42863) + put(data, 294) + put(data, 339) + put(data, 42791) + put(data, 43831) + put(data, 619) + put(data, 43858) + put(data, 653) + put(data, 102) + put(data, 102) + put(data, 102) + put(data, 105) + put(data, 102) + put(data, 108) + put(data, 102) + put(data, 102) + put(data, 108) + put(data, 383) + put(data, 116) + put(data, 115) + put(data, 116) + put(data, 1396) + put(data, 1398) + put(data, 1396) + put(data, 1381) + put(data, 1396) + put(data, 1387) + put(data, 1406) + put(data, 1398) + put(data, 1396) + put(data, 1389) + put(data, 1506) + put(data, 1492) + put(data, 1499) + put(data, 1500) + put(data, 1501) + put(data, 1512) + put(data, 1514) + put(data, 1488) + put(data, 1500) + put(data, 1649) + put(data, 1659) + put(data, 1662) + put(data, 1664) + put(data, 1658) + put(data, 1663) + put(data, 1657) + put(data, 1700) + put(data, 1702) + put(data, 1668) + put(data, 1667) + put(data, 1670) + put(data, 1671) + put(data, 1677) + put(data, 1676) + put(data, 1678) + put(data, 1672) + put(data, 1688) + put(data, 1681) + put(data, 1705) + put(data, 1711) + put(data, 1715) + put(data, 1713) + put(data, 1722) + put(data, 1723) + put(data, 1728) + put(data, 1729) + put(data, 1726) + put(data, 1746) + put(data, 1747) + put(data, 1709) + put(data, 1734) + put(data, 1736) + put(data, 1655) + put(data, 1739) + put(data, 1733) + put(data, 1737) + put(data, 1744) + put(data, 1609) + put(data, 1574) + put(data, 1575) + put(data, 1574) + put(data, 1749) + put(data, 1574) + put(data, 1608) + put(data, 1574) + put(data, 1735) + put(data, 1574) + put(data, 1734) + put(data, 1574) + put(data, 1736) + put(data, 1574) + put(data, 1744) + put(data, 1574) + put(data, 1609) + put(data, 1740) + put(data, 1574) + put(data, 1580) + put(data, 1574) + put(data, 1581) + put(data, 1574) + put(data, 1605) + put(data, 1574) + put(data, 1610) + put(data, 1576) + put(data, 1580) + put(data, 1576) + put(data, 1581) + put(data, 1576) + put(data, 1582) + put(data, 1576) + put(data, 1605) + put(data, 1576) + put(data, 1609) + put(data, 1576) + put(data, 1610) + put(data, 1578) + put(data, 1580) + put(data, 1578) + put(data, 1581) + put(data, 1578) + put(data, 1582) + put(data, 1578) + put(data, 1605) + put(data, 1578) + put(data, 1609) + put(data, 1578) + put(data, 1610) + put(data, 1579) + put(data, 1580) + put(data, 1579) + put(data, 1605) + put(data, 1579) + put(data, 1609) + put(data, 1579) + put(data, 1610) + put(data, 1580) + put(data, 1581) + put(data, 1580) + put(data, 1605) + put(data, 1581) + put(data, 1605) + put(data, 1582) + put(data, 1580) + put(data, 1582) + put(data, 1581) + put(data, 1582) + put(data, 1605) + put(data, 1587) + put(data, 1580) + put(data, 1587) + put(data, 1581) + put(data, 1587) + put(data, 1582) + put(data, 1587) + put(data, 1605) + put(data, 1589) + put(data, 1581) + put(data, 1589) + put(data, 1605) + put(data, 1590) + put(data, 1580) + put(data, 1590) + put(data, 1581) + put(data, 1590) + put(data, 1582) + put(data, 1590) + put(data, 1605) + put(data, 1591) + put(data, 1581) + put(data, 1591) + put(data, 1605) + put(data, 1592) + put(data, 1605) + put(data, 1593) + put(data, 1580) + put(data, 1593) + put(data, 1605) + put(data, 1594) + put(data, 1580) + put(data, 1594) + put(data, 1605) + put(data, 1601) + put(data, 1580) + put(data, 1601) + put(data, 1581) + put(data, 1601) + put(data, 1582) + put(data, 1601) + put(data, 1605) + put(data, 1601) + put(data, 1609) + put(data, 1601) + put(data, 1610) + put(data, 1602) + put(data, 1581) + put(data, 1602) + put(data, 1605) + put(data, 1602) + put(data, 1609) + put(data, 1602) + put(data, 1610) + put(data, 1603) + put(data, 1575) + put(data, 1603) + put(data, 1580) + put(data, 1603) + put(data, 1581) + put(data, 1603) + put(data, 1582) + put(data, 1603) + put(data, 1604) + put(data, 1603) + put(data, 1605) + put(data, 1603) + put(data, 1609) + put(data, 1603) + put(data, 1610) + put(data, 1604) + put(data, 1580) + put(data, 1604) + put(data, 1581) + put(data, 1604) + put(data, 1582) + put(data, 1604) + put(data, 1605) + put(data, 1604) + put(data, 1609) + put(data, 1604) + put(data, 1610) + put(data, 1605) + put(data, 1580) + put(data, 1605) + put(data, 1605) + put(data, 1605) + put(data, 1609) + put(data, 1605) + put(data, 1610) + put(data, 1606) + put(data, 1580) + put(data, 1606) + put(data, 1581) + put(data, 1606) + put(data, 1582) + put(data, 1606) + put(data, 1605) + put(data, 1606) + put(data, 1609) + put(data, 1606) + put(data, 1610) + put(data, 1607) + put(data, 1580) + put(data, 1607) + put(data, 1605) + put(data, 1607) + put(data, 1609) + put(data, 1607) + put(data, 1610) + put(data, 1610) + put(data, 1581) + put(data, 1610) + put(data, 1582) + put(data, 1610) + put(data, 1609) + put(data, 1584) + put(data, 1648) + put(data, 1585) + put(data, 1648) + put(data, 1609) + put(data, 1648) + put(data, 32) + put(data, 1612) + put(data, 1617) + put(data, 32) + put(data, 1613) + put(data, 1617) + put(data, 32) + put(data, 1614) + put(data, 1617) + put(data, 32) + put(data, 1615) + put(data, 1617) + put(data, 32) + put(data, 1616) + put(data, 1617) + put(data, 32) + put(data, 1617) + put(data, 1648) + put(data, 1574) + put(data, 1585) + put(data, 1574) + put(data, 1586) + put(data, 1574) + put(data, 1606) + put(data, 1576) + put(data, 1585) + put(data, 1576) + put(data, 1586) + put(data, 1576) + put(data, 1606) + put(data, 1578) + put(data, 1585) + put(data, 1578) + put(data, 1586) + put(data, 1578) + put(data, 1606) + put(data, 1579) + put(data, 1585) + put(data, 1579) + put(data, 1586) + put(data, 1579) + put(data, 1606) + put(data, 1605) + put(data, 1575) + put(data, 1606) + put(data, 1585) + put(data, 1606) + put(data, 1586) + put(data, 1606) + put(data, 1606) + put(data, 1610) + put(data, 1585) + put(data, 1610) + put(data, 1586) + put(data, 1574) + put(data, 1582) + put(data, 1574) + put(data, 1607) + put(data, 1576) + put(data, 1607) + put(data, 1578) + put(data, 1607) + put(data, 1589) + put(data, 1582) + put(data, 1604) + put(data, 1607) + put(data, 1606) + put(data, 1607) + put(data, 1607) + put(data, 1648) + put(data, 1579) + put(data, 1607) + put(data, 1587) + put(data, 1607) + put(data, 1588) + put(data, 1605) + put(data, 1588) + put(data, 1607) + put(data, 1600) + put(data, 1614) + put(data, 1617) + put(data, 1600) + put(data, 1615) + put(data, 1617) + put(data, 1600) + put(data, 1616) + put(data, 1617) + put(data, 1591) + put(data, 1609) + put(data, 1591) + put(data, 1610) + put(data, 1593) + put(data, 1609) + put(data, 1593) + put(data, 1610) + put(data, 1594) + put(data, 1609) + put(data, 1594) + put(data, 1610) + put(data, 1587) + put(data, 1609) + put(data, 1587) + put(data, 1610) + put(data, 1588) + put(data, 1609) + put(data, 1588) + put(data, 1610) + put(data, 1581) + put(data, 1609) + put(data, 1580) + put(data, 1609) + put(data, 1580) + put(data, 1610) + put(data, 1582) + put(data, 1609) + put(data, 1589) + put(data, 1609) + put(data, 1589) + put(data, 1610) + put(data, 1590) + put(data, 1609) + put(data, 1590) + put(data, 1610) + put(data, 1588) + put(data, 1580) + put(data, 1588) + put(data, 1581) + put(data, 1588) + put(data, 1582) + put(data, 1588) + put(data, 1585) + put(data, 1587) + put(data, 1585) + put(data, 1589) + put(data, 1585) + put(data, 1590) + put(data, 1585) + put(data, 1575) + put(data, 1611) + put(data, 1578) + put(data, 1580) + put(data, 1605) + put(data, 1578) + put(data, 1581) + put(data, 1580) + put(data, 1578) + put(data, 1581) + put(data, 1605) + put(data, 1578) + put(data, 1582) + put(data, 1605) + put(data, 1578) + put(data, 1605) + put(data, 1580) + put(data, 1578) + put(data, 1605) + put(data, 1581) + put(data, 1578) + put(data, 1605) + put(data, 1582) + put(data, 1581) + put(data, 1605) + put(data, 1610) + put(data, 1581) + put(data, 1605) + put(data, 1609) + put(data, 1587) + put(data, 1581) + put(data, 1580) + put(data, 1587) + put(data, 1580) + put(data, 1581) + put(data, 1587) + put(data, 1580) + put(data, 1609) + put(data, 1587) + put(data, 1605) + put(data, 1581) + put(data, 1587) + put(data, 1605) + put(data, 1580) + put(data, 1587) + put(data, 1605) + put(data, 1605) + put(data, 1589) + put(data, 1581) + put(data, 1581) + put(data, 1589) + put(data, 1605) + put(data, 1605) + put(data, 1588) + put(data, 1581) + put(data, 1605) + put(data, 1588) + put(data, 1580) + put(data, 1610) + put(data, 1588) + put(data, 1605) + put(data, 1582) + put(data, 1588) + put(data, 1605) + put(data, 1605) + put(data, 1590) + put(data, 1581) + put(data, 1609) + put(data, 1590) + put(data, 1582) + put(data, 1605) + put(data, 1591) + put(data, 1605) + put(data, 1581) + put(data, 1591) + put(data, 1605) + put(data, 1605) + put(data, 1591) + put(data, 1605) + put(data, 1610) + put(data, 1593) + put(data, 1580) + put(data, 1605) + put(data, 1593) + put(data, 1605) + put(data, 1605) + put(data, 1593) + put(data, 1605) + put(data, 1609) + put(data, 1594) + put(data, 1605) + put(data, 1605) + put(data, 1594) + put(data, 1605) + put(data, 1610) + put(data, 1594) + put(data, 1605) + put(data, 1609) + put(data, 1601) + put(data, 1582) + put(data, 1605) + put(data, 1602) + put(data, 1605) + put(data, 1581) + put(data, 1602) + put(data, 1605) + put(data, 1605) + put(data, 1604) + put(data, 1581) + put(data, 1605) + put(data, 1604) + put(data, 1581) + put(data, 1610) + put(data, 1604) + put(data, 1581) + put(data, 1609) + put(data, 1604) + put(data, 1580) + put(data, 1580) + put(data, 1604) + put(data, 1582) + put(data, 1605) + put(data, 1604) + put(data, 1605) + put(data, 1581) + put(data, 1605) + put(data, 1581) + put(data, 1580) + put(data, 1605) + put(data, 1581) + put(data, 1610) + put(data, 1605) + put(data, 1580) + put(data, 1581) + put(data, 1605) + put(data, 1582) + put(data, 1605) + put(data, 1605) + put(data, 1580) + put(data, 1582) + put(data, 1607) + put(data, 1605) + put(data, 1580) + put(data, 1607) + put(data, 1605) + put(data, 1605) + put(data, 1606) + put(data, 1581) + put(data, 1605) + put(data, 1606) + put(data, 1581) + put(data, 1609) + put(data, 1606) + put(data, 1580) + put(data, 1605) + put(data, 1606) + put(data, 1580) + put(data, 1609) + put(data, 1606) + put(data, 1605) + put(data, 1610) + put(data, 1606) + put(data, 1605) + put(data, 1609) + put(data, 1610) + put(data, 1605) + put(data, 1605) + put(data, 1576) + put(data, 1582) + put(data, 1610) + put(data, 1578) + put(data, 1580) + put(data, 1610) + put(data, 1578) + put(data, 1580) + put(data, 1609) + put(data, 1578) + put(data, 1582) + put(data, 1610) + put(data, 1578) + put(data, 1582) + put(data, 1609) + put(data, 1578) + put(data, 1605) + put(data, 1610) + put(data, 1578) + put(data, 1605) + put(data, 1609) + put(data, 1580) + put(data, 1605) + put(data, 1610) + put(data, 1580) + put(data, 1581) + put(data, 1609) + put(data, 1580) + put(data, 1605) + put(data, 1609) + put(data, 1587) + put(data, 1582) + put(data, 1609) + put(data, 1589) + put(data, 1581) + put(data, 1610) + put(data, 1588) + put(data, 1581) + put(data, 1610) + put(data, 1590) + put(data, 1581) + put(data, 1610) + put(data, 1604) + put(data, 1580) + put(data, 1610) + put(data, 1604) + put(data, 1605) + put(data, 1610) + put(data, 1610) + put(data, 1580) + put(data, 1610) + put(data, 1610) + put(data, 1605) + put(data, 1610) + put(data, 1605) + put(data, 1605) + put(data, 1610) + put(data, 1602) + put(data, 1605) + put(data, 1610) + put(data, 1606) + put(data, 1581) + put(data, 1610) + put(data, 1593) + put(data, 1605) + put(data, 1610) + put(data, 1603) + put(data, 1605) + put(data, 1610) + put(data, 1606) + put(data, 1580) + put(data, 1581) + put(data, 1605) + put(data, 1582) + put(data, 1610) + put(data, 1604) + put(data, 1580) + put(data, 1605) + put(data, 1603) + put(data, 1605) + put(data, 1605) + put(data, 1580) + put(data, 1581) + put(data, 1610) + put(data, 1581) + put(data, 1580) + put(data, 1610) + put(data, 1605) + put(data, 1580) + put(data, 1610) + put(data, 1601) + put(data, 1605) + put(data, 1610) + put(data, 1576) + put(data, 1581) + put(data, 1610) + put(data, 1587) + put(data, 1582) + put(data, 1610) + put(data, 1606) + put(data, 1580) + put(data, 1610) + put(data, 1589) + put(data, 1604) + put(data, 1746) + put(data, 1602) + put(data, 1604) + put(data, 1746) + put(data, 1575) + put(data, 1604) + put(data, 1604) + put(data, 1607) + put(data, 1575) + put(data, 1603) + put(data, 1576) + put(data, 1585) + put(data, 1605) + put(data, 1581) + put(data, 1605) + put(data, 1583) + put(data, 1589) + put(data, 1604) + put(data, 1593) + put(data, 1605) + put(data, 1585) + put(data, 1587) + put(data, 1608) + put(data, 1604) + put(data, 1593) + put(data, 1604) + put(data, 1610) + put(data, 1607) + put(data, 1608) + put(data, 1587) + put(data, 1604) + put(data, 1605) + put(data, 1589) + put(data, 1604) + put(data, 1609) + put(data, 1589) + put(data, 1604) + put(data, 1609) + put(data, 32) + put(data, 1575) + put(data, 1604) + put(data, 1604) + put(data, 1607) + put(data, 32) + put(data, 1593) + put(data, 1604) + put(data, 1610) + put(data, 1607) + put(data, 32) + put(data, 1608) + put(data, 1587) + put(data, 1604) + put(data, 1605) + put(data, 1580) + put(data, 1604) + put(data, 32) + put(data, 1580) + put(data, 1604) + put(data, 1575) + put(data, 1604) + put(data, 1607) + put(data, 1585) + put(data, 1740) + put(data, 1575) + put(data, 1604) + put(data, 44) + put(data, 12289) + put(data, 12290) + put(data, 59) + put(data, 12310) + put(data, 12311) + put(data, 8230) + put(data, 8229) + put(data, 8212) + put(data, 8211) + put(data, 95) + put(data, 123) + put(data, 125) + put(data, 12308) + put(data, 12309) + put(data, 12304) + put(data, 12305) + put(data, 12298) + put(data, 12299) + put(data, 12296) + put(data, 12297) + put(data, 12300) + put(data, 12301) + put(data, 12302) + put(data, 12303) + put(data, 91) + put(data, 93) + put(data, 8254) + put(data, 35) + put(data, 38) + put(data, 42) + put(data, 45) + put(data, 60) + put(data, 62) + put(data, 92) + put(data, 36) + put(data, 37) + put(data, 64) + put(data, 32) + put(data, 1611) + put(data, 1600) + put(data, 1611) + put(data, 1600) + put(data, 1617) + put(data, 32) + put(data, 1618) + put(data, 1600) + put(data, 1618) + put(data, 1569) + put(data, 1570) + put(data, 1571) + put(data, 1572) + put(data, 1573) + put(data, 1577) + put(data, 1604) + put(data, 1570) + put(data, 1604) + put(data, 1571) + put(data, 1604) + put(data, 1573) + put(data, 34) + put(data, 39) + put(data, 94) + put(data, 96) + put(data, 124) + put(data, 126) + put(data, 10629) + put(data, 10630) + put(data, 12539) + put(data, 12453) + put(data, 12515) + put(data, 12644) + put(data, 12593) + put(data, 12594) + put(data, 12595) + put(data, 12596) + put(data, 12597) + put(data, 12598) + put(data, 12599) + put(data, 12600) + put(data, 12601) + put(data, 12602) + put(data, 12603) + put(data, 12604) + put(data, 12605) + put(data, 12606) + put(data, 12607) + put(data, 12608) + put(data, 12609) + put(data, 12610) + put(data, 12611) + put(data, 12612) + put(data, 12613) + put(data, 12614) + put(data, 12615) + put(data, 12616) + put(data, 12617) + put(data, 12618) + put(data, 12619) + put(data, 12620) + put(data, 12621) + put(data, 12622) + put(data, 12623) + put(data, 12624) + put(data, 12625) + put(data, 12626) + put(data, 12627) + put(data, 12628) + put(data, 12629) + put(data, 12630) + put(data, 12631) + put(data, 12632) + put(data, 12633) + put(data, 12634) + put(data, 12635) + put(data, 12636) + put(data, 12637) + put(data, 12638) + put(data, 12639) + put(data, 12640) + put(data, 12641) + put(data, 12642) + put(data, 12643) + put(data, 162) + put(data, 163) + put(data, 172) + put(data, 175) + put(data, 166) + put(data, 165) + put(data, 8361) + put(data, 9474) + put(data, 8592) + put(data, 8593) + put(data, 8594) + put(data, 8595) + put(data, 9632) + put(data, 9675) + put(data, 720) + put(data, 721) + put(data, 230) + put(data, 665) + put(data, 595) + put(data, 675) + put(data, 43878) + put(data, 677) + put(data, 676) + put(data, 598) + put(data, 599) + put(data, 7569) + put(data, 600) + put(data, 606) + put(data, 681) + put(data, 612) + put(data, 610) + put(data, 608) + put(data, 667) + put(data, 668) + put(data, 615) + put(data, 644) + put(data, 682) + put(data, 683) + put(data, 620) + put(data, 122628) + put(data, 42894) + put(data, 622) + put(data, 122629) + put(data, 654) + put(data, 122630) + put(data, 248) + put(data, 630) + put(data, 631) + put(data, 634) + put(data, 122632) + put(data, 637) + put(data, 638) + put(data, 640) + put(data, 680) + put(data, 678) + put(data, 43879) + put(data, 679) + put(data, 648) + put(data, 11377) + put(data, 655) + put(data, 673) + put(data, 674) + put(data, 664) + put(data, 448) + put(data, 449) + put(data, 450) + put(data, 122634) + put(data, 122654) + put(data, 305) + put(data, 567) + put(data, 913) + put(data, 914) + put(data, 916) + put(data, 917) + put(data, 918) + put(data, 919) + put(data, 921) + put(data, 922) + put(data, 923) + put(data, 924) + put(data, 925) + put(data, 926) + put(data, 927) + put(data, 929) + put(data, 1012) + put(data, 932) + put(data, 934) + put(data, 935) + put(data, 936) + put(data, 8711) + put(data, 945) + put(data, 950) + put(data, 951) + put(data, 953) + put(data, 955) + put(data, 957) + put(data, 958) + put(data, 959) + put(data, 963) + put(data, 964) + put(data, 965) + put(data, 968) + put(data, 969) + put(data, 8706) + put(data, 1013) + put(data, 977) + put(data, 1008) + put(data, 981) + put(data, 1009) + put(data, 982) + put(data, 988) + put(data, 989) + put(data, 1646) + put(data, 1697) + put(data, 1647) + put(data, 48) + put(data, 44) + put(data, 49) + put(data, 44) + put(data, 50) + put(data, 44) + put(data, 51) + put(data, 44) + put(data, 52) + put(data, 44) + put(data, 53) + put(data, 44) + put(data, 54) + put(data, 44) + put(data, 55) + put(data, 44) + put(data, 56) + put(data, 44) + put(data, 57) + put(data, 44) + put(data, 40) + put(data, 65) + put(data, 41) + put(data, 40) + put(data, 66) + put(data, 41) + put(data, 40) + put(data, 67) + put(data, 41) + put(data, 40) + put(data, 68) + put(data, 41) + put(data, 40) + put(data, 69) + put(data, 41) + put(data, 40) + put(data, 70) + put(data, 41) + put(data, 40) + put(data, 71) + put(data, 41) + put(data, 40) + put(data, 72) + put(data, 41) + put(data, 40) + put(data, 73) + put(data, 41) + put(data, 40) + put(data, 74) + put(data, 41) + put(data, 40) + put(data, 75) + put(data, 41) + put(data, 40) + put(data, 76) + put(data, 41) + put(data, 40) + put(data, 77) + put(data, 41) + put(data, 40) + put(data, 78) + put(data, 41) + put(data, 40) + put(data, 79) + put(data, 41) + put(data, 40) + put(data, 80) + put(data, 41) + put(data, 40) + put(data, 81) + put(data, 41) + put(data, 40) + put(data, 82) + put(data, 41) + put(data, 40) + put(data, 83) + put(data, 41) + put(data, 40) + put(data, 84) + put(data, 41) + put(data, 40) + put(data, 85) + put(data, 41) + put(data, 40) + put(data, 86) + put(data, 41) + put(data, 40) + put(data, 87) + put(data, 41) + put(data, 40) + put(data, 88) + put(data, 41) + put(data, 40) + put(data, 89) + put(data, 41) + put(data, 40) + put(data, 90) + put(data, 41) + put(data, 12308) + put(data, 83) + put(data, 12309) + put(data, 67) + put(data, 68) + put(data, 87) + put(data, 90) + put(data, 72) + put(data, 86) + put(data, 83) + put(data, 68) + put(data, 83) + put(data, 83) + put(data, 80) + put(data, 80) + put(data, 86) + put(data, 87) + put(data, 67) + put(data, 77) + put(data, 67) + put(data, 77) + put(data, 68) + put(data, 77) + put(data, 82) + put(data, 68) + put(data, 74) + put(data, 12411) + put(data, 12363) + put(data, 12467) + put(data, 12467) + put(data, 23383) + put(data, 21452) + put(data, 22810) + put(data, 35299) + put(data, 20132) + put(data, 26144) + put(data, 28961) + put(data, 26009) + put(data, 21069) + put(data, 24460) + put(data, 20877) + put(data, 26032) + put(data, 21021) + put(data, 32066) + put(data, 36009) + put(data, 22768) + put(data, 21561) + put(data, 28436) + put(data, 25237) + put(data, 25429) + put(data, 36938) + put(data, 25351) + put(data, 25171) + put(data, 31105) + put(data, 31354) + put(data, 21512) + put(data, 28288) + put(data, 30003) + put(data, 21106) + put(data, 21942) + put(data, 37197) + put(data, 12308) + put(data, 26412) + put(data, 12309) + put(data, 12308) + put(data, 19977) + put(data, 12309) + put(data, 12308) + put(data, 20108) + put(data, 12309) + put(data, 12308) + put(data, 23433) + put(data, 12309) + put(data, 12308) + put(data, 28857) + put(data, 12309) + put(data, 12308) + put(data, 25171) + put(data, 12309) + put(data, 12308) + put(data, 30423) + put(data, 12309) + put(data, 12308) + put(data, 21213) + put(data, 12309) + put(data, 12308) + put(data, 25943) + put(data, 12309) + put(data, 24471) + put(data, 21487) + data + end + + # Compatibility decomposition mappings, represented as subsequences of + # `compatibility_decomposition_data`. The maximum transformation is 18 + # codepoints. + # Here we store: codepoint => {index, count} + private class_getter compatibility_decompositions : Hash(Int32, {Int32, Int32}) do + data = Hash(Int32, {Int32, Int32}).new(initial_capacity: 3734) + put(data, 160, 0, 1) + put(data, 168, 1, 2) + put(data, 170, 3, 1) + put(data, 175, 4, 2) + put(data, 178, 6, 1) + put(data, 179, 7, 1) + put(data, 180, 8, 2) + put(data, 181, 10, 1) + put(data, 184, 11, 2) + put(data, 185, 13, 1) + put(data, 186, 14, 1) + put(data, 188, 15, 3) + put(data, 189, 18, 3) + put(data, 190, 21, 3) + put(data, 306, 24, 2) + put(data, 307, 26, 2) + put(data, 319, 28, 2) + put(data, 320, 30, 2) + put(data, 329, 32, 2) + put(data, 383, 34, 1) + put(data, 452, 35, 2) + put(data, 453, 37, 2) + put(data, 454, 39, 2) + put(data, 455, 41, 2) + put(data, 456, 43, 2) + put(data, 457, 45, 2) + put(data, 458, 47, 2) + put(data, 459, 49, 2) + put(data, 460, 51, 2) + put(data, 497, 53, 2) + put(data, 498, 55, 2) + put(data, 499, 57, 2) + put(data, 688, 59, 1) + put(data, 689, 60, 1) + put(data, 690, 27, 1) + put(data, 691, 61, 1) + put(data, 692, 62, 1) + put(data, 693, 63, 1) + put(data, 694, 64, 1) + put(data, 695, 65, 1) + put(data, 696, 66, 1) + put(data, 728, 67, 2) + put(data, 729, 69, 2) + put(data, 730, 71, 2) + put(data, 731, 73, 2) + put(data, 732, 75, 2) + put(data, 733, 77, 2) + put(data, 736, 79, 1) + put(data, 737, 30, 1) + put(data, 738, 34, 1) + put(data, 739, 80, 1) + put(data, 740, 81, 1) + put(data, 890, 82, 2) + put(data, 900, 8, 2) + put(data, 976, 84, 1) + put(data, 977, 85, 1) + put(data, 978, 86, 1) + put(data, 981, 87, 1) + put(data, 982, 88, 1) + put(data, 1008, 89, 1) + put(data, 1009, 90, 1) + put(data, 1010, 91, 1) + put(data, 1012, 92, 1) + put(data, 1013, 93, 1) + put(data, 1017, 94, 1) + put(data, 1415, 95, 2) + put(data, 1653, 97, 2) + put(data, 1654, 99, 2) + put(data, 1655, 101, 2) + put(data, 1656, 103, 2) + put(data, 3635, 105, 2) + put(data, 3763, 107, 2) + put(data, 3804, 109, 2) + put(data, 3805, 111, 2) + put(data, 3852, 113, 1) + put(data, 3959, 114, 2) + put(data, 3961, 116, 2) + put(data, 4348, 118, 1) + put(data, 7468, 119, 1) + put(data, 7469, 120, 1) + put(data, 7470, 121, 1) + put(data, 7472, 35, 1) + put(data, 7473, 122, 1) + put(data, 7474, 123, 1) + put(data, 7475, 124, 1) + put(data, 7476, 125, 1) + put(data, 7477, 24, 1) + put(data, 7478, 25, 1) + put(data, 7479, 126, 1) + put(data, 7480, 28, 1) + put(data, 7481, 127, 1) + put(data, 7482, 47, 1) + put(data, 7484, 128, 1) + put(data, 7485, 129, 1) + put(data, 7486, 130, 1) + put(data, 7487, 131, 1) + put(data, 7488, 132, 1) + put(data, 7489, 133, 1) + put(data, 7490, 134, 1) + put(data, 7491, 3, 1) + put(data, 7492, 135, 1) + put(data, 7493, 136, 1) + put(data, 7494, 137, 1) + put(data, 7495, 138, 1) + put(data, 7496, 39, 1) + put(data, 7497, 139, 1) + put(data, 7498, 140, 1) + put(data, 7499, 141, 1) + put(data, 7500, 142, 1) + put(data, 7501, 143, 1) + put(data, 7503, 144, 1) + put(data, 7504, 145, 1) + put(data, 7505, 146, 1) + put(data, 7506, 14, 1) + put(data, 7507, 147, 1) + put(data, 7508, 148, 1) + put(data, 7509, 149, 1) + put(data, 7510, 150, 1) + put(data, 7511, 151, 1) + put(data, 7512, 152, 1) + put(data, 7513, 153, 1) + put(data, 7514, 154, 1) + put(data, 7515, 155, 1) + put(data, 7516, 156, 1) + put(data, 7517, 84, 1) + put(data, 7518, 157, 1) + put(data, 7519, 158, 1) + put(data, 7520, 87, 1) + put(data, 7521, 159, 1) + put(data, 7522, 26, 1) + put(data, 7523, 61, 1) + put(data, 7524, 152, 1) + put(data, 7525, 155, 1) + put(data, 7526, 84, 1) + put(data, 7527, 157, 1) + put(data, 7528, 90, 1) + put(data, 7529, 87, 1) + put(data, 7530, 159, 1) + put(data, 7544, 160, 1) + put(data, 7579, 161, 1) + put(data, 7580, 162, 1) + put(data, 7581, 163, 1) + put(data, 7582, 164, 1) + put(data, 7583, 142, 1) + put(data, 7584, 165, 1) + put(data, 7585, 166, 1) + put(data, 7586, 167, 1) + put(data, 7587, 168, 1) + put(data, 7588, 169, 1) + put(data, 7589, 170, 1) + put(data, 7590, 171, 1) + put(data, 7591, 172, 1) + put(data, 7592, 173, 1) + put(data, 7593, 174, 1) + put(data, 7594, 175, 1) + put(data, 7595, 176, 1) + put(data, 7596, 177, 1) + put(data, 7597, 178, 1) + put(data, 7598, 179, 1) + put(data, 7599, 180, 1) + put(data, 7600, 181, 1) + put(data, 7601, 182, 1) + put(data, 7602, 183, 1) + put(data, 7603, 184, 1) + put(data, 7604, 185, 1) + put(data, 7605, 186, 1) + put(data, 7606, 187, 1) + put(data, 7607, 188, 1) + put(data, 7608, 189, 1) + put(data, 7609, 190, 1) + put(data, 7610, 191, 1) + put(data, 7611, 56, 1) + put(data, 7612, 192, 1) + put(data, 7613, 193, 1) + put(data, 7614, 194, 1) + put(data, 7615, 85, 1) + put(data, 7834, 195, 2) + put(data, 8125, 197, 2) + put(data, 8127, 197, 2) + put(data, 8128, 199, 2) + put(data, 8190, 201, 2) + put(data, 8194, 0, 1) + put(data, 8195, 0, 1) + put(data, 8196, 0, 1) + put(data, 8197, 0, 1) + put(data, 8198, 0, 1) + put(data, 8199, 0, 1) + put(data, 8200, 0, 1) + put(data, 8201, 0, 1) + put(data, 8202, 0, 1) + put(data, 8209, 203, 1) + put(data, 8215, 204, 2) + put(data, 8228, 206, 1) + put(data, 8229, 207, 2) + put(data, 8230, 206, 3) + put(data, 8239, 0, 1) + put(data, 8243, 209, 2) + put(data, 8244, 211, 3) + put(data, 8246, 214, 2) + put(data, 8247, 216, 3) + put(data, 8252, 219, 2) + put(data, 8254, 221, 2) + put(data, 8263, 223, 2) + put(data, 8264, 225, 2) + put(data, 8265, 227, 2) + put(data, 8279, 209, 4) + put(data, 8287, 0, 1) + put(data, 8304, 229, 1) + put(data, 8305, 26, 1) + put(data, 8308, 17, 1) + put(data, 8309, 230, 1) + put(data, 8310, 231, 1) + put(data, 8311, 232, 1) + put(data, 8312, 233, 1) + put(data, 8313, 234, 1) + put(data, 8314, 235, 1) + put(data, 8315, 236, 1) + put(data, 8316, 237, 1) + put(data, 8317, 238, 1) + put(data, 8318, 239, 1) + put(data, 8319, 33, 1) + put(data, 8320, 229, 1) + put(data, 8321, 13, 1) + put(data, 8322, 6, 1) + put(data, 8323, 7, 1) + put(data, 8324, 17, 1) + put(data, 8325, 230, 1) + put(data, 8326, 231, 1) + put(data, 8327, 232, 1) + put(data, 8328, 233, 1) + put(data, 8329, 234, 1) + put(data, 8330, 235, 1) + put(data, 8331, 236, 1) + put(data, 8332, 237, 1) + put(data, 8333, 238, 1) + put(data, 8334, 239, 1) + put(data, 8336, 3, 1) + put(data, 8337, 139, 1) + put(data, 8338, 14, 1) + put(data, 8339, 80, 1) + put(data, 8340, 140, 1) + put(data, 8341, 59, 1) + put(data, 8342, 144, 1) + put(data, 8343, 30, 1) + put(data, 8344, 145, 1) + put(data, 8345, 33, 1) + put(data, 8346, 150, 1) + put(data, 8347, 34, 1) + put(data, 8348, 151, 1) + put(data, 8360, 240, 2) + put(data, 8448, 242, 3) + put(data, 8449, 245, 3) + put(data, 8450, 248, 1) + put(data, 8451, 249, 2) + put(data, 8453, 251, 3) + put(data, 8454, 254, 3) + put(data, 8455, 257, 1) + put(data, 8457, 258, 2) + put(data, 8458, 143, 1) + put(data, 8459, 125, 1) + put(data, 8460, 125, 1) + put(data, 8461, 125, 1) + put(data, 8462, 59, 1) + put(data, 8463, 260, 1) + put(data, 8464, 24, 1) + put(data, 8465, 24, 1) + put(data, 8466, 28, 1) + put(data, 8467, 30, 1) + put(data, 8469, 47, 1) + put(data, 8470, 261, 2) + put(data, 8473, 130, 1) + put(data, 8474, 263, 1) + put(data, 8475, 131, 1) + put(data, 8476, 131, 1) + put(data, 8477, 131, 1) + put(data, 8480, 264, 2) + put(data, 8481, 266, 3) + put(data, 8482, 269, 2) + put(data, 8484, 54, 1) + put(data, 8488, 54, 1) + put(data, 8492, 121, 1) + put(data, 8493, 248, 1) + put(data, 8495, 139, 1) + put(data, 8496, 122, 1) + put(data, 8497, 259, 1) + put(data, 8499, 127, 1) + put(data, 8500, 14, 1) + put(data, 8501, 271, 1) + put(data, 8502, 272, 1) + put(data, 8503, 273, 1) + put(data, 8504, 274, 1) + put(data, 8505, 26, 1) + put(data, 8507, 275, 3) + put(data, 8508, 88, 1) + put(data, 8509, 157, 1) + put(data, 8510, 278, 1) + put(data, 8511, 279, 1) + put(data, 8512, 280, 1) + put(data, 8517, 35, 1) + put(data, 8518, 39, 1) + put(data, 8519, 139, 1) + put(data, 8520, 26, 1) + put(data, 8521, 27, 1) + put(data, 8528, 281, 3) + put(data, 8529, 284, 3) + put(data, 8530, 287, 4) + put(data, 8531, 291, 3) + put(data, 8532, 294, 3) + put(data, 8533, 297, 3) + put(data, 8534, 300, 3) + put(data, 8535, 303, 3) + put(data, 8536, 306, 3) + put(data, 8537, 309, 3) + put(data, 8538, 312, 3) + put(data, 8539, 315, 3) + put(data, 8540, 318, 3) + put(data, 8541, 321, 3) + put(data, 8542, 324, 3) + put(data, 8543, 15, 2) + put(data, 8544, 24, 1) + put(data, 8545, 327, 2) + put(data, 8546, 329, 3) + put(data, 8547, 332, 2) + put(data, 8548, 333, 1) + put(data, 8549, 334, 2) + put(data, 8550, 336, 3) + put(data, 8551, 339, 4) + put(data, 8552, 343, 2) + put(data, 8553, 277, 1) + put(data, 8554, 345, 2) + put(data, 8555, 347, 3) + put(data, 8556, 28, 1) + put(data, 8557, 248, 1) + put(data, 8558, 35, 1) + put(data, 8559, 127, 1) + put(data, 8560, 26, 1) + put(data, 8561, 350, 2) + put(data, 8562, 352, 3) + put(data, 8563, 355, 2) + put(data, 8564, 155, 1) + put(data, 8565, 357, 2) + put(data, 8566, 359, 3) + put(data, 8567, 362, 4) + put(data, 8568, 366, 2) + put(data, 8569, 80, 1) + put(data, 8570, 368, 2) + put(data, 8571, 370, 3) + put(data, 8572, 30, 1) + put(data, 8573, 162, 1) + put(data, 8574, 39, 1) + put(data, 8575, 145, 1) + put(data, 8585, 373, 3) + put(data, 8748, 376, 2) + put(data, 8749, 378, 3) + put(data, 8751, 381, 2) + put(data, 8752, 383, 3) + put(data, 9312, 13, 1) + put(data, 9313, 6, 1) + put(data, 9314, 7, 1) + put(data, 9315, 17, 1) + put(data, 9316, 230, 1) + put(data, 9317, 231, 1) + put(data, 9318, 232, 1) + put(data, 9319, 233, 1) + put(data, 9320, 234, 1) + put(data, 9321, 289, 2) + put(data, 9322, 386, 2) + put(data, 9323, 388, 2) + put(data, 9324, 390, 2) + put(data, 9325, 392, 2) + put(data, 9326, 394, 2) + put(data, 9327, 396, 2) + put(data, 9328, 398, 2) + put(data, 9329, 400, 2) + put(data, 9330, 402, 2) + put(data, 9331, 404, 2) + put(data, 9332, 406, 3) + put(data, 9333, 409, 3) + put(data, 9334, 412, 3) + put(data, 9335, 415, 3) + put(data, 9336, 418, 3) + put(data, 9337, 421, 3) + put(data, 9338, 424, 3) + put(data, 9339, 427, 3) + put(data, 9340, 430, 3) + put(data, 9341, 433, 4) + put(data, 9342, 437, 4) + put(data, 9343, 441, 4) + put(data, 9344, 445, 4) + put(data, 9345, 449, 4) + put(data, 9346, 453, 4) + put(data, 9347, 457, 4) + put(data, 9348, 461, 4) + put(data, 9349, 465, 4) + put(data, 9350, 469, 4) + put(data, 9351, 473, 4) + put(data, 9352, 477, 2) + put(data, 9353, 479, 2) + put(data, 9354, 481, 2) + put(data, 9355, 483, 2) + put(data, 9356, 485, 2) + put(data, 9357, 487, 2) + put(data, 9358, 489, 2) + put(data, 9359, 491, 2) + put(data, 9360, 493, 2) + put(data, 9361, 495, 3) + put(data, 9362, 498, 3) + put(data, 9363, 501, 3) + put(data, 9364, 504, 3) + put(data, 9365, 507, 3) + put(data, 9366, 510, 3) + put(data, 9367, 513, 3) + put(data, 9368, 516, 3) + put(data, 9369, 519, 3) + put(data, 9370, 522, 3) + put(data, 9371, 525, 3) + put(data, 9372, 528, 3) + put(data, 9373, 531, 3) + put(data, 9374, 534, 3) + put(data, 9375, 537, 3) + put(data, 9376, 540, 3) + put(data, 9377, 543, 3) + put(data, 9378, 546, 3) + put(data, 9379, 549, 3) + put(data, 9380, 552, 3) + put(data, 9381, 555, 3) + put(data, 9382, 558, 3) + put(data, 9383, 561, 3) + put(data, 9384, 564, 3) + put(data, 9385, 567, 3) + put(data, 9386, 570, 3) + put(data, 9387, 573, 3) + put(data, 9388, 576, 3) + put(data, 9389, 579, 3) + put(data, 9390, 582, 3) + put(data, 9391, 585, 3) + put(data, 9392, 588, 3) + put(data, 9393, 591, 3) + put(data, 9394, 594, 3) + put(data, 9395, 597, 3) + put(data, 9396, 600, 3) + put(data, 9397, 603, 3) + put(data, 9398, 119, 1) + put(data, 9399, 121, 1) + put(data, 9400, 248, 1) + put(data, 9401, 35, 1) + put(data, 9402, 122, 1) + put(data, 9403, 259, 1) + put(data, 9404, 124, 1) + put(data, 9405, 125, 1) + put(data, 9406, 24, 1) + put(data, 9407, 25, 1) + put(data, 9408, 126, 1) + put(data, 9409, 28, 1) + put(data, 9410, 127, 1) + put(data, 9411, 47, 1) + put(data, 9412, 128, 1) + put(data, 9413, 130, 1) + put(data, 9414, 263, 1) + put(data, 9415, 131, 1) + put(data, 9416, 264, 1) + put(data, 9417, 132, 1) + put(data, 9418, 133, 1) + put(data, 9419, 333, 1) + put(data, 9420, 134, 1) + put(data, 9421, 277, 1) + put(data, 9422, 606, 1) + put(data, 9423, 54, 1) + put(data, 9424, 3, 1) + put(data, 9425, 138, 1) + put(data, 9426, 162, 1) + put(data, 9427, 39, 1) + put(data, 9428, 139, 1) + put(data, 9429, 165, 1) + put(data, 9430, 143, 1) + put(data, 9431, 59, 1) + put(data, 9432, 26, 1) + put(data, 9433, 27, 1) + put(data, 9434, 144, 1) + put(data, 9435, 30, 1) + put(data, 9436, 145, 1) + put(data, 9437, 33, 1) + put(data, 9438, 14, 1) + put(data, 9439, 150, 1) + put(data, 9440, 577, 1) + put(data, 9441, 61, 1) + put(data, 9442, 34, 1) + put(data, 9443, 151, 1) + put(data, 9444, 152, 1) + put(data, 9445, 155, 1) + put(data, 9446, 65, 1) + put(data, 9447, 80, 1) + put(data, 9448, 66, 1) + put(data, 9449, 56, 1) + put(data, 9450, 229, 1) + put(data, 10764, 376, 4) + put(data, 10868, 607, 3) + put(data, 10869, 610, 2) + put(data, 10870, 609, 3) + put(data, 11388, 27, 1) + put(data, 11389, 333, 1) + put(data, 11631, 612, 1) + put(data, 11935, 613, 1) + put(data, 12019, 614, 1) + put(data, 12032, 615, 1) + put(data, 12033, 616, 1) + put(data, 12034, 617, 1) + put(data, 12035, 618, 1) + put(data, 12036, 619, 1) + put(data, 12037, 620, 1) + put(data, 12038, 621, 1) + put(data, 12039, 622, 1) + put(data, 12040, 623, 1) + put(data, 12041, 624, 1) + put(data, 12042, 625, 1) + put(data, 12043, 626, 1) + put(data, 12044, 627, 1) + put(data, 12045, 628, 1) + put(data, 12046, 629, 1) + put(data, 12047, 630, 1) + put(data, 12048, 631, 1) + put(data, 12049, 632, 1) + put(data, 12050, 633, 1) + put(data, 12051, 634, 1) + put(data, 12052, 635, 1) + put(data, 12053, 636, 1) + put(data, 12054, 637, 1) + put(data, 12055, 638, 1) + put(data, 12056, 639, 1) + put(data, 12057, 640, 1) + put(data, 12058, 641, 1) + put(data, 12059, 642, 1) + put(data, 12060, 643, 1) + put(data, 12061, 644, 1) + put(data, 12062, 645, 1) + put(data, 12063, 646, 1) + put(data, 12064, 647, 1) + put(data, 12065, 648, 1) + put(data, 12066, 649, 1) + put(data, 12067, 650, 1) + put(data, 12068, 651, 1) + put(data, 12069, 652, 1) + put(data, 12070, 653, 1) + put(data, 12071, 654, 1) + put(data, 12072, 655, 1) + put(data, 12073, 656, 1) + put(data, 12074, 657, 1) + put(data, 12075, 658, 1) + put(data, 12076, 659, 1) + put(data, 12077, 660, 1) + put(data, 12078, 661, 1) + put(data, 12079, 662, 1) + put(data, 12080, 663, 1) + put(data, 12081, 664, 1) + put(data, 12082, 665, 1) + put(data, 12083, 666, 1) + put(data, 12084, 667, 1) + put(data, 12085, 668, 1) + put(data, 12086, 669, 1) + put(data, 12087, 670, 1) + put(data, 12088, 671, 1) + put(data, 12089, 672, 1) + put(data, 12090, 673, 1) + put(data, 12091, 674, 1) + put(data, 12092, 675, 1) + put(data, 12093, 676, 1) + put(data, 12094, 677, 1) + put(data, 12095, 678, 1) + put(data, 12096, 679, 1) + put(data, 12097, 680, 1) + put(data, 12098, 681, 1) + put(data, 12099, 682, 1) + put(data, 12100, 683, 1) + put(data, 12101, 684, 1) + put(data, 12102, 685, 1) + put(data, 12103, 686, 1) + put(data, 12104, 687, 1) + put(data, 12105, 688, 1) + put(data, 12106, 689, 1) + put(data, 12107, 690, 1) + put(data, 12108, 691, 1) + put(data, 12109, 692, 1) + put(data, 12110, 693, 1) + put(data, 12111, 694, 1) + put(data, 12112, 695, 1) + put(data, 12113, 696, 1) + put(data, 12114, 697, 1) + put(data, 12115, 698, 1) + put(data, 12116, 699, 1) + put(data, 12117, 700, 1) + put(data, 12118, 701, 1) + put(data, 12119, 702, 1) + put(data, 12120, 703, 1) + put(data, 12121, 704, 1) + put(data, 12122, 705, 1) + put(data, 12123, 706, 1) + put(data, 12124, 707, 1) + put(data, 12125, 708, 1) + put(data, 12126, 709, 1) + put(data, 12127, 710, 1) + put(data, 12128, 711, 1) + put(data, 12129, 712, 1) + put(data, 12130, 713, 1) + put(data, 12131, 714, 1) + put(data, 12132, 715, 1) + put(data, 12133, 716, 1) + put(data, 12134, 717, 1) + put(data, 12135, 718, 1) + put(data, 12136, 719, 1) + put(data, 12137, 720, 1) + put(data, 12138, 721, 1) + put(data, 12139, 722, 1) + put(data, 12140, 723, 1) + put(data, 12141, 724, 1) + put(data, 12142, 725, 1) + put(data, 12143, 726, 1) + put(data, 12144, 727, 1) + put(data, 12145, 728, 1) + put(data, 12146, 729, 1) + put(data, 12147, 730, 1) + put(data, 12148, 731, 1) + put(data, 12149, 732, 1) + put(data, 12150, 733, 1) + put(data, 12151, 734, 1) + put(data, 12152, 735, 1) + put(data, 12153, 736, 1) + put(data, 12154, 737, 1) + put(data, 12155, 738, 1) + put(data, 12156, 739, 1) + put(data, 12157, 740, 1) + put(data, 12158, 741, 1) + put(data, 12159, 742, 1) + put(data, 12160, 743, 1) + put(data, 12161, 744, 1) + put(data, 12162, 745, 1) + put(data, 12163, 746, 1) + put(data, 12164, 747, 1) + put(data, 12165, 748, 1) + put(data, 12166, 749, 1) + put(data, 12167, 750, 1) + put(data, 12168, 751, 1) + put(data, 12169, 752, 1) + put(data, 12170, 753, 1) + put(data, 12171, 754, 1) + put(data, 12172, 755, 1) + put(data, 12173, 756, 1) + put(data, 12174, 757, 1) + put(data, 12175, 758, 1) + put(data, 12176, 759, 1) + put(data, 12177, 760, 1) + put(data, 12178, 761, 1) + put(data, 12179, 762, 1) + put(data, 12180, 763, 1) + put(data, 12181, 764, 1) + put(data, 12182, 765, 1) + put(data, 12183, 766, 1) + put(data, 12184, 767, 1) + put(data, 12185, 768, 1) + put(data, 12186, 769, 1) + put(data, 12187, 770, 1) + put(data, 12188, 771, 1) + put(data, 12189, 772, 1) + put(data, 12190, 773, 1) + put(data, 12191, 774, 1) + put(data, 12192, 775, 1) + put(data, 12193, 776, 1) + put(data, 12194, 777, 1) + put(data, 12195, 778, 1) + put(data, 12196, 779, 1) + put(data, 12197, 780, 1) + put(data, 12198, 781, 1) + put(data, 12199, 782, 1) + put(data, 12200, 783, 1) + put(data, 12201, 784, 1) + put(data, 12202, 785, 1) + put(data, 12203, 786, 1) + put(data, 12204, 787, 1) + put(data, 12205, 788, 1) + put(data, 12206, 789, 1) + put(data, 12207, 790, 1) + put(data, 12208, 791, 1) + put(data, 12209, 792, 1) + put(data, 12210, 793, 1) + put(data, 12211, 794, 1) + put(data, 12212, 795, 1) + put(data, 12213, 796, 1) + put(data, 12214, 797, 1) + put(data, 12215, 798, 1) + put(data, 12216, 799, 1) + put(data, 12217, 800, 1) + put(data, 12218, 801, 1) + put(data, 12219, 802, 1) + put(data, 12220, 803, 1) + put(data, 12221, 804, 1) + put(data, 12222, 805, 1) + put(data, 12223, 806, 1) + put(data, 12224, 807, 1) + put(data, 12225, 808, 1) + put(data, 12226, 809, 1) + put(data, 12227, 810, 1) + put(data, 12228, 811, 1) + put(data, 12229, 812, 1) + put(data, 12230, 813, 1) + put(data, 12231, 814, 1) + put(data, 12232, 815, 1) + put(data, 12233, 816, 1) + put(data, 12234, 817, 1) + put(data, 12235, 818, 1) + put(data, 12236, 819, 1) + put(data, 12237, 820, 1) + put(data, 12238, 821, 1) + put(data, 12239, 822, 1) + put(data, 12240, 823, 1) + put(data, 12241, 824, 1) + put(data, 12242, 825, 1) + put(data, 12243, 826, 1) + put(data, 12244, 827, 1) + put(data, 12245, 828, 1) + put(data, 12288, 0, 1) + put(data, 12342, 829, 1) + put(data, 12344, 638, 1) + put(data, 12345, 830, 1) + put(data, 12346, 831, 1) + put(data, 12443, 832, 2) + put(data, 12444, 834, 2) + put(data, 12447, 836, 2) + put(data, 12543, 838, 2) + put(data, 12593, 840, 1) + put(data, 12594, 841, 1) + put(data, 12595, 842, 1) + put(data, 12596, 843, 1) + put(data, 12597, 844, 1) + put(data, 12598, 845, 1) + put(data, 12599, 846, 1) + put(data, 12600, 847, 1) + put(data, 12601, 848, 1) + put(data, 12602, 849, 1) + put(data, 12603, 850, 1) + put(data, 12604, 851, 1) + put(data, 12605, 852, 1) + put(data, 12606, 853, 1) + put(data, 12607, 854, 1) + put(data, 12608, 855, 1) + put(data, 12609, 856, 1) + put(data, 12610, 857, 1) + put(data, 12611, 858, 1) + put(data, 12612, 859, 1) + put(data, 12613, 860, 1) + put(data, 12614, 861, 1) + put(data, 12615, 862, 1) + put(data, 12616, 863, 1) + put(data, 12617, 864, 1) + put(data, 12618, 865, 1) + put(data, 12619, 866, 1) + put(data, 12620, 867, 1) + put(data, 12621, 868, 1) + put(data, 12622, 869, 1) + put(data, 12623, 870, 1) + put(data, 12624, 871, 1) + put(data, 12625, 872, 1) + put(data, 12626, 873, 1) + put(data, 12627, 874, 1) + put(data, 12628, 875, 1) + put(data, 12629, 876, 1) + put(data, 12630, 877, 1) + put(data, 12631, 878, 1) + put(data, 12632, 879, 1) + put(data, 12633, 880, 1) + put(data, 12634, 881, 1) + put(data, 12635, 882, 1) + put(data, 12636, 883, 1) + put(data, 12637, 884, 1) + put(data, 12638, 885, 1) + put(data, 12639, 886, 1) + put(data, 12640, 887, 1) + put(data, 12641, 888, 1) + put(data, 12642, 889, 1) + put(data, 12643, 890, 1) + put(data, 12644, 891, 1) + put(data, 12645, 892, 1) + put(data, 12646, 893, 1) + put(data, 12647, 894, 1) + put(data, 12648, 895, 1) + put(data, 12649, 896, 1) + put(data, 12650, 897, 1) + put(data, 12651, 898, 1) + put(data, 12652, 899, 1) + put(data, 12653, 900, 1) + put(data, 12654, 901, 1) + put(data, 12655, 902, 1) + put(data, 12656, 903, 1) + put(data, 12657, 904, 1) + put(data, 12658, 905, 1) + put(data, 12659, 906, 1) + put(data, 12660, 907, 1) + put(data, 12661, 908, 1) + put(data, 12662, 909, 1) + put(data, 12663, 910, 1) + put(data, 12664, 911, 1) + put(data, 12665, 912, 1) + put(data, 12666, 913, 1) + put(data, 12667, 914, 1) + put(data, 12668, 915, 1) + put(data, 12669, 916, 1) + put(data, 12670, 917, 1) + put(data, 12671, 918, 1) + put(data, 12672, 919, 1) + put(data, 12673, 920, 1) + put(data, 12674, 921, 1) + put(data, 12675, 922, 1) + put(data, 12676, 923, 1) + put(data, 12677, 924, 1) + put(data, 12678, 925, 1) + put(data, 12679, 926, 1) + put(data, 12680, 927, 1) + put(data, 12681, 928, 1) + put(data, 12682, 929, 1) + put(data, 12683, 930, 1) + put(data, 12684, 931, 1) + put(data, 12685, 932, 1) + put(data, 12686, 933, 1) + put(data, 12690, 615, 1) + put(data, 12691, 621, 1) + put(data, 12692, 934, 1) + put(data, 12693, 935, 1) + put(data, 12694, 936, 1) + put(data, 12695, 937, 1) + put(data, 12696, 938, 1) + put(data, 12697, 939, 1) + put(data, 12698, 619, 1) + put(data, 12699, 940, 1) + put(data, 12700, 941, 1) + put(data, 12701, 942, 1) + put(data, 12702, 943, 1) + put(data, 12703, 623, 1) + put(data, 12800, 944, 3) + put(data, 12801, 947, 3) + put(data, 12802, 950, 3) + put(data, 12803, 953, 3) + put(data, 12804, 956, 3) + put(data, 12805, 959, 3) + put(data, 12806, 962, 3) + put(data, 12807, 965, 3) + put(data, 12808, 968, 3) + put(data, 12809, 971, 3) + put(data, 12810, 974, 3) + put(data, 12811, 977, 3) + put(data, 12812, 980, 3) + put(data, 12813, 983, 3) + put(data, 12814, 986, 4) + put(data, 12815, 990, 4) + put(data, 12816, 994, 4) + put(data, 12817, 998, 4) + put(data, 12818, 1002, 4) + put(data, 12819, 1006, 4) + put(data, 12820, 1010, 4) + put(data, 12821, 1014, 4) + put(data, 12822, 1018, 4) + put(data, 12823, 1022, 4) + put(data, 12824, 1026, 4) + put(data, 12825, 1030, 4) + put(data, 12826, 1034, 4) + put(data, 12827, 1038, 4) + put(data, 12828, 1042, 4) + put(data, 12829, 1046, 7) + put(data, 12830, 1053, 6) + put(data, 12832, 1059, 3) + put(data, 12833, 1062, 3) + put(data, 12834, 1065, 3) + put(data, 12835, 1068, 3) + put(data, 12836, 1071, 3) + put(data, 12837, 1074, 3) + put(data, 12838, 1077, 3) + put(data, 12839, 1080, 3) + put(data, 12840, 1083, 3) + put(data, 12841, 1086, 3) + put(data, 12842, 1089, 3) + put(data, 12843, 1092, 3) + put(data, 12844, 1095, 3) + put(data, 12845, 1098, 3) + put(data, 12846, 1101, 3) + put(data, 12847, 1104, 3) + put(data, 12848, 1107, 3) + put(data, 12849, 1110, 3) + put(data, 12850, 1113, 3) + put(data, 12851, 1116, 3) + put(data, 12852, 1119, 3) + put(data, 12853, 1122, 3) + put(data, 12854, 1125, 3) + put(data, 12855, 1128, 3) + put(data, 12856, 1131, 3) + put(data, 12857, 1134, 3) + put(data, 12858, 1137, 3) + put(data, 12859, 1140, 3) + put(data, 12860, 1143, 3) + put(data, 12861, 1146, 3) + put(data, 12862, 1149, 3) + put(data, 12863, 1152, 3) + put(data, 12864, 1155, 3) + put(data, 12865, 1158, 3) + put(data, 12866, 1161, 3) + put(data, 12867, 1164, 3) + put(data, 12868, 1167, 1) + put(data, 12869, 1168, 1) + put(data, 12870, 681, 1) + put(data, 12871, 1169, 1) + put(data, 12880, 1170, 3) + put(data, 12881, 389, 2) + put(data, 12882, 1173, 2) + put(data, 12883, 6, 2) + put(data, 12884, 1175, 2) + put(data, 12885, 1177, 2) + put(data, 12886, 1179, 2) + put(data, 12887, 1181, 2) + put(data, 12888, 1183, 2) + put(data, 12889, 1185, 2) + put(data, 12890, 1187, 2) + put(data, 12891, 296, 2) + put(data, 12892, 293, 2) + put(data, 12893, 1189, 2) + put(data, 12894, 1191, 2) + put(data, 12895, 1193, 2) + put(data, 12896, 840, 1) + put(data, 12897, 843, 1) + put(data, 12898, 846, 1) + put(data, 12899, 848, 1) + put(data, 12900, 856, 1) + put(data, 12901, 857, 1) + put(data, 12902, 860, 1) + put(data, 12903, 862, 1) + put(data, 12904, 863, 1) + put(data, 12905, 865, 1) + put(data, 12906, 866, 1) + put(data, 12907, 867, 1) + put(data, 12908, 868, 1) + put(data, 12909, 869, 1) + put(data, 12910, 987, 2) + put(data, 12911, 991, 2) + put(data, 12912, 995, 2) + put(data, 12913, 999, 2) + put(data, 12914, 1003, 2) + put(data, 12915, 1007, 2) + put(data, 12916, 1011, 2) + put(data, 12917, 1015, 2) + put(data, 12918, 1019, 2) + put(data, 12919, 1023, 2) + put(data, 12920, 1027, 2) + put(data, 12921, 1031, 2) + put(data, 12922, 1035, 2) + put(data, 12923, 869, 2) + put(data, 12924, 1195, 5) + put(data, 12925, 1200, 4) + put(data, 12926, 1204, 2) + put(data, 12928, 615, 1) + put(data, 12929, 621, 1) + put(data, 12930, 934, 1) + put(data, 12931, 935, 1) + put(data, 12932, 1072, 1) + put(data, 12933, 1075, 1) + put(data, 12934, 1078, 1) + put(data, 12935, 626, 1) + put(data, 12936, 1084, 1) + put(data, 12937, 638, 1) + put(data, 12938, 688, 1) + put(data, 12939, 700, 1) + put(data, 12940, 699, 1) + put(data, 12941, 689, 1) + put(data, 12942, 781, 1) + put(data, 12943, 646, 1) + put(data, 12944, 686, 1) + put(data, 12945, 1111, 1) + put(data, 12946, 1114, 1) + put(data, 12947, 1117, 1) + put(data, 12948, 1120, 1) + put(data, 12949, 1123, 1) + put(data, 12950, 1126, 1) + put(data, 12951, 1129, 1) + put(data, 12952, 1132, 1) + put(data, 12953, 1206, 1) + put(data, 12954, 1207, 1) + put(data, 12955, 652, 1) + put(data, 12956, 1208, 1) + put(data, 12957, 1209, 1) + put(data, 12958, 1210, 1) + put(data, 12959, 1211, 1) + put(data, 12960, 1212, 1) + put(data, 12961, 1159, 1) + put(data, 12962, 1213, 1) + put(data, 12963, 1214, 1) + put(data, 12964, 936, 1) + put(data, 12965, 937, 1) + put(data, 12966, 938, 1) + put(data, 12967, 1215, 1) + put(data, 12968, 1216, 1) + put(data, 12969, 1217, 1) + put(data, 12970, 1218, 1) + put(data, 12971, 1141, 1) + put(data, 12972, 1144, 1) + put(data, 12973, 1147, 1) + put(data, 12974, 1150, 1) + put(data, 12975, 1153, 1) + put(data, 12976, 1219, 1) + put(data, 12977, 1220, 2) + put(data, 12978, 1222, 2) + put(data, 12979, 1224, 2) + put(data, 12980, 1226, 2) + put(data, 12981, 1228, 2) + put(data, 12982, 17, 2) + put(data, 12983, 1176, 2) + put(data, 12984, 1192, 2) + put(data, 12985, 1230, 2) + put(data, 12986, 1232, 2) + put(data, 12987, 1234, 2) + put(data, 12988, 1236, 2) + put(data, 12989, 1238, 2) + put(data, 12990, 1240, 2) + put(data, 12991, 1242, 2) + put(data, 12992, 1244, 2) + put(data, 12993, 1246, 2) + put(data, 12994, 1248, 2) + put(data, 12995, 1250, 2) + put(data, 12996, 1252, 2) + put(data, 12997, 1254, 2) + put(data, 12998, 1256, 2) + put(data, 12999, 1258, 2) + put(data, 13000, 1260, 2) + put(data, 13001, 1262, 3) + put(data, 13002, 1265, 3) + put(data, 13003, 1268, 3) + put(data, 13004, 1271, 2) + put(data, 13005, 1273, 3) + put(data, 13006, 1276, 2) + put(data, 13007, 1278, 3) + put(data, 13008, 1281, 1) + put(data, 13009, 1282, 1) + put(data, 13010, 1283, 1) + put(data, 13011, 1284, 1) + put(data, 13012, 1285, 1) + put(data, 13013, 1286, 1) + put(data, 13014, 1287, 1) + put(data, 13015, 1288, 1) + put(data, 13016, 1289, 1) + put(data, 13017, 838, 1) + put(data, 13018, 1290, 1) + put(data, 13019, 1291, 1) + put(data, 13020, 1292, 1) + put(data, 13021, 1293, 1) + put(data, 13022, 1294, 1) + put(data, 13023, 1295, 1) + put(data, 13024, 1296, 1) + put(data, 13025, 1297, 1) + put(data, 13026, 1298, 1) + put(data, 13027, 839, 1) + put(data, 13028, 1299, 1) + put(data, 13029, 1300, 1) + put(data, 13030, 1301, 1) + put(data, 13031, 1302, 1) + put(data, 13032, 1303, 1) + put(data, 13033, 1304, 1) + put(data, 13034, 1305, 1) + put(data, 13035, 1306, 1) + put(data, 13036, 1307, 1) + put(data, 13037, 1308, 1) + put(data, 13038, 1309, 1) + put(data, 13039, 1310, 1) + put(data, 13040, 1311, 1) + put(data, 13041, 1312, 1) + put(data, 13042, 1313, 1) + put(data, 13043, 1314, 1) + put(data, 13044, 1315, 1) + put(data, 13045, 1316, 1) + put(data, 13046, 1317, 1) + put(data, 13047, 1318, 1) + put(data, 13048, 1319, 1) + put(data, 13049, 1320, 1) + put(data, 13050, 1321, 1) + put(data, 13051, 1322, 1) + put(data, 13052, 1323, 1) + put(data, 13053, 1324, 1) + put(data, 13054, 1325, 1) + put(data, 13055, 1326, 2) + put(data, 13056, 1328, 4) + put(data, 13057, 1332, 4) + put(data, 13058, 1336, 4) + put(data, 13059, 1340, 3) + put(data, 13060, 1343, 4) + put(data, 13061, 1347, 3) + put(data, 13062, 1350, 3) + put(data, 13063, 1353, 5) + put(data, 13064, 1358, 4) + put(data, 13065, 1362, 3) + put(data, 13066, 1365, 3) + put(data, 13067, 1368, 3) + put(data, 13068, 1371, 4) + put(data, 13069, 1375, 4) + put(data, 13070, 1379, 3) + put(data, 13071, 1382, 3) + put(data, 13072, 1385, 2) + put(data, 13073, 1387, 3) + put(data, 13074, 1390, 4) + put(data, 13075, 1394, 4) + put(data, 13076, 1398, 2) + put(data, 13077, 1400, 5) + put(data, 13078, 1405, 6) + put(data, 13079, 1411, 5) + put(data, 13080, 1402, 3) + put(data, 13081, 1416, 5) + put(data, 13082, 1421, 5) + put(data, 13083, 1426, 4) + put(data, 13084, 1430, 3) + put(data, 13085, 1433, 3) + put(data, 13086, 1436, 3) + put(data, 13087, 1439, 4) + put(data, 13088, 1443, 5) + put(data, 13089, 1448, 4) + put(data, 13090, 1452, 3) + put(data, 13091, 1455, 3) + put(data, 13092, 1458, 3) + put(data, 13093, 1461, 2) + put(data, 13094, 1463, 2) + put(data, 13095, 1419, 2) + put(data, 13096, 1465, 2) + put(data, 13097, 1467, 3) + put(data, 13098, 1470, 3) + put(data, 13099, 1473, 5) + put(data, 13100, 1478, 3) + put(data, 13101, 1481, 4) + put(data, 13102, 1485, 5) + put(data, 13103, 1490, 3) + put(data, 13104, 1493, 2) + put(data, 13105, 1495, 2) + put(data, 13106, 1497, 5) + put(data, 13107, 1502, 4) + put(data, 13108, 1506, 5) + put(data, 13109, 1511, 3) + put(data, 13110, 1514, 5) + put(data, 13111, 1519, 2) + put(data, 13112, 1521, 3) + put(data, 13113, 1524, 3) + put(data, 13114, 1527, 3) + put(data, 13115, 1530, 3) + put(data, 13116, 1533, 3) + put(data, 13117, 1536, 4) + put(data, 13118, 1540, 3) + put(data, 13119, 1543, 2) + put(data, 13120, 1545, 3) + put(data, 13121, 1548, 3) + put(data, 13122, 1551, 3) + put(data, 13123, 1554, 4) + put(data, 13124, 1558, 3) + put(data, 13125, 1561, 3) + put(data, 13126, 1564, 3) + put(data, 13127, 1567, 5) + put(data, 13128, 1572, 4) + put(data, 13129, 1576, 2) + put(data, 13130, 1578, 5) + put(data, 13131, 1583, 2) + put(data, 13132, 1585, 4) + put(data, 13133, 1407, 4) + put(data, 13134, 1589, 3) + put(data, 13135, 1592, 3) + put(data, 13136, 1595, 3) + put(data, 13137, 1598, 4) + put(data, 13138, 1602, 2) + put(data, 13139, 1604, 3) + put(data, 13140, 1607, 4) + put(data, 13141, 1611, 2) + put(data, 13142, 1613, 5) + put(data, 13143, 1413, 3) + put(data, 13144, 1618, 2) + put(data, 13145, 1620, 2) + put(data, 13146, 1622, 2) + put(data, 13147, 1624, 2) + put(data, 13148, 1626, 2) + put(data, 13149, 1628, 2) + put(data, 13150, 1630, 2) + put(data, 13151, 1632, 2) + put(data, 13152, 1634, 2) + put(data, 13153, 1636, 2) + put(data, 13154, 1638, 3) + put(data, 13155, 1641, 3) + put(data, 13156, 1644, 3) + put(data, 13157, 1647, 3) + put(data, 13158, 1650, 3) + put(data, 13159, 1653, 3) + put(data, 13160, 1656, 3) + put(data, 13161, 1659, 3) + put(data, 13162, 1662, 3) + put(data, 13163, 1665, 3) + put(data, 13164, 1668, 3) + put(data, 13165, 1671, 3) + put(data, 13166, 1674, 3) + put(data, 13167, 1677, 3) + put(data, 13168, 1680, 3) + put(data, 13169, 1683, 3) + put(data, 13170, 1686, 2) + put(data, 13171, 1688, 2) + put(data, 13172, 1690, 3) + put(data, 13173, 1693, 2) + put(data, 13174, 1695, 2) + put(data, 13175, 1697, 2) + put(data, 13176, 1699, 3) + put(data, 13177, 1702, 3) + put(data, 13178, 1705, 2) + put(data, 13179, 1707, 2) + put(data, 13180, 1709, 2) + put(data, 13181, 1711, 2) + put(data, 13182, 1713, 2) + put(data, 13183, 1715, 4) + put(data, 13184, 1719, 2) + put(data, 13185, 1721, 2) + put(data, 13186, 1723, 2) + put(data, 13187, 1725, 2) + put(data, 13188, 1727, 2) + put(data, 13189, 1729, 2) + put(data, 13190, 1731, 2) + put(data, 13191, 1733, 2) + put(data, 13192, 1735, 3) + put(data, 13193, 1738, 4) + put(data, 13194, 1742, 2) + put(data, 13195, 1744, 2) + put(data, 13196, 1746, 2) + put(data, 13197, 1748, 2) + put(data, 13198, 1750, 2) + put(data, 13199, 1752, 2) + put(data, 13200, 1754, 2) + put(data, 13201, 1756, 3) + put(data, 13202, 1759, 3) + put(data, 13203, 1762, 3) + put(data, 13204, 1765, 3) + put(data, 13205, 1768, 2) + put(data, 13206, 1770, 2) + put(data, 13207, 1772, 2) + put(data, 13208, 1774, 2) + put(data, 13209, 1776, 2) + put(data, 13210, 1778, 2) + put(data, 13211, 1780, 2) + put(data, 13212, 1782, 2) + put(data, 13213, 1784, 2) + put(data, 13214, 144, 2) + put(data, 13215, 1786, 3) + put(data, 13216, 1789, 3) + put(data, 13217, 1700, 2) + put(data, 13218, 1792, 3) + put(data, 13219, 1795, 3) + put(data, 13220, 1798, 3) + put(data, 13221, 1703, 2) + put(data, 13222, 1801, 3) + put(data, 13223, 1804, 3) + put(data, 13224, 1807, 4) + put(data, 13225, 1684, 2) + put(data, 13226, 1811, 3) + put(data, 13227, 1814, 3) + put(data, 13228, 1817, 3) + put(data, 13229, 1820, 3) + put(data, 13230, 1823, 5) + put(data, 13231, 1828, 6) + put(data, 13232, 1834, 2) + put(data, 13233, 33, 2) + put(data, 13234, 1836, 2) + put(data, 13235, 1838, 2) + put(data, 13236, 1840, 2) + put(data, 13237, 1842, 2) + put(data, 13238, 1844, 2) + put(data, 13239, 1846, 2) + put(data, 13240, 1848, 2) + put(data, 13241, 1850, 2) + put(data, 13242, 1852, 2) + put(data, 13243, 1854, 2) + put(data, 13244, 1856, 2) + put(data, 13245, 1858, 2) + put(data, 13246, 1860, 2) + put(data, 13247, 1862, 2) + put(data, 13248, 1864, 2) + put(data, 13249, 1866, 2) + put(data, 13250, 1868, 4) + put(data, 13251, 1872, 2) + put(data, 13252, 1874, 2) + put(data, 13253, 1696, 2) + put(data, 13254, 1876, 4) + put(data, 13255, 1880, 3) + put(data, 13256, 1883, 2) + put(data, 13257, 1885, 2) + put(data, 13258, 1887, 2) + put(data, 13259, 1889, 2) + put(data, 13260, 1891, 2) + put(data, 13261, 1893, 2) + put(data, 13262, 126, 2) + put(data, 13263, 1895, 2) + put(data, 13264, 1897, 2) + put(data, 13265, 1899, 2) + put(data, 13266, 1901, 3) + put(data, 13267, 1904, 2) + put(data, 13268, 1906, 2) + put(data, 13269, 1908, 3) + put(data, 13270, 1911, 3) + put(data, 13271, 1914, 2) + put(data, 13272, 1916, 4) + put(data, 13273, 1920, 3) + put(data, 13274, 130, 2) + put(data, 13275, 1827, 2) + put(data, 13276, 1923, 2) + put(data, 13277, 1925, 2) + put(data, 13278, 1927, 3) + put(data, 13279, 1930, 3) + put(data, 13280, 1933, 2) + put(data, 13281, 1935, 2) + put(data, 13282, 1937, 2) + put(data, 13283, 1939, 2) + put(data, 13284, 1941, 2) + put(data, 13285, 1943, 2) + put(data, 13286, 1945, 2) + put(data, 13287, 1947, 2) + put(data, 13288, 1949, 2) + put(data, 13289, 1951, 3) + put(data, 13290, 1954, 3) + put(data, 13291, 1957, 3) + put(data, 13292, 1960, 3) + put(data, 13293, 1963, 3) + put(data, 13294, 1966, 3) + put(data, 13295, 1969, 3) + put(data, 13296, 1972, 3) + put(data, 13297, 1975, 3) + put(data, 13298, 1978, 3) + put(data, 13299, 1981, 3) + put(data, 13300, 1984, 3) + put(data, 13301, 1987, 3) + put(data, 13302, 1990, 3) + put(data, 13303, 1993, 3) + put(data, 13304, 1996, 3) + put(data, 13305, 1999, 3) + put(data, 13306, 2002, 3) + put(data, 13307, 2005, 3) + put(data, 13308, 2008, 3) + put(data, 13309, 2011, 3) + put(data, 13310, 2014, 3) + put(data, 13311, 2017, 3) + put(data, 42652, 2020, 1) + put(data, 42653, 2021, 1) + put(data, 42864, 2022, 1) + put(data, 42994, 248, 1) + put(data, 42995, 259, 1) + put(data, 42996, 263, 1) + put(data, 43000, 2023, 1) + put(data, 43001, 2024, 1) + put(data, 43868, 2025, 1) + put(data, 43869, 2026, 1) + put(data, 43870, 2027, 1) + put(data, 43871, 2028, 1) + put(data, 43881, 2029, 1) + put(data, 64256, 2030, 2) + put(data, 64257, 2032, 2) + put(data, 64258, 2034, 2) + put(data, 64259, 2031, 3) + put(data, 64260, 2036, 3) + put(data, 64261, 2039, 2) + put(data, 64262, 2041, 2) + put(data, 64275, 2043, 2) + put(data, 64276, 2045, 2) + put(data, 64277, 2047, 2) + put(data, 64278, 2049, 2) + put(data, 64279, 2051, 2) + put(data, 64288, 2053, 1) + put(data, 64289, 271, 1) + put(data, 64290, 274, 1) + put(data, 64291, 2054, 1) + put(data, 64292, 2055, 1) + put(data, 64293, 2056, 1) + put(data, 64294, 2057, 1) + put(data, 64295, 2058, 1) + put(data, 64296, 2059, 1) + put(data, 64297, 235, 1) + put(data, 64335, 2060, 2) + put(data, 64336, 2062, 1) + put(data, 64337, 2062, 1) + put(data, 64338, 2063, 1) + put(data, 64339, 2063, 1) + put(data, 64340, 2063, 1) + put(data, 64341, 2063, 1) + put(data, 64342, 2064, 1) + put(data, 64343, 2064, 1) + put(data, 64344, 2064, 1) + put(data, 64345, 2064, 1) + put(data, 64346, 2065, 1) + put(data, 64347, 2065, 1) + put(data, 64348, 2065, 1) + put(data, 64349, 2065, 1) + put(data, 64350, 2066, 1) + put(data, 64351, 2066, 1) + put(data, 64352, 2066, 1) + put(data, 64353, 2066, 1) + put(data, 64354, 2067, 1) + put(data, 64355, 2067, 1) + put(data, 64356, 2067, 1) + put(data, 64357, 2067, 1) + put(data, 64358, 2068, 1) + put(data, 64359, 2068, 1) + put(data, 64360, 2068, 1) + put(data, 64361, 2068, 1) + put(data, 64362, 2069, 1) + put(data, 64363, 2069, 1) + put(data, 64364, 2069, 1) + put(data, 64365, 2069, 1) + put(data, 64366, 2070, 1) + put(data, 64367, 2070, 1) + put(data, 64368, 2070, 1) + put(data, 64369, 2070, 1) + put(data, 64370, 2071, 1) + put(data, 64371, 2071, 1) + put(data, 64372, 2071, 1) + put(data, 64373, 2071, 1) + put(data, 64374, 2072, 1) + put(data, 64375, 2072, 1) + put(data, 64376, 2072, 1) + put(data, 64377, 2072, 1) + put(data, 64378, 2073, 1) + put(data, 64379, 2073, 1) + put(data, 64380, 2073, 1) + put(data, 64381, 2073, 1) + put(data, 64382, 2074, 1) + put(data, 64383, 2074, 1) + put(data, 64384, 2074, 1) + put(data, 64385, 2074, 1) + put(data, 64386, 2075, 1) + put(data, 64387, 2075, 1) + put(data, 64388, 2076, 1) + put(data, 64389, 2076, 1) + put(data, 64390, 2077, 1) + put(data, 64391, 2077, 1) + put(data, 64392, 2078, 1) + put(data, 64393, 2078, 1) + put(data, 64394, 2079, 1) + put(data, 64395, 2079, 1) + put(data, 64396, 2080, 1) + put(data, 64397, 2080, 1) + put(data, 64398, 2081, 1) + put(data, 64399, 2081, 1) + put(data, 64400, 2081, 1) + put(data, 64401, 2081, 1) + put(data, 64402, 2082, 1) + put(data, 64403, 2082, 1) + put(data, 64404, 2082, 1) + put(data, 64405, 2082, 1) + put(data, 64406, 2083, 1) + put(data, 64407, 2083, 1) + put(data, 64408, 2083, 1) + put(data, 64409, 2083, 1) + put(data, 64410, 2084, 1) + put(data, 64411, 2084, 1) + put(data, 64412, 2084, 1) + put(data, 64413, 2084, 1) + put(data, 64414, 2085, 1) + put(data, 64415, 2085, 1) + put(data, 64416, 2086, 1) + put(data, 64417, 2086, 1) + put(data, 64418, 2086, 1) + put(data, 64419, 2086, 1) + put(data, 64420, 2087, 1) + put(data, 64421, 2087, 1) + put(data, 64422, 2088, 1) + put(data, 64423, 2088, 1) + put(data, 64424, 2088, 1) + put(data, 64425, 2088, 1) + put(data, 64426, 2089, 1) + put(data, 64427, 2089, 1) + put(data, 64428, 2089, 1) + put(data, 64429, 2089, 1) + put(data, 64430, 2090, 1) + put(data, 64431, 2090, 1) + put(data, 64432, 2091, 1) + put(data, 64433, 2091, 1) + put(data, 64467, 2092, 1) + put(data, 64468, 2092, 1) + put(data, 64469, 2092, 1) + put(data, 64470, 2092, 1) + put(data, 64471, 101, 1) + put(data, 64472, 101, 1) + put(data, 64473, 2093, 1) + put(data, 64474, 2093, 1) + put(data, 64475, 2094, 1) + put(data, 64476, 2094, 1) + put(data, 64477, 2095, 1) + put(data, 64478, 2096, 1) + put(data, 64479, 2096, 1) + put(data, 64480, 2097, 1) + put(data, 64481, 2097, 1) + put(data, 64482, 2098, 1) + put(data, 64483, 2098, 1) + put(data, 64484, 2099, 1) + put(data, 64485, 2099, 1) + put(data, 64486, 2099, 1) + put(data, 64487, 2099, 1) + put(data, 64488, 2100, 1) + put(data, 64489, 2100, 1) + put(data, 64490, 2101, 2) + put(data, 64491, 2101, 2) + put(data, 64492, 2103, 2) + put(data, 64493, 2103, 2) + put(data, 64494, 2105, 2) + put(data, 64495, 2105, 2) + put(data, 64496, 2107, 2) + put(data, 64497, 2107, 2) + put(data, 64498, 2109, 2) + put(data, 64499, 2109, 2) + put(data, 64500, 2111, 2) + put(data, 64501, 2111, 2) + put(data, 64502, 2113, 2) + put(data, 64503, 2113, 2) + put(data, 64504, 2113, 2) + put(data, 64505, 2115, 2) + put(data, 64506, 2115, 2) + put(data, 64507, 2115, 2) + put(data, 64508, 2117, 1) + put(data, 64509, 2117, 1) + put(data, 64510, 2117, 1) + put(data, 64511, 2117, 1) + put(data, 64512, 2118, 2) + put(data, 64513, 2120, 2) + put(data, 64514, 2122, 2) + put(data, 64515, 2115, 2) + put(data, 64516, 2124, 2) + put(data, 64517, 2126, 2) + put(data, 64518, 2128, 2) + put(data, 64519, 2130, 2) + put(data, 64520, 2132, 2) + put(data, 64521, 2134, 2) + put(data, 64522, 2136, 2) + put(data, 64523, 2138, 2) + put(data, 64524, 2140, 2) + put(data, 64525, 2142, 2) + put(data, 64526, 2144, 2) + put(data, 64527, 2146, 2) + put(data, 64528, 2148, 2) + put(data, 64529, 2150, 2) + put(data, 64530, 2152, 2) + put(data, 64531, 2154, 2) + put(data, 64532, 2156, 2) + put(data, 64533, 2158, 2) + put(data, 64534, 2160, 2) + put(data, 64535, 2159, 2) + put(data, 64536, 2162, 2) + put(data, 64537, 2164, 2) + put(data, 64538, 2166, 2) + put(data, 64539, 2168, 2) + put(data, 64540, 2170, 2) + put(data, 64541, 2172, 2) + put(data, 64542, 2174, 2) + put(data, 64543, 2176, 2) + put(data, 64544, 2178, 2) + put(data, 64545, 2180, 2) + put(data, 64546, 2182, 2) + put(data, 64547, 2184, 2) + put(data, 64548, 2186, 2) + put(data, 64549, 2188, 2) + put(data, 64550, 2190, 2) + put(data, 64551, 2192, 2) + put(data, 64552, 2194, 2) + put(data, 64553, 2196, 2) + put(data, 64554, 2198, 2) + put(data, 64555, 2200, 2) + put(data, 64556, 2202, 2) + put(data, 64557, 2204, 2) + put(data, 64558, 2206, 2) + put(data, 64559, 2208, 2) + put(data, 64560, 2210, 2) + put(data, 64561, 2212, 2) + put(data, 64562, 2214, 2) + put(data, 64563, 2216, 2) + put(data, 64564, 2218, 2) + put(data, 64565, 2220, 2) + put(data, 64566, 2222, 2) + put(data, 64567, 2224, 2) + put(data, 64568, 2226, 2) + put(data, 64569, 2228, 2) + put(data, 64570, 2230, 2) + put(data, 64571, 2232, 2) + put(data, 64572, 2234, 2) + put(data, 64573, 2236, 2) + put(data, 64574, 2238, 2) + put(data, 64575, 2240, 2) + put(data, 64576, 2242, 2) + put(data, 64577, 2244, 2) + put(data, 64578, 2246, 2) + put(data, 64579, 2248, 2) + put(data, 64580, 2250, 2) + put(data, 64581, 2252, 2) + put(data, 64582, 2161, 2) + put(data, 64583, 2163, 2) + put(data, 64584, 2254, 2) + put(data, 64585, 2256, 2) + put(data, 64586, 2258, 2) + put(data, 64587, 2260, 2) + put(data, 64588, 2262, 2) + put(data, 64589, 2264, 2) + put(data, 64590, 2266, 2) + put(data, 64591, 2268, 2) + put(data, 64592, 2270, 2) + put(data, 64593, 2272, 2) + put(data, 64594, 2274, 2) + put(data, 64595, 2276, 2) + put(data, 64596, 2278, 2) + put(data, 64597, 2157, 2) + put(data, 64598, 2280, 2) + put(data, 64599, 2282, 2) + put(data, 64600, 2251, 2) + put(data, 64601, 2284, 2) + put(data, 64602, 2279, 2) + put(data, 64603, 2286, 2) + put(data, 64604, 2288, 2) + put(data, 64605, 2290, 2) + put(data, 64606, 2292, 3) + put(data, 64607, 2295, 3) + put(data, 64608, 2298, 3) + put(data, 64609, 2301, 3) + put(data, 64610, 2304, 3) + put(data, 64611, 2307, 3) + put(data, 64612, 2310, 2) + put(data, 64613, 2312, 2) + put(data, 64614, 2122, 2) + put(data, 64615, 2314, 2) + put(data, 64616, 2115, 2) + put(data, 64617, 2124, 2) + put(data, 64618, 2316, 2) + put(data, 64619, 2318, 2) + put(data, 64620, 2132, 2) + put(data, 64621, 2320, 2) + put(data, 64622, 2134, 2) + put(data, 64623, 2136, 2) + put(data, 64624, 2322, 2) + put(data, 64625, 2324, 2) + put(data, 64626, 2144, 2) + put(data, 64627, 2326, 2) + put(data, 64628, 2146, 2) + put(data, 64629, 2148, 2) + put(data, 64630, 2328, 2) + put(data, 64631, 2330, 2) + put(data, 64632, 2152, 2) + put(data, 64633, 2332, 2) + put(data, 64634, 2154, 2) + put(data, 64635, 2156, 2) + put(data, 64636, 2212, 2) + put(data, 64637, 2214, 2) + put(data, 64638, 2220, 2) + put(data, 64639, 2222, 2) + put(data, 64640, 2224, 2) + put(data, 64641, 2232, 2) + put(data, 64642, 2234, 2) + put(data, 64643, 2236, 2) + put(data, 64644, 2238, 2) + put(data, 64645, 2246, 2) + put(data, 64646, 2248, 2) + put(data, 64647, 2250, 2) + put(data, 64648, 2334, 2) + put(data, 64649, 2254, 2) + put(data, 64650, 2336, 2) + put(data, 64651, 2338, 2) + put(data, 64652, 2266, 2) + put(data, 64653, 2340, 2) + put(data, 64654, 2268, 2) + put(data, 64655, 2270, 2) + put(data, 64656, 2290, 2) + put(data, 64657, 2342, 2) + put(data, 64658, 2344, 2) + put(data, 64659, 2251, 2) + put(data, 64660, 2259, 2) + put(data, 64661, 2284, 2) + put(data, 64662, 2279, 2) + put(data, 64663, 2118, 2) + put(data, 64664, 2120, 2) + put(data, 64665, 2346, 2) + put(data, 64666, 2122, 2) + put(data, 64667, 2348, 2) + put(data, 64668, 2126, 2) + put(data, 64669, 2128, 2) + put(data, 64670, 2130, 2) + put(data, 64671, 2132, 2) + put(data, 64672, 2350, 2) + put(data, 64673, 2138, 2) + put(data, 64674, 2140, 2) + put(data, 64675, 2142, 2) + put(data, 64676, 2144, 2) + put(data, 64677, 2352, 2) + put(data, 64678, 2152, 2) + put(data, 64679, 2158, 2) + put(data, 64680, 2160, 2) + put(data, 64681, 2159, 2) + put(data, 64682, 2162, 2) + put(data, 64683, 2164, 2) + put(data, 64684, 2168, 2) + put(data, 64685, 2170, 2) + put(data, 64686, 2172, 2) + put(data, 64687, 2174, 2) + put(data, 64688, 2176, 2) + put(data, 64689, 2178, 2) + put(data, 64690, 2354, 2) + put(data, 64691, 2180, 2) + put(data, 64692, 2182, 2) + put(data, 64693, 2184, 2) + put(data, 64694, 2186, 2) + put(data, 64695, 2188, 2) + put(data, 64696, 2190, 2) + put(data, 64697, 2194, 2) + put(data, 64698, 2196, 2) + put(data, 64699, 2198, 2) + put(data, 64700, 2200, 2) + put(data, 64701, 2202, 2) + put(data, 64702, 2204, 2) + put(data, 64703, 2206, 2) + put(data, 64704, 2208, 2) + put(data, 64705, 2210, 2) + put(data, 64706, 2216, 2) + put(data, 64707, 2218, 2) + put(data, 64708, 2226, 2) + put(data, 64709, 2228, 2) + put(data, 64710, 2230, 2) + put(data, 64711, 2232, 2) + put(data, 64712, 2234, 2) + put(data, 64713, 2240, 2) + put(data, 64714, 2242, 2) + put(data, 64715, 2244, 2) + put(data, 64716, 2246, 2) + put(data, 64717, 2356, 2) + put(data, 64718, 2252, 2) + put(data, 64719, 2161, 2) + put(data, 64720, 2163, 2) + put(data, 64721, 2254, 2) + put(data, 64722, 2260, 2) + put(data, 64723, 2262, 2) + put(data, 64724, 2264, 2) + put(data, 64725, 2266, 2) + put(data, 64726, 2358, 2) + put(data, 64727, 2272, 2) + put(data, 64728, 2274, 2) + put(data, 64729, 2360, 2) + put(data, 64730, 2157, 2) + put(data, 64731, 2280, 2) + put(data, 64732, 2282, 2) + put(data, 64733, 2251, 2) + put(data, 64734, 2271, 2) + put(data, 64735, 2122, 2) + put(data, 64736, 2348, 2) + put(data, 64737, 2132, 2) + put(data, 64738, 2350, 2) + put(data, 64739, 2144, 2) + put(data, 64740, 2352, 2) + put(data, 64741, 2152, 2) + put(data, 64742, 2362, 2) + put(data, 64743, 2176, 2) + put(data, 64744, 2364, 2) + put(data, 64745, 2366, 2) + put(data, 64746, 2368, 2) + put(data, 64747, 2232, 2) + put(data, 64748, 2234, 2) + put(data, 64749, 2246, 2) + put(data, 64750, 2266, 2) + put(data, 64751, 2358, 2) + put(data, 64752, 2251, 2) + put(data, 64753, 2271, 2) + put(data, 64754, 2370, 3) + put(data, 64755, 2373, 3) + put(data, 64756, 2376, 3) + put(data, 64757, 2379, 2) + put(data, 64758, 2381, 2) + put(data, 64759, 2383, 2) + put(data, 64760, 2385, 2) + put(data, 64761, 2387, 2) + put(data, 64762, 2389, 2) + put(data, 64763, 2391, 2) + put(data, 64764, 2393, 2) + put(data, 64765, 2395, 2) + put(data, 64766, 2397, 2) + put(data, 64767, 2399, 2) + put(data, 64768, 2281, 2) + put(data, 64769, 2401, 2) + put(data, 64770, 2403, 2) + put(data, 64771, 2405, 2) + put(data, 64772, 2283, 2) + put(data, 64773, 2407, 2) + put(data, 64774, 2409, 2) + put(data, 64775, 2411, 2) + put(data, 64776, 2413, 2) + put(data, 64777, 2415, 2) + put(data, 64778, 2417, 2) + put(data, 64779, 2419, 2) + put(data, 64780, 2366, 2) + put(data, 64781, 2421, 2) + put(data, 64782, 2423, 2) + put(data, 64783, 2425, 2) + put(data, 64784, 2427, 2) + put(data, 64785, 2379, 2) + put(data, 64786, 2381, 2) + put(data, 64787, 2383, 2) + put(data, 64788, 2385, 2) + put(data, 64789, 2387, 2) + put(data, 64790, 2389, 2) + put(data, 64791, 2391, 2) + put(data, 64792, 2393, 2) + put(data, 64793, 2395, 2) + put(data, 64794, 2397, 2) + put(data, 64795, 2399, 2) + put(data, 64796, 2281, 2) + put(data, 64797, 2401, 2) + put(data, 64798, 2403, 2) + put(data, 64799, 2405, 2) + put(data, 64800, 2283, 2) + put(data, 64801, 2407, 2) + put(data, 64802, 2409, 2) + put(data, 64803, 2411, 2) + put(data, 64804, 2413, 2) + put(data, 64805, 2415, 2) + put(data, 64806, 2417, 2) + put(data, 64807, 2419, 2) + put(data, 64808, 2366, 2) + put(data, 64809, 2421, 2) + put(data, 64810, 2423, 2) + put(data, 64811, 2425, 2) + put(data, 64812, 2427, 2) + put(data, 64813, 2415, 2) + put(data, 64814, 2417, 2) + put(data, 64815, 2419, 2) + put(data, 64816, 2366, 2) + put(data, 64817, 2364, 2) + put(data, 64818, 2368, 2) + put(data, 64819, 2192, 2) + put(data, 64820, 2170, 2) + put(data, 64821, 2172, 2) + put(data, 64822, 2174, 2) + put(data, 64823, 2415, 2) + put(data, 64824, 2417, 2) + put(data, 64825, 2419, 2) + put(data, 64826, 2192, 2) + put(data, 64827, 2194, 2) + put(data, 64828, 2429, 2) + put(data, 64829, 2429, 2) + put(data, 64848, 2431, 3) + put(data, 64849, 2434, 3) + put(data, 64850, 2434, 3) + put(data, 64851, 2437, 3) + put(data, 64852, 2440, 3) + put(data, 64853, 2443, 3) + put(data, 64854, 2446, 3) + put(data, 64855, 2449, 3) + put(data, 64856, 2160, 3) + put(data, 64857, 2160, 3) + put(data, 64858, 2452, 3) + put(data, 64859, 2455, 3) + put(data, 64860, 2458, 3) + put(data, 64861, 2461, 3) + put(data, 64862, 2464, 3) + put(data, 64863, 2467, 3) + put(data, 64864, 2467, 3) + put(data, 64865, 2470, 3) + put(data, 64866, 2473, 3) + put(data, 64867, 2473, 3) + put(data, 64868, 2476, 3) + put(data, 64869, 2476, 3) + put(data, 64870, 2479, 3) + put(data, 64871, 2482, 3) + put(data, 64872, 2482, 3) + put(data, 64873, 2485, 3) + put(data, 64874, 2488, 3) + put(data, 64875, 2488, 3) + put(data, 64876, 2491, 3) + put(data, 64877, 2491, 3) + put(data, 64878, 2494, 3) + put(data, 64879, 2497, 3) + put(data, 64880, 2497, 3) + put(data, 64881, 2500, 3) + put(data, 64882, 2500, 3) + put(data, 64883, 2503, 3) + put(data, 64884, 2506, 3) + put(data, 64885, 2509, 3) + put(data, 64886, 2512, 3) + put(data, 64887, 2512, 3) + put(data, 64888, 2515, 3) + put(data, 64889, 2518, 3) + put(data, 64890, 2521, 3) + put(data, 64891, 2524, 3) + put(data, 64892, 2527, 3) + put(data, 64893, 2527, 3) + put(data, 64894, 2530, 3) + put(data, 64895, 2533, 3) + put(data, 64896, 2536, 3) + put(data, 64897, 2539, 3) + put(data, 64898, 2542, 3) + put(data, 64899, 2545, 3) + put(data, 64900, 2545, 3) + put(data, 64901, 2548, 3) + put(data, 64902, 2548, 3) + put(data, 64903, 2551, 3) + put(data, 64904, 2551, 3) + put(data, 64905, 2554, 3) + put(data, 64906, 2161, 3) + put(data, 64907, 2557, 3) + put(data, 64908, 2560, 3) + put(data, 64909, 2252, 3) + put(data, 64910, 2163, 3) + put(data, 64911, 2563, 3) + put(data, 64914, 2566, 3) + put(data, 64915, 2569, 3) + put(data, 64916, 2572, 3) + put(data, 64917, 2575, 3) + put(data, 64918, 2578, 3) + put(data, 64919, 2581, 3) + put(data, 64920, 2581, 3) + put(data, 64921, 2584, 3) + put(data, 64922, 2587, 3) + put(data, 64923, 2590, 3) + put(data, 64924, 2593, 3) + put(data, 64925, 2593, 3) + put(data, 64926, 2596, 3) + put(data, 64927, 2599, 3) + put(data, 64928, 2602, 3) + put(data, 64929, 2605, 3) + put(data, 64930, 2608, 3) + put(data, 64931, 2611, 3) + put(data, 64932, 2614, 3) + put(data, 64933, 2617, 3) + put(data, 64934, 2620, 3) + put(data, 64935, 2623, 3) + put(data, 64936, 2626, 3) + put(data, 64937, 2629, 3) + put(data, 64938, 2632, 3) + put(data, 64939, 2635, 3) + put(data, 64940, 2638, 3) + put(data, 64941, 2641, 3) + put(data, 64942, 2280, 3) + put(data, 64943, 2644, 3) + put(data, 64944, 2647, 3) + put(data, 64945, 2650, 3) + put(data, 64946, 2653, 3) + put(data, 64947, 2656, 3) + put(data, 64948, 2530, 3) + put(data, 64949, 2536, 3) + put(data, 64950, 2659, 3) + put(data, 64951, 2662, 3) + put(data, 64952, 2665, 3) + put(data, 64953, 2668, 3) + put(data, 64954, 2671, 3) + put(data, 64955, 2674, 3) + put(data, 64956, 2671, 3) + put(data, 64957, 2665, 3) + put(data, 64958, 2677, 3) + put(data, 64959, 2680, 3) + put(data, 64960, 2683, 3) + put(data, 64961, 2686, 3) + put(data, 64962, 2689, 3) + put(data, 64963, 2674, 3) + put(data, 64964, 2509, 3) + put(data, 64965, 2479, 3) + put(data, 64966, 2692, 3) + put(data, 64967, 2695, 3) + put(data, 65008, 2698, 3) + put(data, 65009, 2701, 3) + put(data, 65010, 2704, 4) + put(data, 65011, 2708, 4) + put(data, 65012, 2712, 4) + put(data, 65013, 2716, 4) + put(data, 65014, 2720, 4) + put(data, 65015, 2724, 4) + put(data, 65016, 2728, 4) + put(data, 65017, 2732, 3) + put(data, 65018, 2735, 18) + put(data, 65019, 2753, 8) + put(data, 65020, 2761, 4) + put(data, 65040, 2765, 1) + put(data, 65041, 2766, 1) + put(data, 65042, 2767, 1) + put(data, 65043, 607, 1) + put(data, 65044, 2768, 1) + put(data, 65045, 219, 1) + put(data, 65046, 223, 1) + put(data, 65047, 2769, 1) + put(data, 65048, 2770, 1) + put(data, 65049, 2771, 1) + put(data, 65072, 2772, 1) + put(data, 65073, 2773, 1) + put(data, 65074, 2774, 1) + put(data, 65075, 2775, 1) + put(data, 65076, 2775, 1) + put(data, 65077, 238, 1) + put(data, 65078, 239, 1) + put(data, 65079, 2776, 1) + put(data, 65080, 2777, 1) + put(data, 65081, 2778, 1) + put(data, 65082, 2779, 1) + put(data, 65083, 2780, 1) + put(data, 65084, 2781, 1) + put(data, 65085, 2782, 1) + put(data, 65086, 2783, 1) + put(data, 65087, 2784, 1) + put(data, 65088, 2785, 1) + put(data, 65089, 2786, 1) + put(data, 65090, 2787, 1) + put(data, 65091, 2788, 1) + put(data, 65092, 2789, 1) + put(data, 65095, 2790, 1) + put(data, 65096, 2791, 1) + put(data, 65097, 2792, 1) + put(data, 65098, 2792, 1) + put(data, 65099, 2792, 1) + put(data, 65100, 2792, 1) + put(data, 65101, 2775, 1) + put(data, 65102, 2775, 1) + put(data, 65103, 2775, 1) + put(data, 65104, 2765, 1) + put(data, 65105, 2766, 1) + put(data, 65106, 206, 1) + put(data, 65108, 2768, 1) + put(data, 65109, 607, 1) + put(data, 65110, 223, 1) + put(data, 65111, 219, 1) + put(data, 65112, 2773, 1) + put(data, 65113, 238, 1) + put(data, 65114, 239, 1) + put(data, 65115, 2776, 1) + put(data, 65116, 2777, 1) + put(data, 65117, 2778, 1) + put(data, 65118, 2779, 1) + put(data, 65119, 2793, 1) + put(data, 65120, 2794, 1) + put(data, 65121, 2795, 1) + put(data, 65122, 235, 1) + put(data, 65123, 2796, 1) + put(data, 65124, 2797, 1) + put(data, 65125, 2798, 1) + put(data, 65126, 237, 1) + put(data, 65128, 2799, 1) + put(data, 65129, 2800, 1) + put(data, 65130, 2801, 1) + put(data, 65131, 2802, 1) + put(data, 65136, 2803, 2) + put(data, 65137, 2805, 2) + put(data, 65138, 2292, 2) + put(data, 65140, 2295, 2) + put(data, 65142, 2298, 2) + put(data, 65143, 2370, 2) + put(data, 65144, 2301, 2) + put(data, 65145, 2373, 2) + put(data, 65146, 2304, 2) + put(data, 65147, 2376, 2) + put(data, 65148, 2307, 2) + put(data, 65149, 2807, 2) + put(data, 65150, 2809, 2) + put(data, 65151, 2811, 2) + put(data, 65152, 2813, 1) + put(data, 65153, 2814, 1) + put(data, 65154, 2814, 1) + put(data, 65155, 2815, 1) + put(data, 65156, 2815, 1) + put(data, 65157, 2816, 1) + put(data, 65158, 2816, 1) + put(data, 65159, 2817, 1) + put(data, 65160, 2817, 1) + put(data, 65161, 2101, 1) + put(data, 65162, 2101, 1) + put(data, 65163, 2101, 1) + put(data, 65164, 2101, 1) + put(data, 65165, 97, 1) + put(data, 65166, 97, 1) + put(data, 65167, 2126, 1) + put(data, 65168, 2126, 1) + put(data, 65169, 2126, 1) + put(data, 65170, 2126, 1) + put(data, 65171, 2818, 1) + put(data, 65172, 2818, 1) + put(data, 65173, 2138, 1) + put(data, 65174, 2138, 1) + put(data, 65175, 2138, 1) + put(data, 65176, 2138, 1) + put(data, 65177, 2150, 1) + put(data, 65178, 2150, 1) + put(data, 65179, 2150, 1) + put(data, 65180, 2150, 1) + put(data, 65181, 2119, 1) + put(data, 65182, 2119, 1) + put(data, 65183, 2119, 1) + put(data, 65184, 2119, 1) + put(data, 65185, 2121, 1) + put(data, 65186, 2121, 1) + put(data, 65187, 2121, 1) + put(data, 65188, 2121, 1) + put(data, 65189, 2131, 1) + put(data, 65190, 2131, 1) + put(data, 65191, 2131, 1) + put(data, 65192, 2131, 1) + put(data, 65193, 2715, 1) + put(data, 65194, 2715, 1) + put(data, 65195, 2286, 1) + put(data, 65196, 2286, 1) + put(data, 65197, 2288, 1) + put(data, 65198, 2288, 1) + put(data, 65199, 2313, 1) + put(data, 65200, 2313, 1) + put(data, 65201, 2170, 1) + put(data, 65202, 2170, 1) + put(data, 65203, 2170, 1) + put(data, 65204, 2170, 1) + put(data, 65205, 2366, 1) + put(data, 65206, 2366, 1) + put(data, 65207, 2366, 1) + put(data, 65208, 2366, 1) + put(data, 65209, 2178, 1) + put(data, 65210, 2178, 1) + put(data, 65211, 2178, 1) + put(data, 65212, 2178, 1) + put(data, 65213, 2182, 1) + put(data, 65214, 2182, 1) + put(data, 65215, 2182, 1) + put(data, 65216, 2182, 1) + put(data, 65217, 2190, 1) + put(data, 65218, 2190, 1) + put(data, 65219, 2190, 1) + put(data, 65220, 2190, 1) + put(data, 65221, 2194, 1) + put(data, 65222, 2194, 1) + put(data, 65223, 2194, 1) + put(data, 65224, 2194, 1) + put(data, 65225, 2196, 1) + put(data, 65226, 2196, 1) + put(data, 65227, 2196, 1) + put(data, 65228, 2196, 1) + put(data, 65229, 2200, 1) + put(data, 65230, 2200, 1) + put(data, 65231, 2200, 1) + put(data, 65232, 2200, 1) + put(data, 65233, 2204, 1) + put(data, 65234, 2204, 1) + put(data, 65235, 2204, 1) + put(data, 65236, 2204, 1) + put(data, 65237, 2216, 1) + put(data, 65238, 2216, 1) + put(data, 65239, 2216, 1) + put(data, 65240, 2216, 1) + put(data, 65241, 2224, 1) + put(data, 65242, 2224, 1) + put(data, 65243, 2224, 1) + put(data, 65244, 2224, 1) + put(data, 65245, 2233, 1) + put(data, 65246, 2233, 1) + put(data, 65247, 2233, 1) + put(data, 65248, 2233, 1) + put(data, 65249, 2123, 1) + put(data, 65250, 2123, 1) + put(data, 65251, 2123, 1) + put(data, 65252, 2123, 1) + put(data, 65253, 2260, 1) + put(data, 65254, 2260, 1) + put(data, 65255, 2260, 1) + put(data, 65256, 2260, 1) + put(data, 65257, 2272, 1) + put(data, 65258, 2272, 1) + put(data, 65259, 2272, 1) + put(data, 65260, 2272, 1) + put(data, 65261, 99, 1) + put(data, 65262, 99, 1) + put(data, 65263, 2100, 1) + put(data, 65264, 2100, 1) + put(data, 65265, 103, 1) + put(data, 65266, 103, 1) + put(data, 65267, 103, 1) + put(data, 65268, 103, 1) + put(data, 65269, 2819, 2) + put(data, 65270, 2819, 2) + put(data, 65271, 2821, 2) + put(data, 65272, 2821, 2) + put(data, 65273, 2823, 2) + put(data, 65274, 2823, 2) + put(data, 65275, 2757, 2) + put(data, 65276, 2757, 2) + put(data, 65281, 219, 1) + put(data, 65282, 2825, 1) + put(data, 65283, 2793, 1) + put(data, 65284, 2800, 1) + put(data, 65285, 2801, 1) + put(data, 65286, 2794, 1) + put(data, 65287, 2826, 1) + put(data, 65288, 238, 1) + put(data, 65289, 239, 1) + put(data, 65290, 2795, 1) + put(data, 65291, 235, 1) + put(data, 65292, 2765, 1) + put(data, 65293, 2796, 1) + put(data, 65294, 206, 1) + put(data, 65295, 243, 1) + put(data, 65296, 229, 1) + put(data, 65297, 13, 1) + put(data, 65298, 6, 1) + put(data, 65299, 7, 1) + put(data, 65300, 17, 1) + put(data, 65301, 230, 1) + put(data, 65302, 231, 1) + put(data, 65303, 232, 1) + put(data, 65304, 233, 1) + put(data, 65305, 234, 1) + put(data, 65306, 607, 1) + put(data, 65307, 2768, 1) + put(data, 65308, 2797, 1) + put(data, 65309, 237, 1) + put(data, 65310, 2798, 1) + put(data, 65311, 223, 1) + put(data, 65312, 2802, 1) + put(data, 65313, 119, 1) + put(data, 65314, 121, 1) + put(data, 65315, 248, 1) + put(data, 65316, 35, 1) + put(data, 65317, 122, 1) + put(data, 65318, 259, 1) + put(data, 65319, 124, 1) + put(data, 65320, 125, 1) + put(data, 65321, 24, 1) + put(data, 65322, 25, 1) + put(data, 65323, 126, 1) + put(data, 65324, 28, 1) + put(data, 65325, 127, 1) + put(data, 65326, 47, 1) + put(data, 65327, 128, 1) + put(data, 65328, 130, 1) + put(data, 65329, 263, 1) + put(data, 65330, 131, 1) + put(data, 65331, 264, 1) + put(data, 65332, 132, 1) + put(data, 65333, 133, 1) + put(data, 65334, 333, 1) + put(data, 65335, 134, 1) + put(data, 65336, 277, 1) + put(data, 65337, 606, 1) + put(data, 65338, 54, 1) + put(data, 65339, 2790, 1) + put(data, 65340, 2799, 1) + put(data, 65341, 2791, 1) + put(data, 65342, 2827, 1) + put(data, 65343, 2775, 1) + put(data, 65344, 2828, 1) + put(data, 65345, 3, 1) + put(data, 65346, 138, 1) + put(data, 65347, 162, 1) + put(data, 65348, 39, 1) + put(data, 65349, 139, 1) + put(data, 65350, 165, 1) + put(data, 65351, 143, 1) + put(data, 65352, 59, 1) + put(data, 65353, 26, 1) + put(data, 65354, 27, 1) + put(data, 65355, 144, 1) + put(data, 65356, 30, 1) + put(data, 65357, 145, 1) + put(data, 65358, 33, 1) + put(data, 65359, 14, 1) + put(data, 65360, 150, 1) + put(data, 65361, 577, 1) + put(data, 65362, 61, 1) + put(data, 65363, 34, 1) + put(data, 65364, 151, 1) + put(data, 65365, 152, 1) + put(data, 65366, 155, 1) + put(data, 65367, 65, 1) + put(data, 65368, 80, 1) + put(data, 65369, 66, 1) + put(data, 65370, 56, 1) + put(data, 65371, 2776, 1) + put(data, 65372, 2829, 1) + put(data, 65373, 2777, 1) + put(data, 65374, 2830, 1) + put(data, 65375, 2831, 1) + put(data, 65376, 2832, 1) + put(data, 65377, 2767, 1) + put(data, 65378, 2786, 1) + put(data, 65379, 2787, 1) + put(data, 65380, 2766, 1) + put(data, 65381, 2833, 1) + put(data, 65382, 1325, 1) + put(data, 65383, 1335, 1) + put(data, 65384, 1503, 1) + put(data, 65385, 2834, 1) + put(data, 65386, 1509, 1) + put(data, 65387, 1351, 1) + put(data, 65388, 2835, 1) + put(data, 65389, 1391, 1) + put(data, 65390, 1570, 1) + put(data, 65391, 1373, 1) + put(data, 65392, 1330, 1) + put(data, 65393, 1281, 1) + put(data, 65394, 1282, 1) + put(data, 65395, 1283, 1) + put(data, 65396, 1284, 1) + put(data, 65397, 1285, 1) + put(data, 65398, 1286, 1) + put(data, 65399, 1287, 1) + put(data, 65400, 1288, 1) + put(data, 65401, 1289, 1) + put(data, 65402, 838, 1) + put(data, 65403, 1290, 1) + put(data, 65404, 1291, 1) + put(data, 65405, 1292, 1) + put(data, 65406, 1293, 1) + put(data, 65407, 1294, 1) + put(data, 65408, 1295, 1) + put(data, 65409, 1296, 1) + put(data, 65410, 1297, 1) + put(data, 65411, 1298, 1) + put(data, 65412, 839, 1) + put(data, 65413, 1299, 1) + put(data, 65414, 1300, 1) + put(data, 65415, 1301, 1) + put(data, 65416, 1302, 1) + put(data, 65417, 1303, 1) + put(data, 65418, 1304, 1) + put(data, 65419, 1305, 1) + put(data, 65420, 1306, 1) + put(data, 65421, 1307, 1) + put(data, 65422, 1308, 1) + put(data, 65423, 1309, 1) + put(data, 65424, 1310, 1) + put(data, 65425, 1311, 1) + put(data, 65426, 1312, 1) + put(data, 65427, 1313, 1) + put(data, 65428, 1314, 1) + put(data, 65429, 1315, 1) + put(data, 65430, 1316, 1) + put(data, 65431, 1317, 1) + put(data, 65432, 1318, 1) + put(data, 65433, 1319, 1) + put(data, 65434, 1320, 1) + put(data, 65435, 1321, 1) + put(data, 65436, 1322, 1) + put(data, 65437, 1337, 1) + put(data, 65438, 833, 1) + put(data, 65439, 835, 1) + put(data, 65440, 2836, 1) + put(data, 65441, 2837, 1) + put(data, 65442, 2838, 1) + put(data, 65443, 2839, 1) + put(data, 65444, 2840, 1) + put(data, 65445, 2841, 1) + put(data, 65446, 2842, 1) + put(data, 65447, 2843, 1) + put(data, 65448, 2844, 1) + put(data, 65449, 2845, 1) + put(data, 65450, 2846, 1) + put(data, 65451, 2847, 1) + put(data, 65452, 2848, 1) + put(data, 65453, 2849, 1) + put(data, 65454, 2850, 1) + put(data, 65455, 2851, 1) + put(data, 65456, 2852, 1) + put(data, 65457, 2853, 1) + put(data, 65458, 2854, 1) + put(data, 65459, 2855, 1) + put(data, 65460, 2856, 1) + put(data, 65461, 2857, 1) + put(data, 65462, 2858, 1) + put(data, 65463, 2859, 1) + put(data, 65464, 2860, 1) + put(data, 65465, 2861, 1) + put(data, 65466, 2862, 1) + put(data, 65467, 2863, 1) + put(data, 65468, 2864, 1) + put(data, 65469, 2865, 1) + put(data, 65470, 2866, 1) + put(data, 65474, 2867, 1) + put(data, 65475, 2868, 1) + put(data, 65476, 2869, 1) + put(data, 65477, 2870, 1) + put(data, 65478, 2871, 1) + put(data, 65479, 2872, 1) + put(data, 65482, 2873, 1) + put(data, 65483, 2874, 1) + put(data, 65484, 2875, 1) + put(data, 65485, 2876, 1) + put(data, 65486, 2877, 1) + put(data, 65487, 2878, 1) + put(data, 65490, 2879, 1) + put(data, 65491, 2880, 1) + put(data, 65492, 2881, 1) + put(data, 65493, 2882, 1) + put(data, 65494, 2883, 1) + put(data, 65495, 2884, 1) + put(data, 65498, 2885, 1) + put(data, 65499, 2886, 1) + put(data, 65500, 2887, 1) + put(data, 65504, 2888, 1) + put(data, 65505, 2889, 1) + put(data, 65506, 2890, 1) + put(data, 65507, 2891, 1) + put(data, 65508, 2892, 1) + put(data, 65509, 2893, 1) + put(data, 65510, 2894, 1) + put(data, 65512, 2895, 1) + put(data, 65513, 2896, 1) + put(data, 65514, 2897, 1) + put(data, 65515, 2898, 1) + put(data, 65516, 2899, 1) + put(data, 65517, 2900, 1) + put(data, 65518, 2901, 1) + put(data, 67457, 2902, 1) + put(data, 67458, 2903, 1) + put(data, 67459, 2904, 1) + put(data, 67460, 2905, 1) + put(data, 67461, 2906, 1) + put(data, 67463, 2907, 1) + put(data, 67464, 2908, 1) + put(data, 67465, 2909, 1) + put(data, 67466, 2910, 1) + put(data, 67467, 2911, 1) + put(data, 67468, 2912, 1) + put(data, 67469, 2913, 1) + put(data, 67470, 2914, 1) + put(data, 67471, 2915, 1) + put(data, 67472, 2916, 1) + put(data, 67473, 2917, 1) + put(data, 67474, 2918, 1) + put(data, 67475, 2919, 1) + put(data, 67476, 2920, 1) + put(data, 67477, 260, 1) + put(data, 67478, 2921, 1) + put(data, 67479, 2922, 1) + put(data, 67480, 2923, 1) + put(data, 67481, 2924, 1) + put(data, 67482, 2925, 1) + put(data, 67483, 2926, 1) + put(data, 67484, 2927, 1) + put(data, 67485, 2928, 1) + put(data, 67486, 2929, 1) + put(data, 67487, 2930, 1) + put(data, 67488, 2931, 1) + put(data, 67489, 2932, 1) + put(data, 67490, 2933, 1) + put(data, 67491, 2934, 1) + put(data, 67492, 2935, 1) + put(data, 67493, 577, 1) + put(data, 67494, 2936, 1) + put(data, 67495, 2937, 1) + put(data, 67496, 2938, 1) + put(data, 67497, 2939, 1) + put(data, 67498, 2940, 1) + put(data, 67499, 2941, 1) + put(data, 67500, 2942, 1) + put(data, 67501, 2943, 1) + put(data, 67502, 2944, 1) + put(data, 67503, 2945, 1) + put(data, 67504, 2946, 1) + put(data, 67506, 2947, 1) + put(data, 67507, 2948, 1) + put(data, 67508, 2949, 1) + put(data, 67509, 2950, 1) + put(data, 67510, 2951, 1) + put(data, 67511, 2952, 1) + put(data, 67512, 2953, 1) + put(data, 67513, 2954, 1) + put(data, 67514, 2955, 1) + put(data, 119808, 119, 1) + put(data, 119809, 121, 1) + put(data, 119810, 248, 1) + put(data, 119811, 35, 1) + put(data, 119812, 122, 1) + put(data, 119813, 259, 1) + put(data, 119814, 124, 1) + put(data, 119815, 125, 1) + put(data, 119816, 24, 1) + put(data, 119817, 25, 1) + put(data, 119818, 126, 1) + put(data, 119819, 28, 1) + put(data, 119820, 127, 1) + put(data, 119821, 47, 1) + put(data, 119822, 128, 1) + put(data, 119823, 130, 1) + put(data, 119824, 263, 1) + put(data, 119825, 131, 1) + put(data, 119826, 264, 1) + put(data, 119827, 132, 1) + put(data, 119828, 133, 1) + put(data, 119829, 333, 1) + put(data, 119830, 134, 1) + put(data, 119831, 277, 1) + put(data, 119832, 606, 1) + put(data, 119833, 54, 1) + put(data, 119834, 3, 1) + put(data, 119835, 138, 1) + put(data, 119836, 162, 1) + put(data, 119837, 39, 1) + put(data, 119838, 139, 1) + put(data, 119839, 165, 1) + put(data, 119840, 143, 1) + put(data, 119841, 59, 1) + put(data, 119842, 26, 1) + put(data, 119843, 27, 1) + put(data, 119844, 144, 1) + put(data, 119845, 30, 1) + put(data, 119846, 145, 1) + put(data, 119847, 33, 1) + put(data, 119848, 14, 1) + put(data, 119849, 150, 1) + put(data, 119850, 577, 1) + put(data, 119851, 61, 1) + put(data, 119852, 34, 1) + put(data, 119853, 151, 1) + put(data, 119854, 152, 1) + put(data, 119855, 155, 1) + put(data, 119856, 65, 1) + put(data, 119857, 80, 1) + put(data, 119858, 66, 1) + put(data, 119859, 56, 1) + put(data, 119860, 119, 1) + put(data, 119861, 121, 1) + put(data, 119862, 248, 1) + put(data, 119863, 35, 1) + put(data, 119864, 122, 1) + put(data, 119865, 259, 1) + put(data, 119866, 124, 1) + put(data, 119867, 125, 1) + put(data, 119868, 24, 1) + put(data, 119869, 25, 1) + put(data, 119870, 126, 1) + put(data, 119871, 28, 1) + put(data, 119872, 127, 1) + put(data, 119873, 47, 1) + put(data, 119874, 128, 1) + put(data, 119875, 130, 1) + put(data, 119876, 263, 1) + put(data, 119877, 131, 1) + put(data, 119878, 264, 1) + put(data, 119879, 132, 1) + put(data, 119880, 133, 1) + put(data, 119881, 333, 1) + put(data, 119882, 134, 1) + put(data, 119883, 277, 1) + put(data, 119884, 606, 1) + put(data, 119885, 54, 1) + put(data, 119886, 3, 1) + put(data, 119887, 138, 1) + put(data, 119888, 162, 1) + put(data, 119889, 39, 1) + put(data, 119890, 139, 1) + put(data, 119891, 165, 1) + put(data, 119892, 143, 1) + put(data, 119894, 26, 1) + put(data, 119895, 27, 1) + put(data, 119896, 144, 1) + put(data, 119897, 30, 1) + put(data, 119898, 145, 1) + put(data, 119899, 33, 1) + put(data, 119900, 14, 1) + put(data, 119901, 150, 1) + put(data, 119902, 577, 1) + put(data, 119903, 61, 1) + put(data, 119904, 34, 1) + put(data, 119905, 151, 1) + put(data, 119906, 152, 1) + put(data, 119907, 155, 1) + put(data, 119908, 65, 1) + put(data, 119909, 80, 1) + put(data, 119910, 66, 1) + put(data, 119911, 56, 1) + put(data, 119912, 119, 1) + put(data, 119913, 121, 1) + put(data, 119914, 248, 1) + put(data, 119915, 35, 1) + put(data, 119916, 122, 1) + put(data, 119917, 259, 1) + put(data, 119918, 124, 1) + put(data, 119919, 125, 1) + put(data, 119920, 24, 1) + put(data, 119921, 25, 1) + put(data, 119922, 126, 1) + put(data, 119923, 28, 1) + put(data, 119924, 127, 1) + put(data, 119925, 47, 1) + put(data, 119926, 128, 1) + put(data, 119927, 130, 1) + put(data, 119928, 263, 1) + put(data, 119929, 131, 1) + put(data, 119930, 264, 1) + put(data, 119931, 132, 1) + put(data, 119932, 133, 1) + put(data, 119933, 333, 1) + put(data, 119934, 134, 1) + put(data, 119935, 277, 1) + put(data, 119936, 606, 1) + put(data, 119937, 54, 1) + put(data, 119938, 3, 1) + put(data, 119939, 138, 1) + put(data, 119940, 162, 1) + put(data, 119941, 39, 1) + put(data, 119942, 139, 1) + put(data, 119943, 165, 1) + put(data, 119944, 143, 1) + put(data, 119945, 59, 1) + put(data, 119946, 26, 1) + put(data, 119947, 27, 1) + put(data, 119948, 144, 1) + put(data, 119949, 30, 1) + put(data, 119950, 145, 1) + put(data, 119951, 33, 1) + put(data, 119952, 14, 1) + put(data, 119953, 150, 1) + put(data, 119954, 577, 1) + put(data, 119955, 61, 1) + put(data, 119956, 34, 1) + put(data, 119957, 151, 1) + put(data, 119958, 152, 1) + put(data, 119959, 155, 1) + put(data, 119960, 65, 1) + put(data, 119961, 80, 1) + put(data, 119962, 66, 1) + put(data, 119963, 56, 1) + put(data, 119964, 119, 1) + put(data, 119966, 248, 1) + put(data, 119967, 35, 1) + put(data, 119970, 124, 1) + put(data, 119973, 25, 1) + put(data, 119974, 126, 1) + put(data, 119977, 47, 1) + put(data, 119978, 128, 1) + put(data, 119979, 130, 1) + put(data, 119980, 263, 1) + put(data, 119982, 264, 1) + put(data, 119983, 132, 1) + put(data, 119984, 133, 1) + put(data, 119985, 333, 1) + put(data, 119986, 134, 1) + put(data, 119987, 277, 1) + put(data, 119988, 606, 1) + put(data, 119989, 54, 1) + put(data, 119990, 3, 1) + put(data, 119991, 138, 1) + put(data, 119992, 162, 1) + put(data, 119993, 39, 1) + put(data, 119995, 165, 1) + put(data, 119997, 59, 1) + put(data, 119998, 26, 1) + put(data, 119999, 27, 1) + put(data, 120000, 144, 1) + put(data, 120001, 30, 1) + put(data, 120002, 145, 1) + put(data, 120003, 33, 1) + put(data, 120005, 150, 1) + put(data, 120006, 577, 1) + put(data, 120007, 61, 1) + put(data, 120008, 34, 1) + put(data, 120009, 151, 1) + put(data, 120010, 152, 1) + put(data, 120011, 155, 1) + put(data, 120012, 65, 1) + put(data, 120013, 80, 1) + put(data, 120014, 66, 1) + put(data, 120015, 56, 1) + put(data, 120016, 119, 1) + put(data, 120017, 121, 1) + put(data, 120018, 248, 1) + put(data, 120019, 35, 1) + put(data, 120020, 122, 1) + put(data, 120021, 259, 1) + put(data, 120022, 124, 1) + put(data, 120023, 125, 1) + put(data, 120024, 24, 1) + put(data, 120025, 25, 1) + put(data, 120026, 126, 1) + put(data, 120027, 28, 1) + put(data, 120028, 127, 1) + put(data, 120029, 47, 1) + put(data, 120030, 128, 1) + put(data, 120031, 130, 1) + put(data, 120032, 263, 1) + put(data, 120033, 131, 1) + put(data, 120034, 264, 1) + put(data, 120035, 132, 1) + put(data, 120036, 133, 1) + put(data, 120037, 333, 1) + put(data, 120038, 134, 1) + put(data, 120039, 277, 1) + put(data, 120040, 606, 1) + put(data, 120041, 54, 1) + put(data, 120042, 3, 1) + put(data, 120043, 138, 1) + put(data, 120044, 162, 1) + put(data, 120045, 39, 1) + put(data, 120046, 139, 1) + put(data, 120047, 165, 1) + put(data, 120048, 143, 1) + put(data, 120049, 59, 1) + put(data, 120050, 26, 1) + put(data, 120051, 27, 1) + put(data, 120052, 144, 1) + put(data, 120053, 30, 1) + put(data, 120054, 145, 1) + put(data, 120055, 33, 1) + put(data, 120056, 14, 1) + put(data, 120057, 150, 1) + put(data, 120058, 577, 1) + put(data, 120059, 61, 1) + put(data, 120060, 34, 1) + put(data, 120061, 151, 1) + put(data, 120062, 152, 1) + put(data, 120063, 155, 1) + put(data, 120064, 65, 1) + put(data, 120065, 80, 1) + put(data, 120066, 66, 1) + put(data, 120067, 56, 1) + put(data, 120068, 119, 1) + put(data, 120069, 121, 1) + put(data, 120071, 35, 1) + put(data, 120072, 122, 1) + put(data, 120073, 259, 1) + put(data, 120074, 124, 1) + put(data, 120077, 25, 1) + put(data, 120078, 126, 1) + put(data, 120079, 28, 1) + put(data, 120080, 127, 1) + put(data, 120081, 47, 1) + put(data, 120082, 128, 1) + put(data, 120083, 130, 1) + put(data, 120084, 263, 1) + put(data, 120086, 264, 1) + put(data, 120087, 132, 1) + put(data, 120088, 133, 1) + put(data, 120089, 333, 1) + put(data, 120090, 134, 1) + put(data, 120091, 277, 1) + put(data, 120092, 606, 1) + put(data, 120094, 3, 1) + put(data, 120095, 138, 1) + put(data, 120096, 162, 1) + put(data, 120097, 39, 1) + put(data, 120098, 139, 1) + put(data, 120099, 165, 1) + put(data, 120100, 143, 1) + put(data, 120101, 59, 1) + put(data, 120102, 26, 1) + put(data, 120103, 27, 1) + put(data, 120104, 144, 1) + put(data, 120105, 30, 1) + put(data, 120106, 145, 1) + put(data, 120107, 33, 1) + put(data, 120108, 14, 1) + put(data, 120109, 150, 1) + put(data, 120110, 577, 1) + put(data, 120111, 61, 1) + put(data, 120112, 34, 1) + put(data, 120113, 151, 1) + put(data, 120114, 152, 1) + put(data, 120115, 155, 1) + put(data, 120116, 65, 1) + put(data, 120117, 80, 1) + put(data, 120118, 66, 1) + put(data, 120119, 56, 1) + put(data, 120120, 119, 1) + put(data, 120121, 121, 1) + put(data, 120123, 35, 1) + put(data, 120124, 122, 1) + put(data, 120125, 259, 1) + put(data, 120126, 124, 1) + put(data, 120128, 24, 1) + put(data, 120129, 25, 1) + put(data, 120130, 126, 1) + put(data, 120131, 28, 1) + put(data, 120132, 127, 1) + put(data, 120134, 128, 1) + put(data, 120138, 264, 1) + put(data, 120139, 132, 1) + put(data, 120140, 133, 1) + put(data, 120141, 333, 1) + put(data, 120142, 134, 1) + put(data, 120143, 277, 1) + put(data, 120144, 606, 1) + put(data, 120146, 3, 1) + put(data, 120147, 138, 1) + put(data, 120148, 162, 1) + put(data, 120149, 39, 1) + put(data, 120150, 139, 1) + put(data, 120151, 165, 1) + put(data, 120152, 143, 1) + put(data, 120153, 59, 1) + put(data, 120154, 26, 1) + put(data, 120155, 27, 1) + put(data, 120156, 144, 1) + put(data, 120157, 30, 1) + put(data, 120158, 145, 1) + put(data, 120159, 33, 1) + put(data, 120160, 14, 1) + put(data, 120161, 150, 1) + put(data, 120162, 577, 1) + put(data, 120163, 61, 1) + put(data, 120164, 34, 1) + put(data, 120165, 151, 1) + put(data, 120166, 152, 1) + put(data, 120167, 155, 1) + put(data, 120168, 65, 1) + put(data, 120169, 80, 1) + put(data, 120170, 66, 1) + put(data, 120171, 56, 1) + put(data, 120172, 119, 1) + put(data, 120173, 121, 1) + put(data, 120174, 248, 1) + put(data, 120175, 35, 1) + put(data, 120176, 122, 1) + put(data, 120177, 259, 1) + put(data, 120178, 124, 1) + put(data, 120179, 125, 1) + put(data, 120180, 24, 1) + put(data, 120181, 25, 1) + put(data, 120182, 126, 1) + put(data, 120183, 28, 1) + put(data, 120184, 127, 1) + put(data, 120185, 47, 1) + put(data, 120186, 128, 1) + put(data, 120187, 130, 1) + put(data, 120188, 263, 1) + put(data, 120189, 131, 1) + put(data, 120190, 264, 1) + put(data, 120191, 132, 1) + put(data, 120192, 133, 1) + put(data, 120193, 333, 1) + put(data, 120194, 134, 1) + put(data, 120195, 277, 1) + put(data, 120196, 606, 1) + put(data, 120197, 54, 1) + put(data, 120198, 3, 1) + put(data, 120199, 138, 1) + put(data, 120200, 162, 1) + put(data, 120201, 39, 1) + put(data, 120202, 139, 1) + put(data, 120203, 165, 1) + put(data, 120204, 143, 1) + put(data, 120205, 59, 1) + put(data, 120206, 26, 1) + put(data, 120207, 27, 1) + put(data, 120208, 144, 1) + put(data, 120209, 30, 1) + put(data, 120210, 145, 1) + put(data, 120211, 33, 1) + put(data, 120212, 14, 1) + put(data, 120213, 150, 1) + put(data, 120214, 577, 1) + put(data, 120215, 61, 1) + put(data, 120216, 34, 1) + put(data, 120217, 151, 1) + put(data, 120218, 152, 1) + put(data, 120219, 155, 1) + put(data, 120220, 65, 1) + put(data, 120221, 80, 1) + put(data, 120222, 66, 1) + put(data, 120223, 56, 1) + put(data, 120224, 119, 1) + put(data, 120225, 121, 1) + put(data, 120226, 248, 1) + put(data, 120227, 35, 1) + put(data, 120228, 122, 1) + put(data, 120229, 259, 1) + put(data, 120230, 124, 1) + put(data, 120231, 125, 1) + put(data, 120232, 24, 1) + put(data, 120233, 25, 1) + put(data, 120234, 126, 1) + put(data, 120235, 28, 1) + put(data, 120236, 127, 1) + put(data, 120237, 47, 1) + put(data, 120238, 128, 1) + put(data, 120239, 130, 1) + put(data, 120240, 263, 1) + put(data, 120241, 131, 1) + put(data, 120242, 264, 1) + put(data, 120243, 132, 1) + put(data, 120244, 133, 1) + put(data, 120245, 333, 1) + put(data, 120246, 134, 1) + put(data, 120247, 277, 1) + put(data, 120248, 606, 1) + put(data, 120249, 54, 1) + put(data, 120250, 3, 1) + put(data, 120251, 138, 1) + put(data, 120252, 162, 1) + put(data, 120253, 39, 1) + put(data, 120254, 139, 1) + put(data, 120255, 165, 1) + put(data, 120256, 143, 1) + put(data, 120257, 59, 1) + put(data, 120258, 26, 1) + put(data, 120259, 27, 1) + put(data, 120260, 144, 1) + put(data, 120261, 30, 1) + put(data, 120262, 145, 1) + put(data, 120263, 33, 1) + put(data, 120264, 14, 1) + put(data, 120265, 150, 1) + put(data, 120266, 577, 1) + put(data, 120267, 61, 1) + put(data, 120268, 34, 1) + put(data, 120269, 151, 1) + put(data, 120270, 152, 1) + put(data, 120271, 155, 1) + put(data, 120272, 65, 1) + put(data, 120273, 80, 1) + put(data, 120274, 66, 1) + put(data, 120275, 56, 1) + put(data, 120276, 119, 1) + put(data, 120277, 121, 1) + put(data, 120278, 248, 1) + put(data, 120279, 35, 1) + put(data, 120280, 122, 1) + put(data, 120281, 259, 1) + put(data, 120282, 124, 1) + put(data, 120283, 125, 1) + put(data, 120284, 24, 1) + put(data, 120285, 25, 1) + put(data, 120286, 126, 1) + put(data, 120287, 28, 1) + put(data, 120288, 127, 1) + put(data, 120289, 47, 1) + put(data, 120290, 128, 1) + put(data, 120291, 130, 1) + put(data, 120292, 263, 1) + put(data, 120293, 131, 1) + put(data, 120294, 264, 1) + put(data, 120295, 132, 1) + put(data, 120296, 133, 1) + put(data, 120297, 333, 1) + put(data, 120298, 134, 1) + put(data, 120299, 277, 1) + put(data, 120300, 606, 1) + put(data, 120301, 54, 1) + put(data, 120302, 3, 1) + put(data, 120303, 138, 1) + put(data, 120304, 162, 1) + put(data, 120305, 39, 1) + put(data, 120306, 139, 1) + put(data, 120307, 165, 1) + put(data, 120308, 143, 1) + put(data, 120309, 59, 1) + put(data, 120310, 26, 1) + put(data, 120311, 27, 1) + put(data, 120312, 144, 1) + put(data, 120313, 30, 1) + put(data, 120314, 145, 1) + put(data, 120315, 33, 1) + put(data, 120316, 14, 1) + put(data, 120317, 150, 1) + put(data, 120318, 577, 1) + put(data, 120319, 61, 1) + put(data, 120320, 34, 1) + put(data, 120321, 151, 1) + put(data, 120322, 152, 1) + put(data, 120323, 155, 1) + put(data, 120324, 65, 1) + put(data, 120325, 80, 1) + put(data, 120326, 66, 1) + put(data, 120327, 56, 1) + put(data, 120328, 119, 1) + put(data, 120329, 121, 1) + put(data, 120330, 248, 1) + put(data, 120331, 35, 1) + put(data, 120332, 122, 1) + put(data, 120333, 259, 1) + put(data, 120334, 124, 1) + put(data, 120335, 125, 1) + put(data, 120336, 24, 1) + put(data, 120337, 25, 1) + put(data, 120338, 126, 1) + put(data, 120339, 28, 1) + put(data, 120340, 127, 1) + put(data, 120341, 47, 1) + put(data, 120342, 128, 1) + put(data, 120343, 130, 1) + put(data, 120344, 263, 1) + put(data, 120345, 131, 1) + put(data, 120346, 264, 1) + put(data, 120347, 132, 1) + put(data, 120348, 133, 1) + put(data, 120349, 333, 1) + put(data, 120350, 134, 1) + put(data, 120351, 277, 1) + put(data, 120352, 606, 1) + put(data, 120353, 54, 1) + put(data, 120354, 3, 1) + put(data, 120355, 138, 1) + put(data, 120356, 162, 1) + put(data, 120357, 39, 1) + put(data, 120358, 139, 1) + put(data, 120359, 165, 1) + put(data, 120360, 143, 1) + put(data, 120361, 59, 1) + put(data, 120362, 26, 1) + put(data, 120363, 27, 1) + put(data, 120364, 144, 1) + put(data, 120365, 30, 1) + put(data, 120366, 145, 1) + put(data, 120367, 33, 1) + put(data, 120368, 14, 1) + put(data, 120369, 150, 1) + put(data, 120370, 577, 1) + put(data, 120371, 61, 1) + put(data, 120372, 34, 1) + put(data, 120373, 151, 1) + put(data, 120374, 152, 1) + put(data, 120375, 155, 1) + put(data, 120376, 65, 1) + put(data, 120377, 80, 1) + put(data, 120378, 66, 1) + put(data, 120379, 56, 1) + put(data, 120380, 119, 1) + put(data, 120381, 121, 1) + put(data, 120382, 248, 1) + put(data, 120383, 35, 1) + put(data, 120384, 122, 1) + put(data, 120385, 259, 1) + put(data, 120386, 124, 1) + put(data, 120387, 125, 1) + put(data, 120388, 24, 1) + put(data, 120389, 25, 1) + put(data, 120390, 126, 1) + put(data, 120391, 28, 1) + put(data, 120392, 127, 1) + put(data, 120393, 47, 1) + put(data, 120394, 128, 1) + put(data, 120395, 130, 1) + put(data, 120396, 263, 1) + put(data, 120397, 131, 1) + put(data, 120398, 264, 1) + put(data, 120399, 132, 1) + put(data, 120400, 133, 1) + put(data, 120401, 333, 1) + put(data, 120402, 134, 1) + put(data, 120403, 277, 1) + put(data, 120404, 606, 1) + put(data, 120405, 54, 1) + put(data, 120406, 3, 1) + put(data, 120407, 138, 1) + put(data, 120408, 162, 1) + put(data, 120409, 39, 1) + put(data, 120410, 139, 1) + put(data, 120411, 165, 1) + put(data, 120412, 143, 1) + put(data, 120413, 59, 1) + put(data, 120414, 26, 1) + put(data, 120415, 27, 1) + put(data, 120416, 144, 1) + put(data, 120417, 30, 1) + put(data, 120418, 145, 1) + put(data, 120419, 33, 1) + put(data, 120420, 14, 1) + put(data, 120421, 150, 1) + put(data, 120422, 577, 1) + put(data, 120423, 61, 1) + put(data, 120424, 34, 1) + put(data, 120425, 151, 1) + put(data, 120426, 152, 1) + put(data, 120427, 155, 1) + put(data, 120428, 65, 1) + put(data, 120429, 80, 1) + put(data, 120430, 66, 1) + put(data, 120431, 56, 1) + put(data, 120432, 119, 1) + put(data, 120433, 121, 1) + put(data, 120434, 248, 1) + put(data, 120435, 35, 1) + put(data, 120436, 122, 1) + put(data, 120437, 259, 1) + put(data, 120438, 124, 1) + put(data, 120439, 125, 1) + put(data, 120440, 24, 1) + put(data, 120441, 25, 1) + put(data, 120442, 126, 1) + put(data, 120443, 28, 1) + put(data, 120444, 127, 1) + put(data, 120445, 47, 1) + put(data, 120446, 128, 1) + put(data, 120447, 130, 1) + put(data, 120448, 263, 1) + put(data, 120449, 131, 1) + put(data, 120450, 264, 1) + put(data, 120451, 132, 1) + put(data, 120452, 133, 1) + put(data, 120453, 333, 1) + put(data, 120454, 134, 1) + put(data, 120455, 277, 1) + put(data, 120456, 606, 1) + put(data, 120457, 54, 1) + put(data, 120458, 3, 1) + put(data, 120459, 138, 1) + put(data, 120460, 162, 1) + put(data, 120461, 39, 1) + put(data, 120462, 139, 1) + put(data, 120463, 165, 1) + put(data, 120464, 143, 1) + put(data, 120465, 59, 1) + put(data, 120466, 26, 1) + put(data, 120467, 27, 1) + put(data, 120468, 144, 1) + put(data, 120469, 30, 1) + put(data, 120470, 145, 1) + put(data, 120471, 33, 1) + put(data, 120472, 14, 1) + put(data, 120473, 150, 1) + put(data, 120474, 577, 1) + put(data, 120475, 61, 1) + put(data, 120476, 34, 1) + put(data, 120477, 151, 1) + put(data, 120478, 152, 1) + put(data, 120479, 155, 1) + put(data, 120480, 65, 1) + put(data, 120481, 80, 1) + put(data, 120482, 66, 1) + put(data, 120483, 56, 1) + put(data, 120484, 2956, 1) + put(data, 120485, 2957, 1) + put(data, 120488, 2958, 1) + put(data, 120489, 2959, 1) + put(data, 120490, 278, 1) + put(data, 120491, 2960, 1) + put(data, 120492, 2961, 1) + put(data, 120493, 2962, 1) + put(data, 120494, 2963, 1) + put(data, 120495, 92, 1) + put(data, 120496, 2964, 1) + put(data, 120497, 2965, 1) + put(data, 120498, 2966, 1) + put(data, 120499, 2967, 1) + put(data, 120500, 2968, 1) + put(data, 120501, 2969, 1) + put(data, 120502, 2970, 1) + put(data, 120503, 279, 1) + put(data, 120504, 2971, 1) + put(data, 120505, 2972, 1) + put(data, 120506, 94, 1) + put(data, 120507, 2973, 1) + put(data, 120508, 86, 1) + put(data, 120509, 2974, 1) + put(data, 120510, 2975, 1) + put(data, 120511, 2976, 1) + put(data, 120512, 1865, 1) + put(data, 120513, 2977, 1) + put(data, 120514, 2978, 1) + put(data, 120515, 84, 1) + put(data, 120516, 157, 1) + put(data, 120517, 158, 1) + put(data, 120518, 93, 1) + put(data, 120519, 2979, 1) + put(data, 120520, 2980, 1) + put(data, 120521, 85, 1) + put(data, 120522, 2981, 1) + put(data, 120523, 89, 1) + put(data, 120524, 2982, 1) + put(data, 120525, 10, 1) + put(data, 120526, 2983, 1) + put(data, 120527, 2984, 1) + put(data, 120528, 2985, 1) + put(data, 120529, 88, 1) + put(data, 120530, 90, 1) + put(data, 120531, 91, 1) + put(data, 120532, 2986, 1) + put(data, 120533, 2987, 1) + put(data, 120534, 2988, 1) + put(data, 120535, 87, 1) + put(data, 120536, 159, 1) + put(data, 120537, 2989, 1) + put(data, 120538, 2990, 1) + put(data, 120539, 2991, 1) + put(data, 120540, 2992, 1) + put(data, 120541, 2993, 1) + put(data, 120542, 2994, 1) + put(data, 120543, 2995, 1) + put(data, 120544, 2996, 1) + put(data, 120545, 2997, 1) + put(data, 120546, 2958, 1) + put(data, 120547, 2959, 1) + put(data, 120548, 278, 1) + put(data, 120549, 2960, 1) + put(data, 120550, 2961, 1) + put(data, 120551, 2962, 1) + put(data, 120552, 2963, 1) + put(data, 120553, 92, 1) + put(data, 120554, 2964, 1) + put(data, 120555, 2965, 1) + put(data, 120556, 2966, 1) + put(data, 120557, 2967, 1) + put(data, 120558, 2968, 1) + put(data, 120559, 2969, 1) + put(data, 120560, 2970, 1) + put(data, 120561, 279, 1) + put(data, 120562, 2971, 1) + put(data, 120563, 2972, 1) + put(data, 120564, 94, 1) + put(data, 120565, 2973, 1) + put(data, 120566, 86, 1) + put(data, 120567, 2974, 1) + put(data, 120568, 2975, 1) + put(data, 120569, 2976, 1) + put(data, 120570, 1865, 1) + put(data, 120571, 2977, 1) + put(data, 120572, 2978, 1) + put(data, 120573, 84, 1) + put(data, 120574, 157, 1) + put(data, 120575, 158, 1) + put(data, 120576, 93, 1) + put(data, 120577, 2979, 1) + put(data, 120578, 2980, 1) + put(data, 120579, 85, 1) + put(data, 120580, 2981, 1) + put(data, 120581, 89, 1) + put(data, 120582, 2982, 1) + put(data, 120583, 10, 1) + put(data, 120584, 2983, 1) + put(data, 120585, 2984, 1) + put(data, 120586, 2985, 1) + put(data, 120587, 88, 1) + put(data, 120588, 90, 1) + put(data, 120589, 91, 1) + put(data, 120590, 2986, 1) + put(data, 120591, 2987, 1) + put(data, 120592, 2988, 1) + put(data, 120593, 87, 1) + put(data, 120594, 159, 1) + put(data, 120595, 2989, 1) + put(data, 120596, 2990, 1) + put(data, 120597, 2991, 1) + put(data, 120598, 2992, 1) + put(data, 120599, 2993, 1) + put(data, 120600, 2994, 1) + put(data, 120601, 2995, 1) + put(data, 120602, 2996, 1) + put(data, 120603, 2997, 1) + put(data, 120604, 2958, 1) + put(data, 120605, 2959, 1) + put(data, 120606, 278, 1) + put(data, 120607, 2960, 1) + put(data, 120608, 2961, 1) + put(data, 120609, 2962, 1) + put(data, 120610, 2963, 1) + put(data, 120611, 92, 1) + put(data, 120612, 2964, 1) + put(data, 120613, 2965, 1) + put(data, 120614, 2966, 1) + put(data, 120615, 2967, 1) + put(data, 120616, 2968, 1) + put(data, 120617, 2969, 1) + put(data, 120618, 2970, 1) + put(data, 120619, 279, 1) + put(data, 120620, 2971, 1) + put(data, 120621, 2972, 1) + put(data, 120622, 94, 1) + put(data, 120623, 2973, 1) + put(data, 120624, 86, 1) + put(data, 120625, 2974, 1) + put(data, 120626, 2975, 1) + put(data, 120627, 2976, 1) + put(data, 120628, 1865, 1) + put(data, 120629, 2977, 1) + put(data, 120630, 2978, 1) + put(data, 120631, 84, 1) + put(data, 120632, 157, 1) + put(data, 120633, 158, 1) + put(data, 120634, 93, 1) + put(data, 120635, 2979, 1) + put(data, 120636, 2980, 1) + put(data, 120637, 85, 1) + put(data, 120638, 2981, 1) + put(data, 120639, 89, 1) + put(data, 120640, 2982, 1) + put(data, 120641, 10, 1) + put(data, 120642, 2983, 1) + put(data, 120643, 2984, 1) + put(data, 120644, 2985, 1) + put(data, 120645, 88, 1) + put(data, 120646, 90, 1) + put(data, 120647, 91, 1) + put(data, 120648, 2986, 1) + put(data, 120649, 2987, 1) + put(data, 120650, 2988, 1) + put(data, 120651, 87, 1) + put(data, 120652, 159, 1) + put(data, 120653, 2989, 1) + put(data, 120654, 2990, 1) + put(data, 120655, 2991, 1) + put(data, 120656, 2992, 1) + put(data, 120657, 2993, 1) + put(data, 120658, 2994, 1) + put(data, 120659, 2995, 1) + put(data, 120660, 2996, 1) + put(data, 120661, 2997, 1) + put(data, 120662, 2958, 1) + put(data, 120663, 2959, 1) + put(data, 120664, 278, 1) + put(data, 120665, 2960, 1) + put(data, 120666, 2961, 1) + put(data, 120667, 2962, 1) + put(data, 120668, 2963, 1) + put(data, 120669, 92, 1) + put(data, 120670, 2964, 1) + put(data, 120671, 2965, 1) + put(data, 120672, 2966, 1) + put(data, 120673, 2967, 1) + put(data, 120674, 2968, 1) + put(data, 120675, 2969, 1) + put(data, 120676, 2970, 1) + put(data, 120677, 279, 1) + put(data, 120678, 2971, 1) + put(data, 120679, 2972, 1) + put(data, 120680, 94, 1) + put(data, 120681, 2973, 1) + put(data, 120682, 86, 1) + put(data, 120683, 2974, 1) + put(data, 120684, 2975, 1) + put(data, 120685, 2976, 1) + put(data, 120686, 1865, 1) + put(data, 120687, 2977, 1) + put(data, 120688, 2978, 1) + put(data, 120689, 84, 1) + put(data, 120690, 157, 1) + put(data, 120691, 158, 1) + put(data, 120692, 93, 1) + put(data, 120693, 2979, 1) + put(data, 120694, 2980, 1) + put(data, 120695, 85, 1) + put(data, 120696, 2981, 1) + put(data, 120697, 89, 1) + put(data, 120698, 2982, 1) + put(data, 120699, 10, 1) + put(data, 120700, 2983, 1) + put(data, 120701, 2984, 1) + put(data, 120702, 2985, 1) + put(data, 120703, 88, 1) + put(data, 120704, 90, 1) + put(data, 120705, 91, 1) + put(data, 120706, 2986, 1) + put(data, 120707, 2987, 1) + put(data, 120708, 2988, 1) + put(data, 120709, 87, 1) + put(data, 120710, 159, 1) + put(data, 120711, 2989, 1) + put(data, 120712, 2990, 1) + put(data, 120713, 2991, 1) + put(data, 120714, 2992, 1) + put(data, 120715, 2993, 1) + put(data, 120716, 2994, 1) + put(data, 120717, 2995, 1) + put(data, 120718, 2996, 1) + put(data, 120719, 2997, 1) + put(data, 120720, 2958, 1) + put(data, 120721, 2959, 1) + put(data, 120722, 278, 1) + put(data, 120723, 2960, 1) + put(data, 120724, 2961, 1) + put(data, 120725, 2962, 1) + put(data, 120726, 2963, 1) + put(data, 120727, 92, 1) + put(data, 120728, 2964, 1) + put(data, 120729, 2965, 1) + put(data, 120730, 2966, 1) + put(data, 120731, 2967, 1) + put(data, 120732, 2968, 1) + put(data, 120733, 2969, 1) + put(data, 120734, 2970, 1) + put(data, 120735, 279, 1) + put(data, 120736, 2971, 1) + put(data, 120737, 2972, 1) + put(data, 120738, 94, 1) + put(data, 120739, 2973, 1) + put(data, 120740, 86, 1) + put(data, 120741, 2974, 1) + put(data, 120742, 2975, 1) + put(data, 120743, 2976, 1) + put(data, 120744, 1865, 1) + put(data, 120745, 2977, 1) + put(data, 120746, 2978, 1) + put(data, 120747, 84, 1) + put(data, 120748, 157, 1) + put(data, 120749, 158, 1) + put(data, 120750, 93, 1) + put(data, 120751, 2979, 1) + put(data, 120752, 2980, 1) + put(data, 120753, 85, 1) + put(data, 120754, 2981, 1) + put(data, 120755, 89, 1) + put(data, 120756, 2982, 1) + put(data, 120757, 10, 1) + put(data, 120758, 2983, 1) + put(data, 120759, 2984, 1) + put(data, 120760, 2985, 1) + put(data, 120761, 88, 1) + put(data, 120762, 90, 1) + put(data, 120763, 91, 1) + put(data, 120764, 2986, 1) + put(data, 120765, 2987, 1) + put(data, 120766, 2988, 1) + put(data, 120767, 87, 1) + put(data, 120768, 159, 1) + put(data, 120769, 2989, 1) + put(data, 120770, 2990, 1) + put(data, 120771, 2991, 1) + put(data, 120772, 2992, 1) + put(data, 120773, 2993, 1) + put(data, 120774, 2994, 1) + put(data, 120775, 2995, 1) + put(data, 120776, 2996, 1) + put(data, 120777, 2997, 1) + put(data, 120778, 2998, 1) + put(data, 120779, 2999, 1) + put(data, 120782, 229, 1) + put(data, 120783, 13, 1) + put(data, 120784, 6, 1) + put(data, 120785, 7, 1) + put(data, 120786, 17, 1) + put(data, 120787, 230, 1) + put(data, 120788, 231, 1) + put(data, 120789, 232, 1) + put(data, 120790, 233, 1) + put(data, 120791, 234, 1) + put(data, 120792, 229, 1) + put(data, 120793, 13, 1) + put(data, 120794, 6, 1) + put(data, 120795, 7, 1) + put(data, 120796, 17, 1) + put(data, 120797, 230, 1) + put(data, 120798, 231, 1) + put(data, 120799, 232, 1) + put(data, 120800, 233, 1) + put(data, 120801, 234, 1) + put(data, 120802, 229, 1) + put(data, 120803, 13, 1) + put(data, 120804, 6, 1) + put(data, 120805, 7, 1) + put(data, 120806, 17, 1) + put(data, 120807, 230, 1) + put(data, 120808, 231, 1) + put(data, 120809, 232, 1) + put(data, 120810, 233, 1) + put(data, 120811, 234, 1) + put(data, 120812, 229, 1) + put(data, 120813, 13, 1) + put(data, 120814, 6, 1) + put(data, 120815, 7, 1) + put(data, 120816, 17, 1) + put(data, 120817, 230, 1) + put(data, 120818, 231, 1) + put(data, 120819, 232, 1) + put(data, 120820, 233, 1) + put(data, 120821, 234, 1) + put(data, 120822, 229, 1) + put(data, 120823, 13, 1) + put(data, 120824, 6, 1) + put(data, 120825, 7, 1) + put(data, 120826, 17, 1) + put(data, 120827, 230, 1) + put(data, 120828, 231, 1) + put(data, 120829, 232, 1) + put(data, 120830, 233, 1) + put(data, 120831, 234, 1) + put(data, 126464, 97, 1) + put(data, 126465, 2126, 1) + put(data, 126466, 2119, 1) + put(data, 126467, 2715, 1) + put(data, 126469, 99, 1) + put(data, 126470, 2313, 1) + put(data, 126471, 2121, 1) + put(data, 126472, 2190, 1) + put(data, 126473, 103, 1) + put(data, 126474, 2224, 1) + put(data, 126475, 2233, 1) + put(data, 126476, 2123, 1) + put(data, 126477, 2260, 1) + put(data, 126478, 2170, 1) + put(data, 126479, 2196, 1) + put(data, 126480, 2204, 1) + put(data, 126481, 2178, 1) + put(data, 126482, 2216, 1) + put(data, 126483, 2288, 1) + put(data, 126484, 2366, 1) + put(data, 126485, 2138, 1) + put(data, 126486, 2150, 1) + put(data, 126487, 2131, 1) + put(data, 126488, 2286, 1) + put(data, 126489, 2182, 1) + put(data, 126490, 2194, 1) + put(data, 126491, 2200, 1) + put(data, 126492, 3000, 1) + put(data, 126493, 2085, 1) + put(data, 126494, 3001, 1) + put(data, 126495, 3002, 1) + put(data, 126497, 2126, 1) + put(data, 126498, 2119, 1) + put(data, 126500, 2272, 1) + put(data, 126503, 2121, 1) + put(data, 126505, 103, 1) + put(data, 126506, 2224, 1) + put(data, 126507, 2233, 1) + put(data, 126508, 2123, 1) + put(data, 126509, 2260, 1) + put(data, 126510, 2170, 1) + put(data, 126511, 2196, 1) + put(data, 126512, 2204, 1) + put(data, 126513, 2178, 1) + put(data, 126514, 2216, 1) + put(data, 126516, 2366, 1) + put(data, 126517, 2138, 1) + put(data, 126518, 2150, 1) + put(data, 126519, 2131, 1) + put(data, 126521, 2182, 1) + put(data, 126523, 2200, 1) + put(data, 126530, 2119, 1) + put(data, 126535, 2121, 1) + put(data, 126537, 103, 1) + put(data, 126539, 2233, 1) + put(data, 126541, 2260, 1) + put(data, 126542, 2170, 1) + put(data, 126543, 2196, 1) + put(data, 126545, 2178, 1) + put(data, 126546, 2216, 1) + put(data, 126548, 2366, 1) + put(data, 126551, 2131, 1) + put(data, 126553, 2182, 1) + put(data, 126555, 2200, 1) + put(data, 126557, 2085, 1) + put(data, 126559, 3002, 1) + put(data, 126561, 2126, 1) + put(data, 126562, 2119, 1) + put(data, 126564, 2272, 1) + put(data, 126567, 2121, 1) + put(data, 126568, 2190, 1) + put(data, 126569, 103, 1) + put(data, 126570, 2224, 1) + put(data, 126572, 2123, 1) + put(data, 126573, 2260, 1) + put(data, 126574, 2170, 1) + put(data, 126575, 2196, 1) + put(data, 126576, 2204, 1) + put(data, 126577, 2178, 1) + put(data, 126578, 2216, 1) + put(data, 126580, 2366, 1) + put(data, 126581, 2138, 1) + put(data, 126582, 2150, 1) + put(data, 126583, 2131, 1) + put(data, 126585, 2182, 1) + put(data, 126586, 2194, 1) + put(data, 126587, 2200, 1) + put(data, 126588, 3000, 1) + put(data, 126590, 3001, 1) + put(data, 126592, 97, 1) + put(data, 126593, 2126, 1) + put(data, 126594, 2119, 1) + put(data, 126595, 2715, 1) + put(data, 126596, 2272, 1) + put(data, 126597, 99, 1) + put(data, 126598, 2313, 1) + put(data, 126599, 2121, 1) + put(data, 126600, 2190, 1) + put(data, 126601, 103, 1) + put(data, 126603, 2233, 1) + put(data, 126604, 2123, 1) + put(data, 126605, 2260, 1) + put(data, 126606, 2170, 1) + put(data, 126607, 2196, 1) + put(data, 126608, 2204, 1) + put(data, 126609, 2178, 1) + put(data, 126610, 2216, 1) + put(data, 126611, 2288, 1) + put(data, 126612, 2366, 1) + put(data, 126613, 2138, 1) + put(data, 126614, 2150, 1) + put(data, 126615, 2131, 1) + put(data, 126616, 2286, 1) + put(data, 126617, 2182, 1) + put(data, 126618, 2194, 1) + put(data, 126619, 2200, 1) + put(data, 126625, 2126, 1) + put(data, 126626, 2119, 1) + put(data, 126627, 2715, 1) + put(data, 126629, 99, 1) + put(data, 126630, 2313, 1) + put(data, 126631, 2121, 1) + put(data, 126632, 2190, 1) + put(data, 126633, 103, 1) + put(data, 126635, 2233, 1) + put(data, 126636, 2123, 1) + put(data, 126637, 2260, 1) + put(data, 126638, 2170, 1) + put(data, 126639, 2196, 1) + put(data, 126640, 2204, 1) + put(data, 126641, 2178, 1) + put(data, 126642, 2216, 1) + put(data, 126643, 2288, 1) + put(data, 126644, 2366, 1) + put(data, 126645, 2138, 1) + put(data, 126646, 2150, 1) + put(data, 126647, 2131, 1) + put(data, 126648, 2286, 1) + put(data, 126649, 2182, 1) + put(data, 126650, 2194, 1) + put(data, 126651, 2200, 1) + put(data, 127232, 496, 2) + put(data, 127233, 3003, 2) + put(data, 127234, 3005, 2) + put(data, 127235, 3007, 2) + put(data, 127236, 3009, 2) + put(data, 127237, 3011, 2) + put(data, 127238, 3013, 2) + put(data, 127239, 3015, 2) + put(data, 127240, 3017, 2) + put(data, 127241, 3019, 2) + put(data, 127242, 3021, 2) + put(data, 127248, 3023, 3) + put(data, 127249, 3026, 3) + put(data, 127250, 3029, 3) + put(data, 127251, 3032, 3) + put(data, 127252, 3035, 3) + put(data, 127253, 3038, 3) + put(data, 127254, 3041, 3) + put(data, 127255, 3044, 3) + put(data, 127256, 3047, 3) + put(data, 127257, 3050, 3) + put(data, 127258, 3053, 3) + put(data, 127259, 3056, 3) + put(data, 127260, 3059, 3) + put(data, 127261, 3062, 3) + put(data, 127262, 3065, 3) + put(data, 127263, 3068, 3) + put(data, 127264, 3071, 3) + put(data, 127265, 3074, 3) + put(data, 127266, 3077, 3) + put(data, 127267, 3080, 3) + put(data, 127268, 3083, 3) + put(data, 127269, 3086, 3) + put(data, 127270, 3089, 3) + put(data, 127271, 3092, 3) + put(data, 127272, 3095, 3) + put(data, 127273, 3098, 3) + put(data, 127274, 3101, 3) + put(data, 127275, 248, 1) + put(data, 127276, 131, 1) + put(data, 127277, 3104, 2) + put(data, 127278, 3106, 2) + put(data, 127280, 119, 1) + put(data, 127281, 121, 1) + put(data, 127282, 248, 1) + put(data, 127283, 35, 1) + put(data, 127284, 122, 1) + put(data, 127285, 259, 1) + put(data, 127286, 124, 1) + put(data, 127287, 125, 1) + put(data, 127288, 24, 1) + put(data, 127289, 25, 1) + put(data, 127290, 126, 1) + put(data, 127291, 28, 1) + put(data, 127292, 127, 1) + put(data, 127293, 47, 1) + put(data, 127294, 128, 1) + put(data, 127295, 130, 1) + put(data, 127296, 263, 1) + put(data, 127297, 131, 1) + put(data, 127298, 264, 1) + put(data, 127299, 132, 1) + put(data, 127300, 133, 1) + put(data, 127301, 333, 1) + put(data, 127302, 134, 1) + put(data, 127303, 277, 1) + put(data, 127304, 606, 1) + put(data, 127305, 54, 1) + put(data, 127306, 3108, 2) + put(data, 127307, 1850, 2) + put(data, 127308, 3110, 2) + put(data, 127309, 3112, 2) + put(data, 127310, 3114, 3) + put(data, 127311, 3117, 2) + put(data, 127338, 3119, 2) + put(data, 127339, 3121, 2) + put(data, 127340, 3123, 2) + put(data, 127376, 3125, 2) + put(data, 127488, 3127, 2) + put(data, 127489, 3129, 2) + put(data, 127490, 1290, 1) + put(data, 127504, 678, 1) + put(data, 127505, 3131, 1) + put(data, 127506, 3132, 1) + put(data, 127507, 1461, 1) + put(data, 127508, 621, 1) + put(data, 127509, 3133, 1) + put(data, 127510, 3134, 1) + put(data, 127511, 942, 1) + put(data, 127512, 3135, 1) + put(data, 127513, 3136, 1) + put(data, 127514, 3137, 1) + put(data, 127515, 3138, 1) + put(data, 127516, 3139, 1) + put(data, 127517, 3140, 1) + put(data, 127518, 3141, 1) + put(data, 127519, 3142, 1) + put(data, 127520, 3143, 1) + put(data, 127521, 3144, 1) + put(data, 127522, 714, 1) + put(data, 127523, 3145, 1) + put(data, 127524, 3146, 1) + put(data, 127525, 3147, 1) + put(data, 127526, 3148, 1) + put(data, 127527, 3149, 1) + put(data, 127528, 3150, 1) + put(data, 127529, 615, 1) + put(data, 127530, 934, 1) + put(data, 127531, 3151, 1) + put(data, 127532, 1215, 1) + put(data, 127533, 937, 1) + put(data, 127534, 1216, 1) + put(data, 127535, 3152, 1) + put(data, 127536, 770, 1) + put(data, 127537, 3153, 1) + put(data, 127538, 3154, 1) + put(data, 127539, 3155, 1) + put(data, 127540, 3156, 1) + put(data, 127541, 3157, 1) + put(data, 127542, 1114, 1) + put(data, 127543, 688, 1) + put(data, 127544, 3158, 1) + put(data, 127545, 3159, 1) + put(data, 127546, 3160, 1) + put(data, 127547, 3161, 1) + put(data, 127552, 3162, 3) + put(data, 127553, 3165, 3) + put(data, 127554, 3168, 3) + put(data, 127555, 3171, 3) + put(data, 127556, 3174, 3) + put(data, 127557, 3177, 3) + put(data, 127558, 3180, 3) + put(data, 127559, 3183, 3) + put(data, 127560, 3186, 3) + put(data, 127568, 3189, 1) + put(data, 127569, 3190, 1) + put(data, 130032, 229, 1) + put(data, 130033, 13, 1) + put(data, 130034, 6, 1) + put(data, 130035, 7, 1) + put(data, 130036, 17, 1) + put(data, 130037, 230, 1) + put(data, 130038, 231, 1) + put(data, 130039, 232, 1) + put(data, 130040, 233, 1) + put(data, 130041, 234, 1) + data + end + + # Reverse mapping of the canonical decompositions, excluding the full + # composition exclusions. + # Here we store: (first << 21 | second) => codepoint + private class_getter canonical_compositions : Hash(Int64, Int32) do + data = Hash(Int64, Int32).new(initial_capacity: 941) + put(data, 136315648_i64, 192) + put(data, 136315649_i64, 193) + put(data, 136315650_i64, 194) + put(data, 136315651_i64, 195) + put(data, 136315656_i64, 196) + put(data, 136315658_i64, 197) + put(data, 140509991_i64, 199) + put(data, 144704256_i64, 200) + put(data, 144704257_i64, 201) + put(data, 144704258_i64, 202) + put(data, 144704264_i64, 203) + put(data, 153092864_i64, 204) + put(data, 153092865_i64, 205) + put(data, 153092866_i64, 206) + put(data, 153092872_i64, 207) + put(data, 163578627_i64, 209) + put(data, 165675776_i64, 210) + put(data, 165675777_i64, 211) + put(data, 165675778_i64, 212) + put(data, 165675779_i64, 213) + put(data, 165675784_i64, 214) + put(data, 178258688_i64, 217) + put(data, 178258689_i64, 218) + put(data, 178258690_i64, 219) + put(data, 178258696_i64, 220) + put(data, 186647297_i64, 221) + put(data, 203424512_i64, 224) + put(data, 203424513_i64, 225) + put(data, 203424514_i64, 226) + put(data, 203424515_i64, 227) + put(data, 203424520_i64, 228) + put(data, 203424522_i64, 229) + put(data, 207618855_i64, 231) + put(data, 211813120_i64, 232) + put(data, 211813121_i64, 233) + put(data, 211813122_i64, 234) + put(data, 211813128_i64, 235) + put(data, 220201728_i64, 236) + put(data, 220201729_i64, 237) + put(data, 220201730_i64, 238) + put(data, 220201736_i64, 239) + put(data, 230687491_i64, 241) + put(data, 232784640_i64, 242) + put(data, 232784641_i64, 243) + put(data, 232784642_i64, 244) + put(data, 232784643_i64, 245) + put(data, 232784648_i64, 246) + put(data, 245367552_i64, 249) + put(data, 245367553_i64, 250) + put(data, 245367554_i64, 251) + put(data, 245367560_i64, 252) + put(data, 253756161_i64, 253) + put(data, 253756168_i64, 255) + put(data, 136315652_i64, 256) + put(data, 203424516_i64, 257) + put(data, 136315654_i64, 258) + put(data, 203424518_i64, 259) + put(data, 136315688_i64, 260) + put(data, 203424552_i64, 261) + put(data, 140509953_i64, 262) + put(data, 207618817_i64, 263) + put(data, 140509954_i64, 264) + put(data, 207618818_i64, 265) + put(data, 140509959_i64, 266) + put(data, 207618823_i64, 267) + put(data, 140509964_i64, 268) + put(data, 207618828_i64, 269) + put(data, 142607116_i64, 270) + put(data, 209715980_i64, 271) + put(data, 144704260_i64, 274) + put(data, 211813124_i64, 275) + put(data, 144704262_i64, 276) + put(data, 211813126_i64, 277) + put(data, 144704263_i64, 278) + put(data, 211813127_i64, 279) + put(data, 144704296_i64, 280) + put(data, 211813160_i64, 281) + put(data, 144704268_i64, 282) + put(data, 211813132_i64, 283) + put(data, 148898562_i64, 284) + put(data, 216007426_i64, 285) + put(data, 148898566_i64, 286) + put(data, 216007430_i64, 287) + put(data, 148898567_i64, 288) + put(data, 216007431_i64, 289) + put(data, 148898599_i64, 290) + put(data, 216007463_i64, 291) + put(data, 150995714_i64, 292) + put(data, 218104578_i64, 293) + put(data, 153092867_i64, 296) + put(data, 220201731_i64, 297) + put(data, 153092868_i64, 298) + put(data, 220201732_i64, 299) + put(data, 153092870_i64, 300) + put(data, 220201734_i64, 301) + put(data, 153092904_i64, 302) + put(data, 220201768_i64, 303) + put(data, 153092871_i64, 304) + put(data, 155190018_i64, 308) + put(data, 222298882_i64, 309) + put(data, 157287207_i64, 310) + put(data, 224396071_i64, 311) + put(data, 159384321_i64, 313) + put(data, 226493185_i64, 314) + put(data, 159384359_i64, 315) + put(data, 226493223_i64, 316) + put(data, 159384332_i64, 317) + put(data, 226493196_i64, 318) + put(data, 163578625_i64, 323) + put(data, 230687489_i64, 324) + put(data, 163578663_i64, 325) + put(data, 230687527_i64, 326) + put(data, 163578636_i64, 327) + put(data, 230687500_i64, 328) + put(data, 165675780_i64, 332) + put(data, 232784644_i64, 333) + put(data, 165675782_i64, 334) + put(data, 232784646_i64, 335) + put(data, 165675787_i64, 336) + put(data, 232784651_i64, 337) + put(data, 171967233_i64, 340) + put(data, 239076097_i64, 341) + put(data, 171967271_i64, 342) + put(data, 239076135_i64, 343) + put(data, 171967244_i64, 344) + put(data, 239076108_i64, 345) + put(data, 174064385_i64, 346) + put(data, 241173249_i64, 347) + put(data, 174064386_i64, 348) + put(data, 241173250_i64, 349) + put(data, 174064423_i64, 350) + put(data, 241173287_i64, 351) + put(data, 174064396_i64, 352) + put(data, 241173260_i64, 353) + put(data, 176161575_i64, 354) + put(data, 243270439_i64, 355) + put(data, 176161548_i64, 356) + put(data, 243270412_i64, 357) + put(data, 178258691_i64, 360) + put(data, 245367555_i64, 361) + put(data, 178258692_i64, 362) + put(data, 245367556_i64, 363) + put(data, 178258694_i64, 364) + put(data, 245367558_i64, 365) + put(data, 178258698_i64, 366) + put(data, 245367562_i64, 367) + put(data, 178258699_i64, 368) + put(data, 245367563_i64, 369) + put(data, 178258728_i64, 370) + put(data, 245367592_i64, 371) + put(data, 182452994_i64, 372) + put(data, 249561858_i64, 373) + put(data, 186647298_i64, 374) + put(data, 253756162_i64, 375) + put(data, 186647304_i64, 376) + put(data, 188744449_i64, 377) + put(data, 255853313_i64, 378) + put(data, 188744455_i64, 379) + put(data, 255853319_i64, 380) + put(data, 188744460_i64, 381) + put(data, 255853324_i64, 382) + put(data, 165675803_i64, 416) + put(data, 232784667_i64, 417) + put(data, 178258715_i64, 431) + put(data, 245367579_i64, 432) + put(data, 136315660_i64, 461) + put(data, 203424524_i64, 462) + put(data, 153092876_i64, 463) + put(data, 220201740_i64, 464) + put(data, 165675788_i64, 465) + put(data, 232784652_i64, 466) + put(data, 178258700_i64, 467) + put(data, 245367564_i64, 468) + put(data, 461374212_i64, 469) + put(data, 528483076_i64, 470) + put(data, 461374209_i64, 471) + put(data, 528483073_i64, 472) + put(data, 461374220_i64, 473) + put(data, 528483084_i64, 474) + put(data, 461374208_i64, 475) + put(data, 528483072_i64, 476) + put(data, 411042564_i64, 478) + put(data, 478151428_i64, 479) + put(data, 1153434372_i64, 480) + put(data, 1155531524_i64, 481) + put(data, 415236868_i64, 482) + put(data, 482345732_i64, 483) + put(data, 148898572_i64, 486) + put(data, 216007436_i64, 487) + put(data, 157287180_i64, 488) + put(data, 224396044_i64, 489) + put(data, 165675816_i64, 490) + put(data, 232784680_i64, 491) + put(data, 1027605252_i64, 492) + put(data, 1029702404_i64, 493) + put(data, 920650508_i64, 494) + put(data, 1379926796_i64, 495) + put(data, 222298892_i64, 496) + put(data, 148898561_i64, 500) + put(data, 216007425_i64, 501) + put(data, 163578624_i64, 504) + put(data, 230687488_i64, 505) + put(data, 413139713_i64, 506) + put(data, 480248577_i64, 507) + put(data, 415236865_i64, 508) + put(data, 482345729_i64, 509) + put(data, 452985601_i64, 510) + put(data, 520094465_i64, 511) + put(data, 136315663_i64, 512) + put(data, 203424527_i64, 513) + put(data, 136315665_i64, 514) + put(data, 203424529_i64, 515) + put(data, 144704271_i64, 516) + put(data, 211813135_i64, 517) + put(data, 144704273_i64, 518) + put(data, 211813137_i64, 519) + put(data, 153092879_i64, 520) + put(data, 220201743_i64, 521) + put(data, 153092881_i64, 522) + put(data, 220201745_i64, 523) + put(data, 165675791_i64, 524) + put(data, 232784655_i64, 525) + put(data, 165675793_i64, 526) + put(data, 232784657_i64, 527) + put(data, 171967247_i64, 528) + put(data, 239076111_i64, 529) + put(data, 171967249_i64, 530) + put(data, 239076113_i64, 531) + put(data, 178258703_i64, 532) + put(data, 245367567_i64, 533) + put(data, 178258705_i64, 534) + put(data, 245367569_i64, 535) + put(data, 174064422_i64, 536) + put(data, 241173286_i64, 537) + put(data, 176161574_i64, 538) + put(data, 243270438_i64, 539) + put(data, 150995724_i64, 542) + put(data, 218104588_i64, 543) + put(data, 136315655_i64, 550) + put(data, 203424519_i64, 551) + put(data, 144704295_i64, 552) + put(data, 211813159_i64, 553) + put(data, 448791300_i64, 554) + put(data, 515900164_i64, 555) + put(data, 446694148_i64, 556) + put(data, 513803012_i64, 557) + put(data, 165675783_i64, 558) + put(data, 232784647_i64, 559) + put(data, 1170211588_i64, 560) + put(data, 1172308740_i64, 561) + put(data, 186647300_i64, 562) + put(data, 253756164_i64, 563) + put(data, 352322305_i64, 901) + put(data, 1914700545_i64, 902) + put(data, 1923089153_i64, 904) + put(data, 1927283457_i64, 905) + put(data, 1931477761_i64, 906) + put(data, 1944060673_i64, 908) + put(data, 1956643585_i64, 910) + put(data, 1965032193_i64, 911) + put(data, 2034238209_i64, 912) + put(data, 1931477768_i64, 938) + put(data, 1956643592_i64, 939) + put(data, 1981809409_i64, 940) + put(data, 1990198017_i64, 941) + put(data, 1994392321_i64, 942) + put(data, 1998586625_i64, 943) + put(data, 2036335361_i64, 944) + put(data, 1998586632_i64, 970) + put(data, 2023752456_i64, 971) + put(data, 2011169537_i64, 972) + put(data, 2023752449_i64, 973) + put(data, 2032141057_i64, 974) + put(data, 2051015425_i64, 979) + put(data, 2051015432_i64, 980) + put(data, 2191524608_i64, 1024) + put(data, 2191524616_i64, 1025) + put(data, 2187330305_i64, 1027) + put(data, 2160067336_i64, 1031) + put(data, 2202010369_i64, 1036) + put(data, 2197816064_i64, 1037) + put(data, 2220884742_i64, 1038) + put(data, 2197816070_i64, 1049) + put(data, 2264924934_i64, 1081) + put(data, 2258633472_i64, 1104) + put(data, 2258633480_i64, 1105) + put(data, 2254439169_i64, 1107) + put(data, 2327839496_i64, 1111) + put(data, 2269119233_i64, 1116) + put(data, 2264924928_i64, 1117) + put(data, 2287993606_i64, 1118) + put(data, 2390754063_i64, 1142) + put(data, 2392851215_i64, 1143) + put(data, 2193621766_i64, 1217) + put(data, 2260730630_i64, 1218) + put(data, 2181038854_i64, 1232) + put(data, 2248147718_i64, 1233) + put(data, 2181038856_i64, 1234) + put(data, 2248147720_i64, 1235) + put(data, 2191524614_i64, 1238) + put(data, 2258633478_i64, 1239) + put(data, 2600469256_i64, 1242) + put(data, 2602566408_i64, 1243) + put(data, 2193621768_i64, 1244) + put(data, 2260730632_i64, 1245) + put(data, 2195718920_i64, 1246) + put(data, 2262827784_i64, 1247) + put(data, 2197816068_i64, 1250) + put(data, 2264924932_i64, 1251) + put(data, 2197816072_i64, 1252) + put(data, 2264924936_i64, 1253) + put(data, 2210398984_i64, 1254) + put(data, 2277507848_i64, 1255) + put(data, 2634023688_i64, 1258) + put(data, 2636120840_i64, 1259) + put(data, 2241856264_i64, 1260) + put(data, 2308965128_i64, 1261) + put(data, 2220884740_i64, 1262) + put(data, 2287993604_i64, 1263) + put(data, 2220884744_i64, 1264) + put(data, 2287993608_i64, 1265) + put(data, 2220884747_i64, 1266) + put(data, 2287993611_i64, 1267) + put(data, 2229273352_i64, 1268) + put(data, 2296382216_i64, 1269) + put(data, 2237661960_i64, 1272) + put(data, 2304770824_i64, 1273) + put(data, 3303016019_i64, 1570) + put(data, 3303016020_i64, 1571) + put(data, 3372222036_i64, 1572) + put(data, 3303016021_i64, 1573) + put(data, 3376416340_i64, 1574) + put(data, 3667920468_i64, 1728) + put(data, 3625977428_i64, 1730) + put(data, 3661629012_i64, 1747) + put(data, 4915726652_i64, 2345) + put(data, 4932503868_i64, 2353) + put(data, 4938795324_i64, 2356) + put(data, 5249173950_i64, 2507) + put(data, 5249173975_i64, 2508) + put(data, 6054480726_i64, 2888) + put(data, 6054480702_i64, 2891) + put(data, 6054480727_i64, 2892) + put(data, 6211767255_i64, 2964) + put(data, 6320819134_i64, 3018) + put(data, 6322916286_i64, 3019) + put(data, 6320819159_i64, 3020) + put(data, 6589254742_i64, 3144) + put(data, 6843010261_i64, 3264) + put(data, 6857690325_i64, 3271) + put(data, 6857690326_i64, 3272) + put(data, 6857690306_i64, 3274) + put(data, 6866078933_i64, 3275) + put(data, 7126125886_i64, 3402) + put(data, 7128223038_i64, 3403) + put(data, 7126125911_i64, 3404) + put(data, 7434407370_i64, 3546) + put(data, 7434407375_i64, 3548) + put(data, 7440698826_i64, 3549) + put(data, 7434407391_i64, 3550) + put(data, 8667533358_i64, 4134) + put(data, 14506007349_i64, 6918) + put(data, 14510201653_i64, 6920) + put(data, 14514395957_i64, 6922) + put(data, 14518590261_i64, 6924) + put(data, 14522784565_i64, 6926) + put(data, 14531173173_i64, 6930) + put(data, 14617156405_i64, 6971) + put(data, 14621350709_i64, 6973) + put(data, 14625545013_i64, 6976) + put(data, 14627642165_i64, 6977) + put(data, 14633933621_i64, 6979) + put(data, 136315685_i64, 7680) + put(data, 203424549_i64, 7681) + put(data, 138412807_i64, 7682) + put(data, 205521671_i64, 7683) + put(data, 138412835_i64, 7684) + put(data, 205521699_i64, 7685) + put(data, 138412849_i64, 7686) + put(data, 205521713_i64, 7687) + put(data, 417334017_i64, 7688) + put(data, 484442881_i64, 7689) + put(data, 142607111_i64, 7690) + put(data, 209715975_i64, 7691) + put(data, 142607139_i64, 7692) + put(data, 209716003_i64, 7693) + put(data, 142607153_i64, 7694) + put(data, 209716017_i64, 7695) + put(data, 142607143_i64, 7696) + put(data, 209716007_i64, 7697) + put(data, 142607149_i64, 7698) + put(data, 209716013_i64, 7699) + put(data, 574620416_i64, 7700) + put(data, 576717568_i64, 7701) + put(data, 574620417_i64, 7702) + put(data, 576717569_i64, 7703) + put(data, 144704301_i64, 7704) + put(data, 211813165_i64, 7705) + put(data, 144704304_i64, 7706) + put(data, 211813168_i64, 7707) + put(data, 1157628678_i64, 7708) + put(data, 1159725830_i64, 7709) + put(data, 146801415_i64, 7710) + put(data, 213910279_i64, 7711) + put(data, 148898564_i64, 7712) + put(data, 216007428_i64, 7713) + put(data, 150995719_i64, 7714) + put(data, 218104583_i64, 7715) + put(data, 150995747_i64, 7716) + put(data, 218104611_i64, 7717) + put(data, 150995720_i64, 7718) + put(data, 218104584_i64, 7719) + put(data, 150995751_i64, 7720) + put(data, 218104615_i64, 7721) + put(data, 150995758_i64, 7722) + put(data, 218104622_i64, 7723) + put(data, 153092912_i64, 7724) + put(data, 220201776_i64, 7725) + put(data, 434111233_i64, 7726) + put(data, 501220097_i64, 7727) + put(data, 157287169_i64, 7728) + put(data, 224396033_i64, 7729) + put(data, 157287203_i64, 7730) + put(data, 224396067_i64, 7731) + put(data, 157287217_i64, 7732) + put(data, 224396081_i64, 7733) + put(data, 159384355_i64, 7734) + put(data, 226493219_i64, 7735) + put(data, 16219374340_i64, 7736) + put(data, 16221471492_i64, 7737) + put(data, 159384369_i64, 7738) + put(data, 226493233_i64, 7739) + put(data, 159384365_i64, 7740) + put(data, 226493229_i64, 7741) + put(data, 161481473_i64, 7742) + put(data, 228590337_i64, 7743) + put(data, 161481479_i64, 7744) + put(data, 228590343_i64, 7745) + put(data, 161481507_i64, 7746) + put(data, 228590371_i64, 7747) + put(data, 163578631_i64, 7748) + put(data, 230687495_i64, 7749) + put(data, 163578659_i64, 7750) + put(data, 230687523_i64, 7751) + put(data, 163578673_i64, 7752) + put(data, 230687537_i64, 7753) + put(data, 163578669_i64, 7754) + put(data, 230687533_i64, 7755) + put(data, 446694145_i64, 7756) + put(data, 513803009_i64, 7757) + put(data, 446694152_i64, 7758) + put(data, 513803016_i64, 7759) + put(data, 696255232_i64, 7760) + put(data, 698352384_i64, 7761) + put(data, 696255233_i64, 7762) + put(data, 698352385_i64, 7763) + put(data, 167772929_i64, 7764) + put(data, 234881793_i64, 7765) + put(data, 167772935_i64, 7766) + put(data, 234881799_i64, 7767) + put(data, 171967239_i64, 7768) + put(data, 239076103_i64, 7769) + put(data, 171967267_i64, 7770) + put(data, 239076131_i64, 7771) + put(data, 16294871812_i64, 7772) + put(data, 16296968964_i64, 7773) + put(data, 171967281_i64, 7774) + put(data, 239076145_i64, 7775) + put(data, 174064391_i64, 7776) + put(data, 241173255_i64, 7777) + put(data, 174064419_i64, 7778) + put(data, 241173283_i64, 7779) + put(data, 725615367_i64, 7780) + put(data, 727712519_i64, 7781) + put(data, 738198279_i64, 7782) + put(data, 740295431_i64, 7783) + put(data, 16311649031_i64, 7784) + put(data, 16313746183_i64, 7785) + put(data, 176161543_i64, 7786) + put(data, 243270407_i64, 7787) + put(data, 176161571_i64, 7788) + put(data, 243270435_i64, 7789) + put(data, 176161585_i64, 7790) + put(data, 243270449_i64, 7791) + put(data, 176161581_i64, 7792) + put(data, 243270445_i64, 7793) + put(data, 178258724_i64, 7794) + put(data, 245367588_i64, 7795) + put(data, 178258736_i64, 7796) + put(data, 245367600_i64, 7797) + put(data, 178258733_i64, 7798) + put(data, 245367597_i64, 7799) + put(data, 754975489_i64, 7800) + put(data, 757072641_i64, 7801) + put(data, 759169800_i64, 7802) + put(data, 761266952_i64, 7803) + put(data, 180355843_i64, 7804) + put(data, 247464707_i64, 7805) + put(data, 180355875_i64, 7806) + put(data, 247464739_i64, 7807) + put(data, 182452992_i64, 7808) + put(data, 249561856_i64, 7809) + put(data, 182452993_i64, 7810) + put(data, 249561857_i64, 7811) + put(data, 182453000_i64, 7812) + put(data, 249561864_i64, 7813) + put(data, 182452999_i64, 7814) + put(data, 249561863_i64, 7815) + put(data, 182453027_i64, 7816) + put(data, 249561891_i64, 7817) + put(data, 184550151_i64, 7818) + put(data, 251659015_i64, 7819) + put(data, 184550152_i64, 7820) + put(data, 251659016_i64, 7821) + put(data, 186647303_i64, 7822) + put(data, 253756167_i64, 7823) + put(data, 188744450_i64, 7824) + put(data, 255853314_i64, 7825) + put(data, 188744483_i64, 7826) + put(data, 255853347_i64, 7827) + put(data, 188744497_i64, 7828) + put(data, 255853361_i64, 7829) + put(data, 218104625_i64, 7830) + put(data, 243270408_i64, 7831) + put(data, 249561866_i64, 7832) + put(data, 253756170_i64, 7833) + put(data, 803209991_i64, 7835) + put(data, 136315683_i64, 7840) + put(data, 203424547_i64, 7841) + put(data, 136315657_i64, 7842) + put(data, 203424521_i64, 7843) + put(data, 406848257_i64, 7844) + put(data, 473957121_i64, 7845) + put(data, 406848256_i64, 7846) + put(data, 473957120_i64, 7847) + put(data, 406848265_i64, 7848) + put(data, 473957129_i64, 7849) + put(data, 406848259_i64, 7850) + put(data, 473957123_i64, 7851) + put(data, 16441672450_i64, 7852) + put(data, 16443769602_i64, 7853) + put(data, 541065985_i64, 7854) + put(data, 543163137_i64, 7855) + put(data, 541065984_i64, 7856) + put(data, 543163136_i64, 7857) + put(data, 541065993_i64, 7858) + put(data, 543163145_i64, 7859) + put(data, 541065987_i64, 7860) + put(data, 543163139_i64, 7861) + put(data, 16441672454_i64, 7862) + put(data, 16443769606_i64, 7863) + put(data, 144704291_i64, 7864) + put(data, 211813155_i64, 7865) + put(data, 144704265_i64, 7866) + put(data, 211813129_i64, 7867) + put(data, 144704259_i64, 7868) + put(data, 211813123_i64, 7869) + put(data, 423625473_i64, 7870) + put(data, 490734337_i64, 7871) + put(data, 423625472_i64, 7872) + put(data, 490734336_i64, 7873) + put(data, 423625481_i64, 7874) + put(data, 490734345_i64, 7875) + put(data, 423625475_i64, 7876) + put(data, 490734339_i64, 7877) + put(data, 16492004098_i64, 7878) + put(data, 16494101250_i64, 7879) + put(data, 153092873_i64, 7880) + put(data, 220201737_i64, 7881) + put(data, 153092899_i64, 7882) + put(data, 220201763_i64, 7883) + put(data, 165675811_i64, 7884) + put(data, 232784675_i64, 7885) + put(data, 165675785_i64, 7886) + put(data, 232784649_i64, 7887) + put(data, 444596993_i64, 7888) + put(data, 511705857_i64, 7889) + put(data, 444596992_i64, 7890) + put(data, 511705856_i64, 7891) + put(data, 444597001_i64, 7892) + put(data, 511705865_i64, 7893) + put(data, 444596995_i64, 7894) + put(data, 511705859_i64, 7895) + put(data, 16533947138_i64, 7896) + put(data, 16536044290_i64, 7897) + put(data, 872416001_i64, 7898) + put(data, 874513153_i64, 7899) + put(data, 872416000_i64, 7900) + put(data, 874513152_i64, 7901) + put(data, 872416009_i64, 7902) + put(data, 874513161_i64, 7903) + put(data, 872416003_i64, 7904) + put(data, 874513155_i64, 7905) + put(data, 872416035_i64, 7906) + put(data, 874513187_i64, 7907) + put(data, 178258723_i64, 7908) + put(data, 245367587_i64, 7909) + put(data, 178258697_i64, 7910) + put(data, 245367561_i64, 7911) + put(data, 903873281_i64, 7912) + put(data, 905970433_i64, 7913) + put(data, 903873280_i64, 7914) + put(data, 905970432_i64, 7915) + put(data, 903873289_i64, 7916) + put(data, 905970441_i64, 7917) + put(data, 903873283_i64, 7918) + put(data, 905970435_i64, 7919) + put(data, 903873315_i64, 7920) + put(data, 905970467_i64, 7921) + put(data, 186647296_i64, 7922) + put(data, 253756160_i64, 7923) + put(data, 186647331_i64, 7924) + put(data, 253756195_i64, 7925) + put(data, 186647305_i64, 7926) + put(data, 253756169_i64, 7927) + put(data, 186647299_i64, 7928) + put(data, 253756163_i64, 7929) + put(data, 1981809427_i64, 7936) + put(data, 1981809428_i64, 7937) + put(data, 16642999040_i64, 7938) + put(data, 16645096192_i64, 7939) + put(data, 16642999041_i64, 7940) + put(data, 16645096193_i64, 7941) + put(data, 16642999106_i64, 7942) + put(data, 16645096258_i64, 7943) + put(data, 1914700563_i64, 7944) + put(data, 1914700564_i64, 7945) + put(data, 16659776256_i64, 7946) + put(data, 16661873408_i64, 7947) + put(data, 16659776257_i64, 7948) + put(data, 16661873409_i64, 7949) + put(data, 16659776322_i64, 7950) + put(data, 16661873474_i64, 7951) + put(data, 1990198035_i64, 7952) + put(data, 1990198036_i64, 7953) + put(data, 16676553472_i64, 7954) + put(data, 16678650624_i64, 7955) + put(data, 16676553473_i64, 7956) + put(data, 16678650625_i64, 7957) + put(data, 1923089171_i64, 7960) + put(data, 1923089172_i64, 7961) + put(data, 16693330688_i64, 7962) + put(data, 16695427840_i64, 7963) + put(data, 16693330689_i64, 7964) + put(data, 16695427841_i64, 7965) + put(data, 1994392339_i64, 7968) + put(data, 1994392340_i64, 7969) + put(data, 16710107904_i64, 7970) + put(data, 16712205056_i64, 7971) + put(data, 16710107905_i64, 7972) + put(data, 16712205057_i64, 7973) + put(data, 16710107970_i64, 7974) + put(data, 16712205122_i64, 7975) + put(data, 1927283475_i64, 7976) + put(data, 1927283476_i64, 7977) + put(data, 16726885120_i64, 7978) + put(data, 16728982272_i64, 7979) + put(data, 16726885121_i64, 7980) + put(data, 16728982273_i64, 7981) + put(data, 16726885186_i64, 7982) + put(data, 16728982338_i64, 7983) + put(data, 1998586643_i64, 7984) + put(data, 1998586644_i64, 7985) + put(data, 16743662336_i64, 7986) + put(data, 16745759488_i64, 7987) + put(data, 16743662337_i64, 7988) + put(data, 16745759489_i64, 7989) + put(data, 16743662402_i64, 7990) + put(data, 16745759554_i64, 7991) + put(data, 1931477779_i64, 7992) + put(data, 1931477780_i64, 7993) + put(data, 16760439552_i64, 7994) + put(data, 16762536704_i64, 7995) + put(data, 16760439553_i64, 7996) + put(data, 16762536705_i64, 7997) + put(data, 16760439618_i64, 7998) + put(data, 16762536770_i64, 7999) + put(data, 2011169555_i64, 8000) + put(data, 2011169556_i64, 8001) + put(data, 16777216768_i64, 8002) + put(data, 16779313920_i64, 8003) + put(data, 16777216769_i64, 8004) + put(data, 16779313921_i64, 8005) + put(data, 1944060691_i64, 8008) + put(data, 1944060692_i64, 8009) + put(data, 16793993984_i64, 8010) + put(data, 16796091136_i64, 8011) + put(data, 16793993985_i64, 8012) + put(data, 16796091137_i64, 8013) + put(data, 2023752467_i64, 8016) + put(data, 2023752468_i64, 8017) + put(data, 16810771200_i64, 8018) + put(data, 16812868352_i64, 8019) + put(data, 16810771201_i64, 8020) + put(data, 16812868353_i64, 8021) + put(data, 16810771266_i64, 8022) + put(data, 16812868418_i64, 8023) + put(data, 1956643604_i64, 8025) + put(data, 16829645568_i64, 8027) + put(data, 16829645569_i64, 8029) + put(data, 16829645634_i64, 8031) + put(data, 2032141075_i64, 8032) + put(data, 2032141076_i64, 8033) + put(data, 16844325632_i64, 8034) + put(data, 16846422784_i64, 8035) + put(data, 16844325633_i64, 8036) + put(data, 16846422785_i64, 8037) + put(data, 16844325698_i64, 8038) + put(data, 16846422850_i64, 8039) + put(data, 1965032211_i64, 8040) + put(data, 1965032212_i64, 8041) + put(data, 16861102848_i64, 8042) + put(data, 16863200000_i64, 8043) + put(data, 16861102849_i64, 8044) + put(data, 16863200001_i64, 8045) + put(data, 16861102914_i64, 8046) + put(data, 16863200066_i64, 8047) + put(data, 1981809408_i64, 8048) + put(data, 1990198016_i64, 8050) + put(data, 1994392320_i64, 8052) + put(data, 1998586624_i64, 8054) + put(data, 2011169536_i64, 8056) + put(data, 2023752448_i64, 8058) + put(data, 2032141056_i64, 8060) + put(data, 16642999109_i64, 8064) + put(data, 16645096261_i64, 8065) + put(data, 16647193413_i64, 8066) + put(data, 16649290565_i64, 8067) + put(data, 16651387717_i64, 8068) + put(data, 16653484869_i64, 8069) + put(data, 16655582021_i64, 8070) + put(data, 16657679173_i64, 8071) + put(data, 16659776325_i64, 8072) + put(data, 16661873477_i64, 8073) + put(data, 16663970629_i64, 8074) + put(data, 16666067781_i64, 8075) + put(data, 16668164933_i64, 8076) + put(data, 16670262085_i64, 8077) + put(data, 16672359237_i64, 8078) + put(data, 16674456389_i64, 8079) + put(data, 16710107973_i64, 8080) + put(data, 16712205125_i64, 8081) + put(data, 16714302277_i64, 8082) + put(data, 16716399429_i64, 8083) + put(data, 16718496581_i64, 8084) + put(data, 16720593733_i64, 8085) + put(data, 16722690885_i64, 8086) + put(data, 16724788037_i64, 8087) + put(data, 16726885189_i64, 8088) + put(data, 16728982341_i64, 8089) + put(data, 16731079493_i64, 8090) + put(data, 16733176645_i64, 8091) + put(data, 16735273797_i64, 8092) + put(data, 16737370949_i64, 8093) + put(data, 16739468101_i64, 8094) + put(data, 16741565253_i64, 8095) + put(data, 16844325701_i64, 8096) + put(data, 16846422853_i64, 8097) + put(data, 16848520005_i64, 8098) + put(data, 16850617157_i64, 8099) + put(data, 16852714309_i64, 8100) + put(data, 16854811461_i64, 8101) + put(data, 16856908613_i64, 8102) + put(data, 16859005765_i64, 8103) + put(data, 16861102917_i64, 8104) + put(data, 16863200069_i64, 8105) + put(data, 16865297221_i64, 8106) + put(data, 16867394373_i64, 8107) + put(data, 16869491525_i64, 8108) + put(data, 16871588677_i64, 8109) + put(data, 16873685829_i64, 8110) + put(data, 16875782981_i64, 8111) + put(data, 1981809414_i64, 8112) + put(data, 1981809412_i64, 8113) + put(data, 16877880133_i64, 8114) + put(data, 1981809477_i64, 8115) + put(data, 1971323717_i64, 8116) + put(data, 1981809474_i64, 8118) + put(data, 17024680773_i64, 8119) + put(data, 1914700550_i64, 8120) + put(data, 1914700548_i64, 8121) + put(data, 1914700544_i64, 8122) + put(data, 1914700613_i64, 8124) + put(data, 352322370_i64, 8129) + put(data, 16886268741_i64, 8130) + put(data, 1994392389_i64, 8131) + put(data, 1975518021_i64, 8132) + put(data, 1994392386_i64, 8134) + put(data, 17058235205_i64, 8135) + put(data, 1923089152_i64, 8136) + put(data, 1927283456_i64, 8138) + put(data, 1927283525_i64, 8140) + put(data, 17043555072_i64, 8141) + put(data, 17043555073_i64, 8142) + put(data, 17043555138_i64, 8143) + put(data, 1998586630_i64, 8144) + put(data, 1998586628_i64, 8145) + put(data, 2034238208_i64, 8146) + put(data, 1998586690_i64, 8150) + put(data, 2034238274_i64, 8151) + put(data, 1931477766_i64, 8152) + put(data, 1931477764_i64, 8153) + put(data, 1931477760_i64, 8154) + put(data, 17175675648_i64, 8157) + put(data, 17175675649_i64, 8158) + put(data, 17175675714_i64, 8159) + put(data, 2023752454_i64, 8160) + put(data, 2023752452_i64, 8161) + put(data, 2036335360_i64, 8162) + put(data, 2015363859_i64, 8164) + put(data, 2015363860_i64, 8165) + put(data, 2023752514_i64, 8166) + put(data, 2036335426_i64, 8167) + put(data, 1956643590_i64, 8168) + put(data, 1956643588_i64, 8169) + put(data, 1956643584_i64, 8170) + put(data, 1948254996_i64, 8172) + put(data, 352322304_i64, 8173) + put(data, 16903045957_i64, 8178) + put(data, 2032141125_i64, 8179) + put(data, 2042626885_i64, 8180) + put(data, 2032141122_i64, 8182) + put(data, 17158898501_i64, 8183) + put(data, 1944060672_i64, 8184) + put(data, 1965032192_i64, 8186) + put(data, 1965032261_i64, 8188) + put(data, 18018730808_i64, 8602) + put(data, 18022925112_i64, 8603) + put(data, 18027119416_i64, 8622) + put(data, 18152948536_i64, 8653) + put(data, 18161337144_i64, 8654) + put(data, 18157142840_i64, 8655) + put(data, 18259903288_i64, 8708) + put(data, 18270389048_i64, 8713) + put(data, 18276680504_i64, 8716) + put(data, 18327012152_i64, 8740) + put(data, 18331206456_i64, 8742) + put(data, 18379440952_i64, 8769) + put(data, 18394121016_i64, 8772) + put(data, 18398315320_i64, 8775) + put(data, 18404606776_i64, 8777) + put(data, 127927096_i64, 8800) + put(data, 18457035576_i64, 8802) + put(data, 18415092536_i64, 8813) + put(data, 125829944_i64, 8814) + put(data, 130024248_i64, 8815) + put(data, 18463327032_i64, 8816) + put(data, 18465424184_i64, 8817) + put(data, 18492687160_i64, 8820) + put(data, 18494784312_i64, 8821) + put(data, 18501075768_i64, 8824) + put(data, 18503172920_i64, 8825) + put(data, 18509464376_i64, 8832) + put(data, 18511561528_i64, 8833) + put(data, 18526241592_i64, 8836) + put(data, 18528338744_i64, 8837) + put(data, 18534630200_i64, 8840) + put(data, 18536727352_i64, 8841) + put(data, 18593350456_i64, 8876) + put(data, 18605933368_i64, 8877) + put(data, 18608030520_i64, 8878) + put(data, 18612224824_i64, 8879) + put(data, 18513658680_i64, 8928) + put(data, 18515755832_i64, 8929) + put(data, 18557698872_i64, 8930) + put(data, 18559796024_i64, 8931) + put(data, 18626904888_i64, 8938) + put(data, 18629002040_i64, 8939) + put(data, 18631099192_i64, 8940) + put(data, 18633196344_i64, 8941) + put(data, 25927102617_i64, 12364) + put(data, 25931296921_i64, 12366) + put(data, 25935491225_i64, 12368) + put(data, 25939685529_i64, 12370) + put(data, 25943879833_i64, 12372) + put(data, 25948074137_i64, 12374) + put(data, 25952268441_i64, 12376) + put(data, 25956462745_i64, 12378) + put(data, 25960657049_i64, 12380) + put(data, 25964851353_i64, 12382) + put(data, 25969045657_i64, 12384) + put(data, 25973239961_i64, 12386) + put(data, 25979531417_i64, 12389) + put(data, 25983725721_i64, 12391) + put(data, 25987920025_i64, 12393) + put(data, 26002600089_i64, 12400) + put(data, 26002600090_i64, 12401) + put(data, 26008891545_i64, 12403) + put(data, 26008891546_i64, 12404) + put(data, 26015183001_i64, 12406) + put(data, 26015183002_i64, 12407) + put(data, 26021474457_i64, 12409) + put(data, 26021474458_i64, 12410) + put(data, 26027765913_i64, 12412) + put(data, 26027765914_i64, 12413) + put(data, 25916616857_i64, 12436) + put(data, 26099069081_i64, 12446) + put(data, 26128429209_i64, 12460) + put(data, 26132623513_i64, 12462) + put(data, 26136817817_i64, 12464) + put(data, 26141012121_i64, 12466) + put(data, 26145206425_i64, 12468) + put(data, 26149400729_i64, 12470) + put(data, 26153595033_i64, 12472) + put(data, 26157789337_i64, 12474) + put(data, 26161983641_i64, 12476) + put(data, 26166177945_i64, 12478) + put(data, 26170372249_i64, 12480) + put(data, 26174566553_i64, 12482) + put(data, 26180858009_i64, 12485) + put(data, 26185052313_i64, 12487) + put(data, 26189246617_i64, 12489) + put(data, 26203926681_i64, 12496) + put(data, 26203926682_i64, 12497) + put(data, 26210218137_i64, 12499) + put(data, 26210218138_i64, 12500) + put(data, 26216509593_i64, 12502) + put(data, 26216509594_i64, 12503) + put(data, 26222801049_i64, 12505) + put(data, 26222801050_i64, 12506) + put(data, 26229092505_i64, 12508) + put(data, 26229092506_i64, 12509) + put(data, 26117943449_i64, 12532) + put(data, 26271035545_i64, 12535) + put(data, 26273132697_i64, 12536) + put(data, 26275229849_i64, 12537) + put(data, 26277327001_i64, 12538) + put(data, 26300395673_i64, 12542) + put(data, 146349822138_i64, 69786) + put(data, 146354016442_i64, 69788) + put(data, 146374987962_i64, 69803) + put(data, 146668589351_i64, 69934) + put(data, 146670686503_i64, 69935) + put(data, 147788469054_i64, 70475) + put(data, 147788469079_i64, 70476) + put(data, 148564415674_i64, 70843) + put(data, 148564415664_i64, 70844) + put(data, 148564415677_i64, 70846) + put(data, 149099189679_i64, 71098) + put(data, 149101286831_i64, 71099) + put(data, 150971947312_i64, 71992) + data + end + + # Used to quickly determine whether a codepoint may appear under Normalization + # Form C (yes if absent in this table). + # Here we store: {low, high, result (no or maybe)} + private class_getter nfc_quick_check : Array({Int32, Int32, QuickCheckResult}) do + data = Array({Int32, Int32, QuickCheckResult}).new(117) + put(data, 768, 772, QuickCheckResult::Maybe) + put(data, 774, 780, QuickCheckResult::Maybe) + put(data, 783, 783, QuickCheckResult::Maybe) + put(data, 785, 785, QuickCheckResult::Maybe) + put(data, 787, 788, QuickCheckResult::Maybe) + put(data, 795, 795, QuickCheckResult::Maybe) + put(data, 803, 808, QuickCheckResult::Maybe) + put(data, 813, 814, QuickCheckResult::Maybe) + put(data, 816, 817, QuickCheckResult::Maybe) + put(data, 824, 824, QuickCheckResult::Maybe) + put(data, 832, 833, QuickCheckResult::No) + put(data, 834, 834, QuickCheckResult::Maybe) + put(data, 835, 836, QuickCheckResult::No) + put(data, 837, 837, QuickCheckResult::Maybe) + put(data, 884, 884, QuickCheckResult::No) + put(data, 894, 894, QuickCheckResult::No) + put(data, 903, 903, QuickCheckResult::No) + put(data, 1619, 1621, QuickCheckResult::Maybe) + put(data, 2364, 2364, QuickCheckResult::Maybe) + put(data, 2392, 2399, QuickCheckResult::No) + put(data, 2494, 2494, QuickCheckResult::Maybe) + put(data, 2519, 2519, QuickCheckResult::Maybe) + put(data, 2524, 2525, QuickCheckResult::No) + put(data, 2527, 2527, QuickCheckResult::No) + put(data, 2611, 2611, QuickCheckResult::No) + put(data, 2614, 2614, QuickCheckResult::No) + put(data, 2649, 2651, QuickCheckResult::No) + put(data, 2654, 2654, QuickCheckResult::No) + put(data, 2878, 2878, QuickCheckResult::Maybe) + put(data, 2902, 2902, QuickCheckResult::Maybe) + put(data, 2903, 2903, QuickCheckResult::Maybe) + put(data, 2908, 2909, QuickCheckResult::No) + put(data, 3006, 3006, QuickCheckResult::Maybe) + put(data, 3031, 3031, QuickCheckResult::Maybe) + put(data, 3158, 3158, QuickCheckResult::Maybe) + put(data, 3266, 3266, QuickCheckResult::Maybe) + put(data, 3285, 3286, QuickCheckResult::Maybe) + put(data, 3390, 3390, QuickCheckResult::Maybe) + put(data, 3415, 3415, QuickCheckResult::Maybe) + put(data, 3530, 3530, QuickCheckResult::Maybe) + put(data, 3535, 3535, QuickCheckResult::Maybe) + put(data, 3551, 3551, QuickCheckResult::Maybe) + put(data, 3907, 3907, QuickCheckResult::No) + put(data, 3917, 3917, QuickCheckResult::No) + put(data, 3922, 3922, QuickCheckResult::No) + put(data, 3927, 3927, QuickCheckResult::No) + put(data, 3932, 3932, QuickCheckResult::No) + put(data, 3945, 3945, QuickCheckResult::No) + put(data, 3955, 3955, QuickCheckResult::No) + put(data, 3957, 3958, QuickCheckResult::No) + put(data, 3960, 3960, QuickCheckResult::No) + put(data, 3969, 3969, QuickCheckResult::No) + put(data, 3987, 3987, QuickCheckResult::No) + put(data, 3997, 3997, QuickCheckResult::No) + put(data, 4002, 4002, QuickCheckResult::No) + put(data, 4007, 4007, QuickCheckResult::No) + put(data, 4012, 4012, QuickCheckResult::No) + put(data, 4025, 4025, QuickCheckResult::No) + put(data, 4142, 4142, QuickCheckResult::Maybe) + put(data, 4449, 4469, QuickCheckResult::Maybe) + put(data, 4520, 4546, QuickCheckResult::Maybe) + put(data, 6965, 6965, QuickCheckResult::Maybe) + put(data, 8049, 8049, QuickCheckResult::No) + put(data, 8051, 8051, QuickCheckResult::No) + put(data, 8053, 8053, QuickCheckResult::No) + put(data, 8055, 8055, QuickCheckResult::No) + put(data, 8057, 8057, QuickCheckResult::No) + put(data, 8059, 8059, QuickCheckResult::No) + put(data, 8061, 8061, QuickCheckResult::No) + put(data, 8123, 8123, QuickCheckResult::No) + put(data, 8126, 8126, QuickCheckResult::No) + put(data, 8137, 8137, QuickCheckResult::No) + put(data, 8139, 8139, QuickCheckResult::No) + put(data, 8147, 8147, QuickCheckResult::No) + put(data, 8155, 8155, QuickCheckResult::No) + put(data, 8163, 8163, QuickCheckResult::No) + put(data, 8171, 8171, QuickCheckResult::No) + put(data, 8174, 8175, QuickCheckResult::No) + put(data, 8185, 8185, QuickCheckResult::No) + put(data, 8187, 8187, QuickCheckResult::No) + put(data, 8189, 8189, QuickCheckResult::No) + put(data, 8192, 8193, QuickCheckResult::No) + put(data, 8486, 8486, QuickCheckResult::No) + put(data, 8490, 8491, QuickCheckResult::No) + put(data, 9001, 9001, QuickCheckResult::No) + put(data, 9002, 9002, QuickCheckResult::No) + put(data, 10972, 10972, QuickCheckResult::No) + put(data, 12441, 12442, QuickCheckResult::Maybe) + put(data, 63744, 64013, QuickCheckResult::No) + put(data, 64016, 64016, QuickCheckResult::No) + put(data, 64018, 64018, QuickCheckResult::No) + put(data, 64021, 64030, QuickCheckResult::No) + put(data, 64032, 64032, QuickCheckResult::No) + put(data, 64034, 64034, QuickCheckResult::No) + put(data, 64037, 64038, QuickCheckResult::No) + put(data, 64042, 64109, QuickCheckResult::No) + put(data, 64112, 64217, QuickCheckResult::No) + put(data, 64285, 64285, QuickCheckResult::No) + put(data, 64287, 64287, QuickCheckResult::No) + put(data, 64298, 64310, QuickCheckResult::No) + put(data, 64312, 64316, QuickCheckResult::No) + put(data, 64318, 64318, QuickCheckResult::No) + put(data, 64320, 64321, QuickCheckResult::No) + put(data, 64323, 64324, QuickCheckResult::No) + put(data, 64326, 64334, QuickCheckResult::No) + put(data, 69818, 69818, QuickCheckResult::Maybe) + put(data, 69927, 69927, QuickCheckResult::Maybe) + put(data, 70462, 70462, QuickCheckResult::Maybe) + put(data, 70487, 70487, QuickCheckResult::Maybe) + put(data, 70832, 70832, QuickCheckResult::Maybe) + put(data, 70842, 70842, QuickCheckResult::Maybe) + put(data, 70845, 70845, QuickCheckResult::Maybe) + put(data, 71087, 71087, QuickCheckResult::Maybe) + put(data, 71984, 71984, QuickCheckResult::Maybe) + put(data, 119134, 119140, QuickCheckResult::No) + put(data, 119227, 119232, QuickCheckResult::No) + put(data, 194560, 195101, QuickCheckResult::No) + data + end + + # Used to quickly determine whether a codepoint may appear under Normalization + # Form KC (yes if absent in this table). + # Here we store: {low, high, result (no or maybe)} + private class_getter nfkc_quick_check : Array({Int32, Int32, QuickCheckResult}) do + data = Array({Int32, Int32, QuickCheckResult}).new(435) + put(data, 160, 160, QuickCheckResult::No) + put(data, 168, 168, QuickCheckResult::No) + put(data, 170, 170, QuickCheckResult::No) + put(data, 175, 175, QuickCheckResult::No) + put(data, 178, 179, QuickCheckResult::No) + put(data, 180, 180, QuickCheckResult::No) + put(data, 181, 181, QuickCheckResult::No) + put(data, 184, 184, QuickCheckResult::No) + put(data, 185, 185, QuickCheckResult::No) + put(data, 186, 186, QuickCheckResult::No) + put(data, 188, 190, QuickCheckResult::No) + put(data, 306, 307, QuickCheckResult::No) + put(data, 319, 320, QuickCheckResult::No) + put(data, 329, 329, QuickCheckResult::No) + put(data, 383, 383, QuickCheckResult::No) + put(data, 452, 460, QuickCheckResult::No) + put(data, 497, 499, QuickCheckResult::No) + put(data, 688, 696, QuickCheckResult::No) + put(data, 728, 733, QuickCheckResult::No) + put(data, 736, 740, QuickCheckResult::No) + put(data, 768, 772, QuickCheckResult::Maybe) + put(data, 774, 780, QuickCheckResult::Maybe) + put(data, 783, 783, QuickCheckResult::Maybe) + put(data, 785, 785, QuickCheckResult::Maybe) + put(data, 787, 788, QuickCheckResult::Maybe) + put(data, 795, 795, QuickCheckResult::Maybe) + put(data, 803, 808, QuickCheckResult::Maybe) + put(data, 813, 814, QuickCheckResult::Maybe) + put(data, 816, 817, QuickCheckResult::Maybe) + put(data, 824, 824, QuickCheckResult::Maybe) + put(data, 832, 833, QuickCheckResult::No) + put(data, 834, 834, QuickCheckResult::Maybe) + put(data, 835, 836, QuickCheckResult::No) + put(data, 837, 837, QuickCheckResult::Maybe) + put(data, 884, 884, QuickCheckResult::No) + put(data, 890, 890, QuickCheckResult::No) + put(data, 894, 894, QuickCheckResult::No) + put(data, 900, 901, QuickCheckResult::No) + put(data, 903, 903, QuickCheckResult::No) + put(data, 976, 982, QuickCheckResult::No) + put(data, 1008, 1010, QuickCheckResult::No) + put(data, 1012, 1013, QuickCheckResult::No) + put(data, 1017, 1017, QuickCheckResult::No) + put(data, 1415, 1415, QuickCheckResult::No) + put(data, 1619, 1621, QuickCheckResult::Maybe) + put(data, 1653, 1656, QuickCheckResult::No) + put(data, 2364, 2364, QuickCheckResult::Maybe) + put(data, 2392, 2399, QuickCheckResult::No) + put(data, 2494, 2494, QuickCheckResult::Maybe) + put(data, 2519, 2519, QuickCheckResult::Maybe) + put(data, 2524, 2525, QuickCheckResult::No) + put(data, 2527, 2527, QuickCheckResult::No) + put(data, 2611, 2611, QuickCheckResult::No) + put(data, 2614, 2614, QuickCheckResult::No) + put(data, 2649, 2651, QuickCheckResult::No) + put(data, 2654, 2654, QuickCheckResult::No) + put(data, 2878, 2878, QuickCheckResult::Maybe) + put(data, 2902, 2902, QuickCheckResult::Maybe) + put(data, 2903, 2903, QuickCheckResult::Maybe) + put(data, 2908, 2909, QuickCheckResult::No) + put(data, 3006, 3006, QuickCheckResult::Maybe) + put(data, 3031, 3031, QuickCheckResult::Maybe) + put(data, 3158, 3158, QuickCheckResult::Maybe) + put(data, 3266, 3266, QuickCheckResult::Maybe) + put(data, 3285, 3286, QuickCheckResult::Maybe) + put(data, 3390, 3390, QuickCheckResult::Maybe) + put(data, 3415, 3415, QuickCheckResult::Maybe) + put(data, 3530, 3530, QuickCheckResult::Maybe) + put(data, 3535, 3535, QuickCheckResult::Maybe) + put(data, 3551, 3551, QuickCheckResult::Maybe) + put(data, 3635, 3635, QuickCheckResult::No) + put(data, 3763, 3763, QuickCheckResult::No) + put(data, 3804, 3805, QuickCheckResult::No) + put(data, 3852, 3852, QuickCheckResult::No) + put(data, 3907, 3907, QuickCheckResult::No) + put(data, 3917, 3917, QuickCheckResult::No) + put(data, 3922, 3922, QuickCheckResult::No) + put(data, 3927, 3927, QuickCheckResult::No) + put(data, 3932, 3932, QuickCheckResult::No) + put(data, 3945, 3945, QuickCheckResult::No) + put(data, 3955, 3955, QuickCheckResult::No) + put(data, 3957, 3961, QuickCheckResult::No) + put(data, 3969, 3969, QuickCheckResult::No) + put(data, 3987, 3987, QuickCheckResult::No) + put(data, 3997, 3997, QuickCheckResult::No) + put(data, 4002, 4002, QuickCheckResult::No) + put(data, 4007, 4007, QuickCheckResult::No) + put(data, 4012, 4012, QuickCheckResult::No) + put(data, 4025, 4025, QuickCheckResult::No) + put(data, 4142, 4142, QuickCheckResult::Maybe) + put(data, 4348, 4348, QuickCheckResult::No) + put(data, 4449, 4469, QuickCheckResult::Maybe) + put(data, 4520, 4546, QuickCheckResult::Maybe) + put(data, 6965, 6965, QuickCheckResult::Maybe) + put(data, 7468, 7470, QuickCheckResult::No) + put(data, 7472, 7482, QuickCheckResult::No) + put(data, 7484, 7501, QuickCheckResult::No) + put(data, 7503, 7530, QuickCheckResult::No) + put(data, 7544, 7544, QuickCheckResult::No) + put(data, 7579, 7615, QuickCheckResult::No) + put(data, 7834, 7835, QuickCheckResult::No) + put(data, 8049, 8049, QuickCheckResult::No) + put(data, 8051, 8051, QuickCheckResult::No) + put(data, 8053, 8053, QuickCheckResult::No) + put(data, 8055, 8055, QuickCheckResult::No) + put(data, 8057, 8057, QuickCheckResult::No) + put(data, 8059, 8059, QuickCheckResult::No) + put(data, 8061, 8061, QuickCheckResult::No) + put(data, 8123, 8123, QuickCheckResult::No) + put(data, 8125, 8125, QuickCheckResult::No) + put(data, 8126, 8126, QuickCheckResult::No) + put(data, 8127, 8129, QuickCheckResult::No) + put(data, 8137, 8137, QuickCheckResult::No) + put(data, 8139, 8139, QuickCheckResult::No) + put(data, 8141, 8143, QuickCheckResult::No) + put(data, 8147, 8147, QuickCheckResult::No) + put(data, 8155, 8155, QuickCheckResult::No) + put(data, 8157, 8159, QuickCheckResult::No) + put(data, 8163, 8163, QuickCheckResult::No) + put(data, 8171, 8171, QuickCheckResult::No) + put(data, 8173, 8175, QuickCheckResult::No) + put(data, 8185, 8185, QuickCheckResult::No) + put(data, 8187, 8187, QuickCheckResult::No) + put(data, 8189, 8190, QuickCheckResult::No) + put(data, 8192, 8202, QuickCheckResult::No) + put(data, 8209, 8209, QuickCheckResult::No) + put(data, 8215, 8215, QuickCheckResult::No) + put(data, 8228, 8230, QuickCheckResult::No) + put(data, 8239, 8239, QuickCheckResult::No) + put(data, 8243, 8244, QuickCheckResult::No) + put(data, 8246, 8247, QuickCheckResult::No) + put(data, 8252, 8252, QuickCheckResult::No) + put(data, 8254, 8254, QuickCheckResult::No) + put(data, 8263, 8265, QuickCheckResult::No) + put(data, 8279, 8279, QuickCheckResult::No) + put(data, 8287, 8287, QuickCheckResult::No) + put(data, 8304, 8304, QuickCheckResult::No) + put(data, 8305, 8305, QuickCheckResult::No) + put(data, 8308, 8313, QuickCheckResult::No) + put(data, 8314, 8316, QuickCheckResult::No) + put(data, 8317, 8317, QuickCheckResult::No) + put(data, 8318, 8318, QuickCheckResult::No) + put(data, 8319, 8319, QuickCheckResult::No) + put(data, 8320, 8329, QuickCheckResult::No) + put(data, 8330, 8332, QuickCheckResult::No) + put(data, 8333, 8333, QuickCheckResult::No) + put(data, 8334, 8334, QuickCheckResult::No) + put(data, 8336, 8348, QuickCheckResult::No) + put(data, 8360, 8360, QuickCheckResult::No) + put(data, 8448, 8449, QuickCheckResult::No) + put(data, 8450, 8450, QuickCheckResult::No) + put(data, 8451, 8451, QuickCheckResult::No) + put(data, 8453, 8454, QuickCheckResult::No) + put(data, 8455, 8455, QuickCheckResult::No) + put(data, 8457, 8457, QuickCheckResult::No) + put(data, 8458, 8467, QuickCheckResult::No) + put(data, 8469, 8469, QuickCheckResult::No) + put(data, 8470, 8470, QuickCheckResult::No) + put(data, 8473, 8477, QuickCheckResult::No) + put(data, 8480, 8482, QuickCheckResult::No) + put(data, 8484, 8484, QuickCheckResult::No) + put(data, 8486, 8486, QuickCheckResult::No) + put(data, 8488, 8488, QuickCheckResult::No) + put(data, 8490, 8493, QuickCheckResult::No) + put(data, 8495, 8497, QuickCheckResult::No) + put(data, 8499, 8500, QuickCheckResult::No) + put(data, 8501, 8504, QuickCheckResult::No) + put(data, 8505, 8505, QuickCheckResult::No) + put(data, 8507, 8507, QuickCheckResult::No) + put(data, 8508, 8511, QuickCheckResult::No) + put(data, 8512, 8512, QuickCheckResult::No) + put(data, 8517, 8521, QuickCheckResult::No) + put(data, 8528, 8543, QuickCheckResult::No) + put(data, 8544, 8575, QuickCheckResult::No) + put(data, 8585, 8585, QuickCheckResult::No) + put(data, 8748, 8749, QuickCheckResult::No) + put(data, 8751, 8752, QuickCheckResult::No) + put(data, 9001, 9001, QuickCheckResult::No) + put(data, 9002, 9002, QuickCheckResult::No) + put(data, 9312, 9371, QuickCheckResult::No) + put(data, 9372, 9449, QuickCheckResult::No) + put(data, 9450, 9450, QuickCheckResult::No) + put(data, 10764, 10764, QuickCheckResult::No) + put(data, 10868, 10870, QuickCheckResult::No) + put(data, 10972, 10972, QuickCheckResult::No) + put(data, 11388, 11389, QuickCheckResult::No) + put(data, 11631, 11631, QuickCheckResult::No) + put(data, 11935, 11935, QuickCheckResult::No) + put(data, 12019, 12019, QuickCheckResult::No) + put(data, 12032, 12245, QuickCheckResult::No) + put(data, 12288, 12288, QuickCheckResult::No) + put(data, 12342, 12342, QuickCheckResult::No) + put(data, 12344, 12346, QuickCheckResult::No) + put(data, 12441, 12442, QuickCheckResult::Maybe) + put(data, 12443, 12444, QuickCheckResult::No) + put(data, 12447, 12447, QuickCheckResult::No) + put(data, 12543, 12543, QuickCheckResult::No) + put(data, 12593, 12686, QuickCheckResult::No) + put(data, 12690, 12693, QuickCheckResult::No) + put(data, 12694, 12703, QuickCheckResult::No) + put(data, 12800, 12830, QuickCheckResult::No) + put(data, 12832, 12841, QuickCheckResult::No) + put(data, 12842, 12871, QuickCheckResult::No) + put(data, 12880, 12880, QuickCheckResult::No) + put(data, 12881, 12895, QuickCheckResult::No) + put(data, 12896, 12926, QuickCheckResult::No) + put(data, 12928, 12937, QuickCheckResult::No) + put(data, 12938, 12976, QuickCheckResult::No) + put(data, 12977, 12991, QuickCheckResult::No) + put(data, 12992, 13311, QuickCheckResult::No) + put(data, 42652, 42653, QuickCheckResult::No) + put(data, 42864, 42864, QuickCheckResult::No) + put(data, 42994, 42996, QuickCheckResult::No) + put(data, 43000, 43001, QuickCheckResult::No) + put(data, 43868, 43871, QuickCheckResult::No) + put(data, 43881, 43881, QuickCheckResult::No) + put(data, 63744, 64013, QuickCheckResult::No) + put(data, 64016, 64016, QuickCheckResult::No) + put(data, 64018, 64018, QuickCheckResult::No) + put(data, 64021, 64030, QuickCheckResult::No) + put(data, 64032, 64032, QuickCheckResult::No) + put(data, 64034, 64034, QuickCheckResult::No) + put(data, 64037, 64038, QuickCheckResult::No) + put(data, 64042, 64109, QuickCheckResult::No) + put(data, 64112, 64217, QuickCheckResult::No) + put(data, 64256, 64262, QuickCheckResult::No) + put(data, 64275, 64279, QuickCheckResult::No) + put(data, 64285, 64285, QuickCheckResult::No) + put(data, 64287, 64296, QuickCheckResult::No) + put(data, 64297, 64297, QuickCheckResult::No) + put(data, 64298, 64310, QuickCheckResult::No) + put(data, 64312, 64316, QuickCheckResult::No) + put(data, 64318, 64318, QuickCheckResult::No) + put(data, 64320, 64321, QuickCheckResult::No) + put(data, 64323, 64324, QuickCheckResult::No) + put(data, 64326, 64433, QuickCheckResult::No) + put(data, 64467, 64829, QuickCheckResult::No) + put(data, 64848, 64911, QuickCheckResult::No) + put(data, 64914, 64967, QuickCheckResult::No) + put(data, 65008, 65019, QuickCheckResult::No) + put(data, 65020, 65020, QuickCheckResult::No) + put(data, 65040, 65046, QuickCheckResult::No) + put(data, 65047, 65047, QuickCheckResult::No) + put(data, 65048, 65048, QuickCheckResult::No) + put(data, 65049, 65049, QuickCheckResult::No) + put(data, 65072, 65072, QuickCheckResult::No) + put(data, 65073, 65074, QuickCheckResult::No) + put(data, 65075, 65076, QuickCheckResult::No) + put(data, 65077, 65077, QuickCheckResult::No) + put(data, 65078, 65078, QuickCheckResult::No) + put(data, 65079, 65079, QuickCheckResult::No) + put(data, 65080, 65080, QuickCheckResult::No) + put(data, 65081, 65081, QuickCheckResult::No) + put(data, 65082, 65082, QuickCheckResult::No) + put(data, 65083, 65083, QuickCheckResult::No) + put(data, 65084, 65084, QuickCheckResult::No) + put(data, 65085, 65085, QuickCheckResult::No) + put(data, 65086, 65086, QuickCheckResult::No) + put(data, 65087, 65087, QuickCheckResult::No) + put(data, 65088, 65088, QuickCheckResult::No) + put(data, 65089, 65089, QuickCheckResult::No) + put(data, 65090, 65090, QuickCheckResult::No) + put(data, 65091, 65091, QuickCheckResult::No) + put(data, 65092, 65092, QuickCheckResult::No) + put(data, 65095, 65095, QuickCheckResult::No) + put(data, 65096, 65096, QuickCheckResult::No) + put(data, 65097, 65100, QuickCheckResult::No) + put(data, 65101, 65103, QuickCheckResult::No) + put(data, 65104, 65106, QuickCheckResult::No) + put(data, 65108, 65111, QuickCheckResult::No) + put(data, 65112, 65112, QuickCheckResult::No) + put(data, 65113, 65113, QuickCheckResult::No) + put(data, 65114, 65114, QuickCheckResult::No) + put(data, 65115, 65115, QuickCheckResult::No) + put(data, 65116, 65116, QuickCheckResult::No) + put(data, 65117, 65117, QuickCheckResult::No) + put(data, 65118, 65118, QuickCheckResult::No) + put(data, 65119, 65121, QuickCheckResult::No) + put(data, 65122, 65122, QuickCheckResult::No) + put(data, 65123, 65123, QuickCheckResult::No) + put(data, 65124, 65126, QuickCheckResult::No) + put(data, 65128, 65128, QuickCheckResult::No) + put(data, 65129, 65129, QuickCheckResult::No) + put(data, 65130, 65131, QuickCheckResult::No) + put(data, 65136, 65138, QuickCheckResult::No) + put(data, 65140, 65140, QuickCheckResult::No) + put(data, 65142, 65276, QuickCheckResult::No) + put(data, 65281, 65283, QuickCheckResult::No) + put(data, 65284, 65284, QuickCheckResult::No) + put(data, 65285, 65287, QuickCheckResult::No) + put(data, 65288, 65288, QuickCheckResult::No) + put(data, 65289, 65289, QuickCheckResult::No) + put(data, 65290, 65290, QuickCheckResult::No) + put(data, 65291, 65291, QuickCheckResult::No) + put(data, 65292, 65292, QuickCheckResult::No) + put(data, 65293, 65293, QuickCheckResult::No) + put(data, 65294, 65295, QuickCheckResult::No) + put(data, 65296, 65305, QuickCheckResult::No) + put(data, 65306, 65307, QuickCheckResult::No) + put(data, 65308, 65310, QuickCheckResult::No) + put(data, 65311, 65312, QuickCheckResult::No) + put(data, 65313, 65338, QuickCheckResult::No) + put(data, 65339, 65339, QuickCheckResult::No) + put(data, 65340, 65340, QuickCheckResult::No) + put(data, 65341, 65341, QuickCheckResult::No) + put(data, 65342, 65342, QuickCheckResult::No) + put(data, 65343, 65343, QuickCheckResult::No) + put(data, 65344, 65344, QuickCheckResult::No) + put(data, 65345, 65370, QuickCheckResult::No) + put(data, 65371, 65371, QuickCheckResult::No) + put(data, 65372, 65372, QuickCheckResult::No) + put(data, 65373, 65373, QuickCheckResult::No) + put(data, 65374, 65374, QuickCheckResult::No) + put(data, 65375, 65375, QuickCheckResult::No) + put(data, 65376, 65376, QuickCheckResult::No) + put(data, 65377, 65377, QuickCheckResult::No) + put(data, 65378, 65378, QuickCheckResult::No) + put(data, 65379, 65379, QuickCheckResult::No) + put(data, 65380, 65381, QuickCheckResult::No) + put(data, 65382, 65391, QuickCheckResult::No) + put(data, 65392, 65392, QuickCheckResult::No) + put(data, 65393, 65437, QuickCheckResult::No) + put(data, 65438, 65439, QuickCheckResult::No) + put(data, 65440, 65470, QuickCheckResult::No) + put(data, 65474, 65479, QuickCheckResult::No) + put(data, 65482, 65487, QuickCheckResult::No) + put(data, 65490, 65495, QuickCheckResult::No) + put(data, 65498, 65500, QuickCheckResult::No) + put(data, 65504, 65505, QuickCheckResult::No) + put(data, 65506, 65506, QuickCheckResult::No) + put(data, 65507, 65507, QuickCheckResult::No) + put(data, 65508, 65508, QuickCheckResult::No) + put(data, 65509, 65510, QuickCheckResult::No) + put(data, 65512, 65512, QuickCheckResult::No) + put(data, 65513, 65516, QuickCheckResult::No) + put(data, 65517, 65518, QuickCheckResult::No) + put(data, 67457, 67461, QuickCheckResult::No) + put(data, 67463, 67504, QuickCheckResult::No) + put(data, 67506, 67514, QuickCheckResult::No) + put(data, 69818, 69818, QuickCheckResult::Maybe) + put(data, 69927, 69927, QuickCheckResult::Maybe) + put(data, 70462, 70462, QuickCheckResult::Maybe) + put(data, 70487, 70487, QuickCheckResult::Maybe) + put(data, 70832, 70832, QuickCheckResult::Maybe) + put(data, 70842, 70842, QuickCheckResult::Maybe) + put(data, 70845, 70845, QuickCheckResult::Maybe) + put(data, 71087, 71087, QuickCheckResult::Maybe) + put(data, 71984, 71984, QuickCheckResult::Maybe) + put(data, 119134, 119140, QuickCheckResult::No) + put(data, 119227, 119232, QuickCheckResult::No) + put(data, 119808, 119892, QuickCheckResult::No) + put(data, 119894, 119964, QuickCheckResult::No) + put(data, 119966, 119967, QuickCheckResult::No) + put(data, 119970, 119970, QuickCheckResult::No) + put(data, 119973, 119974, QuickCheckResult::No) + put(data, 119977, 119980, QuickCheckResult::No) + put(data, 119982, 119993, QuickCheckResult::No) + put(data, 119995, 119995, QuickCheckResult::No) + put(data, 119997, 120003, QuickCheckResult::No) + put(data, 120005, 120069, QuickCheckResult::No) + put(data, 120071, 120074, QuickCheckResult::No) + put(data, 120077, 120084, QuickCheckResult::No) + put(data, 120086, 120092, QuickCheckResult::No) + put(data, 120094, 120121, QuickCheckResult::No) + put(data, 120123, 120126, QuickCheckResult::No) + put(data, 120128, 120132, QuickCheckResult::No) + put(data, 120134, 120134, QuickCheckResult::No) + put(data, 120138, 120144, QuickCheckResult::No) + put(data, 120146, 120485, QuickCheckResult::No) + put(data, 120488, 120512, QuickCheckResult::No) + put(data, 120513, 120513, QuickCheckResult::No) + put(data, 120514, 120538, QuickCheckResult::No) + put(data, 120539, 120539, QuickCheckResult::No) + put(data, 120540, 120570, QuickCheckResult::No) + put(data, 120571, 120571, QuickCheckResult::No) + put(data, 120572, 120596, QuickCheckResult::No) + put(data, 120597, 120597, QuickCheckResult::No) + put(data, 120598, 120628, QuickCheckResult::No) + put(data, 120629, 120629, QuickCheckResult::No) + put(data, 120630, 120654, QuickCheckResult::No) + put(data, 120655, 120655, QuickCheckResult::No) + put(data, 120656, 120686, QuickCheckResult::No) + put(data, 120687, 120687, QuickCheckResult::No) + put(data, 120688, 120712, QuickCheckResult::No) + put(data, 120713, 120713, QuickCheckResult::No) + put(data, 120714, 120744, QuickCheckResult::No) + put(data, 120745, 120745, QuickCheckResult::No) + put(data, 120746, 120770, QuickCheckResult::No) + put(data, 120771, 120771, QuickCheckResult::No) + put(data, 120772, 120779, QuickCheckResult::No) + put(data, 120782, 120831, QuickCheckResult::No) + put(data, 126464, 126467, QuickCheckResult::No) + put(data, 126469, 126495, QuickCheckResult::No) + put(data, 126497, 126498, QuickCheckResult::No) + put(data, 126500, 126500, QuickCheckResult::No) + put(data, 126503, 126503, QuickCheckResult::No) + put(data, 126505, 126514, QuickCheckResult::No) + put(data, 126516, 126519, QuickCheckResult::No) + put(data, 126521, 126521, QuickCheckResult::No) + put(data, 126523, 126523, QuickCheckResult::No) + put(data, 126530, 126530, QuickCheckResult::No) + put(data, 126535, 126535, QuickCheckResult::No) + put(data, 126537, 126537, QuickCheckResult::No) + put(data, 126539, 126539, QuickCheckResult::No) + put(data, 126541, 126543, QuickCheckResult::No) + put(data, 126545, 126546, QuickCheckResult::No) + put(data, 126548, 126548, QuickCheckResult::No) + put(data, 126551, 126551, QuickCheckResult::No) + put(data, 126553, 126553, QuickCheckResult::No) + put(data, 126555, 126555, QuickCheckResult::No) + put(data, 126557, 126557, QuickCheckResult::No) + put(data, 126559, 126559, QuickCheckResult::No) + put(data, 126561, 126562, QuickCheckResult::No) + put(data, 126564, 126564, QuickCheckResult::No) + put(data, 126567, 126570, QuickCheckResult::No) + put(data, 126572, 126578, QuickCheckResult::No) + put(data, 126580, 126583, QuickCheckResult::No) + put(data, 126585, 126588, QuickCheckResult::No) + put(data, 126590, 126590, QuickCheckResult::No) + put(data, 126592, 126601, QuickCheckResult::No) + put(data, 126603, 126619, QuickCheckResult::No) + put(data, 126625, 126627, QuickCheckResult::No) + put(data, 126629, 126633, QuickCheckResult::No) + put(data, 126635, 126651, QuickCheckResult::No) + put(data, 127232, 127242, QuickCheckResult::No) + put(data, 127248, 127278, QuickCheckResult::No) + put(data, 127280, 127311, QuickCheckResult::No) + put(data, 127338, 127340, QuickCheckResult::No) + put(data, 127376, 127376, QuickCheckResult::No) + put(data, 127488, 127490, QuickCheckResult::No) + put(data, 127504, 127547, QuickCheckResult::No) + put(data, 127552, 127560, QuickCheckResult::No) + put(data, 127568, 127569, QuickCheckResult::No) + put(data, 130032, 130041, QuickCheckResult::No) + put(data, 194560, 195101, QuickCheckResult::No) + data + end + + # Used to quickly determine whether a codepoint may appear under Normalization + # Form D (yes if absent in this table). There are no "maybe" values; + # codepoints contained here may not appear under NFD. + # Here we store: {low, high} + private class_getter nfd_quick_check : Array({Int32, Int32}) do + data = Array({Int32, Int32}).new(243) + put(data, 192, 197) + put(data, 199, 207) + put(data, 209, 214) + put(data, 217, 221) + put(data, 224, 229) + put(data, 231, 239) + put(data, 241, 246) + put(data, 249, 253) + put(data, 255, 271) + put(data, 274, 293) + put(data, 296, 304) + put(data, 308, 311) + put(data, 313, 318) + put(data, 323, 328) + put(data, 332, 337) + put(data, 340, 357) + put(data, 360, 382) + put(data, 416, 417) + put(data, 431, 432) + put(data, 461, 476) + put(data, 478, 483) + put(data, 486, 496) + put(data, 500, 501) + put(data, 504, 539) + put(data, 542, 543) + put(data, 550, 563) + put(data, 832, 833) + put(data, 835, 836) + put(data, 884, 884) + put(data, 894, 894) + put(data, 901, 901) + put(data, 902, 902) + put(data, 903, 903) + put(data, 904, 906) + put(data, 908, 908) + put(data, 910, 912) + put(data, 938, 944) + put(data, 970, 974) + put(data, 979, 980) + put(data, 1024, 1025) + put(data, 1027, 1027) + put(data, 1031, 1031) + put(data, 1036, 1038) + put(data, 1049, 1049) + put(data, 1081, 1081) + put(data, 1104, 1105) + put(data, 1107, 1107) + put(data, 1111, 1111) + put(data, 1116, 1118) + put(data, 1142, 1143) + put(data, 1217, 1218) + put(data, 1232, 1235) + put(data, 1238, 1239) + put(data, 1242, 1247) + put(data, 1250, 1255) + put(data, 1258, 1269) + put(data, 1272, 1273) + put(data, 1570, 1574) + put(data, 1728, 1728) + put(data, 1730, 1730) + put(data, 1747, 1747) + put(data, 2345, 2345) + put(data, 2353, 2353) + put(data, 2356, 2356) + put(data, 2392, 2399) + put(data, 2507, 2508) + put(data, 2524, 2525) + put(data, 2527, 2527) + put(data, 2611, 2611) + put(data, 2614, 2614) + put(data, 2649, 2651) + put(data, 2654, 2654) + put(data, 2888, 2888) + put(data, 2891, 2892) + put(data, 2908, 2909) + put(data, 2964, 2964) + put(data, 3018, 3020) + put(data, 3144, 3144) + put(data, 3264, 3264) + put(data, 3271, 3272) + put(data, 3274, 3275) + put(data, 3402, 3404) + put(data, 3546, 3546) + put(data, 3548, 3550) + put(data, 3907, 3907) + put(data, 3917, 3917) + put(data, 3922, 3922) + put(data, 3927, 3927) + put(data, 3932, 3932) + put(data, 3945, 3945) + put(data, 3955, 3955) + put(data, 3957, 3958) + put(data, 3960, 3960) + put(data, 3969, 3969) + put(data, 3987, 3987) + put(data, 3997, 3997) + put(data, 4002, 4002) + put(data, 4007, 4007) + put(data, 4012, 4012) + put(data, 4025, 4025) + put(data, 4134, 4134) + put(data, 6918, 6918) + put(data, 6920, 6920) + put(data, 6922, 6922) + put(data, 6924, 6924) + put(data, 6926, 6926) + put(data, 6930, 6930) + put(data, 6971, 6971) + put(data, 6973, 6973) + put(data, 6976, 6977) + put(data, 6979, 6979) + put(data, 7680, 7833) + put(data, 7835, 7835) + put(data, 7840, 7929) + put(data, 7936, 7957) + put(data, 7960, 7965) + put(data, 7968, 8005) + put(data, 8008, 8013) + put(data, 8016, 8023) + put(data, 8025, 8025) + put(data, 8027, 8027) + put(data, 8029, 8029) + put(data, 8031, 8061) + put(data, 8064, 8116) + put(data, 8118, 8124) + put(data, 8126, 8126) + put(data, 8129, 8129) + put(data, 8130, 8132) + put(data, 8134, 8140) + put(data, 8141, 8143) + put(data, 8144, 8147) + put(data, 8150, 8155) + put(data, 8157, 8159) + put(data, 8160, 8172) + put(data, 8173, 8175) + put(data, 8178, 8180) + put(data, 8182, 8188) + put(data, 8189, 8189) + put(data, 8192, 8193) + put(data, 8486, 8486) + put(data, 8490, 8491) + put(data, 8602, 8603) + put(data, 8622, 8622) + put(data, 8653, 8653) + put(data, 8654, 8655) + put(data, 8708, 8708) + put(data, 8713, 8713) + put(data, 8716, 8716) + put(data, 8740, 8740) + put(data, 8742, 8742) + put(data, 8769, 8769) + put(data, 8772, 8772) + put(data, 8775, 8775) + put(data, 8777, 8777) + put(data, 8800, 8800) + put(data, 8802, 8802) + put(data, 8813, 8817) + put(data, 8820, 8821) + put(data, 8824, 8825) + put(data, 8832, 8833) + put(data, 8836, 8837) + put(data, 8840, 8841) + put(data, 8876, 8879) + put(data, 8928, 8931) + put(data, 8938, 8941) + put(data, 9001, 9001) + put(data, 9002, 9002) + put(data, 10972, 10972) + put(data, 12364, 12364) + put(data, 12366, 12366) + put(data, 12368, 12368) + put(data, 12370, 12370) + put(data, 12372, 12372) + put(data, 12374, 12374) + put(data, 12376, 12376) + put(data, 12378, 12378) + put(data, 12380, 12380) + put(data, 12382, 12382) + put(data, 12384, 12384) + put(data, 12386, 12386) + put(data, 12389, 12389) + put(data, 12391, 12391) + put(data, 12393, 12393) + put(data, 12400, 12401) + put(data, 12403, 12404) + put(data, 12406, 12407) + put(data, 12409, 12410) + put(data, 12412, 12413) + put(data, 12436, 12436) + put(data, 12446, 12446) + put(data, 12460, 12460) + put(data, 12462, 12462) + put(data, 12464, 12464) + put(data, 12466, 12466) + put(data, 12468, 12468) + put(data, 12470, 12470) + put(data, 12472, 12472) + put(data, 12474, 12474) + put(data, 12476, 12476) + put(data, 12478, 12478) + put(data, 12480, 12480) + put(data, 12482, 12482) + put(data, 12485, 12485) + put(data, 12487, 12487) + put(data, 12489, 12489) + put(data, 12496, 12497) + put(data, 12499, 12500) + put(data, 12502, 12503) + put(data, 12505, 12506) + put(data, 12508, 12509) + put(data, 12532, 12532) + put(data, 12535, 12538) + put(data, 12542, 12542) + put(data, 44032, 55203) + put(data, 63744, 64013) + put(data, 64016, 64016) + put(data, 64018, 64018) + put(data, 64021, 64030) + put(data, 64032, 64032) + put(data, 64034, 64034) + put(data, 64037, 64038) + put(data, 64042, 64109) + put(data, 64112, 64217) + put(data, 64285, 64285) + put(data, 64287, 64287) + put(data, 64298, 64310) + put(data, 64312, 64316) + put(data, 64318, 64318) + put(data, 64320, 64321) + put(data, 64323, 64324) + put(data, 64326, 64334) + put(data, 69786, 69786) + put(data, 69788, 69788) + put(data, 69803, 69803) + put(data, 69934, 69935) + put(data, 70475, 70476) + put(data, 70843, 70844) + put(data, 70846, 70846) + put(data, 71098, 71099) + put(data, 71992, 71992) + put(data, 119134, 119140) + put(data, 119227, 119232) + put(data, 194560, 195101) + data + end + + # Used to quickly determine whether a codepoint may appear under Normalization + # Form KD (yes if absent in this table). There are no "maybe" values; + # codepoints contained here may not appear under NFKD. + # Here we store: {low, high} + private class_getter nfkd_quick_check : Array({Int32, Int32}) do + data = Array({Int32, Int32}).new(547) + put(data, 160, 160) + put(data, 168, 168) + put(data, 170, 170) + put(data, 175, 175) + put(data, 178, 179) + put(data, 180, 180) + put(data, 181, 181) + put(data, 184, 184) + put(data, 185, 185) + put(data, 186, 186) + put(data, 188, 190) + put(data, 192, 197) + put(data, 199, 207) + put(data, 209, 214) + put(data, 217, 221) + put(data, 224, 229) + put(data, 231, 239) + put(data, 241, 246) + put(data, 249, 253) + put(data, 255, 271) + put(data, 274, 293) + put(data, 296, 304) + put(data, 306, 311) + put(data, 313, 320) + put(data, 323, 329) + put(data, 332, 337) + put(data, 340, 357) + put(data, 360, 383) + put(data, 416, 417) + put(data, 431, 432) + put(data, 452, 476) + put(data, 478, 483) + put(data, 486, 501) + put(data, 504, 539) + put(data, 542, 543) + put(data, 550, 563) + put(data, 688, 696) + put(data, 728, 733) + put(data, 736, 740) + put(data, 832, 833) + put(data, 835, 836) + put(data, 884, 884) + put(data, 890, 890) + put(data, 894, 894) + put(data, 900, 901) + put(data, 902, 902) + put(data, 903, 903) + put(data, 904, 906) + put(data, 908, 908) + put(data, 910, 912) + put(data, 938, 944) + put(data, 970, 974) + put(data, 976, 982) + put(data, 1008, 1010) + put(data, 1012, 1013) + put(data, 1017, 1017) + put(data, 1024, 1025) + put(data, 1027, 1027) + put(data, 1031, 1031) + put(data, 1036, 1038) + put(data, 1049, 1049) + put(data, 1081, 1081) + put(data, 1104, 1105) + put(data, 1107, 1107) + put(data, 1111, 1111) + put(data, 1116, 1118) + put(data, 1142, 1143) + put(data, 1217, 1218) + put(data, 1232, 1235) + put(data, 1238, 1239) + put(data, 1242, 1247) + put(data, 1250, 1255) + put(data, 1258, 1269) + put(data, 1272, 1273) + put(data, 1415, 1415) + put(data, 1570, 1574) + put(data, 1653, 1656) + put(data, 1728, 1728) + put(data, 1730, 1730) + put(data, 1747, 1747) + put(data, 2345, 2345) + put(data, 2353, 2353) + put(data, 2356, 2356) + put(data, 2392, 2399) + put(data, 2507, 2508) + put(data, 2524, 2525) + put(data, 2527, 2527) + put(data, 2611, 2611) + put(data, 2614, 2614) + put(data, 2649, 2651) + put(data, 2654, 2654) + put(data, 2888, 2888) + put(data, 2891, 2892) + put(data, 2908, 2909) + put(data, 2964, 2964) + put(data, 3018, 3020) + put(data, 3144, 3144) + put(data, 3264, 3264) + put(data, 3271, 3272) + put(data, 3274, 3275) + put(data, 3402, 3404) + put(data, 3546, 3546) + put(data, 3548, 3550) + put(data, 3635, 3635) + put(data, 3763, 3763) + put(data, 3804, 3805) + put(data, 3852, 3852) + put(data, 3907, 3907) + put(data, 3917, 3917) + put(data, 3922, 3922) + put(data, 3927, 3927) + put(data, 3932, 3932) + put(data, 3945, 3945) + put(data, 3955, 3955) + put(data, 3957, 3961) + put(data, 3969, 3969) + put(data, 3987, 3987) + put(data, 3997, 3997) + put(data, 4002, 4002) + put(data, 4007, 4007) + put(data, 4012, 4012) + put(data, 4025, 4025) + put(data, 4134, 4134) + put(data, 4348, 4348) + put(data, 6918, 6918) + put(data, 6920, 6920) + put(data, 6922, 6922) + put(data, 6924, 6924) + put(data, 6926, 6926) + put(data, 6930, 6930) + put(data, 6971, 6971) + put(data, 6973, 6973) + put(data, 6976, 6977) + put(data, 6979, 6979) + put(data, 7468, 7470) + put(data, 7472, 7482) + put(data, 7484, 7501) + put(data, 7503, 7530) + put(data, 7544, 7544) + put(data, 7579, 7615) + put(data, 7680, 7835) + put(data, 7840, 7929) + put(data, 7936, 7957) + put(data, 7960, 7965) + put(data, 7968, 8005) + put(data, 8008, 8013) + put(data, 8016, 8023) + put(data, 8025, 8025) + put(data, 8027, 8027) + put(data, 8029, 8029) + put(data, 8031, 8061) + put(data, 8064, 8116) + put(data, 8118, 8124) + put(data, 8125, 8125) + put(data, 8126, 8126) + put(data, 8127, 8129) + put(data, 8130, 8132) + put(data, 8134, 8140) + put(data, 8141, 8143) + put(data, 8144, 8147) + put(data, 8150, 8155) + put(data, 8157, 8159) + put(data, 8160, 8172) + put(data, 8173, 8175) + put(data, 8178, 8180) + put(data, 8182, 8188) + put(data, 8189, 8190) + put(data, 8192, 8202) + put(data, 8209, 8209) + put(data, 8215, 8215) + put(data, 8228, 8230) + put(data, 8239, 8239) + put(data, 8243, 8244) + put(data, 8246, 8247) + put(data, 8252, 8252) + put(data, 8254, 8254) + put(data, 8263, 8265) + put(data, 8279, 8279) + put(data, 8287, 8287) + put(data, 8304, 8304) + put(data, 8305, 8305) + put(data, 8308, 8313) + put(data, 8314, 8316) + put(data, 8317, 8317) + put(data, 8318, 8318) + put(data, 8319, 8319) + put(data, 8320, 8329) + put(data, 8330, 8332) + put(data, 8333, 8333) + put(data, 8334, 8334) + put(data, 8336, 8348) + put(data, 8360, 8360) + put(data, 8448, 8449) + put(data, 8450, 8450) + put(data, 8451, 8451) + put(data, 8453, 8454) + put(data, 8455, 8455) + put(data, 8457, 8457) + put(data, 8458, 8467) + put(data, 8469, 8469) + put(data, 8470, 8470) + put(data, 8473, 8477) + put(data, 8480, 8482) + put(data, 8484, 8484) + put(data, 8486, 8486) + put(data, 8488, 8488) + put(data, 8490, 8493) + put(data, 8495, 8497) + put(data, 8499, 8500) + put(data, 8501, 8504) + put(data, 8505, 8505) + put(data, 8507, 8507) + put(data, 8508, 8511) + put(data, 8512, 8512) + put(data, 8517, 8521) + put(data, 8528, 8543) + put(data, 8544, 8575) + put(data, 8585, 8585) + put(data, 8602, 8603) + put(data, 8622, 8622) + put(data, 8653, 8653) + put(data, 8654, 8655) + put(data, 8708, 8708) + put(data, 8713, 8713) + put(data, 8716, 8716) + put(data, 8740, 8740) + put(data, 8742, 8742) + put(data, 8748, 8749) + put(data, 8751, 8752) + put(data, 8769, 8769) + put(data, 8772, 8772) + put(data, 8775, 8775) + put(data, 8777, 8777) + put(data, 8800, 8800) + put(data, 8802, 8802) + put(data, 8813, 8817) + put(data, 8820, 8821) + put(data, 8824, 8825) + put(data, 8832, 8833) + put(data, 8836, 8837) + put(data, 8840, 8841) + put(data, 8876, 8879) + put(data, 8928, 8931) + put(data, 8938, 8941) + put(data, 9001, 9001) + put(data, 9002, 9002) + put(data, 9312, 9371) + put(data, 9372, 9449) + put(data, 9450, 9450) + put(data, 10764, 10764) + put(data, 10868, 10870) + put(data, 10972, 10972) + put(data, 11388, 11389) + put(data, 11631, 11631) + put(data, 11935, 11935) + put(data, 12019, 12019) + put(data, 12032, 12245) + put(data, 12288, 12288) + put(data, 12342, 12342) + put(data, 12344, 12346) + put(data, 12364, 12364) + put(data, 12366, 12366) + put(data, 12368, 12368) + put(data, 12370, 12370) + put(data, 12372, 12372) + put(data, 12374, 12374) + put(data, 12376, 12376) + put(data, 12378, 12378) + put(data, 12380, 12380) + put(data, 12382, 12382) + put(data, 12384, 12384) + put(data, 12386, 12386) + put(data, 12389, 12389) + put(data, 12391, 12391) + put(data, 12393, 12393) + put(data, 12400, 12401) + put(data, 12403, 12404) + put(data, 12406, 12407) + put(data, 12409, 12410) + put(data, 12412, 12413) + put(data, 12436, 12436) + put(data, 12443, 12444) + put(data, 12446, 12446) + put(data, 12447, 12447) + put(data, 12460, 12460) + put(data, 12462, 12462) + put(data, 12464, 12464) + put(data, 12466, 12466) + put(data, 12468, 12468) + put(data, 12470, 12470) + put(data, 12472, 12472) + put(data, 12474, 12474) + put(data, 12476, 12476) + put(data, 12478, 12478) + put(data, 12480, 12480) + put(data, 12482, 12482) + put(data, 12485, 12485) + put(data, 12487, 12487) + put(data, 12489, 12489) + put(data, 12496, 12497) + put(data, 12499, 12500) + put(data, 12502, 12503) + put(data, 12505, 12506) + put(data, 12508, 12509) + put(data, 12532, 12532) + put(data, 12535, 12538) + put(data, 12542, 12542) + put(data, 12543, 12543) + put(data, 12593, 12686) + put(data, 12690, 12693) + put(data, 12694, 12703) + put(data, 12800, 12830) + put(data, 12832, 12841) + put(data, 12842, 12871) + put(data, 12880, 12880) + put(data, 12881, 12895) + put(data, 12896, 12926) + put(data, 12928, 12937) + put(data, 12938, 12976) + put(data, 12977, 12991) + put(data, 12992, 13311) + put(data, 42652, 42653) + put(data, 42864, 42864) + put(data, 42994, 42996) + put(data, 43000, 43001) + put(data, 43868, 43871) + put(data, 43881, 43881) + put(data, 44032, 55203) + put(data, 63744, 64013) + put(data, 64016, 64016) + put(data, 64018, 64018) + put(data, 64021, 64030) + put(data, 64032, 64032) + put(data, 64034, 64034) + put(data, 64037, 64038) + put(data, 64042, 64109) + put(data, 64112, 64217) + put(data, 64256, 64262) + put(data, 64275, 64279) + put(data, 64285, 64285) + put(data, 64287, 64296) + put(data, 64297, 64297) + put(data, 64298, 64310) + put(data, 64312, 64316) + put(data, 64318, 64318) + put(data, 64320, 64321) + put(data, 64323, 64324) + put(data, 64326, 64433) + put(data, 64467, 64829) + put(data, 64848, 64911) + put(data, 64914, 64967) + put(data, 65008, 65019) + put(data, 65020, 65020) + put(data, 65040, 65046) + put(data, 65047, 65047) + put(data, 65048, 65048) + put(data, 65049, 65049) + put(data, 65072, 65072) + put(data, 65073, 65074) + put(data, 65075, 65076) + put(data, 65077, 65077) + put(data, 65078, 65078) + put(data, 65079, 65079) + put(data, 65080, 65080) + put(data, 65081, 65081) + put(data, 65082, 65082) + put(data, 65083, 65083) + put(data, 65084, 65084) + put(data, 65085, 65085) + put(data, 65086, 65086) + put(data, 65087, 65087) + put(data, 65088, 65088) + put(data, 65089, 65089) + put(data, 65090, 65090) + put(data, 65091, 65091) + put(data, 65092, 65092) + put(data, 65095, 65095) + put(data, 65096, 65096) + put(data, 65097, 65100) + put(data, 65101, 65103) + put(data, 65104, 65106) + put(data, 65108, 65111) + put(data, 65112, 65112) + put(data, 65113, 65113) + put(data, 65114, 65114) + put(data, 65115, 65115) + put(data, 65116, 65116) + put(data, 65117, 65117) + put(data, 65118, 65118) + put(data, 65119, 65121) + put(data, 65122, 65122) + put(data, 65123, 65123) + put(data, 65124, 65126) + put(data, 65128, 65128) + put(data, 65129, 65129) + put(data, 65130, 65131) + put(data, 65136, 65138) + put(data, 65140, 65140) + put(data, 65142, 65276) + put(data, 65281, 65283) + put(data, 65284, 65284) + put(data, 65285, 65287) + put(data, 65288, 65288) + put(data, 65289, 65289) + put(data, 65290, 65290) + put(data, 65291, 65291) + put(data, 65292, 65292) + put(data, 65293, 65293) + put(data, 65294, 65295) + put(data, 65296, 65305) + put(data, 65306, 65307) + put(data, 65308, 65310) + put(data, 65311, 65312) + put(data, 65313, 65338) + put(data, 65339, 65339) + put(data, 65340, 65340) + put(data, 65341, 65341) + put(data, 65342, 65342) + put(data, 65343, 65343) + put(data, 65344, 65344) + put(data, 65345, 65370) + put(data, 65371, 65371) + put(data, 65372, 65372) + put(data, 65373, 65373) + put(data, 65374, 65374) + put(data, 65375, 65375) + put(data, 65376, 65376) + put(data, 65377, 65377) + put(data, 65378, 65378) + put(data, 65379, 65379) + put(data, 65380, 65381) + put(data, 65382, 65391) + put(data, 65392, 65392) + put(data, 65393, 65437) + put(data, 65438, 65439) + put(data, 65440, 65470) + put(data, 65474, 65479) + put(data, 65482, 65487) + put(data, 65490, 65495) + put(data, 65498, 65500) + put(data, 65504, 65505) + put(data, 65506, 65506) + put(data, 65507, 65507) + put(data, 65508, 65508) + put(data, 65509, 65510) + put(data, 65512, 65512) + put(data, 65513, 65516) + put(data, 65517, 65518) + put(data, 67457, 67461) + put(data, 67463, 67504) + put(data, 67506, 67514) + put(data, 69786, 69786) + put(data, 69788, 69788) + put(data, 69803, 69803) + put(data, 69934, 69935) + put(data, 70475, 70476) + put(data, 70843, 70844) + put(data, 70846, 70846) + put(data, 71098, 71099) + put(data, 71992, 71992) + put(data, 119134, 119140) + put(data, 119227, 119232) + put(data, 119808, 119892) + put(data, 119894, 119964) + put(data, 119966, 119967) + put(data, 119970, 119970) + put(data, 119973, 119974) + put(data, 119977, 119980) + put(data, 119982, 119993) + put(data, 119995, 119995) + put(data, 119997, 120003) + put(data, 120005, 120069) + put(data, 120071, 120074) + put(data, 120077, 120084) + put(data, 120086, 120092) + put(data, 120094, 120121) + put(data, 120123, 120126) + put(data, 120128, 120132) + put(data, 120134, 120134) + put(data, 120138, 120144) + put(data, 120146, 120485) + put(data, 120488, 120512) + put(data, 120513, 120513) + put(data, 120514, 120538) + put(data, 120539, 120539) + put(data, 120540, 120570) + put(data, 120571, 120571) + put(data, 120572, 120596) + put(data, 120597, 120597) + put(data, 120598, 120628) + put(data, 120629, 120629) + put(data, 120630, 120654) + put(data, 120655, 120655) + put(data, 120656, 120686) + put(data, 120687, 120687) + put(data, 120688, 120712) + put(data, 120713, 120713) + put(data, 120714, 120744) + put(data, 120745, 120745) + put(data, 120746, 120770) + put(data, 120771, 120771) + put(data, 120772, 120779) + put(data, 120782, 120831) + put(data, 126464, 126467) + put(data, 126469, 126495) + put(data, 126497, 126498) + put(data, 126500, 126500) + put(data, 126503, 126503) + put(data, 126505, 126514) + put(data, 126516, 126519) + put(data, 126521, 126521) + put(data, 126523, 126523) + put(data, 126530, 126530) + put(data, 126535, 126535) + put(data, 126537, 126537) + put(data, 126539, 126539) + put(data, 126541, 126543) + put(data, 126545, 126546) + put(data, 126548, 126548) + put(data, 126551, 126551) + put(data, 126553, 126553) + put(data, 126555, 126555) + put(data, 126557, 126557) + put(data, 126559, 126559) + put(data, 126561, 126562) + put(data, 126564, 126564) + put(data, 126567, 126570) + put(data, 126572, 126578) + put(data, 126580, 126583) + put(data, 126585, 126588) + put(data, 126590, 126590) + put(data, 126592, 126601) + put(data, 126603, 126619) + put(data, 126625, 126627) + put(data, 126629, 126633) + put(data, 126635, 126651) + put(data, 127232, 127242) + put(data, 127248, 127278) + put(data, 127280, 127311) + put(data, 127338, 127340) + put(data, 127376, 127376) + put(data, 127488, 127490) + put(data, 127504, 127547) + put(data, 127552, 127560) + put(data, 127568, 127569) + put(data, 130032, 130041) + put(data, 194560, 195101) + data end # TODO: this is needed to avoid generating lots of allocas # in LLVM, which makes LLVM really slow. The compiler should # try to avoid/reuse temporary allocas. # Explanation: https://github.com/crystal-lang/crystal/issues/4516#issuecomment-306226171 + private def self.put(array : Array, value) : Nil + array << value + end + private def self.put(array : Array, *values) : Nil array << values end + private def self.put(hash : Hash, key, value) : Nil + hash[key] = value + end + private def self.put(hash : Hash, key, *values) : Nil hash[key] = values end diff --git a/src/unicode/unicode.cr b/src/unicode/unicode.cr index cc93abd239ba..3fd9605b14f2 100644 --- a/src/unicode/unicode.cr +++ b/src/unicode/unicode.cr @@ -23,6 +23,29 @@ module Unicode Fold end + # Normalization forms available for `String#unicode_normalize` and + # `String#unicode_normalized?`. + enum NormalizationForm + # Canonical decomposition. + NFD + + # Canonical decomposition, followed by canonical composition. + NFC + + # Compatibility decomposition. + NFKD + + # Compatibility decomposition, followed by canonical composition. + NFKC + end + + # :nodoc: + enum QuickCheckResult + Yes + No + Maybe + end + private UNROLL = 64 # :nodoc: @@ -315,33 +338,244 @@ module Unicode in_any_category?(char.ord, category_Mn, category_Me, category_Mc) end - private def self.search_ranges(haystack, needle) - value = haystack.bsearch { |low, high, delta| needle <= high } - if value && value[0] <= needle <= value[1] - value[2] + # :nodoc: + def self.canonical_decompose(all_codepoints : Array(Int32), char : Char) + canonical_decompose(all_codepoints, char.ord) + end + + private def self.canonical_decompose(all_codepoints : Array(Int32), codepoint : Int32) + if Hangul.canonical_decompose(all_codepoints, codepoint) + # do nothing + elsif mapping = canonical_decompositions[codepoint]? + first, second = mapping + canonical_decompose(all_codepoints, first) + canonical_decompose(all_codepoints, second) unless second.zero? else - nil + all_codepoints << codepoint end end - private def self.search_alternate(haystack, needle) - value = haystack.bsearch { |low, high| needle <= high } - if value && value[0] <= needle <= value[1] - value[0] + # :nodoc: + def self.compatibility_decompose(all_codepoints : Array(Int32), char : Char) + compatibility_decompose(all_codepoints, char.ord) + end + + private def self.compatibility_decompose(all_codepoints : Array(Int32), codepoint : Int32) + if Hangul.canonical_decompose(all_codepoints, codepoint) + # do nothing + elsif mapping = canonical_decompositions[codepoint]? + first, second = mapping + compatibility_decompose(all_codepoints, first) + compatibility_decompose(all_codepoints, second) unless second.zero? + elsif mapping = compatibility_decompositions[codepoint]? + index, count = mapping + count.times do |i| + part = compatibility_decomposition_data.unsafe_fetch(index + i) + compatibility_decompose(all_codepoints, part) + end else - nil + all_codepoints << codepoint end end - private def self.in_category?(needle, haystack) - value = haystack.bsearch { |low, high, stride| needle <= high } + # :nodoc: + def self.canonical_order!(codepoints : Array(Int32)) + canonical_order!(Slice.new(codepoints.to_unsafe, codepoints.size)) + end + + private def self.canonical_order!(codepoints : Slice(Int32)) + i = 0 + + # if `i == codepoints.size - 1` there cannot be a subsequence of 2 + # orderable codepoints, so we skip the last codepoint + while i < codepoints.size - 1 + i_ord = codepoints.unsafe_fetch(i) + i_ccc = canonical_combining_class(i_ord) + if i_ccc == 0 + i += 1 + next + end + + j = i + 1 + j_ord = codepoints.unsafe_fetch(j) + j_ccc = canonical_combining_class(j_ord) + if j_ccc == 0 + i += 2 + next + end + + # subsequence of at least 2 codepoints with non-zero ccc; sort by their + # ccc in ascending order (we hand-roll our own `sort_by!` so avoid + # recomputing `i_ccc` and `j_ccc`) + cccs = [{i_ord, i_ccc}, {j_ord, j_ccc}] + j += 1 + while j < codepoints.size + j_ord = codepoints.unsafe_fetch(j) + j_ccc = canonical_combining_class(j_ord) + break if j_ccc == 0 + cccs << {j_ord, j_ccc} + j += 1 + end + + cccs.sort! { |x, y| x[1] <=> y[1] } + cccs.each_with_index do |(ord, _), k| + codepoints.unsafe_put(i + k, ord) + end + + i = j + 1 # we can skip one codepoint as its ccc must be 0 + end + end + + # :nodoc: + def self.canonical_compose!(codepoints : Array(Int32), & : Char ->) + canonical_compose!(Slice.new(codepoints.to_unsafe, codepoints.size)) { |x| yield x.unsafe_chr } + end + + private def self.canonical_compose!(codepoints : Slice(Int32), & : Int32 ->) + l_pos = 0 + l = codepoints.unsafe_fetch(l_pos) + l_ccc = 0_u8 + + (1...codepoints.size).each do |c_pos| + c = codepoints.unsafe_fetch(c_pos) + c_ccc = canonical_combining_class(c) + + if (c_ccc > l_ccc || l_ccc == 0) && (combined = canonical_composition(l, c)) + l = combined + l_ccc = canonical_combining_class(l) + codepoints.unsafe_put(c_pos, -1) + elsif c_ccc == 0 + yield l + while true + l_pos += 1 + break if l_pos == c_pos + l = codepoints.unsafe_fetch(l_pos) + yield l unless l == -1 + end + l = c + l_ccc = 0_u8 + else + l_ccc = c_ccc + end + end + + yield l + while true + l_pos += 1 + break if l_pos == codepoints.size + l = codepoints.unsafe_fetch(l_pos) + yield l unless l == -1 + end + end + + # :nodoc: + def self.quick_check_normalized(str : String, form : NormalizationForm) : QuickCheckResult + result = QuickCheckResult::Yes + return result if str.ascii_only? + last_ccc = 0_u8 + + str.each_codepoint do |codepoint| + ccc = canonical_combining_class(codepoint) + return QuickCheckResult::No if last_ccc > ccc && ccc != 0 + + allowed = case form + in .nfc? + search_ranges(nfc_quick_check, codepoint) { |x| x[2] } + in .nfd? + search_ranges(nfd_quick_check, codepoint) { QuickCheckResult::No } + in .nfkc? + search_ranges(nfkc_quick_check, codepoint) { |x| x[2] } + in .nfkd? + search_ranges(nfkd_quick_check, codepoint) { QuickCheckResult::No } + end + + if allowed + return QuickCheckResult::No if allowed.no? + result = QuickCheckResult::Maybe if allowed.maybe? + end + + last_ccc = ccc + end + + result + end + + private def self.canonical_combining_class(codepoint : Int32) : UInt8 + search_ranges(canonical_combining_classes, codepoint) || 0_u8 + end + + private def self.canonical_composition(first : Int32, second : Int32) + Hangul.canonical_composition(first, second) || canonical_compositions[(first.to_i64 << 21) | second]? + end + + # For the meanings of these constants refer to the Unicode Standard, Chapter + # 3.12 "Conjoining Jamo Behavior", in particular the subsection "Sample Code + # for Hangul Algorithms" + private module Hangul + S_BASE = 0xAC00 + L_BASE = 0x1100 + V_BASE = 0x1161 + T_BASE = 0x11A7 + L_COUNT = 19 + V_COUNT = 21 + T_COUNT = 28 + N_COUNT = V_COUNT * T_COUNT # 588 + S_COUNT = L_COUNT * N_COUNT # 11172 + + def self.canonical_decompose(all_codepoints : Array(Int32), codepoint : Int32) + return false unless Hangul::S_BASE <= codepoint < Hangul::S_BASE + Hangul::S_COUNT + s_index = codepoint - S_BASE + + l = L_BASE + s_index // N_COUNT + v = V_BASE + (s_index % N_COUNT) // T_COUNT + t = T_BASE + s_index % T_COUNT + + all_codepoints << l + all_codepoints << v + all_codepoints << t unless t == T_BASE + + true + end + + def self.canonical_composition(first : Int32, second : Int32) + # composition + if (L_BASE <= first < L_BASE + L_COUNT) && (V_BASE <= second < V_BASE + V_COUNT) + l_index = first - L_BASE + v_index = second - V_BASE + lv_index = l_index * N_COUNT + v_index * T_COUNT + return S_BASE + lv_index + end + + # composition (note that t_index cannot be zero) + s_index = first - S_BASE + if (0 <= s_index < S_COUNT) && s_index % T_COUNT == 0 && (T_BASE < second < T_BASE + T_COUNT) + t_index = second - T_BASE + return first + t_index + end + end + end + + private def self.search_ranges(haystack, needle) + value = haystack.bsearch { |v| needle <= v[1] } if value && value[0] <= needle <= value[1] - (needle - value[0]).divisible_by?(value[2]) + yield value else - false + nil end end + private def self.search_ranges(haystack, needle) + search_ranges(haystack, needle) { |value| value[2] } + end + + private def self.search_alternate(haystack, needle) + search_ranges(haystack, needle) { |value| value[0] } + end + + private def self.in_category?(needle, haystack) + !!search_ranges(haystack, needle) { |value| (needle - value[0]).divisible_by?(value[2]) } + end + private def self.in_any_category?(needle, *haystacks) : Bool haystacks.any? { |haystack| in_category?(needle, haystack) } end