diff --git a/src/corelib/global/qtenvironmentvariables.cpp b/src/corelib/global/qtenvironmentvariables.cpp index cf5955902a8..1afdef8912b 100644 --- a/src/corelib/global/qtenvironmentvariables.cpp +++ b/src/corelib/global/qtenvironmentvariables.cpp @@ -401,6 +401,9 @@ bool qLocalTime(time_t utc, struct tm *local) tzset() or anything that behaves as if it called tzset(). So also lock this access to prevent such collisions. + Note that, on Windows, the return is a Microsoft-specific full name for the + zone, not an abbreviation. + Parameter dstIndex must be 1 for DST or 0 for standard time. Returns the relevant form of the name of local-time's zone. */ diff --git a/src/corelib/text/qlocale.cpp b/src/corelib/text/qlocale.cpp index 75bbe4c7722..86538c9c2ce 100644 --- a/src/corelib/text/qlocale.cpp +++ b/src/corelib/text/qlocale.cpp @@ -307,6 +307,9 @@ QLocaleId QLocaleId::withLikelySubtagsAdded() const are specified in the key are replaced by the match (even if different); but the other tags of this replace what's in the match (even when the match does specify a value). + + Keep QLocaleXmlReader.__fillLikely() in sync with this, to ensure + locale-appropriate time-zone naming works correctly. */ static_assert(std::size(likely_subtags) % 2 == 0); auto *pairs = reinterpret_cast(likely_subtags); @@ -484,6 +487,59 @@ static qsizetype findLocaleIndexById(QLocaleId localeId) return -1; } +static constexpr qsizetype locale_data_size = q20::ssize(locale_data) - 1; // trailing guard + +#if QT_CONFIG(timezone) && QT_CONFIG(timezone_locale) && !QT_CONFIG(icu) +namespace QtTimeZoneLocale { + +// Indices of locales obtained from the given by likely subtag fall-backs. +QList fallbackLocalesFor(qsizetype index) +{ + // Should match QLocaleXmlReader.pruneZoneNaming()'s fallbacks() helper, + // aside from the special-case kludge for C -> en_US. + Q_ASSERT(index < locale_data_size); + QList result = {index}; + QLocaleId id = locale_data[index].id(); + if (id.language_id == QLocale::C) { + id = { QLocale::English, QLocale::LatinScript, QLocale::UnitedStates }; + qsizetype it = findLocaleIndexById(id); + Q_ASSERT_X(it != -1, Q_FUNC_INFO, "Missing en_Latn_US from locale data"); + Q_ASSERT_X(it != index, // equivalent to !result.contains(it) + Q_FUNC_INFO, "en_Latn_US != C"); + result << it; + } + + const QLocaleId base = id; + QLocaleId likely = id.withLikelySubtagsAdded(); + if (likely != base) { + qsizetype it = findLocaleIndexById(likely); + if (it != -1 && !result.contains(it)) + result << it; + } + if (id.territory_id) { + id.territory_id = 0; + likely = id.withLikelySubtagsAdded(); + if (likely != base) { + qsizetype it = findLocaleIndexById(likely); + if (it != -1 && !result.contains(it)) + result << it; + } + } + if (id.script_id) { + id.script_id = 0; + likely = id.withLikelySubtagsAdded(); + if (likely != base) { + qsizetype it = findLocaleIndexById(likely); + if (it != -1 && !result.contains(it)) + result << it; + } + } + return result; +} + +} // QtTimeZoneLocale +#endif // timezone_locale && !icu + qsizetype QLocaleData::findLocaleIndex(QLocaleId lid) { QLocaleId localeId = lid; @@ -875,8 +931,6 @@ QDataStream &operator>>(QDataStream &ds, QLocale &l) } #endif // QT_NO_DATASTREAM -static constexpr qsizetype locale_data_size = q20::ssize(locale_data) - 1; // trailing guard - Q_GLOBAL_STATIC(QSharedDataPointer, defaultLocalePrivate, new QLocalePrivate(defaultData(), defaultIndex())) diff --git a/src/corelib/text/qlocale.h b/src/corelib/text/qlocale.h index 95c9b4bf64e..8892c40c1b9 100644 --- a/src/corelib/text/qlocale.h +++ b/src/corelib/text/qlocale.h @@ -1170,6 +1170,7 @@ private: bool equals(const QLocale &other) const; friend class QLocalePrivate; friend class QSystemLocale; + friend class QTimeZonePrivate; friend class QCalendarBackend; friend class QRomanCalendar; friend Q_CORE_EXPORT size_t qHash(const QLocale &key, size_t seed) noexcept; diff --git a/src/corelib/text/qlocale_p.h b/src/corelib/text/qlocale_p.h index 3044d137b9b..8a38e76ac46 100644 --- a/src/corelib/text/qlocale_p.h +++ b/src/corelib/text/qlocale_p.h @@ -398,17 +398,18 @@ public: struct DataRange { - quint16 offset; - quint16 size; + using Index = quint32; + Index offset; // Some zone data tables are big. + Index size; // (for consistency and to avoid struct-padding) [[nodiscard]] QString getData(const char16_t *table) const { return size > 0 - ? QString::fromRawData(reinterpret_cast(table + offset), size) + ? QString::fromRawData(stringStart(table), stringSize()) : QString(); } [[nodiscard]] QStringView viewData(const char16_t *table) const { - return { reinterpret_cast(table + offset), size }; + return { stringStart(table), stringSize() }; } [[nodiscard]] QString getListEntry(const char16_t *table, qsizetype index) const { @@ -427,19 +428,32 @@ public: return 0; } private: + [[nodiscard]] const QChar *stringStart(const char16_t *table) const + { + return reinterpret_cast(table + offset); + } + [[nodiscard]] qsizetype stringSize() const + { + // On 32-bit platforms, this is a narrowing cast, but the size has + // always come from an 8-bit or 16-bit table value so can't actually + // have a problem with that. + qsizetype result = static_cast(size); + Q_ASSERT(result >= 0); + return result; + } [[nodiscard]] DataRange listEntry(const char16_t *table, qsizetype index) const { const char16_t separator = ';'; - quint16 i = 0; + Index i = 0; while (index > 0 && i < size) { if (table[offset + i] == separator) index--; i++; } - quint16 end = i; + Index end = i; while (end < size && table[offset + end] != separator) end++; - return { quint16(offset + i), quint16(end - i) }; + return { offset + i, end - i }; } }; diff --git a/src/corelib/text/qt_attribution.json b/src/corelib/text/qt_attribution.json index a3a66f95f1b..5efda8db747 100644 --- a/src/corelib/text/qt_attribution.json +++ b/src/corelib/text/qt_attribution.json @@ -26,8 +26,9 @@ "QtUsage": "Used in Qt Core (QTimeZone, QLocale).", "Comment": { "Files": "For update, see qtbase/util/locale_database/cldr2qlocalexml.py" }, "Files": [ "qlocale_data_p.h", - "../time/qtimezoneprivate_data_p.h", "../time/qhijricalendar_data_p.h", - "../time/qjalalicalendar_data_p.h", "../time/qromancalendar_data_p.h", + "../time/qtimezoneprivate_data_p.h", "../time/qtimezonelocale_data_p.h", + "../time/qhijricalendar_data_p.h", "../time/qjalalicalendar_data_p.h", + "../time/qromancalendar_data_p.h", "../../../util/locale_database/testlocales/localemodel.cpp" ], "Description": "The Unicode CLDR provides key building blocks for software to support the diff --git a/src/corelib/time/qdatetime.cpp b/src/corelib/time/qdatetime.cpp index 504ededb56f..3b60a4ded3a 100644 --- a/src/corelib/time/qdatetime.cpp +++ b/src/corelib/time/qdatetime.cpp @@ -4253,6 +4253,12 @@ QString QDateTime::timeZoneAbbreviation() const return d->m_timeZone.abbreviation(*this); #endif // timezone case Qt::LocalTime: +#if defined(Q_OS_WIN) && QT_CONFIG(timezone) + // MS's tzname is a full MS-name, not an abbreviation: + if (QString sys = QTimeZone::systemTimeZone().abbreviation(*this); !sys.isEmpty()) + return sys; + // ... but, even so, a full name isn't as bad as empty. +#endif return QDateTimePrivate::localNameAtMillis(getMSecs(d), extractDaylightStatus(getStatus(d))); } diff --git a/src/corelib/time/qtimezonelocale.cpp b/src/corelib/time/qtimezonelocale.cpp index 321d53eec88..2745bae5dd6 100644 --- a/src/corelib/time/qtimezonelocale.cpp +++ b/src/corelib/time/qtimezonelocale.cpp @@ -5,14 +5,34 @@ #include #if !QT_CONFIG(icu) +# include # include // Use data generated from CLDR: # include # include +# ifdef QT_CLDR_ZONE_DEBUG +# include +static_assert(std::size(locale_data) == std::size(QtTimeZoneLocale::localeZoneData)); +// Size includes terminal rows: for now, they do match in tag IDs, but they needn't. +static_assert([]() { + for (std::size_t i = 0; i < std::size(locale_data); ++i) { + const auto &loc = locale_data[i]; + const auto &zone = QtTimeZoneLocale::localeZoneData[i]; + if (loc.m_language_id != zone.m_language_id + || loc.m_script_id != zone.m_script_id + || loc.m_territory_id != zone.m_territory_id) { + return false; + } + } + return true; +}()); +# endif #endif QT_BEGIN_NAMESPACE +using namespace Qt::StringLiterals; + #if QT_CONFIG(icu) // Get data from ICU: namespace { @@ -90,6 +110,7 @@ QString QTimeZonePrivate::localeName(qint64 atMSecsSinceEpoch, int offsetFromUtc const QString id = QString::fromUtf8(m_id); const QByteArray loc = locale.name().toUtf8(); UErrorCode status = U_ZERO_ERROR; + // TODO: QTBUG-124271 can we cache any of this ? UCalendar *ucal = ucal_open(reinterpret_cast(id.data()), id.size(), loc.constData(), UCAL_DEFAULT, &status); if (ucal && U_SUCCESS(status)) { @@ -98,12 +119,44 @@ QString QTimeZonePrivate::localeName(qint64 atMSecsSinceEpoch, int offsetFromUtc } return QString(); } -#else // No ICU, use QTZ[LP}_data_p.h data for feature timezone_locale. +#else // No ICU, use QTZ[LP]_data_p.h data for feature timezone_locale. +namespace QtTimeZoneLocale { +// Inline methods promised in QTZL_p.h +using namespace QtTimeZoneCldr; // QTZP_data_p.h +constexpr QByteArrayView LocaleZoneExemplar::ianaId() const { return ianaIdData + ianaIdIndex; } +constexpr QByteArrayView LocaleZoneNames::ianaId() const { return ianaIdData + ianaIdIndex; } +} // QtTimeZoneLocale + namespace { using namespace QtTimeZoneLocale; // QTZL_p.h QTZL_data_p.h using namespace QtTimeZoneCldr; // QTZP_data_p.h // Accessors for the QTZL_data_p.h +template +const Row *findTableEntryFor(const QSpan data, Sought value, Condition test) +{ + // We have the present locale's data (if any). Its rows are sorted on + // (localeIndex and) a field for which we want the Sought value. The test() + // compares that field. + auto begin = data.begin(), end = data.end(); + Q_ASSERT(begin == end || end->localeIndex > begin->localeIndex); + Q_ASSERT(begin == end || end[-1].localeIndex == begin->localeIndex); + auto row = std::lower_bound(begin, end, value, test); + return row == end ? nullptr : row; +} + +QString exemplarCityFor(const LocaleZoneData &locale, const LocaleZoneData &next, + QByteArrayView iana) +{ + auto xct = findTableEntryFor( + QSpan(localeZoneExemplarTable).first(next.m_exemplarTableStart + ).sliced(locale.m_exemplarTableStart), + iana, [](auto &row, QByteArrayView key) { return row.ianaId() < key; }); + if (xct && xct->ianaId() == iana) + return xct->exemplarCity().getData(exemplarCityTable); + return {}; +} + // Accessors for the QTZP_data_p.h quint32 clipEpochMinute(qint64 epochMinute) { @@ -195,6 +248,81 @@ const MetaZoneData *metaZoneDataFor(const MetaZoneData *from, QLocale::Territory return nullptr; } +QString addPadded(qsizetype width, const QString &zero, const QString &number, QString &&onto) +{ + // TODO (QTBUG-122834): QLocale::toString() should support zero-padding directly. + width -= number.size() / zero.size(); + while (width > 0) { + onto += zero; + --width; + } + return std::move(onto) + number; +} + +QString formatOffset(QStringView format, int offsetMinutes, const QLocale &locale) +{ + Q_ASSERT(offsetMinutes >= 0); + const QString hour = locale.toString(offsetMinutes / 60); + const QString mins = locale.toString(offsetMinutes % 60); + // If zero.size() > 1, digits are surrogate pairs; each only counts one + // towards width of the field, even if it contributes more to result.size(). + const QString zero = locale.zeroDigit(); + QStringView tail = format; + QString result; + while (!tail.isEmpty()) { + if (tail.startsWith(u'\'')) { + qsizetype end = tail.indexOf(u'\'', 1); + if (end < 0) { + qWarning("Unbalanced quote in offset format string: %s", + format.toUtf8().constData()); + return result + tail; // Include the quote; format is bogus. + } else if (end == 1) { + // Special case: adjacent quotes signify a simple quote. + result += u'\''; + tail = tail.sliced(2); + } else { + Q_ASSERT(end > 1); // We searched from index 1. + while (end + 1 < tail.size() && tail[end + 1] == u'\'') { + // Special case: adjacent quotes inside a quoted string also + // signify a simple quote. + result += tail.sliced(1, end); // Include a quote at the end + tail = tail.sliced(end + 1); // Still starts with a quote + end = tail.indexOf(u'\'', 1); // Where's the next ? + if (end < 0) { + qWarning("Unbalanced quoted quote in offset format string: %s", + format.toUtf8().constData()); + return result + tail; + } + Q_ASSERT(end > 0); + } + // Skip leading and trailng quotes: + result += tail.sliced(1, end - 1); + tail = tail.sliced(end + 1); + } + } else if (tail.startsWith(u'H')) { + qsizetype width = 1; + while (width < tail.size() && tail[width] == u'H') + ++width; + tail = tail.sliced(width); + result = addPadded(width, zero, hour, std::move(result)); + } else if (tail.startsWith(u'm')) { + qsizetype width = 1; + while (width < tail.size() && tail[width] == u'm') + ++width; + tail = tail.sliced(width); + result = addPadded(width, zero, mins, std::move(result)); + } else if (tail[0].isHighSurrogate() && tail.size() > 1 + && tail[1].isLowSurrogate()) { + result += tail.first(2); + tail = tail.sliced(2); + } else { + result += tail.front(); + tail = tail.sliced(1); + } + } + return result; +} + } // nameless namespace namespace QtTimeZoneLocale { @@ -226,23 +354,243 @@ QString QTimeZonePrivate::localeName(qint64 atMSecsSinceEpoch, int offsetFromUtc QTimeZone::NameType nameType, const QLocale &locale) const { - Q_ASSERT(nameType != QTimeZone::OffsetName || locale.language() != QLocale::C); - // Get data from QTZ[LP]_data_p.h - QByteArrayView iana{m_id}; - if (quint16 metaKey = metaZoneAt(iana, atMSecsSinceEpoch)) { - if (auto metaFrom = metaZoneStart(metaKey)) { - quint16 metaIdIndex = metaFrom->metaIdIndex; - Q_UNUSED(metaIdIndex); + if (nameType == QTimeZone::OffsetName) { + // Doesn't need fallbacks, since every locale has hour and offset formats. + qsizetype locInd = locale.d->m_index; + const LocaleZoneData &locData = localeZoneData[locInd]; + QStringView offsetFormat = locData.offsetGmtFormat().viewData(gmtFormatTable); - if (const auto *metaRow = metaZoneDataFor(metaFrom, locale.territory())) - iana = metaRow->ianaId(); // Use IANA ID of zone in use at that time - } + auto hourFormatR = offsetFromUtc < 0 ? locData.negHourFormat() : locData.posHourFormat(); + QStringView hourFormat = hourFormatR.viewData(hourFormatTable); + Q_ASSERT(!hourFormat.isEmpty() && !offsetFormat.isEmpty()); + // Sign is already handled by choice of the hourFormat: + offsetFromUtc = qAbs(offsetFromUtc); + + // Offsets are only displayed in minutes, any seconds are discarded. + return offsetFormat.arg(formatOffset(hourFormat, offsetFromUtc / 60, locale)); } - Q_UNUSED(iana); - Q_UNUSED(offsetFromUtc); - Q_UNUSED(timeType); - return QString(); + // An IANA ID may give clues to fall back on for abbreviation or exemplar city: + QByteArray ianaAbbrev, ianaTail; + const auto scanIana = [&](QByteArrayView iana) { + // Scan the name of each zone whose data we consider using and, if the + // name gives us a clue to a fallback for which we have nothing better + // yet, remember it (and ignore later clues for that fallback). + if (!ianaAbbrev.isEmpty() && !ianaTail.isEmpty()) + return; + qsizetype cut = iana.lastIndexOf('/'); + QByteArrayView tail = cut < 0 ? iana : iana.sliced(cut + 1); + // Deal with a couple of special cases + if (tail == "McMurdo") { // Exceptional lowercase-uppercase sequence without space + if (ianaTail.isEmpty()) + ianaTail = "McMurdo"_ba; + return; + } else if (tail == "DumontDUrville") { // Chopped to fit into IANA's 14-char limit + if (ianaTail.isEmpty()) + ianaTail = "Dumont d'Urville"_ba; + return; + } else if (tail.isEmpty()) { + // Custom zone with perverse m_id ? + return; + } + + // Even if it is abbr or city name, we don't care if we've found one before. + bool maybeAbbr = ianaAbbrev.isEmpty(), maybeCityName = ianaTail.isEmpty(), inword = false; + char sign = '\0'; + for (char ch : tail) { + if (ch == '+' || ch == '-') { + if (ch == '+' || !inword) + maybeCityName = false; + inword = false; + if (maybeAbbr) { + if (sign) + maybeAbbr = false; // two signs: no + else + sign = ch; + } + } else if (ch == '_') { + maybeAbbr = false; + if (!inword) // No double-underscore, or leading underscore + maybeCityName = false; + inword = false; + } else if (QChar::isLower(ch)) { + maybeAbbr = false; + // Dar_es_Salaam shows both cases as word starts + inword = true; + } else if (QChar::isUpper(ch)) { + if (sign) + maybeAbbr = false; + if (inword) + maybeCityName = false; + inword = true; + } else if (QChar::isDigit(ch)) { + if (!sign) + maybeAbbr = false; + maybeCityName = false; + inword = false; + } + + if (!maybeAbbr && !maybeCityName) + break; + } + if (maybeAbbr && maybeCityName) // No real IANA ID matches both + return; + + if (maybeAbbr) { + if (tail.endsWith("-0") || tail.endsWith("+0")) + tail = tail.chopped(2); + ianaAbbrev = tail.toByteArray(); + if (sign && iana.startsWith("Etc/")) { // Reverse convention for offsets + if (sign == '-') + ianaAbbrev = ianaAbbrev.replace('-', '+'); + else if (sign == '+') + ianaAbbrev = ianaAbbrev.replace('+', '-'); + } + } + if (maybeCityName) + ianaTail = tail.toByteArray().replace('_', ' '); + }; // end scanIana + + scanIana(m_id); + if (QByteArray iana = aliasToIana(m_id); !iana.isEmpty() && iana != m_id) + scanIana(iana); + + // Requires locData, nextData set suitably - save repetition of member: +#define tableLookup(table, member, sought, test) \ + findTableEntryFor(QSpan(table).first(nextData.member).sliced(locData.member), sought, test) + // Note: any commas in test need to be within parentheses; but the only + // comma a comparison should need is in its (parenthesised) parameter list. + + const QList indices = fallbackLocalesFor(locale.d->m_index); + QString exemplarCity; // In case we need it. + const auto metaIdBefore = [](auto &row, quint16 key) { return row.metaIdIndex < key; }; + + // First try for an actual name: + for (const qsizetype locInd : indices) { + const LocaleZoneData &locData = localeZoneData[locInd]; + // After the row for the last actual locale, there's a terminal row: + Q_ASSERT(std::size_t(locInd) < std::size(localeZoneData) - 1); + const LocaleZoneData &nextData = localeZoneData[locInd + 1]; + + QByteArrayView iana{m_id}; + if (quint16 metaKey = metaZoneAt(iana, atMSecsSinceEpoch)) { + if (const MetaZoneData *metaFrom = metaZoneStart(metaKey)) { + quint16 metaIdIndex = metaFrom->metaIdIndex; + QLocaleData::DataRange range{0, 0}; + const char16_t *strings = nullptr; + if (nameType == QTimeZone::ShortName) { + auto row = tableLookup(localeMetaZoneShortNameTable, m_metaShortTableStart, + metaIdIndex, metaIdBefore); + if (row && row->metaIdIndex == metaIdIndex) { + range = row->shortName(timeType); + strings = shortMetaZoneNameTable; + } + } else { // LongName or DefaultName + auto row = tableLookup(localeMetaZoneLongNameTable, m_metaLongTableStart, + metaIdIndex, metaIdBefore); + if (row && row->metaIdIndex == metaIdIndex) { + range = row->longName(timeType); + strings = longMetaZoneNameTable; + } + } + Q_ASSERT(strings || !range.size); + + if (range.size) + return range.getData(strings); + + if (const auto *metaRow = metaZoneDataFor(metaFrom, locale.territory())) + iana = metaRow->ianaId(); // Use IANA ID of zone in use at that time + } + } + + // Use exemplar city from closest match to locale, m_id: + if (exemplarCity.isEmpty()) { + exemplarCity = exemplarCityFor(locData, nextData, m_id); + if (exemplarCity.isEmpty()) + exemplarCity = exemplarCityFor(locData, nextData, iana); + } + if (iana != m_id) // Check for hints to abbreviation and exemplar city: + scanIana(iana); + + // That may give us a revised IANA ID; if the first search fails, fall back + // to m_id, if different. + do { + auto row = tableLookup( + localeZoneNameTable, m_zoneTableStart, + iana, [](auto &row, QByteArrayView key) { return row.ianaId() < key; }); + if (row && row->ianaId() == iana) { + QLocaleData::DataRange range = row->name(nameType, timeType); + if (range.size) { + auto table = nameType == QTimeZone::ShortName + ? shortZoneNameTable + : longZoneNameTable; + return range.getData(table); + } + } + } while (std::exchange(iana, QByteArrayView{m_id}) != m_id); + } + // Most zones should now have ianaAbbrev or ianaTail set, maybe even both. + // We've now tried all the candidates we'll see for those. + // If an IANA ID's last component looked like a city name, use it. + if (exemplarCity.isEmpty() && !ianaTail.isEmpty()) + exemplarCity = QString::fromLatin1(ianaTail); // It's ASCII + + switch (nameType) { + case QTimeZone::DefaultName: + case QTimeZone::LongName: + for (const qsizetype locInd : indices) { + const LocaleZoneData &locData = localeZoneData[locInd]; + QStringView regionFormat + = locData.regionFormatRange(timeType).viewData(regionFormatTable); + if (!regionFormat.isEmpty()) { + QString where = exemplarCity; + // TODO: if empty, use territory name + if (!where.isEmpty()) + return regionFormat.arg(where); + } + } +#if 0 // See comment within. + for (const qsizetype locInd : indices) { + const LocaleZoneData &locData = localeZoneData[locInd]; + QStringView fallbackFormat = locData.fallbackFormat().viewData(fallbackFormatTable); + // Use fallbackFormat - probably never needed, as regionFormat is + // never empty, and this also needs city or territory name (along + // with metazone name). + } +#endif + break; + + case QTimeZone::ShortName: + // If an IANA ID's last component looked like an abbreviation (UTC, EST, ...) use it. + if (!ianaAbbrev.isEmpty()) + return QString::fromLatin1(ianaAbbrev); // It's ASCII + break; + + case QTimeZone::OffsetName: + Q_UNREACHABLE_RETURN(QString()); + } + +#undef tableLookup + + // Final fall-back: ICU seems to use a compact form of offset time for + // short-forms it doesn't know. This seems to correspond to the short form + // of LDML's Localized GMT format. + QString result = + localeName(atMSecsSinceEpoch, offsetFromUtc, timeType, QTimeZone::OffsetName, locale); + // Kludge, only when format is like GMT+HH:mm + if ((result.startsWith(u"UTC") || result.startsWith(u"GMT")) + && result.size() > 6 && result.size() <= 9 + && (result.at(3) == u'-' || result.at(3) == u'+')) { + // Prune trailing zero minutes + if (result.endsWith(u":00")) + result.chop(3); + // (At CLDR v45, all locales use two-digit minutes.) + // Skip leading zero on hour: + if (result.size() > 5 && result.at(4) == u'0' && result.at(5).isDigit()) + result.remove(4, 1); + // (No known zone has a leading zero on non-zero minutes.) + } + return result; } #endif // ICU or not diff --git a/src/corelib/time/qtimezonelocale_data_p.h b/src/corelib/time/qtimezonelocale_data_p.h index 1cdbbaa952a..b570ab778b4 100644 --- a/src/corelib/time/qtimezonelocale_data_p.h +++ b/src/corelib/time/qtimezonelocale_data_p.h @@ -26,14 +26,793 @@ QT_REQUIRE_CONFIG(timezone_locale); QT_BEGIN_NAMESPACE +#ifdef QT_CLDR_ZONE_DEBUG +# define LOCALE_TAGS(lang, script, land) lang, script, land, +#else +# define LOCALE_TAGS(lang, script, land) +#endif + namespace QtTimeZoneLocale { +/* + Locale-specific data for timezone naming. + https://www.unicode.org/reports/tr35/tr35-68/tr35-dates.html#Time_Zone_Names + + Available data, per locale, from LocaleScanner.timeZoneNames(): + + formats: { + 'hour': ('+HH:mm', '-HH:mm'), + 'GMT': 'GMT%0', + 'region': ("%0 Time", std, dst), + 'fallback': "%1 (%0)" } + zones: { ianaid: { + 'exemplarCity': name, + 'long': (gen, std, dst), 'short': (gen, std, dst) } } + metazones: { meta: {'long': (gen, std, dst), 'short': (gen, std, dst) } } + + Mapped to C++ data-structures below (defined in QTZL_p.h) and used by + QTZL.cpp, in conjunction with QTZP_data_p.h's locale-independent data + conditioned on timezone_locale. +*/ + // GENERATED PART STARTS HERE +// sorted by locale index, then iana name +static constexpr LocaleZoneExemplar localeZoneExemplarTable[] = { + // locInd, ianaInd, xcty{ind, sz} + // 47770 entries @ 9 bytes per entry (maybe padded to 10 or 12 bytes) + { 674, 0, 0, 0, }, // dummy +}; + +// sorted by locale index, then iana name +static constexpr LocaleZoneNames localeZoneNameTable[] = { + // locInd, ianaInd, (lngGen, srtGen, lngStd, srtStd, lngDst, srtDst){ind, sz} + // 781 entries @ 28 bytes per entry + { 674, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, // dummy +}; + +// sort by locale index, meta key +static constexpr LocaleMetaZoneLongNames localeMetaZoneLongNameTable[] = { + // locInd, metaKey, (generic, standard, DST){ind, sz} + // 25257 entries @ 19 bytes per entry (maybe padded to 20) + { 674, 0, 0, 0, 0, 0, 0, 0, }, // dummy +}; + +// sort by locale index, meta key +static constexpr LocaleMetaZoneShortNames localeMetaZoneShortNameTable[] = { + // locInd, metaKey, (generic, standard, DST){ind, sz} + // 1416 entries @ 13 bytes per entry (maybe padded to 14 or 16) + { 674, 0, 0, 0, 0, 0, 0, 0, }, // dummy +}; + +// In locale-index order (see ../qlocale_data_p.h): +static constexpr LocaleZoneData localeZoneData[] = { + // LOCALE_TAGS(lng,scp,ter) xct1st, zn1st, ml1st, ms1st, (+hr, -hr, gmt, flbk, rgen, rstd, rdst){ind,sz} + // 674 entries @ (6+) 75 bytes (maybe padded to (6+ or 8+) 76 bytes) + { LOCALE_TAGS( 1, 0, 0) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // C/AnyScript/AnyTerritory + { LOCALE_TAGS( 2, 27, 90) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Abkhazian/Cyrillic/Georgia + { LOCALE_TAGS( 3, 66, 77) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Afar/Latin/Ethiopia + { LOCALE_TAGS( 3, 66, 67) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Afar/Latin/Djibouti + { LOCALE_TAGS( 3, 66, 74) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Afar/Latin/Eritrea + { LOCALE_TAGS( 4, 66,216) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Afrikaans/Latin/South Africa + { LOCALE_TAGS( 4, 66,162) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Afrikaans/Latin/Namibia + { LOCALE_TAGS( 5, 66, 40) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Aghem/Latin/Cameroon + { LOCALE_TAGS( 6, 66, 92) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Akan/Latin/Ghana + { LOCALE_TAGS( 8, 66, 40) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Akoose/Latin/Cameroon + { LOCALE_TAGS( 9, 66, 3) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Albanian/Latin/Albania + { LOCALE_TAGS( 9, 66,126) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Albanian/Latin/Kosovo + { LOCALE_TAGS( 9, 66,140) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Albanian/Latin/Macedonia + { LOCALE_TAGS( 11, 33, 77) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Amharic/Ethiopic/Ethiopia + { LOCALE_TAGS( 14, 4, 71) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Arabic/Arabic/Egypt + { LOCALE_TAGS( 14, 4, 4) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Arabic/Arabic/Algeria + { LOCALE_TAGS( 14, 4, 19) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Arabic/Arabic/Bahrain + { LOCALE_TAGS( 14, 4, 48) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Arabic/Arabic/Chad + { LOCALE_TAGS( 14, 4, 55) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Arabic/Arabic/Comoros + { LOCALE_TAGS( 14, 4, 67) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Arabic/Arabic/Djibouti + { LOCALE_TAGS( 14, 4, 74) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Arabic/Arabic/Eritrea + { LOCALE_TAGS( 14, 4,113) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Arabic/Arabic/Iraq + { LOCALE_TAGS( 14, 4,116) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Arabic/Arabic/Israel + { LOCALE_TAGS( 14, 4,122) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Arabic/Arabic/Jordan + { LOCALE_TAGS( 14, 4,127) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Arabic/Arabic/Kuwait + { LOCALE_TAGS( 14, 4,132) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Arabic/Arabic/Lebanon + { LOCALE_TAGS( 14, 4,135) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Arabic/Arabic/Libya + { LOCALE_TAGS( 14, 4,149) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Arabic/Arabic/Mauritania + { LOCALE_TAGS( 14, 4,159) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Arabic/Arabic/Morocco + { LOCALE_TAGS( 14, 4,176) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Arabic/Arabic/Oman + { LOCALE_TAGS( 14, 4,180) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Arabic/Arabic/Palestinian Territories + { LOCALE_TAGS( 14, 4,190) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Arabic/Arabic/Qatar + { LOCALE_TAGS( 14, 4,205) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Arabic/Arabic/Saudi Arabia + { LOCALE_TAGS( 14, 4,215) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Arabic/Arabic/Somalia + { LOCALE_TAGS( 14, 4,219) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Arabic/Arabic/South Sudan + { LOCALE_TAGS( 14, 4,222) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Arabic/Arabic/Sudan + { LOCALE_TAGS( 14, 4,227) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Arabic/Arabic/Syria + { LOCALE_TAGS( 14, 4,238) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Arabic/Arabic/Tunisia + { LOCALE_TAGS( 14, 4,245) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Arabic/Arabic/United Arab Emirates + { LOCALE_TAGS( 14, 4,257) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Arabic/Arabic/Western Sahara + { LOCALE_TAGS( 14, 4,258) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Arabic/Arabic/world + { LOCALE_TAGS( 14, 4,259) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Arabic/Arabic/Yemen + { LOCALE_TAGS( 15, 66,220) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Aragonese/Latin/Spain + { LOCALE_TAGS( 17, 5, 12) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Armenian/Armenian/Armenia + { LOCALE_TAGS( 18, 9,110) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Assamese/Bangla/India + { LOCALE_TAGS( 19, 66,220) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Asturian/Latin/Spain + { LOCALE_TAGS( 20, 66,230) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Asu/Latin/Tanzania + { LOCALE_TAGS( 21, 66,169) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Atsam/Latin/Nigeria + { LOCALE_TAGS( 25, 66, 17) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Azerbaijani/Latin/Azerbaijan + { LOCALE_TAGS( 25, 4,112) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Azerbaijani/Arabic/Iran + { LOCALE_TAGS( 25, 4,113) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Azerbaijani/Arabic/Iraq + { LOCALE_TAGS( 25, 4,239) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Azerbaijani/Arabic/Turkey + { LOCALE_TAGS( 25, 27, 17) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Azerbaijani/Cyrillic/Azerbaijan + { LOCALE_TAGS( 26, 66, 40) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Bafia/Latin/Cameroon + { LOCALE_TAGS( 28, 66,145) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Bambara/Latin/Mali + { LOCALE_TAGS( 28, 90,145) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Bambara/Nko/Mali + { LOCALE_TAGS( 30, 9, 20) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Bangla/Bangla/Bangladesh + { LOCALE_TAGS( 30, 9,110) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Bangla/Bangla/India + { LOCALE_TAGS( 31, 66, 40) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Basaa/Latin/Cameroon + { LOCALE_TAGS( 32, 27,193) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Bashkir/Cyrillic/Russia + { LOCALE_TAGS( 33, 66,220) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Basque/Latin/Spain + { LOCALE_TAGS( 35, 27, 22) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Belarusian/Cyrillic/Belarus + { LOCALE_TAGS( 36, 66,260) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Bemba/Latin/Zambia + { LOCALE_TAGS( 37, 66,230) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Bena/Latin/Tanzania + { LOCALE_TAGS( 38, 29,110) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Bhojpuri/Devanagari/India + { LOCALE_TAGS( 40, 33, 74) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Blin/Ethiopic/Eritrea + { LOCALE_TAGS( 41, 29,110) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Bodo/Devanagari/India + { LOCALE_TAGS( 42, 66, 29) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Bosnian/Latin/Bosnia and Herzegovina + { LOCALE_TAGS( 42, 27, 29) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Bosnian/Cyrillic/Bosnia and Herzegovina + { LOCALE_TAGS( 43, 66, 84) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Breton/Latin/France + { LOCALE_TAGS( 45, 27, 36) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Bulgarian/Cyrillic/Bulgaria + { LOCALE_TAGS( 46, 86,161) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Burmese/Myanmar/Myanmar + { LOCALE_TAGS( 47,137,107) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Cantonese/Traditional Han/Hong Kong + { LOCALE_TAGS( 47,118, 50) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Cantonese/Simplified Han/China + { LOCALE_TAGS( 48, 66,220) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Catalan/Latin/Spain + { LOCALE_TAGS( 48, 66, 6) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Catalan/Latin/Andorra + { LOCALE_TAGS( 48, 66, 84) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Catalan/Latin/France + { LOCALE_TAGS( 48, 66,117) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Catalan/Latin/Italy + { LOCALE_TAGS( 49, 66,185) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Cebuano/Latin/Philippines + { LOCALE_TAGS( 50, 66,159) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Central Atlas Tamazight/Latin/Morocco + { LOCALE_TAGS( 51, 4,113) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Central Kurdish/Arabic/Iraq + { LOCALE_TAGS( 51, 4,112) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Central Kurdish/Arabic/Iran + { LOCALE_TAGS( 52, 21, 20) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Chakma/Chakma/Bangladesh + { LOCALE_TAGS( 52, 21,110) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Chakma/Chakma/India + { LOCALE_TAGS( 54, 27,193) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Chechen/Cyrillic/Russia + { LOCALE_TAGS( 55, 23,248) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Cherokee/Cherokee/United States + { LOCALE_TAGS( 56, 66,248) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Chickasaw/Latin/United States + { LOCALE_TAGS( 57, 66,243) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Chiga/Latin/Uganda + { LOCALE_TAGS( 58,118, 50) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Chinese/Simplified Han/China + { LOCALE_TAGS( 58,118,107) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Chinese/Simplified Han/Hong Kong + { LOCALE_TAGS( 58,118,139) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Chinese/Simplified Han/Macao + { LOCALE_TAGS( 58,118,210) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Chinese/Simplified Han/Singapore + { LOCALE_TAGS( 58,137,107) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Chinese/Traditional Han/Hong Kong + { LOCALE_TAGS( 58,137,139) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Chinese/Traditional Han/Macao + { LOCALE_TAGS( 58,137,228) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Chinese/Traditional Han/Taiwan + { LOCALE_TAGS( 59, 27,193) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Church/Cyrillic/Russia + { LOCALE_TAGS( 60, 27,193) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Chuvash/Cyrillic/Russia + { LOCALE_TAGS( 61, 66, 91) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Colognian/Latin/Germany + { LOCALE_TAGS( 63, 66,246) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Cornish/Latin/United Kingdom + { LOCALE_TAGS( 64, 66, 84) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Corsican/Latin/France + { LOCALE_TAGS( 66, 66, 60) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Croatian/Latin/Croatia + { LOCALE_TAGS( 66, 66, 29) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Croatian/Latin/Bosnia and Herzegovina + { LOCALE_TAGS( 67, 66, 64) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Czech/Latin/Czechia + { LOCALE_TAGS( 68, 66, 65) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Danish/Latin/Denmark + { LOCALE_TAGS( 68, 66, 95) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Danish/Latin/Greenland + { LOCALE_TAGS( 69,132,144) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Divehi/Thaana/Maldives + { LOCALE_TAGS( 70, 29,110) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Dogri/Devanagari/India + { LOCALE_TAGS( 71, 66, 40) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Duala/Latin/Cameroon + { LOCALE_TAGS( 72, 66,165) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Dutch/Latin/Netherlands + { LOCALE_TAGS( 72, 66, 13) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Dutch/Latin/Aruba + { LOCALE_TAGS( 72, 66, 23) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Dutch/Latin/Belgium + { LOCALE_TAGS( 72, 66, 44) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Dutch/Latin/Caribbean Netherlands + { LOCALE_TAGS( 72, 66, 62) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Dutch/Latin/Curacao + { LOCALE_TAGS( 72, 66,211) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Dutch/Latin/Sint Maarten + { LOCALE_TAGS( 72, 66,223) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Dutch/Latin/Suriname + { LOCALE_TAGS( 73,134, 27) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Dzongkha/Tibetan/Bhutan + { LOCALE_TAGS( 74, 66,124) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Embu/Latin/Kenya + { LOCALE_TAGS( 75, 66,248) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // English/Latin/United States + { LOCALE_TAGS( 75, 28,248) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // English/Deseret/United States + { LOCALE_TAGS( 75, 66, 5) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // English/Latin/American Samoa + { LOCALE_TAGS( 75, 66, 8) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // English/Latin/Anguilla + { LOCALE_TAGS( 75, 66, 10) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // English/Latin/Antigua and Barbuda + { LOCALE_TAGS( 75, 66, 15) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // English/Latin/Australia + { LOCALE_TAGS( 75, 66, 16) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // English/Latin/Austria + { LOCALE_TAGS( 75, 66, 18) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // English/Latin/Bahamas + { LOCALE_TAGS( 75, 66, 21) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // English/Latin/Barbados + { LOCALE_TAGS( 75, 66, 23) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // English/Latin/Belgium + { LOCALE_TAGS( 75, 66, 24) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // English/Latin/Belize + { LOCALE_TAGS( 75, 66, 26) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // English/Latin/Bermuda + { LOCALE_TAGS( 75, 66, 30) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // English/Latin/Botswana + { LOCALE_TAGS( 75, 66, 33) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // English/Latin/British Indian Ocean Territory + { LOCALE_TAGS( 75, 66, 34) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // English/Latin/British Virgin Islands + { LOCALE_TAGS( 75, 66, 38) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // English/Latin/Burundi + { LOCALE_TAGS( 75, 66, 40) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // English/Latin/Cameroon + { LOCALE_TAGS( 75, 66, 41) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // English/Latin/Canada + { LOCALE_TAGS( 75, 66, 45) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // English/Latin/Cayman Islands + { LOCALE_TAGS( 75, 66, 51) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // English/Latin/Christmas Island + { LOCALE_TAGS( 75, 66, 53) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // English/Latin/Cocos Islands + { LOCALE_TAGS( 75, 66, 58) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // English/Latin/Cook Islands + { LOCALE_TAGS( 75, 66, 63) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // English/Latin/Cyprus + { LOCALE_TAGS( 75, 66, 65) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // English/Latin/Denmark + { LOCALE_TAGS( 75, 66, 66) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // English/Latin/Diego Garcia + { LOCALE_TAGS( 75, 66, 68) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // English/Latin/Dominica + { LOCALE_TAGS( 75, 66, 74) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // English/Latin/Eritrea + { LOCALE_TAGS( 75, 66, 76) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // English/Latin/Eswatini + { LOCALE_TAGS( 75, 66, 78) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // English/Latin/Europe + { LOCALE_TAGS( 75, 66, 80) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // English/Latin/Falkland Islands + { LOCALE_TAGS( 75, 66, 82) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // English/Latin/Fiji + { LOCALE_TAGS( 75, 66, 83) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // English/Latin/Finland + { LOCALE_TAGS( 75, 66, 89) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // English/Latin/Gambia + { LOCALE_TAGS( 75, 66, 91) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // English/Latin/Germany + { LOCALE_TAGS( 75, 66, 92) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // English/Latin/Ghana + { LOCALE_TAGS( 75, 66, 93) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // English/Latin/Gibraltar + { LOCALE_TAGS( 75, 66, 96) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // English/Latin/Grenada + { LOCALE_TAGS( 75, 66, 98) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // English/Latin/Guam + { LOCALE_TAGS( 75, 66,100) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // English/Latin/Guernsey + { LOCALE_TAGS( 75, 66,103) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // English/Latin/Guyana + { LOCALE_TAGS( 75, 66,107) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // English/Latin/Hong Kong + { LOCALE_TAGS( 75, 66,110) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // English/Latin/India + { LOCALE_TAGS( 75, 66,111) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // English/Latin/Indonesia + { LOCALE_TAGS( 75, 66,114) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // English/Latin/Ireland + { LOCALE_TAGS( 75, 66,115) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // English/Latin/Isle of Man + { LOCALE_TAGS( 75, 66,116) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // English/Latin/Israel + { LOCALE_TAGS( 75, 66,119) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // English/Latin/Jamaica + { LOCALE_TAGS( 75, 66,121) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // English/Latin/Jersey + { LOCALE_TAGS( 75, 66,124) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // English/Latin/Kenya + { LOCALE_TAGS( 75, 66,125) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // English/Latin/Kiribati + { LOCALE_TAGS( 75, 66,133) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // English/Latin/Lesotho + { LOCALE_TAGS( 75, 66,134) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // English/Latin/Liberia + { LOCALE_TAGS( 75, 66,139) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // English/Latin/Macao + { LOCALE_TAGS( 75, 66,141) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // English/Latin/Madagascar + { LOCALE_TAGS( 75, 66,142) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // English/Latin/Malawi + { LOCALE_TAGS( 75, 66,143) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // English/Latin/Malaysia + { LOCALE_TAGS( 75, 66,144) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // English/Latin/Maldives + { LOCALE_TAGS( 75, 66,146) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // English/Latin/Malta + { LOCALE_TAGS( 75, 66,147) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // English/Latin/Marshall Islands + { LOCALE_TAGS( 75, 66,150) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // English/Latin/Mauritius + { LOCALE_TAGS( 75, 66,153) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // English/Latin/Micronesia + { LOCALE_TAGS( 75, 66,158) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // English/Latin/Montserrat + { LOCALE_TAGS( 75, 66,162) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // English/Latin/Namibia + { LOCALE_TAGS( 75, 66,163) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // English/Latin/Nauru + { LOCALE_TAGS( 75, 66,165) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // English/Latin/Netherlands + { LOCALE_TAGS( 75, 66,167) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // English/Latin/New Zealand + { LOCALE_TAGS( 75, 66,169) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // English/Latin/Nigeria + { LOCALE_TAGS( 75, 66,171) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // English/Latin/Niue + { LOCALE_TAGS( 75, 66,172) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // English/Latin/Norfolk Island + { LOCALE_TAGS( 75, 66,173) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // English/Latin/Northern Mariana Islands + { LOCALE_TAGS( 75, 66,178) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // English/Latin/Pakistan + { LOCALE_TAGS( 75, 66,179) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // English/Latin/Palau + { LOCALE_TAGS( 75, 66,182) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // English/Latin/Papua New Guinea + { LOCALE_TAGS( 75, 66,185) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // English/Latin/Philippines + { LOCALE_TAGS( 75, 66,186) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // English/Latin/Pitcairn + { LOCALE_TAGS( 75, 66,189) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // English/Latin/Puerto Rico + { LOCALE_TAGS( 75, 66,194) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // English/Latin/Rwanda + { LOCALE_TAGS( 75, 66,196) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // English/Latin/Saint Helena + { LOCALE_TAGS( 75, 66,197) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // English/Latin/Saint Kitts and Nevis + { LOCALE_TAGS( 75, 66,198) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // English/Latin/Saint Lucia + { LOCALE_TAGS( 75, 66,201) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // English/Latin/Saint Vincent and Grenadines + { LOCALE_TAGS( 75, 66,202) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // English/Latin/Samoa + { LOCALE_TAGS( 75, 66,208) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // English/Latin/Seychelles + { LOCALE_TAGS( 75, 66,209) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // English/Latin/Sierra Leone + { LOCALE_TAGS( 75, 66,210) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // English/Latin/Singapore + { LOCALE_TAGS( 75, 66,211) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // English/Latin/Sint Maarten + { LOCALE_TAGS( 75, 66,213) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // English/Latin/Slovenia + { LOCALE_TAGS( 75, 66,214) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // English/Latin/Solomon Islands + { LOCALE_TAGS( 75, 66,216) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // English/Latin/South Africa + { LOCALE_TAGS( 75, 66,219) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // English/Latin/South Sudan + { LOCALE_TAGS( 75, 66,222) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // English/Latin/Sudan + { LOCALE_TAGS( 75, 66,225) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // English/Latin/Sweden + { LOCALE_TAGS( 75, 66,226) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // English/Latin/Switzerland + { LOCALE_TAGS( 75, 66,230) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // English/Latin/Tanzania + { LOCALE_TAGS( 75, 66,234) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // English/Latin/Tokelau + { LOCALE_TAGS( 75, 66,235) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // English/Latin/Tonga + { LOCALE_TAGS( 75, 66,236) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // English/Latin/Trinidad and Tobago + { LOCALE_TAGS( 75, 66,241) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // English/Latin/Turks and Caicos Islands + { LOCALE_TAGS( 75, 66,242) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // English/Latin/Tuvalu + { LOCALE_TAGS( 75, 66,243) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // English/Latin/Uganda + { LOCALE_TAGS( 75, 66,245) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // English/Latin/United Arab Emirates + { LOCALE_TAGS( 75, 66,246) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // English/Latin/United Kingdom + { LOCALE_TAGS( 75, 66,247) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // English/Latin/United States Outlying Islands + { LOCALE_TAGS( 75, 66,249) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // English/Latin/United States Virgin Islands + { LOCALE_TAGS( 75, 66,252) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // English/Latin/Vanuatu + { LOCALE_TAGS( 75, 66,258) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // English/Latin/world + { LOCALE_TAGS( 75, 66,260) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // English/Latin/Zambia + { LOCALE_TAGS( 75, 66,261) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // English/Latin/Zimbabwe + { LOCALE_TAGS( 75,115,246) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // English/Shavian/United Kingdom + { LOCALE_TAGS( 76, 27,193) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Erzya/Cyrillic/Russia + { LOCALE_TAGS( 77, 66,258) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Esperanto/Latin/world + { LOCALE_TAGS( 78, 66, 75) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Estonian/Latin/Estonia + { LOCALE_TAGS( 79, 66, 92) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Ewe/Latin/Ghana + { LOCALE_TAGS( 79, 66,233) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Ewe/Latin/Togo + { LOCALE_TAGS( 80, 66, 40) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Ewondo/Latin/Cameroon + { LOCALE_TAGS( 81, 66, 81) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Faroese/Latin/Faroe Islands + { LOCALE_TAGS( 81, 66, 65) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Faroese/Latin/Denmark + { LOCALE_TAGS( 83, 66,185) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Filipino/Latin/Philippines + { LOCALE_TAGS( 84, 66, 83) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Finnish/Latin/Finland + { LOCALE_TAGS( 85, 66, 84) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // French/Latin/France + { LOCALE_TAGS( 85, 66, 4) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // French/Latin/Algeria + { LOCALE_TAGS( 85, 66, 23) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // French/Latin/Belgium + { LOCALE_TAGS( 85, 66, 25) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // French/Latin/Benin + { LOCALE_TAGS( 85, 66, 37) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // French/Latin/Burkina Faso + { LOCALE_TAGS( 85, 66, 38) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // French/Latin/Burundi + { LOCALE_TAGS( 85, 66, 40) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // French/Latin/Cameroon + { LOCALE_TAGS( 85, 66, 41) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // French/Latin/Canada + { LOCALE_TAGS( 85, 66, 46) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // French/Latin/Central African Republic + { LOCALE_TAGS( 85, 66, 48) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // French/Latin/Chad + { LOCALE_TAGS( 85, 66, 55) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // French/Latin/Comoros + { LOCALE_TAGS( 85, 66, 56) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // French/Latin/Congo - Brazzaville + { LOCALE_TAGS( 85, 66, 57) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // French/Latin/Congo - Kinshasa + { LOCALE_TAGS( 85, 66, 67) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // French/Latin/Djibouti + { LOCALE_TAGS( 85, 66, 73) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // French/Latin/Equatorial Guinea + { LOCALE_TAGS( 85, 66, 85) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // French/Latin/French Guiana + { LOCALE_TAGS( 85, 66, 86) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // French/Latin/French Polynesia + { LOCALE_TAGS( 85, 66, 88) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // French/Latin/Gabon + { LOCALE_TAGS( 85, 66, 97) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // French/Latin/Guadeloupe + { LOCALE_TAGS( 85, 66,102) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // French/Latin/Guinea + { LOCALE_TAGS( 85, 66,104) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // French/Latin/Haiti + { LOCALE_TAGS( 85, 66,118) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // French/Latin/Ivory Coast + { LOCALE_TAGS( 85, 66,138) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // French/Latin/Luxembourg + { LOCALE_TAGS( 85, 66,141) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // French/Latin/Madagascar + { LOCALE_TAGS( 85, 66,145) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // French/Latin/Mali + { LOCALE_TAGS( 85, 66,148) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // French/Latin/Martinique + { LOCALE_TAGS( 85, 66,149) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // French/Latin/Mauritania + { LOCALE_TAGS( 85, 66,150) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // French/Latin/Mauritius + { LOCALE_TAGS( 85, 66,151) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // French/Latin/Mayotte + { LOCALE_TAGS( 85, 66,155) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // French/Latin/Monaco + { LOCALE_TAGS( 85, 66,159) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // French/Latin/Morocco + { LOCALE_TAGS( 85, 66,166) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // French/Latin/New Caledonia + { LOCALE_TAGS( 85, 66,170) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // French/Latin/Niger + { LOCALE_TAGS( 85, 66,191) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // French/Latin/Reunion + { LOCALE_TAGS( 85, 66,194) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // French/Latin/Rwanda + { LOCALE_TAGS( 85, 66,195) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // French/Latin/Saint Barthelemy + { LOCALE_TAGS( 85, 66,199) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // French/Latin/Saint Martin + { LOCALE_TAGS( 85, 66,200) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // French/Latin/Saint Pierre and Miquelon + { LOCALE_TAGS( 85, 66,206) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // French/Latin/Senegal + { LOCALE_TAGS( 85, 66,208) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // French/Latin/Seychelles + { LOCALE_TAGS( 85, 66,226) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // French/Latin/Switzerland + { LOCALE_TAGS( 85, 66,227) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // French/Latin/Syria + { LOCALE_TAGS( 85, 66,233) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // French/Latin/Togo + { LOCALE_TAGS( 85, 66,238) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // French/Latin/Tunisia + { LOCALE_TAGS( 85, 66,252) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // French/Latin/Vanuatu + { LOCALE_TAGS( 85, 66,256) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // French/Latin/Wallis and Futuna + { LOCALE_TAGS( 86, 66,117) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Friulian/Latin/Italy + { LOCALE_TAGS( 87, 66,206) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Fulah/Latin/Senegal + { LOCALE_TAGS( 87, 1, 37) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Fulah/Adlam/Burkina Faso + { LOCALE_TAGS( 87, 1, 40) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Fulah/Adlam/Cameroon + { LOCALE_TAGS( 87, 1, 89) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Fulah/Adlam/Gambia + { LOCALE_TAGS( 87, 1, 92) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Fulah/Adlam/Ghana + { LOCALE_TAGS( 87, 1,101) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Fulah/Adlam/Guinea-Bissau + { LOCALE_TAGS( 87, 1,102) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Fulah/Adlam/Guinea + { LOCALE_TAGS( 87, 1,134) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Fulah/Adlam/Liberia + { LOCALE_TAGS( 87, 1,149) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Fulah/Adlam/Mauritania + { LOCALE_TAGS( 87, 1,169) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Fulah/Adlam/Nigeria + { LOCALE_TAGS( 87, 1,170) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Fulah/Adlam/Niger + { LOCALE_TAGS( 87, 1,206) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Fulah/Adlam/Senegal + { LOCALE_TAGS( 87, 1,209) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Fulah/Adlam/Sierra Leone + { LOCALE_TAGS( 87, 66, 37) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Fulah/Latin/Burkina Faso + { LOCALE_TAGS( 87, 66, 40) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Fulah/Latin/Cameroon + { LOCALE_TAGS( 87, 66, 89) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Fulah/Latin/Gambia + { LOCALE_TAGS( 87, 66, 92) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Fulah/Latin/Ghana + { LOCALE_TAGS( 87, 66,101) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Fulah/Latin/Guinea-Bissau + { LOCALE_TAGS( 87, 66,102) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Fulah/Latin/Guinea + { LOCALE_TAGS( 87, 66,134) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Fulah/Latin/Liberia + { LOCALE_TAGS( 87, 66,149) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Fulah/Latin/Mauritania + { LOCALE_TAGS( 87, 66,169) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Fulah/Latin/Nigeria + { LOCALE_TAGS( 87, 66,170) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Fulah/Latin/Niger + { LOCALE_TAGS( 87, 66,209) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Fulah/Latin/Sierra Leone + { LOCALE_TAGS( 88, 66,246) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Gaelic/Latin/United Kingdom + { LOCALE_TAGS( 89, 66, 92) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Ga/Latin/Ghana + { LOCALE_TAGS( 90, 66,220) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Galician/Latin/Spain + { LOCALE_TAGS( 91, 66,243) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Ganda/Latin/Uganda + { LOCALE_TAGS( 92, 33, 77) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Geez/Ethiopic/Ethiopia + { LOCALE_TAGS( 92, 33, 74) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Geez/Ethiopic/Eritrea + { LOCALE_TAGS( 93, 35, 90) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Georgian/Georgian/Georgia + { LOCALE_TAGS( 94, 66, 91) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // German/Latin/Germany + { LOCALE_TAGS( 94, 66, 16) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // German/Latin/Austria + { LOCALE_TAGS( 94, 66, 23) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // German/Latin/Belgium + { LOCALE_TAGS( 94, 66,117) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // German/Latin/Italy + { LOCALE_TAGS( 94, 66,136) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // German/Latin/Liechtenstein + { LOCALE_TAGS( 94, 66,138) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // German/Latin/Luxembourg + { LOCALE_TAGS( 94, 66,226) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // German/Latin/Switzerland + { LOCALE_TAGS( 96, 39, 94) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Greek/Greek/Greece + { LOCALE_TAGS( 96, 39, 63) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Greek/Greek/Cyprus + { LOCALE_TAGS( 97, 66,183) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Guarani/Latin/Paraguay + { LOCALE_TAGS( 98, 40,110) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Gujarati/Gujarati/India + { LOCALE_TAGS( 99, 66,124) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Gusii/Latin/Kenya + { LOCALE_TAGS(101, 66,169) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Hausa/Latin/Nigeria + { LOCALE_TAGS(101, 4,169) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Hausa/Arabic/Nigeria + { LOCALE_TAGS(101, 4,222) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Hausa/Arabic/Sudan + { LOCALE_TAGS(101, 66, 92) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Hausa/Latin/Ghana + { LOCALE_TAGS(101, 66,170) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Hausa/Latin/Niger + { LOCALE_TAGS(102, 66,248) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Hawaiian/Latin/United States + { LOCALE_TAGS(103, 47,116) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Hebrew/Hebrew/Israel + { LOCALE_TAGS(105, 29,110) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Hindi/Devanagari/India + { LOCALE_TAGS(105, 66,110) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Hindi/Latin/India + { LOCALE_TAGS(107, 66,108) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Hungarian/Latin/Hungary + { LOCALE_TAGS(108, 66,109) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Icelandic/Latin/Iceland + { LOCALE_TAGS(109, 66,258) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Ido/Latin/world + { LOCALE_TAGS(110, 66,169) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Igbo/Latin/Nigeria + { LOCALE_TAGS(111, 66, 83) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Inari Sami/Latin/Finland + { LOCALE_TAGS(112, 66,111) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Indonesian/Latin/Indonesia + { LOCALE_TAGS(114, 66,258) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Interlingua/Latin/world + { LOCALE_TAGS(115, 66, 75) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Interlingue/Latin/Estonia + { LOCALE_TAGS(116, 18, 41) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Inuktitut/Canadian Aboriginal/Canada + { LOCALE_TAGS(116, 66, 41) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Inuktitut/Latin/Canada + { LOCALE_TAGS(118, 66,114) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Irish/Latin/Ireland + { LOCALE_TAGS(118, 66,246) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Irish/Latin/United Kingdom + { LOCALE_TAGS(119, 66,117) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Italian/Latin/Italy + { LOCALE_TAGS(119, 66,203) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Italian/Latin/San Marino + { LOCALE_TAGS(119, 66,226) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Italian/Latin/Switzerland + { LOCALE_TAGS(119, 66,253) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Italian/Latin/Vatican City + { LOCALE_TAGS(120, 53,120) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Japanese/Japanese/Japan + { LOCALE_TAGS(121, 66,111) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Javanese/Latin/Indonesia + { LOCALE_TAGS(122, 66,169) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Jju/Latin/Nigeria + { LOCALE_TAGS(123, 66,206) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Jola-Fonyi/Latin/Senegal + { LOCALE_TAGS(124, 66, 43) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Kabuverdianu/Latin/Cape Verde + { LOCALE_TAGS(125, 66, 4) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Kabyle/Latin/Algeria + { LOCALE_TAGS(126, 66, 40) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Kako/Latin/Cameroon + { LOCALE_TAGS(127, 66, 95) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Kalaallisut/Latin/Greenland + { LOCALE_TAGS(128, 66,124) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Kalenjin/Latin/Kenya + { LOCALE_TAGS(129, 66,124) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Kamba/Latin/Kenya + { LOCALE_TAGS(130, 56,110) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Kannada/Kannada/India + { LOCALE_TAGS(132, 4,110) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Kashmiri/Arabic/India + { LOCALE_TAGS(132, 29,110) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Kashmiri/Devanagari/India + { LOCALE_TAGS(133, 27,123) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Kazakh/Cyrillic/Kazakhstan + { LOCALE_TAGS(134, 66, 40) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Kenyang/Latin/Cameroon + { LOCALE_TAGS(135, 60, 39) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Khmer/Khmer/Cambodia + { LOCALE_TAGS(136, 66, 99) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Kiche/Latin/Guatemala + { LOCALE_TAGS(137, 66,124) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Kikuyu/Latin/Kenya + { LOCALE_TAGS(138, 66,194) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Kinyarwanda/Latin/Rwanda + { LOCALE_TAGS(141, 29,110) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Konkani/Devanagari/India + { LOCALE_TAGS(142, 63,218) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Korean/Korean/South Korea + { LOCALE_TAGS(142, 63, 50) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Korean/Korean/China + { LOCALE_TAGS(142, 63,174) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Korean/Korean/North Korea + { LOCALE_TAGS(144, 66,145) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Koyraboro Senni/Latin/Mali + { LOCALE_TAGS(145, 66,145) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Koyra Chiini/Latin/Mali + { LOCALE_TAGS(146, 66,134) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Kpelle/Latin/Liberia + { LOCALE_TAGS(146, 66,102) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Kpelle/Latin/Guinea + { LOCALE_TAGS(148, 66,239) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Kurdish/Latin/Turkey + { LOCALE_TAGS(149, 66, 40) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Kwasio/Latin/Cameroon + { LOCALE_TAGS(150, 27,128) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Kyrgyz/Cyrillic/Kyrgyzstan + { LOCALE_TAGS(151, 66,248) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Lakota/Latin/United States + { LOCALE_TAGS(152, 66,230) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Langi/Latin/Tanzania + { LOCALE_TAGS(153, 65,129) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Lao/Lao/Laos + { LOCALE_TAGS(154, 66,253) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Latin/Latin/Vatican City + { LOCALE_TAGS(155, 66,131) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Latvian/Latin/Latvia + { LOCALE_TAGS(158, 66, 57) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Lingala/Latin/Congo - Kinshasa + { LOCALE_TAGS(158, 66, 7) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Lingala/Latin/Angola + { LOCALE_TAGS(158, 66, 46) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Lingala/Latin/Central African Republic + { LOCALE_TAGS(158, 66, 56) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Lingala/Latin/Congo - Brazzaville + { LOCALE_TAGS(160, 66,137) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Lithuanian/Latin/Lithuania + { LOCALE_TAGS(161, 66,258) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Lojban/Latin/world + { LOCALE_TAGS(162, 66, 91) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Lower Sorbian/Latin/Germany + { LOCALE_TAGS(163, 66, 91) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Low German/Latin/Germany + { LOCALE_TAGS(163, 66,165) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Low German/Latin/Netherlands + { LOCALE_TAGS(164, 66, 57) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Luba-Katanga/Latin/Congo - Kinshasa + { LOCALE_TAGS(165, 66,225) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Lule Sami/Latin/Sweden + { LOCALE_TAGS(165, 66,175) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Lule Sami/Latin/Norway + { LOCALE_TAGS(166, 66,124) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Luo/Latin/Kenya + { LOCALE_TAGS(167, 66,138) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Luxembourgish/Latin/Luxembourg + { LOCALE_TAGS(168, 66,124) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Luyia/Latin/Kenya + { LOCALE_TAGS(169, 27,140) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Macedonian/Cyrillic/Macedonia + { LOCALE_TAGS(170, 66,230) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Machame/Latin/Tanzania + { LOCALE_TAGS(171, 29,110) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Maithili/Devanagari/India + { LOCALE_TAGS(172, 66,160) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Makhuwa-Meetto/Latin/Mozambique + { LOCALE_TAGS(173, 66,230) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Makonde/Latin/Tanzania + { LOCALE_TAGS(174, 66,141) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Malagasy/Latin/Madagascar + { LOCALE_TAGS(175, 74,110) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Malayalam/Malayalam/India + { LOCALE_TAGS(176, 66,143) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Malay/Latin/Malaysia + { LOCALE_TAGS(176, 4, 35) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Malay/Arabic/Brunei + { LOCALE_TAGS(176, 4,143) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Malay/Arabic/Malaysia + { LOCALE_TAGS(176, 66, 35) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Malay/Latin/Brunei + { LOCALE_TAGS(176, 66,111) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Malay/Latin/Indonesia + { LOCALE_TAGS(176, 66,210) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Malay/Latin/Singapore + { LOCALE_TAGS(177, 66,146) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Maltese/Latin/Malta + { LOCALE_TAGS(179, 9,110) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Manipuri/Bangla/India + { LOCALE_TAGS(179, 78,110) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Manipuri/Meitei Mayek/India + { LOCALE_TAGS(180, 66,115) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Manx/Latin/Isle of Man + { LOCALE_TAGS(181, 66,167) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Maori/Latin/New Zealand + { LOCALE_TAGS(182, 66, 49) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Mapuche/Latin/Chile + { LOCALE_TAGS(183, 29,110) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Marathi/Devanagari/India + { LOCALE_TAGS(185, 66,124) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Masai/Latin/Kenya + { LOCALE_TAGS(185, 66,230) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Masai/Latin/Tanzania + { LOCALE_TAGS(186, 4,112) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Mazanderani/Arabic/Iran + { LOCALE_TAGS(188, 66,124) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Meru/Latin/Kenya + { LOCALE_TAGS(189, 66, 40) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Meta/Latin/Cameroon + { LOCALE_TAGS(190, 66, 41) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Mohawk/Latin/Canada + { LOCALE_TAGS(191, 27,156) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Mongolian/Cyrillic/Mongolia + { LOCALE_TAGS(191, 83, 50) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Mongolian/Mongolian/China + { LOCALE_TAGS(191, 83,156) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Mongolian/Mongolian/Mongolia + { LOCALE_TAGS(192, 66,150) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Morisyen/Latin/Mauritius + { LOCALE_TAGS(193, 66, 40) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Mundang/Latin/Cameroon + { LOCALE_TAGS(194, 66,248) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Muscogee/Latin/United States + { LOCALE_TAGS(195, 66,162) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Nama/Latin/Namibia + { LOCALE_TAGS(197, 66,248) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Navajo/Latin/United States + { LOCALE_TAGS(199, 29,164) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Nepali/Devanagari/Nepal + { LOCALE_TAGS(199, 29,110) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Nepali/Devanagari/India + { LOCALE_TAGS(201, 66, 40) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Ngiemboon/Latin/Cameroon + { LOCALE_TAGS(202, 66, 40) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Ngomba/Latin/Cameroon + { LOCALE_TAGS(203, 66,169) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Nigerian Pidgin/Latin/Nigeria + { LOCALE_TAGS(204, 90,102) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Nko/Nko/Guinea + { LOCALE_TAGS(205, 4,112) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Northern Luri/Arabic/Iran + { LOCALE_TAGS(205, 4,113) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Northern Luri/Arabic/Iraq + { LOCALE_TAGS(206, 66,175) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Northern Sami/Latin/Norway + { LOCALE_TAGS(206, 66, 83) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Northern Sami/Latin/Finland + { LOCALE_TAGS(206, 66,225) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Northern Sami/Latin/Sweden + { LOCALE_TAGS(207, 66,216) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Northern Sotho/Latin/South Africa + { LOCALE_TAGS(208, 66,261) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // North Ndebele/Latin/Zimbabwe + { LOCALE_TAGS(209, 66,175) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Norwegian Bokmal/Latin/Norway + { LOCALE_TAGS(209, 66,224) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Norwegian Bokmal/Latin/Svalbard and Jan Mayen + { LOCALE_TAGS(210, 66,175) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Norwegian Nynorsk/Latin/Norway + { LOCALE_TAGS(211, 66,219) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Nuer/Latin/South Sudan + { LOCALE_TAGS(212, 66,142) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Nyanja/Latin/Malawi + { LOCALE_TAGS(213, 66,243) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Nyankole/Latin/Uganda + { LOCALE_TAGS(214, 66, 84) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Occitan/Latin/France + { LOCALE_TAGS(214, 66,220) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Occitan/Latin/Spain + { LOCALE_TAGS(215, 91,110) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Odia/Odia/India + { LOCALE_TAGS(220, 66, 77) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Oromo/Latin/Ethiopia + { LOCALE_TAGS(220, 66,124) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Oromo/Latin/Kenya + { LOCALE_TAGS(221,101,248) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Osage/Osage/United States + { LOCALE_TAGS(222, 27, 90) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Ossetic/Cyrillic/Georgia + { LOCALE_TAGS(222, 27,193) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Ossetic/Cyrillic/Russia + { LOCALE_TAGS(226, 66, 62) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Papiamento/Latin/Curacao + { LOCALE_TAGS(226, 66, 13) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Papiamento/Latin/Aruba + { LOCALE_TAGS(227, 4, 1) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Pashto/Arabic/Afghanistan + { LOCALE_TAGS(227, 4,178) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Pashto/Arabic/Pakistan + { LOCALE_TAGS(228, 4,112) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Persian/Arabic/Iran + { LOCALE_TAGS(228, 4, 1) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Persian/Arabic/Afghanistan + { LOCALE_TAGS(230, 66,187) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Polish/Latin/Poland + { LOCALE_TAGS(231, 66, 32) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Portuguese/Latin/Brazil + { LOCALE_TAGS(231, 66, 7) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Portuguese/Latin/Angola + { LOCALE_TAGS(231, 66, 43) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Portuguese/Latin/Cape Verde + { LOCALE_TAGS(231, 66, 73) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Portuguese/Latin/Equatorial Guinea + { LOCALE_TAGS(231, 66,101) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Portuguese/Latin/Guinea-Bissau + { LOCALE_TAGS(231, 66,138) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Portuguese/Latin/Luxembourg + { LOCALE_TAGS(231, 66,139) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Portuguese/Latin/Macao + { LOCALE_TAGS(231, 66,160) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Portuguese/Latin/Mozambique + { LOCALE_TAGS(231, 66,188) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Portuguese/Latin/Portugal + { LOCALE_TAGS(231, 66,204) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Portuguese/Latin/Sao Tome and Principe + { LOCALE_TAGS(231, 66,226) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Portuguese/Latin/Switzerland + { LOCALE_TAGS(231, 66,232) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Portuguese/Latin/Timor-Leste + { LOCALE_TAGS(232, 66,187) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Prussian/Latin/Poland + { LOCALE_TAGS(233, 41,110) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Punjabi/Gurmukhi/India + { LOCALE_TAGS(233, 4,178) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Punjabi/Arabic/Pakistan + { LOCALE_TAGS(234, 66,184) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Quechua/Latin/Peru + { LOCALE_TAGS(234, 66, 28) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Quechua/Latin/Bolivia + { LOCALE_TAGS(234, 66, 70) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Quechua/Latin/Ecuador + { LOCALE_TAGS(235, 66,192) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Romanian/Latin/Romania + { LOCALE_TAGS(235, 66,154) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Romanian/Latin/Moldova + { LOCALE_TAGS(236, 66,226) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Romansh/Latin/Switzerland + { LOCALE_TAGS(237, 66,230) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Rombo/Latin/Tanzania + { LOCALE_TAGS(238, 66, 38) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Rundi/Latin/Burundi + { LOCALE_TAGS(239, 27,193) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Russian/Cyrillic/Russia + { LOCALE_TAGS(239, 27, 22) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Russian/Cyrillic/Belarus + { LOCALE_TAGS(239, 27,123) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Russian/Cyrillic/Kazakhstan + { LOCALE_TAGS(239, 27,128) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Russian/Cyrillic/Kyrgyzstan + { LOCALE_TAGS(239, 27,154) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Russian/Cyrillic/Moldova + { LOCALE_TAGS(239, 27,244) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Russian/Cyrillic/Ukraine + { LOCALE_TAGS(240, 66,230) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Rwa/Latin/Tanzania + { LOCALE_TAGS(241, 66, 74) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Saho/Latin/Eritrea + { LOCALE_TAGS(242, 27,193) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Sakha/Cyrillic/Russia + { LOCALE_TAGS(243, 66,124) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Samburu/Latin/Kenya + { LOCALE_TAGS(245, 66, 46) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Sango/Latin/Central African Republic + { LOCALE_TAGS(246, 66,230) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Sangu/Latin/Tanzania + { LOCALE_TAGS(247, 29,110) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Sanskrit/Devanagari/India + { LOCALE_TAGS(248, 93,110) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Santali/Ol Chiki/India + { LOCALE_TAGS(248, 29,110) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Santali/Devanagari/India + { LOCALE_TAGS(249, 66,117) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Sardinian/Latin/Italy + { LOCALE_TAGS(251, 66,160) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Sena/Latin/Mozambique + { LOCALE_TAGS(252, 27,207) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Serbian/Cyrillic/Serbia + { LOCALE_TAGS(252, 27, 29) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Serbian/Cyrillic/Bosnia and Herzegovina + { LOCALE_TAGS(252, 27,126) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Serbian/Cyrillic/Kosovo + { LOCALE_TAGS(252, 27,157) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Serbian/Cyrillic/Montenegro + { LOCALE_TAGS(252, 66, 29) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Serbian/Latin/Bosnia and Herzegovina + { LOCALE_TAGS(252, 66,126) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Serbian/Latin/Kosovo + { LOCALE_TAGS(252, 66,157) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Serbian/Latin/Montenegro + { LOCALE_TAGS(252, 66,207) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Serbian/Latin/Serbia + { LOCALE_TAGS(253, 66,230) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Shambala/Latin/Tanzania + { LOCALE_TAGS(254, 66,261) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Shona/Latin/Zimbabwe + { LOCALE_TAGS(255,141, 50) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Sichuan Yi/Yi/China + { LOCALE_TAGS(256, 66,117) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Sicilian/Latin/Italy + { LOCALE_TAGS(257, 66, 77) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Sidamo/Latin/Ethiopia + { LOCALE_TAGS(258, 66,187) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Silesian/Latin/Poland + { LOCALE_TAGS(259, 4,178) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Sindhi/Arabic/Pakistan + { LOCALE_TAGS(259, 29,110) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Sindhi/Devanagari/India + { LOCALE_TAGS(260,119,221) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Sinhala/Sinhala/Sri Lanka + { LOCALE_TAGS(261, 66, 83) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Skolt Sami/Latin/Finland + { LOCALE_TAGS(262, 66,212) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Slovak/Latin/Slovakia + { LOCALE_TAGS(263, 66,213) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Slovenian/Latin/Slovenia + { LOCALE_TAGS(264, 66,243) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Soga/Latin/Uganda + { LOCALE_TAGS(265, 66,215) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Somali/Latin/Somalia + { LOCALE_TAGS(265, 66, 67) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Somali/Latin/Djibouti + { LOCALE_TAGS(265, 66, 77) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Somali/Latin/Ethiopia + { LOCALE_TAGS(265, 66,124) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Somali/Latin/Kenya + { LOCALE_TAGS(266, 4,112) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Southern Kurdish/Arabic/Iran + { LOCALE_TAGS(266, 4,113) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Southern Kurdish/Arabic/Iraq + { LOCALE_TAGS(267, 66,225) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Southern Sami/Latin/Sweden + { LOCALE_TAGS(267, 66,175) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Southern Sami/Latin/Norway + { LOCALE_TAGS(268, 66,216) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Southern Sotho/Latin/South Africa + { LOCALE_TAGS(268, 66,133) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Southern Sotho/Latin/Lesotho + { LOCALE_TAGS(269, 66,216) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // South Ndebele/Latin/South Africa + { LOCALE_TAGS(270, 66,220) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Spanish/Latin/Spain + { LOCALE_TAGS(270, 66, 11) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Spanish/Latin/Argentina + { LOCALE_TAGS(270, 66, 24) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Spanish/Latin/Belize + { LOCALE_TAGS(270, 66, 28) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Spanish/Latin/Bolivia + { LOCALE_TAGS(270, 66, 32) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Spanish/Latin/Brazil + { LOCALE_TAGS(270, 66, 42) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Spanish/Latin/Canary Islands + { LOCALE_TAGS(270, 66, 47) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Spanish/Latin/Ceuta and Melilla + { LOCALE_TAGS(270, 66, 49) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Spanish/Latin/Chile + { LOCALE_TAGS(270, 66, 54) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Spanish/Latin/Colombia + { LOCALE_TAGS(270, 66, 59) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Spanish/Latin/Costa Rica + { LOCALE_TAGS(270, 66, 61) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Spanish/Latin/Cuba + { LOCALE_TAGS(270, 66, 69) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Spanish/Latin/Dominican Republic + { LOCALE_TAGS(270, 66, 70) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Spanish/Latin/Ecuador + { LOCALE_TAGS(270, 66, 72) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Spanish/Latin/El Salvador + { LOCALE_TAGS(270, 66, 73) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Spanish/Latin/Equatorial Guinea + { LOCALE_TAGS(270, 66, 99) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Spanish/Latin/Guatemala + { LOCALE_TAGS(270, 66,106) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Spanish/Latin/Honduras + { LOCALE_TAGS(270, 66,130) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Spanish/Latin/Latin America + { LOCALE_TAGS(270, 66,152) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Spanish/Latin/Mexico + { LOCALE_TAGS(270, 66,168) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Spanish/Latin/Nicaragua + { LOCALE_TAGS(270, 66,181) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Spanish/Latin/Panama + { LOCALE_TAGS(270, 66,183) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Spanish/Latin/Paraguay + { LOCALE_TAGS(270, 66,184) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Spanish/Latin/Peru + { LOCALE_TAGS(270, 66,185) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Spanish/Latin/Philippines + { LOCALE_TAGS(270, 66,189) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Spanish/Latin/Puerto Rico + { LOCALE_TAGS(270, 66,248) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Spanish/Latin/United States + { LOCALE_TAGS(270, 66,250) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Spanish/Latin/Uruguay + { LOCALE_TAGS(270, 66,254) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Spanish/Latin/Venezuela + { LOCALE_TAGS(271,135,159) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Standard Moroccan Tamazight/Tifinagh/Morocco + { LOCALE_TAGS(272, 66,111) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Sundanese/Latin/Indonesia + { LOCALE_TAGS(273, 66,230) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Swahili/Latin/Tanzania + { LOCALE_TAGS(273, 66, 57) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Swahili/Latin/Congo - Kinshasa + { LOCALE_TAGS(273, 66,124) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Swahili/Latin/Kenya + { LOCALE_TAGS(273, 66,243) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Swahili/Latin/Uganda + { LOCALE_TAGS(274, 66,216) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Swati/Latin/South Africa + { LOCALE_TAGS(274, 66, 76) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Swati/Latin/Eswatini + { LOCALE_TAGS(275, 66,225) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Swedish/Latin/Sweden + { LOCALE_TAGS(275, 66, 2) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Swedish/Latin/Aland Islands + { LOCALE_TAGS(275, 66, 83) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Swedish/Latin/Finland + { LOCALE_TAGS(276, 66,226) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Swiss German/Latin/Switzerland + { LOCALE_TAGS(276, 66, 84) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Swiss German/Latin/France + { LOCALE_TAGS(276, 66,136) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Swiss German/Latin/Liechtenstein + { LOCALE_TAGS(277,123,113) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Syriac/Syriac/Iraq + { LOCALE_TAGS(277,123,227) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Syriac/Syriac/Syria + { LOCALE_TAGS(278,135,159) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Tachelhit/Tifinagh/Morocco + { LOCALE_TAGS(278, 66,159) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Tachelhit/Latin/Morocco + { LOCALE_TAGS(280,127,255) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Tai Dam/Tai Viet/Vietnam + { LOCALE_TAGS(281, 66,124) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Taita/Latin/Kenya + { LOCALE_TAGS(282, 27,229) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Tajik/Cyrillic/Tajikistan + { LOCALE_TAGS(283,129,110) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Tamil/Tamil/India + { LOCALE_TAGS(283,129,143) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Tamil/Tamil/Malaysia + { LOCALE_TAGS(283,129,210) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Tamil/Tamil/Singapore + { LOCALE_TAGS(283,129,221) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Tamil/Tamil/Sri Lanka + { LOCALE_TAGS(284, 66,228) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Taroko/Latin/Taiwan + { LOCALE_TAGS(285, 66,170) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Tasawaq/Latin/Niger + { LOCALE_TAGS(286, 27,193) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Tatar/Cyrillic/Russia + { LOCALE_TAGS(287,131,110) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Telugu/Telugu/India + { LOCALE_TAGS(288, 66,243) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Teso/Latin/Uganda + { LOCALE_TAGS(288, 66,124) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Teso/Latin/Kenya + { LOCALE_TAGS(289,133,231) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Thai/Thai/Thailand + { LOCALE_TAGS(290,134, 50) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Tibetan/Tibetan/China + { LOCALE_TAGS(290,134,110) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Tibetan/Tibetan/India + { LOCALE_TAGS(291, 33, 74) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Tigre/Ethiopic/Eritrea + { LOCALE_TAGS(292, 33, 77) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Tigrinya/Ethiopic/Ethiopia + { LOCALE_TAGS(292, 33, 74) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Tigrinya/Ethiopic/Eritrea + { LOCALE_TAGS(294, 66,182) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Tok Pisin/Latin/Papua New Guinea + { LOCALE_TAGS(295, 66,235) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Tongan/Latin/Tonga + { LOCALE_TAGS(296, 66,216) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Tsonga/Latin/South Africa + { LOCALE_TAGS(297, 66,216) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Tswana/Latin/South Africa + { LOCALE_TAGS(297, 66, 30) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Tswana/Latin/Botswana + { LOCALE_TAGS(298, 66,239) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Turkish/Latin/Turkey + { LOCALE_TAGS(298, 66, 63) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Turkish/Latin/Cyprus + { LOCALE_TAGS(299, 66,240) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Turkmen/Latin/Turkmenistan + { LOCALE_TAGS(301, 66,169) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Tyap/Latin/Nigeria + { LOCALE_TAGS(303, 27,244) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Ukrainian/Cyrillic/Ukraine + { LOCALE_TAGS(304, 66, 91) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Upper Sorbian/Latin/Germany + { LOCALE_TAGS(305, 4,178) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Urdu/Arabic/Pakistan + { LOCALE_TAGS(305, 4,110) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Urdu/Arabic/India + { LOCALE_TAGS(306, 4, 50) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Uyghur/Arabic/China + { LOCALE_TAGS(307, 66,251) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Uzbek/Latin/Uzbekistan + { LOCALE_TAGS(307, 4, 1) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Uzbek/Arabic/Afghanistan + { LOCALE_TAGS(307, 27,251) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Uzbek/Cyrillic/Uzbekistan + { LOCALE_TAGS(308,139,134) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Vai/Vai/Liberia + { LOCALE_TAGS(308, 66,134) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Vai/Latin/Liberia + { LOCALE_TAGS(309, 66,216) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Venda/Latin/South Africa + { LOCALE_TAGS(310, 66,255) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Vietnamese/Latin/Vietnam + { LOCALE_TAGS(311, 66,258) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Volapuk/Latin/world + { LOCALE_TAGS(312, 66,230) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Vunjo/Latin/Tanzania + { LOCALE_TAGS(313, 66, 23) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Walloon/Latin/Belgium + { LOCALE_TAGS(314, 66,226) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Walser/Latin/Switzerland + { LOCALE_TAGS(315, 66, 15) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Warlpiri/Latin/Australia + { LOCALE_TAGS(316, 66,246) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Welsh/Latin/United Kingdom + { LOCALE_TAGS(317, 4,178) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Western Balochi/Arabic/Pakistan + { LOCALE_TAGS(317, 4, 1) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Western Balochi/Arabic/Afghanistan + { LOCALE_TAGS(317, 4,112) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Western Balochi/Arabic/Iran + { LOCALE_TAGS(317, 4,176) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Western Balochi/Arabic/Oman + { LOCALE_TAGS(317, 4,245) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Western Balochi/Arabic/United Arab Emirates + { LOCALE_TAGS(318, 66,165) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Western Frisian/Latin/Netherlands + { LOCALE_TAGS(319, 33, 77) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Wolaytta/Ethiopic/Ethiopia + { LOCALE_TAGS(320, 66,206) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Wolof/Latin/Senegal + { LOCALE_TAGS(321, 66,216) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Xhosa/Latin/South Africa + { LOCALE_TAGS(322, 66, 40) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Yangben/Latin/Cameroon + { LOCALE_TAGS(323, 47,244) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Yiddish/Hebrew/Ukraine + { LOCALE_TAGS(324, 66,169) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Yoruba/Latin/Nigeria + { LOCALE_TAGS(324, 66, 25) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Yoruba/Latin/Benin + { LOCALE_TAGS(325, 66,170) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Zarma/Latin/Niger + { LOCALE_TAGS(326, 66, 50) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Zhuang/Latin/China + { LOCALE_TAGS(327, 66,216) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Zulu/Latin/South Africa + { LOCALE_TAGS(328, 66, 32) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Kaingang/Latin/Brazil + { LOCALE_TAGS(329, 66, 32) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Nheengatu/Latin/Brazil + { LOCALE_TAGS(329, 66, 54) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Nheengatu/Latin/Colombia + { LOCALE_TAGS(329, 66,254) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Nheengatu/Latin/Venezuela + { LOCALE_TAGS(330, 29,110) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Haryanvi/Devanagari/India + { LOCALE_TAGS(331, 66, 91) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Northern Frisian/Latin/Germany + { LOCALE_TAGS(332, 29,110) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Rajasthani/Devanagari/India + { LOCALE_TAGS(333, 27,193) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Moksha/Cyrillic/Russia + { LOCALE_TAGS(334, 66,258) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Toki Pona/Latin/world + { LOCALE_TAGS(335, 66,214) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Pijin/Latin/Solomon Islands + { LOCALE_TAGS(336, 66,169) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Obolo/Latin/Nigeria + { LOCALE_TAGS(337, 4,178) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Baluchi/Arabic/Pakistan + { LOCALE_TAGS(337, 66,178) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Baluchi/Latin/Pakistan + { LOCALE_TAGS(338, 66,117) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Ligurian/Latin/Italy + { LOCALE_TAGS(339,142,161) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Rohingya/Hanifi/Myanmar + { LOCALE_TAGS(339,142, 20) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Rohingya/Hanifi/Bangladesh + { LOCALE_TAGS(340, 4,178) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Torwali/Arabic/Pakistan + { LOCALE_TAGS(341, 66, 25) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Anii/Latin/Benin + { LOCALE_TAGS(342, 29,110) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Kangri/Devanagari/India + { LOCALE_TAGS(343, 66,117) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Venetian/Latin/Italy + { LOCALE_TAGS(344, 66,110) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Kuvi/Latin/India + { LOCALE_TAGS(344, 29,110) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Kuvi/Devanagari/India + { LOCALE_TAGS(344, 91,110) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Kuvi/Odia/India + { LOCALE_TAGS(344,131,110) 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 6, 6, 5, 0, 0, 0, 0, }, // Kuvi/Telugu/India + { LOCALE_TAGS( 0, 0, 0) 0, 0, 0, 0, 14, 14, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, } // Terminal row +}; + +static constexpr char16_t hourFormatTable[] = { + // +HH:mm, -HH:mm (stubs) + 0x2b, 0x48, 0x48, 0x3a, 0x6d, 0x6d, 0x0, + 0x2d, 0x48, 0x48, 0x3a, 0x6d, 0x6d, 0x0 // 88 char16_t @ 2 bytes +}; + +static constexpr char16_t gmtFormatTable[] = { + // UTC%0 (stub) + 0x55, 0x54, 0x43, 0x25, 0x30, 0x0 // 271 char16_t @ 2 bytes +}; + +static constexpr char16_t regionFormatTable[] = { + 0x0 // 6066 char16_t @ 2 bytes +}; + +static constexpr char16_t fallbackFormatTable[] = { + 0x0 // 49 char16_t @ 2 bytes +}; + +static constexpr char16_t exemplarCityTable[] = { + 0x0 // 214634 char16_t @ 2 bytes +}; + +static constexpr char16_t shortZoneNameTable[] = { + 0x0 // 159 char16_t @ 2 bytes +}; + +static constexpr char16_t longZoneNameTable[] = { + 0x0 // 9552 char16_t @ 2 bytes +}; + +static constexpr char16_t shortMetaZoneNameTable[] = { + 0x0 // 844 char16_t @ 2 bytes +}; + +static constexpr char16_t longMetaZoneNameTable[] = { + 0x0 // 910242 char16_t @ 2 bytes +}; +// Total: 3457942 bytes, c 3.3 MiB +// Debug binary qtimezonelocale.cpp.o: 8246776 bytes +// Release binary qtimezonelocale.cpp.o: 2464064 bytes + // GENERATED PART ENDS HERE } // QtTimeZoneLocale +#undef LOCALE_TAGS + QT_END_NAMESPACE #endif // QTIMEZONELOCALE_DATA_P_H diff --git a/src/corelib/time/qtimezonelocale_p.h b/src/corelib/time/qtimezonelocale_p.h index 9ea1e8ebf11..515aeac8759 100644 --- a/src/corelib/time/qtimezonelocale_p.h +++ b/src/corelib/time/qtimezonelocale_p.h @@ -21,12 +21,15 @@ #if QT_CONFIG(icu) #include +#else +#include // for DataRange #endif QT_REQUIRE_CONFIG(timezone); QT_REQUIRE_CONFIG(timezone_locale); QT_BEGIN_NAMESPACE +#define QT_CLDR_ZONE_DEBUG namespace QtTimeZoneLocale { #if QT_CONFIG(icu) @@ -37,10 +40,150 @@ QString ucalTimeZoneDisplayName(UCalendar *ucal, QTimeZone::TimeType timeType, QList ianaIdsForTerritory(QLocale::Territory territory); +QList fallbackLocalesFor(qsizetype index); // qlocale.cpp + // Define data types for QTZL_data_p.h +// Accessor methods returning DataRange: +#define rangeGetter(name) \ + constexpr QLocaleData::DataRange name() const \ + { return { m_ ## name ## _idx, m_ ## name ## _size }; } +// Indices of starts of formats within their tables: +#define declFieldIndex(name) quint16 m_ ## name ## _idx; +#define declBigFieldIndex(name) quint32 m_ ## name ## _idx; +// Lengths of formats: +#define declFieldSize(name) quint8 m_ ## name ## _size; +// Generic, standard, daylight-saving triples: +#define forEachNameType(X, form) X(form ## Generic) X(form ## Standard) X(form ## DaylightSaving) +// Mapping TimeType to the appropriate one of those: +#define timeTypeRange(form) \ + constexpr QLocaleData::DataRange form ## Name(QTimeZone::TimeType timeType) const \ + { \ + switch (timeType) { \ + case QTimeZone::StandardTime: return form ## Standard(); \ + case QTimeZone::DaylightTime: return form ## DaylightSaving(); \ + case QTimeZone::GenericTime: return form ## Generic(); \ + } \ + Q_UNREACHABLE_RETURN({}); \ + } +// Mostly form is short or long and we want to append Name. +// See kludge below for regionFormat, for which that's not the name the method wants. + +struct LocaleZoneData +{ +#ifdef QT_CLDR_ZONE_DEBUG + // Only included when this define is set, for the sake of asserting + // consistency with QLocaleData at matching index in tables. + quint16 m_language_id, m_script_id, m_territory_id; #endif -} + + // Indices for this locale: + quint32 m_exemplarTableStart; // first LocaleZoneExemplar + quint32 m_metaLongTableStart; // first LocaleMetaZoneLongNames + quint16 m_metaShortTableStart; // first LocaleMetaZoneShortNames + quint16 m_zoneTableStart; // first LocaleZoneNames + + // Zone-independent formats: +#define forEachField(X) \ + X(posHourFormat) X(negHourFormat) X(offsetGmtFormat) X(fallbackFormat) \ + forEachNameType(X, regionFormat) + // Hour formats: HH is hour, mm is minutes (always use two digits for each). + // GMT format: %0 is an hour format's result. + // Region formats: %0 is exemplar city or territory. + // Fallback format: %0 is exemplar city or territory, %1 is meta-zone name. + + forEachField(rangeGetter) + forEachField(declFieldIndex) + forEachField(declFieldSize) + +#undef forEachField +#define regionFormatName regionFormatRange // kludge naming + timeTypeRange(regionFormat) +#undef regionFormatName +}; + +// Sorted by localeIndex, then ianaIdIndex +struct LocaleZoneExemplar +{ + quint16 localeIndex; // Index in locale data tables + quint16 ianaIdIndex; // Location in IANA ID table + constexpr QByteArrayView ianaId() const; // Defined in QTZL.cpp + rangeGetter(exemplarCity); + quint32 m_exemplarCity_idx; + quint8 m_exemplarCity_size; +}; + +// Sorted by localeIndex, then ianaIdIndex +struct LocaleZoneNames +{ + quint16 localeIndex; // Index in locale data tables + quint16 ianaIdIndex; // Location in IANA ID table + constexpr QByteArrayView ianaId() const; // Defined in QTZL.cpp + constexpr QLocaleData::DataRange name(QTimeZone::NameType nameType, + QTimeZone::TimeType timeType) const + { + return nameType == QTimeZone::ShortName ? shortName(timeType) : longName(timeType); + } + timeTypeRange(long) + timeTypeRange(short) +#define forEach32BitField(X) forEachNameType(X, long) +#define forEach16BitField(X) forEachNameType(X, short) +#define forEachField(X) forEach32BitField(X) forEach16BitField(X) + // Localized name of exemplar city for zone. + // Long and short localized names (length zero for unspecified) for the zone + // in its generic, standard and daylight-saving forms. + + forEachField(rangeGetter) + forEach32BitField(declBigFieldIndex) + forEach16BitField(declFieldIndex) + forEachField(declFieldSize) + +#undef forEachField +#undef forEach16BitField +#undef forEach32BitField +}; + +// Sorted by localeIndex, then metaIdIndex +struct LocaleMetaZoneLongNames +{ + quint16 localeIndex; // Index in locale data tables + quint16 metaIdIndex; // metaZoneTable[metaZoneKey - 1].metaIdIndex + timeTypeRange(long) +#define forEachField(X) forEachNameType(X, long) + // Long localized names (length zero for unspecified) for the + // metazone in its generic, standard and daylight-saving forms. + + forEachField(rangeGetter) + forEachField(declBigFieldIndex) + forEachField(declFieldSize) + +#undef forEachField +}; + +// Sorted by localeIndex, then metaIdIndex +struct LocaleMetaZoneShortNames +{ + quint16 localeIndex; // Index in locale data tables + quint16 metaIdIndex; // metaZoneTable[metaZoneKey - 1].metaIdIndex + timeTypeRange(short) +#define forEachField(X) forEachNameType(X, short) + // Short localized names (length zero for unspecified) for the + // metazone in its generic, standard and daylight-saving forms. + + forEachField(rangeGetter) + forEachField(declFieldIndex) + forEachField(declFieldSize) + +#undef forEachField +}; + +#undef timeTypeRange +#undef forEachNameType +#undef declFieldSize +#undef declFieldIndex +#undef rangeGetter +#endif +} // QtTimeZoneLocale QT_END_NAMESPACE diff --git a/src/corelib/time/qtimezoneprivate_data_p.h b/src/corelib/time/qtimezoneprivate_data_p.h index 807ee445662..321ca725725 100644 --- a/src/corelib/time/qtimezoneprivate_data_p.h +++ b/src/corelib/time/qtimezoneprivate_data_p.h @@ -125,7 +125,7 @@ struct ZoneMetaHistory // GENERATED PART STARTS HERE /* - This part of the file was generated on 2024-06-11 from the + This part of the file was generated on 2024-07-19 from the Common Locale Data Repository v45 http://www.unicode.org/cldr/ @@ -843,7 +843,7 @@ static constexpr UtcData utcDataTable[] = { #if QT_CONFIG(timezone_locale) && !QT_CONFIG(icu) -// QLocale::Territory value, Alias ID Index +// QLocale::Territory value, IANA ID Index static constexpr TerritoryZone territoryZoneMap[] = { { 49, 2165 }, // Chile -> America/Santiago { 50, 1020 }, // China -> Asia/Shanghai @@ -858,7 +858,7 @@ static constexpr TerritoryZone territoryZoneMap[] = { { 251, 4683 }, // Uzbekistan -> Asia/Tashkent }; -// MetaZone Key, MetaZone Name Index, QLocale::Territory value, Alias ID Index +// MetaZone Key, MetaZone Name Index, QLocale::Territory value, IANA ID Index static constexpr MetaZoneData metaZoneTable[] = { { 1, 0, 258, 695 }, // Acre/world -> America/Rio_Branco { 2, 5, 258, 3462 }, // Afghanistan/world -> Asia/Kabul @@ -1188,43 +1188,43 @@ static constexpr ZoneMetaHistory zoneHistoryTable[] = { { 6751, 76, 0,4294967295 }, { 6723, 76, 0,4294967295 }, { 4961, 4, 0,4294967295 }, - { 7383, 66, 0, 5836132 }, - { 7383, 63, 5836132, 7341412 }, - { 7383, 66, 7341412, 8474624 }, - { 7383, 63, 8474624,4294967295 }, + { 7383, 66, 0, 4103940 }, + { 7383, 63, 4103940, 5162340 }, + { 7383, 66, 5162340, 5958720 }, + { 7383, 63, 5958720,4294967295 }, { 14, 4, 0,4294967295 }, { 44, 76, 0,4294967295 }, { 5159, 7, 0,4294967295 }, { 6709, 76, 0,4294967295 }, - { 7398, 5, 0, 3739708 }, - { 7398, 76, 3739708,4294967295 }, + { 7398, 5, 0, 2629500 }, + { 7398, 76, 2629500,4294967295 }, { 4859, 3, 0,4294967295 }, { 5189, 7, 0,4294967295 }, { 4824, 3, 0,4294967295 }, { 2256, 64, 0,4294967295 }, - { 4019, 66, 0, 10625024 }, - { 4019, 63, 10625024, 11967844 }, - { 4019, 66, 11967844, 36520056 }, - { 7412, 66, 0, 10625024 }, - { 7412, 63, 10625024,4294967295 }, + { 4019, 66, 0, 7470720 }, + { 4019, 63, 7470720, 8415300 }, + { 4019, 66, 8415300, 25678200 }, + { 7412, 66, 0, 7470720 }, + { 7412, 63, 7470720,4294967295 }, { 6736, 76, 0,4294967295 }, { 6803, 76, 0,4294967295 }, { 5032, 4, 0,4294967295 }, { 4945, 4, 0,4294967295 }, { 5145, 7, 0,4294967295 }, - { 5068, 5, 0, 4700220 }, - { 5068, 66, 4700220, 36520056 }, + { 5068, 5, 0, 3304860 }, + { 5068, 66, 3304860, 25678200 }, { 6816, 76, 0,4294967295 }, { 4808, 3, 0,4294967295 }, { 4917, 3, 0,4294967295 }, { 4381, 6, 0,4294967295 }, - { 4401, 3, 0, 22469208 }, - { 4401, 4, 22469208, 38212844 }, - { 4401, 3, 38212844,4294967295 }, + { 4401, 3, 0, 15798840 }, + { 4401, 4, 15798840, 26868780 }, + { 4401, 3, 26868780,4294967295 }, { 5053, 4, 0,4294967295 }, - { 4426, 3, 0, 22469208 }, - { 4426, 4, 22469208, 35779820 }, - { 4426, 3, 35779820,4294967295 }, + { 4426, 3, 0, 15798840 }, + { 4426, 4, 15798840, 25158060 }, + { 4426, 3, 25158060,4294967295 }, { 4875, 3, 0,4294967295 }, { 5208, 7, 0,4294967295 }, { 4646, 7, 0,4294967295 }, @@ -1238,85 +1238,85 @@ static constexpr ZoneMetaHistory zoneHistoryTable[] = { { 5099, 6, 0,4294967295 }, { 5084, 6, 0,4294967295 }, { 5015, 4, 0,4294967295 }, - { 6997, 111, 0, 1742893 }, - { 6997, 76, 1742893,4294967295 }, + { 6997, 111, 0, 1225485 }, + { 6997, 76, 1225485,4294967295 }, { 3755, 4, 0,4294967295 }, { 5173, 7, 0,4294967295 }, { 5256, 7, 0,4294967295 }, { 6766, 76, 0,4294967295 }, { 6690, 76, 0,4294967295 }, { 5127, 7, 0,4294967295 }, - { 4337, 76, 0, 35905596 }, - { 4337, 7, 35905596, 36653116 }, - { 4337, 76, 36653116,4294967295 }, - { 2732, 64, 0, 8975656 }, - { 2732, 63, 8975656, 15211876 }, - { 2732, 64, 15211876, 20006184 }, - { 2732, 63, 20006184, 20761896 }, - { 2732, 64, 20761896, 32059392 }, - { 2732, 63, 32059392, 32774144 }, - { 2732, 64, 32774144,4294967295 }, + { 4337, 76, 0, 25246140 }, + { 4337, 7, 25246140, 25771740 }, + { 4337, 76, 25771740,4294967295 }, + { 2732, 64, 0, 6311400 }, + { 2732, 63, 6311400, 10696260 }, + { 2732, 64, 10696260, 14067240 }, + { 2732, 63, 14067240, 14598600 }, + { 2732, 64, 14598600, 22541760 }, + { 2732, 63, 22541760, 23044320 }, + { 2732, 64, 23044320,4294967295 }, { 6503, 63, 0,4294967295 }, - { 4054, 6, 0, 15121704 }, - { 4054, 3, 15121704, 18113832 }, - { 4054, 7, 18113832, 35763496 }, - { 4054, 3, 35763496,4294967295 }, - { 132, 35, 0, 10343120 }, - { 132, 85, 10406488,4294967295 }, - { 3173, 10, 0, 10343060 }, - { 3173, 9, 10406428,4294967295 }, + { 4054, 6, 0, 10632840 }, + { 4054, 3, 10632840, 12736680 }, + { 4054, 7, 12736680, 25146600 }, + { 4054, 3, 25146600,4294967295 }, + { 132, 35, 0, 7272720 }, + { 132, 85, 7317240,4294967295 }, + { 3173, 10, 0, 7272660 }, + { 3173, 9, 7317180,4294967295 }, { 5524, 26, 0,4294967295 }, { 5541, 26, 0,4294967295 }, { 4456, 39, 0,4294967295 }, { 166, 22, 0,4294967295 }, - { 91, 22, 0, 15833208 }, - { 91, 22, 16306416, 25743540 }, - { 91, 23, 25743540, 25782512 }, - { 91, 22, 25782512,4294967295 }, - { 270, 22, 0, 15833208 }, - { 270, 22, 16306416,4294967295 }, - { 441, 22, 0, 15087736 }, - { 441, 22, 16277744,4294967295 }, - { 7425, 22, 0, 15829112 }, - { 7425, 23, 15829112, 15966448 }, - { 7425, 22, 15966448, 25743540 }, - { 7425, 23, 25743540, 25782512 }, - { 7425, 22, 25782512,4294967295 }, - { 565, 22, 0, 15087736 }, - { 565, 22, 17051888, 25725108 }, - { 565, 22, 25983216,4294967295 }, - { 7452, 22, 0, 25743540 }, - { 7452, 23, 25743540, 25782512 }, - { 7452, 22, 25782512,4294967295 }, - { 7483, 22, 0, 15833208 }, - { 7483, 22, 16306416,4294967295 }, - { 7507, 22, 0, 15829112 }, - { 7507, 23, 15829112, 15966448 }, - { 7507, 22, 15966448, 25741492 }, - { 7507, 23, 25741492, 25854192 }, - { 7507, 22, 25854192,4294967295 }, - { 5497, 22, 0, 15108216 }, - { 5497, 23, 15108216, 16017648 }, - { 5497, 22, 16017648, 22255796 }, - { 5497, 23, 22255796, 22567092 }, - { 5497, 22, 22567092, 25741492 }, - { 5497, 23, 25741492, 25854192 }, - { 5497, 22, 25854192, 28465272 }, - { 5497, 23, 28465272, 29753584 }, - { 5497, 22, 29753584,4294967295 }, - { 7534, 22, 0, 15833208 }, - { 7534, 22, 16306416, 25743540 }, - { 7534, 23, 25743540, 25768176 }, - { 7534, 22, 25768176,4294967295 }, - { 7560, 22, 0, 25739444 }, - { 7560, 22, 25782512,4294967295 }, + { 91, 22, 0, 11132760 }, + { 91, 22, 11465520, 18100980 }, + { 91, 23, 18100980, 18128400 }, + { 91, 22, 18128400,4294967295 }, + { 270, 22, 0, 11132760 }, + { 270, 22, 11465520,4294967295 }, + { 441, 22, 0, 10608600 }, + { 441, 22, 11445360,4294967295 }, + { 7425, 22, 0, 11129880 }, + { 7425, 23, 11129880, 11226480 }, + { 7425, 22, 11226480, 18100980 }, + { 7425, 23, 18100980, 18128400 }, + { 7425, 22, 18128400,4294967295 }, + { 565, 22, 0, 10608600 }, + { 565, 22, 11989680, 18088020 }, + { 565, 22, 18269520,4294967295 }, + { 7452, 22, 0, 18100980 }, + { 7452, 23, 18100980, 18128400 }, + { 7452, 22, 18128400,4294967295 }, + { 7483, 22, 0, 11132760 }, + { 7483, 22, 11465520,4294967295 }, + { 7507, 22, 0, 11129880 }, + { 7507, 23, 11129880, 11226480 }, + { 7507, 22, 11226480, 18099540 }, + { 7507, 23, 18099540, 18178800 }, + { 7507, 22, 18178800,4294967295 }, + { 5497, 22, 0, 10623000 }, + { 5497, 23, 10623000, 11262480 }, + { 5497, 22, 11262480, 15648660 }, + { 5497, 23, 15648660, 15867540 }, + { 5497, 22, 15867540, 18099540 }, + { 5497, 23, 18099540, 18178800 }, + { 5497, 22, 18178800, 20014680 }, + { 5497, 23, 20014680, 20920560 }, + { 5497, 22, 20920560,4294967295 }, + { 7534, 22, 0, 11132760 }, + { 7534, 22, 11465520, 18100980 }, + { 7534, 23, 18100980, 18118320 }, + { 7534, 22, 18118320,4294967295 }, + { 7560, 22, 0, 18098100 }, + { 7560, 22, 18128400,4294967295 }, { 5557, 26, 0,4294967295 }, { 4154, 142, 0,4294967295 }, { 237, 14, 0,4294967295 }, { 3581, 39, 0,4294967295 }, { 7586, 16, 0, 480 }, - { 7586, 15, 480, 30112284 }, - { 7586, 13, 30112284,4294967295 }, + { 7586, 15, 480, 21172860 }, + { 7586, 13, 21172860,4294967295 }, { 5571, 26, 0,4294967295 }, { 7609, 39, 0,4294967295 }, { 5309, 13, 0,4294967295 }, @@ -1324,55 +1324,55 @@ static constexpr ZoneMetaHistory zoneHistoryTable[] = { { 7644, 12, 0,4294967295 }, { 4263, 51, 0,4294967295 }, { 7662, 15, 0,4294967295 }, - { 7676, 15, 0, 22313440 }, - { 7676, 13, 22313440, 23058852 }, - { 7676, 14, 23058852, 23073068 }, - { 7676, 13, 23073068, 23374364 }, - { 7676, 15, 23374364,4294967295 }, + { 7676, 15, 0, 15689280 }, + { 7676, 13, 15689280, 16213380 }, + { 7676, 14, 16213380, 16223340 }, + { 7676, 13, 16223340, 16435260 }, + { 7676, 15, 16435260,4294967295 }, { 7698, 12, 0,4294967295 }, - { 3770, 13, 0, 8958312 }, - { 3770, 14, 8958312, 21381480 }, - { 3770, 13, 21381480, 33724896 }, - { 3770, 14, 33724896,4294967295 }, + { 3770, 13, 0, 6298920 }, + { 3770, 14, 6298920, 15033960 }, + { 3770, 13, 15033960, 23712960 }, + { 3770, 14, 23712960,4294967295 }, { 4596, 181, 0,4294967295 }, { 4247, 69, 0,4294967295 }, { 5398, 14, 0,4294967295 }, { 3241, 13, 0,4294967295 }, - { 7719, 13, 0, 21137948 }, - { 7719, 123, 21137948, 39516640 }, - { 7719, 13, 39516640,4294967295 }, - { 7737, 13, 0, 21137948 }, - { 7737, 123, 21137948, 39516640 }, - { 7737, 13, 39516640, 39580008 }, - { 7737, 15, 39580008,4294967295 }, + { 7719, 13, 0, 14862780 }, + { 7719, 123, 14862780, 27785280 }, + { 7719, 13, 27785280,4294967295 }, + { 7737, 13, 0, 14862780 }, + { 7737, 123, 14862780, 27785280 }, + { 7737, 13, 27785280, 27829800 }, + { 7737, 15, 27829800,4294967295 }, { 5324, 13, 0,4294967295 }, { 7759, 15, 0,4294967295 }, { 3693, 12, 0,4294967295 }, { 5640, 26, 0,4294967295 }, - { 7775, 81, 0, 19447988 }, - { 7775, 76, 19447988,4294967295 }, - { 7796, 16, 2859548, 38025636 }, - { 7796, 190, 38025636,4294967295 }, - { 7811, 16, 0, 1991196 }, - { 7811, 15, 1991196,4294967295 }, + { 7775, 81, 0, 13674420 }, + { 7775, 76, 13674420,4294967295 }, + { 7796, 16, 2010780, 26736900 }, + { 7796, 190, 26736900,4294967295 }, + { 7811, 16, 0, 1400220 }, + { 7811, 15, 1400220,4294967295 }, { 805, 15, 0,4294967295 }, { 3341, 14, 0,4294967295 }, { 5656, 26, 0,4294967295 }, { 893, 15, 0,4294967295 }, - { 7832, 1, 0, 28782892 }, - { 7832, 12, 28782892, 32807152 }, - { 7832, 1, 32807152,4294967295 }, + { 7832, 1, 0, 20238060 }, + { 7832, 12, 20238060, 23067600 }, + { 7832, 1, 23067600,4294967295 }, { 5343, 13, 0,4294967295 }, - { 7849, 16, 0, 33796696 }, - { 7849, 15, 33796696,4294967295 }, + { 7849, 16, 0, 23763480 }, + { 7849, 15, 23763480,4294967295 }, { 7869, 39, 0,4294967295 }, { 7887, 26, 0,4294967295 }, - { 6844, 26, 0, 13654257 }, - { 6844, 77, 13654257, 14084217 }, - { 6844, 26, 14084217,4294967295 }, - { 4514, 14, 0, 33796516 }, - { 4514, 26, 33796516, 36047268 }, - { 4514, 14, 36047268,4294967295 }, + { 6844, 26, 0, 9600721 }, + { 6844, 77, 9600721, 9903001 }, + { 6844, 26, 9903001,4294967295 }, + { 4514, 14, 0, 23763300 }, + { 4514, 26, 23763300, 25345860 }, + { 4514, 14, 25345860,4294967295 }, { 5687, 26, 0,4294967295 }, { 5703, 26, 0,4294967295 }, { 3662, 13, 0,4294967295 }, @@ -1383,223 +1383,223 @@ static constexpr ZoneMetaHistory zoneHistoryTable[] = { { 7905, 16, 0, 480 }, { 7905, 123, 480,4294967295 }, { 348, 14, 0,4294967295 }, - { 481, 13, 0, 16320932 }, - { 481, 14, 16320932, 27115940 }, - { 481, 13, 27115940,4294967295 }, - { 7924, 14, 0, 3002788 }, - { 7924, 13, 3002788, 3604900 }, - { 7924, 14, 3604900,4294967295 }, - { 7948, 13, 0, 5855652 }, - { 7948, 14, 5855652, 27115940 }, - { 7948, 13, 27115940, 28305828 }, - { 7948, 14, 28305828,4294967295 }, - { 7975, 14, 0, 27115940 }, - { 7975, 13, 27115940,4294967295 }, + { 481, 13, 0, 11475780 }, + { 481, 14, 11475780, 19066020 }, + { 481, 13, 19066020,4294967295 }, + { 7924, 14, 0, 2111460 }, + { 7924, 13, 2111460, 2534820 }, + { 7924, 14, 2534820,4294967295 }, + { 7948, 13, 0, 4117380 }, + { 7948, 14, 4117380, 19066020 }, + { 7948, 13, 19066020, 19902660 }, + { 7948, 14, 19902660,4294967295 }, + { 7975, 14, 0, 19066020 }, + { 7975, 13, 19066020,4294967295 }, { 8001, 14, 0,4294967295 }, - { 8023, 14, 0, 27115940 }, - { 8023, 13, 27115940, 28305828 }, - { 8023, 14, 28305828,4294967295 }, - { 8049, 14, 0, 27115940 }, - { 8049, 13, 27115940, 27818464 }, - { 8049, 14, 27818464,4294967295 }, - { 8073, 16, 0, 6974040 }, - { 8073, 15, 6974040,4294967295 }, - { 660, 14, 0, 22313320 }, - { 660, 13, 22313320, 23058852 }, - { 660, 14, 23058852,4294967295 }, + { 8023, 14, 0, 19066020 }, + { 8023, 13, 19066020, 19902660 }, + { 8023, 14, 19902660,4294967295 }, + { 8049, 14, 0, 19066020 }, + { 8049, 13, 19066020, 19560000 }, + { 8049, 14, 19560000,4294967295 }, + { 8073, 16, 0, 4903800 }, + { 8073, 15, 4903800,4294967295 }, + { 660, 14, 0, 15689160 }, + { 660, 13, 15689160, 16213380 }, + { 660, 14, 16213380,4294967295 }, { 2665, 14, 0,4294967295 }, - { 5282, 16, 0, 7719512 }, - { 5282, 16, 8092248, 10342940 }, - { 5282, 9, 10406428,4294967295 }, - { 521, 14, 0, 3002788 }, - { 521, 13, 3002788, 3604900 }, - { 521, 14, 3604900,4294967295 }, - { 8088, 13, 0, 23058852 }, - { 8088, 14, 23058852,4294967295 }, + { 5282, 16, 0, 5427960 }, + { 5282, 16, 5690040, 7272540 }, + { 5282, 9, 7317180,4294967295 }, + { 521, 14, 0, 2111460 }, + { 521, 13, 2111460, 2534820 }, + { 521, 14, 2534820,4294967295 }, + { 8088, 13, 0, 16213380 }, + { 8088, 14, 16213380,4294967295 }, { 5621, 26, 0,4294967295 }, { 4278, 37, 0,4294967295 }, { 7132, 143, 0,4294967295 }, { 3380, 16, 0,4294967295 }, { 5849, 26, 0,4294967295 }, { 8116, 39, 0,4294967295 }, - { 8131, 13, 0, 2490728 }, - { 8131, 14, 2490728, 3834156 }, - { 8131, 13, 3834156, 16456280 }, - { 8131, 14, 16456280, 17002796 }, - { 8131, 13, 17002796, 17205608 }, - { 8131, 14, 17205608, 20197676 }, - { 8131, 13, 20197676,4294967295 }, + { 8131, 13, 0, 1751400 }, + { 8131, 14, 1751400, 2695980 }, + { 8131, 13, 2695980, 11571000 }, + { 8131, 14, 11571000, 11955180 }, + { 8131, 13, 11955180, 12097800 }, + { 8131, 14, 12097800, 14201580 }, + { 8131, 13, 14201580,4294967295 }, { 1892, 12, 0,4294967295 }, { 5814, 26, 0,4294967295 }, { 5722, 26, 0,4294967295 }, { 8147, 13, 0,4294967295 }, { 2793, 16, 0, 480 }, { 2793, 123, 480,4294967295 }, - { 8165, 14, 0, 2486692 }, - { 8165, 13, 2486692,4294967295 }, - { 8183, 13, 0, 8958312 }, - { 8183, 14, 8958312, 9662764 }, - { 8183, 13, 9662764,4294967295 }, - { 8198, 16, 0, 34284120 }, - { 8198, 9, 34284120, 36534872 }, - { 8198, 16, 36534872, 36692568 }, - { 8198, 9, 36692568,4294967295 }, + { 8165, 14, 0, 1748580 }, + { 8165, 13, 1748580,4294967295 }, + { 8183, 13, 0, 6298920 }, + { 8183, 14, 6298920, 6794220 }, + { 8183, 13, 6794220,4294967295 }, + { 8198, 16, 0, 24106200 }, + { 8198, 9, 24106200, 25688760 }, + { 8198, 16, 25688760, 25799640 }, + { 8198, 9, 25799640,4294967295 }, { 2825, 13, 0,4294967295 }, - { 4293, 26, 0, 7727344 }, - { 4293, 146, 7727344,4294967295 }, + { 4293, 26, 0, 5433360 }, + { 4293, 146, 5433360,4294967295 }, { 8217, 26, 0,4294967295 }, { 8233, 13, 0,4294967295 }, { 4000, 177, 0,4294967295 }, { 5741, 26, 0,4294967295 }, { 5383, 14, 0,4294967295 }, { 3284, 14, 0,4294967295 }, - { 8251, 35, 0, 10343120 }, - { 8251, 9, 10406428,4294967295 }, + { 8251, 35, 0, 7272720 }, + { 8251, 9, 7317180,4294967295 }, { 1834, 134, 0,4294967295 }, - { 8264, 15, 0, 30556640 }, - { 8264, 13, 30556640,4294967295 }, - { 8292, 15, 0, 17066464 }, - { 8292, 13, 17066464,4294967295 }, - { 8320, 15, 0, 25295328 }, - { 8320, 13, 25295328,4294967295 }, - { 393, 81, 0, 40566844 }, - { 393, 78, 40566844,4294967295 }, - { 8351, 13, 0, 21137948 }, - { 8351, 15, 21137948, 39516640 }, - { 8351, 13, 39516640,4294967295 }, + { 8264, 15, 0, 21485280 }, + { 8264, 13, 21485280,4294967295 }, + { 8292, 15, 0, 12000000 }, + { 8292, 13, 12000000,4294967295 }, + { 8320, 15, 0, 17785920 }, + { 8320, 13, 17785920,4294967295 }, + { 393, 81, 0, 28523580 }, + { 393, 78, 28523580,4294967295 }, + { 8351, 13, 0, 14862780 }, + { 8351, 15, 14862780, 27785280 }, + { 8351, 13, 27785280,4294967295 }, { 5413, 14, 0,4294967295 }, - { 6106, 59, 0, 4401362 }, - { 6106, 162, 4401362,4294967295 }, + { 6106, 59, 0, 3094770 }, + { 6106, 162, 3094770,4294967295 }, { 3214, 15, 0,4294967295 }, { 3847, 14, 0,4294967295 }, { 5871, 26, 0,4294967295 }, { 8367, 12, 0,4294967295 }, { 5760, 26, 0,4294967295 }, - { 3932, 46, 0, 35100004 }, - { 8387, 13, 0, 23058852 }, - { 8387, 14, 23058852, 23374304 }, - { 8387, 13, 23374304,4294967295 }, + { 3932, 46, 0, 24680100 }, + { 8387, 13, 0, 16213380 }, + { 8387, 14, 16213380, 16435200 }, + { 8387, 13, 16435200,4294967295 }, { 8408, 39, 0,4294967295 }, { 1979, 13, 0,4294967295 }, - { 8423, 13, 0, 23058852 }, - { 8423, 14, 23058852, 23374304 }, - { 8423, 13, 23374304, 27546020 }, - { 8423, 14, 27546020, 27818464 }, - { 8423, 13, 27818464,4294967295 }, - { 695, 1, 0, 28782892 }, - { 695, 12, 28782892, 32807152 }, - { 695, 1, 32807152,4294967295 }, - { 8440, 12, 0, 28782832 }, - { 8440, 39, 28782832,4294967295 }, + { 8423, 13, 0, 16213380 }, + { 8423, 14, 16213380, 16435200 }, + { 8423, 13, 16435200, 19368420 }, + { 8423, 14, 19368420, 19560000 }, + { 8423, 13, 19560000,4294967295 }, + { 695, 1, 0, 20238060 }, + { 695, 12, 20238060, 23067600 }, + { 695, 1, 23067600,4294967295 }, + { 8440, 12, 0, 20238000 }, + { 8440, 39, 20238000,4294967295 }, { 2165, 46, 0,4294967295 }, - { 6044, 56, 0, 3604780 }, - { 6044, 26, 3604780, 23058792 }, - { 6044, 14, 23058792, 23130472 }, - { 6044, 26, 23130472,4294967295 }, + { 6044, 56, 0, 2534700 }, + { 6044, 26, 2534700, 16213320 }, + { 6044, 14, 16213320, 16263720 }, + { 6044, 26, 16263720,4294967295 }, { 1862, 39, 0,4294967295 }, - { 6862, 79, 0, 8407160 }, - { 6862, 80, 8407160, 40577084 }, - { 6862, 78, 40577084,4294967295 }, - { 8457, 16, 0, 10342940 }, - { 8457, 9, 10406428,4294967295 }, + { 6862, 79, 0, 5911320 }, + { 6862, 80, 5911320, 28530780 }, + { 6862, 78, 28530780,4294967295 }, + { 8457, 16, 0, 7272540 }, + { 8457, 9, 7317180,4294967295 }, { 8471, 26, 0,4294967295 }, { 2045, 131, 0,4294967295 }, { 5780, 26, 0,4294967295 }, { 5797, 26, 0,4294967295 }, { 855, 26, 0,4294967295 }, { 5830, 26, 0,4294967295 }, - { 8493, 15, 0, 1741340 }, - { 8493, 13, 1741340,4294967295 }, + { 8493, 15, 0, 1224540 }, + { 8493, 13, 1224540,4294967295 }, { 5363, 13, 0,4294967295 }, { 5673, 26, 0,4294967295 }, { 313, 16, 0,4294967295 }, { 608, 14, 0,4294967295 }, { 5605, 26, 0,4294967295 }, { 2077, 16, 0,4294967295 }, - { 2128, 16, 0, 38025636 }, - { 2128, 190, 38025636,4294967295 }, + { 2128, 16, 0, 26736900 }, + { 2128, 190, 26736900,4294967295 }, { 734, 13, 0,4294967295 }, - { 8515, 9, 10406428,4294967295 }, - { 5918, 30, 0, 29766712 }, - { 5918, 43, 29766712, 30049156 }, - { 5918, 30, 30049156, 31282232 }, - { 5918, 43, 31282232, 31521788 }, - { 5918, 30, 31521788, 35011520 }, - { 5918, 43, 35011520, 36045820 }, - { 5918, 30, 36045820, 36476080 }, - { 5918, 43, 36476080, 36805568 }, - { 5918, 30, 36805568, 37217396 }, - { 5918, 43, 37217396, 37536704 }, - { 5918, 30, 37536704, 37966785 }, - { 5918, 43, 37966785, 38296332 }, - { 5918, 30, 38296332, 38712257 }, - { 5918, 43, 38712257, 39041804 }, - { 5918, 30, 39041804, 39457729 }, - { 5918, 43, 39457729, 39781312 }, - { 5918, 30, 39781312,4294967295 }, + { 8515, 9, 7317180,4294967295 }, + { 5918, 30, 0, 20930040 }, + { 5918, 43, 20930040, 21128580 }, + { 5918, 30, 21128580, 21995640 }, + { 5918, 43, 21995640, 22164060 }, + { 5918, 30, 22164060, 24617760 }, + { 5918, 43, 24617760, 25345020 }, + { 5918, 30, 25345020, 25647600 }, + { 5918, 43, 25647600, 25879200 }, + { 5918, 30, 25879200, 26168820 }, + { 5918, 43, 26168820, 26393280 }, + { 5918, 30, 26393280, 26695681 }, + { 5918, 43, 26695681, 26927340 }, + { 5918, 30, 26927340, 27219841 }, + { 5918, 43, 27219841, 27451500 }, + { 5918, 30, 27451500, 27744001 }, + { 5918, 43, 27744001, 27971520 }, + { 5918, 30, 27971520,4294967295 }, { 6027, 55, 0,4294967295 }, { 6066, 57, 0,4294967295 }, { 8531, 29, 0,4294967295 }, { 7029, 122, 0,4294967295 }, { 7076, 130, 0,4294967295 }, - { 8552, 22, 0, 9222324 }, - { 8552, 46, 9222324, 35100004 }, + { 8552, 22, 0, 6484500 }, + { 8552, 46, 6484500, 24680100 }, { 7189, 152, 0,4294967295 }, { 7258, 164, 0,4294967295 }, { 8570, 76, 0,4294967295 }, { 7337, 184, 0,4294967295 }, { 1413, 63, 0,4294967295 }, { 5487, 21, 0,4294967295 }, - { 5297, 11, 0, 26053808 }, - { 5297, 101, 26053808, 40514616 }, - { 5297, 102, 40514616,4294967295 }, - { 3870, 64, 0, 39511336 }, - { 5428, 17, 0, 30096200 }, - { 5428, 115, 30096200, 33522504 }, - { 5428, 17, 33522504,4294967295 }, - { 5440, 158, 0, 16422004 }, - { 5440, 19, 16422004, 26053928 }, - { 5440, 102, 26053928,4294967295 }, - { 5270, 8, 0, 16422004 }, - { 5270, 20, 16422004, 26053868 }, - { 5270, 102, 26053868,4294967295 }, - { 964, 25, 0, 16319664 }, - { 964, 174, 16319664,4294967295 }, - { 8587, 102, 26053928,4294967295 }, + { 5297, 11, 0, 18319440 }, + { 5297, 101, 18319440, 28487160 }, + { 5297, 102, 28487160,4294967295 }, + { 3870, 64, 0, 27781800 }, + { 5428, 17, 0, 21161640 }, + { 5428, 115, 21161640, 23570760 }, + { 5428, 17, 23570760,4294967295 }, + { 5440, 158, 0, 11547060 }, + { 5440, 19, 11547060, 18319560 }, + { 5440, 102, 18319560,4294967295 }, + { 5270, 8, 0, 11547060 }, + { 5270, 20, 11547060, 18319500 }, + { 5270, 102, 18319500,4294967295 }, + { 964, 25, 0, 11475120 }, + { 964, 174, 11475120,4294967295 }, + { 8587, 102, 18319560,4294967295 }, { 3509, 21, 0,4294967295 }, - { 5451, 83, 0, 1805488 }, - { 5451, 21, 1805488,4294967295 }, - { 3555, 33, 0, 16200880 }, - { 3555, 31, 16200880,4294967295 }, + { 5451, 83, 0, 1269840 }, + { 5451, 21, 1269840,4294967295 }, + { 3555, 33, 0, 11391600 }, + { 3555, 31, 11391600,4294967295 }, { 4368, 90, 0,4294967295 }, { 3988, 64, 0,4294967295 }, - { 3680, 71, 0, 16202928 }, - { 3680, 109, 16202928,4294967295 }, + { 3680, 71, 0, 11393040 }, + { 3680, 109, 11393040,4294967295 }, { 5906, 41, 0,4294967295 }, - { 4503, 187, 0, 33522624 }, - { 4503, 96, 33522624, 34583608 }, - { 4503, 187, 34583608,4294967295 }, - { 5963, 124, 0, 9907136 }, - { 5963, 48, 9907136, 28607364 }, - { 5963, 124, 28607364,4294967295 }, - { 4413, 88, 0, 19743830 }, - { 4413, 110, 19743830, 27141206 }, - { 4413, 88, 27141206,4294967295 }, - { 4442, 64, 0, 39511276 }, - { 1060, 54, 0, 918584 }, - { 1060, 34, 918584,4294967295 }, - { 6125, 60, 0, 4737924 }, - { 6125, 91, 4737924, 22971328 }, - { 6125, 60, 22971328,4294967295 }, + { 4503, 187, 0, 23570880 }, + { 4503, 96, 23570880, 24316920 }, + { 4503, 187, 24316920,4294967295 }, + { 5963, 124, 0, 6966240 }, + { 5963, 48, 6966240, 20114820 }, + { 5963, 124, 20114820,4294967295 }, + { 4413, 88, 0, 13882710 }, + { 4413, 110, 13882710, 19083990 }, + { 4413, 88, 19083990,4294967295 }, + { 4442, 64, 0, 27781740 }, + { 1060, 54, 0, 646200 }, + { 1060, 34, 646200,4294967295 }, + { 6125, 60, 0, 3331620 }, + { 6125, 91, 3331620, 16152000 }, + { 6125, 60, 16152000,4294967295 }, { 3498, 83, 0,4294967295 }, - { 6092, 58, 0, 16221420 }, - { 6092, 167, 16221420,4294967295 }, - { 8599, 64, 0, 34921708 }, - { 8614, 97, 0, 19447080 }, - { 8614, 64, 19447080,4294967295 }, - { 4697, 97, 0, 19447080 }, - { 4697, 64, 19447080,4294967295 }, - { 1226, 90, 4072384,4294967295 }, + { 6092, 58, 0, 11406060 }, + { 6092, 167, 11406060,4294967295 }, + { 8599, 64, 0, 24554700 }, + { 8614, 97, 0, 13674120 }, + { 8614, 64, 13674120,4294967295 }, + { 4697, 97, 0, 13674120 }, + { 4697, 64, 13674120,4294967295 }, + { 1226, 90, 2863680,4294967295 }, { 2591, 86, 0,4294967295 }, { 4673, 87, 0,4294967295 }, { 4086, 96, 0,4294967295 }, @@ -1608,83 +1608,83 @@ static constexpr ZoneMetaHistory zoneHistoryTable[] = { { 1257, 97, 0,4294967295 }, { 3462, 2, 0,4294967295 }, { 4218, 99, 0,4294967295 }, - { 4141, 100, 0, 918644 }, - { 4141, 139, 918644,4294967295 }, + { 4141, 100, 0, 646260 }, + { 4141, 139, 646260,4294967295 }, { 1152, 128, 0,4294967295 }, - { 8624, 187, 0, 25430916 }, - { 8624, 182, 25430916, 31189772 }, - { 8624, 187, 31189772,4294967295 }, + { 8624, 187, 0, 17881380 }, + { 8624, 182, 17881380, 21930540 }, + { 8624, 187, 21930540,4294967295 }, { 992, 88, 0,4294967295 }, { 4099, 106, 0,4294967295 }, - { 4761, 116, 0, 8975326 }, - { 4761, 117, 8975326,4294967295 }, - { 5893, 38, 0, 8975296 }, - { 5893, 117, 8975296,4294967295 }, + { 4761, 116, 0, 6311070 }, + { 4761, 117, 6311070,4294967295 }, + { 5893, 38, 0, 6311040 }, + { 5893, 117, 6311040,4294967295 }, { 5464, 21, 0,4294967295 }, - { 1178, 114, 0, 22414272 }, - { 1178, 47, 22414272,4294967295 }, + { 1178, 114, 0, 15760320 }, + { 1178, 47, 15760320,4294967295 }, { 3919, 115, 0,4294967295 }, { 1316, 91, 0,4294967295 }, { 7145, 144, 0,4294967295 }, { 6883, 83, 0,4294967295 }, { 2446, 64, 0,4294967295 }, - { 8638, 106, 0, 30096500 }, - { 8638, 136, 30096500, 33522804 }, - { 8638, 106, 33522804,4294967295 }, + { 8638, 106, 0, 21161940 }, + { 8638, 136, 21161940, 23571060 }, + { 8638, 106, 23571060,4294967295 }, { 4037, 136, 0,4294967295 }, { 4131, 137, 0,4294967295 }, - { 7108, 176, 0, 16422064 }, - { 7108, 138, 16422064, 26053928 }, - { 7108, 102, 26053928,4294967295 }, + { 7108, 176, 0, 11547120 }, + { 7108, 138, 11547120, 18319560 }, + { 7108, 102, 18319560,4294967295 }, { 6924, 90, 0,4294967295 }, - { 8656, 91, 0, 13462464 }, - { 8656, 93, 13462464,4294967295 }, - { 4116, 104, 0, 34122628 }, - { 4116, 149, 34122628, 36158340 }, - { 4116, 104, 36158340,4294967295 }, - { 5476, 83, 0, 1805488 }, - { 5476, 21, 1805488,4294967295 }, - { 8671, 101, 26053868, 40514616 }, - { 8671, 102, 40514616,4294967295 }, - { 4171, 103, 0, 16422004 }, - { 4171, 150, 16422004, 26053868 }, - { 4171, 101, 26053868, 36629560 }, - { 4171, 102, 36629560,4294967295 }, + { 8656, 91, 0, 9466080 }, + { 8656, 93, 9466080,4294967295 }, + { 4116, 104, 0, 23992740 }, + { 4116, 149, 23992740, 25424100 }, + { 4116, 104, 25424100,4294967295 }, + { 5476, 83, 0, 1269840 }, + { 5476, 21, 1269840,4294967295 }, + { 8671, 101, 18319500, 28487160 }, + { 8671, 102, 28487160,4294967295 }, + { 4171, 103, 0, 11547060 }, + { 4171, 150, 11547060, 18319500 }, + { 4171, 101, 18319500, 25755480 }, + { 4171, 102, 25755480,4294967295 }, { 3486, 21, 0,4294967295 }, { 4310, 153, 0,4294967295 }, - { 7208, 155, 0, 8787000 }, - { 7208, 168, 8787000, 9159736 }, - { 7208, 155, 9159736, 16204856 }, - { 7208, 179, 16204856,4294967295 }, + { 7208, 155, 0, 6178680 }, + { 7208, 168, 6178680, 6440760 }, + { 7208, 155, 6440760, 11394360 }, + { 7208, 179, 11394360,4294967295 }, { 3116, 104, 0,4294967295 }, { 1020, 47, 0,4294967295 }, { 3137, 159, 0,4294967295 }, - { 4199, 115, 0, 33522504 }, + { 4199, 115, 0, 23570760 }, { 3100, 166, 0,4294967295 }, - { 4683, 168, 0, 16204856 }, - { 4683, 179, 16204856,4294967295 }, - { 3817, 169, 0, 15908016 }, - { 3817, 74, 15908016,4294967295 }, + { 4683, 168, 0, 11394360 }, + { 4683, 179, 11394360,4294967295 }, + { 3817, 169, 0, 11185680 }, + { 3817, 74, 11185680,4294967295 }, { 2638, 94, 0,4294967295 }, - { 1284, 88, 0, 13274198 }, - { 1284, 36, 13274198,4294967295 }, + { 1284, 88, 0, 9333750 }, + { 1284, 36, 9333750,4294967295 }, { 2687, 98, 0,4294967295 }, { 1346, 124, 0,4294967295 }, { 1126, 178, 0,4294967295 }, - { 8685, 187, 0, 8412036 }, - { 8685, 115, 8412036, 31189712 }, - { 8685, 182, 31189712,4294967295 }, + { 8685, 187, 0, 5914980 }, + { 8685, 115, 5914980, 21930480 }, + { 8685, 182, 21930480,4294967295 }, { 6940, 90, 0,4294967295 }, { 4612, 182, 0,4294967295 }, { 4730, 187, 0,4294967295 }, { 1202, 126, 0,4294967295 }, - { 3785, 163, 0, 16491816 }, - { 3785, 188, 16491816,4294967295 }, - { 3649, 189, 0, 16250032 }, - { 3649, 24, 16250032,4294967295 }, - { 3565, 32, 0, 17008760 }, - { 3565, 66, 17008760, 17381436 }, - { 3565, 32, 17381436,4294967295 }, + { 3785, 163, 0, 11596200 }, + { 3785, 188, 11596200,4294967295 }, + { 3649, 189, 0, 11426160 }, + { 3649, 24, 11426160,4294967295 }, + { 3565, 32, 0, 11959320 }, + { 3565, 66, 11959320, 12221340 }, + { 3565, 32, 12221340,4294967295 }, { 5588, 26, 0,4294967295 }, { 6591, 66, 0,4294967295 }, { 3629, 42, 0,4294967295 }, @@ -1701,8 +1701,8 @@ static constexpr ZoneMetaHistory zoneHistoryTable[] = { { 3539, 28, 0,4294967295 }, { 1500, 29, 0,4294967295 }, { 8716, 29, 0,4294967295 }, - { 1531, 29, 0, 8348488 }, - { 1531, 113, 8348488,4294967295 }, + { 1531, 29, 0, 5870280 }, + { 1531, 113, 5870280,4294967295 }, { 1711, 29, 0,4294967295 }, { 1746, 30, 0,4294967295 }, { 1447, 29, 0,4294967295 }, @@ -1711,7 +1711,7 @@ static constexpr ZoneMetaHistory zoneHistoryTable[] = { { 2298, 76, 0,4294967295 }, { 6390, 63, 0,4294967295 }, { 6149, 63, 0,4294967295 }, - { 3522, 125, 16635176, 34583908 }, + { 3522, 125, 11697000, 24317220 }, { 6577, 64, 0,4294967295 }, { 6285, 63, 0,4294967295 }, { 4659, 63, 0,4294967295 }, @@ -1720,81 +1720,81 @@ static constexpr ZoneMetaHistory zoneHistoryTable[] = { { 3830, 64, 0,4294967295 }, { 3708, 63, 0,4294967295 }, { 8751, 63, 0,4294967295 }, - { 2475, 125, 0, 15215852 }, - { 2475, 64, 15215852,4294967295 }, + { 2475, 125, 0, 10699020 }, + { 2475, 64, 10699020,4294967295 }, { 6238, 63, 0,4294967295 }, - { 2274, 95, 0, 1368184 }, - { 2274, 76, 1368184,4294967295 }, + { 2274, 95, 0, 962040 }, + { 2274, 76, 962040,4294967295 }, { 6256, 63, 0,4294967295 }, - { 8767, 40, 0, 1368184 }, - { 8767, 76, 1368184,4294967295 }, + { 8767, 40, 0, 962040 }, + { 8767, 76, 962040,4294967295 }, { 6561, 64, 0,4294967295 }, - { 8783, 40, 0, 1368184 }, - { 8783, 76, 1368184,4294967295 }, - { 1097, 64, 0, 6350060 }, - { 1097, 173, 6350060, 11443436 }, - { 1097, 64, 11443436, 34919660 }, - { 1097, 173, 34919660,4294967295 }, - { 8802, 40, 0, 1368184 }, - { 8802, 76, 1368184,4294967295 }, - { 3881, 125, 0, 14384484 }, - { 3881, 64, 14384484, 30842880 }, - { 3881, 65, 30842880, 33523044 }, - { 3881, 64, 33523044,4294967295 }, - { 2419, 125, 0, 15330600 }, - { 2419, 64, 15330600,4294967295 }, - { 3082, 63, 0, 5038080 }, - { 3082, 66, 5038080, 17008700 }, - { 3082, 63, 17008700, 19632188 }, - { 3082, 66, 19632188,4294967295 }, + { 8783, 40, 0, 962040 }, + { 8783, 76, 962040,4294967295 }, + { 1097, 64, 0, 4465260 }, + { 1097, 173, 4465260, 8046540 }, + { 1097, 64, 8046540, 24553260 }, + { 1097, 173, 24553260,4294967295 }, + { 8802, 40, 0, 962040 }, + { 8802, 76, 962040,4294967295 }, + { 3881, 125, 0, 10114500 }, + { 3881, 64, 10114500, 21686400 }, + { 3881, 65, 21686400, 23571300 }, + { 3881, 64, 23571300,4294967295 }, + { 2419, 125, 0, 10779720 }, + { 2419, 64, 10779720,4294967295 }, + { 3082, 63, 0, 3542400 }, + { 3082, 66, 3542400, 11959260 }, + { 3082, 63, 11959260, 13803900 }, + { 3082, 66, 13803900,4294967295 }, { 6455, 63, 0,4294967295 }, - { 2393, 40, 0, 1368184 }, - { 2393, 76, 1368184,4294967295 }, + { 2393, 40, 0, 962040 }, + { 2393, 76, 962040,4294967295 }, { 6314, 63, 0,4294967295 }, { 4794, 63, 0,4294967295 }, { 6346, 63, 0,4294967295 }, { 6531, 64, 0,4294967295 }, - { 3595, 125, 0, 15889764 }, - { 3595, 64, 15889764, 30842880 }, - { 3595, 65, 30842880, 33525032 }, - { 3595, 125, 33525032,4294967295 }, + { 3595, 125, 0, 11172900 }, + { 3595, 64, 11172900, 21686400 }, + { 3595, 65, 21686400, 23572680 }, + { 3595, 125, 23572680,4294967295 }, { 6359, 63, 0,4294967295 }, - { 3443, 125, 0, 15889764 }, - { 3443, 64, 15889764, 16492544 }, - { 3443, 125, 16492544,4294967295 }, + { 3443, 125, 0, 11172900 }, + { 3443, 64, 11172900, 11596320 }, + { 3443, 125, 11596320,4294967295 }, { 6407, 63, 0,4294967295 }, { 4186, 63, 0,4294967295 }, { 6373, 63, 0,4294967295 }, { 6224, 63, 0,4294967295 }, - { 8816, 125, 0, 14384484 }, - { 8816, 64, 14384484,4294967295 }, + { 8816, 125, 0, 10114500 }, + { 8816, 64, 10114500,4294967295 }, { 6273, 63, 0,4294967295 }, - { 4233, 107, 0, 14384424 }, - { 4233, 125, 14384424, 15889764 }, - { 4233, 64, 15889764, 16263168 }, - { 4233, 154, 16263168,4294967295 }, + { 4233, 107, 0, 10114440 }, + { 4233, 125, 10114440, 11172900 }, + { 4233, 64, 11172900, 11435040 }, + { 4233, 154, 11435040,4294967295 }, { 6419, 63, 0,4294967295 }, { 6194, 63, 0,4294967295 }, - { 4353, 125, 16635176, 35100004 }, - { 8828, 125, 0, 15330660 }, - { 8828, 64, 15330660, 18197740 }, - { 8828, 125, 18197740, 20377660 }, - { 8828, 64, 20377660, 33093632 }, - { 8828, 125, 33093632,4294967295 }, + { 4353, 125, 11697000, 24680100 }, + { 8828, 125, 0, 10779780 }, + { 8828, 64, 10779780, 12795660 }, + { 8828, 125, 12795660, 14328060 }, + { 8828, 64, 14328060, 23268960 }, + { 8828, 125, 23268960,4294967295 }, { 6332, 63, 0,4294967295 }, { 6548, 64, 0,4294967295 }, { 6472, 63, 0,4294967295 }, - { 8846, 125, 0, 14384484 }, - { 8846, 64, 14384484,4294967295 }, + { 8846, 125, 0, 10114500 }, + { 8846, 64, 10114500,4294967295 }, { 6135, 63, 0,4294967295 }, - { 8861, 125, 16492544, 34583908 }, + { 8861, 125, 11596320, 24317220 }, { 6301, 63, 0,4294967295 }, { 6516, 63, 0,4294967295 }, { 6164, 63, 0,4294967295 }, - { 8878, 125, 0, 14384484 }, - { 8878, 64, 14384484, 21123132 }, - { 8878, 63, 21123132, 22313020 }, - { 8878, 64, 22313020,4294967295 }, + { 8878, 125, 0, 10114500 }, + { 8878, 64, 10114500, 14852220 }, + { 8878, 63, 14852220, 15688860 }, + { 8878, 64, 15688860,4294967295 }, { 4629, 183, 0,4294967295 }, { 3059, 63, 0,4294967295 }, { 6210, 63, 0,4294967295 }, @@ -1814,7 +1814,7 @@ static constexpr ZoneMetaHistory zoneHistoryTable[] = { { 8901, 16, 0,4294967295 }, { 4324, 18, 0,4294967295 }, { 932, 130, 0,4294967295 }, - { 3608, 141, 0, 33651648 }, + { 3608, 141, 0, 23661600 }, { 2856, 45, 0,4294967295 }, { 3026, 172, 0,4294967295 }, { 2201, 61, 0,4294967295 }, @@ -1822,36 +1822,36 @@ static constexpr ZoneMetaHistory zoneHistoryTable[] = { { 7290, 170, 0,4294967295 }, { 3804, 68, 0,4294967295 }, { 7306, 175, 0,4294967295 }, - { 6641, 62, 0, 11968812 }, - { 6641, 72, 11968812,4294967295 }, + { 6641, 62, 0, 8415660 }, + { 6641, 72, 8415660,4294967295 }, { 6659, 73, 0,4294967295 }, { 3724, 160, 0,4294967295 }, - { 5935, 82, 0, 23169864 }, - { 5935, 44, 23169864,4294967295 }, - { 2933, 10, 0, 10343060 }, - { 2933, 85, 10343060,4294967295 }, + { 5935, 82, 0, 16291560 }, + { 5935, 44, 16291560,4294967295 }, + { 2933, 10, 0, 7272660 }, + { 2933, 85, 7272660,4294967295 }, { 2901, 145, 0,4294967295 }, { 3900, 112, 0,4294967295 }, { 6982, 105, 0,4294967295 }, - { 2708, 108, 0, 17681104 }, - { 2708, 120, 17681104,4294967295 }, + { 2708, 108, 0, 12432240 }, + { 2708, 120, 12432240,4294967295 }, { 4779, 120, 0,4294967295 }, { 3953, 119, 0,4294967295 }, - { 8909, 35, 0, 10343120 }, - { 8909, 156, 10343120,4294967295 }, + { 8909, 35, 0, 7272720 }, + { 8909, 156, 7272720,4294967295 }, { 7047, 127, 0,4294967295 }, { 7095, 132, 0,4294967295 }, { 4070, 133, 0,4294967295 }, { 7061, 129, 0,4294967295 }, - { 2995, 35, 0, 10343120 }, - { 2995, 156, 10343120,4294967295 }, + { 2995, 35, 0, 7272720 }, + { 2995, 156, 7272720,4294967295 }, { 7118, 140, 0,4294967295 }, { 7157, 147, 0,4294967295 }, { 2965, 148, 0,4294967295 }, { 4709, 141, 0,4294967295 }, { 6009, 52, 0,4294967295 }, - { 5948, 135, 0, 23169864 }, - { 5948, 44, 23169864,4294967295 }, + { 5948, 135, 0, 16291560 }, + { 5948, 44, 16291560,4294967295 }, { 7275, 165, 0,4294967295 }, { 6675, 75, 0,4294967295 }, { 4485, 171, 0,4294967295 }, @@ -3104,7 +3104,8 @@ static constexpr char ianaIdData[] = { 0x6f, 0x70, 0x65, 0x2f, 0x55, 0x6c, 0x79, 0x61, 0x6e, 0x6f, 0x76, 0x73, 0x6b, 0x0, 0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f, 0x56, 0x69, 0x6c, 0x6e, 0x69, 0x75, 0x73, 0x0, 0x4d, 0x53, 0x54, 0x37, 0x4d, 0x44, 0x54, 0x0, 0x50, 0x53, 0x54, 0x38, 0x50, 0x44, 0x54, 0x0, 0x50, 0x61, 0x63, -0x69, 0x66, 0x69, 0x63, 0x2f, 0x4d, 0x69, 0x64, 0x77, 0x61, 0x79, 0x0 +0x69, 0x66, 0x69, 0x63, 0x2f, 0x4d, 0x69, 0x64, 0x77, 0x61, 0x79, 0x0, 0x45, 0x75, 0x72, 0x6f, +0x70, 0x65, 0x2f, 0x4b, 0x69, 0x72, 0x6f, 0x76, 0x0 }; #if QT_CONFIG(timezone_locale) && !QT_CONFIG(icu) diff --git a/src/corelib/time/qtimezoneprivate_p.h b/src/corelib/time/qtimezoneprivate_p.h index c814123b7b2..8d1216769df 100644 --- a/src/corelib/time/qtimezoneprivate_p.h +++ b/src/corelib/time/qtimezoneprivate_p.h @@ -153,8 +153,8 @@ public: return QByteArrayLiteral("UTC"); } +protected: #if QT_CONFIG(timezone_locale) -private: // Defined in qtimezonelocale.cpp QString localeName(qint64 atMSecsSinceEpoch, int offsetFromUtc, QTimeZone::TimeType timeType, @@ -162,7 +162,6 @@ private: const QLocale &locale) const; #endif // L10n helpers. -protected: QByteArray m_id; }; Q_DECLARE_TYPEINFO(QTimeZonePrivate::Data, Q_RELOCATABLE_TYPE); diff --git a/util/locale_database/qlocalexml2cpp.py b/util/locale_database/qlocalexml2cpp.py index 2de74c83378..b448538539b 100755 --- a/util/locale_database/qlocalexml2cpp.py +++ b/util/locale_database/qlocalexml2cpp.py @@ -69,11 +69,16 @@ class ByteArrayData: def __init__(self): self.data, self.hash = [], {} - def append(self, s): + def lookup(self, s): + return self.append(s, False) + + def append(self, s, create = True): assert s.isascii(), s s += '\0' if s in self.hash: return self.hash[s] + if not create: + raise Error(f'Entry "{s[:-1]}" missing from reused table !') index = len(self.data) if index > 0xffff: @@ -98,6 +103,8 @@ class StringDataToken: self.index = index self.length = length +# Would tables benefit from pre-population, one script at a time ? +# That might improve the chances of match-ups in store. class StringData: def __init__(self, name, lenbits = 8, indbits = 16): self.data = [] @@ -106,6 +113,9 @@ class StringData: self.text = '' # Used in quick-search for matches in data self.__bits = lenbits, indbits + def end(self): + return StringDataToken(len(self.data), 0, *self.__bits) + def append(self, s): try: token = self.hash[s] @@ -114,6 +124,8 @@ class StringData: self.hash[s] = token return token + # The longMetaZoneName table grows to c. 0xe061c bytes, making the + # searching here rather expensive. def __store(self, s): """Add string s to known data. @@ -304,6 +316,29 @@ class TimeZoneDataWriter (LocaleSourceEditor): f' // {name} / {land}\n') out('};\n') + def nameTables(self, locales): + """Ensure all zone and metazone names used by locales are known + + Must call before writeTables(), to ensure zone and metazone naming + include all entries, rather than only those implicated in the + locale-independent data. Returns the ByteArrayData() objects for IANA + ID and metazone names, whose lookup() can be used to map names to table + indices when writing the locale-dependent data. + + Because the locale-dependent additions made here happen after the + carefully ordered entries from the locale-independent data (generated + along with their sorted tables), the added entries don't follow the + same sort-order. Fortunately LocaleZoneDataWriter's tables sorted by + metaIdKey are OK with using the key regardless of the lexical ordering + of the IDs, and the IANA-sorted things can be sorted on the actual IANA + ID, rather than index in the (now haphazardly sorted) table.""" + for locale in locales: + for k in locale.zoneNaming.keys(): + self.__ianaTable.append(k) + for k in locale.metaNaming.keys(): + self.__metaIdData.append(k) + return self.__ianaTable, self.__metaIdData + def writeTables(self): self.__windowsTable.write(self.writer.write, 'windowsIdData') self.__ianaListTable.write(self.writer.write, 'ianaListData') @@ -331,6 +366,227 @@ class TimeZoneDataWriter (LocaleSourceEditor): hour, mins = int(utcName[4:6]), int(utcName[-2:]) return sign * (hour * 60 + mins) * 60 + +class LocaleZoneDataWriter (LocaleSourceEditor): + def __init__(self, path: Path, temp: Path, version: str, + ianaNames: ByteArrayData, metaNames: ByteArrayData): + super().__init__(path, temp, version) + self.__iana, self.__meta = ianaNames, metaNames + self.__hourFormatTable = StringData('hourFormatTable') # "±HH:mm" Some have single H. + self.__gmtFormatTable = StringData('gmtFormatTable') # "GMT%0" + # Could be split in three - generic, standard, daylight-saving - if too big: + self.__regionFormatTable = StringData('regionFormatTable') # "%0 (Summer|Standard)? Time" + self.__fallbackFormatTable = StringData('fallbackFormatTable') + self.__exemplarCityTable = StringData('exemplarCityTable', indbits = 32) + self.__shortZoneNameTable = StringData('shortZoneNameTable') + self.__longZoneNameTable = StringData('longZoneNameTable') + self.__shortMetaZoneNameTable = StringData('shortMetaZoneNameTable') + # Would splitting this table up by (gen, std, dst) miss + # chances to avoid duplication ? It should speed append(). + self.__longMetaZoneNameTable = StringData('longMetaZoneNameTable', indbits = 32) + + def localeData(self, locales, names): + out = self.writer.write + + out('// Sorted by locale index, then iana name\n') + out('static constexpr LocaleZoneExemplar localeZoneExemplarTable[] = {\n') + out(' // locInd, ianaInd, xcty{ind, sz}\n') + store = self.__exemplarCityTable.append + formatLine = ''.join(( + ' {{ ', + '{:4d},{:5d},', # Sort keys + '{:8d},{:3d},', # Index and size + ' }}')).format + index = 0 + for locInd, key in enumerate(names): + locale = locales[key] + locale.exemplarStart = index + for name, data in sorted(locale.zoneNaming.items()): + eg = store(data.get('exemplarCity', '')) + if not eg.length: + continue # No exemplar city given, skip this row. + out(formatLine(locInd, self.__iana.lookup(name), eg.index, eg.length) + + (f', // {name} {locale.language}/{locale.script}/{locale.territory}\n' + if index == locale.exemplarStart else f', // {name}\n') + ) + index += 1 + out('}; // Exemplar city table\n') + if index >= (1 << 32): + raise Error(f'Exemplar table has too many ({index}) entries') + exemplarRowCount = index + + out('\n// Sorted by locale index, then iana name\n') + out('static constexpr LocaleZoneNames localeZoneNameTable[] = {\n') + out(' // locInd, ianaInd, (lngGen, lngStd, lngDst,' + ' srtGen, srtStd, srtDst){ind, sz}\n') + longStore = self.__longZoneNameTable.append + shortStore = self.__shortZoneNameTable.append + formatLine = ''.join(( + ' {{ ', + '{:4d},{:5d},', # Sort keys + '{:8d},' * 3, '{:5d},' * 3, # Range starts + '{:3d},' * 6, # Range sizes + ' }}')).format + index = 0 + for locInd, key in enumerate(names): + locale = locales[key] + locale.zoneStart = index + for name, data in sorted(locale.zoneNaming.items()): + ranges = ( tuple(longStore(z) + for z in data.get('long', ('', '', ''))) + + tuple(shortStore(z) + for z in data.get('short', ('', '', ''))) + ) # 6 entries; 3 32-bit, 3 16-bit + if not any(r.length for r in ranges): + continue # No names given, don't generate a row + out(formatLine(*((locInd, self.__iana.lookup(name)) + + tuple(r.index for r in ranges) + + tuple(r.length for r in ranges) + )) + + (f', // {name} {locale.language}/{locale.script}/{locale.territory}\n' + if index == locale.zoneStart else f', // {name}\n') + ) + index += 1 + out('}; // Zone naming table\n') + if index >= (1 << 16): + raise Error(f'Zone naming table has too many ({index}) entries') + localeNameCount = index + + # Only a small proportion (about 1 in 18) of metazones have short + # names, so splitting their names across two tables keeps the (many) + # rows of the long name table short, making the duplication of sort + # keys in the (much smaller) short name table still work out as a + # saving. + + out('\n// Sorted by locale index, then meta key\n') + out('static constexpr LocaleMetaZoneLongNames localeMetaZoneLongNameTable[] = {\n') + out(' // locInd, metaKey, (generic, standard, DST){ind, sz}\n') + store = self.__longMetaZoneNameTable.append + formatLine = ''.join(( + ' {{ ', + '{:4d},{:5d},', # Sort keys + '{:8d},' * 3, # Range starts + '{:3d},' * 3, # Range sizes + ' }}')).format + index = 0 + for locInd, key in enumerate(names): + locale = locales[key] + locale.metaZoneLongStart = index + # Map metazone names to indices in metazone table: + for key, meta, data in sorted( + (self.__meta.lookup(k), k, v) + for k, v in locale.metaNaming.items()): + ranges = tuple(store(z) + for z in data.get('long', ('', '', '')) + ) # 3 entries, all 32-bit + if not any(r.length for r in ranges): + continue # No names given, don't generate a row + out(formatLine(*((locInd, key) + + tuple(r.index for r in ranges) + + tuple(r.length for r in ranges) + )) + + (f', // {meta} {locale.language}/{locale.script}/{locale.territory}\n' + if index == locale.metaZoneLongStart else f', // {meta}\n') + ) + index += 1 + out('}; // Metazone long name table\n') + if index >= (1 << 32): + raise Error(f'Metazone long name table has too many ({index}) entries') + metaLongCount = index + + out('\n// Sorted by locale index, then meta key\n') + out('static constexpr LocaleMetaZoneShortNames localeMetaZoneShortNameTable[] = {\n') + out(' // locInd, metaKey, (generic, standard, DST){ind, sz}\n') + store = self.__shortMetaZoneNameTable.append + formatLine = ''.join(( + ' {{ ', + '{:4d},{:5d},', # Sort keys + '{:5d},' * 3, # Range starts + '{:3d},' * 3, # Range sizes + ' }}')).format + index = 0 + for locInd, key in enumerate(names): + locale = locales[key] + locale.metaZoneShortStart = index + # Map metazone names to indices in metazone table: + for key, meta, data in sorted( + (self.__meta.lookup(k), k, v) + for k, v in locale.metaNaming.items()): + ranges = tuple(store(z) + for z in data.get('short', ('', '', '')) + ) # 3 entries, all 16-bit + if not any(r.length for r in ranges): + continue # No names given, don't generate a row + out(formatLine(*((locInd, key) + + tuple(r.index for r in ranges) + + tuple(r.length for r in ranges) + )) + + (f', // {meta} {locale.language}/{locale.script}/{locale.territory}\n' + if index == locale.metaZoneShortStart else f', // {meta}\n') + ) + index += 1 + out('}; // Metazone short name table\n') + if index >= (1 << 16): + raise Error(f'Metazone short name table has too many ({index}) entries') + metaShortCount = index + + out('\n// Indexing matches that of locale_data in qlocale_data_p.h\n') + out('static constexpr LocaleZoneData localeZoneData[] = {\n') + out(' // LOCALE_TAGS(lng,scp,ter) xct1st, zn1st, ml1st, ms1st, ' + '(+hr, -hr, gmt, flbk, rgen, rstd, rdst){ind,sz}\n') + hour = self.__hourFormatTable + gmt = self.__gmtFormatTable + region = self.__regionFormatTable + fall = self.__fallbackFormatTable + formatLine = ''.join(( + ' {{ ', + 'LOCALE_TAGS({:3d},{:3d},{:3d})', # key: language, script, territory + '{:6d},' * 4, # exemplarStart, metaZone{Long,Short}Start, zoneStart + '{:5d},' * 7, # Range starts + '{:3d},' * 7, # Range sizes + ' }}')).format + for key in names: + locale = locales[key] + ranges = ( + (hour.append(locale.positiveOffsetFormat), + hour.append(locale.negativeOffsetFormat), + gmt.append(locale.gmtOffsetFormat), + fall.append(locale.fallbackZoneFormat)) + + tuple(region.append(r) for r in locale.regionFormats) + ) # 7 entries + out(formatLine(*( + key + + (locale.exemplarStart, locale.metaZoneLongStart, + locale.metaZoneShortStart, locale.zoneStart) + + tuple(r.index for r in ranges) + + tuple(r.length for r in ranges) + )) + + f', // {locale.language}/{locale.script}/{locale.territory}\n') + ranges = 2 * (hour.end(),) + ( + gmt.end(), fall.end()) + 3 * (region.end(),) + out(formatLine(*( + (0, 0, 0, exemplarRowCount, metaLongCount, + metaShortCount, localeNameCount) + + tuple(r.index for r in ranges) + + tuple(r.length for r in ranges) + )) + + ' // Terminal row\n') + out('}; // Locale/zone data\n') + + def writeTables(self): + for data in (self.__hourFormatTable, + self.__gmtFormatTable, + self.__regionFormatTable, + self.__fallbackFormatTable, + self.__exemplarCityTable, + self.__shortZoneNameTable, + self.__longZoneNameTable, + self.__shortMetaZoneNameTable, + self.__longMetaZoneNameTable): + data.write(self.writer) + self.writer.write('\n') + + class LocaleDataWriter (LocaleSourceEditor): def likelySubtags(self, likely): # Sort order of likely is taken care of upstream. @@ -831,6 +1087,7 @@ def main(argv, out, err): writer.territoryZone(reader.territoryZone()) writer.metaLandZone(reader.metaLandZone()) writer.zoneMetaStory(reader.zoneMetaStory()) + ianaNames, metaNames = writer.nameTables(locale_map.values()) writer.writeTables() except Exception as e: err.write(f'\nError updating qtimezoneprivate_data_p.h: {e}\n') @@ -838,6 +1095,19 @@ def main(argv, out, err): raise return 1 + # Locale-dependent timezone data + try: + with LocaleZoneDataWriter( + qtsrcdir.joinpath('src/corelib/time/qtimezonelocale_data_p.h'), + qtsrcdir, reader.cldrVersion, ianaNames, metaNames) as writer: + writer.localeData(locale_map, locale_keys) + writer.writeTables() + except Exception as e: + err.write(f'\nError updating qtimezonelocale_data_p.h: {e}\n') + if args.verbose > 0: + raise + return 1 + # ./testlocales/localemodel.cpp try: path = 'util/locale_database/testlocales/localemodel.cpp'