From bd40dcfc2bc7c9014ea1f33482fb63aacbcdfe87 Mon Sep 17 00:00:00 2001 From: Valentin Rothberg Date: Tue, 8 Jan 2019 14:52:57 +0100 Subject: vendor: update everything * If possible, update each dependency to the latest available version. * Use releases over commit IDs and avoid vendoring branches. Signed-off-by: Valentin Rothberg --- vendor/golang.org/x/text/language/common.go | 16 - vendor/golang.org/x/text/language/coverage.go | 34 +- vendor/golang.org/x/text/language/doc.go | 102 + vendor/golang.org/x/text/language/index.go | 767 ----- vendor/golang.org/x/text/language/language.go | 802 ++---- vendor/golang.org/x/text/language/lookup.go | 396 --- vendor/golang.org/x/text/language/match.go | 724 ++--- vendor/golang.org/x/text/language/parse.go | 737 +---- vendor/golang.org/x/text/language/tables.go | 3771 ++----------------------- vendor/golang.org/x/text/language/tags.go | 160 +- 10 files changed, 1032 insertions(+), 6477 deletions(-) delete mode 100644 vendor/golang.org/x/text/language/common.go create mode 100644 vendor/golang.org/x/text/language/doc.go delete mode 100644 vendor/golang.org/x/text/language/index.go delete mode 100644 vendor/golang.org/x/text/language/lookup.go (limited to 'vendor/golang.org/x/text/language') diff --git a/vendor/golang.org/x/text/language/common.go b/vendor/golang.org/x/text/language/common.go deleted file mode 100644 index a255bb0a5..000000000 --- a/vendor/golang.org/x/text/language/common.go +++ /dev/null @@ -1,16 +0,0 @@ -// This file was generated by go generate; DO NOT EDIT - -package language - -// This file contains code common to the maketables.go and the package code. - -// langAliasType is the type of an alias in langAliasMap. -type langAliasType int8 - -const ( - langDeprecated langAliasType = iota - langMacro - langLegacy - - langAliasTypeUnknown langAliasType = -1 -) diff --git a/vendor/golang.org/x/text/language/coverage.go b/vendor/golang.org/x/text/language/coverage.go index 101fd23c1..a24fd1a4d 100644 --- a/vendor/golang.org/x/text/language/coverage.go +++ b/vendor/golang.org/x/text/language/coverage.go @@ -7,6 +7,8 @@ package language import ( "fmt" "sort" + + "golang.org/x/text/internal/language" ) // The Coverage interface is used to define the level of coverage of an @@ -44,9 +46,9 @@ type allSubtags struct{} // consecutive range, it simply returns a slice of numbers in increasing order. // The "undefined" region is not returned. func (s allSubtags) Regions() []Region { - reg := make([]Region, numRegions) + reg := make([]Region, language.NumRegions) for i := range reg { - reg[i] = Region{regionID(i + 1)} + reg[i] = Region{language.Region(i + 1)} } return reg } @@ -55,9 +57,9 @@ func (s allSubtags) Regions() []Region { // consecutive range, it simply returns a slice of numbers in increasing order. // The "undefined" script is not returned. func (s allSubtags) Scripts() []Script { - scr := make([]Script, numScripts) + scr := make([]Script, language.NumScripts) for i := range scr { - scr[i] = Script{scriptID(i + 1)} + scr[i] = Script{language.Script(i + 1)} } return scr } @@ -65,22 +67,10 @@ func (s allSubtags) Scripts() []Script { // BaseLanguages returns the list of all supported base languages. It generates // the list by traversing the internal structures. func (s allSubtags) BaseLanguages() []Base { - base := make([]Base, 0, numLanguages) - for i := 0; i < langNoIndexOffset; i++ { - // We included "und" already for the value 0. - if i != nonCanonicalUnd { - base = append(base, Base{langID(i)}) - } - } - i := langNoIndexOffset - for _, v := range langNoIndex { - for k := 0; k < 8; k++ { - if v&1 == 1 { - base = append(base, Base{langID(i)}) - } - v >>= 1 - i++ - } + bs := language.BaseLanguages() + base := make([]Base, len(bs)) + for i, b := range bs { + base[i] = Base{b} } return base } @@ -90,7 +80,7 @@ func (s allSubtags) Tags() []Tag { return nil } -// coverage is used used by NewCoverage which is used as a convenient way for +// coverage is used by NewCoverage which is used as a convenient way for // creating Coverage implementations for partially defined data. Very often a // package will only need to define a subset of slices. coverage provides a // convenient way to do this. Moreover, packages using NewCoverage, instead of @@ -134,7 +124,7 @@ func (s *coverage) BaseLanguages() []Base { } a := make([]Base, len(tags)) for i, t := range tags { - a[i] = Base{langID(t.lang)} + a[i] = Base{language.Language(t.lang())} } sort.Sort(bases(a)) k := 0 diff --git a/vendor/golang.org/x/text/language/doc.go b/vendor/golang.org/x/text/language/doc.go new file mode 100644 index 000000000..8afecd50e --- /dev/null +++ b/vendor/golang.org/x/text/language/doc.go @@ -0,0 +1,102 @@ +// Copyright 2017 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// Package language implements BCP 47 language tags and related functionality. +// +// The most important function of package language is to match a list of +// user-preferred languages to a list of supported languages. +// It alleviates the developer of dealing with the complexity of this process +// and provides the user with the best experience +// (see https://blog.golang.org/matchlang). +// +// +// Matching preferred against supported languages +// +// A Matcher for an application that supports English, Australian English, +// Danish, and standard Mandarin can be created as follows: +// +// var matcher = language.NewMatcher([]language.Tag{ +// language.English, // The first language is used as fallback. +// language.MustParse("en-AU"), +// language.Danish, +// language.Chinese, +// }) +// +// This list of supported languages is typically implied by the languages for +// which there exists translations of the user interface. +// +// User-preferred languages usually come as a comma-separated list of BCP 47 +// language tags. +// The MatchString finds best matches for such strings: +// +// handler(w http.ResponseWriter, r *http.Request) { +// lang, _ := r.Cookie("lang") +// accept := r.Header.Get("Accept-Language") +// tag, _ := language.MatchStrings(matcher, lang.String(), accept) +// +// // tag should now be used for the initialization of any +// // locale-specific service. +// } +// +// The Matcher's Match method can be used to match Tags directly. +// +// Matchers are aware of the intricacies of equivalence between languages, such +// as deprecated subtags, legacy tags, macro languages, mutual +// intelligibility between scripts and languages, and transparently passing +// BCP 47 user configuration. +// For instance, it will know that a reader of Bokmål Danish can read Norwegian +// and will know that Cantonese ("yue") is a good match for "zh-HK". +// +// +// Using match results +// +// To guarantee a consistent user experience to the user it is important to +// use the same language tag for the selection of any locale-specific services. +// For example, it is utterly confusing to substitute spelled-out numbers +// or dates in one language in text of another language. +// More subtly confusing is using the wrong sorting order or casing +// algorithm for a certain language. +// +// All the packages in x/text that provide locale-specific services +// (e.g. collate, cases) should be initialized with the tag that was +// obtained at the start of an interaction with the user. +// +// Note that Tag that is returned by Match and MatchString may differ from any +// of the supported languages, as it may contain carried over settings from +// the user tags. +// This may be inconvenient when your application has some additional +// locale-specific data for your supported languages. +// Match and MatchString both return the index of the matched supported tag +// to simplify associating such data with the matched tag. +// +// +// Canonicalization +// +// If one uses the Matcher to compare languages one does not need to +// worry about canonicalization. +// +// The meaning of a Tag varies per application. The language package +// therefore delays canonicalization and preserves information as much +// as possible. The Matcher, however, will always take into account that +// two different tags may represent the same language. +// +// By default, only legacy and deprecated tags are converted into their +// canonical equivalent. All other information is preserved. This approach makes +// the confidence scores more accurate and allows matchers to distinguish +// between variants that are otherwise lost. +// +// As a consequence, two tags that should be treated as identical according to +// BCP 47 or CLDR, like "en-Latn" and "en", will be represented differently. The +// Matcher handles such distinctions, though, and is aware of the +// equivalence relations. The CanonType type can be used to alter the +// canonicalization form. +// +// References +// +// BCP 47 - Tags for Identifying Languages http://tools.ietf.org/html/bcp47 +// +package language // import "golang.org/x/text/language" + +// TODO: explanation on how to match languages for your own locale-specific +// service. diff --git a/vendor/golang.org/x/text/language/index.go b/vendor/golang.org/x/text/language/index.go deleted file mode 100644 index 50c752186..000000000 --- a/vendor/golang.org/x/text/language/index.go +++ /dev/null @@ -1,767 +0,0 @@ -// This file was generated by go generate; DO NOT EDIT - -package language - -// NumCompactTags is the number of common tags. The maximum tag is -// NumCompactTags-1. -const NumCompactTags = 752 - -var specialTags = []Tag{ // 2 elements - 0: {lang: 0xd5, region: 0x6d, script: 0x0, pVariant: 0x5, pExt: 0xe, str: "ca-ES-valencia"}, - 1: {lang: 0x134, region: 0x134, script: 0x0, pVariant: 0x5, pExt: 0x5, str: "en-US-u-va-posix"}, -} // Size: 72 bytes - -var coreTags = map[uint32]uint16{ - 0x0: 0, // und - 0x01500000: 3, // af - 0x015000d1: 4, // af-NA - 0x01500160: 5, // af-ZA - 0x01b00000: 6, // agq - 0x01b00051: 7, // agq-CM - 0x02000000: 8, // ak - 0x0200007f: 9, // ak-GH - 0x02600000: 10, // am - 0x0260006e: 11, // am-ET - 0x03900000: 12, // ar - 0x03900001: 13, // ar-001 - 0x03900022: 14, // ar-AE - 0x03900038: 15, // ar-BH - 0x03900061: 16, // ar-DJ - 0x03900066: 17, // ar-DZ - 0x0390006a: 18, // ar-EG - 0x0390006b: 19, // ar-EH - 0x0390006c: 20, // ar-ER - 0x03900096: 21, // ar-IL - 0x0390009a: 22, // ar-IQ - 0x039000a0: 23, // ar-JO - 0x039000a7: 24, // ar-KM - 0x039000ab: 25, // ar-KW - 0x039000af: 26, // ar-LB - 0x039000b8: 27, // ar-LY - 0x039000b9: 28, // ar-MA - 0x039000c8: 29, // ar-MR - 0x039000e0: 30, // ar-OM - 0x039000ec: 31, // ar-PS - 0x039000f2: 32, // ar-QA - 0x03900107: 33, // ar-SA - 0x0390010a: 34, // ar-SD - 0x03900114: 35, // ar-SO - 0x03900116: 36, // ar-SS - 0x0390011b: 37, // ar-SY - 0x0390011f: 38, // ar-TD - 0x03900127: 39, // ar-TN - 0x0390015d: 40, // ar-YE - 0x03f00000: 41, // ars - 0x04200000: 42, // as - 0x04200098: 43, // as-IN - 0x04300000: 44, // asa - 0x0430012e: 45, // asa-TZ - 0x04700000: 46, // ast - 0x0470006d: 47, // ast-ES - 0x05700000: 48, // az - 0x0571e000: 49, // az-Cyrl - 0x0571e031: 50, // az-Cyrl-AZ - 0x05752000: 51, // az-Latn - 0x05752031: 52, // az-Latn-AZ - 0x05d00000: 53, // bas - 0x05d00051: 54, // bas-CM - 0x07000000: 55, // be - 0x07000046: 56, // be-BY - 0x07400000: 57, // bem - 0x07400161: 58, // bem-ZM - 0x07800000: 59, // bez - 0x0780012e: 60, // bez-TZ - 0x07d00000: 61, // bg - 0x07d00037: 62, // bg-BG - 0x08100000: 63, // bh - 0x09e00000: 64, // bm - 0x09e000c2: 65, // bm-ML - 0x0a300000: 66, // bn - 0x0a300034: 67, // bn-BD - 0x0a300098: 68, // bn-IN - 0x0a700000: 69, // bo - 0x0a700052: 70, // bo-CN - 0x0a700098: 71, // bo-IN - 0x0b000000: 72, // br - 0x0b000077: 73, // br-FR - 0x0b300000: 74, // brx - 0x0b300098: 75, // brx-IN - 0x0b500000: 76, // bs - 0x0b51e000: 77, // bs-Cyrl - 0x0b51e032: 78, // bs-Cyrl-BA - 0x0b552000: 79, // bs-Latn - 0x0b552032: 80, // bs-Latn-BA - 0x0d500000: 81, // ca - 0x0d500021: 82, // ca-AD - 0x0d50006d: 83, // ca-ES - 0x0d500077: 84, // ca-FR - 0x0d50009d: 85, // ca-IT - 0x0da00000: 86, // ce - 0x0da00105: 87, // ce-RU - 0x0dd00000: 88, // cgg - 0x0dd00130: 89, // cgg-UG - 0x0e300000: 90, // chr - 0x0e300134: 91, // chr-US - 0x0e700000: 92, // ckb - 0x0e70009a: 93, // ckb-IQ - 0x0e70009b: 94, // ckb-IR - 0x0f600000: 95, // cs - 0x0f60005d: 96, // cs-CZ - 0x0fa00000: 97, // cu - 0x0fa00105: 98, // cu-RU - 0x0fc00000: 99, // cy - 0x0fc0007a: 100, // cy-GB - 0x0fd00000: 101, // da - 0x0fd00062: 102, // da-DK - 0x0fd00081: 103, // da-GL - 0x10400000: 104, // dav - 0x104000a3: 105, // dav-KE - 0x10900000: 106, // de - 0x1090002d: 107, // de-AT - 0x10900035: 108, // de-BE - 0x1090004d: 109, // de-CH - 0x1090005f: 110, // de-DE - 0x1090009d: 111, // de-IT - 0x109000b1: 112, // de-LI - 0x109000b6: 113, // de-LU - 0x11300000: 114, // dje - 0x113000d3: 115, // dje-NE - 0x11b00000: 116, // dsb - 0x11b0005f: 117, // dsb-DE - 0x12000000: 118, // dua - 0x12000051: 119, // dua-CM - 0x12400000: 120, // dv - 0x12700000: 121, // dyo - 0x12700113: 122, // dyo-SN - 0x12900000: 123, // dz - 0x12900042: 124, // dz-BT - 0x12b00000: 125, // ebu - 0x12b000a3: 126, // ebu-KE - 0x12c00000: 127, // ee - 0x12c0007f: 128, // ee-GH - 0x12c00121: 129, // ee-TG - 0x13100000: 130, // el - 0x1310005c: 131, // el-CY - 0x13100086: 132, // el-GR - 0x13400000: 133, // en - 0x13400001: 134, // en-001 - 0x1340001a: 135, // en-150 - 0x13400024: 136, // en-AG - 0x13400025: 137, // en-AI - 0x1340002c: 138, // en-AS - 0x1340002d: 139, // en-AT - 0x1340002e: 140, // en-AU - 0x13400033: 141, // en-BB - 0x13400035: 142, // en-BE - 0x13400039: 143, // en-BI - 0x1340003c: 144, // en-BM - 0x13400041: 145, // en-BS - 0x13400045: 146, // en-BW - 0x13400047: 147, // en-BZ - 0x13400048: 148, // en-CA - 0x13400049: 149, // en-CC - 0x1340004d: 150, // en-CH - 0x1340004f: 151, // en-CK - 0x13400051: 152, // en-CM - 0x1340005b: 153, // en-CX - 0x1340005c: 154, // en-CY - 0x1340005f: 155, // en-DE - 0x13400060: 156, // en-DG - 0x13400062: 157, // en-DK - 0x13400063: 158, // en-DM - 0x1340006c: 159, // en-ER - 0x13400071: 160, // en-FI - 0x13400072: 161, // en-FJ - 0x13400073: 162, // en-FK - 0x13400074: 163, // en-FM - 0x1340007a: 164, // en-GB - 0x1340007b: 165, // en-GD - 0x1340007e: 166, // en-GG - 0x1340007f: 167, // en-GH - 0x13400080: 168, // en-GI - 0x13400082: 169, // en-GM - 0x13400089: 170, // en-GU - 0x1340008b: 171, // en-GY - 0x1340008c: 172, // en-HK - 0x13400095: 173, // en-IE - 0x13400096: 174, // en-IL - 0x13400097: 175, // en-IM - 0x13400098: 176, // en-IN - 0x13400099: 177, // en-IO - 0x1340009e: 178, // en-JE - 0x1340009f: 179, // en-JM - 0x134000a3: 180, // en-KE - 0x134000a6: 181, // en-KI - 0x134000a8: 182, // en-KN - 0x134000ac: 183, // en-KY - 0x134000b0: 184, // en-LC - 0x134000b3: 185, // en-LR - 0x134000b4: 186, // en-LS - 0x134000be: 187, // en-MG - 0x134000bf: 188, // en-MH - 0x134000c5: 189, // en-MO - 0x134000c6: 190, // en-MP - 0x134000c9: 191, // en-MS - 0x134000ca: 192, // en-MT - 0x134000cb: 193, // en-MU - 0x134000cd: 194, // en-MW - 0x134000cf: 195, // en-MY - 0x134000d1: 196, // en-NA - 0x134000d4: 197, // en-NF - 0x134000d5: 198, // en-NG - 0x134000d8: 199, // en-NL - 0x134000dc: 200, // en-NR - 0x134000de: 201, // en-NU - 0x134000df: 202, // en-NZ - 0x134000e5: 203, // en-PG - 0x134000e6: 204, // en-PH - 0x134000e7: 205, // en-PK - 0x134000ea: 206, // en-PN - 0x134000eb: 207, // en-PR - 0x134000ef: 208, // en-PW - 0x13400106: 209, // en-RW - 0x13400108: 210, // en-SB - 0x13400109: 211, // en-SC - 0x1340010a: 212, // en-SD - 0x1340010b: 213, // en-SE - 0x1340010c: 214, // en-SG - 0x1340010d: 215, // en-SH - 0x1340010e: 216, // en-SI - 0x13400111: 217, // en-SL - 0x13400116: 218, // en-SS - 0x1340011a: 219, // en-SX - 0x1340011c: 220, // en-SZ - 0x1340011e: 221, // en-TC - 0x13400124: 222, // en-TK - 0x13400128: 223, // en-TO - 0x1340012b: 224, // en-TT - 0x1340012c: 225, // en-TV - 0x1340012e: 226, // en-TZ - 0x13400130: 227, // en-UG - 0x13400132: 228, // en-UM - 0x13400134: 229, // en-US - 0x13400138: 230, // en-VC - 0x1340013b: 231, // en-VG - 0x1340013c: 232, // en-VI - 0x1340013e: 233, // en-VU - 0x13400141: 234, // en-WS - 0x13400160: 235, // en-ZA - 0x13400161: 236, // en-ZM - 0x13400163: 237, // en-ZW - 0x13700000: 238, // eo - 0x13700001: 239, // eo-001 - 0x13900000: 240, // es - 0x1390001e: 241, // es-419 - 0x1390002b: 242, // es-AR - 0x1390003e: 243, // es-BO - 0x13900040: 244, // es-BR - 0x13900050: 245, // es-CL - 0x13900053: 246, // es-CO - 0x13900055: 247, // es-CR - 0x13900058: 248, // es-CU - 0x13900064: 249, // es-DO - 0x13900067: 250, // es-EA - 0x13900068: 251, // es-EC - 0x1390006d: 252, // es-ES - 0x13900085: 253, // es-GQ - 0x13900088: 254, // es-GT - 0x1390008e: 255, // es-HN - 0x13900093: 256, // es-IC - 0x139000ce: 257, // es-MX - 0x139000d7: 258, // es-NI - 0x139000e1: 259, // es-PA - 0x139000e3: 260, // es-PE - 0x139000e6: 261, // es-PH - 0x139000eb: 262, // es-PR - 0x139000f0: 263, // es-PY - 0x13900119: 264, // es-SV - 0x13900134: 265, // es-US - 0x13900135: 266, // es-UY - 0x1390013a: 267, // es-VE - 0x13b00000: 268, // et - 0x13b00069: 269, // et-EE - 0x14000000: 270, // eu - 0x1400006d: 271, // eu-ES - 0x14100000: 272, // ewo - 0x14100051: 273, // ewo-CM - 0x14300000: 274, // fa - 0x14300023: 275, // fa-AF - 0x1430009b: 276, // fa-IR - 0x14900000: 277, // ff - 0x14900051: 278, // ff-CM - 0x14900083: 279, // ff-GN - 0x149000c8: 280, // ff-MR - 0x14900113: 281, // ff-SN - 0x14c00000: 282, // fi - 0x14c00071: 283, // fi-FI - 0x14e00000: 284, // fil - 0x14e000e6: 285, // fil-PH - 0x15300000: 286, // fo - 0x15300062: 287, // fo-DK - 0x15300075: 288, // fo-FO - 0x15900000: 289, // fr - 0x15900035: 290, // fr-BE - 0x15900036: 291, // fr-BF - 0x15900039: 292, // fr-BI - 0x1590003a: 293, // fr-BJ - 0x1590003b: 294, // fr-BL - 0x15900048: 295, // fr-CA - 0x1590004a: 296, // fr-CD - 0x1590004b: 297, // fr-CF - 0x1590004c: 298, // fr-CG - 0x1590004d: 299, // fr-CH - 0x1590004e: 300, // fr-CI - 0x15900051: 301, // fr-CM - 0x15900061: 302, // fr-DJ - 0x15900066: 303, // fr-DZ - 0x15900077: 304, // fr-FR - 0x15900079: 305, // fr-GA - 0x1590007d: 306, // fr-GF - 0x15900083: 307, // fr-GN - 0x15900084: 308, // fr-GP - 0x15900085: 309, // fr-GQ - 0x15900090: 310, // fr-HT - 0x159000a7: 311, // fr-KM - 0x159000b6: 312, // fr-LU - 0x159000b9: 313, // fr-MA - 0x159000ba: 314, // fr-MC - 0x159000bd: 315, // fr-MF - 0x159000be: 316, // fr-MG - 0x159000c2: 317, // fr-ML - 0x159000c7: 318, // fr-MQ - 0x159000c8: 319, // fr-MR - 0x159000cb: 320, // fr-MU - 0x159000d2: 321, // fr-NC - 0x159000d3: 322, // fr-NE - 0x159000e4: 323, // fr-PF - 0x159000e9: 324, // fr-PM - 0x15900101: 325, // fr-RE - 0x15900106: 326, // fr-RW - 0x15900109: 327, // fr-SC - 0x15900113: 328, // fr-SN - 0x1590011b: 329, // fr-SY - 0x1590011f: 330, // fr-TD - 0x15900121: 331, // fr-TG - 0x15900127: 332, // fr-TN - 0x1590013e: 333, // fr-VU - 0x1590013f: 334, // fr-WF - 0x1590015e: 335, // fr-YT - 0x16400000: 336, // fur - 0x1640009d: 337, // fur-IT - 0x16800000: 338, // fy - 0x168000d8: 339, // fy-NL - 0x16900000: 340, // ga - 0x16900095: 341, // ga-IE - 0x17800000: 342, // gd - 0x1780007a: 343, // gd-GB - 0x18a00000: 344, // gl - 0x18a0006d: 345, // gl-ES - 0x19c00000: 346, // gsw - 0x19c0004d: 347, // gsw-CH - 0x19c00077: 348, // gsw-FR - 0x19c000b1: 349, // gsw-LI - 0x19d00000: 350, // gu - 0x19d00098: 351, // gu-IN - 0x1a200000: 352, // guw - 0x1a400000: 353, // guz - 0x1a4000a3: 354, // guz-KE - 0x1a500000: 355, // gv - 0x1a500097: 356, // gv-IM - 0x1ad00000: 357, // ha - 0x1ad0007f: 358, // ha-GH - 0x1ad000d3: 359, // ha-NE - 0x1ad000d5: 360, // ha-NG - 0x1b100000: 361, // haw - 0x1b100134: 362, // haw-US - 0x1b500000: 363, // he - 0x1b500096: 364, // he-IL - 0x1b700000: 365, // hi - 0x1b700098: 366, // hi-IN - 0x1ca00000: 367, // hr - 0x1ca00032: 368, // hr-BA - 0x1ca0008f: 369, // hr-HR - 0x1cb00000: 370, // hsb - 0x1cb0005f: 371, // hsb-DE - 0x1ce00000: 372, // hu - 0x1ce00091: 373, // hu-HU - 0x1d000000: 374, // hy - 0x1d000027: 375, // hy-AM - 0x1da00000: 376, // id - 0x1da00094: 377, // id-ID - 0x1df00000: 378, // ig - 0x1df000d5: 379, // ig-NG - 0x1e200000: 380, // ii - 0x1e200052: 381, // ii-CN - 0x1f000000: 382, // is - 0x1f00009c: 383, // is-IS - 0x1f100000: 384, // it - 0x1f10004d: 385, // it-CH - 0x1f10009d: 386, // it-IT - 0x1f100112: 387, // it-SM - 0x1f200000: 388, // iu - 0x1f800000: 389, // ja - 0x1f8000a1: 390, // ja-JP - 0x1fb00000: 391, // jbo - 0x1ff00000: 392, // jgo - 0x1ff00051: 393, // jgo-CM - 0x20200000: 394, // jmc - 0x2020012e: 395, // jmc-TZ - 0x20600000: 396, // jv - 0x20800000: 397, // ka - 0x2080007c: 398, // ka-GE - 0x20a00000: 399, // kab - 0x20a00066: 400, // kab-DZ - 0x20e00000: 401, // kaj - 0x20f00000: 402, // kam - 0x20f000a3: 403, // kam-KE - 0x21700000: 404, // kcg - 0x21b00000: 405, // kde - 0x21b0012e: 406, // kde-TZ - 0x21f00000: 407, // kea - 0x21f00059: 408, // kea-CV - 0x22c00000: 409, // khq - 0x22c000c2: 410, // khq-ML - 0x23100000: 411, // ki - 0x231000a3: 412, // ki-KE - 0x23a00000: 413, // kk - 0x23a000ad: 414, // kk-KZ - 0x23c00000: 415, // kkj - 0x23c00051: 416, // kkj-CM - 0x23d00000: 417, // kl - 0x23d00081: 418, // kl-GL - 0x23e00000: 419, // kln - 0x23e000a3: 420, // kln-KE - 0x24200000: 421, // km - 0x242000a5: 422, // km-KH - 0x24900000: 423, // kn - 0x24900098: 424, // kn-IN - 0x24b00000: 425, // ko - 0x24b000a9: 426, // ko-KP - 0x24b000aa: 427, // ko-KR - 0x24d00000: 428, // kok - 0x24d00098: 429, // kok-IN - 0x26100000: 430, // ks - 0x26100098: 431, // ks-IN - 0x26200000: 432, // ksb - 0x2620012e: 433, // ksb-TZ - 0x26400000: 434, // ksf - 0x26400051: 435, // ksf-CM - 0x26500000: 436, // ksh - 0x2650005f: 437, // ksh-DE - 0x26b00000: 438, // ku - 0x27800000: 439, // kw - 0x2780007a: 440, // kw-GB - 0x28100000: 441, // ky - 0x281000a4: 442, // ky-KG - 0x28800000: 443, // lag - 0x2880012e: 444, // lag-TZ - 0x28c00000: 445, // lb - 0x28c000b6: 446, // lb-LU - 0x29a00000: 447, // lg - 0x29a00130: 448, // lg-UG - 0x2a600000: 449, // lkt - 0x2a600134: 450, // lkt-US - 0x2ac00000: 451, // ln - 0x2ac00029: 452, // ln-AO - 0x2ac0004a: 453, // ln-CD - 0x2ac0004b: 454, // ln-CF - 0x2ac0004c: 455, // ln-CG - 0x2af00000: 456, // lo - 0x2af000ae: 457, // lo-LA - 0x2b600000: 458, // lrc - 0x2b60009a: 459, // lrc-IQ - 0x2b60009b: 460, // lrc-IR - 0x2b700000: 461, // lt - 0x2b7000b5: 462, // lt-LT - 0x2b900000: 463, // lu - 0x2b90004a: 464, // lu-CD - 0x2bb00000: 465, // luo - 0x2bb000a3: 466, // luo-KE - 0x2bc00000: 467, // luy - 0x2bc000a3: 468, // luy-KE - 0x2be00000: 469, // lv - 0x2be000b7: 470, // lv-LV - 0x2c800000: 471, // mas - 0x2c8000a3: 472, // mas-KE - 0x2c80012e: 473, // mas-TZ - 0x2e000000: 474, // mer - 0x2e0000a3: 475, // mer-KE - 0x2e400000: 476, // mfe - 0x2e4000cb: 477, // mfe-MU - 0x2e800000: 478, // mg - 0x2e8000be: 479, // mg-MG - 0x2e900000: 480, // mgh - 0x2e9000d0: 481, // mgh-MZ - 0x2eb00000: 482, // mgo - 0x2eb00051: 483, // mgo-CM - 0x2f600000: 484, // mk - 0x2f6000c1: 485, // mk-MK - 0x2fb00000: 486, // ml - 0x2fb00098: 487, // ml-IN - 0x30200000: 488, // mn - 0x302000c4: 489, // mn-MN - 0x31200000: 490, // mr - 0x31200098: 491, // mr-IN - 0x31600000: 492, // ms - 0x3160003d: 493, // ms-BN - 0x316000cf: 494, // ms-MY - 0x3160010c: 495, // ms-SG - 0x31700000: 496, // mt - 0x317000ca: 497, // mt-MT - 0x31c00000: 498, // mua - 0x31c00051: 499, // mua-CM - 0x32800000: 500, // my - 0x328000c3: 501, // my-MM - 0x33100000: 502, // mzn - 0x3310009b: 503, // mzn-IR - 0x33800000: 504, // nah - 0x33c00000: 505, // naq - 0x33c000d1: 506, // naq-NA - 0x33e00000: 507, // nb - 0x33e000d9: 508, // nb-NO - 0x33e0010f: 509, // nb-SJ - 0x34500000: 510, // nd - 0x34500163: 511, // nd-ZW - 0x34700000: 512, // nds - 0x3470005f: 513, // nds-DE - 0x347000d8: 514, // nds-NL - 0x34800000: 515, // ne - 0x34800098: 516, // ne-IN - 0x348000da: 517, // ne-NP - 0x35e00000: 518, // nl - 0x35e0002f: 519, // nl-AW - 0x35e00035: 520, // nl-BE - 0x35e0003f: 521, // nl-BQ - 0x35e0005a: 522, // nl-CW - 0x35e000d8: 523, // nl-NL - 0x35e00115: 524, // nl-SR - 0x35e0011a: 525, // nl-SX - 0x35f00000: 526, // nmg - 0x35f00051: 527, // nmg-CM - 0x36100000: 528, // nn - 0x361000d9: 529, // nn-NO - 0x36300000: 530, // nnh - 0x36300051: 531, // nnh-CM - 0x36600000: 532, // no - 0x36c00000: 533, // nqo - 0x36d00000: 534, // nr - 0x37100000: 535, // nso - 0x37700000: 536, // nus - 0x37700116: 537, // nus-SS - 0x37e00000: 538, // ny - 0x38000000: 539, // nyn - 0x38000130: 540, // nyn-UG - 0x38700000: 541, // om - 0x3870006e: 542, // om-ET - 0x387000a3: 543, // om-KE - 0x38c00000: 544, // or - 0x38c00098: 545, // or-IN - 0x38f00000: 546, // os - 0x38f0007c: 547, // os-GE - 0x38f00105: 548, // os-RU - 0x39400000: 549, // pa - 0x39405000: 550, // pa-Arab - 0x394050e7: 551, // pa-Arab-PK - 0x3942f000: 552, // pa-Guru - 0x3942f098: 553, // pa-Guru-IN - 0x39800000: 554, // pap - 0x3aa00000: 555, // pl - 0x3aa000e8: 556, // pl-PL - 0x3b400000: 557, // prg - 0x3b400001: 558, // prg-001 - 0x3b500000: 559, // ps - 0x3b500023: 560, // ps-AF - 0x3b700000: 561, // pt - 0x3b700029: 562, // pt-AO - 0x3b700040: 563, // pt-BR - 0x3b70004d: 564, // pt-CH - 0x3b700059: 565, // pt-CV - 0x3b700085: 566, // pt-GQ - 0x3b70008a: 567, // pt-GW - 0x3b7000b6: 568, // pt-LU - 0x3b7000c5: 569, // pt-MO - 0x3b7000d0: 570, // pt-MZ - 0x3b7000ed: 571, // pt-PT - 0x3b700117: 572, // pt-ST - 0x3b700125: 573, // pt-TL - 0x3bb00000: 574, // qu - 0x3bb0003e: 575, // qu-BO - 0x3bb00068: 576, // qu-EC - 0x3bb000e3: 577, // qu-PE - 0x3cb00000: 578, // rm - 0x3cb0004d: 579, // rm-CH - 0x3d000000: 580, // rn - 0x3d000039: 581, // rn-BI - 0x3d300000: 582, // ro - 0x3d3000bb: 583, // ro-MD - 0x3d300103: 584, // ro-RO - 0x3d500000: 585, // rof - 0x3d50012e: 586, // rof-TZ - 0x3d900000: 587, // ru - 0x3d900046: 588, // ru-BY - 0x3d9000a4: 589, // ru-KG - 0x3d9000ad: 590, // ru-KZ - 0x3d9000bb: 591, // ru-MD - 0x3d900105: 592, // ru-RU - 0x3d90012f: 593, // ru-UA - 0x3dc00000: 594, // rw - 0x3dc00106: 595, // rw-RW - 0x3dd00000: 596, // rwk - 0x3dd0012e: 597, // rwk-TZ - 0x3e200000: 598, // sah - 0x3e200105: 599, // sah-RU - 0x3e300000: 600, // saq - 0x3e3000a3: 601, // saq-KE - 0x3e900000: 602, // sbp - 0x3e90012e: 603, // sbp-TZ - 0x3f200000: 604, // sdh - 0x3f300000: 605, // se - 0x3f300071: 606, // se-FI - 0x3f3000d9: 607, // se-NO - 0x3f30010b: 608, // se-SE - 0x3f500000: 609, // seh - 0x3f5000d0: 610, // seh-MZ - 0x3f700000: 611, // ses - 0x3f7000c2: 612, // ses-ML - 0x3f800000: 613, // sg - 0x3f80004b: 614, // sg-CF - 0x3fe00000: 615, // shi - 0x3fe52000: 616, // shi-Latn - 0x3fe520b9: 617, // shi-Latn-MA - 0x3fed2000: 618, // shi-Tfng - 0x3fed20b9: 619, // shi-Tfng-MA - 0x40200000: 620, // si - 0x402000b2: 621, // si-LK - 0x40800000: 622, // sk - 0x40800110: 623, // sk-SK - 0x40c00000: 624, // sl - 0x40c0010e: 625, // sl-SI - 0x41200000: 626, // sma - 0x41300000: 627, // smi - 0x41400000: 628, // smj - 0x41500000: 629, // smn - 0x41500071: 630, // smn-FI - 0x41800000: 631, // sms - 0x41900000: 632, // sn - 0x41900163: 633, // sn-ZW - 0x41f00000: 634, // so - 0x41f00061: 635, // so-DJ - 0x41f0006e: 636, // so-ET - 0x41f000a3: 637, // so-KE - 0x41f00114: 638, // so-SO - 0x42700000: 639, // sq - 0x42700026: 640, // sq-AL - 0x427000c1: 641, // sq-MK - 0x4270014c: 642, // sq-XK - 0x42800000: 643, // sr - 0x4281e000: 644, // sr-Cyrl - 0x4281e032: 645, // sr-Cyrl-BA - 0x4281e0bc: 646, // sr-Cyrl-ME - 0x4281e104: 647, // sr-Cyrl-RS - 0x4281e14c: 648, // sr-Cyrl-XK - 0x42852000: 649, // sr-Latn - 0x42852032: 650, // sr-Latn-BA - 0x428520bc: 651, // sr-Latn-ME - 0x42852104: 652, // sr-Latn-RS - 0x4285214c: 653, // sr-Latn-XK - 0x42d00000: 654, // ss - 0x43000000: 655, // ssy - 0x43100000: 656, // st - 0x43a00000: 657, // sv - 0x43a00030: 658, // sv-AX - 0x43a00071: 659, // sv-FI - 0x43a0010b: 660, // sv-SE - 0x43b00000: 661, // sw - 0x43b0004a: 662, // sw-CD - 0x43b000a3: 663, // sw-KE - 0x43b0012e: 664, // sw-TZ - 0x43b00130: 665, // sw-UG - 0x44400000: 666, // syr - 0x44600000: 667, // ta - 0x44600098: 668, // ta-IN - 0x446000b2: 669, // ta-LK - 0x446000cf: 670, // ta-MY - 0x4460010c: 671, // ta-SG - 0x45700000: 672, // te - 0x45700098: 673, // te-IN - 0x45a00000: 674, // teo - 0x45a000a3: 675, // teo-KE - 0x45a00130: 676, // teo-UG - 0x46100000: 677, // th - 0x46100122: 678, // th-TH - 0x46500000: 679, // ti - 0x4650006c: 680, // ti-ER - 0x4650006e: 681, // ti-ET - 0x46700000: 682, // tig - 0x46c00000: 683, // tk - 0x46c00126: 684, // tk-TM - 0x47600000: 685, // tn - 0x47800000: 686, // to - 0x47800128: 687, // to-TO - 0x48000000: 688, // tr - 0x4800005c: 689, // tr-CY - 0x4800012a: 690, // tr-TR - 0x48400000: 691, // ts - 0x49a00000: 692, // twq - 0x49a000d3: 693, // twq-NE - 0x49f00000: 694, // tzm - 0x49f000b9: 695, // tzm-MA - 0x4a200000: 696, // ug - 0x4a200052: 697, // ug-CN - 0x4a400000: 698, // uk - 0x4a40012f: 699, // uk-UA - 0x4aa00000: 700, // ur - 0x4aa00098: 701, // ur-IN - 0x4aa000e7: 702, // ur-PK - 0x4b200000: 703, // uz - 0x4b205000: 704, // uz-Arab - 0x4b205023: 705, // uz-Arab-AF - 0x4b21e000: 706, // uz-Cyrl - 0x4b21e136: 707, // uz-Cyrl-UZ - 0x4b252000: 708, // uz-Latn - 0x4b252136: 709, // uz-Latn-UZ - 0x4b400000: 710, // vai - 0x4b452000: 711, // vai-Latn - 0x4b4520b3: 712, // vai-Latn-LR - 0x4b4d9000: 713, // vai-Vaii - 0x4b4d90b3: 714, // vai-Vaii-LR - 0x4b600000: 715, // ve - 0x4b900000: 716, // vi - 0x4b90013d: 717, // vi-VN - 0x4bf00000: 718, // vo - 0x4bf00001: 719, // vo-001 - 0x4c200000: 720, // vun - 0x4c20012e: 721, // vun-TZ - 0x4c400000: 722, // wa - 0x4c500000: 723, // wae - 0x4c50004d: 724, // wae-CH - 0x4db00000: 725, // wo - 0x4e800000: 726, // xh - 0x4f100000: 727, // xog - 0x4f100130: 728, // xog-UG - 0x4ff00000: 729, // yav - 0x4ff00051: 730, // yav-CM - 0x50800000: 731, // yi - 0x50800001: 732, // yi-001 - 0x50e00000: 733, // yo - 0x50e0003a: 734, // yo-BJ - 0x50e000d5: 735, // yo-NG - 0x51500000: 736, // yue - 0x5150008c: 737, // yue-HK - 0x51e00000: 738, // zgh - 0x51e000b9: 739, // zgh-MA - 0x51f00000: 740, // zh - 0x51f34000: 741, // zh-Hans - 0x51f34052: 742, // zh-Hans-CN - 0x51f3408c: 743, // zh-Hans-HK - 0x51f340c5: 744, // zh-Hans-MO - 0x51f3410c: 745, // zh-Hans-SG - 0x51f35000: 746, // zh-Hant - 0x51f3508c: 747, // zh-Hant-HK - 0x51f350c5: 748, // zh-Hant-MO - 0x51f3512d: 749, // zh-Hant-TW - 0x52400000: 750, // zu - 0x52400160: 751, // zu-ZA -} - -// Total table size 4580 bytes (4KiB); checksum: A7F72A2A diff --git a/vendor/golang.org/x/text/language/language.go b/vendor/golang.org/x/text/language/language.go index 5eecceb61..b939c89f1 100644 --- a/vendor/golang.org/x/text/language/language.go +++ b/vendor/golang.org/x/text/language/language.go @@ -2,144 +2,42 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. -//go:generate go run maketables.go gen_common.go -output tables.go -//go:generate go run gen_index.go +//go:generate go run gen.go -output tables.go -// Package language implements BCP 47 language tags and related functionality. -// -// The Tag type, which is used to represent languages, is agnostic to the -// meaning of its subtags. Tags are not fully canonicalized to preserve -// information that may be valuable in certain contexts. As a consequence, two -// different tags may represent identical languages. -// -// Initializing language- or locale-specific components usually consists of -// two steps. The first step is to select a display language based on the -// preferred languages of the user and the languages supported by an application. -// The second step is to create the language-specific services based on -// this selection. Each is discussed in more details below. -// -// Matching preferred against supported languages -// -// An application may support various languages. This list is typically limited -// by the languages for which there exists translations of the user interface. -// Similarly, a user may provide a list of preferred languages which is limited -// by the languages understood by this user. -// An application should use a Matcher to find the best supported language based -// on the user's preferred list. -// Matchers are aware of the intricacies of equivalence between languages. -// The default Matcher implementation takes into account things such as -// deprecated subtags, legacy tags, and mutual intelligibility between scripts -// and languages. -// -// A Matcher for English, Australian English, Danish, and standard Mandarin can -// be defined as follows: -// -// var matcher = language.NewMatcher([]language.Tag{ -// language.English, // The first language is used as fallback. -// language.MustParse("en-AU"), -// language.Danish, -// language.Chinese, -// }) -// -// The following code selects the best match for someone speaking Spanish and -// Norwegian: -// -// preferred := []language.Tag{ language.Spanish, language.Norwegian } -// tag, _, _ := matcher.Match(preferred...) -// -// In this case, the best match is Danish, as Danish is sufficiently a match to -// Norwegian to not have to fall back to the default. -// See ParseAcceptLanguage on how to handle the Accept-Language HTTP header. -// -// Selecting language-specific services -// -// One should always use the Tag returned by the Matcher to create an instance -// of any of the language-specific services provided by the text repository. -// This prevents the mixing of languages, such as having a different language for -// messages and display names, as well as improper casing or sorting order for -// the selected language. -// Using the returned Tag also allows user-defined settings, such as collation -// order or numbering system to be transparently passed as options. -// -// If you have language-specific data in your application, however, it will in -// most cases suffice to use the index returned by the matcher to identify -// the user language. -// The following loop provides an alternative in case this is not sufficient: -// -// supported := map[language.Tag]data{ -// language.English: enData, -// language.MustParse("en-AU"): enAUData, -// language.Danish: daData, -// language.Chinese: zhData, -// } -// tag, _, _ := matcher.Match(preferred...) -// for ; tag != language.Und; tag = tag.Parent() { -// if v, ok := supported[tag]; ok { -// return v -// } -// } -// return enData // should not reach here -// -// Repeatedly taking the Parent of the tag returned by Match will eventually -// match one of the tags used to initialize the Matcher. -// -// Canonicalization -// -// By default, only legacy and deprecated tags are converted into their -// canonical equivalent. All other information is preserved. This approach makes -// the confidence scores more accurate and allows matchers to distinguish -// between variants that are otherwise lost. -// -// As a consequence, two tags that should be treated as identical according to -// BCP 47 or CLDR, like "en-Latn" and "en", will be represented differently. The -// Matchers will handle such distinctions, though, and are aware of the -// equivalence relations. The CanonType type can be used to alter the -// canonicalization form. -// -// References -// -// BCP 47 - Tags for Identifying Languages -// http://tools.ietf.org/html/bcp47 -package language // import "golang.org/x/text/language" +package language // TODO: Remove above NOTE after: // - verifying that tables are dropped correctly (most notably matcher tables). import ( - "errors" - "fmt" "strings" -) -const ( - // maxCoreSize is the maximum size of a BCP 47 tag without variants and - // extensions. Equals max lang (3) + script (4) + max reg (3) + 2 dashes. - maxCoreSize = 12 - - // max99thPercentileSize is a somewhat arbitrary buffer size that presumably - // is large enough to hold at least 99% of the BCP 47 tags. - max99thPercentileSize = 32 - - // maxSimpleUExtensionSize is the maximum size of a -u extension with one - // key-type pair. Equals len("-u-") + key (2) + dash + max value (8). - maxSimpleUExtensionSize = 14 + "golang.org/x/text/internal/language" + "golang.org/x/text/internal/language/compact" ) // Tag represents a BCP 47 language tag. It is used to specify an instance of a // specific language or locale. All language tag values are guaranteed to be // well-formed. -type Tag struct { - lang langID - region regionID - script scriptID - pVariant byte // offset in str, includes preceding '-' - pExt uint16 // offset of first extension, includes preceding '-' +type Tag compact.Tag + +func makeTag(t language.Tag) (tag Tag) { + return Tag(compact.Make(t)) +} - // str is the string representation of the Tag. It will only be used if the - // tag has variants or extensions. - str string +func (t *Tag) tag() language.Tag { + return (*compact.Tag)(t).Tag() } +func (t *Tag) isCompact() bool { + return (*compact.Tag)(t).IsCompact() +} + +// TODO: improve performance. +func (t *Tag) lang() language.Language { return t.tag().LangID } +func (t *Tag) region() language.Region { return t.tag().RegionID } +func (t *Tag) script() language.Script { return t.tag().ScriptID } + // Make is a convenience wrapper for Parse that omits the error. // In case of an error, a sensible default is returned. func Make(s string) Tag { @@ -156,25 +54,13 @@ func (c CanonType) Make(s string) Tag { // Raw returns the raw base language, script and region, without making an // attempt to infer their values. func (t Tag) Raw() (b Base, s Script, r Region) { - return Base{t.lang}, Script{t.script}, Region{t.region} -} - -// equalTags compares language, script and region subtags only. -func (t Tag) equalTags(a Tag) bool { - return t.lang == a.lang && t.script == a.script && t.region == a.region + tt := t.tag() + return Base{tt.LangID}, Script{tt.ScriptID}, Region{tt.RegionID} } // IsRoot returns true if t is equal to language "und". func (t Tag) IsRoot() bool { - if int(t.pVariant) < len(t.str) { - return false - } - return t.equalTags(und) -} - -// private reports whether the Tag consists solely of a private use tag. -func (t Tag) private() bool { - return t.str != "" && t.pVariant == 0 + return compact.Tag(t).IsRoot() } // CanonType can be used to enable or disable various types of canonicalization. @@ -226,73 +112,73 @@ const ( // canonicalize returns the canonicalized equivalent of the tag and // whether there was any change. -func (t Tag) canonicalize(c CanonType) (Tag, bool) { +func canonicalize(c CanonType, t language.Tag) (language.Tag, bool) { if c == Raw { return t, false } changed := false if c&SuppressScript != 0 { - if t.lang < langNoIndexOffset && uint8(t.script) == suppressScript[t.lang] { - t.script = 0 + if t.LangID.SuppressScript() == t.ScriptID { + t.ScriptID = 0 changed = true } } if c&canonLang != 0 { for { - if l, aliasType := normLang(t.lang); l != t.lang { + if l, aliasType := t.LangID.Canonicalize(); l != t.LangID { switch aliasType { - case langLegacy: + case language.Legacy: if c&Legacy != 0 { - if t.lang == _sh && t.script == 0 { - t.script = _Latn + if t.LangID == _sh && t.ScriptID == 0 { + t.ScriptID = _Latn } - t.lang = l + t.LangID = l changed = true } - case langMacro: + case language.Macro: if c&Macro != 0 { // We deviate here from CLDR. The mapping "nb" -> "no" // qualifies as a typical Macro language mapping. However, // for legacy reasons, CLDR maps "no", the macro language // code for Norwegian, to the dominant variant "nb". This // change is currently under consideration for CLDR as well. - // See http://unicode.org/cldr/trac/ticket/2698 and also - // http://unicode.org/cldr/trac/ticket/1790 for some of the + // See https://unicode.org/cldr/trac/ticket/2698 and also + // https://unicode.org/cldr/trac/ticket/1790 for some of the // practical implications. TODO: this check could be removed // if CLDR adopts this change. - if c&CLDR == 0 || t.lang != _nb { + if c&CLDR == 0 || t.LangID != _nb { changed = true - t.lang = l + t.LangID = l } } - case langDeprecated: + case language.Deprecated: if c&DeprecatedBase != 0 { - if t.lang == _mo && t.region == 0 { - t.region = _MD + if t.LangID == _mo && t.RegionID == 0 { + t.RegionID = _MD } - t.lang = l + t.LangID = l changed = true // Other canonicalization types may still apply. continue } } - } else if c&Legacy != 0 && t.lang == _no && c&CLDR != 0 { - t.lang = _nb + } else if c&Legacy != 0 && t.LangID == _no && c&CLDR != 0 { + t.LangID = _nb changed = true } break } } if c&DeprecatedScript != 0 { - if t.script == _Qaai { + if t.ScriptID == _Qaai { changed = true - t.script = _Zinh + t.ScriptID = _Zinh } } if c&DeprecatedRegion != 0 { - if r := normRegion(t.region); r != 0 { + if r := t.RegionID.Canonicalize(); r != t.RegionID { changed = true - t.region = r + t.RegionID = r } } return t, changed @@ -300,11 +186,20 @@ func (t Tag) canonicalize(c CanonType) (Tag, bool) { // Canonicalize returns the canonicalized equivalent of the tag. func (c CanonType) Canonicalize(t Tag) (Tag, error) { - t, changed := t.canonicalize(c) - if changed { - t.remakeString() + // First try fast path. + if t.isCompact() { + if _, changed := canonicalize(c, compact.Tag(t).Tag()); !changed { + return t, nil + } + } + // It is unlikely that one will canonicalize a tag after matching. So do + // a slow but simple approach here. + if tag, changed := canonicalize(c, t.tag()); changed { + tag.RemakeString() + return makeTag(tag), nil } return t, nil + } // Confidence indicates the level of certainty for a given return value. @@ -327,79 +222,38 @@ func (c Confidence) String() string { return confName[c] } -// remakeString is used to update t.str in case lang, script or region changed. -// It is assumed that pExt and pVariant still point to the start of the -// respective parts. -func (t *Tag) remakeString() { - if t.str == "" { - return - } - extra := t.str[t.pVariant:] - if t.pVariant > 0 { - extra = extra[1:] - } - if t.equalTags(und) && strings.HasPrefix(extra, "x-") { - t.str = extra - t.pVariant = 0 - t.pExt = 0 - return - } - var buf [max99thPercentileSize]byte // avoid extra memory allocation in most cases. - b := buf[:t.genCoreBytes(buf[:])] - if extra != "" { - diff := len(b) - int(t.pVariant) - b = append(b, '-') - b = append(b, extra...) - t.pVariant = uint8(int(t.pVariant) + diff) - t.pExt = uint16(int(t.pExt) + diff) - } else { - t.pVariant = uint8(len(b)) - t.pExt = uint16(len(b)) - } - t.str = string(b) +// String returns the canonical string representation of the language tag. +func (t Tag) String() string { + return t.tag().String() } -// genCoreBytes writes a string for the base languages, script and region tags -// to the given buffer and returns the number of bytes written. It will never -// write more than maxCoreSize bytes. -func (t *Tag) genCoreBytes(buf []byte) int { - n := t.lang.stringToBuf(buf[:]) - if t.script != 0 { - n += copy(buf[n:], "-") - n += copy(buf[n:], t.script.String()) - } - if t.region != 0 { - n += copy(buf[n:], "-") - n += copy(buf[n:], t.region.String()) - } - return n +// MarshalText implements encoding.TextMarshaler. +func (t Tag) MarshalText() (text []byte, err error) { + return t.tag().MarshalText() } -// String returns the canonical string representation of the language tag. -func (t Tag) String() string { - if t.str != "" { - return t.str - } - if t.script == 0 && t.region == 0 { - return t.lang.String() - } - buf := [maxCoreSize]byte{} - return string(buf[:t.genCoreBytes(buf[:])]) +// UnmarshalText implements encoding.TextUnmarshaler. +func (t *Tag) UnmarshalText(text []byte) error { + var tag language.Tag + err := tag.UnmarshalText(text) + *t = makeTag(tag) + return err } // Base returns the base language of the language tag. If the base language is // unspecified, an attempt will be made to infer it from the context. // It uses a variant of CLDR's Add Likely Subtags algorithm. This is subject to change. func (t Tag) Base() (Base, Confidence) { - if t.lang != 0 { - return Base{t.lang}, Exact + if b := t.lang(); b != 0 { + return Base{b}, Exact } + tt := t.tag() c := High - if t.script == 0 && !(Region{t.region}).IsCountry() { + if tt.ScriptID == 0 && !tt.RegionID.IsCountry() { c = Low } - if tag, err := addTags(t); err == nil && tag.lang != 0 { - return Base{tag.lang}, c + if tag, err := tt.Maximize(); err == nil && tag.LangID != 0 { + return Base{tag.LangID}, c } return Base{0}, No } @@ -412,35 +266,34 @@ func (t Tag) Base() (Base, Confidence) { // If a script cannot be inferred (Zzzz, No) is returned. We do not use Zyyy (undetermined) // as one would suspect from the IANA registry for BCP 47. In a Unicode context Zyyy marks // common characters (like 1, 2, 3, '.', etc.) and is therefore more like multiple scripts. -// See http://www.unicode.org/reports/tr24/#Values for more details. Zzzz is also used for +// See https://www.unicode.org/reports/tr24/#Values for more details. Zzzz is also used for // unknown value in CLDR. (Zzzz, Exact) is returned if Zzzz was explicitly specified. // Note that an inferred script is never guaranteed to be the correct one. Latin is // almost exclusively used for Afrikaans, but Arabic has been used for some texts // in the past. Also, the script that is commonly used may change over time. // It uses a variant of CLDR's Add Likely Subtags algorithm. This is subject to change. func (t Tag) Script() (Script, Confidence) { - if t.script != 0 { - return Script{t.script}, Exact - } - sc, c := scriptID(_Zzzz), No - if t.lang < langNoIndexOffset { - if scr := scriptID(suppressScript[t.lang]); scr != 0 { - // Note: it is not always the case that a language with a suppress - // script value is only written in one script (e.g. kk, ms, pa). - if t.region == 0 { - return Script{scriptID(scr)}, High - } - sc, c = scr, High + if scr := t.script(); scr != 0 { + return Script{scr}, Exact + } + tt := t.tag() + sc, c := language.Script(_Zzzz), No + if scr := tt.LangID.SuppressScript(); scr != 0 { + // Note: it is not always the case that a language with a suppress + // script value is only written in one script (e.g. kk, ms, pa). + if tt.RegionID == 0 { + return Script{scr}, High } + sc, c = scr, High } - if tag, err := addTags(t); err == nil { - if tag.script != sc { - sc, c = tag.script, Low + if tag, err := tt.Maximize(); err == nil { + if tag.ScriptID != sc { + sc, c = tag.ScriptID, Low } } else { - t, _ = (Deprecated | Macro).Canonicalize(t) - if tag, err := addTags(t); err == nil && tag.script != sc { - sc, c = tag.script, Low + tt, _ = canonicalize(Deprecated|Macro, tt) + if tag, err := tt.Maximize(); err == nil && tag.ScriptID != sc { + sc, c = tag.ScriptID, Low } } return Script{sc}, c @@ -450,28 +303,31 @@ func (t Tag) Script() (Script, Confidence) { // infer a most likely candidate from the context. // It uses a variant of CLDR's Add Likely Subtags algorithm. This is subject to change. func (t Tag) Region() (Region, Confidence) { - if t.region != 0 { - return Region{t.region}, Exact + if r := t.region(); r != 0 { + return Region{r}, Exact } - if t, err := addTags(t); err == nil { - return Region{t.region}, Low // TODO: differentiate between high and low. + tt := t.tag() + if tt, err := tt.Maximize(); err == nil { + return Region{tt.RegionID}, Low // TODO: differentiate between high and low. } - t, _ = (Deprecated | Macro).Canonicalize(t) - if tag, err := addTags(t); err == nil { - return Region{tag.region}, Low + tt, _ = canonicalize(Deprecated|Macro, tt) + if tag, err := tt.Maximize(); err == nil { + return Region{tag.RegionID}, Low } return Region{_ZZ}, No // TODO: return world instead of undetermined? } -// Variant returns the variants specified explicitly for this language tag. +// Variants returns the variants specified explicitly for this language tag. // or nil if no variant was specified. func (t Tag) Variants() []Variant { + if !compact.Tag(t).MayHaveVariants() { + return nil + } v := []Variant{} - if int(t.pVariant) < int(t.pExt) { - for x, str := "", t.str[t.pVariant:t.pExt]; str != ""; { - x, str = nextToken(str) - v = append(v, Variant{x}) - } + x, str := "", t.tag().Variants() + for str != "" { + x, str = nextToken(str) + v = append(v, Variant{x}) } return v } @@ -479,57 +335,13 @@ func (t Tag) Variants() []Variant { // Parent returns the CLDR parent of t. In CLDR, missing fields in data for a // specific language are substituted with fields from the parent language. // The parent for a language may change for newer versions of CLDR. +// +// Parent returns a tag for a less specific language that is mutually +// intelligible or Und if there is no such language. This may not be the same as +// simply stripping the last BCP 47 subtag. For instance, the parent of "zh-TW" +// is "zh-Hant", and the parent of "zh-Hant" is "und". func (t Tag) Parent() Tag { - if t.str != "" { - // Strip the variants and extensions. - t, _ = Raw.Compose(t.Raw()) - if t.region == 0 && t.script != 0 && t.lang != 0 { - base, _ := addTags(Tag{lang: t.lang}) - if base.script == t.script { - return Tag{lang: t.lang} - } - } - return t - } - if t.lang != 0 { - if t.region != 0 { - maxScript := t.script - if maxScript == 0 { - max, _ := addTags(t) - maxScript = max.script - } - - for i := range parents { - if langID(parents[i].lang) == t.lang && scriptID(parents[i].maxScript) == maxScript { - for _, r := range parents[i].fromRegion { - if regionID(r) == t.region { - return Tag{ - lang: t.lang, - script: scriptID(parents[i].script), - region: regionID(parents[i].toRegion), - } - } - } - } - } - - // Strip the script if it is the default one. - base, _ := addTags(Tag{lang: t.lang}) - if base.script != maxScript { - return Tag{lang: t.lang, script: maxScript} - } - return Tag{lang: t.lang} - } else if t.script != 0 { - // The parent for an base-script pair with a non-default script is - // "und" instead of the base language. - base, _ := addTags(Tag{lang: t.lang}) - if base.script != t.script { - return und - } - return Tag{lang: t.lang} - } - } - return und + return Tag(compact.Tag(t).Parent()) } // returns token t and the rest of the string. @@ -555,17 +367,8 @@ func (e Extension) String() string { // ParseExtension parses s as an extension and returns it on success. func ParseExtension(s string) (e Extension, err error) { - scan := makeScannerString(s) - var end int - if n := len(scan.token); n != 1 { - return Extension{}, errSyntax - } - scan.toLower(0, len(scan.b)) - end = parseExtension(&scan) - if end != len(s) { - return Extension{}, errSyntax - } - return Extension{string(scan.b)}, nil + ext, err := language.ParseExtension(s) + return Extension{ext}, err } // Type returns the one-byte extension type of e. It returns 0 for the zero @@ -586,22 +389,20 @@ func (e Extension) Tokens() []string { // false for ok if t does not have the requested extension. The returned // extension will be invalid in this case. func (t Tag) Extension(x byte) (ext Extension, ok bool) { - for i := int(t.pExt); i < len(t.str)-1; { - var ext string - i, ext = getExtension(t.str, i) - if ext[0] == x { - return Extension{ext}, true - } + if !compact.Tag(t).MayHaveExtensions() { + return Extension{}, false } - return Extension{}, false + e, ok := t.tag().Extension(x) + return Extension{e}, ok } // Extensions returns all extensions of t. func (t Tag) Extensions() []Extension { + if !compact.Tag(t).MayHaveExtensions() { + return nil + } e := []Extension{} - for i := int(t.pExt); i < len(t.str)-1; { - var ext string - i, ext = getExtension(t.str, i) + for _, ext := range t.tag().Extensions() { e = append(e, Extension{ext}) } return e @@ -609,259 +410,105 @@ func (t Tag) Extensions() []Extension { // TypeForKey returns the type associated with the given key, where key and type // are of the allowed values defined for the Unicode locale extension ('u') in -// http://www.unicode.org/reports/tr35/#Unicode_Language_and_Locale_Identifiers. +// https://www.unicode.org/reports/tr35/#Unicode_Language_and_Locale_Identifiers. // TypeForKey will traverse the inheritance chain to get the correct value. func (t Tag) TypeForKey(key string) string { - if start, end, _ := t.findTypeForKey(key); end != start { - return t.str[start:end] + if !compact.Tag(t).MayHaveExtensions() { + if key != "rg" && key != "va" { + return "" + } } - return "" + return t.tag().TypeForKey(key) } -var ( - errPrivateUse = errors.New("cannot set a key on a private use tag") - errInvalidArguments = errors.New("invalid key or type") -) - // SetTypeForKey returns a new Tag with the key set to type, where key and type // are of the allowed values defined for the Unicode locale extension ('u') in -// http://www.unicode.org/reports/tr35/#Unicode_Language_and_Locale_Identifiers. +// https://www.unicode.org/reports/tr35/#Unicode_Language_and_Locale_Identifiers. // An empty value removes an existing pair with the same key. func (t Tag) SetTypeForKey(key, value string) (Tag, error) { - if t.private() { - return t, errPrivateUse - } - if len(key) != 2 { - return t, errInvalidArguments - } - - // Remove the setting if value is "". - if value == "" { - start, end, _ := t.findTypeForKey(key) - if start != end { - // Remove key tag and leading '-'. - start -= 4 - - // Remove a possible empty extension. - if (end == len(t.str) || t.str[end+2] == '-') && t.str[start-2] == '-' { - start -= 2 - } - if start == int(t.pVariant) && end == len(t.str) { - t.str = "" - t.pVariant, t.pExt = 0, 0 - } else { - t.str = fmt.Sprintf("%s%s", t.str[:start], t.str[end:]) - } - } - return t, nil - } - - if len(value) < 3 || len(value) > 8 { - return t, errInvalidArguments - } - - var ( - buf [maxCoreSize + maxSimpleUExtensionSize]byte - uStart int // start of the -u extension. - ) - - // Generate the tag string if needed. - if t.str == "" { - uStart = t.genCoreBytes(buf[:]) - buf[uStart] = '-' - uStart++ - } - - // Create new key-type pair and parse it to verify. - b := buf[uStart:] - copy(b, "u-") - copy(b[2:], key) - b[4] = '-' - b = b[:5+copy(b[5:], value)] - scan := makeScanner(b) - if parseExtensions(&scan); scan.err != nil { - return t, scan.err - } - - // Assemble the replacement string. - if t.str == "" { - t.pVariant, t.pExt = byte(uStart-1), uint16(uStart-1) - t.str = string(buf[:uStart+len(b)]) - } else { - s := t.str - start, end, hasExt := t.findTypeForKey(key) - if start == end { - if hasExt { - b = b[2:] - } - t.str = fmt.Sprintf("%s-%s%s", s[:start], b, s[end:]) - } else { - t.str = fmt.Sprintf("%s%s%s", s[:start], value, s[end:]) - } - } - return t, nil + tt, err := t.tag().SetTypeForKey(key, value) + return makeTag(tt), err } -// findKeyAndType returns the start and end position for the type corresponding -// to key or the point at which to insert the key-value pair if the type -// wasn't found. The hasExt return value reports whether an -u extension was present. -// Note: the extensions are typically very small and are likely to contain -// only one key-type pair. -func (t Tag) findTypeForKey(key string) (start, end int, hasExt bool) { - p := int(t.pExt) - if len(key) != 2 || p == len(t.str) || p == 0 { - return p, p, false - } - s := t.str - - // Find the correct extension. - for p++; s[p] != 'u'; p++ { - if s[p] > 'u' { - p-- - return p, p, false - } - if p = nextExtension(s, p); p == len(s) { - return len(s), len(s), false - } - } - // Proceed to the hyphen following the extension name. - p++ - - // curKey is the key currently being processed. - curKey := "" - - // Iterate over keys until we get the end of a section. - for { - // p points to the hyphen preceding the current token. - if p3 := p + 3; s[p3] == '-' { - // Found a key. - // Check whether we just processed the key that was requested. - if curKey == key { - return start, p, true - } - // Set to the next key and continue scanning type tokens. - curKey = s[p+1 : p3] - if curKey > key { - return p, p, true - } - // Start of the type token sequence. - start = p + 4 - // A type is at least 3 characters long. - p += 7 // 4 + 3 - } else { - // Attribute or type, which is at least 3 characters long. - p += 4 - } - // p points past the third character of a type or attribute. - max := p + 5 // maximum length of token plus hyphen. - if len(s) < max { - max = len(s) - } - for ; p < max && s[p] != '-'; p++ { - } - // Bail if we have exhausted all tokens or if the next token starts - // a new extension. - if p == len(s) || s[p+2] == '-' { - if curKey == key { - return start, p, true - } - return p, p, true - } - } -} +// NumCompactTags is the number of compact tags. The maximum tag is +// NumCompactTags-1. +const NumCompactTags = compact.NumCompactTags // CompactIndex returns an index, where 0 <= index < NumCompactTags, for tags -// for which data exists in the text repository. The index will change over time -// and should not be stored in persistent storage. Extensions, except for the -// 'va' type of the 'u' extension, are ignored. It will return 0, false if no -// compact tag exists, where 0 is the index for the root language (Und). -func CompactIndex(t Tag) (index int, ok bool) { - // TODO: perhaps give more frequent tags a lower index. - // TODO: we could make the indexes stable. This will excluded some - // possibilities for optimization, so don't do this quite yet. - b, s, r := t.Raw() - if len(t.str) > 0 { - if strings.HasPrefix(t.str, "x-") { - // We have no entries for user-defined tags. - return 0, false - } - if uint16(t.pVariant) != t.pExt { - // There are no tags with variants and an u-va type. - if t.TypeForKey("va") != "" { - return 0, false - } - t, _ = Raw.Compose(b, s, r, t.Variants()) - } else if _, ok := t.Extension('u'); ok { - // Strip all but the 'va' entry. - variant := t.TypeForKey("va") - t, _ = Raw.Compose(b, s, r) - t, _ = t.SetTypeForKey("va", variant) - } - if len(t.str) > 0 { - // We have some variants. - for i, s := range specialTags { - if s == t { - return i + 1, true - } - } - return 0, false - } - } - // No variants specified: just compare core components. - // The key has the form lllssrrr, where l, s, and r are nibbles for - // respectively the langID, scriptID, and regionID. - key := uint32(b.langID) << (8 + 12) - key |= uint32(s.scriptID) << 12 - key |= uint32(r.regionID) - x, ok := coreTags[key] - return int(x), ok +// for which data exists in the text repository.The index will change over time +// and should not be stored in persistent storage. If t does not match a compact +// index, exact will be false and the compact index will be returned for the +// first match after repeatedly taking the Parent of t. +func CompactIndex(t Tag) (index int, exact bool) { + id, exact := compact.LanguageID(compact.Tag(t)) + return int(id), exact } +var root = language.Tag{} + // Base is an ISO 639 language code, used for encoding the base language // of a language tag. type Base struct { - langID + langID language.Language } // ParseBase parses a 2- or 3-letter ISO 639 code. // It returns a ValueError if s is a well-formed but unknown language identifier // or another error if another error occurred. func ParseBase(s string) (Base, error) { - if n := len(s); n < 2 || 3 < n { - return Base{}, errSyntax - } - var buf [3]byte - l, err := getLangID(buf[:copy(buf[:], s)]) + l, err := language.ParseBase(s) return Base{l}, err } +// String returns the BCP 47 representation of the base language. +func (b Base) String() string { + return b.langID.String() +} + +// ISO3 returns the ISO 639-3 language code. +func (b Base) ISO3() string { + return b.langID.ISO3() +} + +// IsPrivateUse reports whether this language code is reserved for private use. +func (b Base) IsPrivateUse() bool { + return b.langID.IsPrivateUse() +} + // Script is a 4-letter ISO 15924 code for representing scripts. // It is idiomatically represented in title case. type Script struct { - scriptID + scriptID language.Script } // ParseScript parses a 4-letter ISO 15924 code. // It returns a ValueError if s is a well-formed but unknown script identifier // or another error if another error occurred. func ParseScript(s string) (Script, error) { - if len(s) != 4 { - return Script{}, errSyntax - } - var buf [4]byte - sc, err := getScriptID(script, buf[:copy(buf[:], s)]) + sc, err := language.ParseScript(s) return Script{sc}, err } +// String returns the script code in title case. +// It returns "Zzzz" for an unspecified script. +func (s Script) String() string { + return s.scriptID.String() +} + +// IsPrivateUse reports whether this script code is reserved for private use. +func (s Script) IsPrivateUse() bool { + return s.scriptID.IsPrivateUse() +} + // Region is an ISO 3166-1 or UN M.49 code for representing countries and regions. type Region struct { - regionID + regionID language.Region } // EncodeM49 returns the Region for the given UN M.49 code. // It returns an error if r is not a valid code. func EncodeM49(r int) (Region, error) { - rid, err := getRegionM49(r) + rid, err := language.EncodeM49(r) return Region{rid}, err } @@ -869,62 +516,54 @@ func EncodeM49(r int) (Region, error) { // It returns a ValueError if s is a well-formed but unknown region identifier // or another error if another error occurred. func ParseRegion(s string) (Region, error) { - if n := len(s); n < 2 || 3 < n { - return Region{}, errSyntax - } - var buf [3]byte - r, err := getRegionID(buf[:copy(buf[:], s)]) + r, err := language.ParseRegion(s) return Region{r}, err } +// String returns the BCP 47 representation for the region. +// It returns "ZZ" for an unspecified region. +func (r Region) String() string { + return r.regionID.String() +} + +// ISO3 returns the 3-letter ISO code of r. +// Note that not all regions have a 3-letter ISO code. +// In such cases this method returns "ZZZ". +func (r Region) ISO3() string { + return r.regionID.String() +} + +// M49 returns the UN M.49 encoding of r, or 0 if this encoding +// is not defined for r. +func (r Region) M49() int { + return r.regionID.M49() +} + +// IsPrivateUse reports whether r has the ISO 3166 User-assigned status. This +// may include private-use tags that are assigned by CLDR and used in this +// implementation. So IsPrivateUse and IsCountry can be simultaneously true. +func (r Region) IsPrivateUse() bool { + return r.regionID.IsPrivateUse() +} + // IsCountry returns whether this region is a country or autonomous area. This // includes non-standard definitions from CLDR. func (r Region) IsCountry() bool { - if r.regionID == 0 || r.IsGroup() || r.IsPrivateUse() && r.regionID != _XK { - return false - } - return true + return r.regionID.IsCountry() } // IsGroup returns whether this region defines a collection of regions. This // includes non-standard definitions from CLDR. func (r Region) IsGroup() bool { - if r.regionID == 0 { - return false - } - return int(regionInclusion[r.regionID]) < len(regionContainment) + return r.regionID.IsGroup() } // Contains returns whether Region c is contained by Region r. It returns true // if c == r. func (r Region) Contains(c Region) bool { - return r.regionID.contains(c.regionID) + return r.regionID.Contains(c.regionID) } -func (r regionID) contains(c regionID) bool { - if r == c { - return true - } - g := regionInclusion[r] - if g >= nRegionGroups { - return false - } - m := regionContainment[g] - - d := regionInclusion[c] - b := regionInclusionBits[d] - - // A contained country may belong to multiple disjoint groups. Matching any - // of these indicates containment. If the contained region is a group, it - // must strictly be a subset. - if d >= nRegionGroups { - return b&m != 0 - } - return b&^m == 0 -} - -var errNoTLD = errors.New("language: region is not a valid ccTLD") - // TLD returns the country code top-level domain (ccTLD). UK is returned for GB. // In all other cases it returns either the region itself or an error. // @@ -933,25 +572,15 @@ var errNoTLD = errors.New("language: region is not a valid ccTLD") // region will already be canonicalized it was obtained from a Tag that was // obtained using any of the default methods. func (r Region) TLD() (Region, error) { - // See http://en.wikipedia.org/wiki/Country_code_top-level_domain for the - // difference between ISO 3166-1 and IANA ccTLD. - if r.regionID == _GB { - r = Region{_UK} - } - if (r.typ() & ccTLD) == 0 { - return Region{}, errNoTLD - } - return r, nil + tld, err := r.regionID.TLD() + return Region{tld}, err } // Canonicalize returns the region or a possible replacement if the region is // deprecated. It will not return a replacement for deprecated regions that // are split into multiple regions. func (r Region) Canonicalize() Region { - if cr := normRegion(r.regionID); cr != 0 { - return Region{cr} - } - return r + return Region{r.regionID.Canonicalize()} } // Variant represents a registered variant of a language as defined by BCP 47. @@ -962,11 +591,8 @@ type Variant struct { // ParseVariant parses and returns a Variant. An error is returned if s is not // a valid variant. func ParseVariant(s string) (Variant, error) { - s = strings.ToLower(s) - if _, ok := variantIndex[s]; ok { - return Variant{s}, nil - } - return Variant{}, mkErrInvalid([]byte(s)) + v, err := language.ParseVariant(s) + return Variant{v.String()}, err } // String returns the string representation of the variant. diff --git a/vendor/golang.org/x/text/language/lookup.go b/vendor/golang.org/x/text/language/lookup.go deleted file mode 100644 index 1d80ac370..000000000 --- a/vendor/golang.org/x/text/language/lookup.go +++ /dev/null @@ -1,396 +0,0 @@ -// Copyright 2013 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package language - -import ( - "bytes" - "fmt" - "sort" - "strconv" - - "golang.org/x/text/internal/tag" -) - -// findIndex tries to find the given tag in idx and returns a standardized error -// if it could not be found. -func findIndex(idx tag.Index, key []byte, form string) (index int, err error) { - if !tag.FixCase(form, key) { - return 0, errSyntax - } - i := idx.Index(key) - if i == -1 { - return 0, mkErrInvalid(key) - } - return i, nil -} - -func searchUint(imap []uint16, key uint16) int { - return sort.Search(len(imap), func(i int) bool { - return imap[i] >= key - }) -} - -type langID uint16 - -// getLangID returns the langID of s if s is a canonical subtag -// or langUnknown if s is not a canonical subtag. -func getLangID(s []byte) (langID, error) { - if len(s) == 2 { - return getLangISO2(s) - } - return getLangISO3(s) -} - -// mapLang returns the mapped langID of id according to mapping m. -func normLang(id langID) (langID, langAliasType) { - k := sort.Search(len(langAliasMap), func(i int) bool { - return langAliasMap[i].from >= uint16(id) - }) - if k < len(langAliasMap) && langAliasMap[k].from == uint16(id) { - return langID(langAliasMap[k].to), langAliasTypes[k] - } - return id, langAliasTypeUnknown -} - -// getLangISO2 returns the langID for the given 2-letter ISO language code -// or unknownLang if this does not exist. -func getLangISO2(s []byte) (langID, error) { - if !tag.FixCase("zz", s) { - return 0, errSyntax - } - if i := lang.Index(s); i != -1 && lang.Elem(i)[3] != 0 { - return langID(i), nil - } - return 0, mkErrInvalid(s) -} - -const base = 'z' - 'a' + 1 - -func strToInt(s []byte) uint { - v := uint(0) - for i := 0; i < len(s); i++ { - v *= base - v += uint(s[i] - 'a') - } - return v -} - -// converts the given integer to the original ASCII string passed to strToInt. -// len(s) must match the number of characters obtained. -func intToStr(v uint, s []byte) { - for i := len(s) - 1; i >= 0; i-- { - s[i] = byte(v%base) + 'a' - v /= base - } -} - -// getLangISO3 returns the langID for the given 3-letter ISO language code -// or unknownLang if this does not exist. -func getLangISO3(s []byte) (langID, error) { - if tag.FixCase("und", s) { - // first try to match canonical 3-letter entries - for i := lang.Index(s[:2]); i != -1; i = lang.Next(s[:2], i) { - if e := lang.Elem(i); e[3] == 0 && e[2] == s[2] { - // We treat "und" as special and always translate it to "unspecified". - // Note that ZZ and Zzzz are private use and are not treated as - // unspecified by default. - id := langID(i) - if id == nonCanonicalUnd { - return 0, nil - } - return id, nil - } - } - if i := altLangISO3.Index(s); i != -1 { - return langID(altLangIndex[altLangISO3.Elem(i)[3]]), nil - } - n := strToInt(s) - if langNoIndex[n/8]&(1<<(n%8)) != 0 { - return langID(n) + langNoIndexOffset, nil - } - // Check for non-canonical uses of ISO3. - for i := lang.Index(s[:1]); i != -1; i = lang.Next(s[:1], i) { - if e := lang.Elem(i); e[2] == s[1] && e[3] == s[2] { - return langID(i), nil - } - } - return 0, mkErrInvalid(s) - } - return 0, errSyntax -} - -// stringToBuf writes the string to b and returns the number of bytes -// written. cap(b) must be >= 3. -func (id langID) stringToBuf(b []byte) int { - if id >= langNoIndexOffset { - intToStr(uint(id)-langNoIndexOffset, b[:3]) - return 3 - } else if id == 0 { - return copy(b, "und") - } - l := lang[id<<2:] - if l[3] == 0 { - return copy(b, l[:3]) - } - return copy(b, l[:2]) -} - -// String returns the BCP 47 representation of the langID. -// Use b as variable name, instead of id, to ensure the variable -// used is consistent with that of Base in which this type is embedded. -func (b langID) String() string { - if b == 0 { - return "und" - } else if b >= langNoIndexOffset { - b -= langNoIndexOffset - buf := [3]byte{} - intToStr(uint(b), buf[:]) - return string(buf[:]) - } - l := lang.Elem(int(b)) - if l[3] == 0 { - return l[:3] - } - return l[:2] -} - -// ISO3 returns the ISO 639-3 language code. -func (b langID) ISO3() string { - if b == 0 || b >= langNoIndexOffset { - return b.String() - } - l := lang.Elem(int(b)) - if l[3] == 0 { - return l[:3] - } else if l[2] == 0 { - return altLangISO3.Elem(int(l[3]))[:3] - } - // This allocation will only happen for 3-letter ISO codes - // that are non-canonical BCP 47 language identifiers. - return l[0:1] + l[2:4] -} - -// IsPrivateUse reports whether this language code is reserved for private use. -func (b langID) IsPrivateUse() bool { - return langPrivateStart <= b && b <= langPrivateEnd -} - -type regionID uint16 - -// getRegionID returns the region id for s if s is a valid 2-letter region code -// or unknownRegion. -func getRegionID(s []byte) (regionID, error) { - if len(s) == 3 { - if isAlpha(s[0]) { - return getRegionISO3(s) - } - if i, err := strconv.ParseUint(string(s), 10, 10); err == nil { - return getRegionM49(int(i)) - } - } - return getRegionISO2(s) -} - -// getRegionISO2 returns the regionID for the given 2-letter ISO country code -// or unknownRegion if this does not exist. -func getRegionISO2(s []byte) (regionID, error) { - i, err := findIndex(regionISO, s, "ZZ") - if err != nil { - return 0, err - } - return regionID(i) + isoRegionOffset, nil -} - -// getRegionISO3 returns the regionID for the given 3-letter ISO country code -// or unknownRegion if this does not exist. -func getRegionISO3(s []byte) (regionID, error) { - if tag.FixCase("ZZZ", s) { - for i := regionISO.Index(s[:1]); i != -1; i = regionISO.Next(s[:1], i) { - if e := regionISO.Elem(i); e[2] == s[1] && e[3] == s[2] { - return regionID(i) + isoRegionOffset, nil - } - } - for i := 0; i < len(altRegionISO3); i += 3 { - if tag.Compare(altRegionISO3[i:i+3], s) == 0 { - return regionID(altRegionIDs[i/3]), nil - } - } - return 0, mkErrInvalid(s) - } - return 0, errSyntax -} - -func getRegionM49(n int) (regionID, error) { - if 0 < n && n <= 999 { - const ( - searchBits = 7 - regionBits = 9 - regionMask = 1<> searchBits - buf := fromM49[m49Index[idx]:m49Index[idx+1]] - val := uint16(n) << regionBits // we rely on bits shifting out - i := sort.Search(len(buf), func(i int) bool { - return buf[i] >= val - }) - if r := fromM49[int(m49Index[idx])+i]; r&^regionMask == val { - return regionID(r & regionMask), nil - } - } - var e ValueError - fmt.Fprint(bytes.NewBuffer([]byte(e.v[:])), n) - return 0, e -} - -// normRegion returns a region if r is deprecated or 0 otherwise. -// TODO: consider supporting BYS (-> BLR), CSK (-> 200 or CZ), PHI (-> PHL) and AFI (-> DJ). -// TODO: consider mapping split up regions to new most populous one (like CLDR). -func normRegion(r regionID) regionID { - m := regionOldMap - k := sort.Search(len(m), func(i int) bool { - return m[i].from >= uint16(r) - }) - if k < len(m) && m[k].from == uint16(r) { - return regionID(m[k].to) - } - return 0 -} - -const ( - iso3166UserAssigned = 1 << iota - ccTLD - bcp47Region -) - -func (r regionID) typ() byte { - return regionTypes[r] -} - -// String returns the BCP 47 representation for the region. -// It returns "ZZ" for an unspecified region. -func (r regionID) String() string { - if r < isoRegionOffset { - if r == 0 { - return "ZZ" - } - return fmt.Sprintf("%03d", r.M49()) - } - r -= isoRegionOffset - return regionISO.Elem(int(r))[:2] -} - -// ISO3 returns the 3-letter ISO code of r. -// Note that not all regions have a 3-letter ISO code. -// In such cases this method returns "ZZZ". -func (r regionID) ISO3() string { - if r < isoRegionOffset { - return "ZZZ" - } - r -= isoRegionOffset - reg := regionISO.Elem(int(r)) - switch reg[2] { - case 0: - return altRegionISO3[reg[3]:][:3] - case ' ': - return "ZZZ" - } - return reg[0:1] + reg[2:4] -} - -// M49 returns the UN M.49 encoding of r, or 0 if this encoding -// is not defined for r. -func (r regionID) M49() int { - return int(m49[r]) -} - -// IsPrivateUse reports whether r has the ISO 3166 User-assigned status. This -// may include private-use tags that are assigned by CLDR and used in this -// implementation. So IsPrivateUse and IsCountry can be simultaneously true. -func (r regionID) IsPrivateUse() bool { - return r.typ()&iso3166UserAssigned != 0 -} - -type scriptID uint8 - -// getScriptID returns the script id for string s. It assumes that s -// is of the format [A-Z][a-z]{3}. -func getScriptID(idx tag.Index, s []byte) (scriptID, error) { - i, err := findIndex(idx, s, "Zzzz") - return scriptID(i), err -} - -// String returns the script code in title case. -// It returns "Zzzz" for an unspecified script. -func (s scriptID) String() string { - if s == 0 { - return "Zzzz" - } - return script.Elem(int(s)) -} - -// IsPrivateUse reports whether this script code is reserved for private use. -func (s scriptID) IsPrivateUse() bool { - return _Qaaa <= s && s <= _Qabx -} - -const ( - maxAltTaglen = len("en-US-POSIX") - maxLen = maxAltTaglen -) - -var ( - // grandfatheredMap holds a mapping from legacy and grandfathered tags to - // their base language or index to more elaborate tag. - grandfatheredMap = map[[maxLen]byte]int16{ - [maxLen]byte{'a', 'r', 't', '-', 'l', 'o', 'j', 'b', 'a', 'n'}: _jbo, // art-lojban - [maxLen]byte{'i', '-', 'a', 'm', 'i'}: _ami, // i-ami - [maxLen]byte{'i', '-', 'b', 'n', 'n'}: _bnn, // i-bnn - [maxLen]byte{'i', '-', 'h', 'a', 'k'}: _hak, // i-hak - [maxLen]byte{'i', '-', 'k', 'l', 'i', 'n', 'g', 'o', 'n'}: _tlh, // i-klingon - [maxLen]byte{'i', '-', 'l', 'u', 'x'}: _lb, // i-lux - [maxLen]byte{'i', '-', 'n', 'a', 'v', 'a', 'j', 'o'}: _nv, // i-navajo - [maxLen]byte{'i', '-', 'p', 'w', 'n'}: _pwn, // i-pwn - [maxLen]byte{'i', '-', 't', 'a', 'o'}: _tao, // i-tao - [maxLen]byte{'i', '-', 't', 'a', 'y'}: _tay, // i-tay - [maxLen]byte{'i', '-', 't', 's', 'u'}: _tsu, // i-tsu - [maxLen]byte{'n', 'o', '-', 'b', 'o', 'k'}: _nb, // no-bok - [maxLen]byte{'n', 'o', '-', 'n', 'y', 'n'}: _nn, // no-nyn - [maxLen]byte{'s', 'g', 'n', '-', 'b', 'e', '-', 'f', 'r'}: _sfb, // sgn-BE-FR - [maxLen]byte{'s', 'g', 'n', '-', 'b', 'e', '-', 'n', 'l'}: _vgt, // sgn-BE-NL - [maxLen]byte{'s', 'g', 'n', '-', 'c', 'h', '-', 'd', 'e'}: _sgg, // sgn-CH-DE - [maxLen]byte{'z', 'h', '-', 'g', 'u', 'o', 'y', 'u'}: _cmn, // zh-guoyu - [maxLen]byte{'z', 'h', '-', 'h', 'a', 'k', 'k', 'a'}: _hak, // zh-hakka - [maxLen]byte{'z', 'h', '-', 'm', 'i', 'n', '-', 'n', 'a', 'n'}: _nan, // zh-min-nan - [maxLen]byte{'z', 'h', '-', 'x', 'i', 'a', 'n', 'g'}: _hsn, // zh-xiang - - // Grandfathered tags with no modern replacement will be converted as - // follows: - [maxLen]byte{'c', 'e', 'l', '-', 'g', 'a', 'u', 'l', 'i', 's', 'h'}: -1, // cel-gaulish - [maxLen]byte{'e', 'n', '-', 'g', 'b', '-', 'o', 'e', 'd'}: -2, // en-GB-oed - [maxLen]byte{'i', '-', 'd', 'e', 'f', 'a', 'u', 'l', 't'}: -3, // i-default - [maxLen]byte{'i', '-', 'e', 'n', 'o', 'c', 'h', 'i', 'a', 'n'}: -4, // i-enochian - [maxLen]byte{'i', '-', 'm', 'i', 'n', 'g', 'o'}: -5, // i-mingo - [maxLen]byte{'z', 'h', '-', 'm', 'i', 'n'}: -6, // zh-min - - // CLDR-specific tag. - [maxLen]byte{'r', 'o', 'o', 't'}: 0, // root - [maxLen]byte{'e', 'n', '-', 'u', 's', '-', 'p', 'o', 's', 'i', 'x'}: -7, // en_US_POSIX" - } - - altTagIndex = [...]uint8{0, 17, 31, 45, 61, 74, 86, 102} - - altTags = "xtg-x-cel-gaulishen-GB-oxendicten-x-i-defaultund-x-i-enochiansee-x-i-mingonan-x-zh-minen-US-u-va-posix" -) - -func grandfathered(s [maxAltTaglen]byte) (t Tag, ok bool) { - if v, ok := grandfatheredMap[s]; ok { - if v < 0 { - return Make(altTags[altTagIndex[-v-1]:altTagIndex[-v]]), true - } - t.lang = langID(v) - return t, true - } - return t, false -} diff --git a/vendor/golang.org/x/text/language/match.go b/vendor/golang.org/x/text/language/match.go index 8ad950533..f73492134 100644 --- a/vendor/golang.org/x/text/language/match.go +++ b/vendor/golang.org/x/text/language/match.go @@ -4,7 +4,45 @@ package language -import "errors" +import ( + "errors" + "strings" + + "golang.org/x/text/internal/language" +) + +// A MatchOption configures a Matcher. +type MatchOption func(*matcher) + +// PreferSameScript will, in the absence of a match, result in the first +// preferred tag with the same script as a supported tag to match this supported +// tag. The default is currently true, but this may change in the future. +func PreferSameScript(preferSame bool) MatchOption { + return func(m *matcher) { m.preferSameScript = preferSame } +} + +// TODO(v1.0.0): consider making Matcher a concrete type, instead of interface. +// There doesn't seem to be too much need for multiple types. +// Making it a concrete type allows MatchStrings to be a method, which will +// improve its discoverability. + +// MatchStrings parses and matches the given strings until one of them matches +// the language in the Matcher. A string may be an Accept-Language header as +// handled by ParseAcceptLanguage. The default language is returned if no +// other language matched. +func MatchStrings(m Matcher, lang ...string) (tag Tag, index int) { + for _, accept := range lang { + desired, _, err := ParseAcceptLanguage(accept) + if err != nil { + continue + } + if tag, index, conf := m.Match(desired...); conf != No { + return tag, index + } + } + tag, index, _ = m.Match() + return +} // Matcher is the interface that wraps the Match method. // @@ -36,248 +74,76 @@ func Comprehends(speaker, alternative Tag) Confidence { // matched tag in t, but is augmented with the Unicode extension ('u')of the // corresponding preferred tag. This allows user locale options to be passed // transparently. -func NewMatcher(t []Tag) Matcher { - return newMatcher(t) +func NewMatcher(t []Tag, options ...MatchOption) Matcher { + return newMatcher(t, options) } func (m *matcher) Match(want ...Tag) (t Tag, index int, c Confidence) { + var tt language.Tag match, w, c := m.getBest(want...) - if match == nil { - t = m.default_.tag + if match != nil { + tt, index = match.tag, match.index } else { - t, index = match.tag, match.index - } - // Copy options from the user-provided tag into the result tag. This is hard - // to do after the fact, so we do it here. - // TODO: consider also adding in variants that are compatible with the - // matched language. - // TODO: Add back region if it is non-ambiguous? Or create another tag to - // preserve the region? - if u, ok := w.Extension('u'); ok { - t, _ = Raw.Compose(t, u) - } - return t, index, c -} - -type scriptRegionFlags uint8 - -const ( - isList = 1 << iota - scriptInFrom - regionInFrom -) - -func (t *Tag) setUndefinedLang(id langID) { - if t.lang == 0 { - t.lang = id - } -} - -func (t *Tag) setUndefinedScript(id scriptID) { - if t.script == 0 { - t.script = id - } -} - -func (t *Tag) setUndefinedRegion(id regionID) { - if t.region == 0 || t.region.contains(id) { - t.region = id - } -} - -// ErrMissingLikelyTagsData indicates no information was available -// to compute likely values of missing tags. -var ErrMissingLikelyTagsData = errors.New("missing likely tags data") - -// addLikelySubtags sets subtags to their most likely value, given the locale. -// In most cases this means setting fields for unknown values, but in some -// cases it may alter a value. It returns a ErrMissingLikelyTagsData error -// if the given locale cannot be expanded. -func (t Tag) addLikelySubtags() (Tag, error) { - id, err := addTags(t) - if err != nil { - return t, err - } else if id.equalTags(t) { - return t, nil - } - id.remakeString() - return id, nil -} - -// specializeRegion attempts to specialize a group region. -func specializeRegion(t *Tag) bool { - if i := regionInclusion[t.region]; i < nRegionGroups { - x := likelyRegionGroup[i] - if langID(x.lang) == t.lang && scriptID(x.script) == t.script { - t.region = regionID(x.region) - } - return true - } - return false -} - -func addTags(t Tag) (Tag, error) { - // We leave private use identifiers alone. - if t.private() { - return t, nil - } - if t.script != 0 && t.region != 0 { - if t.lang != 0 { - // already fully specified - specializeRegion(&t) - return t, nil - } - // Search matches for und-script-region. Note that for these cases - // region will never be a group so there is no need to check for this. - list := likelyRegion[t.region : t.region+1] - if x := list[0]; x.flags&isList != 0 { - list = likelyRegionList[x.lang : x.lang+uint16(x.script)] - } - for _, x := range list { - // Deviating from the spec. See match_test.go for details. - if scriptID(x.script) == t.script { - t.setUndefinedLang(langID(x.lang)) - return t, nil - } - } - } - if t.lang != 0 { - // Search matches for lang-script and lang-region, where lang != und. - if t.lang < langNoIndexOffset { - x := likelyLang[t.lang] - if x.flags&isList != 0 { - list := likelyLangList[x.region : x.region+uint16(x.script)] - if t.script != 0 { - for _, x := range list { - if scriptID(x.script) == t.script && x.flags&scriptInFrom != 0 { - t.setUndefinedRegion(regionID(x.region)) - return t, nil - } - } - } else if t.region != 0 { - count := 0 - goodScript := true - tt := t - for _, x := range list { - // We visit all entries for which the script was not - // defined, including the ones where the region was not - // defined. This allows for proper disambiguation within - // regions. - if x.flags&scriptInFrom == 0 && t.region.contains(regionID(x.region)) { - tt.region = regionID(x.region) - tt.setUndefinedScript(scriptID(x.script)) - goodScript = goodScript && tt.script == scriptID(x.script) - count++ - } - } - if count == 1 { - return tt, nil - } - // Even if we fail to find a unique Region, we might have - // an unambiguous script. - if goodScript { - t.script = tt.script - } + // TODO: this should be an option + tt = m.default_.tag + if m.preferSameScript { + outer: + for _, w := range want { + script, _ := w.Script() + if script.scriptID == 0 { + // Don't do anything if there is no script, such as with + // private subtags. + continue } - } - } - } else { - // Search matches for und-script. - if t.script != 0 { - x := likelyScript[t.script] - if x.region != 0 { - t.setUndefinedRegion(regionID(x.region)) - t.setUndefinedLang(langID(x.lang)) - return t, nil - } - } - // Search matches for und-region. If und-script-region exists, it would - // have been found earlier. - if t.region != 0 { - if i := regionInclusion[t.region]; i < nRegionGroups { - x := likelyRegionGroup[i] - if x.region != 0 { - t.setUndefinedLang(langID(x.lang)) - t.setUndefinedScript(scriptID(x.script)) - t.region = regionID(x.region) - } - } else { - x := likelyRegion[t.region] - if x.flags&isList != 0 { - x = likelyRegionList[x.lang] - } - if x.script != 0 && x.flags != scriptInFrom { - t.setUndefinedLang(langID(x.lang)) - t.setUndefinedScript(scriptID(x.script)) - return t, nil + for i, h := range m.supported { + if script.scriptID == h.maxScript { + tt, index = h.tag, i + break outer + } } } } + // TODO: select first language tag based on script. } - - // Search matches for lang. - if t.lang < langNoIndexOffset { - x := likelyLang[t.lang] - if x.flags&isList != 0 { - x = likelyLangList[x.region] + if w.RegionID != tt.RegionID && w.RegionID != 0 { + if w.RegionID != 0 && tt.RegionID != 0 && tt.RegionID.Contains(w.RegionID) { + tt.RegionID = w.RegionID + tt.RemakeString() + } else if r := w.RegionID.String(); len(r) == 2 { + // TODO: also filter macro and deprecated. + tt, _ = tt.SetTypeForKey("rg", strings.ToLower(r)+"zzzz") } - if x.region != 0 { - t.setUndefinedScript(scriptID(x.script)) - t.setUndefinedRegion(regionID(x.region)) - } - specializeRegion(&t) - if t.lang == 0 { - t.lang = _en // default language + } + // Copy options from the user-provided tag into the result tag. This is hard + // to do after the fact, so we do it here. + // TODO: add in alternative variants to -u-va-. + // TODO: add preferred region to -u-rg-. + if e := w.Extensions(); len(e) > 0 { + b := language.Builder{} + b.SetTag(tt) + for _, e := range e { + b.AddExt(e) } - return t, nil + tt = b.Make() } - return t, ErrMissingLikelyTagsData + return makeTag(tt), index, c } -func (t *Tag) setTagsFrom(id Tag) { - t.lang = id.lang - t.script = id.script - t.region = id.region -} +// ErrMissingLikelyTagsData indicates no information was available +// to compute likely values of missing tags. +var ErrMissingLikelyTagsData = errors.New("missing likely tags data") -// minimize removes the region or script subtags from t such that -// t.addLikelySubtags() == t.minimize().addLikelySubtags(). -func (t Tag) minimize() (Tag, error) { - t, err := minimizeTags(t) - if err != nil { - return t, err - } - t.remakeString() - return t, nil -} - -// minimizeTags mimics the behavior of the ICU 51 C implementation. -func minimizeTags(t Tag) (Tag, error) { - if t.equalTags(und) { - return t, nil - } - max, err := addTags(t) - if err != nil { - return t, err - } - for _, id := range [...]Tag{ - {lang: t.lang}, - {lang: t.lang, region: t.region}, - {lang: t.lang, script: t.script}, - } { - if x, err := addTags(id); err == nil && max.equalTags(x) { - t.setTagsFrom(id) - break - } - } - return t, nil -} +// func (t *Tag) setTagsFrom(id Tag) { +// t.LangID = id.LangID +// t.ScriptID = id.ScriptID +// t.RegionID = id.RegionID +// } // Tag Matching // CLDR defines an algorithm for finding the best match between two sets of language // tags. The basic algorithm defines how to score a possible match and then find // the match with the best score -// (see http://www.unicode.org/reports/tr35/#LanguageMatching). +// (see https://www.unicode.org/reports/tr35/#LanguageMatching). // Using scoring has several disadvantages. The scoring obfuscates the importance of // the various factors considered, making the algorithm harder to understand. Using // scoring also requires the full score to be computed for each pair of tags. @@ -300,8 +166,9 @@ func minimizeTags(t Tag) (Tag, error) { // 1) compute the match between the two tags. // 2) if the match is better than the previous best match, replace it // with the new match. (see next section) -// b) if the current best match is above a certain threshold, return this -// match without proceeding to the next tag in "desired". [See Note 1] +// b) if the current best match is Exact and pin is true the result will be +// frozen to the language found thusfar, although better matches may +// still be found for the same language. // 3) If the best match so far is below a certain threshold, return "default". // // Ranking: @@ -350,9 +217,6 @@ func minimizeTags(t Tag) (Tag, error) { // found wins. // // Notes: -// [1] Note that even if we may not have a perfect match, if a match is above a -// certain threshold, it is considered a better match than any other match -// to a tag later in the list of preferred language tags. // [2] In practice, as matching of Exact is done in a separate phase from // matching the other levels, we reuse the Exact level to mean MaxExact in // the second phase. As a consequence, we only need the levels defined by @@ -388,22 +252,24 @@ func minimizeTags(t Tag) (Tag, error) { // matcher keeps a set of supported language tags, indexed by language. type matcher struct { - default_ *haveTag - index map[langID]*matchHeader - passSettings bool + default_ *haveTag + supported []*haveTag + index map[language.Language]*matchHeader + passSettings bool + preferSameScript bool } // matchHeader has the lists of tags for exact matches and matches based on // maximized and canonicalized tags for a given language. type matchHeader struct { - exact []*haveTag - max []*haveTag + haveTags []*haveTag + original bool } // haveTag holds a supported Tag and its maximized script and region. The maximized // or canonicalized language is not stored as it is not needed during matching. type haveTag struct { - tag Tag + tag language.Tag // index of this tag in the original list of supported tags. index int @@ -413,35 +279,37 @@ type haveTag struct { conf Confidence // Maximized region and script. - maxRegion regionID - maxScript scriptID + maxRegion language.Region + maxScript language.Script // altScript may be checked as an alternative match to maxScript. If altScript // matches, the confidence level for this match is Low. Theoretically there // could be multiple alternative scripts. This does not occur in practice. - altScript scriptID + altScript language.Script // nextMax is the index of the next haveTag with the same maximized tags. nextMax uint16 } -func makeHaveTag(tag Tag, index int) (haveTag, langID) { +func makeHaveTag(tag language.Tag, index int) (haveTag, language.Language) { max := tag - if tag.lang != 0 { - max, _ = max.canonicalize(All) - max, _ = addTags(max) - max.remakeString() + if tag.LangID != 0 || tag.RegionID != 0 || tag.ScriptID != 0 { + max, _ = canonicalize(All, max) + max, _ = max.Maximize() + max.RemakeString() } - return haveTag{tag, index, Exact, max.region, max.script, altScript(max.lang, max.script), 0}, max.lang + return haveTag{tag, index, Exact, max.RegionID, max.ScriptID, altScript(max.LangID, max.ScriptID), 0}, max.LangID } // altScript returns an alternative script that may match the given script with // a low confidence. At the moment, the langMatch data allows for at most one // script to map to another and we rely on this to keep the code simple. -func altScript(l langID, s scriptID) scriptID { +func altScript(l language.Language, s language.Script) language.Script { for _, alt := range matchScript { - if (alt.lang == 0 || langID(alt.lang) == l) && scriptID(alt.have) == s { - return scriptID(alt.want) + // TODO: also match cases where language is not the same. + if (language.Language(alt.wantLang) == l || language.Language(alt.haveLang) == l) && + language.Script(alt.haveScript) == s { + return language.Script(alt.wantScript) } } return 0 @@ -450,34 +318,32 @@ func altScript(l langID, s scriptID) scriptID { // addIfNew adds a haveTag to the list of tags only if it is a unique tag. // Tags that have the same maximized values are linked by index. func (h *matchHeader) addIfNew(n haveTag, exact bool) { + h.original = h.original || exact // Don't add new exact matches. - for _, v := range h.exact { - if v.tag.equalsRest(n.tag) { + for _, v := range h.haveTags { + if equalsRest(v.tag, n.tag) { return } } - if exact { - h.exact = append(h.exact, &n) - } // Allow duplicate maximized tags, but create a linked list to allow quickly // comparing the equivalents and bail out. - for i, v := range h.max { + for i, v := range h.haveTags { if v.maxScript == n.maxScript && v.maxRegion == n.maxRegion && - v.tag.variantOrPrivateTagStr() == n.tag.variantOrPrivateTagStr() { - for h.max[i].nextMax != 0 { - i = int(h.max[i].nextMax) + v.tag.VariantOrPrivateUseTags() == n.tag.VariantOrPrivateUseTags() { + for h.haveTags[i].nextMax != 0 { + i = int(h.haveTags[i].nextMax) } - h.max[i].nextMax = uint16(len(h.max)) + h.haveTags[i].nextMax = uint16(len(h.haveTags)) break } } - h.max = append(h.max, &n) + h.haveTags = append(h.haveTags, &n) } // header returns the matchHeader for the given language. It creates one if // it doesn't already exist. -func (m *matcher) header(l langID) *matchHeader { +func (m *matcher) header(l language.Language) *matchHeader { if h := m.index[l]; h != nil { return h } @@ -486,12 +352,26 @@ func (m *matcher) header(l langID) *matchHeader { return h } +func toConf(d uint8) Confidence { + if d <= 10 { + return High + } + if d < 30 { + return Low + } + return No +} + // newMatcher builds an index for the given supported tags and returns it as // a matcher. It also expands the index by considering various equivalence classes // for a given tag. -func newMatcher(supported []Tag) *matcher { +func newMatcher(supported []Tag, options []MatchOption) *matcher { m := &matcher{ - index: make(map[langID]*matchHeader), + index: make(map[language.Language]*matchHeader), + preferSameScript: true, + } + for _, o := range options { + o(m) } if len(supported) == 0 { m.default_ = &haveTag{} @@ -500,36 +380,41 @@ func newMatcher(supported []Tag) *matcher { // Add supported languages to the index. Add exact matches first to give // them precedence. for i, tag := range supported { - pair, _ := makeHaveTag(tag, i) - m.header(tag.lang).addIfNew(pair, true) - } - m.default_ = m.header(supported[0].lang).exact[0] + tt := tag.tag() + pair, _ := makeHaveTag(tt, i) + m.header(tt.LangID).addIfNew(pair, true) + m.supported = append(m.supported, &pair) + } + m.default_ = m.header(supported[0].lang()).haveTags[0] + // Keep these in two different loops to support the case that two equivalent + // languages are distinguished, such as iw and he. for i, tag := range supported { - pair, max := makeHaveTag(tag, i) - if max != tag.lang { - m.header(max).addIfNew(pair, false) + tt := tag.tag() + pair, max := makeHaveTag(tt, i) + if max != tt.LangID { + m.header(max).addIfNew(pair, true) } } // update is used to add indexes in the map for equivalent languages. - // If force is true, the update will also apply to derived entries. To - // avoid applying a "transitive closure", use false. - update := func(want, have uint16, conf Confidence, force bool) { - if hh := m.index[langID(have)]; hh != nil { - if !force && len(hh.exact) == 0 { + // update will only add entries to original indexes, thus not computing any + // transitive relations. + update := func(want, have uint16, conf Confidence) { + if hh := m.index[language.Language(have)]; hh != nil { + if !hh.original { return } - hw := m.header(langID(want)) - for _, ht := range hh.max { + hw := m.header(language.Language(want)) + for _, ht := range hh.haveTags { v := *ht if conf < v.conf { v.conf = conf } v.nextMax = 0 // this value needs to be recomputed if v.altScript != 0 { - v.altScript = altScript(langID(want), v.maxScript) + v.altScript = altScript(language.Language(want), v.maxScript) } - hw.addIfNew(v, conf == Exact && len(hh.exact) > 0) + hw.addIfNew(v, conf == Exact && hh.original) } } } @@ -537,9 +422,9 @@ func newMatcher(supported []Tag) *matcher { // Add entries for languages with mutual intelligibility as defined by CLDR's // languageMatch data. for _, ml := range matchLang { - update(ml.want, ml.have, Confidence(ml.conf), false) + update(ml.want, ml.have, toConf(ml.distance)) if !ml.oneway { - update(ml.have, ml.want, Confidence(ml.conf), false) + update(ml.have, ml.want, toConf(ml.distance)) } } @@ -548,126 +433,157 @@ func newMatcher(supported []Tag) *matcher { // First we match deprecated equivalents. If they are perfect equivalents // (their canonicalization simply substitutes a different language code, but // nothing else), the match confidence is Exact, otherwise it is High. - for i, lm := range langAliasMap { - if lm.from == _sh { - continue - } - + for i, lm := range language.AliasMap { // If deprecated codes match and there is no fiddling with the script or // or region, we consider it an exact match. conf := Exact - if langAliasTypes[i] != langMacro { - if !isExactEquivalent(langID(lm.from)) { + if language.AliasTypes[i] != language.Macro { + if !isExactEquivalent(language.Language(lm.From)) { conf = High } - update(lm.to, lm.from, conf, true) + update(lm.To, lm.From, conf) } - update(lm.from, lm.to, conf, true) + update(lm.From, lm.To, conf) } return m } // getBest gets the best matching tag in m for any of the given tags, taking into // account the order of preference of the given tags. -func (m *matcher) getBest(want ...Tag) (got *haveTag, orig Tag, c Confidence) { +func (m *matcher) getBest(want ...Tag) (got *haveTag, orig language.Tag, c Confidence) { best := bestMatch{} - for _, w := range want { - var max Tag + for i, ww := range want { + w := ww.tag() + var max language.Tag // Check for exact match first. - h := m.index[w.lang] - if w.lang != 0 { - // Base language is defined. + h := m.index[w.LangID] + if w.LangID != 0 { if h == nil { continue } - for i := range h.exact { - have := h.exact[i] - if have.tag.equalsRest(w) { - return have, w, Exact - } + // Base language is defined. + max, _ = canonicalize(Legacy|Deprecated|Macro, w) + // A region that is added through canonicalization is stronger than + // a maximized region: set it in the original (e.g. mo -> ro-MD). + if w.RegionID != max.RegionID { + w.RegionID = max.RegionID } - max, _ = w.canonicalize(Legacy | Deprecated) - max, _ = addTags(max) + // TODO: should we do the same for scripts? + // See test case: en, sr, nl ; sh ; sr + max, _ = max.Maximize() } else { // Base language is not defined. if h != nil { - for i := range h.exact { - have := h.exact[i] - if have.tag.equalsRest(w) { + for i := range h.haveTags { + have := h.haveTags[i] + if equalsRest(have.tag, w) { return have, w, Exact } } } - if w.script == 0 && w.region == 0 { + if w.ScriptID == 0 && w.RegionID == 0 { // We skip all tags matching und for approximate matching, including // private tags. continue } - max, _ = addTags(w) - if h = m.index[max.lang]; h == nil { + max, _ = w.Maximize() + if h = m.index[max.LangID]; h == nil { continue } } + pin := true + for _, t := range want[i+1:] { + if w.LangID == t.lang() { + pin = false + break + } + } // Check for match based on maximized tag. - for i := range h.max { - have := h.max[i] - best.update(have, w, max.script, max.region) + for i := range h.haveTags { + have := h.haveTags[i] + best.update(have, w, max.ScriptID, max.RegionID, pin) if best.conf == Exact { for have.nextMax != 0 { - have = h.max[have.nextMax] - best.update(have, w, max.script, max.region) + have = h.haveTags[have.nextMax] + best.update(have, w, max.ScriptID, max.RegionID, pin) } - return best.have, best.want, High + return best.have, best.want, best.conf } } } if best.conf <= No { if len(want) != 0 { - return nil, want[0], No + return nil, want[0].tag(), No } - return nil, Tag{}, No + return nil, language.Tag{}, No } return best.have, best.want, best.conf } // bestMatch accumulates the best match so far. type bestMatch struct { - have *haveTag - want Tag - conf Confidence + have *haveTag + want language.Tag + conf Confidence + pinnedRegion language.Region + pinLanguage bool + sameRegionGroup bool // Cached results from applying tie-breaking rules. - origLang bool - origReg bool - regDist uint8 - origScript bool - parentDist uint8 // 255 if have is not an ancestor of want tag. + origLang bool + origReg bool + paradigmReg bool + regGroupDist uint8 + origScript bool } // update updates the existing best match if the new pair is considered to be a -// better match. -// To determine if the given pair is a better match, it first computes the rough -// confidence level. If this surpasses the current match, it will replace it and -// update the tie-breaker rule cache. If there is a tie, it proceeds with applying -// a series of tie-breaker rules. If there is no conclusive winner after applying -// the tie-breaker rules, it leaves the current match as the preferred match. -func (m *bestMatch) update(have *haveTag, tag Tag, maxScript scriptID, maxRegion regionID) { +// better match. To determine if the given pair is a better match, it first +// computes the rough confidence level. If this surpasses the current match, it +// will replace it and update the tie-breaker rule cache. If there is a tie, it +// proceeds with applying a series of tie-breaker rules. If there is no +// conclusive winner after applying the tie-breaker rules, it leaves the current +// match as the preferred match. +// +// If pin is true and have and tag are a strong match, it will henceforth only +// consider matches for this language. This corresponds to the nothing that most +// users have a strong preference for the first defined language. A user can +// still prefer a second language over a dialect of the preferred language by +// explicitly specifying dialects, e.g. "en, nl, en-GB". In this case pin should +// be false. +func (m *bestMatch) update(have *haveTag, tag language.Tag, maxScript language.Script, maxRegion language.Region, pin bool) { // Bail if the maximum attainable confidence is below that of the current best match. c := have.conf if c < m.conf { return } - if have.maxScript != maxScript { + // Don't change the language once we already have found an exact match. + if m.pinLanguage && tag.LangID != m.want.LangID { + return + } + // Pin the region group if we are comparing tags for the same language. + if tag.LangID == m.want.LangID && m.sameRegionGroup { + _, sameGroup := regionGroupDist(m.pinnedRegion, have.maxRegion, have.maxScript, m.want.LangID) + if !sameGroup { + return + } + } + if c == Exact && have.maxScript == maxScript { + // If there is another language and then another entry of this language, + // don't pin anything, otherwise pin the language. + m.pinLanguage = pin + } + if equalsRest(have.tag, tag) { + } else if have.maxScript != maxScript { // There is usually very little comprehension between different scripts. - // In a few cases there may still be Low comprehension. This possibility is - // pre-computed and stored in have.altScript. + // In a few cases there may still be Low comprehension. This possibility + // is pre-computed and stored in have.altScript. if Low < m.conf || have.altScript != maxScript { return } c = Low } else if have.maxRegion != maxRegion { - // There is usually a small difference between languages across regions. - // We use the region distance (below) to disambiguate between equal matches. if High < c { + // There is usually a small difference between languages across regions. c = High } } @@ -686,7 +602,7 @@ func (m *bestMatch) update(have *haveTag, tag Tag, maxScript scriptID, maxRegion // Tie-breaker rules: // We prefer if the pre-maximized language was specified and identical. - origLang := have.tag.lang == tag.lang && tag.lang != 0 + origLang := have.tag.LangID == tag.LangID && tag.LangID != 0 if !beaten && m.origLang != origLang { if m.origLang { return @@ -695,7 +611,7 @@ func (m *bestMatch) update(have *haveTag, tag Tag, maxScript scriptID, maxRegion } // We prefer if the pre-maximized region was specified and identical. - origReg := have.tag.region == tag.region && tag.region != 0 + origReg := have.tag.RegionID == tag.RegionID && tag.RegionID != 0 if !beaten && m.origReg != origReg { if m.origReg { return @@ -703,28 +619,26 @@ func (m *bestMatch) update(have *haveTag, tag Tag, maxScript scriptID, maxRegion beaten = true } - // Next we prefer smaller distances between regions, as defined by regionDist. - regDist := regionDist(have.maxRegion, maxRegion, tag.lang) - if !beaten && m.regDist != regDist { - if regDist > m.regDist { + regGroupDist, sameGroup := regionGroupDist(have.maxRegion, maxRegion, maxScript, tag.LangID) + if !beaten && m.regGroupDist != regGroupDist { + if regGroupDist > m.regGroupDist { return } beaten = true } - // Next we prefer if the pre-maximized script was specified and identical. - origScript := have.tag.script == tag.script && tag.script != 0 - if !beaten && m.origScript != origScript { - if m.origScript { + paradigmReg := isParadigmLocale(tag.LangID, have.maxRegion) + if !beaten && m.paradigmReg != paradigmReg { + if !paradigmReg { return } beaten = true } - // Finally we prefer tags which have a closer parent relationship. - parentDist := parentDistance(have.tag.region, tag) - if !beaten && m.parentDist != parentDist { - if parentDist > m.parentDist { + // Next we prefer if the pre-maximized script was specified and identical. + origScript := have.tag.ScriptID == tag.ScriptID && tag.ScriptID != 0 + if !beaten && m.origScript != origScript { + if m.origScript { return } beaten = true @@ -735,90 +649,59 @@ func (m *bestMatch) update(have *haveTag, tag Tag, maxScript scriptID, maxRegion m.have = have m.want = tag m.conf = c + m.pinnedRegion = maxRegion + m.sameRegionGroup = sameGroup m.origLang = origLang m.origReg = origReg + m.paradigmReg = paradigmReg m.origScript = origScript - m.regDist = regDist - m.parentDist = parentDist + m.regGroupDist = regGroupDist } } -// parentDistance returns the number of times Parent must be called before the -// regions match. It is assumed that it has already been checked that lang and -// script are identical. If haveRegion does not occur in the ancestor chain of -// tag, it returns 255. -func parentDistance(haveRegion regionID, tag Tag) uint8 { - p := tag.Parent() - d := uint8(1) - for haveRegion != p.region { - if p.region == 0 { - return 255 +func isParadigmLocale(lang language.Language, r language.Region) bool { + for _, e := range paradigmLocales { + if language.Language(e[0]) == lang && (r == language.Region(e[1]) || r == language.Region(e[2])) { + return true } - p = p.Parent() - d++ - } - return d -} - -// regionDist wraps regionDistance with some exceptions to the algorithmic distance. -func regionDist(a, b regionID, lang langID) uint8 { - if lang == _en { - // Two variants of non-US English are close to each other, regardless of distance. - if a != _US && b != _US { - return 2 - } - } - return uint8(regionDistance(a, b)) -} - -// regionDistance computes the distance between two regions based on the -// distance in the graph of region containments as defined in CLDR. It iterates -// over increasingly inclusive sets of groups, represented as bit vectors, until -// the source bit vector has bits in common with the destination vector. -func regionDistance(a, b regionID) int { - if a == b { - return 0 - } - p, q := regionInclusion[a], regionInclusion[b] - if p < nRegionGroups { - p, q = q, p - } - set := regionInclusionBits - if q < nRegionGroups && set[p]&(1< 0 { - return t.str[t.pVariant:t.pExt] + aGroup := uint(regionToGroups[a]) << 1 + bGroup := uint(regionToGroups[b]) << 1 + for _, ri := range matchRegion { + if language.Language(ri.lang) == lang && (ri.script == 0 || language.Script(ri.script) == script) { + group := uint(1 << (ri.group &^ 0x80)) + if 0x80&ri.group == 0 { + if aGroup&bGroup&group != 0 { // Both regions are in the group. + return ri.distance, ri.distance == defaultDistance + } + } else { + if (aGroup|bGroup)&group == 0 { // Both regions are not in the group. + return ri.distance, ri.distance == defaultDistance + } + } + } } - return t.str[t.pVariant:] + return defaultDistance, true } // equalsRest compares everything except the language. -func (a Tag) equalsRest(b Tag) bool { +func equalsRest(a, b language.Tag) bool { // TODO: don't include extensions in this comparison. To do this efficiently, // though, we should handle private tags separately. - return a.script == b.script && a.region == b.region && a.variantOrPrivateTagStr() == b.variantOrPrivateTagStr() + return a.ScriptID == b.ScriptID && a.RegionID == b.RegionID && a.VariantOrPrivateUseTags() == b.VariantOrPrivateUseTags() } // isExactEquivalent returns true if canonicalizing the language will not alter // the script or region of a tag. -func isExactEquivalent(l langID) bool { +func isExactEquivalent(l language.Language) bool { for _, o := range notEquivalent { if o == l { return false @@ -827,15 +710,26 @@ func isExactEquivalent(l langID) bool { return true } -var notEquivalent []langID +var notEquivalent []language.Language func init() { // Create a list of all languages for which canonicalization may alter the // script or region. - for _, lm := range langAliasMap { - tag := Tag{lang: langID(lm.from)} - if tag, _ = tag.canonicalize(All); tag.script != 0 || tag.region != 0 { - notEquivalent = append(notEquivalent, langID(lm.from)) + for _, lm := range language.AliasMap { + tag := language.Tag{LangID: language.Language(lm.From)} + if tag, _ = canonicalize(All, tag); tag.ScriptID != 0 || tag.RegionID != 0 { + notEquivalent = append(notEquivalent, language.Language(lm.From)) + } + } + // Maximize undefined regions of paradigm locales. + for i, v := range paradigmLocales { + t := language.Tag{LangID: language.Language(v[0])} + max, _ := t.Maximize() + if v[1] == 0 { + paradigmLocales[i][1] = uint16(max.RegionID) + } + if v[2] == 0 { + paradigmLocales[i][2] = uint16(max.RegionID) } } } diff --git a/vendor/golang.org/x/text/language/parse.go b/vendor/golang.org/x/text/language/parse.go index cfa28f56e..11acfd885 100644 --- a/vendor/golang.org/x/text/language/parse.go +++ b/vendor/golang.org/x/text/language/parse.go @@ -5,216 +5,21 @@ package language import ( - "bytes" "errors" - "fmt" - "sort" "strconv" "strings" - "golang.org/x/text/internal/tag" + "golang.org/x/text/internal/language" ) -// isAlpha returns true if the byte is not a digit. -// b must be an ASCII letter or digit. -func isAlpha(b byte) bool { - return b > '9' -} - -// isAlphaNum returns true if the string contains only ASCII letters or digits. -func isAlphaNum(s []byte) bool { - for _, c := range s { - if !('a' <= c && c <= 'z' || 'A' <= c && c <= 'Z' || '0' <= c && c <= '9') { - return false - } - } - return true -} - -// errSyntax is returned by any of the parsing functions when the -// input is not well-formed, according to BCP 47. -// TODO: return the position at which the syntax error occurred? -var errSyntax = errors.New("language: tag is not well-formed") - // ValueError is returned by any of the parsing functions when the // input is well-formed but the respective subtag is not recognized // as a valid value. -type ValueError struct { - v [8]byte -} - -func mkErrInvalid(s []byte) error { - var e ValueError - copy(e.v[:], s) - return e -} - -func (e ValueError) tag() []byte { - n := bytes.IndexByte(e.v[:], 0) - if n == -1 { - n = 8 - } - return e.v[:n] -} - -// Error implements the error interface. -func (e ValueError) Error() string { - return fmt.Sprintf("language: subtag %q is well-formed but unknown", e.tag()) -} - -// Subtag returns the subtag for which the error occurred. -func (e ValueError) Subtag() string { - return string(e.tag()) -} - -// scanner is used to scan BCP 47 tokens, which are separated by _ or -. -type scanner struct { - b []byte - bytes [max99thPercentileSize]byte - token []byte - start int // start position of the current token - end int // end position of the current token - next int // next point for scan - err error - done bool -} - -func makeScannerString(s string) scanner { - scan := scanner{} - if len(s) <= len(scan.bytes) { - scan.b = scan.bytes[:copy(scan.bytes[:], s)] - } else { - scan.b = []byte(s) - } - scan.init() - return scan -} - -// makeScanner returns a scanner using b as the input buffer. -// b is not copied and may be modified by the scanner routines. -func makeScanner(b []byte) scanner { - scan := scanner{b: b} - scan.init() - return scan -} - -func (s *scanner) init() { - for i, c := range s.b { - if c == '_' { - s.b[i] = '-' - } - } - s.scan() -} - -// restToLower converts the string between start and end to lower case. -func (s *scanner) toLower(start, end int) { - for i := start; i < end; i++ { - c := s.b[i] - if 'A' <= c && c <= 'Z' { - s.b[i] += 'a' - 'A' - } - } -} +type ValueError interface { + error -func (s *scanner) setError(e error) { - if s.err == nil || (e == errSyntax && s.err != errSyntax) { - s.err = e - } -} - -// resizeRange shrinks or grows the array at position oldStart such that -// a new string of size newSize can fit between oldStart and oldEnd. -// Sets the scan point to after the resized range. -func (s *scanner) resizeRange(oldStart, oldEnd, newSize int) { - s.start = oldStart - if end := oldStart + newSize; end != oldEnd { - diff := end - oldEnd - if end < cap(s.b) { - b := make([]byte, len(s.b)+diff) - copy(b, s.b[:oldStart]) - copy(b[end:], s.b[oldEnd:]) - s.b = b - } else { - s.b = append(s.b[end:], s.b[oldEnd:]...) - } - s.next = end + (s.next - s.end) - s.end = end - } -} - -// replace replaces the current token with repl. -func (s *scanner) replace(repl string) { - s.resizeRange(s.start, s.end, len(repl)) - copy(s.b[s.start:], repl) -} - -// gobble removes the current token from the input. -// Caller must call scan after calling gobble. -func (s *scanner) gobble(e error) { - s.setError(e) - if s.start == 0 { - s.b = s.b[:+copy(s.b, s.b[s.next:])] - s.end = 0 - } else { - s.b = s.b[:s.start-1+copy(s.b[s.start-1:], s.b[s.end:])] - s.end = s.start - 1 - } - s.next = s.start -} - -// deleteRange removes the given range from s.b before the current token. -func (s *scanner) deleteRange(start, end int) { - s.setError(errSyntax) - s.b = s.b[:start+copy(s.b[start:], s.b[end:])] - diff := end - start - s.next -= diff - s.start -= diff - s.end -= diff -} - -// scan parses the next token of a BCP 47 string. Tokens that are larger -// than 8 characters or include non-alphanumeric characters result in an error -// and are gobbled and removed from the output. -// It returns the end position of the last token consumed. -func (s *scanner) scan() (end int) { - end = s.end - s.token = nil - for s.start = s.next; s.next < len(s.b); { - i := bytes.IndexByte(s.b[s.next:], '-') - if i == -1 { - s.end = len(s.b) - s.next = len(s.b) - i = s.end - s.start - } else { - s.end = s.next + i - s.next = s.end + 1 - } - token := s.b[s.start:s.end] - if i < 1 || i > 8 || !isAlphaNum(token) { - s.gobble(errSyntax) - continue - } - s.token = token - return end - } - if n := len(s.b); n > 0 && s.b[n-1] == '-' { - s.setError(errSyntax) - s.b = s.b[:len(s.b)-1] - } - s.done = true - return end -} - -// acceptMinSize parses multiple tokens of the given size or greater. -// It returns the end position of the last token consumed. -func (s *scanner) acceptMinSize(min int) (end int) { - end = s.end - s.scan() - for ; len(s.token) >= min; s.scan() { - end = s.end - } - return end + // Subtag returns the subtag for which the error occurred. + Subtag() string } // Parse parses the given BCP 47 string and returns a valid Tag. If parsing @@ -223,7 +28,7 @@ func (s *scanner) acceptMinSize(min int) (end int) { // ValueError. The Tag returned in this case is just stripped of the unknown // value. All other values are preserved. It accepts tags in the BCP 47 format // and extensions to this standard defined in -// http://www.unicode.org/reports/tr35/#Unicode_Language_and_Locale_Identifiers. +// https://www.unicode.org/reports/tr35/#Unicode_Language_and_Locale_Identifiers. // The resulting tag is canonicalized using the default canonicalization type. func Parse(s string) (t Tag, err error) { return Default.Parse(s) @@ -235,327 +40,18 @@ func Parse(s string) (t Tag, err error) { // ValueError. The Tag returned in this case is just stripped of the unknown // value. All other values are preserved. It accepts tags in the BCP 47 format // and extensions to this standard defined in -// http://www.unicode.org/reports/tr35/#Unicode_Language_and_Locale_Identifiers. -// The resulting tag is canonicalized using the the canonicalization type c. +// https://www.unicode.org/reports/tr35/#Unicode_Language_and_Locale_Identifiers. +// The resulting tag is canonicalized using the canonicalization type c. func (c CanonType) Parse(s string) (t Tag, err error) { - // TODO: consider supporting old-style locale key-value pairs. - if s == "" { - return und, errSyntax - } - if len(s) <= maxAltTaglen { - b := [maxAltTaglen]byte{} - for i, c := range s { - // Generating invalid UTF-8 is okay as it won't match. - if 'A' <= c && c <= 'Z' { - c += 'a' - 'A' - } else if c == '_' { - c = '-' - } - b[i] = byte(c) - } - if t, ok := grandfathered(b); ok { - return t, nil - } + tt, err := language.Parse(s) + if err != nil { + return makeTag(tt), err } - scan := makeScannerString(s) - t, err = parse(&scan, s) - t, changed := t.canonicalize(c) + tt, changed := canonicalize(c, tt) if changed { - t.remakeString() - } - return t, err -} - -func parse(scan *scanner, s string) (t Tag, err error) { - t = und - var end int - if n := len(scan.token); n <= 1 { - scan.toLower(0, len(scan.b)) - if n == 0 || scan.token[0] != 'x' { - return t, errSyntax - } - end = parseExtensions(scan) - } else if n >= 4 { - return und, errSyntax - } else { // the usual case - t, end = parseTag(scan) - if n := len(scan.token); n == 1 { - t.pExt = uint16(end) - end = parseExtensions(scan) - } else if end < len(scan.b) { - scan.setError(errSyntax) - scan.b = scan.b[:end] - } - } - if int(t.pVariant) < len(scan.b) { - if end < len(s) { - s = s[:end] - } - if len(s) > 0 && tag.Compare(s, scan.b) == 0 { - t.str = s - } else { - t.str = string(scan.b) - } - } else { - t.pVariant, t.pExt = 0, 0 - } - return t, scan.err -} - -// parseTag parses language, script, region and variants. -// It returns a Tag and the end position in the input that was parsed. -func parseTag(scan *scanner) (t Tag, end int) { - var e error - // TODO: set an error if an unknown lang, script or region is encountered. - t.lang, e = getLangID(scan.token) - scan.setError(e) - scan.replace(t.lang.String()) - langStart := scan.start - end = scan.scan() - for len(scan.token) == 3 && isAlpha(scan.token[0]) { - // From http://tools.ietf.org/html/bcp47, - tags are equivalent - // to a tag of the form . - lang, e := getLangID(scan.token) - if lang != 0 { - t.lang = lang - copy(scan.b[langStart:], lang.String()) - scan.b[langStart+3] = '-' - scan.start = langStart + 4 - } - scan.gobble(e) - end = scan.scan() - } - if len(scan.token) == 4 && isAlpha(scan.token[0]) { - t.script, e = getScriptID(script, scan.token) - if t.script == 0 { - scan.gobble(e) - } - end = scan.scan() - } - if n := len(scan.token); n >= 2 && n <= 3 { - t.region, e = getRegionID(scan.token) - if t.region == 0 { - scan.gobble(e) - } else { - scan.replace(t.region.String()) - } - end = scan.scan() - } - scan.toLower(scan.start, len(scan.b)) - t.pVariant = byte(end) - end = parseVariants(scan, end, t) - t.pExt = uint16(end) - return t, end -} - -var separator = []byte{'-'} - -// parseVariants scans tokens as long as each token is a valid variant string. -// Duplicate variants are removed. -func parseVariants(scan *scanner, end int, t Tag) int { - start := scan.start - varIDBuf := [4]uint8{} - variantBuf := [4][]byte{} - varID := varIDBuf[:0] - variant := variantBuf[:0] - last := -1 - needSort := false - for ; len(scan.token) >= 4; scan.scan() { - // TODO: measure the impact of needing this conversion and redesign - // the data structure if there is an issue. - v, ok := variantIndex[string(scan.token)] - if !ok { - // unknown variant - // TODO: allow user-defined variants? - scan.gobble(mkErrInvalid(scan.token)) - continue - } - varID = append(varID, v) - variant = append(variant, scan.token) - if !needSort { - if last < int(v) { - last = int(v) - } else { - needSort = true - // There is no legal combinations of more than 7 variants - // (and this is by no means a useful sequence). - const maxVariants = 8 - if len(varID) > maxVariants { - break - } - } - } - end = scan.end - } - if needSort { - sort.Sort(variantsSort{varID, variant}) - k, l := 0, -1 - for i, v := range varID { - w := int(v) - if l == w { - // Remove duplicates. - continue - } - varID[k] = varID[i] - variant[k] = variant[i] - k++ - l = w - } - if str := bytes.Join(variant[:k], separator); len(str) == 0 { - end = start - 1 - } else { - scan.resizeRange(start, end, len(str)) - copy(scan.b[scan.start:], str) - end = scan.end - } - } - return end -} - -type variantsSort struct { - i []uint8 - v [][]byte -} - -func (s variantsSort) Len() int { - return len(s.i) -} - -func (s variantsSort) Swap(i, j int) { - s.i[i], s.i[j] = s.i[j], s.i[i] - s.v[i], s.v[j] = s.v[j], s.v[i] -} - -func (s variantsSort) Less(i, j int) bool { - return s.i[i] < s.i[j] -} - -type bytesSort [][]byte - -func (b bytesSort) Len() int { - return len(b) -} - -func (b bytesSort) Swap(i, j int) { - b[i], b[j] = b[j], b[i] -} - -func (b bytesSort) Less(i, j int) bool { - return bytes.Compare(b[i], b[j]) == -1 -} - -// parseExtensions parses and normalizes the extensions in the buffer. -// It returns the last position of scan.b that is part of any extension. -// It also trims scan.b to remove excess parts accordingly. -func parseExtensions(scan *scanner) int { - start := scan.start - exts := [][]byte{} - private := []byte{} - end := scan.end - for len(scan.token) == 1 { - extStart := scan.start - ext := scan.token[0] - end = parseExtension(scan) - extension := scan.b[extStart:end] - if len(extension) < 3 || (ext != 'x' && len(extension) < 4) { - scan.setError(errSyntax) - end = extStart - continue - } else if start == extStart && (ext == 'x' || scan.start == len(scan.b)) { - scan.b = scan.b[:end] - return end - } else if ext == 'x' { - private = extension - break - } - exts = append(exts, extension) + tt.RemakeString() } - sort.Sort(bytesSort(exts)) - if len(private) > 0 { - exts = append(exts, private) - } - scan.b = scan.b[:start] - if len(exts) > 0 { - scan.b = append(scan.b, bytes.Join(exts, separator)...) - } else if start > 0 { - // Strip trailing '-'. - scan.b = scan.b[:start-1] - } - return end -} - -// parseExtension parses a single extension and returns the position of -// the extension end. -func parseExtension(scan *scanner) int { - start, end := scan.start, scan.end - switch scan.token[0] { - case 'u': - attrStart := end - scan.scan() - for last := []byte{}; len(scan.token) > 2; scan.scan() { - if bytes.Compare(scan.token, last) != -1 { - // Attributes are unsorted. Start over from scratch. - p := attrStart + 1 - scan.next = p - attrs := [][]byte{} - for scan.scan(); len(scan.token) > 2; scan.scan() { - attrs = append(attrs, scan.token) - end = scan.end - } - sort.Sort(bytesSort(attrs)) - copy(scan.b[p:], bytes.Join(attrs, separator)) - break - } - last = scan.token - end = scan.end - } - var last, key []byte - for attrEnd := end; len(scan.token) == 2; last = key { - key = scan.token - keyEnd := scan.end - end = scan.acceptMinSize(3) - // TODO: check key value validity - if keyEnd == end || bytes.Compare(key, last) != 1 { - // We have an invalid key or the keys are not sorted. - // Start scanning keys from scratch and reorder. - p := attrEnd + 1 - scan.next = p - keys := [][]byte{} - for scan.scan(); len(scan.token) == 2; { - keyStart, keyEnd := scan.start, scan.end - end = scan.acceptMinSize(3) - if keyEnd != end { - keys = append(keys, scan.b[keyStart:end]) - } else { - scan.setError(errSyntax) - end = keyStart - } - } - sort.Sort(bytesSort(keys)) - reordered := bytes.Join(keys, separator) - if e := p + len(reordered); e < end { - scan.deleteRange(e, end) - end = e - } - copy(scan.b[p:], bytes.Join(keys, separator)) - break - } - } - case 't': - scan.scan() - if n := len(scan.token); n >= 2 && n <= 3 && isAlpha(scan.token[1]) { - _, end = parseTag(scan) - scan.toLower(start, end) - } - for len(scan.token) == 2 && !isAlpha(scan.token[1]) { - end = scan.acceptMinSize(3) - } - case 'x': - end = scan.acceptMinSize(1) - default: - end = scan.acceptMinSize(2) - } - return end + return makeTag(tt), err } // Compose creates a Tag from individual parts, which may be of type Tag, Base, @@ -563,10 +59,11 @@ func parseExtension(scan *scanner) int { // Base, Script or Region or slice of type Variant or Extension is passed more // than once, the latter will overwrite the former. Variants and Extensions are // accumulated, but if two extensions of the same type are passed, the latter -// will replace the former. A Tag overwrites all former values and typically -// only makes sense as the first argument. The resulting tag is returned after -// canonicalizing using the Default CanonType. If one or more errors are -// encountered, one of the errors is returned. +// will replace the former. For -u extensions, though, the key-type pairs are +// added, where later values overwrite older ones. A Tag overwrites all former +// values and typically only makes sense as the first argument. The resulting +// tag is returned after canonicalizing using the Default CanonType. If one or +// more errors are encountered, one of the errors is returned. func Compose(part ...interface{}) (t Tag, err error) { return Default.Compose(part...) } @@ -576,196 +73,68 @@ func Compose(part ...interface{}) (t Tag, err error) { // Base, Script or Region or slice of type Variant or Extension is passed more // than once, the latter will overwrite the former. Variants and Extensions are // accumulated, but if two extensions of the same type are passed, the latter -// will replace the former. A Tag overwrites all former values and typically -// only makes sense as the first argument. The resulting tag is returned after -// canonicalizing using CanonType c. If one or more errors are encountered, -// one of the errors is returned. +// will replace the former. For -u extensions, though, the key-type pairs are +// added, where later values overwrite older ones. A Tag overwrites all former +// values and typically only makes sense as the first argument. The resulting +// tag is returned after canonicalizing using CanonType c. If one or more errors +// are encountered, one of the errors is returned. func (c CanonType) Compose(part ...interface{}) (t Tag, err error) { - var b builder - if err = b.update(part...); err != nil { + var b language.Builder + if err = update(&b, part...); err != nil { return und, err } - t, _ = b.tag.canonicalize(c) - - if len(b.ext) > 0 || len(b.variant) > 0 { - sort.Sort(sortVariant(b.variant)) - sort.Strings(b.ext) - if b.private != "" { - b.ext = append(b.ext, b.private) - } - n := maxCoreSize + tokenLen(b.variant...) + tokenLen(b.ext...) - buf := make([]byte, n) - p := t.genCoreBytes(buf) - t.pVariant = byte(p) - p += appendTokens(buf[p:], b.variant...) - t.pExt = uint16(p) - p += appendTokens(buf[p:], b.ext...) - t.str = string(buf[:p]) - } else if b.private != "" { - t.str = b.private - t.remakeString() - } - return -} - -type builder struct { - tag Tag - - private string // the x extension - ext []string - variant []string - - err error -} - -func (b *builder) addExt(e string) { - if e == "" { - } else if e[0] == 'x' { - b.private = e - } else { - b.ext = append(b.ext, e) - } + b.Tag, _ = canonicalize(c, b.Tag) + return makeTag(b.Make()), err } var errInvalidArgument = errors.New("invalid Extension or Variant") -func (b *builder) update(part ...interface{}) (err error) { - replace := func(l *[]string, s string, eq func(a, b string) bool) bool { - if s == "" { - b.err = errInvalidArgument - return true - } - for i, v := range *l { - if eq(v, s) { - (*l)[i] = s - return true - } - } - return false - } +func update(b *language.Builder, part ...interface{}) (err error) { for _, x := range part { switch v := x.(type) { case Tag: - b.tag.lang = v.lang - b.tag.region = v.region - b.tag.script = v.script - if v.str != "" { - b.variant = nil - for x, s := "", v.str[v.pVariant:v.pExt]; s != ""; { - x, s = nextToken(s) - b.variant = append(b.variant, x) - } - b.ext, b.private = nil, "" - for i, e := int(v.pExt), ""; i < len(v.str); { - i, e = getExtension(v.str, i) - b.addExt(e) - } - } + b.SetTag(v.tag()) case Base: - b.tag.lang = v.langID + b.Tag.LangID = v.langID case Script: - b.tag.script = v.scriptID + b.Tag.ScriptID = v.scriptID case Region: - b.tag.region = v.regionID + b.Tag.RegionID = v.regionID case Variant: - if !replace(&b.variant, v.variant, func(a, b string) bool { return a == b }) { - b.variant = append(b.variant, v.variant) + if v.variant == "" { + err = errInvalidArgument + break } + b.AddVariant(v.variant) case Extension: - if !replace(&b.ext, v.s, func(a, b string) bool { return a[0] == b[0] }) { - b.addExt(v.s) + if v.s == "" { + err = errInvalidArgument + break } + b.SetExt(v.s) case []Variant: - b.variant = nil - for _, x := range v { - b.update(x) + b.ClearVariants() + for _, v := range v { + b.AddVariant(v.variant) } case []Extension: - b.ext, b.private = nil, "" + b.ClearExtensions() for _, e := range v { - b.update(e) + b.SetExt(e.s) } // TODO: support parsing of raw strings based on morphology or just extensions? case error: - err = v - } - } - return -} - -func tokenLen(token ...string) (n int) { - for _, t := range token { - n += len(t) + 1 - } - return -} - -func appendTokens(b []byte, token ...string) int { - p := 0 - for _, t := range token { - b[p] = '-' - copy(b[p+1:], t) - p += 1 + len(t) - } - return p -} - -type sortVariant []string - -func (s sortVariant) Len() int { - return len(s) -} - -func (s sortVariant) Swap(i, j int) { - s[j], s[i] = s[i], s[j] -} - -func (s sortVariant) Less(i, j int) bool { - return variantIndex[s[i]] < variantIndex[s[j]] -} - -func findExt(list []string, x byte) int { - for i, e := range list { - if e[0] == x { - return i - } - } - return -1 -} - -// getExtension returns the name, body and end position of the extension. -func getExtension(s string, p int) (end int, ext string) { - if s[p] == '-' { - p++ - } - if s[p] == 'x' { - return len(s), s[p:] - } - end = nextExtension(s, p) - return end, s[p:end] -} - -// nextExtension finds the next extension within the string, searching -// for the -- pattern from position p. -// In the fast majority of cases, language tags will have at most -// one extension and extensions tend to be small. -func nextExtension(s string, p int) int { - for n := len(s) - 3; p < n; { - if s[p] == '-' { - if s[p+2] == '-' { - return p + if v != nil { + err = v } - p += 3 - } else { - p++ } } - return len(s) + return } var errInvalidWeight = errors.New("ParseAcceptLanguage: invalid weight") -// ParseAcceptLanguage parses the contents of a Accept-Language header as +// ParseAcceptLanguage parses the contents of an Accept-Language header as // defined in http://www.ietf.org/rfc/rfc2616.txt and returns a list of Tags and // a list of corresponding quality weights. It is more permissive than RFC 2616 // and may return non-nil slices even if the input is not valid. @@ -788,7 +157,7 @@ func ParseAcceptLanguage(s string) (tag []Tag, q []float32, err error) { if !ok { return nil, nil, err } - t = Tag{lang: id} + t = makeTag(language.Tag{LangID: id}) } // Scan the optional weight. @@ -830,9 +199,9 @@ func split(s string, c byte) (head, tail string) { return strings.TrimSpace(s), "" } -// Add hack mapping to deal with a small number of cases that that occur +// Add hack mapping to deal with a small number of cases that occur // in Accept-Language (with reasonable frequency). -var acceptFallback = map[string]langID{ +var acceptFallback = map[string]language.Language{ "english": _en, "deutsch": _de, "italian": _it, diff --git a/vendor/golang.org/x/text/language/tables.go b/vendor/golang.org/x/text/language/tables.go index ccdc1ff0f..e22807719 100644 --- a/vendor/golang.org/x/text/language/tables.go +++ b/vendor/golang.org/x/text/language/tables.go @@ -1,3547 +1,298 @@ -// This file was generated by go generate; DO NOT EDIT +// Code generated by running "go generate" in golang.org/x/text. DO NOT EDIT. package language -import "golang.org/x/text/internal/tag" - // CLDRVersion is the CLDR version from which the tables in this package are derived. -const CLDRVersion = "30" - -const numLanguages = 8654 - -const numScripts = 230 - -const numRegions = 356 - -type fromTo struct { - from uint16 - to uint16 -} +const CLDRVersion = "32" -const nonCanonicalUnd = 1191 const ( - _af = 21 - _am = 38 - _ar = 57 - _az = 87 - _bg = 125 - _bn = 163 - _ca = 213 - _cs = 246 - _da = 253 - _de = 265 - _el = 305 - _en = 308 - _es = 313 - _et = 315 - _fa = 323 - _fi = 332 - _fil = 334 - _fr = 345 - _gu = 413 - _he = 437 - _hi = 439 - _hr = 458 - _hu = 462 - _hy = 464 - _id = 474 - _is = 496 - _it = 497 - _ja = 504 - _ka = 520 - _kk = 570 - _km = 578 - _kn = 585 - _ko = 587 - _ky = 641 - _lo = 687 - _lt = 695 - _lv = 702 - _mk = 758 - _ml = 763 - _mn = 770 - _mo = 775 - _mr = 786 - _ms = 790 - _mul = 797 - _my = 808 - _nb = 830 - _ne = 840 - _nl = 862 - _no = 870 - _pa = 916 - _pl = 938 - _pt = 951 - _ro = 979 - _ru = 985 - _sh = 1021 - _si = 1026 - _sk = 1032 - _sl = 1036 - _sq = 1063 - _sr = 1064 - _sv = 1082 - _sw = 1083 - _ta = 1094 - _te = 1111 - _th = 1121 - _tl = 1136 - _tn = 1142 - _tr = 1152 - _uk = 1188 - _ur = 1194 - _uz = 1202 - _vi = 1209 - _zh = 1311 - _zu = 1316 - _jbo = 507 - _ami = 1639 - _bnn = 2346 - _hak = 431 - _tlh = 14456 - _lb = 652 - _nv = 890 - _pwn = 12044 - _tao = 14177 - _tay = 14187 - _tsu = 14651 - _nn = 865 - _sfb = 13618 - _vgt = 15690 - _sgg = 13649 - _cmn = 2996 - _nan = 826 - _hsn = 460 + _de = 269 + _en = 313 + _fr = 350 + _it = 505 + _mo = 784 + _no = 879 + _nb = 839 + _pt = 960 + _sh = 1031 + _mul = 806 + _und = 0 +) +const ( + _001 = 1 + _419 = 31 + _BR = 65 + _CA = 73 + _ES = 110 + _GB = 123 + _MD = 188 + _PT = 238 + _UK = 306 + _US = 309 + _ZZ = 357 + _XA = 323 + _XC = 325 + _XK = 333 ) - -const langPrivateStart = 0x2f67 - -const langPrivateEnd = 0x316e - -// lang holds an alphabetically sorted list of ISO-639 language identifiers. -// All entries are 4 bytes. The index of the identifier (divided by 4) is the language tag. -// For 2-byte language identifiers, the two successive bytes have the following meaning: -// - if the first letter of the 2- and 3-letter ISO codes are the same: -// the second and third letter of the 3-letter ISO code. -// - otherwise: a 0 and a by 2 bits right-shifted index into altLangISO3. -// For 3-byte language identifiers the 4th byte is 0. -const lang tag.Index = "" + // Size: 5280 bytes - "---\x00aaaraai\x00aak\x00aau\x00abbkabi\x00abr\x00abt\x00aby\x00acd\x00a" + - "ce\x00ach\x00ada\x00ade\x00adj\x00ady\x00adz\x00aeveaeb\x00aey\x00affrag" + - "c\x00agd\x00agg\x00agm\x00ago\x00agq\x00aha\x00ahl\x00aho\x00ajg\x00akka" + - "akk\x00ala\x00ali\x00aln\x00alt\x00ammhamm\x00amn\x00amo\x00amp\x00anrga" + - "nc\x00ank\x00ann\x00any\x00aoj\x00aom\x00aoz\x00apc\x00apd\x00ape\x00apr" + - "\x00aps\x00apz\x00arraarc\x00arh\x00arn\x00aro\x00arq\x00ars\x00ary\x00a" + - "rz\x00assmasa\x00ase\x00asg\x00aso\x00ast\x00ata\x00atg\x00atj\x00auy" + - "\x00avvaavl\x00avn\x00avt\x00avu\x00awa\x00awb\x00awo\x00awx\x00ayymayb" + - "\x00azzebaakbal\x00ban\x00bap\x00bar\x00bas\x00bav\x00bax\x00bba\x00bbb" + - "\x00bbc\x00bbd\x00bbj\x00bbp\x00bbr\x00bcf\x00bch\x00bci\x00bcm\x00bcn" + - "\x00bco\x00bcq\x00bcu\x00bdd\x00beelbef\x00beh\x00bej\x00bem\x00bet\x00b" + - "ew\x00bex\x00bez\x00bfd\x00bfq\x00bft\x00bfy\x00bgulbgc\x00bgn\x00bgx" + - "\x00bhihbhb\x00bhg\x00bhi\x00bhk\x00bhl\x00bho\x00bhy\x00biisbib\x00big" + - "\x00bik\x00bim\x00bin\x00bio\x00biq\x00bjh\x00bji\x00bjj\x00bjn\x00bjo" + - "\x00bjr\x00bjz\x00bkc\x00bkm\x00bkq\x00bku\x00bkv\x00blt\x00bmambmh\x00b" + - "mk\x00bmq\x00bmu\x00bnenbng\x00bnm\x00bnp\x00boodboj\x00bom\x00bon\x00bp" + - "y\x00bqc\x00bqi\x00bqp\x00bqv\x00brrebra\x00brh\x00brx\x00brz\x00bsosbsj" + - "\x00bsq\x00bss\x00bst\x00bto\x00btt\x00btv\x00bua\x00buc\x00bud\x00bug" + - "\x00buk\x00bum\x00buo\x00bus\x00buu\x00bvb\x00bwd\x00bwr\x00bxh\x00bye" + - "\x00byn\x00byr\x00bys\x00byv\x00byx\x00bza\x00bze\x00bzf\x00bzh\x00bzw" + - "\x00caatcan\x00cbj\x00cch\x00ccp\x00ceheceb\x00cfa\x00cgg\x00chhachk\x00" + - "chm\x00cho\x00chp\x00chr\x00cja\x00cjm\x00cjv\x00ckb\x00ckl\x00cko\x00ck" + - "y\x00cla\x00cme\x00cooscop\x00cps\x00crrecrj\x00crk\x00crl\x00crm\x00crs" + - "\x00csescsb\x00csw\x00ctd\x00cuhucvhvcyymdaandad\x00daf\x00dag\x00dah" + - "\x00dak\x00dar\x00dav\x00dbd\x00dbq\x00dcc\x00ddn\x00deeuded\x00den\x00d" + - "ga\x00dgh\x00dgi\x00dgl\x00dgr\x00dgz\x00dia\x00dje\x00dnj\x00dob\x00doi" + - "\x00dop\x00dow\x00dri\x00drs\x00dsb\x00dtm\x00dtp\x00dts\x00dty\x00dua" + - "\x00duc\x00dud\x00dug\x00dvivdva\x00dww\x00dyo\x00dyu\x00dzzodzg\x00ebu" + - "\x00eeweefi\x00egl\x00egy\x00eky\x00elllema\x00emi\x00enngenn\x00enq\x00" + - "eopoeri\x00es\x00\x05esu\x00etstetr\x00ett\x00etu\x00etx\x00euusewo\x00e" + - "xt\x00faasfaa\x00fab\x00fag\x00fai\x00fan\x00ffulffi\x00ffm\x00fiinfia" + - "\x00fil\x00fit\x00fjijflr\x00fmp\x00foaofod\x00fon\x00for\x00fpe\x00fqs" + - "\x00frrafrc\x00frp\x00frr\x00frs\x00fub\x00fud\x00fue\x00fuf\x00fuh\x00f" + - "uq\x00fur\x00fuv\x00fuy\x00fvr\x00fyrygalegaa\x00gaf\x00gag\x00gah\x00ga" + - "j\x00gam\x00gan\x00gaw\x00gay\x00gbf\x00gbm\x00gby\x00gbz\x00gcr\x00gdla" + - "gde\x00gdn\x00gdr\x00geb\x00gej\x00gel\x00gez\x00gfk\x00ggn\x00ghs\x00gi" + - "l\x00gim\x00gjk\x00gjn\x00gju\x00gkn\x00gkp\x00gllgglk\x00gmm\x00gmv\x00" + - "gnrngnd\x00gng\x00god\x00gof\x00goi\x00gom\x00gon\x00gor\x00gos\x00got" + - "\x00grc\x00grt\x00grw\x00gsw\x00guujgub\x00guc\x00gud\x00gur\x00guw\x00g" + - "ux\x00guz\x00gvlvgvf\x00gvr\x00gvs\x00gwc\x00gwi\x00gwt\x00gyi\x00haauha" + - "g\x00hak\x00ham\x00haw\x00haz\x00hbb\x00hdy\x00heebhhy\x00hiinhia\x00hif" + - "\x00hig\x00hih\x00hil\x00hla\x00hlu\x00hmd\x00hmt\x00hnd\x00hne\x00hnj" + - "\x00hnn\x00hno\x00homohoc\x00hoj\x00hot\x00hrrvhsb\x00hsn\x00htathuunhui" + - "\x00hyyehzerianaian\x00iar\x00iba\x00ibb\x00iby\x00ica\x00ich\x00idndidd" + - "\x00idi\x00idu\x00ieleigboigb\x00ige\x00iiiiijj\x00ikpkikk\x00ikt\x00ikw" + - "\x00ikx\x00ilo\x00imo\x00inndinh\x00iodoiou\x00iri\x00isslittaiukuiw\x00" + - "\x03iwm\x00iws\x00izh\x00izi\x00japnjab\x00jam\x00jbo\x00jbu\x00jen\x00j" + - "gk\x00jgo\x00ji\x00\x06jib\x00jmc\x00jml\x00jra\x00jut\x00jvavjwavkaatka" + - "a\x00kab\x00kac\x00kad\x00kai\x00kaj\x00kam\x00kao\x00kbd\x00kbm\x00kbp" + - "\x00kbq\x00kbx\x00kby\x00kcg\x00kck\x00kcl\x00kct\x00kde\x00kdh\x00kdl" + - "\x00kdt\x00kea\x00ken\x00kez\x00kfo\x00kfr\x00kfy\x00kgonkge\x00kgf\x00k" + - "gp\x00kha\x00khb\x00khn\x00khq\x00khs\x00kht\x00khw\x00khz\x00kiikkij" + - "\x00kiu\x00kiw\x00kjuakjd\x00kjg\x00kjs\x00kjy\x00kkazkkc\x00kkj\x00klal" + - "kln\x00klq\x00klt\x00klx\x00kmhmkmb\x00kmh\x00kmo\x00kms\x00kmu\x00kmw" + - "\x00knanknp\x00koorkoi\x00kok\x00kol\x00kos\x00koz\x00kpe\x00kpf\x00kpo" + - "\x00kpr\x00kpx\x00kqb\x00kqf\x00kqs\x00kqy\x00kraukrc\x00kri\x00krj\x00k" + - "rl\x00krs\x00kru\x00ksasksb\x00ksd\x00ksf\x00ksh\x00ksj\x00ksr\x00ktb" + - "\x00ktm\x00kto\x00kuurkub\x00kud\x00kue\x00kuj\x00kum\x00kun\x00kup\x00k" + - "us\x00kvomkvg\x00kvr\x00kvx\x00kw\x00\x01kwj\x00kwo\x00kxa\x00kxc\x00kxm" + - "\x00kxp\x00kxw\x00kxz\x00kyirkye\x00kyx\x00kzr\x00laatlab\x00lad\x00lag" + - "\x00lah\x00laj\x00las\x00lbtzlbe\x00lbu\x00lbw\x00lcm\x00lcp\x00ldb\x00l" + - "ed\x00lee\x00lem\x00lep\x00leq\x00leu\x00lez\x00lguglgg\x00liimlia\x00li" + - "d\x00lif\x00lig\x00lih\x00lij\x00lis\x00ljp\x00lki\x00lkt\x00lle\x00lln" + - "\x00lmn\x00lmo\x00lmp\x00lninlns\x00lnu\x00loaoloj\x00lok\x00lol\x00lor" + - "\x00los\x00loz\x00lrc\x00ltitltg\x00luublua\x00luo\x00luy\x00luz\x00lvav" + - "lwl\x00lzh\x00lzz\x00mad\x00maf\x00mag\x00mai\x00mak\x00man\x00mas\x00ma" + - "w\x00maz\x00mbh\x00mbo\x00mbq\x00mbu\x00mbw\x00mci\x00mcp\x00mcq\x00mcr" + - "\x00mcu\x00mda\x00mde\x00mdf\x00mdh\x00mdj\x00mdr\x00mdx\x00med\x00mee" + - "\x00mek\x00men\x00mer\x00met\x00meu\x00mfa\x00mfe\x00mfn\x00mfo\x00mfq" + - "\x00mglgmgh\x00mgl\x00mgo\x00mgp\x00mgy\x00mhahmhi\x00mhl\x00mirimif\x00" + - "min\x00mis\x00miw\x00mkkdmki\x00mkl\x00mkp\x00mkw\x00mlalmle\x00mlp\x00m" + - "ls\x00mmo\x00mmu\x00mmx\x00mnonmna\x00mnf\x00mni\x00mnw\x00moolmoa\x00mo" + - "e\x00moh\x00mos\x00mox\x00mpp\x00mps\x00mpt\x00mpx\x00mql\x00mrarmrd\x00" + - "mrj\x00mro\x00mssamtltmtc\x00mtf\x00mti\x00mtr\x00mua\x00mul\x00mur\x00m" + - "us\x00mva\x00mvn\x00mvy\x00mwk\x00mwr\x00mwv\x00mxc\x00mxm\x00myyamyk" + - "\x00mym\x00myv\x00myw\x00myx\x00myz\x00mzk\x00mzm\x00mzn\x00mzp\x00mzw" + - "\x00mzz\x00naaunac\x00naf\x00nah\x00nak\x00nan\x00nap\x00naq\x00nas\x00n" + - "bobnca\x00nce\x00ncf\x00nch\x00nco\x00ncu\x00nddendc\x00nds\x00neepneb" + - "\x00new\x00nex\x00nfr\x00ngdonga\x00ngb\x00ngl\x00nhb\x00nhe\x00nhw\x00n" + - "if\x00nii\x00nij\x00nin\x00niu\x00niy\x00niz\x00njo\x00nkg\x00nko\x00nll" + - "dnmg\x00nmz\x00nnnonnf\x00nnh\x00nnk\x00nnm\x00noornod\x00noe\x00non\x00" + - "nop\x00nou\x00nqo\x00nrblnrb\x00nsk\x00nsn\x00nso\x00nss\x00ntm\x00ntr" + - "\x00nui\x00nup\x00nus\x00nuv\x00nux\x00nvavnwb\x00nxq\x00nxr\x00nyyanym" + - "\x00nyn\x00nzi\x00occiogc\x00ojjiokr\x00okv\x00omrmong\x00onn\x00ons\x00" + - "opm\x00orrioro\x00oru\x00osssosa\x00ota\x00otk\x00ozm\x00paanpag\x00pal" + - "\x00pam\x00pap\x00pau\x00pbi\x00pcd\x00pcm\x00pdc\x00pdt\x00ped\x00peo" + - "\x00pex\x00pfl\x00phl\x00phn\x00pilipil\x00pip\x00pka\x00pko\x00plolpla" + - "\x00pms\x00png\x00pnn\x00pnt\x00pon\x00ppo\x00pra\x00prd\x00prg\x00psusp" + - "ss\x00ptorptp\x00puu\x00pwa\x00quuequc\x00qug\x00rai\x00raj\x00rao\x00rc" + - "f\x00rej\x00rel\x00res\x00rgn\x00rhg\x00ria\x00rif\x00rjs\x00rkt\x00rmoh" + - "rmf\x00rmo\x00rmt\x00rmu\x00rnunrna\x00rng\x00roonrob\x00rof\x00roo\x00r" + - "ro\x00rtm\x00ruusrue\x00rug\x00rw\x00\x04rwk\x00rwo\x00ryu\x00saansaf" + - "\x00sah\x00saq\x00sas\x00sat\x00saz\x00sba\x00sbe\x00sbp\x00scrdsck\x00s" + - "cl\x00scn\x00sco\x00scs\x00sdndsdc\x00sdh\x00semesef\x00seh\x00sei\x00se" + - "s\x00sgagsga\x00sgs\x00sgw\x00sgz\x00sh\x00\x02shi\x00shk\x00shn\x00shu" + - "\x00siinsid\x00sig\x00sil\x00sim\x00sjr\x00sklkskc\x00skr\x00sks\x00sllv" + - "sld\x00sli\x00sll\x00sly\x00smmosma\x00smi\x00smj\x00smn\x00smp\x00smq" + - "\x00sms\x00snnasnc\x00snk\x00snp\x00snx\x00sny\x00soomsok\x00soq\x00sou" + - "\x00soy\x00spd\x00spl\x00sps\x00sqqisrrpsrb\x00srn\x00srr\x00srx\x00sssw" + - "ssd\x00ssg\x00ssy\x00stotstk\x00stq\x00suunsua\x00sue\x00suk\x00sur\x00s" + - "us\x00svweswwaswb\x00swc\x00swg\x00swp\x00swv\x00sxn\x00sxw\x00syl\x00sy" + - "r\x00szl\x00taamtaj\x00tal\x00tan\x00taq\x00tbc\x00tbd\x00tbf\x00tbg\x00" + - "tbo\x00tbw\x00tbz\x00tci\x00tcy\x00tdd\x00tdg\x00tdh\x00teelted\x00tem" + - "\x00teo\x00tet\x00tfi\x00tggktgc\x00tgo\x00tgu\x00thhathl\x00thq\x00thr" + - "\x00tiirtif\x00tig\x00tik\x00tim\x00tio\x00tiv\x00tkuktkl\x00tkr\x00tkt" + - "\x00tlgltlf\x00tlx\x00tly\x00tmh\x00tmy\x00tnsntnh\x00toontof\x00tog\x00" + - "toq\x00tpi\x00tpm\x00tpz\x00tqo\x00trurtru\x00trv\x00trw\x00tssotsd\x00t" + - "sf\x00tsg\x00tsj\x00tsw\x00ttatttd\x00tte\x00ttj\x00ttr\x00tts\x00ttt" + - "\x00tuh\x00tul\x00tum\x00tuq\x00tvd\x00tvl\x00tvu\x00twwitwh\x00twq\x00t" + - "xg\x00tyahtya\x00tyv\x00tzm\x00ubu\x00udm\x00ugiguga\x00ukkruli\x00umb" + - "\x00und\x00unr\x00unx\x00urrduri\x00urt\x00urw\x00usa\x00utr\x00uvh\x00u" + - "vl\x00uzzbvag\x00vai\x00van\x00veenvec\x00vep\x00viievic\x00viv\x00vls" + - "\x00vmf\x00vmw\x00voolvot\x00vro\x00vun\x00vut\x00walnwae\x00waj\x00wal" + - "\x00wan\x00war\x00wbp\x00wbq\x00wbr\x00wci\x00wer\x00wgi\x00whg\x00wib" + - "\x00wiu\x00wiv\x00wja\x00wji\x00wls\x00wmo\x00wnc\x00wni\x00wnu\x00woolw" + - "ob\x00wos\x00wrs\x00wsk\x00wtm\x00wuu\x00wuv\x00wwa\x00xav\x00xbi\x00xcr" + - "\x00xes\x00xhhoxla\x00xlc\x00xld\x00xmf\x00xmn\x00xmr\x00xna\x00xnr\x00x" + - "og\x00xon\x00xpr\x00xrb\x00xsa\x00xsi\x00xsm\x00xsr\x00xwe\x00yam\x00yao" + - "\x00yap\x00yas\x00yat\x00yav\x00yay\x00yaz\x00yba\x00ybb\x00yby\x00yer" + - "\x00ygr\x00ygw\x00yiidyko\x00yle\x00ylg\x00yll\x00yml\x00yooryon\x00yrb" + - "\x00yre\x00yrl\x00yss\x00yua\x00yue\x00yuj\x00yut\x00yuw\x00zahazag\x00z" + - "bl\x00zdj\x00zea\x00zgh\x00zhhozia\x00zlm\x00zmi\x00zne\x00zuulzxx\x00zz" + - "a\x00\xff\xff\xff\xff" - -const langNoIndexOffset = 1319 - -// langNoIndex is a bit vector of all 3-letter language codes that are not used as an index -// in lookup tables. The language ids for these language codes are derived directly -// from the letters and are not consecutive. -// Size: 2197 bytes, 2197 elements -var langNoIndex = [2197]uint8{ - // Entry 0 - 3F - 0xff, 0xf8, 0xed, 0xfe, 0xeb, 0xd7, 0x3b, 0xd2, - 0xfb, 0xbf, 0x7a, 0xfa, 0x37, 0x1d, 0x3c, 0x57, - 0x6e, 0x97, 0x73, 0x38, 0xfb, 0xea, 0xbf, 0x70, - 0xad, 0x03, 0xff, 0xff, 0xcf, 0x05, 0x84, 0x62, - 0xe9, 0xbf, 0xfd, 0xbf, 0xbf, 0xf7, 0xfd, 0x77, - 0x0f, 0xff, 0xef, 0x6f, 0xff, 0xfb, 0xdf, 0xe2, - 0xc9, 0xf8, 0x7f, 0x7e, 0x4d, 0xb8, 0x0a, 0x6a, - 0x7c, 0xea, 0xe3, 0xfa, 0x7a, 0xbf, 0x67, 0xff, - // Entry 40 - 7F - 0xff, 0xff, 0xff, 0xdf, 0x2a, 0x54, 0x91, 0xc0, - 0x5d, 0xe3, 0x97, 0x14, 0x07, 0x20, 0xdd, 0xed, - 0x9f, 0x3f, 0xc9, 0x21, 0xf8, 0x3f, 0x94, 0x35, - 0x7c, 0x5f, 0xff, 0x5f, 0x8e, 0x6e, 0xdf, 0xff, - 0xff, 0xff, 0x55, 0x7c, 0xd3, 0xfd, 0xbf, 0xb5, - 0x7b, 0xdf, 0x7f, 0xf7, 0xca, 0xfe, 0xdb, 0xa3, - 0xa8, 0xff, 0x1f, 0x67, 0x7f, 0xeb, 0xef, 0xce, - 0xff, 0xff, 0x9f, 0xff, 0xb7, 0xef, 0xfe, 0xcf, - // Entry 80 - BF - 0xdb, 0xff, 0xf3, 0xcd, 0xfb, 0x2f, 0xff, 0xff, - 0xbb, 0xee, 0xf7, 0xbd, 0xdb, 0xff, 0x5f, 0xf7, - 0xfd, 0xf2, 0xfd, 0xff, 0x5e, 0x2f, 0x3b, 0xba, - 0x7e, 0xff, 0xff, 0xfe, 0xf7, 0xff, 0xdd, 0xff, - 0xfd, 0xdf, 0xfb, 0xfe, 0x9d, 0xb4, 0xd3, 0xff, - 0xef, 0xff, 0xdf, 0xf7, 0x7f, 0xb7, 0xfd, 0xd5, - 0xa5, 0x77, 0x40, 0xff, 0x9c, 0xc1, 0x41, 0x2c, - 0x08, 0x20, 0x41, 0x00, 0x50, 0x40, 0x00, 0x80, - // Entry C0 - FF - 0xfb, 0x4a, 0xf2, 0x9f, 0xb4, 0x42, 0x41, 0x96, - 0x1b, 0x14, 0x08, 0xf2, 0x2b, 0xe7, 0x17, 0x56, - 0x45, 0x7d, 0x0e, 0x1c, 0x37, 0x71, 0xf3, 0xef, - 0x97, 0xff, 0x5d, 0x38, 0x64, 0x08, 0x00, 0x10, - 0xbc, 0x87, 0xaf, 0xdf, 0xff, 0xf7, 0x73, 0x35, - 0x3e, 0x87, 0xc7, 0xdf, 0xff, 0x00, 0x81, 0x00, - 0xb0, 0x05, 0x80, 0x00, 0x00, 0x00, 0x00, 0x03, - 0x40, 0x00, 0x40, 0x92, 0x21, 0x50, 0xb1, 0x5d, - // Entry 100 - 13F - 0xfd, 0xdc, 0xbe, 0x5e, 0x00, 0x00, 0x02, 0x64, - 0x0d, 0x19, 0x41, 0xdf, 0x79, 0x22, 0x00, 0x00, - 0x00, 0x5e, 0x64, 0xdc, 0x24, 0xe5, 0xd9, 0xe3, - 0xfe, 0xff, 0xfd, 0xcb, 0x9f, 0x14, 0x01, 0x0c, - 0x86, 0x00, 0xd1, 0x00, 0xf0, 0xc5, 0x67, 0x5f, - 0x56, 0x89, 0x5e, 0xb5, 0x6c, 0xaf, 0x03, 0x00, - 0x02, 0x00, 0x00, 0x00, 0xc0, 0x37, 0xda, 0x56, - 0x90, 0x69, 0x01, 0x2c, 0x96, 0x69, 0x20, 0xfb, - // Entry 140 - 17F - 0xff, 0x3f, 0x00, 0x00, 0x00, 0x01, 0x08, 0x16, - 0x01, 0x00, 0x00, 0xb0, 0x14, 0x03, 0x50, 0x06, - 0x0a, 0x00, 0x01, 0x00, 0x00, 0x00, 0x11, 0x09, - 0x00, 0x00, 0x60, 0x10, 0x00, 0x00, 0x00, 0x10, - 0x00, 0x00, 0x44, 0x00, 0x00, 0x10, 0x00, 0x04, - 0x08, 0x00, 0x00, 0x04, 0x00, 0x80, 0x28, 0x04, - 0x00, 0x00, 0x50, 0xd5, 0x2d, 0x00, 0x64, 0x35, - 0x24, 0x52, 0xf4, 0xd4, 0xbd, 0x62, 0xc9, 0x03, - // Entry 180 - 1BF - 0x00, 0x80, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x04, 0x13, 0x39, 0x01, 0xdd, 0x57, 0x98, - 0x21, 0x18, 0x81, 0x00, 0x00, 0x01, 0x40, 0x82, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x01, 0x40, 0x00, 0x44, 0x00, 0x00, 0x80, 0xea, - 0xa9, 0x39, 0x00, 0x02, 0x00, 0x00, 0x00, 0x04, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, - // Entry 1C0 - 1FF - 0x00, 0x01, 0x28, 0x05, 0x00, 0x00, 0x00, 0x00, - 0x04, 0x20, 0x04, 0xa6, 0x00, 0x04, 0x00, 0x00, - 0x81, 0x50, 0x00, 0x00, 0x00, 0x11, 0x84, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x55, - 0x02, 0x10, 0x08, 0x04, 0x00, 0x00, 0x00, 0x40, - 0x30, 0x83, 0x01, 0x00, 0x00, 0x00, 0x11, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x1e, 0xcd, 0xbf, 0x7e, 0xbf, - // Entry 200 - 23F - 0xdf, 0xc3, 0x83, 0x82, 0xc0, 0xfb, 0x57, 0x27, - 0xcd, 0x55, 0xe7, 0x01, 0x00, 0x20, 0xb2, 0xc5, - 0xa4, 0x45, 0x25, 0x9b, 0x02, 0xcf, 0xe0, 0xdf, - 0x03, 0x44, 0x08, 0x10, 0x01, 0x04, 0x01, 0xe3, - 0x92, 0x54, 0xdb, 0x28, 0xd1, 0x5f, 0xf6, 0x6d, - 0x79, 0xed, 0x1c, 0x7d, 0x04, 0x08, 0x00, 0x01, - 0x21, 0x12, 0x6c, 0x5f, 0xdd, 0x0e, 0x85, 0x4f, - 0x40, 0x40, 0x00, 0x04, 0xf1, 0xfd, 0x3d, 0x54, - // Entry 240 - 27F - 0xe8, 0x03, 0xb4, 0x27, 0x23, 0x0d, 0x00, 0x00, - 0x20, 0x7b, 0x38, 0x02, 0x05, 0x84, 0x00, 0xf0, - 0xbb, 0x7e, 0x5a, 0x00, 0x18, 0x04, 0x81, 0x00, - 0x00, 0x00, 0x80, 0x10, 0x90, 0x1c, 0x01, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x10, 0x40, 0x00, 0x04, - 0x08, 0xa0, 0x70, 0xa5, 0x0c, 0x40, 0x00, 0x00, - 0x11, 0x04, 0x04, 0x68, 0x00, 0x20, 0x70, 0xff, - 0x7b, 0x7f, 0x60, 0x00, 0x05, 0x9b, 0xdd, 0x66, - // Entry 280 - 2BF - 0x03, 0x00, 0x11, 0x00, 0x00, 0x00, 0x40, 0x05, - 0xb5, 0xb6, 0x80, 0x08, 0x04, 0x00, 0x04, 0x51, - 0xe2, 0xef, 0xfd, 0x3f, 0x05, 0x09, 0x08, 0x05, - 0x40, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x00, 0x81, 0x00, 0x60, - 0xe5, 0x48, 0x00, 0x81, 0x20, 0xc0, 0x05, 0x80, - 0x03, 0x00, 0x00, 0x00, 0xcc, 0x50, 0x40, 0x04, - 0x84, 0x47, 0x84, 0x40, 0x20, 0x10, 0x00, 0x20, - // Entry 2C0 - 2FF - 0x02, 0x50, 0x80, 0x11, 0x00, 0x91, 0x6c, 0xe2, - 0x50, 0x27, 0x1d, 0x11, 0x29, 0x06, 0x59, 0xe9, - 0x33, 0x08, 0x00, 0x20, 0x04, 0x40, 0x10, 0x00, - 0x00, 0x00, 0x50, 0x44, 0x92, 0x49, 0xd6, 0x5d, - 0xa7, 0x81, 0x47, 0x97, 0xfb, 0x00, 0x10, 0x00, - 0x08, 0x00, 0x80, 0x00, 0x40, 0x04, 0x00, 0x01, - 0x02, 0x00, 0x01, 0x40, 0x80, 0x00, 0x00, 0x08, - 0xd8, 0xeb, 0xf6, 0x39, 0xc4, 0x89, 0x12, 0x00, - // Entry 300 - 33F - 0x00, 0x0c, 0x04, 0x01, 0x20, 0x20, 0xdd, 0xa0, - 0x01, 0x00, 0x00, 0x00, 0x12, 0x00, 0x00, 0x00, - 0x04, 0x10, 0xd0, 0x9d, 0x95, 0x13, 0x04, 0x80, - 0x00, 0x01, 0xd0, 0x12, 0x40, 0x00, 0x10, 0xb0, - 0x10, 0x62, 0x4c, 0xd2, 0x02, 0x01, 0x4a, 0x00, - 0x46, 0x04, 0x00, 0x08, 0x02, 0x00, 0x20, 0x80, - 0x00, 0x80, 0x06, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x00, 0xf0, 0xd8, 0x6f, 0x15, 0x02, 0x08, 0x00, - // Entry 340 - 37F - 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x10, 0x01, - 0x00, 0x10, 0x00, 0x00, 0x00, 0xf0, 0x84, 0xe3, - 0xdd, 0xbf, 0xf9, 0xf9, 0x3b, 0x7f, 0x7f, 0xdb, - 0xfd, 0xfc, 0xfe, 0xdf, 0xff, 0xfd, 0xff, 0xf6, - 0xfb, 0xfc, 0xf7, 0x1f, 0xff, 0xb3, 0x6c, 0xff, - 0xd9, 0xad, 0xdf, 0xfe, 0xef, 0xba, 0xdf, 0xff, - 0xff, 0xff, 0xb7, 0xdd, 0x7d, 0xbf, 0xab, 0xff, - 0xfd, 0xfd, 0xdf, 0x2f, 0x9c, 0xdf, 0xf3, 0x6f, - // Entry 380 - 3BF - 0xdf, 0xdd, 0xff, 0xfb, 0xee, 0xd2, 0xab, 0x5f, - 0xd5, 0xdf, 0x7f, 0xff, 0xeb, 0xff, 0xe4, 0x4d, - 0xf9, 0xff, 0xfe, 0xf7, 0xfd, 0xdf, 0xfb, 0xbf, - 0xee, 0xdb, 0x6f, 0xef, 0xff, 0x7f, 0xff, 0xff, - 0xf7, 0x5f, 0xd3, 0x3b, 0xfd, 0xd9, 0xdf, 0xeb, - 0xbc, 0x08, 0x05, 0x24, 0xff, 0x07, 0x70, 0xfe, - 0xe6, 0x5e, 0x00, 0x08, 0x00, 0x83, 0x3d, 0x1b, - 0x06, 0xe6, 0x72, 0x60, 0xd1, 0x3c, 0x7f, 0x44, - // Entry 3C0 - 3FF - 0x02, 0x30, 0x9f, 0x7a, 0x16, 0xbd, 0x7f, 0x57, - 0xf2, 0xff, 0x31, 0xff, 0xf2, 0x1e, 0x90, 0xf7, - 0xf1, 0xf9, 0x45, 0x80, 0x01, 0x02, 0x00, 0x00, - 0x40, 0x54, 0x9f, 0x8a, 0xd9, 0xd9, 0x0e, 0x11, - 0x84, 0x51, 0xc0, 0xf3, 0xfb, 0x47, 0x00, 0x01, - 0x05, 0xd1, 0x50, 0x58, 0x00, 0x00, 0x00, 0x10, - 0x04, 0x02, 0x00, 0x00, 0x0a, 0x00, 0x17, 0xd2, - 0xb9, 0xfd, 0xfc, 0xba, 0xfe, 0xef, 0xc7, 0xbe, - // Entry 400 - 43F - 0x53, 0x6f, 0xdf, 0xe7, 0xdb, 0x65, 0xbb, 0x7f, - 0xfa, 0xff, 0x77, 0xf3, 0xef, 0xbf, 0xfd, 0xf7, - 0xdf, 0xdf, 0x9b, 0x7f, 0xff, 0xff, 0x7f, 0x6f, - 0xf7, 0xfb, 0xeb, 0xdf, 0xbc, 0xff, 0xbf, 0x6b, - 0x7b, 0xfb, 0xff, 0xce, 0x76, 0xbd, 0xf7, 0xf7, - 0xdf, 0xdc, 0xf7, 0xf7, 0xff, 0xdf, 0xf3, 0xfe, - 0xef, 0xff, 0xff, 0xff, 0xb6, 0x7f, 0x7f, 0xde, - 0xf7, 0xb9, 0xeb, 0x77, 0xff, 0xfb, 0xbf, 0xdf, - // Entry 440 - 47F - 0xfd, 0xfe, 0xfb, 0xff, 0xfe, 0xeb, 0x1f, 0x7d, - 0x2f, 0xfd, 0xb6, 0xb5, 0xa5, 0xfc, 0xff, 0xfd, - 0x7f, 0x4e, 0xbf, 0x8e, 0xae, 0xff, 0xee, 0xdf, - 0x7f, 0xf7, 0x73, 0x02, 0x02, 0x04, 0xfc, 0xf7, - 0xff, 0xb7, 0xd7, 0xef, 0xfe, 0xcd, 0xf5, 0xce, - 0xe2, 0x8e, 0xe7, 0xbf, 0xb7, 0xff, 0x56, 0xbd, - 0xcd, 0xff, 0xfb, 0xff, 0xdf, 0xd7, 0xea, 0xff, - 0xe5, 0x5f, 0x6d, 0x0f, 0xa7, 0x51, 0x04, 0x44, - // Entry 480 - 4BF - 0x13, 0x50, 0x5d, 0xaf, 0xa6, 0xfd, 0x99, 0xfb, - 0x63, 0x1d, 0x53, 0xff, 0xef, 0xb7, 0x35, 0x20, - 0x14, 0x00, 0x55, 0x51, 0x82, 0x65, 0xf5, 0x41, - 0xe2, 0xff, 0xfc, 0xdf, 0x00, 0x05, 0xc5, 0x05, - 0x00, 0x22, 0x00, 0x74, 0x69, 0x10, 0x08, 0x04, - 0x41, 0x00, 0x01, 0x06, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x51, 0x20, 0x05, 0x04, 0x01, 0x00, 0x00, - 0x06, 0x01, 0x20, 0x00, 0x18, 0x01, 0x92, 0xb1, - // Entry 4C0 - 4FF - 0xfd, 0x47, 0x49, 0x06, 0x95, 0x06, 0x57, 0xed, - 0xfb, 0x4c, 0x1c, 0x6b, 0x83, 0x04, 0x62, 0x40, - 0x00, 0x11, 0x42, 0x00, 0x00, 0x00, 0x54, 0x83, - 0xb8, 0x4f, 0x10, 0x8c, 0x89, 0x46, 0xde, 0xf7, - 0x13, 0x31, 0x00, 0x20, 0x00, 0x00, 0x00, 0x90, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x10, 0x00, - 0x01, 0x00, 0x00, 0xf0, 0x5b, 0xf4, 0xbe, 0x3d, - 0xba, 0xcf, 0xf7, 0xaf, 0x42, 0x04, 0x84, 0x41, - // Entry 500 - 53F - 0x30, 0xff, 0x79, 0x72, 0x04, 0x00, 0x00, 0x49, - 0x2d, 0x14, 0x27, 0x57, 0xed, 0xf1, 0x3f, 0xe7, - 0x3f, 0x00, 0x00, 0x02, 0xc6, 0xa0, 0x1e, 0xf8, - 0xbb, 0xff, 0xfd, 0xfb, 0xb7, 0xfd, 0xe5, 0xf7, - 0xfd, 0xfc, 0xd5, 0xed, 0x47, 0xf4, 0x7e, 0x10, - 0x01, 0x01, 0x84, 0x6d, 0xff, 0xf7, 0xdd, 0xf9, - 0x5b, 0x05, 0x86, 0xed, 0xf5, 0x77, 0xbd, 0x3c, - 0x00, 0x00, 0x00, 0x42, 0x71, 0x42, 0x00, 0x40, - // Entry 540 - 57F - 0x00, 0x00, 0x01, 0x43, 0x19, 0x00, 0x08, 0x00, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - // Entry 580 - 5BF - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xab, 0xbd, 0xe7, 0x57, 0xee, 0x13, 0x5d, - 0x09, 0xc1, 0x40, 0x21, 0xfa, 0x17, 0x01, 0x80, - 0x00, 0x00, 0x00, 0x00, 0xf0, 0xce, 0xfb, 0xbf, - 0x00, 0x23, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, - 0x00, 0x30, 0x15, 0xa3, 0x10, 0x00, 0x00, 0x00, - 0x11, 0x04, 0x16, 0x00, 0x00, 0x02, 0x00, 0x81, - 0xa3, 0x01, 0x50, 0x00, 0x00, 0x83, 0x11, 0x40, - // Entry 5C0 - 5FF - 0x00, 0x00, 0x00, 0xf0, 0xdd, 0x7b, 0x3e, 0x02, - 0xaa, 0x10, 0x5d, 0x98, 0x52, 0x00, 0x80, 0x20, - 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x02, 0x02, - 0x19, 0x00, 0x10, 0x02, 0x10, 0x61, 0x5a, 0x9d, - 0x31, 0x00, 0x00, 0x00, 0x01, 0x10, 0x02, 0x20, - 0x00, 0x00, 0x01, 0x00, 0x42, 0x00, 0x20, 0x00, - 0x00, 0x1f, 0xdf, 0xf2, 0xb9, 0xff, 0xfd, 0x3f, - 0x1f, 0x18, 0xcf, 0x9c, 0xbf, 0xaf, 0x5f, 0xfe, - // Entry 600 - 63F - 0x7b, 0x4b, 0x40, 0x10, 0xe1, 0xfd, 0xaf, 0xd9, - 0xb7, 0xf6, 0xfb, 0xb3, 0xc7, 0xff, 0x6f, 0xf1, - 0x73, 0xb1, 0x7f, 0x9f, 0x7f, 0xbd, 0xfc, 0xb7, - 0xee, 0x1c, 0xfa, 0xcb, 0xef, 0xdd, 0xf9, 0xbd, - 0x6e, 0xae, 0x55, 0xfd, 0x6e, 0x81, 0x76, 0x1f, - 0xd4, 0x77, 0xf5, 0x7d, 0xfb, 0xff, 0xeb, 0xfe, - 0xbe, 0x5f, 0x46, 0x1b, 0xe9, 0x5f, 0x50, 0x18, - 0x02, 0xfa, 0xf7, 0x9d, 0x15, 0x97, 0x05, 0x0f, - // Entry 640 - 67F - 0x75, 0xc4, 0x7d, 0x81, 0x82, 0xf1, 0x57, 0x6c, - 0xff, 0xe4, 0xef, 0x6f, 0xff, 0xfc, 0xdd, 0xde, - 0xfc, 0xfd, 0x76, 0x5f, 0x7a, 0x1f, 0x00, 0x98, - 0x02, 0xfb, 0xa3, 0xef, 0xf3, 0xd6, 0xf2, 0xff, - 0xb9, 0xda, 0x7d, 0x50, 0x1e, 0x15, 0x7b, 0xb4, - 0xf5, 0x3e, 0xff, 0xff, 0xf1, 0xf7, 0xff, 0xe7, - 0x5f, 0xff, 0xff, 0x9e, 0xdb, 0xf6, 0xd7, 0xb9, - 0xef, 0x27, 0x80, 0xbb, 0xc5, 0xff, 0xff, 0xe3, - // Entry 680 - 6BF - 0x97, 0x9d, 0xbf, 0x9f, 0xf7, 0xc7, 0xfd, 0x37, - 0xce, 0x7f, 0x04, 0x1d, 0x53, 0x7f, 0xf8, 0xda, - 0x5d, 0xce, 0x7d, 0x06, 0xb9, 0xea, 0x69, 0xa0, - 0x1a, 0x20, 0x00, 0x30, 0x02, 0x04, 0x24, 0x08, - 0x04, 0x00, 0x00, 0x40, 0xd4, 0x02, 0x04, 0x00, - 0x00, 0x04, 0x00, 0x04, 0x00, 0x20, 0x01, 0x06, - 0x50, 0x00, 0x08, 0x00, 0x00, 0x00, 0x24, 0x00, - 0x04, 0x00, 0x10, 0x8c, 0x58, 0xd5, 0x0d, 0x0f, - // Entry 6C0 - 6FF - 0x14, 0x4d, 0xf1, 0x16, 0x44, 0xd1, 0x42, 0x08, - 0x40, 0x00, 0x00, 0x40, 0x00, 0x08, 0x00, 0x00, - 0x00, 0xdc, 0xfb, 0xcb, 0x0e, 0x58, 0x08, 0x41, - 0x04, 0x20, 0x04, 0x00, 0x30, 0x12, 0x40, 0x00, - 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x80, 0x10, 0x10, 0xab, - 0x6d, 0x93, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x80, 0x80, 0x25, 0x00, 0x00, - // Entry 700 - 73F - 0x00, 0x00, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, - 0x80, 0x86, 0xc2, 0x00, 0x00, 0x00, 0x00, 0x01, - 0xdf, 0x18, 0x00, 0x00, 0x02, 0xf0, 0xfd, 0x79, - 0x3b, 0x00, 0x25, 0x00, 0x00, 0x00, 0x02, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, - 0x03, 0x00, 0x09, 0x20, 0x00, 0x00, 0x01, 0x00, - 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - // Entry 740 - 77F - 0x00, 0x00, 0x00, 0xef, 0xd5, 0xfd, 0xcf, 0x7e, - 0xa0, 0x11, 0x00, 0x00, 0x00, 0x92, 0x01, 0x44, - 0xcd, 0xf9, 0x5c, 0x00, 0x01, 0x00, 0x30, 0x04, - 0x04, 0x55, 0x00, 0x01, 0x04, 0xf4, 0x3f, 0x4a, - 0x01, 0x00, 0x00, 0xb0, 0x80, 0x00, 0x55, 0x55, - 0x97, 0x7c, 0x9f, 0x31, 0xcc, 0x68, 0xd1, 0x03, - 0xd5, 0x57, 0x27, 0x14, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x2c, 0xf7, 0xcb, 0x1f, 0x14, 0x60, - // Entry 780 - 7BF - 0x03, 0x68, 0x01, 0x10, 0x8b, 0x38, 0x8a, 0x01, - 0x00, 0x00, 0x20, 0x00, 0x24, 0x44, 0x00, 0x00, - 0x10, 0x03, 0x11, 0x02, 0x01, 0x00, 0x00, 0xf0, - 0xf5, 0xff, 0xd5, 0x97, 0xbc, 0x70, 0xd6, 0x78, - 0x78, 0x15, 0x50, 0x00, 0xa4, 0x84, 0xa9, 0x41, - 0x00, 0x00, 0x00, 0x6b, 0x39, 0x52, 0x74, 0x00, - 0xe8, 0x30, 0x90, 0x6a, 0x92, 0x00, 0x00, 0x02, - 0xff, 0xef, 0xff, 0x4b, 0x85, 0x53, 0xf4, 0xed, - // Entry 7C0 - 7FF - 0xdd, 0xbf, 0x72, 0x19, 0xc7, 0x0c, 0xd5, 0x42, - 0x54, 0xdd, 0x77, 0x14, 0x00, 0x80, 0x40, 0x56, - 0xcc, 0x16, 0x9e, 0xea, 0x35, 0x7d, 0xef, 0xff, - 0xbd, 0xa4, 0xaf, 0x01, 0x44, 0x18, 0x01, 0x4d, - 0x4e, 0x4a, 0x08, 0x50, 0x28, 0x30, 0xe0, 0x80, - 0x10, 0x20, 0x24, 0x00, 0xff, 0x2f, 0xd3, 0x60, - 0xfe, 0x01, 0x02, 0x88, 0x0a, 0x40, 0x16, 0x01, - 0x01, 0x15, 0x2b, 0x3c, 0x01, 0x00, 0x00, 0x10, - // Entry 800 - 83F - 0x90, 0x49, 0x41, 0x02, 0x02, 0x01, 0xe1, 0xbf, - 0xbf, 0x03, 0x00, 0x00, 0x10, 0xd4, 0xa3, 0xd1, - 0x40, 0x9c, 0x44, 0xdf, 0xf5, 0x8f, 0x66, 0xb3, - 0x55, 0x20, 0xd4, 0xc1, 0xd8, 0x30, 0x3d, 0x80, - 0x00, 0x00, 0x00, 0x04, 0xd4, 0x11, 0xc5, 0x84, - 0x2e, 0x50, 0x00, 0x22, 0x50, 0x6e, 0xbd, 0x93, - 0x07, 0x00, 0x20, 0x10, 0x84, 0xb2, 0x45, 0x10, - 0x06, 0x44, 0x00, 0x00, 0x12, 0x02, 0x11, 0x00, - // Entry 840 - 87F - 0xf0, 0xfb, 0xfd, 0x3f, 0x05, 0x00, 0x12, 0x81, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x02, - 0x00, 0x00, 0x00, 0x00, 0x03, 0x30, 0x02, 0x28, - 0x84, 0x00, 0x23, 0xc0, 0x23, 0x24, 0x00, 0x00, - 0x00, 0xcb, 0xe4, 0x3a, 0x42, 0x88, 0x14, 0xf1, - 0xef, 0xff, 0x7f, 0x12, 0x01, 0x01, 0x84, 0x50, - 0x07, 0xfc, 0xff, 0xff, 0x0f, 0x01, 0x00, 0x40, - 0x10, 0x38, 0x01, 0x01, 0x1c, 0x12, 0x40, 0xe1, - // Entry 880 - 8BF - 0x76, 0x16, 0x08, 0x03, 0x10, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x24, - 0x0a, 0x00, 0x80, 0x00, 0x00, -} - -// altLangISO3 holds an alphabetically sorted list of 3-letter language code alternatives -// to 2-letter language codes that cannot be derived using the method described above. -// Each 3-letter code is followed by its 1-byte langID. -const altLangISO3 tag.Index = "---\x00cor\x00hbs\x01heb\x02kin\x03spa\x04yid\x05\xff\xff\xff\xff" - -// altLangIndex is used to convert indexes in altLangISO3 to langIDs. -// Size: 12 bytes, 6 elements -var altLangIndex = [6]uint16{ - 0x0278, 0x03fd, 0x01f3, 0x03dc, 0x0139, 0x0200, -} - -// langAliasMap maps langIDs to their suggested replacements. -// Size: 644 bytes, 161 elements -var langAliasMap = [161]fromTo{ - 0: {from: 0x81, to: 0x87}, - 1: {from: 0x181, to: 0x1a7}, - 2: {from: 0x1eb, to: 0x1da}, - 3: {from: 0x1f3, to: 0x1b5}, - 4: {from: 0x200, to: 0x508}, - 5: {from: 0x207, to: 0x206}, - 6: {from: 0x307, to: 0x3d3}, - 7: {from: 0x33e, to: 0x366}, - 8: {from: 0x3fd, to: 0x428}, - 9: {from: 0x470, to: 0x14e}, - 10: {from: 0x486, to: 0x447}, - 11: {from: 0x498, to: 0x20}, - 12: {from: 0x533, to: 0x539}, - 13: {from: 0x584, to: 0x129}, - 14: {from: 0x625, to: 0x1ea6}, - 15: {from: 0x646, to: 0x427}, - 16: {from: 0x657, to: 0x427}, - 17: {from: 0x6e2, to: 0x39}, - 18: {from: 0x6ed, to: 0x1d0}, - 19: {from: 0x733, to: 0x2196}, - 20: {from: 0x7a8, to: 0x55}, - 21: {from: 0x7ae, to: 0x2990}, - 22: {from: 0x7ba, to: 0x57}, - 23: {from: 0x7db, to: 0x140}, - 24: {from: 0x801, to: 0x59}, - 25: {from: 0x80a, to: 0x8c}, - 26: {from: 0x873, to: 0x805}, - 27: {from: 0x8b8, to: 0xed8}, - 28: {from: 0x9e4, to: 0x328}, - 29: {from: 0xa2b, to: 0x2bc}, - 30: {from: 0xa32, to: 0xbd}, - 31: {from: 0xab3, to: 0x3317}, - 32: {from: 0xb2d, to: 0x51f}, - 33: {from: 0xb6a, to: 0x264f}, - 34: {from: 0xb73, to: 0xbb8}, - 35: {from: 0xb90, to: 0x444}, - 36: {from: 0xbb1, to: 0x421e}, - 37: {from: 0xbb4, to: 0x51f}, - 38: {from: 0xbf3, to: 0x2d9c}, - 39: {from: 0xc23, to: 0x3176}, - 40: {from: 0xcae, to: 0xf0}, - 41: {from: 0xcfd, to: 0xf6}, - 42: {from: 0xdbd, to: 0x116}, - 43: {from: 0xdcc, to: 0x324}, - 44: {from: 0xded, to: 0xdf0}, - 45: {from: 0xdf3, to: 0x526}, - 46: {from: 0xed4, to: 0x204f}, - 47: {from: 0xee3, to: 0x2e8f}, - 48: {from: 0xf2e, to: 0x35e}, - 49: {from: 0x10c5, to: 0x13b}, - 50: {from: 0x10f9, to: 0x2c7}, - 51: {from: 0x1195, to: 0x1e4}, - 52: {from: 0x126e, to: 0x20}, - 53: {from: 0x1419, to: 0x159}, - 54: {from: 0x1465, to: 0x149}, - 55: {from: 0x1514, to: 0xd90}, - 56: {from: 0x1518, to: 0x387}, - 57: {from: 0x1527, to: 0x16ba}, - 58: {from: 0x1575, to: 0x208}, - 59: {from: 0x1578, to: 0x109}, - 60: {from: 0x1598, to: 0x3ca4}, - 61: {from: 0x165f, to: 0x195}, - 62: {from: 0x16bd, to: 0x131}, - 63: {from: 0x16f5, to: 0x29ed}, - 64: {from: 0x170d, to: 0x18e}, - 65: {from: 0x171c, to: 0xf34}, - 66: {from: 0x176f, to: 0x1519}, - 67: {from: 0x17fe, to: 0x17ab}, - 68: {from: 0x180b, to: 0x18e8}, - 69: {from: 0x187f, to: 0x42c}, - 70: {from: 0x196e, to: 0x1cf6}, - 71: {from: 0x1a69, to: 0x2ba5}, - 72: {from: 0x1a7f, to: 0x1f0}, - 73: {from: 0x1b4f, to: 0x1f2}, - 74: {from: 0x1b7b, to: 0x150a}, - 75: {from: 0x202d, to: 0x37a6}, - 76: {from: 0x2032, to: 0x20d2}, - 77: {from: 0x204f, to: 0x302}, - 78: {from: 0x20d8, to: 0x26b}, - 79: {from: 0x20e3, to: 0x25a}, - 80: {from: 0x20e7, to: 0x225}, - 81: {from: 0x20ee, to: 0x24d}, - 82: {from: 0x2104, to: 0x21e0}, - 83: {from: 0x212a, to: 0x274}, - 84: {from: 0x218e, to: 0x11d}, - 85: {from: 0x21c3, to: 0x1556}, - 86: {from: 0x21db, to: 0x4fa}, - 87: {from: 0x21e9, to: 0x495}, - 88: {from: 0x2222, to: 0x11d}, - 89: {from: 0x222c, to: 0x11d}, - 90: {from: 0x2257, to: 0x91f}, - 91: {from: 0x230b, to: 0x321b}, - 92: {from: 0x2377, to: 0x335a}, - 93: {from: 0x2467, to: 0x2be}, - 94: {from: 0x24d9, to: 0x2f6}, - 95: {from: 0x24e5, to: 0x2f1}, - 96: {from: 0x24ef, to: 0x316}, - 97: {from: 0x2545, to: 0xb50}, - 98: {from: 0x259e, to: 0xe0}, - 99: {from: 0x2633, to: 0x2c7}, - 100: {from: 0x26be, to: 0x26a9}, - 101: {from: 0x26ee, to: 0x3bf}, - 102: {from: 0x271c, to: 0x3ca4}, - 103: {from: 0x275a, to: 0x26a9}, - 104: {from: 0x277e, to: 0x434d}, - 105: {from: 0x28e4, to: 0x282c}, - 106: {from: 0x2909, to: 0x348}, - 107: {from: 0x297b, to: 0x2d9c}, - 108: {from: 0x2b0f, to: 0x384}, - 109: {from: 0x2bf1, to: 0x38c}, - 110: {from: 0x2c34, to: 0x3ca4}, - 111: {from: 0x2cf1, to: 0x3b5}, - 112: {from: 0x2d08, to: 0x58c}, - 113: {from: 0x2d3c, to: 0x143}, - 114: {from: 0x2d3d, to: 0x143}, - 115: {from: 0x2df4, to: 0x2e8}, - 116: {from: 0x2dfd, to: 0x19c1}, - 117: {from: 0x2e0f, to: 0x2d8a}, - 118: {from: 0x2e16, to: 0x289}, - 119: {from: 0x2e49, to: 0x7c}, - 120: {from: 0x2e5a, to: 0x2277}, - 121: {from: 0x2e95, to: 0x2e90}, - 122: {from: 0x2ee4, to: 0x2ecc}, - 123: {from: 0x3188, to: 0x3bb}, - 124: {from: 0x335b, to: 0x3383}, - 125: {from: 0x341f, to: 0x3d3}, - 126: {from: 0x34e3, to: 0x18c5}, - 127: {from: 0x35db, to: 0x408}, - 128: {from: 0x364d, to: 0x23e}, - 129: {from: 0x366b, to: 0x3ea}, - 130: {from: 0x36f2, to: 0x43b}, - 131: {from: 0x37b5, to: 0x11d}, - 132: {from: 0x380b, to: 0x38e7}, - 133: {from: 0x3820, to: 0x2c90}, - 134: {from: 0x3824, to: 0xa7}, - 135: {from: 0x3827, to: 0x321d}, - 136: {from: 0x3861, to: 0x399b}, - 137: {from: 0x3887, to: 0x3fb5}, - 138: {from: 0x389a, to: 0x39cc}, - 139: {from: 0x38a9, to: 0x1f99}, - 140: {from: 0x38aa, to: 0x2e8f}, - 141: {from: 0x3951, to: 0x474}, - 142: {from: 0x3b43, to: 0xd86}, - 143: {from: 0x3b6d, to: 0x132}, - 144: {from: 0x3c8e, to: 0x4b2}, - 145: {from: 0x3fb2, to: 0xfc}, - 146: {from: 0x41fd, to: 0xa86}, - 147: {from: 0x42b3, to: 0x568}, - 148: {from: 0x42ee, to: 0x3f55}, - 149: {from: 0x436d, to: 0x251}, - 150: {from: 0x43c0, to: 0x36c0}, - 151: {from: 0x43c2, to: 0x10b}, - 152: {from: 0x44a4, to: 0x3317}, - 153: {from: 0x44d8, to: 0x508}, - 154: {from: 0x45bf, to: 0x23fe}, - 155: {from: 0x45d2, to: 0x26d1}, - 156: {from: 0x4605, to: 0x48a3}, - 157: {from: 0x46a3, to: 0x4695}, - 158: {from: 0x4733, to: 0x473a}, - 159: {from: 0x490b, to: 0x316}, - 160: {from: 0x499c, to: 0x519}, -} - -// Size: 161 bytes, 161 elements -var langAliasTypes = [161]langAliasType{ - // Entry 0 - 3F - 1, 0, 0, 0, 0, 0, 0, 1, 2, 2, 0, 1, 0, 0, 1, 2, - 1, 1, 2, 0, 1, 0, 1, 2, 1, 1, 0, 0, 2, 1, 1, 0, - 2, 0, 0, 1, 0, 1, 0, 0, 1, 2, 1, 1, 1, 1, 0, 0, - 2, 1, 1, 1, 1, 2, 1, 0, 1, 1, 2, 2, 0, 1, 2, 0, - // Entry 40 - 7F - 1, 0, 1, 1, 1, 1, 0, 0, 2, 1, 0, 0, 0, 1, 1, 1, - 1, 1, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 2, 2, - 2, 0, 1, 1, 0, 1, 0, 0, 0, 0, 1, 0, 1, 1, 0, 1, - 0, 2, 1, 1, 0, 0, 1, 0, 0, 0, 0, 1, 1, 2, 0, 2, - // Entry 80 - BF - 1, 1, 1, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 1, 1, 0, - 1, 2, 0, 0, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 1, 1, - 1, -} - const ( - _Latn = 82 - _Hani = 50 - _Hans = 52 - _Hant = 53 - _Qaaa = 131 - _Qaai = 139 - _Qabx = 180 - _Zinh = 224 - _Zyyy = 229 - _Zzzz = 230 + _Latn = 87 + _Hani = 54 + _Hans = 56 + _Hant = 57 + _Qaaa = 139 + _Qaai = 147 + _Qabx = 188 + _Zinh = 236 + _Zyyy = 241 + _Zzzz = 242 ) -// script is an alphabetically sorted list of ISO 15924 codes. The index -// of the script in the string, divided by 4, is the internal scriptID. -const script tag.Index = "" + // Size: 928 bytes - "----AdlmAfakAghbAhomArabAranArmiArmnAvstBaliBamuBassBatkBengBhksBlisBopo" + - "BrahBraiBugiBuhdCakmCansCariChamCherCirtCoptCprtCyrlCyrsDevaDsrtDuplEgyd" + - "EgyhEgypElbaEthiGeokGeorGlagGothGranGrekGujrGuruHanbHangHaniHanoHansHant" + - "HatrHebrHiraHluwHmngHrktHungIndsItalJamoJavaJpanJurcKaliKanaKharKhmrKhoj" + - "KitlKitsKndaKoreKpelKthiLanaLaooLatfLatgLatnLekeLepcLimbLinaLinbLisuLoma" + - "LyciLydiMahjMandManiMarcMayaMendMercMeroMlymModiMongMoonMrooMteiMultMymr" + - "NarbNbatNewaNkgbNkooNshuOgamOlckOrkhOryaOsgeOsmaPalmPaucPermPhagPhliPhlp" + - "PhlvPhnxPiqdPlrdPrtiQaaaQaabQaacQaadQaaeQaafQaagQaahQaaiQaajQaakQaalQaam" + - "QaanQaaoQaapQaaqQaarQaasQaatQaauQaavQaawQaaxQaayQaazQabaQabbQabcQabdQabe" + - "QabfQabgQabhQabiQabjQabkQablQabmQabnQaboQabpQabqQabrQabsQabtQabuQabvQabw" + - "QabxRjngRoroRunrSamrSaraSarbSaurSgnwShawShrdSiddSindSinhSoraSundSyloSyrc" + - "SyreSyrjSyrnTagbTakrTaleTaluTamlTangTavtTeluTengTfngTglgThaaThaiTibtTirh" + - "UgarVaiiVispWaraWoleXpeoXsuxYiiiZinhZmthZsyeZsymZxxxZyyyZzzz\xff\xff\xff" + - "\xff" - -// suppressScript is an index from langID to the dominant script for that language, -// if it exists. If a script is given, it should be suppressed from the language tag. -// Size: 1319 bytes, 1319 elements -var suppressScript = [1319]uint8{ +var regionToGroups = []uint8{ // 357 elements // Entry 0 - 3F - 0x00, 0x00, 0x00, 0x00, 0x00, 0x1e, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x52, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x27, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x04, 0x04, 0x00, 0x00, 0x04, + 0x00, 0x00, 0x00, 0x00, 0x04, 0x04, 0x04, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x04, 0x00, + 0x00, 0x04, 0x00, 0x00, 0x04, 0x01, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x04, 0x04, 0x00, 0x04, // Entry 40 - 7F - 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x52, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x1e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x1e, 0x00, 0x00, + 0x04, 0x04, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x04, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x04, 0x00, + 0x00, 0x04, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x04, 0x04, 0x00, 0x08, + 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x04, 0x00, // Entry 80 - BF - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x52, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, + 0x00, 0x04, 0x01, 0x00, 0x04, 0x02, 0x00, 0x04, + 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, + 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x08, 0x08, 0x00, 0x00, 0x00, 0x04, 0x00, // Entry C0 - FF + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x01, + 0x04, 0x08, 0x04, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x04, 0x00, 0x04, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x04, 0x00, 0x05, 0x00, 0x00, 0x00, + 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x52, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x52, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x52, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x52, 0x52, 0x00, 0x00, // Entry 100 - 13F 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x52, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x52, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0xd4, 0x00, 0x00, 0x00, - 0x00, 0xd6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x2d, 0x00, 0x00, 0x52, 0x00, 0x00, 0x52, - 0x00, 0x52, 0x00, 0x52, 0x00, 0x00, 0x00, 0x00, - // Entry 140 - 17F - 0x52, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x52, 0x00, 0x00, 0x00, - 0x52, 0x00, 0x00, 0x52, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x52, 0x00, 0x00, 0x52, 0x52, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x52, 0x52, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - // Entry 180 - 1BF - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x52, 0x00, 0x00, 0x00, 0x52, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x52, 0x2e, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x52, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x37, 0x00, 0x20, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - // Entry 1C0 - 1FF - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x52, 0x52, 0x00, 0x52, 0x52, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x52, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x52, 0x00, 0x00, 0x00, 0x00, - 0x52, 0x52, 0x00, 0x37, 0x00, 0x00, 0x00, 0x00, - 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - // Entry 200 - 23F - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x29, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x1e, 0x00, 0x00, 0x52, 0x00, 0x00, - // Entry 240 - 27F - 0x00, 0x00, 0x46, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x4a, 0x00, 0x4b, 0x00, 0x20, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - // Entry 280 - 2BF - 0x00, 0x00, 0x00, 0x00, 0x00, 0x52, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x52, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x52, 0x00, 0x00, 0x4f, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x52, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x52, 0x00, - // Entry 2C0 - 2FF - 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x52, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x52, 0x00, 0x00, 0x00, 0x00, 0x00, 0x52, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1e, 0x00, - 0x00, 0x00, 0x00, 0x64, 0x00, 0x00, 0x00, 0x00, - // Entry 300 - 33F - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x52, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x52, 0x52, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x6b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x52, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x52, 0x00, - // Entry 340 - 37F - 0x00, 0x00, 0x00, 0x00, 0x00, 0x52, 0x00, 0x52, - 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x52, 0x00, 0x00, 0x00, 0x00, 0x00, 0x52, 0x00, - 0x00, 0x52, 0x00, 0x00, 0x00, 0x00, 0x52, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x70, 0x52, 0x00, 0x00, - 0x00, 0x52, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x52, 0x00, - // Entry 380 - 3BF - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x52, - 0x00, 0x00, 0x00, 0x00, 0x75, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x2f, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x52, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x52, - 0x00, 0x00, 0x00, 0x52, 0x00, 0x00, 0x00, 0x00, - // Entry 3C0 - 3FF - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x52, 0x00, 0x00, 0x00, 0x00, - 0x52, 0x00, 0x00, 0x52, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x1e, 0x00, 0x00, 0x52, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x52, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - // Entry 400 - 43F - 0x00, 0x00, 0xc1, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x52, 0x00, 0x00, 0x00, 0x52, 0x00, 0x00, 0x00, - 0x00, 0x52, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x52, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x52, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x52, 0x00, 0x00, - 0x00, 0x52, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x52, 0x52, 0x00, 0x00, 0x00, 0x00, - // Entry 440 - 47F - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xcd, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xd0, - 0x00, 0x52, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0xd5, 0x00, 0x00, 0x00, 0x27, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x52, 0x00, 0x00, - 0x52, 0x00, 0x00, 0x00, 0x52, 0x00, 0x52, 0x00, - 0x52, 0x00, 0x00, 0x00, 0x52, 0x00, 0x00, 0x00, - // Entry 480 - 4BF - 0x52, 0x00, 0x00, 0x00, 0x52, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x52, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x1e, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x52, 0x00, - 0x00, 0x52, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - // Entry 4C0 - 4FF 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, + 0x00, 0x00, 0x04, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x08, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x01, 0x00, 0x05, 0x04, 0x00, + 0x00, 0x04, 0x00, 0x04, 0x04, 0x05, 0x00, 0x00, + // Entry 140 - 17F 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x52, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - // Entry 500 - 53F - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x37, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x52, 0x00, 0x00, -} - -const ( - _001 = 1 - _419 = 30 - _BR = 64 - _CA = 72 - _ES = 109 - _GB = 122 - _MD = 187 - _PT = 237 - _UK = 305 - _US = 308 - _ZZ = 356 - _XA = 322 - _XC = 324 - _XK = 332 -) - -// isoRegionOffset needs to be added to the index of regionISO to obtain the regionID -// for 2-letter ISO codes. (The first isoRegionOffset regionIDs are reserved for -// the UN.M49 codes used for groups.) -const isoRegionOffset = 31 - -// regionTypes defines the status of a region for various standards. -// Size: 357 bytes, 357 elements -var regionTypes = [357]uint8{ - // Entry 0 - 3F - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, - 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, - 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, - 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, - 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, - // Entry 40 - 7F - 0x06, 0x06, 0x06, 0x04, 0x06, 0x06, 0x06, 0x06, - 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, - 0x06, 0x06, 0x06, 0x06, 0x04, 0x06, 0x04, 0x00, - 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x04, 0x06, - 0x04, 0x06, 0x06, 0x06, 0x06, 0x00, 0x06, 0x04, - 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, - 0x04, 0x06, 0x06, 0x06, 0x06, 0x06, 0x00, 0x06, - 0x04, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, - // Entry 80 - BF - 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, - 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, - 0x06, 0x06, 0x00, 0x04, 0x06, 0x06, 0x06, 0x06, - 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, - 0x06, 0x06, 0x00, 0x06, 0x06, 0x06, 0x06, 0x06, - 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, - 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, - 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, - // Entry C0 - FF - 0x00, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, - 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, - 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x00, 0x06, - 0x06, 0x06, 0x06, 0x00, 0x06, 0x04, 0x06, 0x06, - 0x06, 0x06, 0x00, 0x06, 0x06, 0x06, 0x06, 0x06, - 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x00, 0x06, - 0x06, 0x00, 0x06, 0x05, 0x05, 0x05, 0x05, 0x05, - 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, - // Entry 100 - 13F - 0x05, 0x06, 0x00, 0x06, 0x06, 0x06, 0x06, 0x06, - 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, - 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, - 0x06, 0x06, 0x06, 0x06, 0x06, 0x04, 0x06, 0x06, - 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, - 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, - 0x06, 0x02, 0x06, 0x04, 0x06, 0x06, 0x06, 0x06, - 0x06, 0x00, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, - // Entry 140 - 17F - 0x00, 0x06, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, - 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, - 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, - 0x05, 0x05, 0x05, 0x05, 0x04, 0x06, 0x06, 0x04, - 0x06, 0x06, 0x04, 0x06, 0x05, -} - -// regionISO holds a list of alphabetically sorted 2-letter ISO region codes. -// Each 2-letter codes is followed by two bytes with the following meaning: -// - [A-Z}{2}: the first letter of the 2-letter code plus these two -// letters form the 3-letter ISO code. -// - 0, n: index into altRegionISO3. -const regionISO tag.Index = "" + // Size: 1308 bytes - "AAAAACSCADNDAEREAFFGAGTGAIIAALLBAMRMANNTAOGOAQTAARRGASSMATUTAUUSAWBWAXLA" + - "AZZEBAIHBBRBBDGDBEELBFFABGGRBHHRBIDIBJENBLLMBMMUBNRNBOOLBQESBRRABSHSBTTN" + - "BUURBVVTBWWABYLRBZLZCAANCCCKCDODCFAFCGOGCHHECIIVCKOKCLHLCMMRCNHNCOOLCPPT" + - "CRRICS\x00\x00CTTECUUBCVPVCWUWCXXRCYYPCZZEDDDRDEEUDGGADJJIDKNKDMMADOOMDY" + - "HYDZZAEA ECCUEESTEGGYEHSHERRIESSPETTHEU\x00\x03EZ FIINFJJIFKLKFMSMFORO" + - "FQ\x00\x18FRRAFXXXGAABGBBRGDRDGEEOGFUFGGGYGHHAGIIBGLRLGMMBGNINGPLPGQNQGR" + - "RCGS\x00\x06GTTMGUUMGWNBGYUYHKKGHMMDHNNDHRRVHTTIHUUNHVVOIC IDDNIERLILSR" + - "IMMNINNDIOOTIQRQIRRNISSLITTAJEEYJMAMJOORJPPNJTTNKEENKGGZKHHMKIIRKM\x00" + - "\x09KNNAKP\x00\x0cKRORKWWTKY\x00\x0fKZAZLAAOLBBNLCCALIIELKKALRBRLSSOLTTU" + - "LUUXLVVALYBYMAARMCCOMDDAMENEMFAFMGDGMHHLMIIDMKKDMLLIMMMRMNNGMOACMPNPMQTQ" + - "MRRTMSSRMTLTMUUSMVDVMWWIMXEXMYYSMZOZNAAMNCCLNEERNFFKNGGANHHBNIICNLLDNOOR" + - "NPPLNQ\x00\x1eNRRUNTTZNUIUNZZLOMMNPAANPCCIPEERPFYFPGNGPHHLPKAKPLOLPM\x00" + - "\x12PNCNPRRIPSSEPTRTPUUSPWLWPYRYPZCZQAATQMMMQNNNQOOOQPPPQQQQQRRRQSSSQTTT" + - "QU\x00\x03QVVVQWWWQXXXQYYYQZZZREEURHHOROOURS\x00\x15RUUSRWWASAAUSBLBSCYC" + - "SDDNSEWESGGPSHHNSIVNSJJMSKVKSLLESMMRSNENSOOMSRURSSSDSTTPSUUNSVLVSXXMSYYR" + - "SZWZTAAATCCATDCDTF\x00\x18TGGOTHHATJJKTKKLTLLSTMKMTNUNTOONTPMPTRURTTTOTV" + - "UVTWWNTZZAUAKRUGGAUK UMMIUN USSAUYRYUZZBVAATVCCTVDDRVEENVGGBVIIRVNNMVU" + - "UTWFLFWKAKWSSMXAAAXBBBXCCCXDDDXEEEXFFFXGGGXHHHXIIIXJJJXKKKXLLLXMMMXNNNXO" + - "OOXPPPXQQQXRRRXSSSXTTTXUUUXVVVXWWWXXXXXYYYXZZZYDMDYEEMYT\x00\x1bYUUGZAAF" + - "ZMMBZRARZWWEZZZZ\xff\xff\xff\xff" - -// altRegionISO3 holds a list of 3-letter region codes that cannot be -// mapped to 2-letter codes using the default algorithm. This is a short list. -const altRegionISO3 string = "SCGQUUSGSCOMPRKCYMSPMSRBATFMYTATN" - -// altRegionIDs holds a list of regionIDs the positions of which match those -// of the 3-letter ISO codes in altRegionISO3. -// Size: 22 bytes, 11 elements -var altRegionIDs = [11]uint16{ - 0x0056, 0x006f, 0x0087, 0x00a7, 0x00a9, 0x00ac, 0x00e9, 0x0104, - 0x0120, 0x015e, 0x00db, -} - -// Size: 80 bytes, 20 elements -var regionOldMap = [20]fromTo{ - 0: {from: 0x43, to: 0xc3}, - 1: {from: 0x57, to: 0xa6}, - 2: {from: 0x5e, to: 0x5f}, - 3: {from: 0x65, to: 0x3a}, - 4: {from: 0x78, to: 0x77}, - 5: {from: 0x92, to: 0x36}, - 6: {from: 0xa2, to: 0x132}, - 7: {from: 0xc0, to: 0x132}, - 8: {from: 0xd6, to: 0x13e}, - 9: {from: 0xdb, to: 0x2a}, - 10: {from: 0xee, to: 0x132}, - 11: {from: 0xf1, to: 0xe1}, - 12: {from: 0xfb, to: 0x6f}, - 13: {from: 0x102, to: 0x163}, - 14: {from: 0x129, to: 0x125}, - 15: {from: 0x131, to: 0x7a}, - 16: {from: 0x139, to: 0x13d}, - 17: {from: 0x140, to: 0x132}, - 18: {from: 0x15c, to: 0x15d}, - 19: {from: 0x162, to: 0x4a}, -} - -// m49 maps regionIDs to UN.M49 codes. The first isoRegionOffset entries are -// codes indicating collections of regions. -// Size: 714 bytes, 357 elements -var m49 = [357]int16{ - // Entry 0 - 3F - 0, 1, 2, 3, 5, 9, 11, 13, - 14, 15, 17, 18, 19, 21, 29, 30, - 34, 35, 39, 53, 54, 57, 61, 142, - 143, 145, 150, 151, 154, 155, 419, 958, - 0, 20, 784, 4, 28, 660, 8, 51, - 530, 24, 10, 32, 16, 40, 36, 533, - 248, 31, 70, 52, 50, 56, 854, 100, - 48, 108, 204, 652, 60, 96, 68, 535, - // Entry 40 - 7F - 76, 44, 64, 104, 74, 72, 112, 84, - 124, 166, 180, 140, 178, 756, 384, 184, - 152, 120, 156, 170, 0, 188, 891, 296, - 192, 132, 531, 162, 196, 203, 278, 276, - 0, 262, 208, 212, 214, 204, 12, 0, - 218, 233, 818, 732, 232, 724, 231, 967, - 0, 246, 242, 238, 583, 234, 0, 250, - 249, 266, 826, 308, 268, 254, 831, 288, - // Entry 80 - BF - 292, 304, 270, 324, 312, 226, 300, 239, - 320, 316, 624, 328, 344, 334, 340, 191, - 332, 348, 854, 0, 360, 372, 376, 833, - 356, 86, 368, 364, 352, 380, 832, 388, - 400, 392, 581, 404, 417, 116, 296, 174, - 659, 408, 410, 414, 136, 398, 418, 422, - 662, 438, 144, 430, 426, 440, 442, 428, - 434, 504, 492, 498, 499, 663, 450, 584, - // Entry C0 - FF - 581, 807, 466, 104, 496, 446, 580, 474, - 478, 500, 470, 480, 462, 454, 484, 458, - 508, 516, 540, 562, 574, 566, 548, 558, - 528, 578, 524, 10, 520, 536, 570, 554, - 512, 591, 0, 604, 258, 598, 608, 586, - 616, 666, 612, 630, 275, 620, 581, 585, - 600, 591, 634, 959, 960, 961, 962, 963, - 964, 965, 966, 967, 968, 969, 970, 971, - // Entry 100 - 13F - 972, 638, 716, 642, 688, 643, 646, 682, - 90, 690, 729, 752, 702, 654, 705, 744, - 703, 694, 674, 686, 706, 740, 728, 678, - 810, 222, 534, 760, 748, 0, 796, 148, - 260, 768, 764, 762, 772, 626, 795, 788, - 776, 626, 792, 780, 798, 158, 834, 804, - 800, 826, 581, 0, 840, 858, 860, 336, - 670, 704, 862, 92, 850, 704, 548, 876, - // Entry 140 - 17F - 581, 882, 973, 974, 975, 976, 977, 978, - 979, 980, 981, 982, 983, 984, 985, 986, - 987, 988, 989, 990, 991, 992, 993, 994, - 995, 996, 997, 998, 720, 887, 175, 891, - 710, 894, 180, 716, 999, -} - -// m49Index gives indexes into fromM49 based on the three most significant bits -// of a 10-bit UN.M49 code. To search an UN.M49 code in fromM49, search in -// fromM49[m49Index[msb39(code)]:m49Index[msb3(code)+1]] -// for an entry where the first 7 bits match the 7 lsb of the UN.M49 code. -// The region code is stored in the 9 lsb of the indexed value. -// Size: 18 bytes, 9 elements -var m49Index = [9]int16{ - 0, 59, 107, 142, 180, 219, 258, 290, - 332, -} - -// fromM49 contains entries to map UN.M49 codes to regions. See m49Index for details. -// Size: 664 bytes, 332 elements -var fromM49 = [332]uint16{ - // Entry 0 - 3F - 0x0201, 0x0402, 0x0603, 0x0823, 0x0a04, 0x1026, 0x1205, 0x142a, - 0x1606, 0x1866, 0x1a07, 0x1c08, 0x1e09, 0x202c, 0x220a, 0x240b, - 0x260c, 0x2821, 0x2a0d, 0x3029, 0x3824, 0x3a0e, 0x3c0f, 0x3e31, - 0x402b, 0x4410, 0x4611, 0x482e, 0x4e12, 0x502d, 0x5841, 0x6038, - 0x6434, 0x6627, 0x6833, 0x6a13, 0x6c14, 0x7035, 0x7215, 0x783c, - 0x7a16, 0x8042, 0x883e, 0x8c32, 0x9045, 0x9444, 0x9840, 0xa847, - 0xac99, 0xb508, 0xb93b, 0xc03d, 0xc837, 0xd0c3, 0xd839, 0xe046, - 0xe8a5, 0xf051, 0xf848, 0x0859, 0x10ac, 0x184b, 0x1c17, 0x1e18, - // Entry 40 - 7F - 0x20b2, 0x2219, 0x291f, 0x2c1a, 0x2e1b, 0x3050, 0x341c, 0x361d, - 0x3852, 0x3d2d, 0x445b, 0x4c49, 0x5453, 0x5ca7, 0x5f5e, 0x644c, - 0x684a, 0x704f, 0x7855, 0x7e8f, 0x8058, 0x885c, 0x965d, 0x983a, - 0xa062, 0xa863, 0xac64, 0xb468, 0xbd19, 0xc485, 0xcc6e, 0xce6e, - 0xd06c, 0xd269, 0xd475, 0xdc73, 0xde87, 0xe472, 0xec71, 0xf030, - 0xf278, 0xf477, 0xfc7d, 0x04e4, 0x0920, 0x0c61, 0x1479, 0x187c, - 0x1c82, 0x26ec, 0x285f, 0x2c5e, 0x305f, 0x407f, 0x4880, 0x50a6, - 0x5886, 0x6081, 0x687b, 0x7084, 0x7889, 0x8088, 0x8883, 0x908b, - // Entry 80 - BF - 0x9890, 0x9c8d, 0xa137, 0xa88e, 0xb08c, 0xb891, 0xc09c, 0xc898, - 0xd094, 0xd89b, 0xe09a, 0xe895, 0xf096, 0xf89d, 0x004e, 0x089f, - 0x10a1, 0x1cad, 0x20a0, 0x28a3, 0x30a9, 0x34aa, 0x3cab, 0x42a4, - 0x44ae, 0x461e, 0x4caf, 0x54b4, 0x58b7, 0x5cb3, 0x64b8, 0x6cb1, - 0x70b5, 0x74b6, 0x7cc5, 0x84be, 0x8ccd, 0x94cf, 0x9ccc, 0xa4c2, - 0xacca, 0xb4c7, 0xbcc8, 0xc0cb, 0xc8ce, 0xd8ba, 0xe0c4, 0xe4bb, - 0xe6bc, 0xe8c9, 0xf0b9, 0xf8d0, 0x00e0, 0x08d1, 0x10dc, 0x18da, - 0x20d8, 0x2428, 0x265a, 0x2a2f, 0x2d1a, 0x2e3f, 0x30dd, 0x38d2, - // Entry C0 - FF - 0x493e, 0x54df, 0x5cd7, 0x64d3, 0x6cd5, 0x74de, 0x7cd4, 0x84d9, - 0x88c6, 0x8b32, 0x8e74, 0x90bf, 0x92ef, 0x94e7, 0x9ee1, 0xace5, - 0xb0f0, 0xb8e3, 0xc0e6, 0xc8ea, 0xd0e8, 0xd8ed, 0xe08a, 0xe525, - 0xeceb, 0xf4f2, 0xfd01, 0x0503, 0x0705, 0x0d06, 0x183b, 0x1d0d, - 0x26a8, 0x2825, 0x2cb0, 0x2ebd, 0x34e9, 0x3d38, 0x4512, 0x4d17, - 0x5507, 0x5d13, 0x6104, 0x6509, 0x6d11, 0x7d0c, 0x7f10, 0x813d, - 0x830e, 0x8514, 0x8d60, 0x9963, 0xa15c, 0xa86d, 0xb116, 0xb30a, - 0xb86b, 0xc10a, 0xc915, 0xd10f, 0xd91c, 0xe10b, 0xe84d, 0xf11b, - // Entry 100 - 13F - 0xf523, 0xf922, 0x0121, 0x0924, 0x1128, 0x192b, 0x2022, 0x2927, - 0x312a, 0x3726, 0x391e, 0x3d2c, 0x4130, 0x492f, 0x4ec1, 0x5518, - 0x646a, 0x747a, 0x7e7e, 0x809e, 0x8297, 0x852e, 0x9134, 0xa53c, - 0xac36, 0xb535, 0xb936, 0xbd3a, 0xd93f, 0xe541, 0xed5d, 0xef5d, - 0xf656, 0xfd61, 0x7c1f, 0x7ef3, 0x80f4, 0x82f5, 0x84f6, 0x86f7, - 0x88f8, 0x8af9, 0x8cfa, 0x8e6f, 0x90fc, 0x92fd, 0x94fe, 0x96ff, - 0x9900, 0x9b42, 0x9d43, 0x9f44, 0xa145, 0xa346, 0xa547, 0xa748, - 0xa949, 0xab4a, 0xad4b, 0xaf4c, 0xb14d, 0xb34e, 0xb54f, 0xb750, - // Entry 140 - 17F - 0xb951, 0xbb52, 0xbd53, 0xbf54, 0xc155, 0xc356, 0xc557, 0xc758, - 0xc959, 0xcb5a, 0xcd5b, 0xcf64, -} - -// Size: 1463 bytes -var variantIndex = map[string]uint8{ - "1606nict": 0x0, - "1694acad": 0x1, - "1901": 0x2, - "1959acad": 0x3, - "1994": 0x45, - "1996": 0x4, - "abl1943": 0x5, - "alalc97": 0x47, - "aluku": 0x6, - "ao1990": 0x7, - "arevela": 0x8, - "arevmda": 0x9, - "baku1926": 0xa, - "balanka": 0xb, - "barla": 0xc, - "basiceng": 0xd, - "bauddha": 0xe, - "biscayan": 0xf, - "biske": 0x40, - "bohoric": 0x10, - "boont": 0x11, - "colb1945": 0x12, - "cornu": 0x13, - "dajnko": 0x14, - "ekavsk": 0x15, - "emodeng": 0x16, - "fonipa": 0x48, - "fonnapa": 0x49, - "fonupa": 0x4a, - "fonxsamp": 0x4b, - "hepburn": 0x17, - "heploc": 0x46, - "hognorsk": 0x18, - "ijekavsk": 0x19, - "itihasa": 0x1a, - "jauer": 0x1b, - "jyutping": 0x1c, - "kkcor": 0x1d, - "kociewie": 0x1e, - "kscor": 0x1f, - "laukika": 0x20, - "lipaw": 0x41, - "luna1918": 0x21, - "metelko": 0x22, - "monoton": 0x23, - "ndyuka": 0x24, - "nedis": 0x25, - "newfound": 0x26, - "njiva": 0x42, - "nulik": 0x27, - "osojs": 0x43, - "oxendict": 0x28, - "pamaka": 0x29, - "petr1708": 0x2a, - "pinyin": 0x2b, - "polyton": 0x2c, - "puter": 0x2d, - "rigik": 0x2e, - "rozaj": 0x2f, - "rumgr": 0x30, - "scotland": 0x31, - "scouse": 0x32, - "simple": 0x4c, - "solba": 0x44, - "sotav": 0x33, - "surmiran": 0x34, - "sursilv": 0x35, - "sutsilv": 0x36, - "tarask": 0x37, - "uccor": 0x38, - "ucrcor": 0x39, - "ulster": 0x3a, - "unifon": 0x3b, - "vaidika": 0x3c, - "valencia": 0x3d, - "vallader": 0x3e, - "wadegile": 0x3f, -} + 0x00, 0x00, 0x00, 0x00, 0x00, +} // Size: 381 bytes -// variantNumSpecialized is the number of specialized variants in variants. -const variantNumSpecialized = 71 - -// nRegionGroups is the number of region groups. -const nRegionGroups = 32 - -type likelyLangRegion struct { - lang uint16 - region uint16 -} - -// likelyScript is a lookup table, indexed by scriptID, for the most likely -// languages and regions given a script. -// Size: 928 bytes, 232 elements -var likelyScript = [232]likelyLangRegion{ - 1: {lang: 0x149, region: 0x83}, - 3: {lang: 0x299, region: 0x105}, - 4: {lang: 0x1e, region: 0x98}, - 5: {lang: 0x39, region: 0x6a}, - 7: {lang: 0x3a, region: 0x9b}, - 8: {lang: 0x1d0, region: 0x27}, - 9: {lang: 0x12, region: 0x9b}, - 10: {lang: 0x5a, region: 0x94}, - 11: {lang: 0x5f, region: 0x51}, - 12: {lang: 0xb7, region: 0xb3}, - 13: {lang: 0x62, region: 0x94}, - 14: {lang: 0xa3, region: 0x34}, - 15: {lang: 0x3e0, region: 0x98}, - 17: {lang: 0x51f, region: 0x12d}, - 18: {lang: 0x3a8, region: 0x98}, - 19: {lang: 0x159, region: 0x77}, - 20: {lang: 0xc0, region: 0x94}, - 21: {lang: 0x9b, region: 0xe6}, - 22: {lang: 0xd9, region: 0x34}, - 23: {lang: 0xf0, region: 0x48}, - 24: {lang: 0x4e6, region: 0x12a}, - 25: {lang: 0xe5, region: 0x13d}, - 26: {lang: 0xe3, region: 0x134}, - 28: {lang: 0xee, region: 0x6a}, - 29: {lang: 0x199, region: 0x5c}, - 30: {lang: 0x3d9, region: 0x105}, - 32: {lang: 0x1b7, region: 0x98}, - 34: {lang: 0x159, region: 0x77}, - 37: {lang: 0x12f, region: 0x6a}, - 38: {lang: 0x427, region: 0x26}, - 39: {lang: 0x26, region: 0x6e}, - 41: {lang: 0x208, region: 0x7c}, - 42: {lang: 0xfa, region: 0x37}, - 43: {lang: 0x198, region: 0x12f}, - 44: {lang: 0x3e0, region: 0x98}, - 45: {lang: 0x131, region: 0x86}, - 46: {lang: 0x19d, region: 0x98}, - 47: {lang: 0x394, region: 0x98}, - 48: {lang: 0x51f, region: 0x12d}, - 49: {lang: 0x24b, region: 0xaa}, - 50: {lang: 0x51f, region: 0x52}, - 51: {lang: 0x1c4, region: 0xe6}, - 52: {lang: 0x51f, region: 0x52}, - 53: {lang: 0x51f, region: 0x12d}, - 54: {lang: 0x2f4, region: 0x9a}, - 55: {lang: 0x1b5, region: 0x96}, - 56: {lang: 0x1f8, region: 0xa1}, - 57: {lang: 0x1be, region: 0x12a}, - 58: {lang: 0x1c3, region: 0xae}, - 60: {lang: 0x1ce, region: 0x91}, - 62: {lang: 0x13d, region: 0x9d}, - 63: {lang: 0x24b, region: 0xaa}, - 64: {lang: 0x206, region: 0x94}, - 65: {lang: 0x1f8, region: 0xa1}, - 67: {lang: 0x130, region: 0xc3}, - 68: {lang: 0x1f8, region: 0xa1}, - 69: {lang: 0x3b2, region: 0xe7}, - 70: {lang: 0x242, region: 0xa5}, - 71: {lang: 0x3f0, region: 0x98}, - 74: {lang: 0x249, region: 0x98}, - 75: {lang: 0x24b, region: 0xaa}, - 77: {lang: 0x87, region: 0x98}, - 78: {lang: 0x367, region: 0x122}, - 79: {lang: 0x2af, region: 0xae}, - 84: {lang: 0x296, region: 0x98}, - 85: {lang: 0x29f, region: 0x98}, - 86: {lang: 0x286, region: 0x86}, - 87: {lang: 0x199, region: 0x86}, - 88: {lang: 0x2a3, region: 0x52}, - 90: {lang: 0x4ea, region: 0x12a}, - 91: {lang: 0x4eb, region: 0x12a}, - 92: {lang: 0x1b7, region: 0x98}, - 93: {lang: 0x32e, region: 0x9b}, - 94: {lang: 0x4ed, region: 0x52}, - 95: {lang: 0xa7, region: 0x52}, - 97: {lang: 0x2df, region: 0x111}, - 98: {lang: 0x4ee, region: 0x10a}, - 99: {lang: 0x4ee, region: 0x10a}, - 100: {lang: 0x2fb, region: 0x98}, - 101: {lang: 0x312, region: 0x98}, - 102: {lang: 0x302, region: 0x52}, - 104: {lang: 0x315, region: 0x34}, - 105: {lang: 0x305, region: 0x98}, - 106: {lang: 0x40a, region: 0xe7}, - 107: {lang: 0x328, region: 0xc3}, - 108: {lang: 0x4ef, region: 0x107}, - 109: {lang: 0x3a, region: 0xa0}, - 110: {lang: 0x34a, region: 0xda}, - 112: {lang: 0x2c7, region: 0x83}, - 114: {lang: 0x3f9, region: 0x95}, - 115: {lang: 0x3e5, region: 0x98}, - 116: {lang: 0x392, region: 0xc4}, - 117: {lang: 0x38c, region: 0x98}, - 118: {lang: 0x390, region: 0x134}, - 119: {lang: 0x41f, region: 0x114}, - 120: {lang: 0x3a, region: 0x11b}, - 121: {lang: 0xf9, region: 0xc3}, - 122: {lang: 0x274, region: 0x105}, - 123: {lang: 0x2c0, region: 0x52}, - 124: {lang: 0x396, region: 0x9b}, - 125: {lang: 0x396, region: 0x52}, - 127: {lang: 0x3a4, region: 0xaf}, - 129: {lang: 0x1bf, region: 0x52}, - 130: {lang: 0x4f3, region: 0x9b}, - 181: {lang: 0x3c2, region: 0x94}, - 183: {lang: 0x369, region: 0x10b}, - 184: {lang: 0x416, region: 0x96}, - 186: {lang: 0x4f5, region: 0x15d}, - 187: {lang: 0x3e6, region: 0x98}, - 188: {lang: 0x44, region: 0x134}, - 189: {lang: 0x134, region: 0x7a}, - 190: {lang: 0x3e0, region: 0x98}, - 191: {lang: 0x3e0, region: 0x98}, - 192: {lang: 0x3f0, region: 0x98}, - 193: {lang: 0x402, region: 0xb2}, - 194: {lang: 0x429, region: 0x98}, - 195: {lang: 0x434, region: 0x94}, - 196: {lang: 0x443, region: 0x34}, - 197: {lang: 0x444, region: 0x9a}, - 201: {lang: 0x450, region: 0xe6}, - 202: {lang: 0x116, region: 0x98}, - 203: {lang: 0x454, region: 0x52}, - 204: {lang: 0x22a, region: 0x52}, - 205: {lang: 0x446, region: 0x98}, - 206: {lang: 0x49b, region: 0x52}, - 207: {lang: 0x9d, region: 0x13d}, - 208: {lang: 0x457, region: 0x98}, - 210: {lang: 0x51e, region: 0xb9}, - 211: {lang: 0x14e, region: 0xe6}, - 212: {lang: 0x124, region: 0xcc}, - 213: {lang: 0x461, region: 0x122}, - 214: {lang: 0xa7, region: 0x52}, - 215: {lang: 0x2c5, region: 0x98}, - 216: {lang: 0x4a3, region: 0x11b}, - 217: {lang: 0x4b4, region: 0xb3}, - 219: {lang: 0x1c7, region: 0x98}, - 221: {lang: 0x3a0, region: 0x9b}, - 222: {lang: 0x21, region: 0x9a}, - 223: {lang: 0x1e2, region: 0x52}, -} - -type likelyScriptRegion struct { - region uint16 - script uint8 - flags uint8 -} - -// likelyLang is a lookup table, indexed by langID, for the most likely -// scripts and regions given incomplete information. If more entries exist for a -// given language, region and script are the index and size respectively -// of the list in likelyLangList. -// Size: 5276 bytes, 1319 elements -var likelyLang = [1319]likelyScriptRegion{ - 0: {region: 0x134, script: 0x52, flags: 0x0}, - 1: {region: 0x6e, script: 0x52, flags: 0x0}, - 2: {region: 0x164, script: 0x52, flags: 0x0}, - 3: {region: 0x164, script: 0x52, flags: 0x0}, - 4: {region: 0x164, script: 0x52, flags: 0x0}, - 5: {region: 0x7c, script: 0x1e, flags: 0x0}, - 6: {region: 0x164, script: 0x52, flags: 0x0}, - 7: {region: 0x7f, script: 0x52, flags: 0x0}, - 8: {region: 0x164, script: 0x52, flags: 0x0}, - 9: {region: 0x164, script: 0x52, flags: 0x0}, - 10: {region: 0x164, script: 0x52, flags: 0x0}, - 11: {region: 0x94, script: 0x52, flags: 0x0}, - 12: {region: 0x130, script: 0x52, flags: 0x0}, - 13: {region: 0x7f, script: 0x52, flags: 0x0}, - 14: {region: 0x164, script: 0x52, flags: 0x0}, - 15: {region: 0x164, script: 0x52, flags: 0x0}, - 16: {region: 0x105, script: 0x1e, flags: 0x0}, - 17: {region: 0x164, script: 0x52, flags: 0x0}, - 18: {region: 0x9b, script: 0x9, flags: 0x0}, - 19: {region: 0x127, script: 0x5, flags: 0x0}, - 20: {region: 0x164, script: 0x52, flags: 0x0}, - 21: {region: 0x160, script: 0x52, flags: 0x0}, - 22: {region: 0x164, script: 0x52, flags: 0x0}, - 23: {region: 0x164, script: 0x52, flags: 0x0}, - 24: {region: 0x164, script: 0x52, flags: 0x0}, - 25: {region: 0x164, script: 0x52, flags: 0x0}, - 26: {region: 0x164, script: 0x52, flags: 0x0}, - 27: {region: 0x51, script: 0x52, flags: 0x0}, - 28: {region: 0x164, script: 0x52, flags: 0x0}, - 29: {region: 0x164, script: 0x52, flags: 0x0}, - 30: {region: 0x98, script: 0x4, flags: 0x0}, - 31: {region: 0x164, script: 0x52, flags: 0x0}, - 32: {region: 0x7f, script: 0x52, flags: 0x0}, - 33: {region: 0x9a, script: 0xde, flags: 0x0}, - 34: {region: 0x164, script: 0x52, flags: 0x0}, - 35: {region: 0x164, script: 0x52, flags: 0x0}, - 36: {region: 0x14c, script: 0x52, flags: 0x0}, - 37: {region: 0x105, script: 0x1e, flags: 0x0}, - 38: {region: 0x6e, script: 0x27, flags: 0x0}, - 39: {region: 0x164, script: 0x52, flags: 0x0}, - 40: {region: 0x164, script: 0x52, flags: 0x0}, - 41: {region: 0xd5, script: 0x52, flags: 0x0}, - 42: {region: 0x164, script: 0x52, flags: 0x0}, - 44: {region: 0x164, script: 0x52, flags: 0x0}, - 45: {region: 0x164, script: 0x52, flags: 0x0}, - 46: {region: 0x164, script: 0x52, flags: 0x0}, - 47: {region: 0x164, script: 0x52, flags: 0x0}, - 48: {region: 0x164, script: 0x52, flags: 0x0}, - 49: {region: 0x164, script: 0x52, flags: 0x0}, - 50: {region: 0x94, script: 0x52, flags: 0x0}, - 51: {region: 0x164, script: 0x5, flags: 0x0}, - 52: {region: 0x121, script: 0x5, flags: 0x0}, - 53: {region: 0x164, script: 0x52, flags: 0x0}, - 54: {region: 0x164, script: 0x52, flags: 0x0}, - 55: {region: 0x164, script: 0x52, flags: 0x0}, - 56: {region: 0x164, script: 0x52, flags: 0x0}, - 57: {region: 0x6a, script: 0x5, flags: 0x0}, - 58: {region: 0x0, script: 0x3, flags: 0x1}, - 59: {region: 0x164, script: 0x52, flags: 0x0}, - 60: {region: 0x50, script: 0x52, flags: 0x0}, - 61: {region: 0x3e, script: 0x52, flags: 0x0}, - 62: {region: 0x66, script: 0x5, flags: 0x0}, - 64: {region: 0xb9, script: 0x5, flags: 0x0}, - 65: {region: 0x6a, script: 0x5, flags: 0x0}, - 66: {region: 0x98, script: 0xe, flags: 0x0}, - 67: {region: 0x12e, script: 0x52, flags: 0x0}, - 68: {region: 0x134, script: 0xbc, flags: 0x0}, - 69: {region: 0x164, script: 0x52, flags: 0x0}, - 70: {region: 0x164, script: 0x52, flags: 0x0}, - 71: {region: 0x6d, script: 0x52, flags: 0x0}, - 72: {region: 0x164, script: 0x52, flags: 0x0}, - 73: {region: 0x164, script: 0x52, flags: 0x0}, - 74: {region: 0x48, script: 0x52, flags: 0x0}, - 75: {region: 0x164, script: 0x52, flags: 0x0}, - 76: {region: 0x105, script: 0x1e, flags: 0x0}, - 77: {region: 0x164, script: 0x5, flags: 0x0}, - 78: {region: 0x164, script: 0x52, flags: 0x0}, - 79: {region: 0x164, script: 0x52, flags: 0x0}, - 80: {region: 0x164, script: 0x52, flags: 0x0}, - 81: {region: 0x98, script: 0x20, flags: 0x0}, - 82: {region: 0x164, script: 0x52, flags: 0x0}, - 83: {region: 0x164, script: 0x52, flags: 0x0}, - 84: {region: 0x164, script: 0x52, flags: 0x0}, - 85: {region: 0x3e, script: 0x52, flags: 0x0}, - 86: {region: 0x164, script: 0x52, flags: 0x0}, - 87: {region: 0x3, script: 0x5, flags: 0x1}, - 88: {region: 0x105, script: 0x1e, flags: 0x0}, - 89: {region: 0xe7, script: 0x5, flags: 0x0}, - 90: {region: 0x94, script: 0x52, flags: 0x0}, - 91: {region: 0xda, script: 0x20, flags: 0x0}, - 92: {region: 0x2d, script: 0x52, flags: 0x0}, - 93: {region: 0x51, script: 0x52, flags: 0x0}, - 94: {region: 0x164, script: 0x52, flags: 0x0}, - 95: {region: 0x51, script: 0xb, flags: 0x0}, - 96: {region: 0x164, script: 0x52, flags: 0x0}, - 97: {region: 0x164, script: 0x52, flags: 0x0}, - 98: {region: 0x94, script: 0x52, flags: 0x0}, - 99: {region: 0x164, script: 0x52, flags: 0x0}, - 100: {region: 0x51, script: 0x52, flags: 0x0}, - 101: {region: 0x164, script: 0x52, flags: 0x0}, - 102: {region: 0x164, script: 0x52, flags: 0x0}, - 103: {region: 0x164, script: 0x52, flags: 0x0}, - 104: {region: 0x164, script: 0x52, flags: 0x0}, - 105: {region: 0x4e, script: 0x52, flags: 0x0}, - 106: {region: 0x164, script: 0x52, flags: 0x0}, - 107: {region: 0x164, script: 0x52, flags: 0x0}, - 108: {region: 0x164, script: 0x52, flags: 0x0}, - 109: {region: 0x164, script: 0x27, flags: 0x0}, - 110: {region: 0x164, script: 0x52, flags: 0x0}, - 111: {region: 0x164, script: 0x52, flags: 0x0}, - 112: {region: 0x46, script: 0x1e, flags: 0x0}, - 113: {region: 0x164, script: 0x52, flags: 0x0}, - 114: {region: 0x164, script: 0x52, flags: 0x0}, - 115: {region: 0x10a, script: 0x5, flags: 0x0}, - 116: {region: 0x161, script: 0x52, flags: 0x0}, - 117: {region: 0x164, script: 0x52, flags: 0x0}, - 118: {region: 0x94, script: 0x52, flags: 0x0}, - 119: {region: 0x164, script: 0x52, flags: 0x0}, - 120: {region: 0x12e, script: 0x52, flags: 0x0}, - 121: {region: 0x51, script: 0x52, flags: 0x0}, - 122: {region: 0x98, script: 0xcd, flags: 0x0}, - 123: {region: 0xe7, script: 0x5, flags: 0x0}, - 124: {region: 0x98, script: 0x20, flags: 0x0}, - 125: {region: 0x37, script: 0x1e, flags: 0x0}, - 126: {region: 0x98, script: 0x20, flags: 0x0}, - 127: {region: 0xe7, script: 0x5, flags: 0x0}, - 128: {region: 0x12a, script: 0x2d, flags: 0x0}, - 130: {region: 0x98, script: 0x20, flags: 0x0}, - 131: {region: 0x164, script: 0x52, flags: 0x0}, - 132: {region: 0x98, script: 0x20, flags: 0x0}, - 133: {region: 0xe6, script: 0x52, flags: 0x0}, - 134: {region: 0x164, script: 0x52, flags: 0x0}, - 135: {region: 0x98, script: 0x20, flags: 0x0}, - 136: {region: 0x164, script: 0x52, flags: 0x0}, - 137: {region: 0x13e, script: 0x52, flags: 0x0}, - 138: {region: 0x164, script: 0x52, flags: 0x0}, - 139: {region: 0x164, script: 0x52, flags: 0x0}, - 140: {region: 0xe6, script: 0x52, flags: 0x0}, - 141: {region: 0x164, script: 0x52, flags: 0x0}, - 142: {region: 0xd5, script: 0x52, flags: 0x0}, - 143: {region: 0x164, script: 0x52, flags: 0x0}, - 144: {region: 0x164, script: 0x52, flags: 0x0}, - 145: {region: 0x164, script: 0x52, flags: 0x0}, - 146: {region: 0x164, script: 0x27, flags: 0x0}, - 147: {region: 0x98, script: 0x20, flags: 0x0}, - 148: {region: 0x94, script: 0x52, flags: 0x0}, - 149: {region: 0x164, script: 0x52, flags: 0x0}, - 150: {region: 0x164, script: 0x52, flags: 0x0}, - 151: {region: 0x164, script: 0x52, flags: 0x0}, - 152: {region: 0x164, script: 0x52, flags: 0x0}, - 153: {region: 0x51, script: 0x52, flags: 0x0}, - 154: {region: 0x164, script: 0x52, flags: 0x0}, - 155: {region: 0xe6, script: 0x52, flags: 0x0}, - 156: {region: 0x164, script: 0x52, flags: 0x0}, - 157: {region: 0x13d, script: 0xcf, flags: 0x0}, - 158: {region: 0xc2, script: 0x52, flags: 0x0}, - 159: {region: 0x164, script: 0x52, flags: 0x0}, - 160: {region: 0x164, script: 0x52, flags: 0x0}, - 161: {region: 0xc2, script: 0x52, flags: 0x0}, - 162: {region: 0x164, script: 0x52, flags: 0x0}, - 163: {region: 0x34, script: 0xe, flags: 0x0}, - 164: {region: 0x164, script: 0x52, flags: 0x0}, - 165: {region: 0x164, script: 0x52, flags: 0x0}, - 166: {region: 0x164, script: 0x52, flags: 0x0}, - 167: {region: 0x52, script: 0xd6, flags: 0x0}, - 168: {region: 0x164, script: 0x52, flags: 0x0}, - 169: {region: 0x164, script: 0x52, flags: 0x0}, - 170: {region: 0x164, script: 0x52, flags: 0x0}, - 171: {region: 0x98, script: 0xe, flags: 0x0}, - 172: {region: 0x164, script: 0x52, flags: 0x0}, - 173: {region: 0x9b, script: 0x5, flags: 0x0}, - 174: {region: 0x164, script: 0x52, flags: 0x0}, - 175: {region: 0x4e, script: 0x52, flags: 0x0}, - 176: {region: 0x77, script: 0x52, flags: 0x0}, - 177: {region: 0x98, script: 0x20, flags: 0x0}, - 178: {region: 0xe7, script: 0x5, flags: 0x0}, - 179: {region: 0x98, script: 0x20, flags: 0x0}, - 180: {region: 0x164, script: 0x52, flags: 0x0}, - 181: {region: 0x32, script: 0x52, flags: 0x0}, - 182: {region: 0x164, script: 0x52, flags: 0x0}, - 183: {region: 0xb3, script: 0xc, flags: 0x0}, - 184: {region: 0x51, script: 0x52, flags: 0x0}, - 185: {region: 0x164, script: 0x27, flags: 0x0}, - 186: {region: 0xe6, script: 0x52, flags: 0x0}, - 187: {region: 0x164, script: 0x52, flags: 0x0}, - 188: {region: 0xe7, script: 0x20, flags: 0x0}, - 189: {region: 0x105, script: 0x1e, flags: 0x0}, - 190: {region: 0x15e, script: 0x52, flags: 0x0}, - 191: {region: 0x164, script: 0x52, flags: 0x0}, - 192: {region: 0x94, script: 0x52, flags: 0x0}, - 193: {region: 0x164, script: 0x52, flags: 0x0}, - 194: {region: 0x51, script: 0x52, flags: 0x0}, - 195: {region: 0x164, script: 0x52, flags: 0x0}, - 196: {region: 0x164, script: 0x52, flags: 0x0}, - 197: {region: 0x164, script: 0x52, flags: 0x0}, - 198: {region: 0x85, script: 0x52, flags: 0x0}, - 199: {region: 0x164, script: 0x52, flags: 0x0}, - 200: {region: 0x164, script: 0x52, flags: 0x0}, - 201: {region: 0x164, script: 0x52, flags: 0x0}, - 202: {region: 0x164, script: 0x52, flags: 0x0}, - 203: {region: 0x6c, script: 0x27, flags: 0x0}, - 204: {region: 0x164, script: 0x52, flags: 0x0}, - 205: {region: 0x164, script: 0x52, flags: 0x0}, - 206: {region: 0x51, script: 0x52, flags: 0x0}, - 207: {region: 0x164, script: 0x52, flags: 0x0}, - 208: {region: 0x164, script: 0x52, flags: 0x0}, - 209: {region: 0xc2, script: 0x52, flags: 0x0}, - 210: {region: 0x164, script: 0x52, flags: 0x0}, - 211: {region: 0x164, script: 0x52, flags: 0x0}, - 212: {region: 0x164, script: 0x52, flags: 0x0}, - 213: {region: 0x6d, script: 0x52, flags: 0x0}, - 214: {region: 0x164, script: 0x52, flags: 0x0}, - 215: {region: 0x164, script: 0x52, flags: 0x0}, - 216: {region: 0xd5, script: 0x52, flags: 0x0}, - 217: {region: 0x8, script: 0x2, flags: 0x1}, - 218: {region: 0x105, script: 0x1e, flags: 0x0}, - 219: {region: 0xe6, script: 0x52, flags: 0x0}, - 220: {region: 0x164, script: 0x52, flags: 0x0}, - 221: {region: 0x130, script: 0x52, flags: 0x0}, - 222: {region: 0x89, script: 0x52, flags: 0x0}, - 223: {region: 0x74, script: 0x52, flags: 0x0}, - 224: {region: 0x105, script: 0x1e, flags: 0x0}, - 225: {region: 0x134, script: 0x52, flags: 0x0}, - 226: {region: 0x48, script: 0x52, flags: 0x0}, - 227: {region: 0x134, script: 0x1a, flags: 0x0}, - 228: {region: 0xa5, script: 0x5, flags: 0x0}, - 229: {region: 0x13d, script: 0x19, flags: 0x0}, - 230: {region: 0x164, script: 0x52, flags: 0x0}, - 231: {region: 0x9a, script: 0x5, flags: 0x0}, - 232: {region: 0x164, script: 0x52, flags: 0x0}, - 233: {region: 0x164, script: 0x52, flags: 0x0}, - 234: {region: 0x164, script: 0x52, flags: 0x0}, - 235: {region: 0x164, script: 0x52, flags: 0x0}, - 236: {region: 0x164, script: 0x52, flags: 0x0}, - 237: {region: 0x77, script: 0x52, flags: 0x0}, - 238: {region: 0x6a, script: 0x1c, flags: 0x0}, - 239: {region: 0xe6, script: 0x52, flags: 0x0}, - 240: {region: 0x48, script: 0x17, flags: 0x0}, - 241: {region: 0x48, script: 0x17, flags: 0x0}, - 242: {region: 0x48, script: 0x17, flags: 0x0}, - 243: {region: 0x48, script: 0x17, flags: 0x0}, - 244: {region: 0x48, script: 0x17, flags: 0x0}, - 245: {region: 0x109, script: 0x52, flags: 0x0}, - 246: {region: 0x5d, script: 0x52, flags: 0x0}, - 247: {region: 0xe8, script: 0x52, flags: 0x0}, - 248: {region: 0x48, script: 0x17, flags: 0x0}, - 249: {region: 0xc3, script: 0x79, flags: 0x0}, - 250: {region: 0xa, script: 0x2, flags: 0x1}, - 251: {region: 0x105, script: 0x1e, flags: 0x0}, - 252: {region: 0x7a, script: 0x52, flags: 0x0}, - 253: {region: 0x62, script: 0x52, flags: 0x0}, - 254: {region: 0x164, script: 0x52, flags: 0x0}, - 255: {region: 0x164, script: 0x52, flags: 0x0}, - 256: {region: 0x164, script: 0x52, flags: 0x0}, - 257: {region: 0x164, script: 0x52, flags: 0x0}, - 258: {region: 0x134, script: 0x52, flags: 0x0}, - 259: {region: 0x105, script: 0x1e, flags: 0x0}, - 260: {region: 0xa3, script: 0x52, flags: 0x0}, - 261: {region: 0x164, script: 0x52, flags: 0x0}, - 262: {region: 0x164, script: 0x52, flags: 0x0}, - 263: {region: 0x98, script: 0x5, flags: 0x0}, - 264: {region: 0x164, script: 0x52, flags: 0x0}, - 265: {region: 0x5f, script: 0x52, flags: 0x0}, - 266: {region: 0x164, script: 0x52, flags: 0x0}, - 267: {region: 0x48, script: 0x52, flags: 0x0}, - 268: {region: 0x164, script: 0x52, flags: 0x0}, - 269: {region: 0x164, script: 0x52, flags: 0x0}, - 270: {region: 0x164, script: 0x52, flags: 0x0}, - 271: {region: 0x164, script: 0x5, flags: 0x0}, - 272: {region: 0x48, script: 0x52, flags: 0x0}, - 273: {region: 0x164, script: 0x52, flags: 0x0}, - 274: {region: 0x164, script: 0x52, flags: 0x0}, - 275: {region: 0xd3, script: 0x52, flags: 0x0}, - 276: {region: 0x4e, script: 0x52, flags: 0x0}, - 277: {region: 0x164, script: 0x52, flags: 0x0}, - 278: {region: 0x98, script: 0x5, flags: 0x0}, - 279: {region: 0x164, script: 0x52, flags: 0x0}, - 280: {region: 0x164, script: 0x52, flags: 0x0}, - 281: {region: 0x164, script: 0x52, flags: 0x0}, - 282: {region: 0x164, script: 0x27, flags: 0x0}, - 283: {region: 0x5f, script: 0x52, flags: 0x0}, - 284: {region: 0xc2, script: 0x52, flags: 0x0}, - 285: {region: 0xcf, script: 0x52, flags: 0x0}, - 286: {region: 0x164, script: 0x52, flags: 0x0}, - 287: {region: 0xda, script: 0x20, flags: 0x0}, - 288: {region: 0x51, script: 0x52, flags: 0x0}, - 289: {region: 0x164, script: 0x52, flags: 0x0}, - 290: {region: 0x164, script: 0x52, flags: 0x0}, - 291: {region: 0x164, script: 0x52, flags: 0x0}, - 292: {region: 0xcc, script: 0xd4, flags: 0x0}, - 293: {region: 0x164, script: 0x52, flags: 0x0}, - 294: {region: 0x164, script: 0x52, flags: 0x0}, - 295: {region: 0x113, script: 0x52, flags: 0x0}, - 296: {region: 0x36, script: 0x52, flags: 0x0}, - 297: {region: 0x42, script: 0xd6, flags: 0x0}, - 298: {region: 0x164, script: 0x52, flags: 0x0}, - 299: {region: 0xa3, script: 0x52, flags: 0x0}, - 300: {region: 0x7f, script: 0x52, flags: 0x0}, - 301: {region: 0xd5, script: 0x52, flags: 0x0}, - 302: {region: 0x9d, script: 0x52, flags: 0x0}, - 303: {region: 0x6a, script: 0x25, flags: 0x0}, - 304: {region: 0xc3, script: 0x43, flags: 0x0}, - 305: {region: 0x86, script: 0x2d, flags: 0x0}, - 306: {region: 0x164, script: 0x52, flags: 0x0}, - 307: {region: 0x164, script: 0x52, flags: 0x0}, - 308: {region: 0xc, script: 0x2, flags: 0x1}, - 309: {region: 0x164, script: 0x52, flags: 0x0}, - 310: {region: 0x164, script: 0x52, flags: 0x0}, - 311: {region: 0x1, script: 0x52, flags: 0x0}, - 312: {region: 0x164, script: 0x52, flags: 0x0}, - 313: {region: 0x6d, script: 0x52, flags: 0x0}, - 314: {region: 0x134, script: 0x52, flags: 0x0}, - 315: {region: 0x69, script: 0x52, flags: 0x0}, - 316: {region: 0x164, script: 0x52, flags: 0x0}, - 317: {region: 0x9d, script: 0x3e, flags: 0x0}, - 318: {region: 0x164, script: 0x52, flags: 0x0}, - 319: {region: 0x164, script: 0x52, flags: 0x0}, - 320: {region: 0x6d, script: 0x52, flags: 0x0}, - 321: {region: 0x51, script: 0x52, flags: 0x0}, - 322: {region: 0x6d, script: 0x52, flags: 0x0}, - 323: {region: 0x9b, script: 0x5, flags: 0x0}, - 324: {region: 0x164, script: 0x52, flags: 0x0}, - 325: {region: 0x164, script: 0x52, flags: 0x0}, - 326: {region: 0x164, script: 0x52, flags: 0x0}, - 327: {region: 0x164, script: 0x52, flags: 0x0}, - 328: {region: 0x85, script: 0x52, flags: 0x0}, - 329: {region: 0xe, script: 0x2, flags: 0x1}, - 330: {region: 0x164, script: 0x52, flags: 0x0}, - 331: {region: 0xc2, script: 0x52, flags: 0x0}, - 332: {region: 0x71, script: 0x52, flags: 0x0}, - 333: {region: 0x10a, script: 0x5, flags: 0x0}, - 334: {region: 0xe6, script: 0x52, flags: 0x0}, - 335: {region: 0x10b, script: 0x52, flags: 0x0}, - 336: {region: 0x72, script: 0x52, flags: 0x0}, - 337: {region: 0x164, script: 0x52, flags: 0x0}, - 338: {region: 0x164, script: 0x52, flags: 0x0}, - 339: {region: 0x75, script: 0x52, flags: 0x0}, - 340: {region: 0x164, script: 0x52, flags: 0x0}, - 341: {region: 0x3a, script: 0x52, flags: 0x0}, - 342: {region: 0x164, script: 0x52, flags: 0x0}, - 343: {region: 0x164, script: 0x52, flags: 0x0}, - 344: {region: 0x164, script: 0x52, flags: 0x0}, - 345: {region: 0x77, script: 0x52, flags: 0x0}, - 346: {region: 0x134, script: 0x52, flags: 0x0}, - 347: {region: 0x77, script: 0x52, flags: 0x0}, - 348: {region: 0x5f, script: 0x52, flags: 0x0}, - 349: {region: 0x5f, script: 0x52, flags: 0x0}, - 350: {region: 0x51, script: 0x5, flags: 0x0}, - 351: {region: 0x13f, script: 0x52, flags: 0x0}, - 352: {region: 0x164, script: 0x52, flags: 0x0}, - 353: {region: 0x83, script: 0x52, flags: 0x0}, - 354: {region: 0x164, script: 0x52, flags: 0x0}, - 355: {region: 0xd3, script: 0x52, flags: 0x0}, - 356: {region: 0x9d, script: 0x52, flags: 0x0}, - 357: {region: 0xd5, script: 0x52, flags: 0x0}, - 358: {region: 0x164, script: 0x52, flags: 0x0}, - 359: {region: 0x10a, script: 0x52, flags: 0x0}, - 360: {region: 0xd8, script: 0x52, flags: 0x0}, - 361: {region: 0x95, script: 0x52, flags: 0x0}, - 362: {region: 0x7f, script: 0x52, flags: 0x0}, - 363: {region: 0x164, script: 0x52, flags: 0x0}, - 364: {region: 0xbb, script: 0x52, flags: 0x0}, - 365: {region: 0x164, script: 0x52, flags: 0x0}, - 366: {region: 0x164, script: 0x52, flags: 0x0}, - 367: {region: 0x164, script: 0x52, flags: 0x0}, - 368: {region: 0x52, script: 0x34, flags: 0x0}, - 369: {region: 0x164, script: 0x52, flags: 0x0}, - 370: {region: 0x94, script: 0x52, flags: 0x0}, - 371: {region: 0x164, script: 0x52, flags: 0x0}, - 372: {region: 0x98, script: 0x20, flags: 0x0}, - 373: {region: 0x164, script: 0x52, flags: 0x0}, - 374: {region: 0x9b, script: 0x5, flags: 0x0}, - 375: {region: 0x7d, script: 0x52, flags: 0x0}, - 376: {region: 0x7a, script: 0x52, flags: 0x0}, - 377: {region: 0x164, script: 0x52, flags: 0x0}, - 378: {region: 0x164, script: 0x52, flags: 0x0}, - 379: {region: 0x164, script: 0x52, flags: 0x0}, - 380: {region: 0x164, script: 0x52, flags: 0x0}, - 381: {region: 0x164, script: 0x52, flags: 0x0}, - 382: {region: 0x164, script: 0x52, flags: 0x0}, - 383: {region: 0x6e, script: 0x27, flags: 0x0}, - 384: {region: 0x164, script: 0x52, flags: 0x0}, - 385: {region: 0xda, script: 0x20, flags: 0x0}, - 386: {region: 0x164, script: 0x52, flags: 0x0}, - 387: {region: 0xa6, script: 0x52, flags: 0x0}, - 388: {region: 0x164, script: 0x52, flags: 0x0}, - 389: {region: 0xe7, script: 0x5, flags: 0x0}, - 390: {region: 0x164, script: 0x52, flags: 0x0}, - 391: {region: 0xe7, script: 0x5, flags: 0x0}, - 392: {region: 0x164, script: 0x52, flags: 0x0}, - 393: {region: 0x164, script: 0x52, flags: 0x0}, - 394: {region: 0x6d, script: 0x52, flags: 0x0}, - 395: {region: 0x9b, script: 0x5, flags: 0x0}, - 396: {region: 0x164, script: 0x52, flags: 0x0}, - 397: {region: 0x164, script: 0x27, flags: 0x0}, - 398: {region: 0xf0, script: 0x52, flags: 0x0}, - 399: {region: 0x164, script: 0x52, flags: 0x0}, - 400: {region: 0x164, script: 0x52, flags: 0x0}, - 401: {region: 0x164, script: 0x52, flags: 0x0}, - 402: {region: 0x164, script: 0x27, flags: 0x0}, - 403: {region: 0x164, script: 0x52, flags: 0x0}, - 404: {region: 0x98, script: 0x20, flags: 0x0}, - 405: {region: 0x98, script: 0xd0, flags: 0x0}, - 406: {region: 0x94, script: 0x52, flags: 0x0}, - 407: {region: 0xd8, script: 0x52, flags: 0x0}, - 408: {region: 0x12f, script: 0x2b, flags: 0x0}, - 409: {region: 0x10, script: 0x2, flags: 0x1}, - 410: {region: 0x98, script: 0xe, flags: 0x0}, - 411: {region: 0x164, script: 0x52, flags: 0x0}, - 412: {region: 0x4d, script: 0x52, flags: 0x0}, - 413: {region: 0x98, script: 0x2e, flags: 0x0}, - 414: {region: 0x40, script: 0x52, flags: 0x0}, - 415: {region: 0x53, script: 0x52, flags: 0x0}, - 416: {region: 0x164, script: 0x52, flags: 0x0}, - 417: {region: 0x7f, script: 0x52, flags: 0x0}, - 418: {region: 0x164, script: 0x52, flags: 0x0}, - 419: {region: 0x164, script: 0x52, flags: 0x0}, - 420: {region: 0xa3, script: 0x52, flags: 0x0}, - 421: {region: 0x97, script: 0x52, flags: 0x0}, - 422: {region: 0x164, script: 0x52, flags: 0x0}, - 423: {region: 0xda, script: 0x20, flags: 0x0}, - 424: {region: 0x164, script: 0x52, flags: 0x0}, - 425: {region: 0x164, script: 0x5, flags: 0x0}, - 426: {region: 0x48, script: 0x52, flags: 0x0}, - 427: {region: 0x164, script: 0x5, flags: 0x0}, - 428: {region: 0x164, script: 0x52, flags: 0x0}, - 429: {region: 0x12, script: 0x3, flags: 0x1}, - 430: {region: 0x164, script: 0x52, flags: 0x0}, - 431: {region: 0x52, script: 0x34, flags: 0x0}, - 432: {region: 0x164, script: 0x52, flags: 0x0}, - 433: {region: 0x134, script: 0x52, flags: 0x0}, - 434: {region: 0x23, script: 0x5, flags: 0x0}, - 435: {region: 0x164, script: 0x52, flags: 0x0}, - 436: {region: 0x164, script: 0x27, flags: 0x0}, - 437: {region: 0x96, script: 0x37, flags: 0x0}, - 438: {region: 0x164, script: 0x52, flags: 0x0}, - 439: {region: 0x98, script: 0x20, flags: 0x0}, - 440: {region: 0x164, script: 0x52, flags: 0x0}, - 441: {region: 0x72, script: 0x52, flags: 0x0}, - 442: {region: 0x164, script: 0x52, flags: 0x0}, - 443: {region: 0x164, script: 0x52, flags: 0x0}, - 444: {region: 0xe6, script: 0x52, flags: 0x0}, - 445: {region: 0x164, script: 0x52, flags: 0x0}, - 446: {region: 0x12a, script: 0x39, flags: 0x0}, - 447: {region: 0x52, script: 0x81, flags: 0x0}, - 448: {region: 0x164, script: 0x52, flags: 0x0}, - 449: {region: 0xe7, script: 0x5, flags: 0x0}, - 450: {region: 0x98, script: 0x20, flags: 0x0}, - 451: {region: 0xae, script: 0x3a, flags: 0x0}, - 452: {region: 0xe6, script: 0x52, flags: 0x0}, - 453: {region: 0xe7, script: 0x5, flags: 0x0}, - 454: {region: 0xe5, script: 0x52, flags: 0x0}, - 455: {region: 0x98, script: 0x20, flags: 0x0}, - 456: {region: 0x98, script: 0x20, flags: 0x0}, - 457: {region: 0x164, script: 0x52, flags: 0x0}, - 458: {region: 0x8f, script: 0x52, flags: 0x0}, - 459: {region: 0x5f, script: 0x52, flags: 0x0}, - 460: {region: 0x52, script: 0x34, flags: 0x0}, - 461: {region: 0x90, script: 0x52, flags: 0x0}, - 462: {region: 0x91, script: 0x52, flags: 0x0}, - 463: {region: 0x164, script: 0x52, flags: 0x0}, - 464: {region: 0x27, script: 0x8, flags: 0x0}, - 465: {region: 0xd1, script: 0x52, flags: 0x0}, - 466: {region: 0x77, script: 0x52, flags: 0x0}, - 467: {region: 0x164, script: 0x52, flags: 0x0}, - 468: {region: 0x164, script: 0x52, flags: 0x0}, - 469: {region: 0xcf, script: 0x52, flags: 0x0}, - 470: {region: 0xd5, script: 0x52, flags: 0x0}, - 471: {region: 0x164, script: 0x52, flags: 0x0}, - 472: {region: 0x164, script: 0x52, flags: 0x0}, - 473: {region: 0x164, script: 0x52, flags: 0x0}, - 474: {region: 0x94, script: 0x52, flags: 0x0}, - 475: {region: 0x164, script: 0x52, flags: 0x0}, - 476: {region: 0x164, script: 0x52, flags: 0x0}, - 477: {region: 0x164, script: 0x52, flags: 0x0}, - 479: {region: 0xd5, script: 0x52, flags: 0x0}, - 480: {region: 0x164, script: 0x52, flags: 0x0}, - 481: {region: 0x164, script: 0x52, flags: 0x0}, - 482: {region: 0x52, script: 0xdf, flags: 0x0}, - 483: {region: 0x164, script: 0x52, flags: 0x0}, - 484: {region: 0x134, script: 0x52, flags: 0x0}, - 485: {region: 0x164, script: 0x52, flags: 0x0}, - 486: {region: 0x48, script: 0x52, flags: 0x0}, - 487: {region: 0x164, script: 0x52, flags: 0x0}, - 488: {region: 0x164, script: 0x52, flags: 0x0}, - 489: {region: 0xe6, script: 0x52, flags: 0x0}, - 490: {region: 0x164, script: 0x52, flags: 0x0}, - 491: {region: 0x94, script: 0x52, flags: 0x0}, - 492: {region: 0x105, script: 0x1e, flags: 0x0}, - 494: {region: 0x164, script: 0x52, flags: 0x0}, - 495: {region: 0x164, script: 0x52, flags: 0x0}, - 496: {region: 0x9c, script: 0x52, flags: 0x0}, - 497: {region: 0x9d, script: 0x52, flags: 0x0}, - 498: {region: 0x48, script: 0x17, flags: 0x0}, - 499: {region: 0x96, script: 0x37, flags: 0x0}, - 500: {region: 0x164, script: 0x52, flags: 0x0}, - 501: {region: 0x164, script: 0x52, flags: 0x0}, - 502: {region: 0x105, script: 0x52, flags: 0x0}, - 503: {region: 0x164, script: 0x52, flags: 0x0}, - 504: {region: 0xa1, script: 0x41, flags: 0x0}, - 505: {region: 0x164, script: 0x52, flags: 0x0}, - 506: {region: 0x9f, script: 0x52, flags: 0x0}, - 508: {region: 0x164, script: 0x52, flags: 0x0}, - 509: {region: 0x164, script: 0x52, flags: 0x0}, - 510: {region: 0x164, script: 0x52, flags: 0x0}, - 511: {region: 0x51, script: 0x52, flags: 0x0}, - 512: {region: 0x12f, script: 0x37, flags: 0x0}, - 513: {region: 0x164, script: 0x52, flags: 0x0}, - 514: {region: 0x12e, script: 0x52, flags: 0x0}, - 515: {region: 0xda, script: 0x20, flags: 0x0}, - 516: {region: 0x164, script: 0x52, flags: 0x0}, - 517: {region: 0x62, script: 0x52, flags: 0x0}, - 518: {region: 0x94, script: 0x52, flags: 0x0}, - 519: {region: 0x94, script: 0x52, flags: 0x0}, - 520: {region: 0x7c, script: 0x29, flags: 0x0}, - 521: {region: 0x136, script: 0x1e, flags: 0x0}, - 522: {region: 0x66, script: 0x52, flags: 0x0}, - 523: {region: 0xc3, script: 0x52, flags: 0x0}, - 524: {region: 0x164, script: 0x52, flags: 0x0}, - 525: {region: 0x164, script: 0x52, flags: 0x0}, - 526: {region: 0xd5, script: 0x52, flags: 0x0}, - 527: {region: 0xa3, script: 0x52, flags: 0x0}, - 528: {region: 0xc2, script: 0x52, flags: 0x0}, - 529: {region: 0x105, script: 0x1e, flags: 0x0}, - 530: {region: 0x164, script: 0x52, flags: 0x0}, - 531: {region: 0x164, script: 0x52, flags: 0x0}, - 532: {region: 0x164, script: 0x52, flags: 0x0}, - 533: {region: 0x164, script: 0x52, flags: 0x0}, - 534: {region: 0xd3, script: 0x5, flags: 0x0}, - 535: {region: 0xd5, script: 0x52, flags: 0x0}, - 536: {region: 0x163, script: 0x52, flags: 0x0}, - 537: {region: 0x164, script: 0x52, flags: 0x0}, - 538: {region: 0x164, script: 0x52, flags: 0x0}, - 539: {region: 0x12e, script: 0x52, flags: 0x0}, - 540: {region: 0x121, script: 0x5, flags: 0x0}, - 541: {region: 0x164, script: 0x52, flags: 0x0}, - 542: {region: 0x122, script: 0xd5, flags: 0x0}, - 543: {region: 0x59, script: 0x52, flags: 0x0}, - 544: {region: 0x51, script: 0x52, flags: 0x0}, - 545: {region: 0x164, script: 0x52, flags: 0x0}, - 546: {region: 0x4e, script: 0x52, flags: 0x0}, - 547: {region: 0x98, script: 0x20, flags: 0x0}, - 548: {region: 0x98, script: 0x20, flags: 0x0}, - 549: {region: 0x4a, script: 0x52, flags: 0x0}, - 550: {region: 0x94, script: 0x52, flags: 0x0}, - 551: {region: 0x164, script: 0x52, flags: 0x0}, - 552: {region: 0x40, script: 0x52, flags: 0x0}, - 553: {region: 0x98, script: 0x52, flags: 0x0}, - 554: {region: 0x52, script: 0xcc, flags: 0x0}, - 555: {region: 0x98, script: 0x20, flags: 0x0}, - 556: {region: 0xc2, script: 0x52, flags: 0x0}, - 557: {region: 0x164, script: 0x52, flags: 0x0}, - 558: {region: 0x98, script: 0x6b, flags: 0x0}, - 559: {region: 0xe7, script: 0x5, flags: 0x0}, - 560: {region: 0x164, script: 0x52, flags: 0x0}, - 561: {region: 0xa3, script: 0x52, flags: 0x0}, - 562: {region: 0x164, script: 0x52, flags: 0x0}, - 563: {region: 0x12a, script: 0x52, flags: 0x0}, - 564: {region: 0x164, script: 0x52, flags: 0x0}, - 565: {region: 0xd1, script: 0x52, flags: 0x0}, - 566: {region: 0x164, script: 0x52, flags: 0x0}, - 567: {region: 0xae, script: 0x4f, flags: 0x0}, - 568: {region: 0x164, script: 0x52, flags: 0x0}, - 569: {region: 0x164, script: 0x52, flags: 0x0}, - 570: {region: 0x15, script: 0x6, flags: 0x1}, - 571: {region: 0x164, script: 0x52, flags: 0x0}, - 572: {region: 0x51, script: 0x52, flags: 0x0}, - 573: {region: 0x81, script: 0x52, flags: 0x0}, - 574: {region: 0xa3, script: 0x52, flags: 0x0}, - 575: {region: 0x164, script: 0x52, flags: 0x0}, - 576: {region: 0x164, script: 0x52, flags: 0x0}, - 577: {region: 0x164, script: 0x52, flags: 0x0}, - 578: {region: 0xa5, script: 0x46, flags: 0x0}, - 579: {region: 0x29, script: 0x52, flags: 0x0}, - 580: {region: 0x164, script: 0x52, flags: 0x0}, - 581: {region: 0x164, script: 0x52, flags: 0x0}, - 582: {region: 0x164, script: 0x52, flags: 0x0}, - 583: {region: 0x164, script: 0x52, flags: 0x0}, - 584: {region: 0x164, script: 0x52, flags: 0x0}, - 585: {region: 0x98, script: 0x4a, flags: 0x0}, - 586: {region: 0x164, script: 0x52, flags: 0x0}, - 587: {region: 0xaa, script: 0x4b, flags: 0x0}, - 588: {region: 0x105, script: 0x1e, flags: 0x0}, - 589: {region: 0x98, script: 0x20, flags: 0x0}, - 590: {region: 0x164, script: 0x52, flags: 0x0}, - 591: {region: 0x74, script: 0x52, flags: 0x0}, - 592: {region: 0x164, script: 0x52, flags: 0x0}, - 593: {region: 0xb3, script: 0x52, flags: 0x0}, - 594: {region: 0x164, script: 0x52, flags: 0x0}, - 595: {region: 0x164, script: 0x52, flags: 0x0}, - 596: {region: 0x164, script: 0x52, flags: 0x0}, - 597: {region: 0x164, script: 0x52, flags: 0x0}, - 598: {region: 0x164, script: 0x52, flags: 0x0}, - 599: {region: 0x164, script: 0x52, flags: 0x0}, - 600: {region: 0x164, script: 0x52, flags: 0x0}, - 601: {region: 0x164, script: 0x27, flags: 0x0}, - 603: {region: 0x105, script: 0x1e, flags: 0x0}, - 604: {region: 0x111, script: 0x52, flags: 0x0}, - 605: {region: 0xe6, script: 0x52, flags: 0x0}, - 606: {region: 0x105, script: 0x52, flags: 0x0}, - 607: {region: 0x164, script: 0x52, flags: 0x0}, - 608: {region: 0x98, script: 0x20, flags: 0x0}, - 609: {region: 0x98, script: 0x5, flags: 0x0}, - 610: {region: 0x12e, script: 0x52, flags: 0x0}, - 611: {region: 0x164, script: 0x52, flags: 0x0}, - 612: {region: 0x51, script: 0x52, flags: 0x0}, - 613: {region: 0x5f, script: 0x52, flags: 0x0}, - 614: {region: 0x164, script: 0x52, flags: 0x0}, - 615: {region: 0x164, script: 0x52, flags: 0x0}, - 616: {region: 0x164, script: 0x27, flags: 0x0}, - 617: {region: 0x164, script: 0x52, flags: 0x0}, - 618: {region: 0x164, script: 0x52, flags: 0x0}, - 619: {region: 0x1b, script: 0x3, flags: 0x1}, - 620: {region: 0x164, script: 0x52, flags: 0x0}, - 621: {region: 0x164, script: 0x52, flags: 0x0}, - 622: {region: 0x164, script: 0x52, flags: 0x0}, - 623: {region: 0x164, script: 0x52, flags: 0x0}, - 624: {region: 0x105, script: 0x1e, flags: 0x0}, - 625: {region: 0x164, script: 0x52, flags: 0x0}, - 626: {region: 0x164, script: 0x52, flags: 0x0}, - 627: {region: 0x164, script: 0x52, flags: 0x0}, - 628: {region: 0x105, script: 0x1e, flags: 0x0}, - 629: {region: 0x164, script: 0x52, flags: 0x0}, - 630: {region: 0x94, script: 0x52, flags: 0x0}, - 631: {region: 0xe7, script: 0x5, flags: 0x0}, - 632: {region: 0x7a, script: 0x52, flags: 0x0}, - 633: {region: 0x164, script: 0x52, flags: 0x0}, - 634: {region: 0x164, script: 0x52, flags: 0x0}, - 635: {region: 0x164, script: 0x52, flags: 0x0}, - 636: {region: 0x164, script: 0x27, flags: 0x0}, - 637: {region: 0x122, script: 0xd5, flags: 0x0}, - 638: {region: 0xe7, script: 0x5, flags: 0x0}, - 639: {region: 0x164, script: 0x52, flags: 0x0}, - 640: {region: 0x164, script: 0x52, flags: 0x0}, - 641: {region: 0x1e, script: 0x5, flags: 0x1}, - 642: {region: 0x164, script: 0x52, flags: 0x0}, - 643: {region: 0x164, script: 0x52, flags: 0x0}, - 644: {region: 0x164, script: 0x52, flags: 0x0}, - 645: {region: 0x137, script: 0x52, flags: 0x0}, - 646: {region: 0x86, script: 0x56, flags: 0x0}, - 647: {region: 0x96, script: 0x37, flags: 0x0}, - 648: {region: 0x12e, script: 0x52, flags: 0x0}, - 649: {region: 0xe7, script: 0x5, flags: 0x0}, - 650: {region: 0x130, script: 0x52, flags: 0x0}, - 651: {region: 0x164, script: 0x52, flags: 0x0}, - 652: {region: 0xb6, script: 0x52, flags: 0x0}, - 653: {region: 0x105, script: 0x1e, flags: 0x0}, - 654: {region: 0x164, script: 0x52, flags: 0x0}, - 655: {region: 0x94, script: 0x52, flags: 0x0}, - 656: {region: 0x164, script: 0x52, flags: 0x0}, - 657: {region: 0x52, script: 0xd5, flags: 0x0}, - 658: {region: 0x164, script: 0x52, flags: 0x0}, - 659: {region: 0x164, script: 0x52, flags: 0x0}, - 660: {region: 0x164, script: 0x52, flags: 0x0}, - 661: {region: 0x164, script: 0x52, flags: 0x0}, - 662: {region: 0x98, script: 0x54, flags: 0x0}, - 663: {region: 0x164, script: 0x52, flags: 0x0}, - 664: {region: 0x164, script: 0x52, flags: 0x0}, - 665: {region: 0x105, script: 0x1e, flags: 0x0}, - 666: {region: 0x130, script: 0x52, flags: 0x0}, - 667: {region: 0x164, script: 0x52, flags: 0x0}, - 668: {region: 0xd8, script: 0x52, flags: 0x0}, - 669: {region: 0x164, script: 0x52, flags: 0x0}, - 670: {region: 0x164, script: 0x52, flags: 0x0}, - 671: {region: 0x23, script: 0x2, flags: 0x1}, - 672: {region: 0x164, script: 0x52, flags: 0x0}, - 673: {region: 0x164, script: 0x52, flags: 0x0}, - 674: {region: 0x9d, script: 0x52, flags: 0x0}, - 675: {region: 0x52, script: 0x58, flags: 0x0}, - 676: {region: 0x94, script: 0x52, flags: 0x0}, - 677: {region: 0x9b, script: 0x5, flags: 0x0}, - 678: {region: 0x134, script: 0x52, flags: 0x0}, - 679: {region: 0x164, script: 0x52, flags: 0x0}, - 680: {region: 0x164, script: 0x52, flags: 0x0}, - 681: {region: 0x98, script: 0xd0, flags: 0x0}, - 682: {region: 0x9d, script: 0x52, flags: 0x0}, - 683: {region: 0x164, script: 0x52, flags: 0x0}, - 684: {region: 0x4a, script: 0x52, flags: 0x0}, - 685: {region: 0x164, script: 0x52, flags: 0x0}, - 686: {region: 0x164, script: 0x52, flags: 0x0}, - 687: {region: 0xae, script: 0x4f, flags: 0x0}, - 688: {region: 0x164, script: 0x52, flags: 0x0}, - 689: {region: 0x164, script: 0x52, flags: 0x0}, - 690: {region: 0x4a, script: 0x52, flags: 0x0}, - 691: {region: 0x164, script: 0x52, flags: 0x0}, - 692: {region: 0x164, script: 0x52, flags: 0x0}, - 693: {region: 0x161, script: 0x52, flags: 0x0}, - 694: {region: 0x9b, script: 0x5, flags: 0x0}, - 695: {region: 0xb5, script: 0x52, flags: 0x0}, - 696: {region: 0xb7, script: 0x52, flags: 0x0}, - 697: {region: 0x4a, script: 0x52, flags: 0x0}, - 698: {region: 0x4a, script: 0x52, flags: 0x0}, - 699: {region: 0xa3, script: 0x52, flags: 0x0}, - 700: {region: 0xa3, script: 0x52, flags: 0x0}, - 701: {region: 0x9b, script: 0x5, flags: 0x0}, - 702: {region: 0xb7, script: 0x52, flags: 0x0}, - 703: {region: 0x122, script: 0xd5, flags: 0x0}, - 704: {region: 0x52, script: 0x34, flags: 0x0}, - 705: {region: 0x12a, script: 0x52, flags: 0x0}, - 706: {region: 0x94, script: 0x52, flags: 0x0}, - 707: {region: 0x51, script: 0x52, flags: 0x0}, - 708: {region: 0x98, script: 0x20, flags: 0x0}, - 709: {region: 0x98, script: 0x20, flags: 0x0}, - 710: {region: 0x94, script: 0x52, flags: 0x0}, - 711: {region: 0x25, script: 0x3, flags: 0x1}, - 712: {region: 0xa3, script: 0x52, flags: 0x0}, - 713: {region: 0x164, script: 0x52, flags: 0x0}, - 714: {region: 0xce, script: 0x52, flags: 0x0}, - 715: {region: 0x164, script: 0x52, flags: 0x0}, - 716: {region: 0x164, script: 0x52, flags: 0x0}, - 717: {region: 0x164, script: 0x52, flags: 0x0}, - 718: {region: 0x164, script: 0x52, flags: 0x0}, - 719: {region: 0x164, script: 0x52, flags: 0x0}, - 720: {region: 0x164, script: 0x52, flags: 0x0}, - 721: {region: 0x164, script: 0x52, flags: 0x0}, - 722: {region: 0x164, script: 0x52, flags: 0x0}, - 723: {region: 0x164, script: 0x52, flags: 0x0}, - 724: {region: 0x164, script: 0x52, flags: 0x0}, - 725: {region: 0x164, script: 0x52, flags: 0x0}, - 726: {region: 0x164, script: 0x5, flags: 0x0}, - 727: {region: 0x105, script: 0x1e, flags: 0x0}, - 728: {region: 0xe6, script: 0x52, flags: 0x0}, - 729: {region: 0x164, script: 0x52, flags: 0x0}, - 730: {region: 0x94, script: 0x52, flags: 0x0}, - 731: {region: 0x164, script: 0x27, flags: 0x0}, - 732: {region: 0x164, script: 0x52, flags: 0x0}, - 733: {region: 0x164, script: 0x52, flags: 0x0}, - 734: {region: 0x164, script: 0x52, flags: 0x0}, - 735: {region: 0x111, script: 0x52, flags: 0x0}, - 736: {region: 0xa3, script: 0x52, flags: 0x0}, - 737: {region: 0x164, script: 0x52, flags: 0x0}, - 738: {region: 0x164, script: 0x52, flags: 0x0}, - 739: {region: 0x122, script: 0x5, flags: 0x0}, - 740: {region: 0xcb, script: 0x52, flags: 0x0}, - 741: {region: 0x164, script: 0x52, flags: 0x0}, - 742: {region: 0x164, script: 0x52, flags: 0x0}, - 743: {region: 0x164, script: 0x52, flags: 0x0}, - 744: {region: 0xbe, script: 0x52, flags: 0x0}, - 745: {region: 0xd0, script: 0x52, flags: 0x0}, - 746: {region: 0x164, script: 0x52, flags: 0x0}, - 747: {region: 0x51, script: 0x52, flags: 0x0}, - 748: {region: 0xda, script: 0x20, flags: 0x0}, - 749: {region: 0x12e, script: 0x52, flags: 0x0}, - 750: {region: 0xbf, script: 0x52, flags: 0x0}, - 751: {region: 0x164, script: 0x52, flags: 0x0}, - 752: {region: 0x164, script: 0x52, flags: 0x0}, - 753: {region: 0xdf, script: 0x52, flags: 0x0}, - 754: {region: 0x164, script: 0x52, flags: 0x0}, - 755: {region: 0x94, script: 0x52, flags: 0x0}, - 756: {region: 0x9a, script: 0x36, flags: 0x0}, - 757: {region: 0x164, script: 0x52, flags: 0x0}, - 758: {region: 0xc1, script: 0x1e, flags: 0x0}, - 759: {region: 0x164, script: 0x5, flags: 0x0}, - 760: {region: 0x164, script: 0x52, flags: 0x0}, - 761: {region: 0x164, script: 0x52, flags: 0x0}, - 762: {region: 0x164, script: 0x52, flags: 0x0}, - 763: {region: 0x98, script: 0x64, flags: 0x0}, - 764: {region: 0x164, script: 0x52, flags: 0x0}, - 765: {region: 0x164, script: 0x52, flags: 0x0}, - 766: {region: 0x10a, script: 0x52, flags: 0x0}, - 767: {region: 0x164, script: 0x52, flags: 0x0}, - 768: {region: 0x164, script: 0x52, flags: 0x0}, - 769: {region: 0x164, script: 0x52, flags: 0x0}, - 770: {region: 0x28, script: 0x3, flags: 0x1}, - 771: {region: 0x164, script: 0x52, flags: 0x0}, - 772: {region: 0x164, script: 0x52, flags: 0x0}, - 773: {region: 0x98, script: 0xe, flags: 0x0}, - 774: {region: 0xc3, script: 0x6b, flags: 0x0}, - 776: {region: 0x164, script: 0x52, flags: 0x0}, - 777: {region: 0x48, script: 0x52, flags: 0x0}, - 778: {region: 0x48, script: 0x52, flags: 0x0}, - 779: {region: 0x36, script: 0x52, flags: 0x0}, - 780: {region: 0x164, script: 0x52, flags: 0x0}, - 781: {region: 0x164, script: 0x52, flags: 0x0}, - 782: {region: 0x164, script: 0x52, flags: 0x0}, - 783: {region: 0x164, script: 0x52, flags: 0x0}, - 784: {region: 0x164, script: 0x52, flags: 0x0}, - 785: {region: 0x164, script: 0x52, flags: 0x0}, - 786: {region: 0x98, script: 0x20, flags: 0x0}, - 787: {region: 0xda, script: 0x20, flags: 0x0}, - 788: {region: 0x105, script: 0x1e, flags: 0x0}, - 789: {region: 0x34, script: 0x68, flags: 0x0}, - 790: {region: 0x2b, script: 0x3, flags: 0x1}, - 791: {region: 0xca, script: 0x52, flags: 0x0}, - 792: {region: 0x164, script: 0x52, flags: 0x0}, - 793: {region: 0x164, script: 0x52, flags: 0x0}, - 794: {region: 0x164, script: 0x52, flags: 0x0}, - 795: {region: 0x98, script: 0x20, flags: 0x0}, - 796: {region: 0x51, script: 0x52, flags: 0x0}, - 798: {region: 0x164, script: 0x52, flags: 0x0}, - 799: {region: 0x134, script: 0x52, flags: 0x0}, - 800: {region: 0x164, script: 0x52, flags: 0x0}, - 801: {region: 0x164, script: 0x52, flags: 0x0}, - 802: {region: 0xe7, script: 0x5, flags: 0x0}, - 803: {region: 0xc2, script: 0x52, flags: 0x0}, - 804: {region: 0x98, script: 0x20, flags: 0x0}, - 805: {region: 0x94, script: 0x52, flags: 0x0}, - 806: {region: 0x163, script: 0x52, flags: 0x0}, - 807: {region: 0x164, script: 0x52, flags: 0x0}, - 808: {region: 0xc3, script: 0x6b, flags: 0x0}, - 809: {region: 0x164, script: 0x52, flags: 0x0}, - 810: {region: 0x164, script: 0x27, flags: 0x0}, - 811: {region: 0x105, script: 0x1e, flags: 0x0}, - 812: {region: 0x164, script: 0x52, flags: 0x0}, - 813: {region: 0x130, script: 0x52, flags: 0x0}, - 814: {region: 0x9b, script: 0x5d, flags: 0x0}, - 815: {region: 0x164, script: 0x52, flags: 0x0}, - 816: {region: 0x164, script: 0x52, flags: 0x0}, - 817: {region: 0x9b, script: 0x5, flags: 0x0}, - 818: {region: 0x164, script: 0x52, flags: 0x0}, - 819: {region: 0x164, script: 0x52, flags: 0x0}, - 820: {region: 0x164, script: 0x52, flags: 0x0}, - 821: {region: 0xdc, script: 0x52, flags: 0x0}, - 822: {region: 0x164, script: 0x52, flags: 0x0}, - 823: {region: 0x164, script: 0x52, flags: 0x0}, - 825: {region: 0x164, script: 0x52, flags: 0x0}, - 826: {region: 0x52, script: 0x34, flags: 0x0}, - 827: {region: 0x9d, script: 0x52, flags: 0x0}, - 828: {region: 0xd1, script: 0x52, flags: 0x0}, - 829: {region: 0x164, script: 0x52, flags: 0x0}, - 830: {region: 0xd9, script: 0x52, flags: 0x0}, - 831: {region: 0x164, script: 0x52, flags: 0x0}, - 832: {region: 0x164, script: 0x52, flags: 0x0}, - 833: {region: 0x164, script: 0x52, flags: 0x0}, - 834: {region: 0xce, script: 0x52, flags: 0x0}, - 835: {region: 0x164, script: 0x52, flags: 0x0}, - 836: {region: 0x164, script: 0x52, flags: 0x0}, - 837: {region: 0x163, script: 0x52, flags: 0x0}, - 838: {region: 0xd0, script: 0x52, flags: 0x0}, - 839: {region: 0x5f, script: 0x52, flags: 0x0}, - 840: {region: 0xda, script: 0x20, flags: 0x0}, - 841: {region: 0x164, script: 0x52, flags: 0x0}, - 842: {region: 0xda, script: 0x20, flags: 0x0}, - 843: {region: 0x164, script: 0x52, flags: 0x0}, - 844: {region: 0x164, script: 0x52, flags: 0x0}, - 845: {region: 0xd1, script: 0x52, flags: 0x0}, - 846: {region: 0x164, script: 0x52, flags: 0x0}, - 847: {region: 0x164, script: 0x52, flags: 0x0}, - 848: {region: 0xd0, script: 0x52, flags: 0x0}, - 849: {region: 0x164, script: 0x52, flags: 0x0}, - 850: {region: 0xce, script: 0x52, flags: 0x0}, - 851: {region: 0xce, script: 0x52, flags: 0x0}, - 852: {region: 0x164, script: 0x52, flags: 0x0}, - 853: {region: 0x164, script: 0x52, flags: 0x0}, - 854: {region: 0x94, script: 0x52, flags: 0x0}, - 855: {region: 0x164, script: 0x52, flags: 0x0}, - 856: {region: 0xde, script: 0x52, flags: 0x0}, - 857: {region: 0x164, script: 0x52, flags: 0x0}, - 858: {region: 0x164, script: 0x52, flags: 0x0}, - 859: {region: 0x98, script: 0x52, flags: 0x0}, - 860: {region: 0x164, script: 0x52, flags: 0x0}, - 861: {region: 0x164, script: 0x52, flags: 0x0}, - 862: {region: 0xd8, script: 0x52, flags: 0x0}, - 863: {region: 0x51, script: 0x52, flags: 0x0}, - 864: {region: 0x164, script: 0x52, flags: 0x0}, - 865: {region: 0xd9, script: 0x52, flags: 0x0}, - 866: {region: 0x164, script: 0x52, flags: 0x0}, - 867: {region: 0x51, script: 0x52, flags: 0x0}, - 868: {region: 0x164, script: 0x52, flags: 0x0}, - 869: {region: 0x164, script: 0x52, flags: 0x0}, - 870: {region: 0xd9, script: 0x52, flags: 0x0}, - 871: {region: 0x122, script: 0x4e, flags: 0x0}, - 872: {region: 0x98, script: 0x20, flags: 0x0}, - 873: {region: 0x10b, script: 0xb7, flags: 0x0}, - 874: {region: 0x164, script: 0x52, flags: 0x0}, - 875: {region: 0x164, script: 0x52, flags: 0x0}, - 876: {region: 0x83, script: 0x70, flags: 0x0}, - 877: {region: 0x160, script: 0x52, flags: 0x0}, - 878: {region: 0x164, script: 0x52, flags: 0x0}, - 879: {region: 0x48, script: 0x17, flags: 0x0}, - 880: {region: 0x164, script: 0x52, flags: 0x0}, - 881: {region: 0x160, script: 0x52, flags: 0x0}, - 882: {region: 0x164, script: 0x52, flags: 0x0}, - 883: {region: 0x164, script: 0x52, flags: 0x0}, - 884: {region: 0x164, script: 0x52, flags: 0x0}, - 885: {region: 0x164, script: 0x52, flags: 0x0}, - 886: {region: 0x164, script: 0x52, flags: 0x0}, - 887: {region: 0x116, script: 0x52, flags: 0x0}, - 888: {region: 0x164, script: 0x52, flags: 0x0}, - 889: {region: 0x164, script: 0x52, flags: 0x0}, - 890: {region: 0x134, script: 0x52, flags: 0x0}, - 891: {region: 0x164, script: 0x52, flags: 0x0}, - 892: {region: 0x52, script: 0x52, flags: 0x0}, - 893: {region: 0x164, script: 0x52, flags: 0x0}, - 894: {region: 0xcd, script: 0x52, flags: 0x0}, - 895: {region: 0x12e, script: 0x52, flags: 0x0}, - 896: {region: 0x130, script: 0x52, flags: 0x0}, - 897: {region: 0x7f, script: 0x52, flags: 0x0}, - 898: {region: 0x77, script: 0x52, flags: 0x0}, - 899: {region: 0x164, script: 0x52, flags: 0x0}, - 901: {region: 0x164, script: 0x52, flags: 0x0}, - 902: {region: 0x164, script: 0x52, flags: 0x0}, - 903: {region: 0x6e, script: 0x52, flags: 0x0}, - 904: {region: 0x164, script: 0x52, flags: 0x0}, - 905: {region: 0x164, script: 0x52, flags: 0x0}, - 906: {region: 0x164, script: 0x52, flags: 0x0}, - 907: {region: 0x164, script: 0x52, flags: 0x0}, - 908: {region: 0x98, script: 0x75, flags: 0x0}, - 909: {region: 0x164, script: 0x52, flags: 0x0}, - 910: {region: 0x164, script: 0x5, flags: 0x0}, - 911: {region: 0x7c, script: 0x1e, flags: 0x0}, - 912: {region: 0x134, script: 0x76, flags: 0x0}, - 913: {region: 0x164, script: 0x5, flags: 0x0}, - 914: {region: 0xc4, script: 0x74, flags: 0x0}, - 915: {region: 0x164, script: 0x52, flags: 0x0}, - 916: {region: 0x2e, script: 0x3, flags: 0x1}, - 917: {region: 0xe6, script: 0x52, flags: 0x0}, - 918: {region: 0x31, script: 0x2, flags: 0x1}, - 919: {region: 0xe6, script: 0x52, flags: 0x0}, - 920: {region: 0x2f, script: 0x52, flags: 0x0}, - 921: {region: 0xef, script: 0x52, flags: 0x0}, - 922: {region: 0x164, script: 0x52, flags: 0x0}, - 923: {region: 0x77, script: 0x52, flags: 0x0}, - 924: {region: 0xd5, script: 0x52, flags: 0x0}, - 925: {region: 0x134, script: 0x52, flags: 0x0}, - 926: {region: 0x48, script: 0x52, flags: 0x0}, - 927: {region: 0x164, script: 0x52, flags: 0x0}, - 928: {region: 0x9b, script: 0xdd, flags: 0x0}, - 929: {region: 0x164, script: 0x52, flags: 0x0}, - 930: {region: 0x5f, script: 0x52, flags: 0x0}, - 931: {region: 0x164, script: 0x5, flags: 0x0}, - 932: {region: 0xaf, script: 0x7f, flags: 0x0}, - 934: {region: 0x164, script: 0x52, flags: 0x0}, - 935: {region: 0x164, script: 0x52, flags: 0x0}, - 936: {region: 0x98, script: 0x12, flags: 0x0}, - 937: {region: 0xa3, script: 0x52, flags: 0x0}, - 938: {region: 0xe8, script: 0x52, flags: 0x0}, - 939: {region: 0x164, script: 0x52, flags: 0x0}, - 940: {region: 0x9d, script: 0x52, flags: 0x0}, - 941: {region: 0x164, script: 0x52, flags: 0x0}, - 942: {region: 0x164, script: 0x52, flags: 0x0}, - 943: {region: 0x86, script: 0x2d, flags: 0x0}, - 944: {region: 0x74, script: 0x52, flags: 0x0}, - 945: {region: 0x164, script: 0x52, flags: 0x0}, - 946: {region: 0xe7, script: 0x45, flags: 0x0}, - 947: {region: 0x9b, script: 0x5, flags: 0x0}, - 948: {region: 0x1, script: 0x52, flags: 0x0}, - 949: {region: 0x23, script: 0x5, flags: 0x0}, - 950: {region: 0x164, script: 0x52, flags: 0x0}, - 951: {region: 0x40, script: 0x52, flags: 0x0}, - 952: {region: 0x164, script: 0x52, flags: 0x0}, - 953: {region: 0x79, script: 0x52, flags: 0x0}, - 954: {region: 0x164, script: 0x52, flags: 0x0}, - 955: {region: 0xe3, script: 0x52, flags: 0x0}, - 956: {region: 0x88, script: 0x52, flags: 0x0}, - 957: {region: 0x68, script: 0x52, flags: 0x0}, - 958: {region: 0x164, script: 0x52, flags: 0x0}, - 959: {region: 0x98, script: 0x20, flags: 0x0}, - 960: {region: 0x164, script: 0x52, flags: 0x0}, - 961: {region: 0x101, script: 0x52, flags: 0x0}, - 962: {region: 0x94, script: 0x52, flags: 0x0}, - 963: {region: 0x164, script: 0x52, flags: 0x0}, - 964: {region: 0x164, script: 0x52, flags: 0x0}, - 965: {region: 0x9d, script: 0x52, flags: 0x0}, - 966: {region: 0x164, script: 0x5, flags: 0x0}, - 967: {region: 0x98, script: 0x52, flags: 0x0}, - 968: {region: 0x33, script: 0x2, flags: 0x1}, - 969: {region: 0xda, script: 0x20, flags: 0x0}, - 970: {region: 0x34, script: 0xe, flags: 0x0}, - 971: {region: 0x4d, script: 0x52, flags: 0x0}, - 972: {region: 0x71, script: 0x52, flags: 0x0}, - 973: {region: 0x4d, script: 0x52, flags: 0x0}, - 974: {region: 0x9b, script: 0x5, flags: 0x0}, - 975: {region: 0x10b, script: 0x52, flags: 0x0}, - 976: {region: 0x39, script: 0x52, flags: 0x0}, - 977: {region: 0x164, script: 0x52, flags: 0x0}, - 978: {region: 0xd0, script: 0x52, flags: 0x0}, - 979: {region: 0x103, script: 0x52, flags: 0x0}, - 980: {region: 0x94, script: 0x52, flags: 0x0}, - 981: {region: 0x12e, script: 0x52, flags: 0x0}, - 982: {region: 0x164, script: 0x52, flags: 0x0}, - 983: {region: 0x164, script: 0x52, flags: 0x0}, - 984: {region: 0x72, script: 0x52, flags: 0x0}, - 985: {region: 0x105, script: 0x1e, flags: 0x0}, - 986: {region: 0x12f, script: 0x1e, flags: 0x0}, - 987: {region: 0x108, script: 0x52, flags: 0x0}, - 988: {region: 0x106, script: 0x52, flags: 0x0}, - 989: {region: 0x12e, script: 0x52, flags: 0x0}, - 990: {region: 0x164, script: 0x52, flags: 0x0}, - 991: {region: 0xa1, script: 0x44, flags: 0x0}, - 992: {region: 0x98, script: 0x20, flags: 0x0}, - 993: {region: 0x7f, script: 0x52, flags: 0x0}, - 994: {region: 0x105, script: 0x1e, flags: 0x0}, - 995: {region: 0xa3, script: 0x52, flags: 0x0}, - 996: {region: 0x94, script: 0x52, flags: 0x0}, - 997: {region: 0x98, script: 0x52, flags: 0x0}, - 998: {region: 0x98, script: 0xbb, flags: 0x0}, - 999: {region: 0x164, script: 0x52, flags: 0x0}, - 1000: {region: 0x164, script: 0x52, flags: 0x0}, - 1001: {region: 0x12e, script: 0x52, flags: 0x0}, - 1002: {region: 0x9d, script: 0x52, flags: 0x0}, - 1003: {region: 0x98, script: 0x20, flags: 0x0}, - 1004: {region: 0x164, script: 0x5, flags: 0x0}, - 1005: {region: 0x9d, script: 0x52, flags: 0x0}, - 1006: {region: 0x7a, script: 0x52, flags: 0x0}, - 1007: {region: 0x48, script: 0x52, flags: 0x0}, - 1008: {region: 0x35, script: 0x4, flags: 0x1}, - 1009: {region: 0x9d, script: 0x52, flags: 0x0}, - 1010: {region: 0x9b, script: 0x5, flags: 0x0}, - 1011: {region: 0xd9, script: 0x52, flags: 0x0}, - 1012: {region: 0x4e, script: 0x52, flags: 0x0}, - 1013: {region: 0xd0, script: 0x52, flags: 0x0}, - 1014: {region: 0xce, script: 0x52, flags: 0x0}, - 1015: {region: 0xc2, script: 0x52, flags: 0x0}, - 1016: {region: 0x4b, script: 0x52, flags: 0x0}, - 1017: {region: 0x95, script: 0x72, flags: 0x0}, - 1018: {region: 0xb5, script: 0x52, flags: 0x0}, - 1019: {region: 0x164, script: 0x27, flags: 0x0}, - 1020: {region: 0x164, script: 0x52, flags: 0x0}, - 1022: {region: 0xb9, script: 0xd2, flags: 0x0}, - 1023: {region: 0x164, script: 0x52, flags: 0x0}, - 1024: {region: 0xc3, script: 0x6b, flags: 0x0}, - 1025: {region: 0x164, script: 0x5, flags: 0x0}, - 1026: {region: 0xb2, script: 0xc1, flags: 0x0}, - 1027: {region: 0x6e, script: 0x52, flags: 0x0}, - 1028: {region: 0x164, script: 0x52, flags: 0x0}, - 1029: {region: 0x164, script: 0x52, flags: 0x0}, - 1030: {region: 0x164, script: 0x52, flags: 0x0}, - 1031: {region: 0x164, script: 0x52, flags: 0x0}, - 1032: {region: 0x110, script: 0x52, flags: 0x0}, - 1033: {region: 0x164, script: 0x52, flags: 0x0}, - 1034: {region: 0xe7, script: 0x5, flags: 0x0}, - 1035: {region: 0x164, script: 0x52, flags: 0x0}, - 1036: {region: 0x10e, script: 0x52, flags: 0x0}, - 1037: {region: 0x164, script: 0x52, flags: 0x0}, - 1038: {region: 0xe8, script: 0x52, flags: 0x0}, - 1039: {region: 0x164, script: 0x52, flags: 0x0}, - 1040: {region: 0x94, script: 0x52, flags: 0x0}, - 1041: {region: 0x141, script: 0x52, flags: 0x0}, - 1042: {region: 0x10b, script: 0x52, flags: 0x0}, - 1044: {region: 0x10b, script: 0x52, flags: 0x0}, - 1045: {region: 0x71, script: 0x52, flags: 0x0}, - 1046: {region: 0x96, script: 0xb8, flags: 0x0}, - 1047: {region: 0x164, script: 0x52, flags: 0x0}, - 1048: {region: 0x71, script: 0x52, flags: 0x0}, - 1049: {region: 0x163, script: 0x52, flags: 0x0}, - 1050: {region: 0x164, script: 0x52, flags: 0x0}, - 1051: {region: 0xc2, script: 0x52, flags: 0x0}, - 1052: {region: 0x164, script: 0x52, flags: 0x0}, - 1053: {region: 0x164, script: 0x52, flags: 0x0}, - 1054: {region: 0x164, script: 0x52, flags: 0x0}, - 1055: {region: 0x114, script: 0x52, flags: 0x0}, - 1056: {region: 0x164, script: 0x52, flags: 0x0}, - 1057: {region: 0x164, script: 0x52, flags: 0x0}, - 1058: {region: 0x122, script: 0xd5, flags: 0x0}, - 1059: {region: 0x164, script: 0x52, flags: 0x0}, - 1060: {region: 0x164, script: 0x52, flags: 0x0}, - 1061: {region: 0x164, script: 0x52, flags: 0x0}, - 1062: {region: 0x164, script: 0x52, flags: 0x0}, - 1063: {region: 0x26, script: 0x52, flags: 0x0}, - 1064: {region: 0x39, script: 0x5, flags: 0x1}, - 1065: {region: 0x98, script: 0xc2, flags: 0x0}, - 1066: {region: 0x115, script: 0x52, flags: 0x0}, - 1067: {region: 0x113, script: 0x52, flags: 0x0}, - 1068: {region: 0x98, script: 0x20, flags: 0x0}, - 1069: {region: 0x160, script: 0x52, flags: 0x0}, - 1070: {region: 0x164, script: 0x52, flags: 0x0}, - 1071: {region: 0x164, script: 0x52, flags: 0x0}, - 1072: {region: 0x6c, script: 0x52, flags: 0x0}, - 1073: {region: 0x160, script: 0x52, flags: 0x0}, - 1074: {region: 0x164, script: 0x52, flags: 0x0}, - 1075: {region: 0x5f, script: 0x52, flags: 0x0}, - 1076: {region: 0x94, script: 0x52, flags: 0x0}, - 1077: {region: 0x164, script: 0x52, flags: 0x0}, - 1078: {region: 0x164, script: 0x52, flags: 0x0}, - 1079: {region: 0x12e, script: 0x52, flags: 0x0}, - 1080: {region: 0x164, script: 0x52, flags: 0x0}, - 1081: {region: 0x83, script: 0x52, flags: 0x0}, - 1082: {region: 0x10b, script: 0x52, flags: 0x0}, - 1083: {region: 0x12e, script: 0x52, flags: 0x0}, - 1084: {region: 0x15e, script: 0x5, flags: 0x0}, - 1085: {region: 0x4a, script: 0x52, flags: 0x0}, - 1086: {region: 0x5f, script: 0x52, flags: 0x0}, - 1087: {region: 0x164, script: 0x52, flags: 0x0}, - 1088: {region: 0x98, script: 0x20, flags: 0x0}, - 1089: {region: 0x94, script: 0x52, flags: 0x0}, - 1090: {region: 0x164, script: 0x52, flags: 0x0}, - 1091: {region: 0x34, script: 0xe, flags: 0x0}, - 1092: {region: 0x9a, script: 0xc5, flags: 0x0}, - 1093: {region: 0xe8, script: 0x52, flags: 0x0}, - 1094: {region: 0x98, script: 0xcd, flags: 0x0}, - 1095: {region: 0xda, script: 0x20, flags: 0x0}, - 1096: {region: 0x164, script: 0x52, flags: 0x0}, - 1097: {region: 0x164, script: 0x52, flags: 0x0}, - 1098: {region: 0x164, script: 0x52, flags: 0x0}, - 1099: {region: 0x164, script: 0x52, flags: 0x0}, - 1100: {region: 0x164, script: 0x52, flags: 0x0}, - 1101: {region: 0x164, script: 0x52, flags: 0x0}, - 1102: {region: 0x164, script: 0x52, flags: 0x0}, - 1103: {region: 0x164, script: 0x52, flags: 0x0}, - 1104: {region: 0xe6, script: 0x52, flags: 0x0}, - 1105: {region: 0x164, script: 0x52, flags: 0x0}, - 1106: {region: 0x164, script: 0x52, flags: 0x0}, - 1107: {region: 0x98, script: 0x4a, flags: 0x0}, - 1108: {region: 0x52, script: 0xcb, flags: 0x0}, - 1109: {region: 0xda, script: 0x20, flags: 0x0}, - 1110: {region: 0xda, script: 0x20, flags: 0x0}, - 1111: {region: 0x98, script: 0xd0, flags: 0x0}, - 1112: {region: 0x164, script: 0x52, flags: 0x0}, - 1113: {region: 0x111, script: 0x52, flags: 0x0}, - 1114: {region: 0x130, script: 0x52, flags: 0x0}, - 1115: {region: 0x125, script: 0x52, flags: 0x0}, - 1116: {region: 0x164, script: 0x52, flags: 0x0}, - 1117: {region: 0x3e, script: 0x3, flags: 0x1}, - 1118: {region: 0x164, script: 0x52, flags: 0x0}, - 1119: {region: 0x164, script: 0x52, flags: 0x0}, - 1120: {region: 0x164, script: 0x52, flags: 0x0}, - 1121: {region: 0x122, script: 0xd5, flags: 0x0}, - 1122: {region: 0xda, script: 0x20, flags: 0x0}, - 1123: {region: 0xda, script: 0x20, flags: 0x0}, - 1124: {region: 0xda, script: 0x20, flags: 0x0}, - 1125: {region: 0x6e, script: 0x27, flags: 0x0}, - 1126: {region: 0x164, script: 0x52, flags: 0x0}, - 1127: {region: 0x6c, script: 0x27, flags: 0x0}, - 1128: {region: 0x164, script: 0x52, flags: 0x0}, - 1129: {region: 0x164, script: 0x52, flags: 0x0}, - 1130: {region: 0x164, script: 0x52, flags: 0x0}, - 1131: {region: 0xd5, script: 0x52, flags: 0x0}, - 1132: {region: 0x126, script: 0x52, flags: 0x0}, - 1133: {region: 0x124, script: 0x52, flags: 0x0}, - 1134: {region: 0x31, script: 0x52, flags: 0x0}, - 1135: {region: 0xda, script: 0x20, flags: 0x0}, - 1136: {region: 0xe6, script: 0x52, flags: 0x0}, - 1137: {region: 0x164, script: 0x52, flags: 0x0}, - 1138: {region: 0x164, script: 0x52, flags: 0x0}, - 1139: {region: 0x31, script: 0x52, flags: 0x0}, - 1140: {region: 0xd3, script: 0x52, flags: 0x0}, - 1141: {region: 0x164, script: 0x52, flags: 0x0}, - 1142: {region: 0x160, script: 0x52, flags: 0x0}, - 1143: {region: 0x164, script: 0x52, flags: 0x0}, - 1144: {region: 0x128, script: 0x52, flags: 0x0}, - 1145: {region: 0x164, script: 0x52, flags: 0x0}, - 1146: {region: 0xcd, script: 0x52, flags: 0x0}, - 1147: {region: 0x164, script: 0x52, flags: 0x0}, - 1148: {region: 0xe5, script: 0x52, flags: 0x0}, - 1149: {region: 0x164, script: 0x52, flags: 0x0}, - 1150: {region: 0x164, script: 0x52, flags: 0x0}, - 1151: {region: 0x164, script: 0x52, flags: 0x0}, - 1152: {region: 0x12a, script: 0x52, flags: 0x0}, - 1153: {region: 0x12a, script: 0x52, flags: 0x0}, - 1154: {region: 0x12d, script: 0x52, flags: 0x0}, - 1155: {region: 0x164, script: 0x5, flags: 0x0}, - 1156: {region: 0x160, script: 0x52, flags: 0x0}, - 1157: {region: 0x86, script: 0x2d, flags: 0x0}, - 1158: {region: 0xda, script: 0x20, flags: 0x0}, - 1159: {region: 0xe6, script: 0x52, flags: 0x0}, - 1160: {region: 0x42, script: 0xd6, flags: 0x0}, - 1161: {region: 0x164, script: 0x52, flags: 0x0}, - 1162: {region: 0x105, script: 0x1e, flags: 0x0}, - 1163: {region: 0x164, script: 0x52, flags: 0x0}, - 1164: {region: 0x164, script: 0x52, flags: 0x0}, - 1165: {region: 0x130, script: 0x52, flags: 0x0}, - 1166: {region: 0x164, script: 0x52, flags: 0x0}, - 1167: {region: 0x122, script: 0xd5, flags: 0x0}, - 1168: {region: 0x31, script: 0x52, flags: 0x0}, - 1169: {region: 0x164, script: 0x52, flags: 0x0}, - 1170: {region: 0x164, script: 0x52, flags: 0x0}, - 1171: {region: 0xcd, script: 0x52, flags: 0x0}, - 1172: {region: 0x164, script: 0x52, flags: 0x0}, - 1173: {region: 0x164, script: 0x52, flags: 0x0}, - 1174: {region: 0x12c, script: 0x52, flags: 0x0}, - 1175: {region: 0x164, script: 0x52, flags: 0x0}, - 1177: {region: 0x164, script: 0x52, flags: 0x0}, - 1178: {region: 0xd3, script: 0x52, flags: 0x0}, - 1179: {region: 0x52, script: 0xce, flags: 0x0}, - 1180: {region: 0xe4, script: 0x52, flags: 0x0}, - 1181: {region: 0x164, script: 0x52, flags: 0x0}, - 1182: {region: 0x105, script: 0x1e, flags: 0x0}, - 1183: {region: 0xb9, script: 0x52, flags: 0x0}, - 1184: {region: 0x164, script: 0x52, flags: 0x0}, - 1185: {region: 0x105, script: 0x1e, flags: 0x0}, - 1186: {region: 0x41, script: 0x4, flags: 0x1}, - 1187: {region: 0x11b, script: 0xd8, flags: 0x0}, - 1188: {region: 0x12f, script: 0x1e, flags: 0x0}, - 1189: {region: 0x74, script: 0x52, flags: 0x0}, - 1190: {region: 0x29, script: 0x52, flags: 0x0}, - 1192: {region: 0x45, script: 0x3, flags: 0x1}, - 1193: {region: 0x98, script: 0xe, flags: 0x0}, - 1194: {region: 0xe7, script: 0x5, flags: 0x0}, - 1195: {region: 0x164, script: 0x52, flags: 0x0}, - 1196: {region: 0x164, script: 0x52, flags: 0x0}, - 1197: {region: 0x164, script: 0x52, flags: 0x0}, - 1198: {region: 0x164, script: 0x52, flags: 0x0}, - 1199: {region: 0x164, script: 0x52, flags: 0x0}, - 1200: {region: 0x164, script: 0x52, flags: 0x0}, - 1201: {region: 0x164, script: 0x52, flags: 0x0}, - 1202: {region: 0x48, script: 0x4, flags: 0x1}, - 1203: {region: 0x164, script: 0x52, flags: 0x0}, - 1204: {region: 0xb3, script: 0xd9, flags: 0x0}, - 1205: {region: 0x164, script: 0x52, flags: 0x0}, - 1206: {region: 0x160, script: 0x52, flags: 0x0}, - 1207: {region: 0x9d, script: 0x52, flags: 0x0}, - 1208: {region: 0x105, script: 0x52, flags: 0x0}, - 1209: {region: 0x13d, script: 0x52, flags: 0x0}, - 1210: {region: 0x11a, script: 0x52, flags: 0x0}, - 1211: {region: 0x164, script: 0x52, flags: 0x0}, - 1212: {region: 0x35, script: 0x52, flags: 0x0}, - 1213: {region: 0x5f, script: 0x52, flags: 0x0}, - 1214: {region: 0xd0, script: 0x52, flags: 0x0}, - 1215: {region: 0x1, script: 0x52, flags: 0x0}, - 1216: {region: 0x105, script: 0x52, flags: 0x0}, - 1217: {region: 0x69, script: 0x52, flags: 0x0}, - 1218: {region: 0x12e, script: 0x52, flags: 0x0}, - 1219: {region: 0x164, script: 0x52, flags: 0x0}, - 1220: {region: 0x35, script: 0x52, flags: 0x0}, - 1221: {region: 0x4d, script: 0x52, flags: 0x0}, - 1222: {region: 0x164, script: 0x52, flags: 0x0}, - 1223: {region: 0x6e, script: 0x27, flags: 0x0}, - 1224: {region: 0x164, script: 0x52, flags: 0x0}, - 1225: {region: 0xe6, script: 0x52, flags: 0x0}, - 1226: {region: 0x2e, script: 0x52, flags: 0x0}, - 1227: {region: 0x98, script: 0xd0, flags: 0x0}, - 1228: {region: 0x98, script: 0x20, flags: 0x0}, - 1229: {region: 0x164, script: 0x52, flags: 0x0}, - 1230: {region: 0x164, script: 0x52, flags: 0x0}, - 1231: {region: 0x164, script: 0x52, flags: 0x0}, - 1232: {region: 0x164, script: 0x52, flags: 0x0}, - 1233: {region: 0x164, script: 0x52, flags: 0x0}, - 1234: {region: 0x164, script: 0x52, flags: 0x0}, - 1235: {region: 0x164, script: 0x52, flags: 0x0}, - 1236: {region: 0x164, script: 0x52, flags: 0x0}, - 1237: {region: 0x164, script: 0x52, flags: 0x0}, - 1238: {region: 0x13f, script: 0x52, flags: 0x0}, - 1239: {region: 0x164, script: 0x52, flags: 0x0}, - 1240: {region: 0x164, script: 0x52, flags: 0x0}, - 1241: {region: 0xa7, script: 0x5, flags: 0x0}, - 1242: {region: 0x164, script: 0x52, flags: 0x0}, - 1243: {region: 0x113, script: 0x52, flags: 0x0}, - 1244: {region: 0x164, script: 0x52, flags: 0x0}, - 1245: {region: 0x164, script: 0x52, flags: 0x0}, - 1246: {region: 0x164, script: 0x52, flags: 0x0}, - 1247: {region: 0x164, script: 0x52, flags: 0x0}, - 1248: {region: 0x98, script: 0x20, flags: 0x0}, - 1249: {region: 0x52, script: 0x34, flags: 0x0}, - 1250: {region: 0x164, script: 0x52, flags: 0x0}, - 1251: {region: 0x164, script: 0x52, flags: 0x0}, - 1252: {region: 0x40, script: 0x52, flags: 0x0}, - 1253: {region: 0x164, script: 0x52, flags: 0x0}, - 1254: {region: 0x12a, script: 0x18, flags: 0x0}, - 1255: {region: 0x164, script: 0x52, flags: 0x0}, - 1256: {region: 0x160, script: 0x52, flags: 0x0}, - 1257: {region: 0x164, script: 0x52, flags: 0x0}, - 1258: {region: 0x12a, script: 0x5a, flags: 0x0}, - 1259: {region: 0x12a, script: 0x5b, flags: 0x0}, - 1260: {region: 0x7c, script: 0x29, flags: 0x0}, - 1261: {region: 0x52, script: 0x5e, flags: 0x0}, - 1262: {region: 0x10a, script: 0x62, flags: 0x0}, - 1263: {region: 0x107, script: 0x6c, flags: 0x0}, - 1264: {region: 0x98, script: 0x20, flags: 0x0}, - 1265: {region: 0x130, script: 0x52, flags: 0x0}, - 1266: {region: 0x164, script: 0x52, flags: 0x0}, - 1267: {region: 0x9b, script: 0x82, flags: 0x0}, - 1268: {region: 0x164, script: 0x52, flags: 0x0}, - 1269: {region: 0x15d, script: 0xba, flags: 0x0}, - 1270: {region: 0x164, script: 0x52, flags: 0x0}, - 1271: {region: 0x164, script: 0x52, flags: 0x0}, - 1272: {region: 0xda, script: 0x20, flags: 0x0}, - 1273: {region: 0x164, script: 0x52, flags: 0x0}, - 1274: {region: 0x164, script: 0x52, flags: 0x0}, - 1275: {region: 0xd0, script: 0x52, flags: 0x0}, - 1276: {region: 0x74, script: 0x52, flags: 0x0}, - 1277: {region: 0x164, script: 0x52, flags: 0x0}, - 1278: {region: 0x164, script: 0x52, flags: 0x0}, - 1279: {region: 0x51, script: 0x52, flags: 0x0}, - 1280: {region: 0x164, script: 0x52, flags: 0x0}, - 1281: {region: 0x164, script: 0x52, flags: 0x0}, - 1282: {region: 0x164, script: 0x52, flags: 0x0}, - 1283: {region: 0x51, script: 0x52, flags: 0x0}, - 1284: {region: 0x164, script: 0x52, flags: 0x0}, - 1285: {region: 0x164, script: 0x52, flags: 0x0}, - 1286: {region: 0x164, script: 0x52, flags: 0x0}, - 1287: {region: 0x164, script: 0x52, flags: 0x0}, - 1288: {region: 0x1, script: 0x37, flags: 0x0}, - 1289: {region: 0x164, script: 0x52, flags: 0x0}, - 1290: {region: 0x164, script: 0x52, flags: 0x0}, - 1291: {region: 0x164, script: 0x52, flags: 0x0}, - 1292: {region: 0x164, script: 0x52, flags: 0x0}, - 1293: {region: 0x164, script: 0x52, flags: 0x0}, - 1294: {region: 0xd5, script: 0x52, flags: 0x0}, - 1295: {region: 0x164, script: 0x52, flags: 0x0}, - 1296: {region: 0x164, script: 0x52, flags: 0x0}, - 1297: {region: 0x164, script: 0x52, flags: 0x0}, - 1298: {region: 0x40, script: 0x52, flags: 0x0}, - 1299: {region: 0x164, script: 0x52, flags: 0x0}, - 1300: {region: 0xce, script: 0x52, flags: 0x0}, - 1301: {region: 0x4c, script: 0x3, flags: 0x1}, - 1302: {region: 0x164, script: 0x52, flags: 0x0}, - 1303: {region: 0x164, script: 0x52, flags: 0x0}, - 1304: {region: 0x164, script: 0x52, flags: 0x0}, - 1305: {region: 0x52, script: 0x52, flags: 0x0}, - 1306: {region: 0x10a, script: 0x52, flags: 0x0}, - 1308: {region: 0xa7, script: 0x5, flags: 0x0}, - 1309: {region: 0xd8, script: 0x52, flags: 0x0}, - 1310: {region: 0xb9, script: 0xd2, flags: 0x0}, - 1311: {region: 0x4f, script: 0x14, flags: 0x1}, - 1312: {region: 0x164, script: 0x52, flags: 0x0}, - 1313: {region: 0x121, script: 0x52, flags: 0x0}, - 1314: {region: 0xcf, script: 0x52, flags: 0x0}, - 1315: {region: 0x164, script: 0x52, flags: 0x0}, - 1316: {region: 0x160, script: 0x52, flags: 0x0}, - 1318: {region: 0x12a, script: 0x52, flags: 0x0}, -} - -// likelyLangList holds lists info associated with likelyLang. -// Size: 396 bytes, 99 elements -var likelyLangList = [99]likelyScriptRegion{ - 0: {region: 0x9b, script: 0x7, flags: 0x0}, - 1: {region: 0xa0, script: 0x6d, flags: 0x2}, - 2: {region: 0x11b, script: 0x78, flags: 0x2}, - 3: {region: 0x31, script: 0x52, flags: 0x0}, - 4: {region: 0x9a, script: 0x5, flags: 0x4}, - 5: {region: 0x9b, script: 0x5, flags: 0x4}, - 6: {region: 0x105, script: 0x1e, flags: 0x4}, - 7: {region: 0x9b, script: 0x5, flags: 0x2}, - 8: {region: 0x98, script: 0xe, flags: 0x0}, - 9: {region: 0x34, script: 0x16, flags: 0x2}, - 10: {region: 0x105, script: 0x1e, flags: 0x0}, - 11: {region: 0x37, script: 0x2a, flags: 0x2}, - 12: {region: 0x134, script: 0x52, flags: 0x0}, - 13: {region: 0x7a, script: 0xbd, flags: 0x2}, - 14: {region: 0x113, script: 0x52, flags: 0x0}, - 15: {region: 0x83, script: 0x1, flags: 0x2}, - 16: {region: 0x5c, script: 0x1d, flags: 0x0}, - 17: {region: 0x86, script: 0x57, flags: 0x2}, - 18: {region: 0xd5, script: 0x52, flags: 0x0}, - 19: {region: 0x51, script: 0x5, flags: 0x4}, - 20: {region: 0x10a, script: 0x5, flags: 0x4}, - 21: {region: 0xad, script: 0x1e, flags: 0x0}, - 22: {region: 0x23, script: 0x5, flags: 0x4}, - 23: {region: 0x52, script: 0x5, flags: 0x4}, - 24: {region: 0x9b, script: 0x5, flags: 0x4}, - 25: {region: 0xc4, script: 0x5, flags: 0x4}, - 26: {region: 0x52, script: 0x5, flags: 0x2}, - 27: {region: 0x12a, script: 0x52, flags: 0x0}, - 28: {region: 0xaf, script: 0x5, flags: 0x4}, - 29: {region: 0x9a, script: 0x5, flags: 0x2}, - 30: {region: 0xa4, script: 0x1e, flags: 0x0}, - 31: {region: 0x52, script: 0x5, flags: 0x4}, - 32: {region: 0x12a, script: 0x52, flags: 0x4}, - 33: {region: 0x52, script: 0x5, flags: 0x2}, - 34: {region: 0x12a, script: 0x52, flags: 0x2}, - 35: {region: 0xda, script: 0x20, flags: 0x0}, - 36: {region: 0x98, script: 0x55, flags: 0x2}, - 37: {region: 0x82, script: 0x52, flags: 0x0}, - 38: {region: 0x83, script: 0x70, flags: 0x4}, - 39: {region: 0x83, script: 0x70, flags: 0x2}, - 40: {region: 0xc4, script: 0x1e, flags: 0x0}, - 41: {region: 0x52, script: 0x66, flags: 0x4}, - 42: {region: 0x52, script: 0x66, flags: 0x2}, - 43: {region: 0xcf, script: 0x52, flags: 0x0}, - 44: {region: 0x49, script: 0x5, flags: 0x4}, - 45: {region: 0x94, script: 0x5, flags: 0x4}, - 46: {region: 0x98, script: 0x2f, flags: 0x0}, - 47: {region: 0xe7, script: 0x5, flags: 0x4}, - 48: {region: 0xe7, script: 0x5, flags: 0x2}, - 49: {region: 0x9b, script: 0x7c, flags: 0x0}, - 50: {region: 0x52, script: 0x7d, flags: 0x2}, - 51: {region: 0xb9, script: 0xd2, flags: 0x0}, - 52: {region: 0xd8, script: 0x52, flags: 0x4}, - 53: {region: 0xe7, script: 0x5, flags: 0x0}, - 54: {region: 0x98, script: 0x20, flags: 0x2}, - 55: {region: 0x98, script: 0x47, flags: 0x2}, - 56: {region: 0x98, script: 0xc0, flags: 0x2}, - 57: {region: 0x104, script: 0x1e, flags: 0x0}, - 58: {region: 0xbc, script: 0x52, flags: 0x4}, - 59: {region: 0x103, script: 0x52, flags: 0x4}, - 60: {region: 0x105, script: 0x52, flags: 0x4}, - 61: {region: 0x12a, script: 0x52, flags: 0x4}, - 62: {region: 0x123, script: 0x1e, flags: 0x0}, - 63: {region: 0xe7, script: 0x5, flags: 0x4}, - 64: {region: 0xe7, script: 0x5, flags: 0x2}, - 65: {region: 0x52, script: 0x5, flags: 0x0}, - 66: {region: 0xad, script: 0x1e, flags: 0x4}, - 67: {region: 0xc4, script: 0x1e, flags: 0x4}, - 68: {region: 0xad, script: 0x1e, flags: 0x2}, - 69: {region: 0x98, script: 0xe, flags: 0x0}, - 70: {region: 0xda, script: 0x20, flags: 0x4}, - 71: {region: 0xda, script: 0x20, flags: 0x2}, - 72: {region: 0x136, script: 0x52, flags: 0x0}, - 73: {region: 0x23, script: 0x5, flags: 0x4}, - 74: {region: 0x52, script: 0x1e, flags: 0x4}, - 75: {region: 0x23, script: 0x5, flags: 0x2}, - 76: {region: 0x8c, script: 0x35, flags: 0x0}, - 77: {region: 0x52, script: 0x34, flags: 0x4}, - 78: {region: 0x52, script: 0x34, flags: 0x2}, - 79: {region: 0x52, script: 0x34, flags: 0x0}, - 80: {region: 0x2e, script: 0x35, flags: 0x4}, - 81: {region: 0x3d, script: 0x35, flags: 0x4}, - 82: {region: 0x7a, script: 0x35, flags: 0x4}, - 83: {region: 0x7d, script: 0x35, flags: 0x4}, - 84: {region: 0x8c, script: 0x35, flags: 0x4}, - 85: {region: 0x94, script: 0x35, flags: 0x4}, - 86: {region: 0xc5, script: 0x35, flags: 0x4}, - 87: {region: 0xcf, script: 0x35, flags: 0x4}, - 88: {region: 0xe1, script: 0x35, flags: 0x4}, - 89: {region: 0xe4, script: 0x35, flags: 0x4}, - 90: {region: 0xe6, script: 0x35, flags: 0x4}, - 91: {region: 0x115, script: 0x35, flags: 0x4}, - 92: {region: 0x122, script: 0x35, flags: 0x4}, - 93: {region: 0x12d, script: 0x35, flags: 0x4}, - 94: {region: 0x134, script: 0x35, flags: 0x4}, - 95: {region: 0x13d, script: 0x35, flags: 0x4}, - 96: {region: 0x12d, script: 0x11, flags: 0x2}, - 97: {region: 0x12d, script: 0x30, flags: 0x2}, - 98: {region: 0x12d, script: 0x35, flags: 0x2}, -} - -type likelyLangScript struct { - lang uint16 - script uint8 - flags uint8 -} - -// likelyRegion is a lookup table, indexed by regionID, for the most likely -// languages and scripts given incomplete information. If more entries exist -// for a given regionID, lang and script are the index and size respectively -// of the list in likelyRegionList. -// TODO: exclude containers and user-definable regions from the list. -// Size: 1428 bytes, 357 elements -var likelyRegion = [357]likelyLangScript{ - 33: {lang: 0xd5, script: 0x52, flags: 0x0}, - 34: {lang: 0x39, script: 0x5, flags: 0x0}, - 35: {lang: 0x0, script: 0x2, flags: 0x1}, - 38: {lang: 0x2, script: 0x2, flags: 0x1}, - 39: {lang: 0x4, script: 0x2, flags: 0x1}, - 41: {lang: 0x3b7, script: 0x52, flags: 0x0}, - 42: {lang: 0x0, script: 0x52, flags: 0x0}, - 43: {lang: 0x139, script: 0x52, flags: 0x0}, - 44: {lang: 0x411, script: 0x52, flags: 0x0}, - 45: {lang: 0x109, script: 0x52, flags: 0x0}, - 47: {lang: 0x35e, script: 0x52, flags: 0x0}, - 48: {lang: 0x43a, script: 0x52, flags: 0x0}, - 49: {lang: 0x57, script: 0x52, flags: 0x0}, - 50: {lang: 0x6, script: 0x2, flags: 0x1}, - 52: {lang: 0xa3, script: 0xe, flags: 0x0}, - 53: {lang: 0x35e, script: 0x52, flags: 0x0}, - 54: {lang: 0x159, script: 0x52, flags: 0x0}, - 55: {lang: 0x7d, script: 0x1e, flags: 0x0}, - 56: {lang: 0x39, script: 0x5, flags: 0x0}, - 57: {lang: 0x3d0, script: 0x52, flags: 0x0}, - 58: {lang: 0x159, script: 0x52, flags: 0x0}, - 59: {lang: 0x159, script: 0x52, flags: 0x0}, - 61: {lang: 0x316, script: 0x52, flags: 0x0}, - 62: {lang: 0x139, script: 0x52, flags: 0x0}, - 63: {lang: 0x398, script: 0x52, flags: 0x0}, - 64: {lang: 0x3b7, script: 0x52, flags: 0x0}, - 66: {lang: 0x8, script: 0x2, flags: 0x1}, - 68: {lang: 0x0, script: 0x52, flags: 0x0}, - 70: {lang: 0x70, script: 0x1e, flags: 0x0}, - 72: {lang: 0x508, script: 0x37, flags: 0x2}, - 73: {lang: 0x316, script: 0x5, flags: 0x2}, - 74: {lang: 0x43b, script: 0x52, flags: 0x0}, - 75: {lang: 0x159, script: 0x52, flags: 0x0}, - 76: {lang: 0x159, script: 0x52, flags: 0x0}, - 77: {lang: 0x109, script: 0x52, flags: 0x0}, - 78: {lang: 0x159, script: 0x52, flags: 0x0}, - 80: {lang: 0x139, script: 0x52, flags: 0x0}, - 81: {lang: 0x159, script: 0x52, flags: 0x0}, - 82: {lang: 0xa, script: 0x5, flags: 0x1}, - 83: {lang: 0x139, script: 0x52, flags: 0x0}, - 84: {lang: 0x0, script: 0x52, flags: 0x0}, - 85: {lang: 0x139, script: 0x52, flags: 0x0}, - 88: {lang: 0x139, script: 0x52, flags: 0x0}, - 89: {lang: 0x3b7, script: 0x52, flags: 0x0}, - 90: {lang: 0x398, script: 0x52, flags: 0x0}, - 92: {lang: 0xf, script: 0x2, flags: 0x1}, - 93: {lang: 0xf6, script: 0x52, flags: 0x0}, - 95: {lang: 0x109, script: 0x52, flags: 0x0}, - 97: {lang: 0x1, script: 0x52, flags: 0x0}, - 98: {lang: 0xfd, script: 0x52, flags: 0x0}, - 100: {lang: 0x139, script: 0x52, flags: 0x0}, - 102: {lang: 0x11, script: 0x2, flags: 0x1}, - 103: {lang: 0x139, script: 0x52, flags: 0x0}, - 104: {lang: 0x139, script: 0x52, flags: 0x0}, - 105: {lang: 0x13b, script: 0x52, flags: 0x0}, - 106: {lang: 0x39, script: 0x5, flags: 0x0}, - 107: {lang: 0x39, script: 0x5, flags: 0x0}, - 108: {lang: 0x465, script: 0x27, flags: 0x0}, - 109: {lang: 0x139, script: 0x52, flags: 0x0}, - 110: {lang: 0x13, script: 0x2, flags: 0x1}, - 112: {lang: 0x109, script: 0x52, flags: 0x0}, - 113: {lang: 0x14c, script: 0x52, flags: 0x0}, - 114: {lang: 0x1b9, script: 0x20, flags: 0x2}, - 117: {lang: 0x153, script: 0x52, flags: 0x0}, - 119: {lang: 0x159, script: 0x52, flags: 0x0}, - 121: {lang: 0x159, script: 0x52, flags: 0x0}, - 122: {lang: 0x15, script: 0x2, flags: 0x1}, - 124: {lang: 0x17, script: 0x3, flags: 0x1}, - 125: {lang: 0x159, script: 0x52, flags: 0x0}, - 127: {lang: 0x20, script: 0x52, flags: 0x0}, - 129: {lang: 0x23d, script: 0x52, flags: 0x0}, - 131: {lang: 0x159, script: 0x52, flags: 0x0}, - 132: {lang: 0x159, script: 0x52, flags: 0x0}, - 133: {lang: 0x139, script: 0x52, flags: 0x0}, - 134: {lang: 0x1a, script: 0x2, flags: 0x1}, - 135: {lang: 0x0, script: 0x52, flags: 0x0}, - 136: {lang: 0x139, script: 0x52, flags: 0x0}, - 138: {lang: 0x3b7, script: 0x52, flags: 0x0}, - 140: {lang: 0x51f, script: 0x35, flags: 0x0}, - 141: {lang: 0x0, script: 0x52, flags: 0x0}, - 142: {lang: 0x139, script: 0x52, flags: 0x0}, - 143: {lang: 0x1ca, script: 0x52, flags: 0x0}, - 144: {lang: 0x1cd, script: 0x52, flags: 0x0}, - 145: {lang: 0x1ce, script: 0x52, flags: 0x0}, - 147: {lang: 0x139, script: 0x52, flags: 0x0}, - 148: {lang: 0x1c, script: 0x2, flags: 0x1}, - 150: {lang: 0x1b5, script: 0x37, flags: 0x0}, - 152: {lang: 0x1e, script: 0x3, flags: 0x1}, - 154: {lang: 0x39, script: 0x5, flags: 0x0}, - 155: {lang: 0x21, script: 0x2, flags: 0x1}, - 156: {lang: 0x1f0, script: 0x52, flags: 0x0}, - 157: {lang: 0x1f1, script: 0x52, flags: 0x0}, - 160: {lang: 0x39, script: 0x5, flags: 0x0}, - 161: {lang: 0x1f8, script: 0x41, flags: 0x0}, - 163: {lang: 0x43b, script: 0x52, flags: 0x0}, - 164: {lang: 0x281, script: 0x1e, flags: 0x0}, - 165: {lang: 0x23, script: 0x3, flags: 0x1}, - 167: {lang: 0x26, script: 0x2, flags: 0x1}, - 169: {lang: 0x24b, script: 0x4b, flags: 0x0}, - 170: {lang: 0x24b, script: 0x4b, flags: 0x0}, - 171: {lang: 0x39, script: 0x5, flags: 0x0}, - 173: {lang: 0x3d9, script: 0x1e, flags: 0x0}, - 174: {lang: 0x28, script: 0x2, flags: 0x1}, - 175: {lang: 0x39, script: 0x5, flags: 0x0}, - 177: {lang: 0x109, script: 0x52, flags: 0x0}, - 178: {lang: 0x402, script: 0xc1, flags: 0x0}, - 180: {lang: 0x431, script: 0x52, flags: 0x0}, - 181: {lang: 0x2b7, script: 0x52, flags: 0x0}, - 182: {lang: 0x159, script: 0x52, flags: 0x0}, - 183: {lang: 0x2be, script: 0x52, flags: 0x0}, - 184: {lang: 0x39, script: 0x5, flags: 0x0}, - 185: {lang: 0x2a, script: 0x2, flags: 0x1}, - 186: {lang: 0x159, script: 0x52, flags: 0x0}, - 187: {lang: 0x2c, script: 0x2, flags: 0x1}, - 188: {lang: 0x428, script: 0x52, flags: 0x0}, - 189: {lang: 0x159, script: 0x52, flags: 0x0}, - 190: {lang: 0x2e8, script: 0x52, flags: 0x0}, - 193: {lang: 0x2e, script: 0x2, flags: 0x1}, - 194: {lang: 0x9e, script: 0x52, flags: 0x0}, - 195: {lang: 0x30, script: 0x2, flags: 0x1}, - 196: {lang: 0x32, script: 0x2, flags: 0x1}, - 197: {lang: 0x34, script: 0x2, flags: 0x1}, - 199: {lang: 0x159, script: 0x52, flags: 0x0}, - 200: {lang: 0x36, script: 0x2, flags: 0x1}, - 202: {lang: 0x317, script: 0x52, flags: 0x0}, - 203: {lang: 0x38, script: 0x3, flags: 0x1}, - 204: {lang: 0x124, script: 0xd4, flags: 0x0}, - 206: {lang: 0x139, script: 0x52, flags: 0x0}, - 207: {lang: 0x316, script: 0x52, flags: 0x0}, - 208: {lang: 0x3b7, script: 0x52, flags: 0x0}, - 209: {lang: 0x15, script: 0x52, flags: 0x0}, - 210: {lang: 0x159, script: 0x52, flags: 0x0}, - 211: {lang: 0x1ad, script: 0x52, flags: 0x0}, - 213: {lang: 0x1ad, script: 0x5, flags: 0x2}, - 215: {lang: 0x139, script: 0x52, flags: 0x0}, - 216: {lang: 0x35e, script: 0x52, flags: 0x0}, - 217: {lang: 0x33e, script: 0x52, flags: 0x0}, - 218: {lang: 0x348, script: 0x20, flags: 0x0}, - 224: {lang: 0x39, script: 0x5, flags: 0x0}, - 225: {lang: 0x139, script: 0x52, flags: 0x0}, - 227: {lang: 0x139, script: 0x52, flags: 0x0}, - 228: {lang: 0x159, script: 0x52, flags: 0x0}, - 229: {lang: 0x47c, script: 0x52, flags: 0x0}, - 230: {lang: 0x14e, script: 0x52, flags: 0x0}, - 231: {lang: 0x3b, script: 0x3, flags: 0x1}, - 232: {lang: 0x3e, script: 0x2, flags: 0x1}, - 233: {lang: 0x159, script: 0x52, flags: 0x0}, - 235: {lang: 0x139, script: 0x52, flags: 0x0}, - 236: {lang: 0x39, script: 0x5, flags: 0x0}, - 237: {lang: 0x3b7, script: 0x52, flags: 0x0}, - 239: {lang: 0x399, script: 0x52, flags: 0x0}, - 240: {lang: 0x18e, script: 0x52, flags: 0x0}, - 242: {lang: 0x39, script: 0x5, flags: 0x0}, - 257: {lang: 0x159, script: 0x52, flags: 0x0}, - 259: {lang: 0x40, script: 0x2, flags: 0x1}, - 260: {lang: 0x428, script: 0x1e, flags: 0x0}, - 261: {lang: 0x42, script: 0x2, flags: 0x1}, - 262: {lang: 0x3dc, script: 0x52, flags: 0x0}, - 263: {lang: 0x39, script: 0x5, flags: 0x0}, - 265: {lang: 0x159, script: 0x52, flags: 0x0}, - 266: {lang: 0x39, script: 0x5, flags: 0x0}, - 267: {lang: 0x44, script: 0x2, flags: 0x1}, - 270: {lang: 0x40c, script: 0x52, flags: 0x0}, - 271: {lang: 0x33e, script: 0x52, flags: 0x0}, - 272: {lang: 0x46, script: 0x2, flags: 0x1}, - 274: {lang: 0x1f1, script: 0x52, flags: 0x0}, - 275: {lang: 0x159, script: 0x52, flags: 0x0}, - 276: {lang: 0x41f, script: 0x52, flags: 0x0}, - 277: {lang: 0x35e, script: 0x52, flags: 0x0}, - 279: {lang: 0x3b7, script: 0x52, flags: 0x0}, - 281: {lang: 0x139, script: 0x52, flags: 0x0}, - 283: {lang: 0x48, script: 0x2, flags: 0x1}, - 287: {lang: 0x159, script: 0x52, flags: 0x0}, - 288: {lang: 0x159, script: 0x52, flags: 0x0}, - 289: {lang: 0x4a, script: 0x2, flags: 0x1}, - 290: {lang: 0x4c, script: 0x3, flags: 0x1}, - 291: {lang: 0x4f, script: 0x2, flags: 0x1}, - 292: {lang: 0x46d, script: 0x52, flags: 0x0}, - 293: {lang: 0x3b7, script: 0x52, flags: 0x0}, - 294: {lang: 0x46c, script: 0x52, flags: 0x0}, - 295: {lang: 0x51, script: 0x2, flags: 0x1}, - 296: {lang: 0x478, script: 0x52, flags: 0x0}, - 298: {lang: 0x53, script: 0x4, flags: 0x1}, - 300: {lang: 0x496, script: 0x52, flags: 0x0}, - 301: {lang: 0x57, script: 0x2, flags: 0x1}, - 302: {lang: 0x43b, script: 0x52, flags: 0x0}, - 303: {lang: 0x59, script: 0x3, flags: 0x1}, - 304: {lang: 0x43b, script: 0x52, flags: 0x0}, - 308: {lang: 0x508, script: 0x37, flags: 0x2}, - 309: {lang: 0x139, script: 0x52, flags: 0x0}, - 310: {lang: 0x4b2, script: 0x52, flags: 0x0}, - 311: {lang: 0x1f1, script: 0x52, flags: 0x0}, - 314: {lang: 0x139, script: 0x52, flags: 0x0}, - 317: {lang: 0x4b9, script: 0x52, flags: 0x0}, - 318: {lang: 0x89, script: 0x52, flags: 0x0}, - 319: {lang: 0x159, script: 0x52, flags: 0x0}, - 321: {lang: 0x411, script: 0x52, flags: 0x0}, - 332: {lang: 0x5c, script: 0x2, flags: 0x1}, - 349: {lang: 0x39, script: 0x5, flags: 0x0}, - 350: {lang: 0x5e, script: 0x2, flags: 0x1}, - 355: {lang: 0x419, script: 0x52, flags: 0x0}, -} - -// likelyRegionList holds lists info associated with likelyRegion. -// Size: 384 bytes, 96 elements -var likelyRegionList = [96]likelyLangScript{ - 0: {lang: 0x143, script: 0x5, flags: 0x0}, - 1: {lang: 0x46c, script: 0x52, flags: 0x0}, - 2: {lang: 0x427, script: 0x52, flags: 0x0}, - 3: {lang: 0x2f6, script: 0x1e, flags: 0x0}, - 4: {lang: 0x1d0, script: 0x8, flags: 0x0}, - 5: {lang: 0x26b, script: 0x52, flags: 0x0}, - 6: {lang: 0xb5, script: 0x52, flags: 0x0}, - 7: {lang: 0x428, script: 0x1e, flags: 0x0}, - 8: {lang: 0x129, script: 0xd6, flags: 0x0}, - 9: {lang: 0x348, script: 0x20, flags: 0x0}, - 10: {lang: 0x51f, script: 0x34, flags: 0x0}, - 11: {lang: 0x4a2, script: 0x5, flags: 0x0}, - 12: {lang: 0x515, script: 0x35, flags: 0x0}, - 13: {lang: 0x519, script: 0x52, flags: 0x0}, - 14: {lang: 0x291, script: 0xd5, flags: 0x0}, - 15: {lang: 0x131, script: 0x2d, flags: 0x0}, - 16: {lang: 0x480, script: 0x52, flags: 0x0}, - 17: {lang: 0x39, script: 0x5, flags: 0x0}, - 18: {lang: 0x159, script: 0x52, flags: 0x0}, - 19: {lang: 0x26, script: 0x27, flags: 0x0}, - 20: {lang: 0x134, script: 0x52, flags: 0x0}, - 21: {lang: 0x261, script: 0x5, flags: 0x2}, - 22: {lang: 0x508, script: 0x37, flags: 0x2}, - 23: {lang: 0x208, script: 0x29, flags: 0x0}, - 24: {lang: 0x5, script: 0x1e, flags: 0x0}, - 25: {lang: 0x26b, script: 0x52, flags: 0x0}, - 26: {lang: 0x131, script: 0x2d, flags: 0x0}, - 27: {lang: 0x2f6, script: 0x1e, flags: 0x0}, - 28: {lang: 0x1da, script: 0x52, flags: 0x0}, - 29: {lang: 0x316, script: 0x5, flags: 0x0}, - 30: {lang: 0x1b7, script: 0x20, flags: 0x0}, - 31: {lang: 0x4aa, script: 0x5, flags: 0x0}, - 32: {lang: 0x22e, script: 0x6b, flags: 0x0}, - 33: {lang: 0x143, script: 0x5, flags: 0x0}, - 34: {lang: 0x46c, script: 0x52, flags: 0x0}, - 35: {lang: 0x242, script: 0x46, flags: 0x0}, - 36: {lang: 0xe4, script: 0x5, flags: 0x0}, - 37: {lang: 0x21e, script: 0xd5, flags: 0x0}, - 38: {lang: 0x39, script: 0x5, flags: 0x0}, - 39: {lang: 0x159, script: 0x52, flags: 0x0}, - 40: {lang: 0x2af, script: 0x4f, flags: 0x0}, - 41: {lang: 0x21e, script: 0xd5, flags: 0x0}, - 42: {lang: 0x39, script: 0x5, flags: 0x0}, - 43: {lang: 0x159, script: 0x52, flags: 0x0}, - 44: {lang: 0x3d3, script: 0x52, flags: 0x0}, - 45: {lang: 0x4a4, script: 0x1e, flags: 0x0}, - 46: {lang: 0x2f6, script: 0x1e, flags: 0x0}, - 47: {lang: 0x427, script: 0x52, flags: 0x0}, - 48: {lang: 0x328, script: 0x6b, flags: 0x0}, - 49: {lang: 0x20b, script: 0x52, flags: 0x0}, - 50: {lang: 0x302, script: 0x1e, flags: 0x0}, - 51: {lang: 0x23a, script: 0x5, flags: 0x0}, - 52: {lang: 0x51f, script: 0x35, flags: 0x0}, - 53: {lang: 0x3b7, script: 0x52, flags: 0x0}, - 54: {lang: 0x39, script: 0x5, flags: 0x0}, - 55: {lang: 0x159, script: 0x52, flags: 0x0}, - 56: {lang: 0x2e4, script: 0x52, flags: 0x0}, - 57: {lang: 0x4aa, script: 0x5, flags: 0x0}, - 58: {lang: 0x87, script: 0x20, flags: 0x0}, - 59: {lang: 0x4aa, script: 0x5, flags: 0x0}, - 60: {lang: 0x4aa, script: 0x5, flags: 0x0}, - 61: {lang: 0xbc, script: 0x20, flags: 0x0}, - 62: {lang: 0x3aa, script: 0x52, flags: 0x0}, - 63: {lang: 0x70, script: 0x1e, flags: 0x0}, - 64: {lang: 0x3d3, script: 0x52, flags: 0x0}, - 65: {lang: 0x7d, script: 0x1e, flags: 0x0}, - 66: {lang: 0x3d9, script: 0x1e, flags: 0x0}, - 67: {lang: 0x25e, script: 0x52, flags: 0x0}, - 68: {lang: 0x43a, script: 0x52, flags: 0x0}, - 69: {lang: 0x508, script: 0x37, flags: 0x0}, - 70: {lang: 0x408, script: 0x52, flags: 0x0}, - 71: {lang: 0x4a4, script: 0x1e, flags: 0x0}, - 72: {lang: 0x39, script: 0x5, flags: 0x0}, - 73: {lang: 0x159, script: 0x52, flags: 0x0}, - 74: {lang: 0x159, script: 0x52, flags: 0x0}, - 75: {lang: 0x34, script: 0x5, flags: 0x0}, - 76: {lang: 0x461, script: 0xd5, flags: 0x0}, - 77: {lang: 0x2e3, script: 0x5, flags: 0x0}, - 78: {lang: 0x306, script: 0x6b, flags: 0x0}, - 79: {lang: 0x45d, script: 0x1e, flags: 0x0}, - 80: {lang: 0x143, script: 0x5, flags: 0x0}, - 81: {lang: 0x39, script: 0x5, flags: 0x0}, - 82: {lang: 0x159, script: 0x52, flags: 0x0}, - 83: {lang: 0x480, script: 0x52, flags: 0x0}, - 84: {lang: 0x57, script: 0x5, flags: 0x0}, - 85: {lang: 0x211, script: 0x1e, flags: 0x0}, - 86: {lang: 0x80, script: 0x2d, flags: 0x0}, - 87: {lang: 0x51f, script: 0x35, flags: 0x0}, - 88: {lang: 0x482, script: 0x52, flags: 0x0}, - 89: {lang: 0x4a4, script: 0x1e, flags: 0x0}, - 90: {lang: 0x508, script: 0x37, flags: 0x0}, - 91: {lang: 0x3aa, script: 0x52, flags: 0x0}, - 92: {lang: 0x427, script: 0x52, flags: 0x0}, - 93: {lang: 0x428, script: 0x1e, flags: 0x0}, - 94: {lang: 0x159, script: 0x52, flags: 0x0}, - 95: {lang: 0x43c, script: 0x5, flags: 0x0}, -} - -type likelyTag struct { - lang uint16 - region uint16 - script uint8 -} - -// Size: 192 bytes, 32 elements -var likelyRegionGroup = [32]likelyTag{ - 1: {lang: 0x134, region: 0xd5, script: 0x52}, - 2: {lang: 0x134, region: 0x134, script: 0x52}, - 3: {lang: 0x3b7, region: 0x40, script: 0x52}, - 4: {lang: 0x134, region: 0x2e, script: 0x52}, - 5: {lang: 0x134, region: 0xd5, script: 0x52}, - 6: {lang: 0x139, region: 0xce, script: 0x52}, - 7: {lang: 0x43b, region: 0x12e, script: 0x52}, - 8: {lang: 0x39, region: 0x6a, script: 0x5}, - 9: {lang: 0x43b, region: 0x4a, script: 0x52}, - 10: {lang: 0x134, region: 0x160, script: 0x52}, - 11: {lang: 0x134, region: 0x134, script: 0x52}, - 12: {lang: 0x134, region: 0x134, script: 0x52}, - 13: {lang: 0x139, region: 0x58, script: 0x52}, - 14: {lang: 0x51f, region: 0x52, script: 0x34}, - 15: {lang: 0x1b7, region: 0x98, script: 0x20}, - 16: {lang: 0x1da, region: 0x94, script: 0x52}, - 17: {lang: 0x1f1, region: 0x9d, script: 0x52}, - 18: {lang: 0x134, region: 0x2e, script: 0x52}, - 19: {lang: 0x134, region: 0xe5, script: 0x52}, - 20: {lang: 0x134, region: 0x89, script: 0x52}, - 21: {lang: 0x411, region: 0x141, script: 0x52}, - 22: {lang: 0x51f, region: 0x52, script: 0x34}, - 23: {lang: 0x4b2, region: 0x136, script: 0x52}, - 24: {lang: 0x39, region: 0x107, script: 0x5}, - 25: {lang: 0x3d9, region: 0x105, script: 0x1e}, - 26: {lang: 0x3d9, region: 0x105, script: 0x1e}, - 27: {lang: 0x134, region: 0x7a, script: 0x52}, - 28: {lang: 0x109, region: 0x5f, script: 0x52}, - 29: {lang: 0x139, region: 0x1e, script: 0x52}, - 30: {lang: 0x134, region: 0x99, script: 0x52}, - 31: {lang: 0x134, region: 0x7a, script: 0x52}, -} +var paradigmLocales = [][3]uint16{ // 3 elements + 0: [3]uint16{0x139, 0x0, 0x7b}, + 1: [3]uint16{0x13e, 0x0, 0x1f}, + 2: [3]uint16{0x3c0, 0x41, 0xee}, +} // Size: 42 bytes type mutualIntelligibility struct { - want uint16 - have uint16 - conf uint8 - oneway bool + want uint16 + have uint16 + distance uint8 + oneway bool } - type scriptIntelligibility struct { - lang uint16 - want uint8 - have uint8 - conf uint8 + wantLang uint16 + haveLang uint16 + wantScript uint8 + haveScript uint8 + distance uint8 +} +type regionIntelligibility struct { + lang uint16 + script uint8 + group uint8 + distance uint8 } // matchLang holds pairs of langIDs of base languages that are typically // mutually intelligible. Each pair is associated with a confidence and // whether the intelligibility goes one or both ways. -// Size: 708 bytes, 118 elements -var matchLang = [118]mutualIntelligibility{ - 0: {want: 0x366, have: 0x33e, conf: 0x2, oneway: false}, - 1: {want: 0x26b, have: 0xe7, conf: 0x2, oneway: false}, - 2: {want: 0x1ca, have: 0xb5, conf: 0x2, oneway: false}, - 3: {want: 0x3fd, have: 0xb5, conf: 0x2, oneway: false}, - 4: {want: 0x428, have: 0xb5, conf: 0x2, oneway: false}, - 5: {want: 0x3fd, have: 0x1ca, conf: 0x2, oneway: false}, - 6: {want: 0x428, have: 0x1ca, conf: 0x2, oneway: false}, - 7: {want: 0x3fd, have: 0x428, conf: 0x2, oneway: false}, - 8: {want: 0x430, have: 0x1, conf: 0x2, oneway: false}, - 9: {want: 0x19c, have: 0x109, conf: 0x2, oneway: true}, - 10: {want: 0x28c, have: 0x109, conf: 0x2, oneway: true}, - 11: {want: 0xfd, have: 0x366, conf: 0x2, oneway: false}, - 12: {want: 0xfd, have: 0x33e, conf: 0x2, oneway: false}, - 13: {want: 0xe7, have: 0x26b, conf: 0x2, oneway: false}, - 14: {want: 0x5, have: 0x3d9, conf: 0x2, oneway: true}, - 15: {want: 0xc, have: 0x134, conf: 0x2, oneway: true}, - 16: {want: 0x15, have: 0x35e, conf: 0x2, oneway: true}, - 17: {want: 0x20, have: 0x134, conf: 0x2, oneway: true}, - 18: {want: 0x55, have: 0x139, conf: 0x2, oneway: true}, - 19: {want: 0x57, have: 0x3d9, conf: 0x2, oneway: true}, - 20: {want: 0x70, have: 0x3d9, conf: 0x2, oneway: true}, - 21: {want: 0x74, have: 0x134, conf: 0x2, oneway: true}, - 22: {want: 0x81, have: 0x1b7, conf: 0x2, oneway: true}, - 23: {want: 0xa3, have: 0x134, conf: 0x2, oneway: true}, - 24: {want: 0xb0, have: 0x159, conf: 0x2, oneway: true}, - 25: {want: 0xdb, have: 0x14e, conf: 0x2, oneway: true}, - 26: {want: 0xe3, have: 0x134, conf: 0x2, oneway: true}, - 27: {want: 0xe7, have: 0x39, conf: 0x2, oneway: true}, - 28: {want: 0xed, have: 0x159, conf: 0x2, oneway: true}, - 29: {want: 0xf5, have: 0x159, conf: 0x2, oneway: true}, - 30: {want: 0xfc, have: 0x134, conf: 0x2, oneway: true}, - 31: {want: 0x12c, have: 0x134, conf: 0x2, oneway: true}, - 32: {want: 0x137, have: 0x134, conf: 0x2, oneway: true}, - 33: {want: 0x13b, have: 0x14c, conf: 0x2, oneway: true}, - 34: {want: 0x140, have: 0x139, conf: 0x2, oneway: true}, - 35: {want: 0x153, have: 0xfd, conf: 0x2, oneway: true}, - 36: {want: 0x168, have: 0x35e, conf: 0x2, oneway: true}, - 37: {want: 0x169, have: 0x134, conf: 0x2, oneway: true}, - 38: {want: 0x16a, have: 0x134, conf: 0x2, oneway: true}, - 39: {want: 0x178, have: 0x134, conf: 0x2, oneway: true}, - 40: {want: 0x18a, have: 0x139, conf: 0x2, oneway: true}, - 41: {want: 0x18e, have: 0x139, conf: 0x2, oneway: true}, - 42: {want: 0x19d, have: 0x1b7, conf: 0x2, oneway: true}, - 43: {want: 0x1ad, have: 0x134, conf: 0x2, oneway: true}, - 44: {want: 0x1b1, have: 0x134, conf: 0x2, oneway: true}, - 45: {want: 0x1cd, have: 0x159, conf: 0x2, oneway: true}, - 46: {want: 0x1d0, have: 0x3d9, conf: 0x2, oneway: true}, - 47: {want: 0x1d2, have: 0x134, conf: 0x2, oneway: true}, - 48: {want: 0x1df, have: 0x134, conf: 0x2, oneway: true}, - 49: {want: 0x1f0, have: 0x134, conf: 0x2, oneway: true}, - 50: {want: 0x206, have: 0x1da, conf: 0x2, oneway: true}, - 51: {want: 0x208, have: 0x134, conf: 0x2, oneway: true}, - 52: {want: 0x225, have: 0x159, conf: 0x2, oneway: true}, - 53: {want: 0x23a, have: 0x3d9, conf: 0x2, oneway: true}, - 54: {want: 0x242, have: 0x134, conf: 0x2, oneway: true}, - 55: {want: 0x249, have: 0x134, conf: 0x2, oneway: true}, - 56: {want: 0x25c, have: 0x134, conf: 0x2, oneway: true}, - 57: {want: 0x26b, have: 0x480, conf: 0x2, oneway: true}, - 58: {want: 0x281, have: 0x3d9, conf: 0x2, oneway: true}, - 59: {want: 0x285, have: 0x1f1, conf: 0x2, oneway: true}, - 60: {want: 0x29a, have: 0x134, conf: 0x2, oneway: true}, - 61: {want: 0x2ac, have: 0x159, conf: 0x2, oneway: true}, - 62: {want: 0x2af, have: 0x134, conf: 0x2, oneway: true}, - 63: {want: 0x2b5, have: 0x134, conf: 0x2, oneway: true}, - 64: {want: 0x2ba, have: 0x159, conf: 0x2, oneway: true}, - 65: {want: 0x2e4, have: 0x134, conf: 0x2, oneway: true}, - 66: {want: 0x2e8, have: 0x159, conf: 0x2, oneway: true}, - 67: {want: 0x2f1, have: 0x134, conf: 0x2, oneway: true}, - 68: {want: 0x2f6, have: 0x7d, conf: 0x2, oneway: true}, - 69: {want: 0x2fb, have: 0x134, conf: 0x2, oneway: true}, - 70: {want: 0x302, have: 0x3d9, conf: 0x2, oneway: true}, - 71: {want: 0x312, have: 0x1b7, conf: 0x2, oneway: true}, - 72: {want: 0x316, have: 0x1da, conf: 0x2, oneway: true}, - 73: {want: 0x317, have: 0x134, conf: 0x2, oneway: true}, - 74: {want: 0x328, have: 0x134, conf: 0x2, oneway: true}, - 75: {want: 0x348, have: 0x134, conf: 0x2, oneway: true}, - 76: {want: 0x361, have: 0x33e, conf: 0x2, oneway: false}, - 77: {want: 0x361, have: 0x366, conf: 0x2, oneway: true}, - 78: {want: 0x371, have: 0x134, conf: 0x2, oneway: true}, - 79: {want: 0x37e, have: 0x134, conf: 0x2, oneway: true}, - 80: {want: 0x380, have: 0x134, conf: 0x2, oneway: true}, - 81: {want: 0x382, have: 0x159, conf: 0x2, oneway: true}, - 82: {want: 0x387, have: 0x134, conf: 0x2, oneway: true}, - 83: {want: 0x38c, have: 0x134, conf: 0x2, oneway: true}, - 84: {want: 0x394, have: 0x134, conf: 0x2, oneway: true}, - 85: {want: 0x39c, have: 0x134, conf: 0x2, oneway: true}, - 86: {want: 0x3b5, have: 0x134, conf: 0x2, oneway: true}, - 87: {want: 0x3bb, have: 0x139, conf: 0x2, oneway: true}, - 88: {want: 0x3cb, have: 0x109, conf: 0x2, oneway: true}, - 89: {want: 0x3d0, have: 0x134, conf: 0x2, oneway: true}, - 90: {want: 0x3dc, have: 0x159, conf: 0x2, oneway: true}, - 91: {want: 0x3e0, have: 0x1b7, conf: 0x2, oneway: true}, - 92: {want: 0x3f0, have: 0x134, conf: 0x2, oneway: true}, - 93: {want: 0x402, have: 0x134, conf: 0x2, oneway: true}, - 94: {want: 0x419, have: 0x134, conf: 0x2, oneway: true}, - 95: {want: 0x41f, have: 0x134, conf: 0x2, oneway: true}, - 96: {want: 0x427, have: 0x134, conf: 0x2, oneway: true}, - 97: {want: 0x431, have: 0x134, conf: 0x2, oneway: true}, - 98: {want: 0x434, have: 0x1da, conf: 0x2, oneway: true}, - 99: {want: 0x43b, have: 0x134, conf: 0x2, oneway: true}, - 100: {want: 0x446, have: 0x134, conf: 0x2, oneway: true}, - 101: {want: 0x457, have: 0x134, conf: 0x2, oneway: true}, - 102: {want: 0x45d, have: 0x3d9, conf: 0x2, oneway: true}, - 103: {want: 0x465, have: 0x134, conf: 0x2, oneway: true}, - 104: {want: 0x46c, have: 0x3d9, conf: 0x2, oneway: true}, - 105: {want: 0x3878, have: 0x134, conf: 0x2, oneway: true}, - 106: {want: 0x476, have: 0x134, conf: 0x2, oneway: true}, - 107: {want: 0x478, have: 0x134, conf: 0x2, oneway: true}, - 108: {want: 0x48a, have: 0x3d9, conf: 0x2, oneway: true}, - 109: {want: 0x493, have: 0x134, conf: 0x2, oneway: true}, - 110: {want: 0x4a2, have: 0x51f, conf: 0x2, oneway: true}, - 111: {want: 0x4aa, have: 0x134, conf: 0x2, oneway: true}, - 112: {want: 0x4b2, have: 0x3d9, conf: 0x2, oneway: true}, - 113: {want: 0x4db, have: 0x159, conf: 0x2, oneway: true}, - 114: {want: 0x4e8, have: 0x134, conf: 0x2, oneway: true}, - 115: {want: 0x508, have: 0x134, conf: 0x2, oneway: true}, - 116: {want: 0x50e, have: 0x134, conf: 0x2, oneway: true}, - 117: {want: 0x524, have: 0x134, conf: 0x2, oneway: true}, -} +var matchLang = []mutualIntelligibility{ // 113 elements + 0: {want: 0x1d1, have: 0xb7, distance: 0x4, oneway: false}, + 1: {want: 0x407, have: 0xb7, distance: 0x4, oneway: false}, + 2: {want: 0x407, have: 0x1d1, distance: 0x4, oneway: false}, + 3: {want: 0x407, have: 0x432, distance: 0x4, oneway: false}, + 4: {want: 0x43a, have: 0x1, distance: 0x4, oneway: false}, + 5: {want: 0x1a3, have: 0x10d, distance: 0x4, oneway: true}, + 6: {want: 0x295, have: 0x10d, distance: 0x4, oneway: true}, + 7: {want: 0x101, have: 0x36f, distance: 0x8, oneway: false}, + 8: {want: 0x101, have: 0x347, distance: 0x8, oneway: false}, + 9: {want: 0x5, have: 0x3e2, distance: 0xa, oneway: true}, + 10: {want: 0xd, have: 0x139, distance: 0xa, oneway: true}, + 11: {want: 0x16, have: 0x367, distance: 0xa, oneway: true}, + 12: {want: 0x21, have: 0x139, distance: 0xa, oneway: true}, + 13: {want: 0x56, have: 0x13e, distance: 0xa, oneway: true}, + 14: {want: 0x58, have: 0x3e2, distance: 0xa, oneway: true}, + 15: {want: 0x71, have: 0x3e2, distance: 0xa, oneway: true}, + 16: {want: 0x75, have: 0x139, distance: 0xa, oneway: true}, + 17: {want: 0x82, have: 0x1be, distance: 0xa, oneway: true}, + 18: {want: 0xa5, have: 0x139, distance: 0xa, oneway: true}, + 19: {want: 0xb2, have: 0x15e, distance: 0xa, oneway: true}, + 20: {want: 0xdd, have: 0x153, distance: 0xa, oneway: true}, + 21: {want: 0xe5, have: 0x139, distance: 0xa, oneway: true}, + 22: {want: 0xe9, have: 0x3a, distance: 0xa, oneway: true}, + 23: {want: 0xf0, have: 0x15e, distance: 0xa, oneway: true}, + 24: {want: 0xf9, have: 0x15e, distance: 0xa, oneway: true}, + 25: {want: 0x100, have: 0x139, distance: 0xa, oneway: true}, + 26: {want: 0x130, have: 0x139, distance: 0xa, oneway: true}, + 27: {want: 0x13c, have: 0x139, distance: 0xa, oneway: true}, + 28: {want: 0x140, have: 0x151, distance: 0xa, oneway: true}, + 29: {want: 0x145, have: 0x13e, distance: 0xa, oneway: true}, + 30: {want: 0x158, have: 0x101, distance: 0xa, oneway: true}, + 31: {want: 0x16d, have: 0x367, distance: 0xa, oneway: true}, + 32: {want: 0x16e, have: 0x139, distance: 0xa, oneway: true}, + 33: {want: 0x16f, have: 0x139, distance: 0xa, oneway: true}, + 34: {want: 0x17e, have: 0x139, distance: 0xa, oneway: true}, + 35: {want: 0x190, have: 0x13e, distance: 0xa, oneway: true}, + 36: {want: 0x194, have: 0x13e, distance: 0xa, oneway: true}, + 37: {want: 0x1a4, have: 0x1be, distance: 0xa, oneway: true}, + 38: {want: 0x1b4, have: 0x139, distance: 0xa, oneway: true}, + 39: {want: 0x1b8, have: 0x139, distance: 0xa, oneway: true}, + 40: {want: 0x1d4, have: 0x15e, distance: 0xa, oneway: true}, + 41: {want: 0x1d7, have: 0x3e2, distance: 0xa, oneway: true}, + 42: {want: 0x1d9, have: 0x139, distance: 0xa, oneway: true}, + 43: {want: 0x1e7, have: 0x139, distance: 0xa, oneway: true}, + 44: {want: 0x1f8, have: 0x139, distance: 0xa, oneway: true}, + 45: {want: 0x20e, have: 0x1e1, distance: 0xa, oneway: true}, + 46: {want: 0x210, have: 0x139, distance: 0xa, oneway: true}, + 47: {want: 0x22d, have: 0x15e, distance: 0xa, oneway: true}, + 48: {want: 0x242, have: 0x3e2, distance: 0xa, oneway: true}, + 49: {want: 0x24a, have: 0x139, distance: 0xa, oneway: true}, + 50: {want: 0x251, have: 0x139, distance: 0xa, oneway: true}, + 51: {want: 0x265, have: 0x139, distance: 0xa, oneway: true}, + 52: {want: 0x274, have: 0x48a, distance: 0xa, oneway: true}, + 53: {want: 0x28a, have: 0x3e2, distance: 0xa, oneway: true}, + 54: {want: 0x28e, have: 0x1f9, distance: 0xa, oneway: true}, + 55: {want: 0x2a3, have: 0x139, distance: 0xa, oneway: true}, + 56: {want: 0x2b5, have: 0x15e, distance: 0xa, oneway: true}, + 57: {want: 0x2b8, have: 0x139, distance: 0xa, oneway: true}, + 58: {want: 0x2be, have: 0x139, distance: 0xa, oneway: true}, + 59: {want: 0x2c3, have: 0x15e, distance: 0xa, oneway: true}, + 60: {want: 0x2ed, have: 0x139, distance: 0xa, oneway: true}, + 61: {want: 0x2f1, have: 0x15e, distance: 0xa, oneway: true}, + 62: {want: 0x2fa, have: 0x139, distance: 0xa, oneway: true}, + 63: {want: 0x2ff, have: 0x7e, distance: 0xa, oneway: true}, + 64: {want: 0x304, have: 0x139, distance: 0xa, oneway: true}, + 65: {want: 0x30b, have: 0x3e2, distance: 0xa, oneway: true}, + 66: {want: 0x31b, have: 0x1be, distance: 0xa, oneway: true}, + 67: {want: 0x31f, have: 0x1e1, distance: 0xa, oneway: true}, + 68: {want: 0x320, have: 0x139, distance: 0xa, oneway: true}, + 69: {want: 0x331, have: 0x139, distance: 0xa, oneway: true}, + 70: {want: 0x351, have: 0x139, distance: 0xa, oneway: true}, + 71: {want: 0x36a, have: 0x347, distance: 0xa, oneway: false}, + 72: {want: 0x36a, have: 0x36f, distance: 0xa, oneway: true}, + 73: {want: 0x37a, have: 0x139, distance: 0xa, oneway: true}, + 74: {want: 0x387, have: 0x139, distance: 0xa, oneway: true}, + 75: {want: 0x389, have: 0x139, distance: 0xa, oneway: true}, + 76: {want: 0x38b, have: 0x15e, distance: 0xa, oneway: true}, + 77: {want: 0x390, have: 0x139, distance: 0xa, oneway: true}, + 78: {want: 0x395, have: 0x139, distance: 0xa, oneway: true}, + 79: {want: 0x39d, have: 0x139, distance: 0xa, oneway: true}, + 80: {want: 0x3a5, have: 0x139, distance: 0xa, oneway: true}, + 81: {want: 0x3be, have: 0x139, distance: 0xa, oneway: true}, + 82: {want: 0x3c4, have: 0x13e, distance: 0xa, oneway: true}, + 83: {want: 0x3d4, have: 0x10d, distance: 0xa, oneway: true}, + 84: {want: 0x3d9, have: 0x139, distance: 0xa, oneway: true}, + 85: {want: 0x3e5, have: 0x15e, distance: 0xa, oneway: true}, + 86: {want: 0x3e9, have: 0x1be, distance: 0xa, oneway: true}, + 87: {want: 0x3fa, have: 0x139, distance: 0xa, oneway: true}, + 88: {want: 0x40c, have: 0x139, distance: 0xa, oneway: true}, + 89: {want: 0x423, have: 0x139, distance: 0xa, oneway: true}, + 90: {want: 0x429, have: 0x139, distance: 0xa, oneway: true}, + 91: {want: 0x431, have: 0x139, distance: 0xa, oneway: true}, + 92: {want: 0x43b, have: 0x139, distance: 0xa, oneway: true}, + 93: {want: 0x43e, have: 0x1e1, distance: 0xa, oneway: true}, + 94: {want: 0x445, have: 0x139, distance: 0xa, oneway: true}, + 95: {want: 0x450, have: 0x139, distance: 0xa, oneway: true}, + 96: {want: 0x461, have: 0x139, distance: 0xa, oneway: true}, + 97: {want: 0x467, have: 0x3e2, distance: 0xa, oneway: true}, + 98: {want: 0x46f, have: 0x139, distance: 0xa, oneway: true}, + 99: {want: 0x476, have: 0x3e2, distance: 0xa, oneway: true}, + 100: {want: 0x3883, have: 0x139, distance: 0xa, oneway: true}, + 101: {want: 0x480, have: 0x139, distance: 0xa, oneway: true}, + 102: {want: 0x482, have: 0x139, distance: 0xa, oneway: true}, + 103: {want: 0x494, have: 0x3e2, distance: 0xa, oneway: true}, + 104: {want: 0x49d, have: 0x139, distance: 0xa, oneway: true}, + 105: {want: 0x4ac, have: 0x529, distance: 0xa, oneway: true}, + 106: {want: 0x4b4, have: 0x139, distance: 0xa, oneway: true}, + 107: {want: 0x4bc, have: 0x3e2, distance: 0xa, oneway: true}, + 108: {want: 0x4e5, have: 0x15e, distance: 0xa, oneway: true}, + 109: {want: 0x4f2, have: 0x139, distance: 0xa, oneway: true}, + 110: {want: 0x512, have: 0x139, distance: 0xa, oneway: true}, + 111: {want: 0x518, have: 0x139, distance: 0xa, oneway: true}, + 112: {want: 0x52f, have: 0x139, distance: 0xa, oneway: true}, +} // Size: 702 bytes // matchScript holds pairs of scriptIDs where readers of one script // can typically also read the other. Each is associated with a confidence. -// Size: 24 bytes, 4 elements -var matchScript = [4]scriptIntelligibility{ - 0: {lang: 0x428, want: 0x52, have: 0x1e, conf: 0x2}, - 1: {lang: 0x428, want: 0x1e, have: 0x52, conf: 0x2}, - 2: {lang: 0x0, want: 0x34, have: 0x35, conf: 0x1}, - 3: {lang: 0x0, want: 0x35, have: 0x34, conf: 0x1}, -} - -// Size: 128 bytes, 32 elements -var regionContainment = [32]uint32{ - 0xffffffff, 0x000007a2, 0x00003044, 0x00000008, - 0x403c0010, 0x00000020, 0x00000040, 0x00000080, - 0x00000100, 0x00000200, 0x00000400, 0x2000384c, - 0x00001000, 0x00002000, 0x00004000, 0x00008000, - 0x00010000, 0x00020000, 0x00040000, 0x00080000, - 0x00100000, 0x00200000, 0x01c1c000, 0x00800000, - 0x01000000, 0x1e020000, 0x04000000, 0x08000000, - 0x10000000, 0x20002048, 0x40000000, 0x80000000, -} - -// regionInclusion maps region identifiers to sets of regions in regionInclusionBits, -// where each set holds all groupings that are directly connected in a region -// containment graph. -// Size: 357 bytes, 357 elements -var regionInclusion = [357]uint8{ - // Entry 0 - 3F - 0x00, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, - 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, - 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, - 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x20, - 0x21, 0x22, 0x23, 0x24, 0x25, 0x25, 0x22, 0x23, - 0x25, 0x26, 0x21, 0x27, 0x28, 0x29, 0x2a, 0x25, - 0x2b, 0x23, 0x22, 0x25, 0x24, 0x29, 0x2c, 0x2d, - 0x23, 0x2e, 0x2c, 0x25, 0x2f, 0x30, 0x27, 0x25, - // Entry 40 - 7F - 0x27, 0x25, 0x24, 0x30, 0x21, 0x31, 0x32, 0x33, - 0x2f, 0x21, 0x26, 0x26, 0x26, 0x34, 0x2c, 0x28, - 0x27, 0x26, 0x35, 0x27, 0x21, 0x33, 0x22, 0x20, - 0x25, 0x2c, 0x25, 0x21, 0x36, 0x2d, 0x34, 0x29, - 0x21, 0x2e, 0x37, 0x25, 0x25, 0x20, 0x38, 0x38, - 0x27, 0x37, 0x38, 0x38, 0x2e, 0x39, 0x2e, 0x1f, - 0x20, 0x37, 0x3a, 0x27, 0x3b, 0x2b, 0x20, 0x29, - 0x34, 0x26, 0x37, 0x25, 0x23, 0x27, 0x2b, 0x2c, - // Entry 80 - BF - 0x22, 0x2f, 0x2c, 0x2c, 0x25, 0x26, 0x39, 0x21, - 0x33, 0x3b, 0x2c, 0x27, 0x35, 0x21, 0x33, 0x39, - 0x25, 0x2d, 0x20, 0x38, 0x30, 0x37, 0x23, 0x2b, - 0x24, 0x21, 0x23, 0x24, 0x2b, 0x39, 0x2b, 0x25, - 0x23, 0x35, 0x20, 0x2e, 0x3c, 0x30, 0x3b, 0x2e, - 0x25, 0x35, 0x35, 0x23, 0x25, 0x3c, 0x30, 0x23, - 0x25, 0x34, 0x24, 0x2c, 0x31, 0x37, 0x29, 0x37, - 0x38, 0x38, 0x34, 0x32, 0x22, 0x25, 0x2e, 0x3b, - // Entry C0 - FF - 0x20, 0x22, 0x2c, 0x30, 0x35, 0x35, 0x3b, 0x25, - 0x2c, 0x25, 0x39, 0x2e, 0x24, 0x2e, 0x33, 0x30, - 0x2e, 0x31, 0x3a, 0x2c, 0x2a, 0x2c, 0x20, 0x33, - 0x29, 0x2b, 0x24, 0x20, 0x3b, 0x23, 0x28, 0x2a, - 0x23, 0x33, 0x20, 0x27, 0x28, 0x3a, 0x30, 0x24, - 0x2d, 0x2f, 0x28, 0x25, 0x23, 0x39, 0x20, 0x3b, - 0x27, 0x20, 0x23, 0x20, 0x20, 0x1e, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - // Entry 100 - 13F - 0x20, 0x2e, 0x20, 0x2d, 0x22, 0x32, 0x2e, 0x23, - 0x3a, 0x2e, 0x38, 0x37, 0x30, 0x2c, 0x39, 0x2b, - 0x2d, 0x2c, 0x22, 0x2c, 0x2e, 0x27, 0x2e, 0x26, - 0x32, 0x33, 0x25, 0x23, 0x31, 0x21, 0x25, 0x26, - 0x21, 0x2c, 0x30, 0x3c, 0x28, 0x30, 0x3c, 0x38, - 0x28, 0x30, 0x23, 0x25, 0x28, 0x35, 0x2e, 0x32, - 0x2e, 0x20, 0x21, 0x20, 0x2f, 0x27, 0x3c, 0x22, - 0x25, 0x20, 0x27, 0x25, 0x25, 0x30, 0x3a, 0x28, - // Entry 140 - 17F - 0x20, 0x28, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x22, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x23, 0x23, 0x2e, 0x22, - 0x31, 0x2e, 0x26, 0x2e, 0x20, -} - -// regionInclusionBits is an array of bit vectors where every vector represents -// a set of region groupings. These sets are used to compute the distance -// between two regions for the purpose of language matching. -// Size: 288 bytes, 72 elements -var regionInclusionBits = [72]uint32{ - // Entry 0 - 1F - 0x82400813, 0x000007a3, 0x00003844, 0x20000808, - 0x403c0011, 0x00000022, 0x20000844, 0x00000082, - 0x00000102, 0x00000202, 0x00000402, 0x2000384d, - 0x00001804, 0x20002804, 0x00404000, 0x00408000, - 0x00410000, 0x02020000, 0x00040010, 0x00080010, - 0x00100010, 0x00200010, 0x01c1c001, 0x00c00000, - 0x01400000, 0x1e020001, 0x06000000, 0x0a000000, - 0x12000000, 0x20002848, 0x40000010, 0x80000001, - // Entry 20 - 3F - 0x00000001, 0x40000000, 0x00020000, 0x01000000, - 0x00008000, 0x00002000, 0x00000200, 0x00000008, - 0x00200000, 0x90000000, 0x00040000, 0x08000000, - 0x00000020, 0x84000000, 0x00000080, 0x00001000, - 0x00010000, 0x00000400, 0x04000000, 0x00000040, - 0x10000000, 0x00004000, 0x81000000, 0x88000000, - 0x00000100, 0x80020000, 0x00080000, 0x00100000, - 0x00800000, 0xffffffff, 0x82400fb3, 0xc27c0813, - // Entry 40 - 5F - 0xa240385f, 0x83c1c813, 0x9e420813, 0x92000001, - 0x86000001, 0x81400001, 0x8a000001, 0x82020001, -} - -// regionInclusionNext marks, for each entry in regionInclusionBits, the set of -// all groups that are reachable from the groups set in the respective entry. -// Size: 72 bytes, 72 elements -var regionInclusionNext = [72]uint8{ - // Entry 0 - 3F - 0x3d, 0x3e, 0x0b, 0x0b, 0x3f, 0x01, 0x0b, 0x01, - 0x01, 0x01, 0x01, 0x40, 0x0b, 0x0b, 0x16, 0x16, - 0x16, 0x19, 0x04, 0x04, 0x04, 0x04, 0x41, 0x16, - 0x16, 0x42, 0x19, 0x19, 0x19, 0x0b, 0x04, 0x00, - 0x00, 0x1e, 0x11, 0x18, 0x0f, 0x0d, 0x09, 0x03, - 0x15, 0x43, 0x12, 0x1b, 0x05, 0x44, 0x07, 0x0c, - 0x10, 0x0a, 0x1a, 0x06, 0x1c, 0x0e, 0x45, 0x46, - 0x08, 0x47, 0x13, 0x14, 0x17, 0x3d, 0x3d, 0x3d, - // Entry 40 - 7F - 0x3d, 0x3d, 0x3d, 0x42, 0x42, 0x41, 0x42, 0x42, -} - -type parentRel struct { - lang uint16 - script uint8 - maxScript uint8 - toRegion uint16 - fromRegion []uint16 -} - -// Size: 412 bytes, 5 elements -var parents = [5]parentRel{ - 0: {lang: 0x134, script: 0x0, maxScript: 0x52, toRegion: 0x1, fromRegion: []uint16{0x1a, 0x24, 0x25, 0x2e, 0x33, 0x35, 0x3c, 0x41, 0x45, 0x47, 0x48, 0x49, 0x4f, 0x51, 0x5b, 0x5c, 0x60, 0x63, 0x6c, 0x72, 0x73, 0x74, 0x7a, 0x7b, 0x7e, 0x7f, 0x80, 0x82, 0x8b, 0x8c, 0x95, 0x96, 0x97, 0x98, 0x99, 0x9e, 0x9f, 0xa3, 0xa6, 0xa8, 0xac, 0xb0, 0xb3, 0xb4, 0xbe, 0xc5, 0xc9, 0xca, 0xcb, 0xcd, 0xcf, 0xd1, 0xd4, 0xd5, 0xdc, 0xde, 0xdf, 0xe5, 0xe6, 0xe7, 0xea, 0xef, 0x106, 0x108, 0x109, 0x10a, 0x10c, 0x10d, 0x111, 0x116, 0x11a, 0x11c, 0x11e, 0x124, 0x128, 0x12b, 0x12c, 0x12e, 0x130, 0x138, 0x13b, 0x13e, 0x141, 0x160, 0x161, 0x163}}, - 1: {lang: 0x134, script: 0x0, maxScript: 0x52, toRegion: 0x1a, fromRegion: []uint16{0x2d, 0x4d, 0x5f, 0x62, 0x71, 0xd8, 0x10b, 0x10e}}, - 2: {lang: 0x139, script: 0x0, maxScript: 0x52, toRegion: 0x1e, fromRegion: []uint16{0x2b, 0x3e, 0x40, 0x50, 0x53, 0x55, 0x58, 0x64, 0x68, 0x88, 0x8e, 0xce, 0xd7, 0xe1, 0xe3, 0xeb, 0xf0, 0x119, 0x134, 0x135, 0x13a}}, - 3: {lang: 0x3b7, script: 0x0, maxScript: 0x52, toRegion: 0xed, fromRegion: []uint16{0x29, 0x4d, 0x59, 0x85, 0x8a, 0xb6, 0xc5, 0xd0, 0x117, 0x125}}, - 4: {lang: 0x51f, script: 0x35, maxScript: 0x35, toRegion: 0x8c, fromRegion: []uint16{0xc5}}, -} - -// Total table size 25825 bytes (25KiB); checksum: 4E97CC5E +var matchScript = []scriptIntelligibility{ // 26 elements + 0: {wantLang: 0x432, haveLang: 0x432, wantScript: 0x57, haveScript: 0x1f, distance: 0x5}, + 1: {wantLang: 0x432, haveLang: 0x432, wantScript: 0x1f, haveScript: 0x57, distance: 0x5}, + 2: {wantLang: 0x58, haveLang: 0x3e2, wantScript: 0x57, haveScript: 0x1f, distance: 0xa}, + 3: {wantLang: 0xa5, haveLang: 0x139, wantScript: 0xe, haveScript: 0x57, distance: 0xa}, + 4: {wantLang: 0x1d7, haveLang: 0x3e2, wantScript: 0x8, haveScript: 0x1f, distance: 0xa}, + 5: {wantLang: 0x210, haveLang: 0x139, wantScript: 0x2b, haveScript: 0x57, distance: 0xa}, + 6: {wantLang: 0x24a, haveLang: 0x139, wantScript: 0x4b, haveScript: 0x57, distance: 0xa}, + 7: {wantLang: 0x251, haveLang: 0x139, wantScript: 0x4f, haveScript: 0x57, distance: 0xa}, + 8: {wantLang: 0x2b8, haveLang: 0x139, wantScript: 0x54, haveScript: 0x57, distance: 0xa}, + 9: {wantLang: 0x304, haveLang: 0x139, wantScript: 0x6b, haveScript: 0x57, distance: 0xa}, + 10: {wantLang: 0x331, haveLang: 0x139, wantScript: 0x72, haveScript: 0x57, distance: 0xa}, + 11: {wantLang: 0x351, haveLang: 0x139, wantScript: 0x21, haveScript: 0x57, distance: 0xa}, + 12: {wantLang: 0x395, haveLang: 0x139, wantScript: 0x7d, haveScript: 0x57, distance: 0xa}, + 13: {wantLang: 0x39d, haveLang: 0x139, wantScript: 0x33, haveScript: 0x57, distance: 0xa}, + 14: {wantLang: 0x3be, haveLang: 0x139, wantScript: 0x5, haveScript: 0x57, distance: 0xa}, + 15: {wantLang: 0x3fa, haveLang: 0x139, wantScript: 0x5, haveScript: 0x57, distance: 0xa}, + 16: {wantLang: 0x40c, haveLang: 0x139, wantScript: 0xca, haveScript: 0x57, distance: 0xa}, + 17: {wantLang: 0x450, haveLang: 0x139, wantScript: 0xd7, haveScript: 0x57, distance: 0xa}, + 18: {wantLang: 0x461, haveLang: 0x139, wantScript: 0xda, haveScript: 0x57, distance: 0xa}, + 19: {wantLang: 0x46f, haveLang: 0x139, wantScript: 0x29, haveScript: 0x57, distance: 0xa}, + 20: {wantLang: 0x476, haveLang: 0x3e2, wantScript: 0x57, haveScript: 0x1f, distance: 0xa}, + 21: {wantLang: 0x4b4, haveLang: 0x139, wantScript: 0x5, haveScript: 0x57, distance: 0xa}, + 22: {wantLang: 0x4bc, haveLang: 0x3e2, wantScript: 0x57, haveScript: 0x1f, distance: 0xa}, + 23: {wantLang: 0x512, haveLang: 0x139, wantScript: 0x3b, haveScript: 0x57, distance: 0xa}, + 24: {wantLang: 0x529, haveLang: 0x529, wantScript: 0x38, haveScript: 0x39, distance: 0xf}, + 25: {wantLang: 0x529, haveLang: 0x529, wantScript: 0x39, haveScript: 0x38, distance: 0x13}, +} // Size: 232 bytes + +var matchRegion = []regionIntelligibility{ // 15 elements + 0: {lang: 0x3a, script: 0x0, group: 0x4, distance: 0x4}, + 1: {lang: 0x3a, script: 0x0, group: 0x84, distance: 0x4}, + 2: {lang: 0x139, script: 0x0, group: 0x1, distance: 0x4}, + 3: {lang: 0x139, script: 0x0, group: 0x81, distance: 0x4}, + 4: {lang: 0x13e, script: 0x0, group: 0x3, distance: 0x4}, + 5: {lang: 0x13e, script: 0x0, group: 0x83, distance: 0x4}, + 6: {lang: 0x3c0, script: 0x0, group: 0x3, distance: 0x4}, + 7: {lang: 0x3c0, script: 0x0, group: 0x83, distance: 0x4}, + 8: {lang: 0x529, script: 0x39, group: 0x2, distance: 0x4}, + 9: {lang: 0x529, script: 0x39, group: 0x82, distance: 0x4}, + 10: {lang: 0x3a, script: 0x0, group: 0x80, distance: 0x5}, + 11: {lang: 0x139, script: 0x0, group: 0x80, distance: 0x5}, + 12: {lang: 0x13e, script: 0x0, group: 0x80, distance: 0x5}, + 13: {lang: 0x3c0, script: 0x0, group: 0x80, distance: 0x5}, + 14: {lang: 0x529, script: 0x39, group: 0x80, distance: 0x5}, +} // Size: 114 bytes + +// Total table size 1471 bytes (1KiB); checksum: 4CB1CD46 diff --git a/vendor/golang.org/x/text/language/tags.go b/vendor/golang.org/x/text/language/tags.go index de30155a2..42ea79266 100644 --- a/vendor/golang.org/x/text/language/tags.go +++ b/vendor/golang.org/x/text/language/tags.go @@ -4,6 +4,8 @@ package language +import "golang.org/x/text/internal/language/compact" + // TODO: Various sets of commonly use tags and regions. // MustParse is like Parse, but panics if the given BCP 47 tag cannot be parsed. @@ -61,83 +63,83 @@ var ( Und Tag = Tag{} - Afrikaans Tag = Tag{lang: _af} // af - Amharic Tag = Tag{lang: _am} // am - Arabic Tag = Tag{lang: _ar} // ar - ModernStandardArabic Tag = Tag{lang: _ar, region: _001} // ar-001 - Azerbaijani Tag = Tag{lang: _az} // az - Bulgarian Tag = Tag{lang: _bg} // bg - Bengali Tag = Tag{lang: _bn} // bn - Catalan Tag = Tag{lang: _ca} // ca - Czech Tag = Tag{lang: _cs} // cs - Danish Tag = Tag{lang: _da} // da - German Tag = Tag{lang: _de} // de - Greek Tag = Tag{lang: _el} // el - English Tag = Tag{lang: _en} // en - AmericanEnglish Tag = Tag{lang: _en, region: _US} // en-US - BritishEnglish Tag = Tag{lang: _en, region: _GB} // en-GB - Spanish Tag = Tag{lang: _es} // es - EuropeanSpanish Tag = Tag{lang: _es, region: _ES} // es-ES - LatinAmericanSpanish Tag = Tag{lang: _es, region: _419} // es-419 - Estonian Tag = Tag{lang: _et} // et - Persian Tag = Tag{lang: _fa} // fa - Finnish Tag = Tag{lang: _fi} // fi - Filipino Tag = Tag{lang: _fil} // fil - French Tag = Tag{lang: _fr} // fr - CanadianFrench Tag = Tag{lang: _fr, region: _CA} // fr-CA - Gujarati Tag = Tag{lang: _gu} // gu - Hebrew Tag = Tag{lang: _he} // he - Hindi Tag = Tag{lang: _hi} // hi - Croatian Tag = Tag{lang: _hr} // hr - Hungarian Tag = Tag{lang: _hu} // hu - Armenian Tag = Tag{lang: _hy} // hy - Indonesian Tag = Tag{lang: _id} // id - Icelandic Tag = Tag{lang: _is} // is - Italian Tag = Tag{lang: _it} // it - Japanese Tag = Tag{lang: _ja} // ja - Georgian Tag = Tag{lang: _ka} // ka - Kazakh Tag = Tag{lang: _kk} // kk - Khmer Tag = Tag{lang: _km} // km - Kannada Tag = Tag{lang: _kn} // kn - Korean Tag = Tag{lang: _ko} // ko - Kirghiz Tag = Tag{lang: _ky} // ky - Lao Tag = Tag{lang: _lo} // lo - Lithuanian Tag = Tag{lang: _lt} // lt - Latvian Tag = Tag{lang: _lv} // lv - Macedonian Tag = Tag{lang: _mk} // mk - Malayalam Tag = Tag{lang: _ml} // ml - Mongolian Tag = Tag{lang: _mn} // mn - Marathi Tag = Tag{lang: _mr} // mr - Malay Tag = Tag{lang: _ms} // ms - Burmese Tag = Tag{lang: _my} // my - Nepali Tag = Tag{lang: _ne} // ne - Dutch Tag = Tag{lang: _nl} // nl - Norwegian Tag = Tag{lang: _no} // no - Punjabi Tag = Tag{lang: _pa} // pa - Polish Tag = Tag{lang: _pl} // pl - Portuguese Tag = Tag{lang: _pt} // pt - BrazilianPortuguese Tag = Tag{lang: _pt, region: _BR} // pt-BR - EuropeanPortuguese Tag = Tag{lang: _pt, region: _PT} // pt-PT - Romanian Tag = Tag{lang: _ro} // ro - Russian Tag = Tag{lang: _ru} // ru - Sinhala Tag = Tag{lang: _si} // si - Slovak Tag = Tag{lang: _sk} // sk - Slovenian Tag = Tag{lang: _sl} // sl - Albanian Tag = Tag{lang: _sq} // sq - Serbian Tag = Tag{lang: _sr} // sr - SerbianLatin Tag = Tag{lang: _sr, script: _Latn} // sr-Latn - Swedish Tag = Tag{lang: _sv} // sv - Swahili Tag = Tag{lang: _sw} // sw - Tamil Tag = Tag{lang: _ta} // ta - Telugu Tag = Tag{lang: _te} // te - Thai Tag = Tag{lang: _th} // th - Turkish Tag = Tag{lang: _tr} // tr - Ukrainian Tag = Tag{lang: _uk} // uk - Urdu Tag = Tag{lang: _ur} // ur - Uzbek Tag = Tag{lang: _uz} // uz - Vietnamese Tag = Tag{lang: _vi} // vi - Chinese Tag = Tag{lang: _zh} // zh - SimplifiedChinese Tag = Tag{lang: _zh, script: _Hans} // zh-Hans - TraditionalChinese Tag = Tag{lang: _zh, script: _Hant} // zh-Hant - Zulu Tag = Tag{lang: _zu} // zu + Afrikaans Tag = Tag(compact.Afrikaans) + Amharic Tag = Tag(compact.Amharic) + Arabic Tag = Tag(compact.Arabic) + ModernStandardArabic Tag = Tag(compact.ModernStandardArabic) + Azerbaijani Tag = Tag(compact.Azerbaijani) + Bulgarian Tag = Tag(compact.Bulgarian) + Bengali Tag = Tag(compact.Bengali) + Catalan Tag = Tag(compact.Catalan) + Czech Tag = Tag(compact.Czech) + Danish Tag = Tag(compact.Danish) + German Tag = Tag(compact.German) + Greek Tag = Tag(compact.Greek) + English Tag = Tag(compact.English) + AmericanEnglish Tag = Tag(compact.AmericanEnglish) + BritishEnglish Tag = Tag(compact.BritishEnglish) + Spanish Tag = Tag(compact.Spanish) + EuropeanSpanish Tag = Tag(compact.EuropeanSpanish) + LatinAmericanSpanish Tag = Tag(compact.LatinAmericanSpanish) + Estonian Tag = Tag(compact.Estonian) + Persian Tag = Tag(compact.Persian) + Finnish Tag = Tag(compact.Finnish) + Filipino Tag = Tag(compact.Filipino) + French Tag = Tag(compact.French) + CanadianFrench Tag = Tag(compact.CanadianFrench) + Gujarati Tag = Tag(compact.Gujarati) + Hebrew Tag = Tag(compact.Hebrew) + Hindi Tag = Tag(compact.Hindi) + Croatian Tag = Tag(compact.Croatian) + Hungarian Tag = Tag(compact.Hungarian) + Armenian Tag = Tag(compact.Armenian) + Indonesian Tag = Tag(compact.Indonesian) + Icelandic Tag = Tag(compact.Icelandic) + Italian Tag = Tag(compact.Italian) + Japanese Tag = Tag(compact.Japanese) + Georgian Tag = Tag(compact.Georgian) + Kazakh Tag = Tag(compact.Kazakh) + Khmer Tag = Tag(compact.Khmer) + Kannada Tag = Tag(compact.Kannada) + Korean Tag = Tag(compact.Korean) + Kirghiz Tag = Tag(compact.Kirghiz) + Lao Tag = Tag(compact.Lao) + Lithuanian Tag = Tag(compact.Lithuanian) + Latvian Tag = Tag(compact.Latvian) + Macedonian Tag = Tag(compact.Macedonian) + Malayalam Tag = Tag(compact.Malayalam) + Mongolian Tag = Tag(compact.Mongolian) + Marathi Tag = Tag(compact.Marathi) + Malay Tag = Tag(compact.Malay) + Burmese Tag = Tag(compact.Burmese) + Nepali Tag = Tag(compact.Nepali) + Dutch Tag = Tag(compact.Dutch) + Norwegian Tag = Tag(compact.Norwegian) + Punjabi Tag = Tag(compact.Punjabi) + Polish Tag = Tag(compact.Polish) + Portuguese Tag = Tag(compact.Portuguese) + BrazilianPortuguese Tag = Tag(compact.BrazilianPortuguese) + EuropeanPortuguese Tag = Tag(compact.EuropeanPortuguese) + Romanian Tag = Tag(compact.Romanian) + Russian Tag = Tag(compact.Russian) + Sinhala Tag = Tag(compact.Sinhala) + Slovak Tag = Tag(compact.Slovak) + Slovenian Tag = Tag(compact.Slovenian) + Albanian Tag = Tag(compact.Albanian) + Serbian Tag = Tag(compact.Serbian) + SerbianLatin Tag = Tag(compact.SerbianLatin) + Swedish Tag = Tag(compact.Swedish) + Swahili Tag = Tag(compact.Swahili) + Tamil Tag = Tag(compact.Tamil) + Telugu Tag = Tag(compact.Telugu) + Thai Tag = Tag(compact.Thai) + Turkish Tag = Tag(compact.Turkish) + Ukrainian Tag = Tag(compact.Ukrainian) + Urdu Tag = Tag(compact.Urdu) + Uzbek Tag = Tag(compact.Uzbek) + Vietnamese Tag = Tag(compact.Vietnamese) + Chinese Tag = Tag(compact.Chinese) + SimplifiedChinese Tag = Tag(compact.SimplifiedChinese) + TraditionalChinese Tag = Tag(compact.TraditionalChinese) + Zulu Tag = Tag(compact.Zulu) ) -- cgit v1.2.3-54-g00ecf