summaryrefslogtreecommitdiffstats
path: root/src/corelib/tools
diff options
context:
space:
mode:
Diffstat (limited to 'src/corelib/tools')
-rw-r--r--src/corelib/tools/UNICODE_LICENSE.txt31
-rw-r--r--src/corelib/tools/qalgorithms.h66
-rw-r--r--src/corelib/tools/qarraydata.cpp117
-rw-r--r--src/corelib/tools/qarraydata.h48
-rw-r--r--src/corelib/tools/qarraydataops.h4
-rw-r--r--src/corelib/tools/qarraydatapointer.h23
-rw-r--r--src/corelib/tools/qbitarray.h12
-rw-r--r--src/corelib/tools/qbytearray.cpp5074
-rw-r--r--src/corelib/tools/qbytearray.h712
-rw-r--r--src/corelib/tools/qbytearray_p.h66
-rw-r--r--src/corelib/tools/qbytearraylist.cpp175
-rw-r--r--src/corelib/tools/qbytearraylist.h91
-rw-r--r--src/corelib/tools/qbytearraymatcher.cpp435
-rw-r--r--src/corelib/tools/qbytearraymatcher.h164
-rw-r--r--src/corelib/tools/qbytedata_p.h245
-rw-r--r--src/corelib/tools/qcache.h18
-rw-r--r--src/corelib/tools/qchar.cpp2059
-rw-r--r--src/corelib/tools/qchar.h631
-rw-r--r--src/corelib/tools/qcollator.cpp408
-rw-r--r--src/corelib/tools/qcollator.h132
-rw-r--r--src/corelib/tools/qcollator_icu.cpp169
-rw-r--r--src/corelib/tools/qcollator_macx.cpp166
-rw-r--r--src/corelib/tools/qcollator_p.h148
-rw-r--r--src/corelib/tools/qcollator_posix.cpp126
-rw-r--r--src/corelib/tools/qcollator_win.cpp183
-rw-r--r--src/corelib/tools/qcommandlineoption.cpp4
-rw-r--r--src/corelib/tools/qcommandlineoption.h6
-rw-r--r--src/corelib/tools/qcommandlineparser.cpp58
-rw-r--r--src/corelib/tools/qcontainerfwd.h2
-rw-r--r--src/corelib/tools/qcontainertools_impl.h132
-rw-r--r--src/corelib/tools/qcontiguouscache.h20
-rw-r--r--src/corelib/tools/qcryptographichash.cpp4
-rw-r--r--src/corelib/tools/qdatetime.cpp5436
-rw-r--r--src/corelib/tools/qdatetime.h418
-rw-r--r--src/corelib/tools/qdatetime_p.h151
-rw-r--r--src/corelib/tools/qdatetimeparser.cpp2051
-rw-r--r--src/corelib/tools/qdatetimeparser_p.h313
-rw-r--r--src/corelib/tools/qdoublescanprint_p.h156
-rw-r--r--src/corelib/tools/qeasingcurve.cpp69
-rw-r--r--src/corelib/tools/qeasingcurve.h11
-rw-r--r--src/corelib/tools/qfreelist_p.h16
-rw-r--r--src/corelib/tools/qharfbuzz.cpp109
-rw-r--r--src/corelib/tools/qharfbuzz_p.h357
-rw-r--r--src/corelib/tools/qhash.cpp66
-rw-r--r--src/corelib/tools/qhash.h118
-rw-r--r--src/corelib/tools/qhashfunctions.h100
-rw-r--r--src/corelib/tools/qiterator.h15
-rw-r--r--src/corelib/tools/qline.cpp28
-rw-r--r--src/corelib/tools/qline.h9
-rw-r--r--src/corelib/tools/qlinkedlist.cpp18
-rw-r--r--src/corelib/tools/qlinkedlist.h99
-rw-r--r--src/corelib/tools/qlist.cpp22
-rw-r--r--src/corelib/tools/qlist.h173
-rw-r--r--src/corelib/tools/qlocale.cpp4200
-rw-r--r--src/corelib/tools/qlocale.h1153
-rw-r--r--src/corelib/tools/qlocale.qdoc1276
-rw-r--r--src/corelib/tools/qlocale_data_p.h8789
-rw-r--r--src/corelib/tools/qlocale_icu.cpp111
-rw-r--r--src/corelib/tools/qlocale_mac.mm510
-rw-r--r--src/corelib/tools/qlocale_p.h470
-rw-r--r--src/corelib/tools/qlocale_tools.cpp578
-rw-r--r--src/corelib/tools/qlocale_tools_p.h124
-rw-r--r--src/corelib/tools/qlocale_unix.cpp294
-rw-r--r--src/corelib/tools/qlocale_win.cpp1135
-rw-r--r--src/corelib/tools/qmap.cpp30
-rw-r--r--src/corelib/tools/qmap.h35
-rw-r--r--src/corelib/tools/qmargins.h208
-rw-r--r--src/corelib/tools/qpair.h37
-rw-r--r--src/corelib/tools/qpair.qdoc1
-rw-r--r--src/corelib/tools/qpoint.cpp23
-rw-r--r--src/corelib/tools/qpoint.h10
-rw-r--r--src/corelib/tools/qqueue.h4
-rw-r--r--src/corelib/tools/qrect.cpp26
-rw-r--r--src/corelib/tools/qrect.h624
-rw-r--r--src/corelib/tools/qrefcount.h26
-rw-r--r--src/corelib/tools/qregexp.cpp4605
-rw-r--r--src/corelib/tools/qregexp.h136
-rw-r--r--src/corelib/tools/qregularexpression.cpp3007
-rw-r--r--src/corelib/tools/qregularexpression.h287
-rw-r--r--src/corelib/tools/qringbuffer.cpp4
-rw-r--r--src/corelib/tools/qringbuffer_p.h14
-rw-r--r--src/corelib/tools/qscopedpointer.h38
-rw-r--r--src/corelib/tools/qscopedvaluerollback.h14
-rw-r--r--src/corelib/tools/qscopeguard.h20
-rw-r--r--src/corelib/tools/qset.h94
-rw-r--r--src/corelib/tools/qset.qdoc18
-rw-r--r--src/corelib/tools/qshareddata.h62
-rw-r--r--src/corelib/tools/qsharedpointer.cpp68
-rw-r--r--src/corelib/tools/qsharedpointer.h6
-rw-r--r--src/corelib/tools/qsharedpointer_impl.h219
-rw-r--r--src/corelib/tools/qsimd.cpp6
-rw-r--r--src/corelib/tools/qsimd_p.h8
-rw-r--r--src/corelib/tools/qsize.cpp26
-rw-r--r--src/corelib/tools/qsize.h265
-rw-r--r--src/corelib/tools/qstack.h2
-rw-r--r--src/corelib/tools/qstring.cpp12295
-rw-r--r--src/corelib/tools/qstring.h1879
-rw-r--r--src/corelib/tools/qstring_compat.cpp112
-rw-r--r--src/corelib/tools/qstring_mips_dsp_asm.S447
-rw-r--r--src/corelib/tools/qstringalgorithms.h95
-rw-r--r--src/corelib/tools/qstringalgorithms_p.h152
-rw-r--r--src/corelib/tools/qstringbuilder.cpp137
-rw-r--r--src/corelib/tools/qstringbuilder.h494
-rw-r--r--src/corelib/tools/qstringiterator.qdoc314
-rw-r--r--src/corelib/tools/qstringiterator_p.h255
-rw-r--r--src/corelib/tools/qstringlist.cpp851
-rw-r--r--src/corelib/tools/qstringlist.h337
-rw-r--r--src/corelib/tools/qstringliteral.h112
-rw-r--r--src/corelib/tools/qstringmatcher.cpp322
-rw-r--r--src/corelib/tools/qstringmatcher.h88
-rw-r--r--src/corelib/tools/qstringview.cpp797
-rw-r--r--src/corelib/tools/qstringview.h314
-rw-r--r--src/corelib/tools/qt_attribution.json39
-rw-r--r--src/corelib/tools/qtextboundaryfinder.cpp511
-rw-r--r--src/corelib/tools/qtextboundaryfinder.h111
-rw-r--r--src/corelib/tools/qtimeline.cpp35
-rw-r--r--src/corelib/tools/qtimeline.h4
-rw-r--r--src/corelib/tools/qtimezone.cpp997
-rw-r--r--src/corelib/tools/qtimezone.h190
-rw-r--r--src/corelib/tools/qtimezoneprivate.cpp926
-rw-r--r--src/corelib/tools/qtimezoneprivate_android.cpp257
-rw-r--r--src/corelib/tools/qtimezoneprivate_data_p.h1154
-rw-r--r--src/corelib/tools/qtimezoneprivate_icu.cpp508
-rw-r--r--src/corelib/tools/qtimezoneprivate_mac.mm333
-rw-r--r--src/corelib/tools/qtimezoneprivate_p.h493
-rw-r--r--src/corelib/tools/qtimezoneprivate_tz.cpp1168
-rw-r--r--src/corelib/tools/qtimezoneprivate_win.cpp927
-rw-r--r--src/corelib/tools/qtools_p.h18
-rw-r--r--src/corelib/tools/qunicodetables.cpp13446
-rw-r--r--src/corelib/tools/qunicodetables_p.h232
-rw-r--r--src/corelib/tools/qunicodetools.cpp822
-rw-r--r--src/corelib/tools/qunicodetools_p.h109
-rw-r--r--src/corelib/tools/qvarlengtharray.h56
-rw-r--r--src/corelib/tools/qvarlengtharray.qdoc16
-rw-r--r--src/corelib/tools/qvector.h145
-rw-r--r--src/corelib/tools/qvector.qdoc41
-rw-r--r--src/corelib/tools/qversionnumber.cpp6
-rw-r--r--src/corelib/tools/qversionnumber.h50
-rw-r--r--src/corelib/tools/qvsnprintf.cpp129
-rw-r--r--src/corelib/tools/tools.pri133
140 files changed, 2147 insertions, 89537 deletions
diff --git a/src/corelib/tools/UNICODE_LICENSE.txt b/src/corelib/tools/UNICODE_LICENSE.txt
deleted file mode 100644
index 1c73202b74..0000000000
--- a/src/corelib/tools/UNICODE_LICENSE.txt
+++ /dev/null
@@ -1,31 +0,0 @@
-Copyright © 1991-2018 Unicode, Inc. All rights reserved.
-Distributed under the Terms of Use in http://www.unicode.org/copyright.html.
-
-Permission is hereby granted, free of charge, to any person obtaining
-a copy of the Unicode data files and any associated documentation
-(the "Data Files") or Unicode software and any associated documentation
-(the "Software") to deal in the Data Files or Software
-without restriction, including without limitation the rights to use,
-copy, modify, merge, publish, distribute, and/or sell copies of
-the Data Files or Software, and to permit persons to whom the Data Files
-or Software are furnished to do so, provided that either
-(a) this copyright and permission notice appear with all copies
-of the Data Files or Software, or
-(b) this copyright and permission notice appear in associated
-Documentation.
-
-THE DATA FILES AND SOFTWARE ARE PROVIDED "AS IS", WITHOUT WARRANTY OF
-ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
-WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-NONINFRINGEMENT OF THIRD PARTY RIGHTS.
-IN NO EVENT SHALL THE COPYRIGHT HOLDER OR HOLDERS INCLUDED IN THIS
-NOTICE BE LIABLE FOR ANY CLAIM, OR ANY SPECIAL INDIRECT OR CONSEQUENTIAL
-DAMAGES, OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
-DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
-TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
-PERFORMANCE OF THE DATA FILES OR SOFTWARE.
-
-Except as contained in this notice, the name of a copyright holder
-shall not be used in advertising or otherwise to promote the sale,
-use or other dealings in these Data Files or Software without prior
-written authorization of the copyright holder.
diff --git a/src/corelib/tools/qalgorithms.h b/src/corelib/tools/qalgorithms.h
index 0146e22fa3..b01ce0db58 100644
--- a/src/corelib/tools/qalgorithms.h
+++ b/src/corelib/tools/qalgorithms.h
@@ -524,7 +524,7 @@ QT_DEPRECATED_X("Use std::binary_search") Q_OUTOFLINE_TEMPLATE RandomAccessItera
# if (defined __apple_build_version__ && __clang_major__ >= 7) || (Q_CC_CLANG >= 307)
# define QT_HAS_CONSTEXPR_BUILTINS
# endif
-#elif defined(Q_CC_MSVC) && !defined(Q_CC_INTEL) && !defined(Q_OS_WINCE) && !defined(Q_PROCESSOR_ARM)
+#elif defined(Q_CC_MSVC) && !defined(Q_CC_INTEL) && !defined(Q_PROCESSOR_ARM)
# define QT_HAS_CONSTEXPR_BUILTINS
#elif defined(Q_CC_GNU)
# define QT_HAS_CONSTEXPR_BUILTINS
@@ -533,7 +533,7 @@ QT_DEPRECATED_X("Use std::binary_search") Q_OUTOFLINE_TEMPLATE RandomAccessItera
#if defined QT_HAS_CONSTEXPR_BUILTINS
#if defined(Q_CC_GNU) || defined(Q_CC_CLANG)
# define QT_HAS_BUILTIN_CTZS
-Q_DECL_CONSTEXPR Q_ALWAYS_INLINE uint qt_builtin_ctzs(quint16 v) Q_DECL_NOTHROW
+Q_DECL_CONSTEXPR Q_ALWAYS_INLINE uint qt_builtin_ctzs(quint16 v) noexcept
{
# if QT_HAS_BUILTIN(__builtin_ctzs)
return __builtin_ctzs(v);
@@ -542,7 +542,7 @@ Q_DECL_CONSTEXPR Q_ALWAYS_INLINE uint qt_builtin_ctzs(quint16 v) Q_DECL_NOTHROW
# endif
}
#define QT_HAS_BUILTIN_CLZS
-Q_DECL_CONSTEXPR Q_ALWAYS_INLINE uint qt_builtin_clzs(quint16 v) Q_DECL_NOTHROW
+Q_DECL_CONSTEXPR Q_ALWAYS_INLINE uint qt_builtin_clzs(quint16 v) noexcept
{
# if QT_HAS_BUILTIN(__builtin_clzs)
return __builtin_clzs(v);
@@ -551,44 +551,44 @@ Q_DECL_CONSTEXPR Q_ALWAYS_INLINE uint qt_builtin_clzs(quint16 v) Q_DECL_NOTHROW
# endif
}
#define QT_HAS_BUILTIN_CTZ
-Q_DECL_CONSTEXPR Q_ALWAYS_INLINE uint qt_builtin_ctz(quint32 v) Q_DECL_NOTHROW
+Q_DECL_CONSTEXPR Q_ALWAYS_INLINE uint qt_builtin_ctz(quint32 v) noexcept
{
return __builtin_ctz(v);
}
#define QT_HAS_BUILTIN_CLZ
-Q_DECL_CONSTEXPR Q_ALWAYS_INLINE uint qt_builtin_clz(quint32 v) Q_DECL_NOTHROW
+Q_DECL_CONSTEXPR Q_ALWAYS_INLINE uint qt_builtin_clz(quint32 v) noexcept
{
return __builtin_clz(v);
}
#define QT_HAS_BUILTIN_CTZLL
-Q_DECL_CONSTEXPR Q_ALWAYS_INLINE uint qt_builtin_ctzll(quint64 v) Q_DECL_NOTHROW
+Q_DECL_CONSTEXPR Q_ALWAYS_INLINE uint qt_builtin_ctzll(quint64 v) noexcept
{
return __builtin_ctzll(v);
}
#define QT_HAS_BUILTIN_CLZLL
-Q_DECL_CONSTEXPR Q_ALWAYS_INLINE uint qt_builtin_clzll(quint64 v) Q_DECL_NOTHROW
+Q_DECL_CONSTEXPR Q_ALWAYS_INLINE uint qt_builtin_clzll(quint64 v) noexcept
{
return __builtin_clzll(v);
}
#define QALGORITHMS_USE_BUILTIN_POPCOUNT
-Q_DECL_CONSTEXPR Q_ALWAYS_INLINE uint qt_builtin_popcount(quint32 v) Q_DECL_NOTHROW
+Q_DECL_CONSTEXPR Q_ALWAYS_INLINE uint qt_builtin_popcount(quint32 v) noexcept
{
return __builtin_popcount(v);
}
-Q_DECL_CONSTEXPR Q_ALWAYS_INLINE uint qt_builtin_popcount(quint8 v) Q_DECL_NOTHROW
+Q_DECL_CONSTEXPR Q_ALWAYS_INLINE uint qt_builtin_popcount(quint8 v) noexcept
{
return __builtin_popcount(v);
}
-Q_DECL_CONSTEXPR Q_ALWAYS_INLINE uint qt_builtin_popcount(quint16 v) Q_DECL_NOTHROW
+Q_DECL_CONSTEXPR Q_ALWAYS_INLINE uint qt_builtin_popcount(quint16 v) noexcept
{
return __builtin_popcount(v);
}
#define QALGORITHMS_USE_BUILTIN_POPCOUNTLL
-Q_DECL_CONSTEXPR Q_ALWAYS_INLINE uint qt_builtin_popcountll(quint64 v) Q_DECL_NOTHROW
+Q_DECL_CONSTEXPR Q_ALWAYS_INLINE uint qt_builtin_popcountll(quint64 v) noexcept
{
return __builtin_popcountll(v);
}
-#elif defined(Q_CC_MSVC) && !defined(Q_OS_WINCE) && !defined(Q_PROCESSOR_ARM)
+#elif defined(Q_CC_MSVC) && !defined(Q_PROCESSOR_ARM)
#define QT_POPCOUNT_CONSTEXPR
#define QT_POPCOUNT_RELAXED_CONSTEXPR
#define QT_HAS_BUILTIN_CTZ
@@ -630,12 +630,12 @@ Q_ALWAYS_INLINE unsigned long qt_builtin_clzll(quint64 val)
}
#endif // MSVC 64bit
# define QT_HAS_BUILTIN_CTZS
-Q_ALWAYS_INLINE uint qt_builtin_ctzs(quint16 v) Q_DECL_NOTHROW
+Q_ALWAYS_INLINE uint qt_builtin_ctzs(quint16 v) noexcept
{
return qt_builtin_ctz(v);
}
#define QT_HAS_BUILTIN_CLZS
-Q_ALWAYS_INLINE uint qt_builtin_clzs(quint16 v) Q_DECL_NOTHROW
+Q_ALWAYS_INLINE uint qt_builtin_clzs(quint16 v) noexcept
{
return qt_builtin_clz(v) - 16U;
}
@@ -652,19 +652,19 @@ Q_ALWAYS_INLINE uint qt_builtin_clzs(quint16 v) Q_DECL_NOTHROW
#if defined(__AVX__) || defined(__SSE4_2__) || defined(__POPCNT__)
#define QALGORITHMS_USE_BUILTIN_POPCOUNT
#define QALGORITHMS_USE_BUILTIN_POPCOUNTLL
-Q_ALWAYS_INLINE uint qt_builtin_popcount(quint32 v) Q_DECL_NOTHROW
+Q_ALWAYS_INLINE uint qt_builtin_popcount(quint32 v) noexcept
{
return __popcnt(v);
}
-Q_ALWAYS_INLINE uint qt_builtin_popcount(quint8 v) Q_DECL_NOTHROW
+Q_ALWAYS_INLINE uint qt_builtin_popcount(quint8 v) noexcept
{
return __popcnt16(v);
}
-Q_ALWAYS_INLINE uint qt_builtin_popcount(quint16 v) Q_DECL_NOTHROW
+Q_ALWAYS_INLINE uint qt_builtin_popcount(quint16 v) noexcept
{
return __popcnt16(v);
}
-Q_ALWAYS_INLINE uint qt_builtin_popcountll(quint64 v) Q_DECL_NOTHROW
+Q_ALWAYS_INLINE uint qt_builtin_popcountll(quint64 v) noexcept
{
#if Q_PROCESSOR_WORDSIZE == 8
return __popcnt64(v);
@@ -685,7 +685,7 @@ Q_ALWAYS_INLINE uint qt_builtin_popcountll(quint64 v) Q_DECL_NOTHROW
} //namespace QAlgorithmsPrivate
-Q_DECL_CONST_FUNCTION QT_POPCOUNT_CONSTEXPR inline uint qPopulationCount(quint32 v) Q_DECL_NOTHROW
+Q_DECL_CONST_FUNCTION QT_POPCOUNT_CONSTEXPR inline uint qPopulationCount(quint32 v) noexcept
{
#ifdef QALGORITHMS_USE_BUILTIN_POPCOUNT
return QAlgorithmsPrivate::qt_builtin_popcount(v);
@@ -698,7 +698,7 @@ Q_DECL_CONST_FUNCTION QT_POPCOUNT_CONSTEXPR inline uint qPopulationCount(quint32
#endif
}
-Q_DECL_CONST_FUNCTION QT_POPCOUNT_CONSTEXPR inline uint qPopulationCount(quint8 v) Q_DECL_NOTHROW
+Q_DECL_CONST_FUNCTION QT_POPCOUNT_CONSTEXPR inline uint qPopulationCount(quint8 v) noexcept
{
#ifdef QALGORITHMS_USE_BUILTIN_POPCOUNT
return QAlgorithmsPrivate::qt_builtin_popcount(v);
@@ -708,7 +708,7 @@ Q_DECL_CONST_FUNCTION QT_POPCOUNT_CONSTEXPR inline uint qPopulationCount(quint8
#endif
}
-Q_DECL_CONST_FUNCTION QT_POPCOUNT_CONSTEXPR inline uint qPopulationCount(quint16 v) Q_DECL_NOTHROW
+Q_DECL_CONST_FUNCTION QT_POPCOUNT_CONSTEXPR inline uint qPopulationCount(quint16 v) noexcept
{
#ifdef QALGORITHMS_USE_BUILTIN_POPCOUNT
return QAlgorithmsPrivate::qt_builtin_popcount(v);
@@ -719,7 +719,7 @@ Q_DECL_CONST_FUNCTION QT_POPCOUNT_CONSTEXPR inline uint qPopulationCount(quint16
#endif
}
-Q_DECL_CONST_FUNCTION QT_POPCOUNT_CONSTEXPR inline uint qPopulationCount(quint64 v) Q_DECL_NOTHROW
+Q_DECL_CONST_FUNCTION QT_POPCOUNT_CONSTEXPR inline uint qPopulationCount(quint64 v) noexcept
{
#ifdef QALGORITHMS_USE_BUILTIN_POPCOUNTLL
return QAlgorithmsPrivate::qt_builtin_popcountll(v);
@@ -734,7 +734,7 @@ Q_DECL_CONST_FUNCTION QT_POPCOUNT_CONSTEXPR inline uint qPopulationCount(quint64
#endif
}
-Q_DECL_CONST_FUNCTION QT_POPCOUNT_CONSTEXPR inline uint qPopulationCount(long unsigned int v) Q_DECL_NOTHROW
+Q_DECL_CONST_FUNCTION QT_POPCOUNT_CONSTEXPR inline uint qPopulationCount(long unsigned int v) noexcept
{
return qPopulationCount(static_cast<quint64>(v));
}
@@ -744,7 +744,7 @@ Q_DECL_CONST_FUNCTION QT_POPCOUNT_CONSTEXPR inline uint qPopulationCount(long un
#endif
#undef QT_POPCOUNT_CONSTEXPR
-Q_DECL_RELAXED_CONSTEXPR inline uint qCountTrailingZeroBits(quint32 v) Q_DECL_NOTHROW
+Q_DECL_RELAXED_CONSTEXPR inline uint qCountTrailingZeroBits(quint32 v) noexcept
{
#if defined(QT_HAS_BUILTIN_CTZ)
return v ? QAlgorithmsPrivate::qt_builtin_ctz(v) : 32U;
@@ -762,7 +762,7 @@ Q_DECL_RELAXED_CONSTEXPR inline uint qCountTrailingZeroBits(quint32 v) Q_DECL_NO
#endif
}
-Q_DECL_RELAXED_CONSTEXPR inline uint qCountTrailingZeroBits(quint8 v) Q_DECL_NOTHROW
+Q_DECL_RELAXED_CONSTEXPR inline uint qCountTrailingZeroBits(quint8 v) noexcept
{
#if defined(QT_HAS_BUILTIN_CTZ)
return v ? QAlgorithmsPrivate::qt_builtin_ctz(v) : 8U;
@@ -777,7 +777,7 @@ Q_DECL_RELAXED_CONSTEXPR inline uint qCountTrailingZeroBits(quint8 v) Q_DECL_NOT
#endif
}
-Q_DECL_RELAXED_CONSTEXPR inline uint qCountTrailingZeroBits(quint16 v) Q_DECL_NOTHROW
+Q_DECL_RELAXED_CONSTEXPR inline uint qCountTrailingZeroBits(quint16 v) noexcept
{
#if defined(QT_HAS_BUILTIN_CTZS)
return v ? QAlgorithmsPrivate::qt_builtin_ctzs(v) : 16U;
@@ -793,7 +793,7 @@ Q_DECL_RELAXED_CONSTEXPR inline uint qCountTrailingZeroBits(quint16 v) Q_DECL_NO
#endif
}
-Q_DECL_RELAXED_CONSTEXPR inline uint qCountTrailingZeroBits(quint64 v) Q_DECL_NOTHROW
+Q_DECL_RELAXED_CONSTEXPR inline uint qCountTrailingZeroBits(quint64 v) noexcept
{
#if defined(QT_HAS_BUILTIN_CTZLL)
return v ? QAlgorithmsPrivate::qt_builtin_ctzll(v) : 64;
@@ -804,12 +804,12 @@ Q_DECL_RELAXED_CONSTEXPR inline uint qCountTrailingZeroBits(quint64 v) Q_DECL_NO
#endif
}
-Q_DECL_RELAXED_CONSTEXPR inline uint qCountTrailingZeroBits(unsigned long v) Q_DECL_NOTHROW
+Q_DECL_RELAXED_CONSTEXPR inline uint qCountTrailingZeroBits(unsigned long v) noexcept
{
return qCountTrailingZeroBits(QIntegerForSizeof<long>::Unsigned(v));
}
-Q_DECL_RELAXED_CONSTEXPR inline uint qCountLeadingZeroBits(quint32 v) Q_DECL_NOTHROW
+Q_DECL_RELAXED_CONSTEXPR inline uint qCountLeadingZeroBits(quint32 v) noexcept
{
#if defined(QT_HAS_BUILTIN_CLZ)
return v ? QAlgorithmsPrivate::qt_builtin_clz(v) : 32U;
@@ -824,7 +824,7 @@ Q_DECL_RELAXED_CONSTEXPR inline uint qCountLeadingZeroBits(quint32 v) Q_DECL_NOT
#endif
}
-QT_POPCOUNT_RELAXED_CONSTEXPR inline uint qCountLeadingZeroBits(quint8 v) Q_DECL_NOTHROW
+QT_POPCOUNT_RELAXED_CONSTEXPR inline uint qCountLeadingZeroBits(quint8 v) noexcept
{
#if defined(QT_HAS_BUILTIN_CLZ)
return v ? QAlgorithmsPrivate::qt_builtin_clz(v)-24U : 8U;
@@ -836,7 +836,7 @@ QT_POPCOUNT_RELAXED_CONSTEXPR inline uint qCountLeadingZeroBits(quint8 v) Q_DECL
#endif
}
-QT_POPCOUNT_RELAXED_CONSTEXPR inline uint qCountLeadingZeroBits(quint16 v) Q_DECL_NOTHROW
+QT_POPCOUNT_RELAXED_CONSTEXPR inline uint qCountLeadingZeroBits(quint16 v) noexcept
{
#if defined(QT_HAS_BUILTIN_CLZS)
return v ? QAlgorithmsPrivate::qt_builtin_clzs(v) : 16U;
@@ -849,7 +849,7 @@ QT_POPCOUNT_RELAXED_CONSTEXPR inline uint qCountLeadingZeroBits(quint16 v) Q_DEC
#endif
}
-QT_POPCOUNT_RELAXED_CONSTEXPR inline uint qCountLeadingZeroBits(quint64 v) Q_DECL_NOTHROW
+QT_POPCOUNT_RELAXED_CONSTEXPR inline uint qCountLeadingZeroBits(quint64 v) noexcept
{
#if defined(QT_HAS_BUILTIN_CLZLL)
return v ? QAlgorithmsPrivate::qt_builtin_clzll(v) : 64U;
@@ -864,7 +864,7 @@ QT_POPCOUNT_RELAXED_CONSTEXPR inline uint qCountLeadingZeroBits(quint64 v) Q_DEC
#endif
}
-QT_POPCOUNT_RELAXED_CONSTEXPR inline uint qCountLeadingZeroBits(unsigned long v) Q_DECL_NOTHROW
+QT_POPCOUNT_RELAXED_CONSTEXPR inline uint qCountLeadingZeroBits(unsigned long v) noexcept
{
return qCountLeadingZeroBits(QIntegerForSizeof<long>::Unsigned(v));
}
diff --git a/src/corelib/tools/qarraydata.cpp b/src/corelib/tools/qarraydata.cpp
index a91d833e3b..234a44f6b6 100644
--- a/src/corelib/tools/qarraydata.cpp
+++ b/src/corelib/tools/qarraydata.cpp
@@ -1,6 +1,6 @@
/****************************************************************************
**
-** Copyright (C) 2016 The Qt Company Ltd.
+** Copyright (C) 2019 The Qt Company Ltd.
** Copyright (C) 2016 Intel Corporation.
** Contact: https://www.qt.io/licensing/
**
@@ -41,11 +41,114 @@
#include <QtCore/qarraydata.h>
#include <QtCore/private/qnumeric_p.h>
#include <QtCore/private/qtools_p.h>
+#include <QtCore/qmath.h>
#include <stdlib.h>
QT_BEGIN_NAMESPACE
+/*
+ * This pair of functions is declared in qtools_p.h and is used by the Qt
+ * containers to allocate memory and grow the memory block during append
+ * operations.
+ *
+ * They take size_t parameters and return size_t so they will change sizes
+ * according to the pointer width. However, knowing Qt containers store the
+ * container size and element indexes in ints, these functions never return a
+ * size larger than INT_MAX. This is done by casting the element count and
+ * memory block size to int in several comparisons: the check for negative is
+ * very fast on most platforms as the code only needs to check the sign bit.
+ *
+ * These functions return SIZE_MAX on overflow, which can be passed to malloc()
+ * and will surely cause a NULL return (there's no way you can allocate a
+ * memory block the size of your entire VM space).
+ */
+
+/*!
+ \internal
+ \since 5.7
+
+ Returns the memory block size for a container containing \a elementCount
+ elements, each of \a elementSize bytes, plus a header of \a headerSize
+ bytes. That is, this function returns \c
+ {elementCount * elementSize + headerSize}
+
+ but unlike the simple calculation, it checks for overflows during the
+ multiplication and the addition.
+
+ Both \a elementCount and \a headerSize can be zero, but \a elementSize
+ cannot.
+
+ This function returns SIZE_MAX (~0) on overflow or if the memory block size
+ would not fit an int.
+*/
+size_t qCalculateBlockSize(size_t elementCount, size_t elementSize, size_t headerSize) noexcept
+{
+ unsigned count = unsigned(elementCount);
+ unsigned size = unsigned(elementSize);
+ unsigned header = unsigned(headerSize);
+ Q_ASSERT(elementSize);
+ Q_ASSERT(size == elementSize);
+ Q_ASSERT(header == headerSize);
+
+ if (Q_UNLIKELY(count != elementCount))
+ return std::numeric_limits<size_t>::max();
+
+ unsigned bytes;
+ if (Q_UNLIKELY(mul_overflow(size, count, &bytes)) ||
+ Q_UNLIKELY(add_overflow(bytes, header, &bytes)))
+ return std::numeric_limits<size_t>::max();
+ if (Q_UNLIKELY(int(bytes) < 0)) // catches bytes >= 2GB
+ return std::numeric_limits<size_t>::max();
+
+ return bytes;
+}
+
+/*!
+ \internal
+ \since 5.7
+
+ Returns the memory block size and the number of elements that will fit in
+ that block for a container containing \a elementCount elements, each of \a
+ elementSize bytes, plus a header of \a headerSize bytes. This function
+ assumes the container will grow and pre-allocates a growth factor.
+
+ Both \a elementCount and \a headerSize can be zero, but \a elementSize
+ cannot.
+
+ This function returns SIZE_MAX (~0) on overflow or if the memory block size
+ would not fit an int.
+
+ \note The memory block may contain up to \a elementSize - 1 bytes more than
+ needed.
+*/
+CalculateGrowingBlockSizeResult
+qCalculateGrowingBlockSize(size_t elementCount, size_t elementSize, size_t headerSize) noexcept
+{
+ CalculateGrowingBlockSizeResult result = {
+ std::numeric_limits<size_t>::max(),std::numeric_limits<size_t>::max()
+ };
+
+ unsigned bytes = unsigned(qCalculateBlockSize(elementCount, elementSize, headerSize));
+ if (int(bytes) < 0) // catches std::numeric_limits<size_t>::max()
+ return result;
+
+ unsigned morebytes = qNextPowerOfTwo(bytes);
+ if (Q_UNLIKELY(int(morebytes) < 0)) {
+ // catches morebytes == 2GB
+ // grow by half the difference between bytes and morebytes
+ bytes += (morebytes - bytes) / 2;
+ } else {
+ bytes = morebytes;
+ }
+
+ result.elementCount = (bytes - unsigned(headerSize)) / unsigned(elementSize);
+ result.size = bytes;
+ return result;
+}
+
+// End of qtools_p.h implementation
+
QT_WARNING_PUSH
QT_WARNING_DISABLE_GCC("-Wmissing-field-initializers")
@@ -87,7 +190,7 @@ static QArrayData *reallocateData(QArrayData *header, size_t allocSize, uint opt
}
QArrayData *QArrayData::allocate(size_t objectSize, size_t alignment,
- size_t capacity, AllocationOptions options) Q_DECL_NOTHROW
+ size_t capacity, AllocationOptions options) noexcept
{
// Alignment is a power of two
Q_ASSERT(alignment >= Q_ALIGNOF(QArrayData)
@@ -112,7 +215,7 @@ QArrayData *QArrayData::allocate(size_t objectSize, size_t alignment,
headerSize += (alignment - Q_ALIGNOF(QArrayData));
if (headerSize > size_t(MaxAllocSize))
- return 0;
+ return nullptr;
size_t allocSize = calculateBlockSize(capacity, objectSize, headerSize, options);
QArrayData *header = static_cast<QArrayData *>(::malloc(allocSize));
@@ -121,9 +224,9 @@ QArrayData *QArrayData::allocate(size_t objectSize, size_t alignment,
& ~(alignment - 1);
#if !defined(QT_NO_UNSHARABLE_CONTAINERS)
- header->ref.atomic.store(bool(!(options & Unsharable)));
+ header->ref.atomic.storeRelaxed(bool(!(options & Unsharable)));
#else
- header->ref.atomic.store(1);
+ header->ref.atomic.storeRelaxed(1);
#endif
header->size = 0;
header->alloc = capacity;
@@ -135,7 +238,7 @@ QArrayData *QArrayData::allocate(size_t objectSize, size_t alignment,
}
QArrayData *QArrayData::reallocateUnaligned(QArrayData *data, size_t objectSize, size_t capacity,
- AllocationOptions options) Q_DECL_NOTHROW
+ AllocationOptions options) noexcept
{
Q_ASSERT(data);
Q_ASSERT(data->isMutable());
@@ -150,7 +253,7 @@ QArrayData *QArrayData::reallocateUnaligned(QArrayData *data, size_t objectSize,
}
void QArrayData::deallocate(QArrayData *data, size_t objectSize,
- size_t alignment) Q_DECL_NOTHROW
+ size_t alignment) noexcept
{
// Alignment is a power of two
Q_ASSERT(alignment >= Q_ALIGNOF(QArrayData)
diff --git a/src/corelib/tools/qarraydata.h b/src/corelib/tools/qarraydata.h
index a642fb9b39..dcd95924c1 100644
--- a/src/corelib/tools/qarraydata.h
+++ b/src/corelib/tools/qarraydata.h
@@ -113,14 +113,14 @@ struct Q_CORE_EXPORT QArrayData
}
Q_REQUIRED_RESULT static QArrayData *allocate(size_t objectSize, size_t alignment,
- size_t capacity, AllocationOptions options = Default) Q_DECL_NOTHROW;
+ size_t capacity, AllocationOptions options = Default) noexcept;
Q_REQUIRED_RESULT static QArrayData *reallocateUnaligned(QArrayData *data, size_t objectSize,
- size_t newCapacity, AllocationOptions newOptions = Default) Q_DECL_NOTHROW;
+ size_t newCapacity, AllocationOptions newOptions = Default) noexcept;
static void deallocate(QArrayData *data, size_t objectSize,
- size_t alignment) Q_DECL_NOTHROW;
+ size_t alignment) noexcept;
static const QArrayData shared_null[2];
- static QArrayData *sharedNull() Q_DECL_NOTHROW { return const_cast<QArrayData*>(shared_null); }
+ static QArrayData *sharedNull() noexcept { return const_cast<QArrayData*>(shared_null); }
};
Q_DECLARE_OPERATORS_FOR_FLAGS(QArrayData::AllocationOptions)
@@ -254,7 +254,7 @@ struct QTypedArrayData
return result;
}
- static QTypedArrayData *sharedNull() Q_DECL_NOTHROW
+ static QTypedArrayData *sharedNull() noexcept
{
Q_STATIC_ASSERT(sizeof(QTypedArrayData) == sizeof(QArrayData));
return static_cast<QTypedArrayData *>(QArrayData::sharedNull());
@@ -306,8 +306,6 @@ struct QArrayDataPointerRef
// accomplished by hiding a static const instance of QStaticArrayData, which is
// POD.
-#if defined(Q_COMPILER_VARIADIC_MACROS)
-#if defined(Q_COMPILER_LAMBDA)
// Hide array inside a lambda
#define Q_ARRAY_LITERAL(Type, ...) \
([]() -> QArrayDataPointerRef<Type> { \
@@ -324,15 +322,18 @@ struct QArrayDataPointerRef
return StaticWrapper::get(); \
}()) \
/**/
+
+#ifdef Q_COMPILER_CONSTEXPR
+#define Q_ARRAY_LITERAL_CHECK_LITERAL_TYPE(Type) Q_STATIC_ASSERT(std::is_literal_type<Type>::value)
+#else
+#define Q_ARRAY_LITERAL_CHECK_LITERAL_TYPE(Type) do {} while (0)
#endif
-#endif // defined(Q_COMPILER_VARIADIC_MACROS)
-#if defined(Q_ARRAY_LITERAL)
#define Q_ARRAY_LITERAL_IMPL(Type, ...) \
- union { Type type_must_be_POD; } dummy; Q_UNUSED(dummy) \
+ Q_ARRAY_LITERAL_CHECK_LITERAL_TYPE(Type); \
\
/* Portable compile-time array size computation */ \
- Type data[] = { __VA_ARGS__ }; Q_UNUSED(data) \
+ Q_CONSTEXPR Type data[] = { __VA_ARGS__ }; Q_UNUSED(data); \
enum { Size = sizeof(data) / sizeof(data[0]) }; \
\
static const QStaticArrayData<Type, Size> literal = { \
@@ -342,31 +343,6 @@ struct QArrayDataPointerRef
{ static_cast<QTypedArrayData<Type> *>( \
const_cast<QArrayData *>(&literal.header)) }; \
/**/
-#else
-// As a fallback, memory is allocated and data copied to the heap.
-
-// The fallback macro does NOT use variadic macros and does NOT support
-// variable number of arguments. It is suitable for char arrays.
-
-namespace QtPrivate {
- template <class T, size_t N>
- inline QArrayDataPointerRef<T> qMakeArrayLiteral(const T (&array)[N])
- {
- union { T type_must_be_POD; } dummy; Q_UNUSED(dummy)
-
- QArrayDataPointerRef<T> result = { QTypedArrayData<T>::allocate(N) };
- Q_CHECK_PTR(result.ptr);
-
- ::memcpy(result.ptr->data(), array, N * sizeof(T));
- result.ptr->size = N;
-
- return result;
- }
-}
-
-#define Q_ARRAY_LITERAL(Type, Array) \
- QT_PREPEND_NAMESPACE(QtPrivate::qMakeArrayLiteral)<Type>( Array )
-#endif // !defined(Q_ARRAY_LITERAL)
namespace QtPrivate {
struct Q_CORE_EXPORT QContainerImplHelper
diff --git a/src/corelib/tools/qarraydataops.h b/src/corelib/tools/qarraydataops.h
index 7e1b43f9b1..8e19525f07 100644
--- a/src/corelib/tools/qarraydataops.h
+++ b/src/corelib/tools/qarraydataops.h
@@ -106,7 +106,7 @@ struct QPodArrayOps
void destroyAll() // Call from destructors, ONLY!
{
Q_ASSERT(this->isMutable());
- Q_ASSERT(this->ref.atomic.load() == 0);
+ Q_ASSERT(this->ref.atomic.loadRelaxed() == 0);
// As this is to be called only from destructor, it doesn't need to be
// exception safe; size not updated.
@@ -204,7 +204,7 @@ struct QGenericArrayOps
// As this is to be called only from destructor, it doesn't need to be
// exception safe; size not updated.
- Q_ASSERT(this->ref.atomic.load() == 0);
+ Q_ASSERT(this->ref.atomic.loadRelaxed() == 0);
const T *const b = this->begin();
const T *i = this->end();
diff --git a/src/corelib/tools/qarraydatapointer.h b/src/corelib/tools/qarraydatapointer.h
index 51cfa6e849..af5173c9ad 100644
--- a/src/corelib/tools/qarraydatapointer.h
+++ b/src/corelib/tools/qarraydatapointer.h
@@ -52,7 +52,7 @@ private:
typedef QArrayDataOps<T> DataOps;
public:
- QArrayDataPointer() Q_DECL_NOTHROW
+ QArrayDataPointer() noexcept
: d(Data::sharedNull())
{
}
@@ -82,20 +82,18 @@ public:
return *this;
}
-#ifdef Q_COMPILER_RVALUE_REFS
- QArrayDataPointer(QArrayDataPointer &&other) Q_DECL_NOTHROW
+ QArrayDataPointer(QArrayDataPointer &&other) noexcept
: d(other.d)
{
other.d = Data::sharedNull();
}
- QArrayDataPointer &operator=(QArrayDataPointer &&other) Q_DECL_NOTHROW
+ QArrayDataPointer &operator=(QArrayDataPointer &&other) noexcept
{
QArrayDataPointer moved(std::move(other));
this->swap(moved);
return *this;
}
-#endif
DataOps &operator*() const
{
@@ -150,7 +148,7 @@ public:
bool isSharable() const { return d->isSharable(); }
#endif
- void swap(QArrayDataPointer &other) Q_DECL_NOTHROW
+ void swap(QArrayDataPointer &other) noexcept
{
qSwap(d, other.d);
}
@@ -204,22 +202,11 @@ inline bool operator!=(const QArrayDataPointer<T> &lhs, const QArrayDataPointer<
}
template <class T>
-inline void qSwap(QArrayDataPointer<T> &p1, QArrayDataPointer<T> &p2)
+inline void swap(QArrayDataPointer<T> &p1, QArrayDataPointer<T> &p2)
{
p1.swap(p2);
}
QT_END_NAMESPACE
-namespace std
-{
- template <class T>
- inline void swap(
- QT_PREPEND_NAMESPACE(QArrayDataPointer)<T> &p1,
- QT_PREPEND_NAMESPACE(QArrayDataPointer)<T> &p2)
- {
- p1.swap(p2);
- }
-}
-
#endif // include guard
diff --git a/src/corelib/tools/qbitarray.h b/src/corelib/tools/qbitarray.h
index ff40bf5654..9b0e931aca 100644
--- a/src/corelib/tools/qbitarray.h
+++ b/src/corelib/tools/qbitarray.h
@@ -50,21 +50,19 @@ class Q_CORE_EXPORT QBitArray
{
friend Q_CORE_EXPORT QDataStream &operator<<(QDataStream &, const QBitArray &);
friend Q_CORE_EXPORT QDataStream &operator>>(QDataStream &, QBitArray &);
- friend Q_CORE_EXPORT uint qHash(const QBitArray &key, uint seed) Q_DECL_NOTHROW;
+ friend Q_CORE_EXPORT uint qHash(const QBitArray &key, uint seed) noexcept;
QByteArray d;
public:
- inline QBitArray() Q_DECL_NOTHROW {}
+ inline QBitArray() noexcept {}
explicit QBitArray(int size, bool val = false);
QBitArray(const QBitArray &other) : d(other.d) {}
inline QBitArray &operator=(const QBitArray &other) { d = other.d; return *this; }
-#ifdef Q_COMPILER_RVALUE_REFS
- inline QBitArray(QBitArray &&other) Q_DECL_NOTHROW : d(std::move(other.d)) {}
- inline QBitArray &operator=(QBitArray &&other) Q_DECL_NOTHROW
+ inline QBitArray(QBitArray &&other) noexcept : d(std::move(other.d)) {}
+ inline QBitArray &operator=(QBitArray &&other) noexcept
{ qSwap(d, other.d); return *this; }
-#endif
- inline void swap(QBitArray &other) Q_DECL_NOTHROW { qSwap(d, other.d); }
+ inline void swap(QBitArray &other) noexcept { qSwap(d, other.d); }
inline int size() const { return (d.size() << 3) - *d.constData(); }
inline int count() const { return (d.size() << 3) - *d.constData(); }
diff --git a/src/corelib/tools/qbytearray.cpp b/src/corelib/tools/qbytearray.cpp
deleted file mode 100644
index 2337d9f9c6..0000000000
--- a/src/corelib/tools/qbytearray.cpp
+++ /dev/null
@@ -1,5074 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Copyright (C) 2016 Intel Corporation.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#include "qbytearray.h"
-#include "qbytearraymatcher.h"
-#include "qtools_p.h"
-#include "qstring.h"
-#include "qlist.h"
-#include "qlocale.h"
-#include "qlocale_p.h"
-#include "qlocale_tools_p.h"
-#include "private/qnumeric_p.h"
-#include "private/qsimd_p.h"
-#include "qstringalgorithms_p.h"
-#include "qscopedpointer.h"
-#include "qbytearray_p.h"
-#include <qdatastream.h>
-#include <qmath.h>
-
-#ifndef QT_NO_COMPRESS
-#include <zconf.h>
-#include <zlib.h>
-#endif
-#include <ctype.h>
-#include <limits.h>
-#include <string.h>
-#include <stdlib.h>
-
-#define IS_RAW_DATA(d) ((d)->offset != sizeof(QByteArrayData))
-
-QT_BEGIN_NAMESPACE
-
-// Latin 1 case system, used by QByteArray::to{Upper,Lower}() and qstr(n)icmp():
-/*
-#!/usr/bin/perl -l
-use feature "unicode_strings";
-for (0..255) {
- $up = uc(chr($_));
- $up = chr($_) if ord($up) > 0x100 || length $up > 1;
- printf "0x%02x,", ord($up);
- print "" if ($_ & 0xf) == 0xf;
-}
-*/
-static const uchar latin1_uppercased[256] = {
- 0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0a,0x0b,0x0c,0x0d,0x0e,0x0f,
- 0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17,0x18,0x19,0x1a,0x1b,0x1c,0x1d,0x1e,0x1f,
- 0x20,0x21,0x22,0x23,0x24,0x25,0x26,0x27,0x28,0x29,0x2a,0x2b,0x2c,0x2d,0x2e,0x2f,
- 0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,0x3a,0x3b,0x3c,0x3d,0x3e,0x3f,
- 0x40,0x41,0x42,0x43,0x44,0x45,0x46,0x47,0x48,0x49,0x4a,0x4b,0x4c,0x4d,0x4e,0x4f,
- 0x50,0x51,0x52,0x53,0x54,0x55,0x56,0x57,0x58,0x59,0x5a,0x5b,0x5c,0x5d,0x5e,0x5f,
- 0x60,0x41,0x42,0x43,0x44,0x45,0x46,0x47,0x48,0x49,0x4a,0x4b,0x4c,0x4d,0x4e,0x4f,
- 0x50,0x51,0x52,0x53,0x54,0x55,0x56,0x57,0x58,0x59,0x5a,0x7b,0x7c,0x7d,0x7e,0x7f,
- 0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,0x88,0x89,0x8a,0x8b,0x8c,0x8d,0x8e,0x8f,
- 0x90,0x91,0x92,0x93,0x94,0x95,0x96,0x97,0x98,0x99,0x9a,0x9b,0x9c,0x9d,0x9e,0x9f,
- 0xa0,0xa1,0xa2,0xa3,0xa4,0xa5,0xa6,0xa7,0xa8,0xa9,0xaa,0xab,0xac,0xad,0xae,0xaf,
- 0xb0,0xb1,0xb2,0xb3,0xb4,0xb5,0xb6,0xb7,0xb8,0xb9,0xba,0xbb,0xbc,0xbd,0xbe,0xbf,
- 0xc0,0xc1,0xc2,0xc3,0xc4,0xc5,0xc6,0xc7,0xc8,0xc9,0xca,0xcb,0xcc,0xcd,0xce,0xcf,
- 0xd0,0xd1,0xd2,0xd3,0xd4,0xd5,0xd6,0xd7,0xd8,0xd9,0xda,0xdb,0xdc,0xdd,0xde,0xdf,
- 0xc0,0xc1,0xc2,0xc3,0xc4,0xc5,0xc6,0xc7,0xc8,0xc9,0xca,0xcb,0xcc,0xcd,0xce,0xcf,
- 0xd0,0xd1,0xd2,0xd3,0xd4,0xd5,0xd6,0xf7,0xd8,0xd9,0xda,0xdb,0xdc,0xdd,0xde,0xff
-};
-
-/*
-#!/usr/bin/perl -l
-use feature "unicode_strings";
-for (0..255) {
- $up = lc(chr($_));
- $up = chr($_) if ord($up) > 0x100 || length $up > 1;
- printf "0x%02x,", ord($up);
- print "" if ($_ & 0xf) == 0xf;
-}
-*/
-static const uchar latin1_lowercased[256] = {
- 0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0a,0x0b,0x0c,0x0d,0x0e,0x0f,
- 0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17,0x18,0x19,0x1a,0x1b,0x1c,0x1d,0x1e,0x1f,
- 0x20,0x21,0x22,0x23,0x24,0x25,0x26,0x27,0x28,0x29,0x2a,0x2b,0x2c,0x2d,0x2e,0x2f,
- 0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,0x3a,0x3b,0x3c,0x3d,0x3e,0x3f,
- 0x40,0x61,0x62,0x63,0x64,0x65,0x66,0x67,0x68,0x69,0x6a,0x6b,0x6c,0x6d,0x6e,0x6f,
- 0x70,0x71,0x72,0x73,0x74,0x75,0x76,0x77,0x78,0x79,0x7a,0x5b,0x5c,0x5d,0x5e,0x5f,
- 0x60,0x61,0x62,0x63,0x64,0x65,0x66,0x67,0x68,0x69,0x6a,0x6b,0x6c,0x6d,0x6e,0x6f,
- 0x70,0x71,0x72,0x73,0x74,0x75,0x76,0x77,0x78,0x79,0x7a,0x7b,0x7c,0x7d,0x7e,0x7f,
- 0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,0x88,0x89,0x8a,0x8b,0x8c,0x8d,0x8e,0x8f,
- 0x90,0x91,0x92,0x93,0x94,0x95,0x96,0x97,0x98,0x99,0x9a,0x9b,0x9c,0x9d,0x9e,0x9f,
- 0xa0,0xa1,0xa2,0xa3,0xa4,0xa5,0xa6,0xa7,0xa8,0xa9,0xaa,0xab,0xac,0xad,0xae,0xaf,
- 0xb0,0xb1,0xb2,0xb3,0xb4,0xb5,0xb6,0xb7,0xb8,0xb9,0xba,0xbb,0xbc,0xbd,0xbe,0xbf,
- 0xe0,0xe1,0xe2,0xe3,0xe4,0xe5,0xe6,0xe7,0xe8,0xe9,0xea,0xeb,0xec,0xed,0xee,0xef,
- 0xf0,0xf1,0xf2,0xf3,0xf4,0xf5,0xf6,0xd7,0xf8,0xf9,0xfa,0xfb,0xfc,0xfd,0xfe,0xdf,
- 0xe0,0xe1,0xe2,0xe3,0xe4,0xe5,0xe6,0xe7,0xe8,0xe9,0xea,0xeb,0xec,0xed,0xee,0xef,
- 0xf0,0xf1,0xf2,0xf3,0xf4,0xf5,0xf6,0xf7,0xf8,0xf9,0xfa,0xfb,0xfc,0xfd,0xfe,0xff
-};
-
-int qFindByteArray(
- const char *haystack0, int haystackLen, int from,
- const char *needle0, int needleLen);
-
-/*
- * This pair of functions is declared in qtools_p.h and is used by the Qt
- * containers to allocate memory and grow the memory block during append
- * operations.
- *
- * They take size_t parameters and return size_t so they will change sizes
- * according to the pointer width. However, knowing Qt containers store the
- * container size and element indexes in ints, these functions never return a
- * size larger than INT_MAX. This is done by casting the element count and
- * memory block size to int in several comparisons: the check for negative is
- * very fast on most platforms as the code only needs to check the sign bit.
- *
- * These functions return SIZE_MAX on overflow, which can be passed to malloc()
- * and will surely cause a NULL return (there's no way you can allocate a
- * memory block the size of your entire VM space).
- */
-
-/*!
- \internal
- \since 5.7
-
- Returns the memory block size for a container containing \a elementCount
- elements, each of \a elementSize bytes, plus a header of \a headerSize
- bytes. That is, this function returns \c
- {elementCount * elementSize + headerSize}
-
- but unlike the simple calculation, it checks for overflows during the
- multiplication and the addition.
-
- Both \a elementCount and \a headerSize can be zero, but \a elementSize
- cannot.
-
- This function returns SIZE_MAX (~0) on overflow or if the memory block size
- would not fit an int.
-*/
-size_t qCalculateBlockSize(size_t elementCount, size_t elementSize, size_t headerSize) Q_DECL_NOTHROW
-{
- unsigned count = unsigned(elementCount);
- unsigned size = unsigned(elementSize);
- unsigned header = unsigned(headerSize);
- Q_ASSERT(elementSize);
- Q_ASSERT(size == elementSize);
- Q_ASSERT(header == headerSize);
-
- if (Q_UNLIKELY(count != elementCount))
- return std::numeric_limits<size_t>::max();
-
- unsigned bytes;
- if (Q_UNLIKELY(mul_overflow(size, count, &bytes)) ||
- Q_UNLIKELY(add_overflow(bytes, header, &bytes)))
- return std::numeric_limits<size_t>::max();
- if (Q_UNLIKELY(int(bytes) < 0)) // catches bytes >= 2GB
- return std::numeric_limits<size_t>::max();
-
- return bytes;
-}
-
-/*!
- \internal
- \since 5.7
-
- Returns the memory block size and the number of elements that will fit in
- that block for a container containing \a elementCount elements, each of \a
- elementSize bytes, plus a header of \a headerSize bytes. This function
- assumes the container will grow and pre-allocates a growth factor.
-
- Both \a elementCount and \a headerSize can be zero, but \a elementSize
- cannot.
-
- This function returns SIZE_MAX (~0) on overflow or if the memory block size
- would not fit an int.
-
- \note The memory block may contain up to \a elementSize - 1 bytes more than
- needed.
-*/
-CalculateGrowingBlockSizeResult
-qCalculateGrowingBlockSize(size_t elementCount, size_t elementSize, size_t headerSize) Q_DECL_NOTHROW
-{
- CalculateGrowingBlockSizeResult result = {
- std::numeric_limits<size_t>::max(),std::numeric_limits<size_t>::max()
- };
-
- unsigned bytes = unsigned(qCalculateBlockSize(elementCount, elementSize, headerSize));
- if (int(bytes) < 0) // catches std::numeric_limits<size_t>::max()
- return result;
-
- unsigned morebytes = qNextPowerOfTwo(bytes);
- if (Q_UNLIKELY(int(morebytes) < 0)) {
- // catches morebytes == 2GB
- // grow by half the difference between bytes and morebytes
- bytes += (morebytes - bytes) / 2;
- } else {
- bytes = morebytes;
- }
-
- result.elementCount = (bytes - unsigned(headerSize)) / unsigned(elementSize);
- result.size = bytes;
- return result;
-}
-
-/*****************************************************************************
- Safe and portable C string functions; extensions to standard string.h
- *****************************************************************************/
-
-/*! \relates QByteArray
-
- Returns a duplicate string.
-
- Allocates space for a copy of \a src, copies it, and returns a
- pointer to the copy. If \a src is \nullptr, it immediately returns
- \nullptr.
-
- Ownership is passed to the caller, so the returned string must be
- deleted using \c delete[].
-*/
-
-char *qstrdup(const char *src)
-{
- if (!src)
- return nullptr;
- char *dst = new char[strlen(src) + 1];
- return qstrcpy(dst, src);
-}
-
-/*! \relates QByteArray
-
- Copies all the characters up to and including the '\\0' from \a
- src into \a dst and returns a pointer to \a dst. If \a src is
- \nullptr, it immediately returns \nullptr.
-
- This function assumes that \a dst is large enough to hold the
- contents of \a src.
-
- \note If \a dst and \a src overlap, the behavior is undefined.
-
- \sa qstrncpy()
-*/
-
-char *qstrcpy(char *dst, const char *src)
-{
- if (!src)
- return nullptr;
-#ifdef Q_CC_MSVC
- const int len = int(strlen(src));
- // This is actually not secure!!! It will be fixed
- // properly in a later release!
- if (len >= 0 && strcpy_s(dst, len+1, src) == 0)
- return dst;
- return nullptr;
-#else
- return strcpy(dst, src);
-#endif
-}
-
-/*! \relates QByteArray
-
- A safe \c strncpy() function.
-
- Copies at most \a len bytes from \a src (stopping at \a len or the
- terminating '\\0' whichever comes first) into \a dst and returns a
- pointer to \a dst. Guarantees that \a dst is '\\0'-terminated. If
- \a src or \a dst is \nullptr, returns \nullptr immediately.
-
- This function assumes that \a dst is at least \a len characters
- long.
-
- \note If \a dst and \a src overlap, the behavior is undefined.
-
- \note When compiling with Visual C++ compiler version 14.00
- (Visual C++ 2005) or later, internally the function strncpy_s
- will be used.
-
- \sa qstrcpy()
-*/
-
-char *qstrncpy(char *dst, const char *src, uint len)
-{
- if (!src || !dst)
- return nullptr;
- if (len > 0) {
-#ifdef Q_CC_MSVC
- strncpy_s(dst, len, src, len - 1);
-#else
- strncpy(dst, src, len);
-#endif
- dst[len-1] = '\0';
- }
- return dst;
-}
-
-/*! \fn uint qstrlen(const char *str)
- \relates QByteArray
-
- A safe \c strlen() function.
-
- Returns the number of characters that precede the terminating '\\0',
- or 0 if \a str is \nullptr.
-
- \sa qstrnlen()
-*/
-
-/*! \fn uint qstrnlen(const char *str, uint maxlen)
- \relates QByteArray
- \since 4.2
-
- A safe \c strnlen() function.
-
- Returns the number of characters that precede the terminating '\\0', but
- at most \a maxlen. If \a str is \nullptr, returns 0.
-
- \sa qstrlen()
-*/
-
-/*!
- \relates QByteArray
-
- A safe \c strcmp() function.
-
- Compares \a str1 and \a str2. Returns a negative value if \a str1
- is less than \a str2, 0 if \a str1 is equal to \a str2 or a
- positive value if \a str1 is greater than \a str2.
-
- Special case 1: Returns 0 if \a str1 and \a str2 are both \nullptr.
-
- Special case 2: Returns an arbitrary non-zero value if \a str1 is
- \nullptr or \a str2 is \nullptr (but not both).
-
- \sa qstrncmp(), qstricmp(), qstrnicmp(), {8-bit Character Comparisons},
- QByteArray::compare()
-*/
-int qstrcmp(const char *str1, const char *str2)
-{
- return (str1 && str2) ? strcmp(str1, str2)
- : (str1 ? 1 : (str2 ? -1 : 0));
-}
-
-/*! \fn int qstrncmp(const char *str1, const char *str2, uint len);
-
- \relates QByteArray
-
- A safe \c strncmp() function.
-
- Compares at most \a len bytes of \a str1 and \a str2.
-
- Returns a negative value if \a str1 is less than \a str2, 0 if \a
- str1 is equal to \a str2 or a positive value if \a str1 is greater
- than \a str2.
-
- Special case 1: Returns 0 if \a str1 and \a str2 are both \nullptr.
-
- Special case 2: Returns a random non-zero value if \a str1 is \nullptr
- or \a str2 is \nullptr (but not both).
-
- \sa qstrcmp(), qstricmp(), qstrnicmp(), {8-bit Character Comparisons},
- QByteArray::compare()
-*/
-
-/*! \relates QByteArray
-
- A safe \c stricmp() function.
-
- Compares \a str1 and \a str2 ignoring the case of the
- characters. The encoding of the strings is assumed to be Latin-1.
-
- Returns a negative value if \a str1 is less than \a str2, 0 if \a
- str1 is equal to \a str2 or a positive value if \a str1 is greater
- than \a str2.
-
- Special case 1: Returns 0 if \a str1 and \a str2 are both \nullptr.
-
- Special case 2: Returns a random non-zero value if \a str1 is \nullptr
- or \a str2 is \nullptr (but not both).
-
- \sa qstrcmp(), qstrncmp(), qstrnicmp(), {8-bit Character Comparisons},
- QByteArray::compare()
-*/
-
-int qstricmp(const char *str1, const char *str2)
-{
- const uchar *s1 = reinterpret_cast<const uchar *>(str1);
- const uchar *s2 = reinterpret_cast<const uchar *>(str2);
- if (!s1)
- return s2 ? -1 : 0;
- if (!s2)
- return 1;
-
- enum { Incomplete = 256 };
- qptrdiff offset = 0;
- auto innerCompare = [=, &offset](qptrdiff max, bool unlimited) {
- max += offset;
- do {
- uchar c = latin1_lowercased[s1[offset]];
- int res = c - latin1_lowercased[s2[offset]];
- if (Q_UNLIKELY(res))
- return res;
- if (Q_UNLIKELY(!c))
- return 0;
- ++offset;
- } while (unlimited || offset < max);
- return int(Incomplete);
- };
-
-#if defined(__SSE4_1__) && !(defined(__SANITIZE_ADDRESS__) || QT_HAS_FEATURE(address_sanitizer))
- enum { PageSize = 4096, PageMask = PageSize - 1 };
- const __m128i zero = _mm_setzero_si128();
- forever {
- // Calculate how many bytes we can load until we cross a page boundary
- // for either source. This isn't an exact calculation, just something
- // very quick.
- quintptr u1 = quintptr(s1 + offset);
- quintptr u2 = quintptr(s2 + offset);
- uint n = PageSize - ((u1 | u2) & PageMask);
-
- qptrdiff maxoffset = offset + n;
- for ( ; offset + 16 <= maxoffset; offset += sizeof(__m128i)) {
- // load 16 bytes from either source
- __m128i a = _mm_loadu_si128(reinterpret_cast<const __m128i *>(s1 + offset));
- __m128i b = _mm_loadu_si128(reinterpret_cast<const __m128i *>(s2 + offset));
-
- // compare the two against each oher
- __m128i cmp = _mm_cmpeq_epi8(a, b);
-
- // find NUL terminators too
- cmp = _mm_min_epu8(cmp, a);
- cmp = _mm_cmpeq_epi8(cmp, zero);
-
- // was there any difference or a NUL?
- uint mask = _mm_movemask_epi8(cmp);
- if (mask) {
- // yes, find out where
- uint start = qCountTrailingZeroBits(mask);
- uint end = sizeof(mask) * 8 - qCountLeadingZeroBits(mask);
- Q_ASSUME(end >= start);
- offset += start;
- n = end - start;
- break;
- }
- }
-
- // using SIMD could cause a page fault, so iterate byte by byte
- int res = innerCompare(n, false);
- if (res != Incomplete)
- return res;
- }
-#endif
-
- return innerCompare(-1, true);
-}
-
-/*! \relates QByteArray
-
- A safe \c strnicmp() function.
-
- Compares at most \a len bytes of \a str1 and \a str2 ignoring the
- case of the characters. The encoding of the strings is assumed to
- be Latin-1.
-
- Returns a negative value if \a str1 is less than \a str2, 0 if \a str1
- is equal to \a str2 or a positive value if \a str1 is greater than \a
- str2.
-
- Special case 1: Returns 0 if \a str1 and \a str2 are both \nullptr.
-
- Special case 2: Returns a random non-zero value if \a str1 is \nullptr
- or \a str2 is \nullptr (but not both).
-
- \sa qstrcmp(), qstrncmp(), qstricmp(), {8-bit Character Comparisons},
- QByteArray::compare()
-*/
-
-int qstrnicmp(const char *str1, const char *str2, uint len)
-{
- const uchar *s1 = reinterpret_cast<const uchar *>(str1);
- const uchar *s2 = reinterpret_cast<const uchar *>(str2);
- int res;
- uchar c;
- if (!s1 || !s2)
- return s1 ? 1 : (s2 ? -1 : 0);
- for (; len--; s1++, s2++) {
- if ((res = (c = latin1_lowercased[*s1]) - latin1_lowercased[*s2]))
- return res;
- if (!c) // strings are equal
- break;
- }
- return 0;
-}
-
-/*!
- \internal
- \since 5.12
-
- A helper for QByteArray::compare. Compares \a len1 bytes from \a str1 to \a
- len2 bytes from \a str2. If \a len2 is -1, then \a str2 is expected to be
- '\\0'-terminated.
- */
-int qstrnicmp(const char *str1, qsizetype len1, const char *str2, qsizetype len2)
-{
- Q_ASSERT(str1);
- Q_ASSERT(len1 >= 0);
- Q_ASSERT(len2 >= -1);
- const uchar *s1 = reinterpret_cast<const uchar *>(str1);
- const uchar *s2 = reinterpret_cast<const uchar *>(str2);
- if (!s2)
- return len1 == 0 ? 0 : 1;
-
- int res;
- uchar c;
- if (len2 == -1) {
- // null-terminated str2
- qsizetype i;
- for (i = 0; i < len1; ++i) {
- c = latin1_lowercased[s2[i]];
- if (!c)
- return 1;
-
- res = latin1_lowercased[s1[i]] - c;
- if (res)
- return res;
- }
- c = latin1_lowercased[s2[i]];
- return c ? -1 : 0;
- } else {
- // not null-terminated
- for (qsizetype i = 0; i < qMin(len1, len2); ++i) {
- c = latin1_lowercased[s2[i]];
- res = latin1_lowercased[s1[i]] - c;
- if (res)
- return res;
- }
- if (len1 == len2)
- return 0;
- return len1 < len2 ? -1 : 1;
- }
-}
-
-/*!
- \internal
- ### Qt6: replace the QByteArray parameter with [pointer,len] pair
- */
-int qstrcmp(const QByteArray &str1, const char *str2)
-{
- if (!str2)
- return str1.isEmpty() ? 0 : +1;
-
- const char *str1data = str1.constData();
- const char *str1end = str1data + str1.length();
- for ( ; str1data < str1end && *str2; ++str1data, ++str2) {
- int diff = int(uchar(*str1data)) - uchar(*str2);
- if (diff)
- // found a difference
- return diff;
- }
-
- // Why did we stop?
- if (*str2 != '\0')
- // not the null, so we stopped because str1 is shorter
- return -1;
- if (str1data < str1end)
- // we haven't reached the end, so str1 must be longer
- return +1;
- return 0;
-}
-
-/*!
- \internal
- ### Qt6: replace the QByteArray parameter with [pointer,len] pair
- */
-int qstrcmp(const QByteArray &str1, const QByteArray &str2)
-{
- int l1 = str1.length();
- int l2 = str2.length();
- int ret = memcmp(str1.constData(), str2.constData(), qMin(l1, l2));
- if (ret != 0)
- return ret;
-
- // they matched qMin(l1, l2) bytes
- // so the longer one is lexically after the shorter one
- return l1 - l2;
-}
-
-// the CRC table below is created by the following piece of code
-#if 0
-static void createCRC16Table() // build CRC16 lookup table
-{
- unsigned int i;
- unsigned int j;
- unsigned short crc_tbl[16];
- unsigned int v0, v1, v2, v3;
- for (i = 0; i < 16; i++) {
- v0 = i & 1;
- v1 = (i >> 1) & 1;
- v2 = (i >> 2) & 1;
- v3 = (i >> 3) & 1;
- j = 0;
-#undef SET_BIT
-#define SET_BIT(x, b, v) (x) |= (v) << (b)
- SET_BIT(j, 0, v0);
- SET_BIT(j, 7, v0);
- SET_BIT(j, 12, v0);
- SET_BIT(j, 1, v1);
- SET_BIT(j, 8, v1);
- SET_BIT(j, 13, v1);
- SET_BIT(j, 2, v2);
- SET_BIT(j, 9, v2);
- SET_BIT(j, 14, v2);
- SET_BIT(j, 3, v3);
- SET_BIT(j, 10, v3);
- SET_BIT(j, 15, v3);
- crc_tbl[i] = j;
- }
- printf("static const quint16 crc_tbl[16] = {\n");
- for (int i = 0; i < 16; i +=4)
- printf(" 0x%04x, 0x%04x, 0x%04x, 0x%04x,\n", crc_tbl[i], crc_tbl[i+1], crc_tbl[i+2], crc_tbl[i+3]);
- printf("};\n");
-}
-#endif
-
-static const quint16 crc_tbl[16] = {
- 0x0000, 0x1081, 0x2102, 0x3183,
- 0x4204, 0x5285, 0x6306, 0x7387,
- 0x8408, 0x9489, 0xa50a, 0xb58b,
- 0xc60c, 0xd68d, 0xe70e, 0xf78f
-};
-
-/*!
- \relates QByteArray
-
- Returns the CRC-16 checksum of the first \a len bytes of \a data.
-
- The checksum is independent of the byte order (endianness) and will be
- calculated accorded to the algorithm published in ISO 3309 (Qt::ChecksumIso3309).
-
- \note This function is a 16-bit cache conserving (16 entry table)
- implementation of the CRC-16-CCITT algorithm.
-*/
-quint16 qChecksum(const char *data, uint len)
-{
- return qChecksum(data, len, Qt::ChecksumIso3309);
-}
-
-/*!
- \relates QByteArray
- \since 5.9
-
- Returns the CRC-16 checksum of the first \a len bytes of \a data.
-
- The checksum is independent of the byte order (endianness) and will
- be calculated accorded to the algorithm published in \a standard.
-
- \note This function is a 16-bit cache conserving (16 entry table)
- implementation of the CRC-16-CCITT algorithm.
-*/
-quint16 qChecksum(const char *data, uint len, Qt::ChecksumType standard)
-{
- quint16 crc = 0x0000;
- switch (standard) {
- case Qt::ChecksumIso3309:
- crc = 0xffff;
- break;
- case Qt::ChecksumItuV41:
- crc = 0x6363;
- break;
- }
- uchar c;
- const uchar *p = reinterpret_cast<const uchar *>(data);
- while (len--) {
- c = *p++;
- crc = ((crc >> 4) & 0x0fff) ^ crc_tbl[((crc ^ c) & 15)];
- c >>= 4;
- crc = ((crc >> 4) & 0x0fff) ^ crc_tbl[((crc ^ c) & 15)];
- }
- switch (standard) {
- case Qt::ChecksumIso3309:
- crc = ~crc;
- break;
- case Qt::ChecksumItuV41:
- break;
- }
- return crc & 0xffff;
-}
-
-/*!
- \fn QByteArray qCompress(const QByteArray& data, int compressionLevel)
-
- \relates QByteArray
-
- Compresses the \a data byte array and returns the compressed data
- in a new byte array.
-
- The \a compressionLevel parameter specifies how much compression
- should be used. Valid values are between 0 and 9, with 9
- corresponding to the greatest compression (i.e. smaller compressed
- data) at the cost of using a slower algorithm. Smaller values (8,
- 7, ..., 1) provide successively less compression at slightly
- faster speeds. The value 0 corresponds to no compression at all.
- The default value is -1, which specifies zlib's default
- compression.
-
- \sa qUncompress()
-*/
-
-/*! \relates QByteArray
-
- \overload
-
- Compresses the first \a nbytes of \a data at compression level
- \a compressionLevel and returns the compressed data in a new byte array.
-*/
-
-#ifndef QT_NO_COMPRESS
-QByteArray qCompress(const uchar* data, int nbytes, int compressionLevel)
-{
- if (nbytes == 0) {
- return QByteArray(4, '\0');
- }
- if (!data) {
- qWarning("qCompress: Data is null");
- return QByteArray();
- }
- if (compressionLevel < -1 || compressionLevel > 9)
- compressionLevel = -1;
-
- ulong len = nbytes + nbytes / 100 + 13;
- QByteArray bazip;
- int res;
- do {
- bazip.resize(len + 4);
- res = ::compress2((uchar*)bazip.data()+4, &len, data, nbytes, compressionLevel);
-
- switch (res) {
- case Z_OK:
- bazip.resize(len + 4);
- bazip[0] = (nbytes & 0xff000000) >> 24;
- bazip[1] = (nbytes & 0x00ff0000) >> 16;
- bazip[2] = (nbytes & 0x0000ff00) >> 8;
- bazip[3] = (nbytes & 0x000000ff);
- break;
- case Z_MEM_ERROR:
- qWarning("qCompress: Z_MEM_ERROR: Not enough memory");
- bazip.resize(0);
- break;
- case Z_BUF_ERROR:
- len *= 2;
- break;
- }
- } while (res == Z_BUF_ERROR);
-
- return bazip;
-}
-#endif
-
-/*!
- \fn QByteArray qUncompress(const QByteArray &data)
-
- \relates QByteArray
-
- Uncompresses the \a data byte array and returns a new byte array
- with the uncompressed data.
-
- Returns an empty QByteArray if the input data was corrupt.
-
- This function will uncompress data compressed with qCompress()
- from this and any earlier Qt version, back to Qt 3.1 when this
- feature was added.
-
- \b{Note:} If you want to use this function to uncompress external
- data that was compressed using zlib, you first need to prepend a four
- byte header to the byte array containing the data. The header must
- contain the expected length (in bytes) of the uncompressed data,
- expressed as an unsigned, big-endian, 32-bit integer.
-
- \sa qCompress()
-*/
-
-#ifndef QT_NO_COMPRESS
-namespace {
-struct QByteArrayDataDeleter
-{
- static inline void cleanup(QTypedArrayData<char> *d)
- { if (d) QTypedArrayData<char>::deallocate(d); }
-};
-}
-
-static QByteArray invalidCompressedData()
-{
- qWarning("qUncompress: Input data is corrupted");
- return QByteArray();
-}
-
-/*! \relates QByteArray
-
- \overload
-
- Uncompresses the first \a nbytes of \a data and returns a new byte
- array with the uncompressed data.
-*/
-QByteArray qUncompress(const uchar* data, int nbytes)
-{
- if (!data) {
- qWarning("qUncompress: Data is null");
- return QByteArray();
- }
- if (nbytes <= 4) {
- if (nbytes < 4 || (data[0]!=0 || data[1]!=0 || data[2]!=0 || data[3]!=0))
- qWarning("qUncompress: Input data is corrupted");
- return QByteArray();
- }
- ulong expectedSize = uint((data[0] << 24) | (data[1] << 16) |
- (data[2] << 8) | (data[3] ));
- ulong len = qMax(expectedSize, 1ul);
- const ulong maxPossibleSize = MaxAllocSize - sizeof(QByteArray::Data);
- if (Q_UNLIKELY(len >= maxPossibleSize)) {
- // QByteArray does not support that huge size anyway.
- return invalidCompressedData();
- }
-
- QScopedPointer<QByteArray::Data, QByteArrayDataDeleter> d(QByteArray::Data::allocate(expectedSize + 1));
- if (Q_UNLIKELY(d.data() == nullptr))
- return invalidCompressedData();
-
- d->size = expectedSize;
- forever {
- ulong alloc = len;
-
- int res = ::uncompress((uchar*)d->data(), &len,
- data+4, nbytes-4);
-
- switch (res) {
- case Z_OK:
- Q_ASSERT(len <= alloc);
- Q_UNUSED(alloc);
- d->size = len;
- d->data()[len] = 0;
- {
- QByteArrayDataPtr dataPtr = { d.take() };
- return QByteArray(dataPtr);
- }
-
- case Z_MEM_ERROR:
- qWarning("qUncompress: Z_MEM_ERROR: Not enough memory");
- return QByteArray();
-
- case Z_BUF_ERROR:
- len *= 2;
- if (Q_UNLIKELY(len >= maxPossibleSize)) {
- // QByteArray does not support that huge size anyway.
- return invalidCompressedData();
- } else {
- // grow the block
- QByteArray::Data *p = QByteArray::Data::reallocateUnaligned(d.data(), len + 1);
- if (Q_UNLIKELY(p == nullptr))
- return invalidCompressedData();
- d.take(); // don't free
- d.reset(p);
- }
- continue;
-
- case Z_DATA_ERROR:
- qWarning("qUncompress: Z_DATA_ERROR: Input data is corrupted");
- return QByteArray();
- }
- }
-}
-#endif
-
-/*!
- \class QByteArray
- \inmodule QtCore
- \brief The QByteArray class provides an array of bytes.
-
- \ingroup tools
- \ingroup shared
- \ingroup string-processing
-
- \reentrant
-
- QByteArray can be used to store both raw bytes (including '\\0's)
- and traditional 8-bit '\\0'-terminated strings. Using QByteArray
- is much more convenient than using \c{const char *}. Behind the
- scenes, it always ensures that the data is followed by a '\\0'
- terminator, and uses \l{implicit sharing} (copy-on-write) to
- reduce memory usage and avoid needless copying of data.
-
- In addition to QByteArray, Qt also provides the QString class to
- store string data. For most purposes, QString is the class you
- want to use. It stores 16-bit Unicode characters, making it easy
- to store non-ASCII/non-Latin-1 characters in your application.
- Furthermore, QString is used throughout in the Qt API. The two
- main cases where QByteArray is appropriate are when you need to
- store raw binary data, and when memory conservation is critical
- (e.g., with Qt for Embedded Linux).
-
- One way to initialize a QByteArray is simply to pass a \c{const
- char *} to its constructor. For example, the following code
- creates a byte array of size 5 containing the data "Hello":
-
- \snippet code/src_corelib_tools_qbytearray.cpp 0
-
- Although the size() is 5, the byte array also maintains an extra
- '\\0' character at the end so that if a function is used that
- asks for a pointer to the underlying data (e.g. a call to
- data()), the data pointed to is guaranteed to be
- '\\0'-terminated.
-
- QByteArray makes a deep copy of the \c{const char *} data, so you
- can modify it later without experiencing side effects. (If for
- performance reasons you don't want to take a deep copy of the
- character data, use QByteArray::fromRawData() instead.)
-
- Another approach is to set the size of the array using resize()
- and to initialize the data byte per byte. QByteArray uses 0-based
- indexes, just like C++ arrays. To access the byte at a particular
- index position, you can use operator[](). On non-const byte
- arrays, operator[]() returns a reference to a byte that can be
- used on the left side of an assignment. For example:
-
- \snippet code/src_corelib_tools_qbytearray.cpp 1
-
- For read-only access, an alternative syntax is to use at():
-
- \snippet code/src_corelib_tools_qbytearray.cpp 2
-
- at() can be faster than operator[](), because it never causes a
- \l{deep copy} to occur.
-
- To extract many bytes at a time, use left(), right(), or mid().
-
- A QByteArray can embed '\\0' bytes. The size() function always
- returns the size of the whole array, including embedded '\\0'
- bytes, but excluding the terminating '\\0' added by QByteArray.
- For example:
-
- \snippet code/src_corelib_tools_qbytearray.cpp 48
-
- If you want to obtain the length of the data up to and
- excluding the first '\\0' character, call qstrlen() on the byte
- array.
-
- After a call to resize(), newly allocated bytes have undefined
- values. To set all the bytes to a particular value, call fill().
-
- To obtain a pointer to the actual character data, call data() or
- constData(). These functions return a pointer to the beginning of the data.
- The pointer is guaranteed to remain valid until a non-const function is
- called on the QByteArray. It is also guaranteed that the data ends with a
- '\\0' byte unless the QByteArray was created from a \l{fromRawData()}{raw
- data}. This '\\0' byte is automatically provided by QByteArray and is not
- counted in size().
-
- QByteArray provides the following basic functions for modifying
- the byte data: append(), prepend(), insert(), replace(), and
- remove(). For example:
-
- \snippet code/src_corelib_tools_qbytearray.cpp 3
-
- The replace() and remove() functions' first two arguments are the
- position from which to start erasing and the number of bytes that
- should be erased.
-
- When you append() data to a non-empty array, the array will be
- reallocated and the new data copied to it. You can avoid this
- behavior by calling reserve(), which preallocates a certain amount
- of memory. You can also call capacity() to find out how much
- memory QByteArray actually allocated. Data appended to an empty
- array is not copied.
-
- A frequent requirement is to remove whitespace characters from a
- byte array ('\\n', '\\t', ' ', etc.). If you want to remove
- whitespace from both ends of a QByteArray, use trimmed(). If you
- want to remove whitespace from both ends and replace multiple
- consecutive whitespaces with a single space character within the
- byte array, use simplified().
-
- If you want to find all occurrences of a particular character or
- substring in a QByteArray, use indexOf() or lastIndexOf(). The
- former searches forward starting from a given index position, the
- latter searches backward. Both return the index position of the
- character or substring if they find it; otherwise, they return -1.
- For example, here's a typical loop that finds all occurrences of a
- particular substring:
-
- \snippet code/src_corelib_tools_qbytearray.cpp 4
-
- If you simply want to check whether a QByteArray contains a
- particular character or substring, use contains(). If you want to
- find out how many times a particular character or substring
- occurs in the byte array, use count(). If you want to replace all
- occurrences of a particular value with another, use one of the
- two-parameter replace() overloads.
-
- \l{QByteArray}s can be compared using overloaded operators such as
- operator<(), operator<=(), operator==(), operator>=(), and so on.
- The comparison is based exclusively on the numeric values
- of the characters and is very fast, but is not what a human would
- expect. QString::localeAwareCompare() is a better choice for
- sorting user-interface strings.
-
- For historical reasons, QByteArray distinguishes between a null
- byte array and an empty byte array. A \e null byte array is a
- byte array that is initialized using QByteArray's default
- constructor or by passing (const char *)0 to the constructor. An
- \e empty byte array is any byte array with size 0. A null byte
- array is always empty, but an empty byte array isn't necessarily
- null:
-
- \snippet code/src_corelib_tools_qbytearray.cpp 5
-
- All functions except isNull() treat null byte arrays the same as
- empty byte arrays. For example, data() returns a valid pointer
- (\e not nullptr) to a '\\0' character for a byte array
- and QByteArray() compares equal to QByteArray(""). We recommend
- that you always use isEmpty() and avoid isNull().
-
- \section1 Maximum size and out-of-memory conditions
-
- The current version of QByteArray is limited to just under 2 GB (2^31
- bytes) in size. The exact value is architecture-dependent, since it depends
- on the overhead required for managing the data block, but is no more than
- 32 bytes. Raw data blocks are also limited by the use of \c int type in the
- current version to 2 GB minus 1 byte.
-
- In case memory allocation fails, QByteArray will throw a \c std::bad_alloc
- exception. Out of memory conditions in the Qt containers are the only case
- where Qt will throw exceptions.
-
- Note that the operating system may impose further limits on applications
- holding a lot of allocated memory, especially large, contiguous blocks.
- Such considerations, the configuration of such behavior or any mitigation
- are outside the scope of the QByteArray API.
-
- \section1 Notes on Locale
-
- \section2 Number-String Conversions
-
- Functions that perform conversions between numeric data types and
- strings are performed in the C locale, irrespective of the user's
- locale settings. Use QString to perform locale-aware conversions
- between numbers and strings.
-
- \section2 8-bit Character Comparisons
-
- In QByteArray, the notion of uppercase and lowercase and of which
- character is greater than or less than another character is done
- in the Latin-1 locale. This affects functions that support a case
- insensitive option or that compare or lowercase or uppercase
- their arguments. Case insensitive operations and comparisons will
- be accurate if both strings contain only Latin-1 characters.
- Functions that this affects include contains(), indexOf(),
- lastIndexOf(), operator<(), operator<=(), operator>(),
- operator>=(), isLower(), isUpper(), toLower() and toUpper().
-
- This issue does not apply to \l{QString}s since they represent
- characters using Unicode.
-
- \sa QString, QBitArray
-*/
-
-/*!
- \enum QByteArray::Base64Option
- \since 5.2
-
- This enum contains the options available for encoding and decoding Base64.
- Base64 is defined by \l{RFC 4648}, with the following options:
-
- \value Base64Encoding (default) The regular Base64 alphabet, called simply "base64"
- \value Base64UrlEncoding An alternate alphabet, called "base64url", which replaces two
- characters in the alphabet to be more friendly to URLs.
- \value KeepTrailingEquals (default) Keeps the trailing padding equal signs at the end
- of the encoded data, so the data is always a size multiple of
- four.
- \value OmitTrailingEquals Omits adding the padding equal signs at the end of the encoded
- data.
-
- QByteArray::fromBase64() ignores the KeepTrailingEquals and
- OmitTrailingEquals options and will not flag errors in case they are
- missing or if there are too many of them.
-*/
-
-/*! \fn QByteArray::iterator QByteArray::begin()
-
- Returns an \l{STL-style iterators}{STL-style iterator} pointing to the first character in
- the byte-array.
-
- \sa constBegin(), end()
-*/
-
-/*! \fn QByteArray::const_iterator QByteArray::begin() const
-
- \overload begin()
-*/
-
-/*! \fn QByteArray::const_iterator QByteArray::cbegin() const
- \since 5.0
-
- Returns a const \l{STL-style iterators}{STL-style iterator} pointing to the first character
- in the byte-array.
-
- \sa begin(), cend()
-*/
-
-/*! \fn QByteArray::const_iterator QByteArray::constBegin() const
-
- Returns a const \l{STL-style iterators}{STL-style iterator} pointing to the first character
- in the byte-array.
-
- \sa begin(), constEnd()
-*/
-
-/*! \fn QByteArray::iterator QByteArray::end()
-
- Returns an \l{STL-style iterators}{STL-style iterator} pointing to the imaginary character
- after the last character in the byte-array.
-
- \sa begin(), constEnd()
-*/
-
-/*! \fn QByteArray::const_iterator QByteArray::end() const
-
- \overload end()
-*/
-
-/*! \fn QByteArray::const_iterator QByteArray::cend() const
- \since 5.0
-
- Returns a const \l{STL-style iterators}{STL-style iterator} pointing to the imaginary
- character after the last character in the list.
-
- \sa cbegin(), end()
-*/
-
-/*! \fn QByteArray::const_iterator QByteArray::constEnd() const
-
- Returns a const \l{STL-style iterators}{STL-style iterator} pointing to the imaginary
- character after the last character in the list.
-
- \sa constBegin(), end()
-*/
-
-/*! \fn QByteArray::reverse_iterator QByteArray::rbegin()
- \since 5.6
-
- Returns a \l{STL-style iterators}{STL-style} reverse iterator pointing to the first
- character in the byte-array, in reverse order.
-
- \sa begin(), crbegin(), rend()
-*/
-
-/*! \fn QByteArray::const_reverse_iterator QByteArray::rbegin() const
- \since 5.6
- \overload
-*/
-
-/*! \fn QByteArray::const_reverse_iterator QByteArray::crbegin() const
- \since 5.6
-
- Returns a const \l{STL-style iterators}{STL-style} reverse iterator pointing to the first
- character in the byte-array, in reverse order.
-
- \sa begin(), rbegin(), rend()
-*/
-
-/*! \fn QByteArray::reverse_iterator QByteArray::rend()
- \since 5.6
-
- Returns a \l{STL-style iterators}{STL-style} reverse iterator pointing to one past
- the last character in the byte-array, in reverse order.
-
- \sa end(), crend(), rbegin()
-*/
-
-/*! \fn QByteArray::const_reverse_iterator QByteArray::rend() const
- \since 5.6
- \overload
-*/
-
-/*! \fn QByteArray::const_reverse_iterator QByteArray::crend() const
- \since 5.6
-
- Returns a const \l{STL-style iterators}{STL-style} reverse iterator pointing to one
- past the last character in the byte-array, in reverse order.
-
- \sa end(), rend(), rbegin()
-*/
-
-/*! \fn void QByteArray::push_back(const QByteArray &other)
-
- This function is provided for STL compatibility. It is equivalent
- to append(\a other).
-*/
-
-/*! \fn void QByteArray::push_back(const char *str)
-
- \overload
-
- Same as append(\a str).
-*/
-
-/*! \fn void QByteArray::push_back(char ch)
-
- \overload
-
- Same as append(\a ch).
-*/
-
-/*! \fn void QByteArray::push_front(const QByteArray &other)
-
- This function is provided for STL compatibility. It is equivalent
- to prepend(\a other).
-*/
-
-/*! \fn void QByteArray::push_front(const char *str)
-
- \overload
-
- Same as prepend(\a str).
-*/
-
-/*! \fn void QByteArray::push_front(char ch)
-
- \overload
-
- Same as prepend(\a ch).
-*/
-
-/*! \fn void QByteArray::shrink_to_fit()
- \since 5.10
-
- This function is provided for STL compatibility. It is equivalent to
- squeeze().
-*/
-
-/*! \fn QByteArray::QByteArray(const QByteArray &other)
-
- Constructs a copy of \a other.
-
- This operation takes \l{constant time}, because QByteArray is
- \l{implicitly shared}. This makes returning a QByteArray from a
- function very fast. If a shared instance is modified, it will be
- copied (copy-on-write), taking \l{linear time}.
-
- \sa operator=()
-*/
-
-/*!
- \fn QByteArray::QByteArray(QByteArray &&other)
-
- Move-constructs a QByteArray instance, making it point at the same
- object that \a other was pointing to.
-
- \since 5.2
-*/
-
-/*! \fn QByteArray::QByteArray(QByteArrayDataPtr dd)
-
- \internal
-
- Constructs a byte array pointing to the same data as \a dd.
-*/
-
-/*! \fn QByteArray::~QByteArray()
- Destroys the byte array.
-*/
-
-/*!
- Assigns \a other to this byte array and returns a reference to
- this byte array.
-*/
-QByteArray &QByteArray::operator=(const QByteArray & other) Q_DECL_NOTHROW
-{
- other.d->ref.ref();
- if (!d->ref.deref())
- Data::deallocate(d);
- d = other.d;
- return *this;
-}
-
-
-/*!
- \overload
-
- Assigns \a str to this byte array.
-*/
-
-QByteArray &QByteArray::operator=(const char *str)
-{
- Data *x;
- if (!str) {
- x = Data::sharedNull();
- } else if (!*str) {
- x = Data::allocate(0);
- } else {
- const int len = int(strlen(str));
- const uint fullLen = len + 1;
- if (d->ref.isShared() || fullLen > d->alloc
- || (len < d->size && fullLen < uint(d->alloc >> 1)))
- reallocData(fullLen, d->detachFlags());
- x = d;
- memcpy(x->data(), str, fullLen); // include null terminator
- x->size = len;
- }
- x->ref.ref();
- if (!d->ref.deref())
- Data::deallocate(d);
- d = x;
- return *this;
-}
-
-/*!
- \fn QByteArray &QByteArray::operator=(QByteArray &&other)
-
- Move-assigns \a other to this QByteArray instance.
-
- \since 5.2
-*/
-
-/*! \fn void QByteArray::swap(QByteArray &other)
- \since 4.8
-
- Swaps byte array \a other with this byte array. This operation is very
- fast and never fails.
-*/
-
-/*! \fn int QByteArray::size() const
-
- Returns the number of bytes in this byte array.
-
- The last byte in the byte array is at position size() - 1. In addition,
- QByteArray ensures that the byte at position size() is always '\\0', so
- that you can use the return value of data() and constData() as arguments to
- functions that expect '\\0'-terminated strings. If the QByteArray object
- was created from a \l{fromRawData()}{raw data} that didn't include the
- trailing null-termination character then QByteArray doesn't add it
- automaticall unless the \l{deep copy} is created.
-
- Example:
- \snippet code/src_corelib_tools_qbytearray.cpp 6
-
- \sa isEmpty(), resize()
-*/
-
-/*! \fn bool QByteArray::isEmpty() const
-
- Returns \c true if the byte array has size 0; otherwise returns \c false.
-
- Example:
- \snippet code/src_corelib_tools_qbytearray.cpp 7
-
- \sa size()
-*/
-
-/*! \fn int QByteArray::capacity() const
-
- Returns the maximum number of bytes that can be stored in the
- byte array without forcing a reallocation.
-
- The sole purpose of this function is to provide a means of fine
- tuning QByteArray's memory usage. In general, you will rarely
- ever need to call this function. If you want to know how many
- bytes are in the byte array, call size().
-
- \sa reserve(), squeeze()
-*/
-
-/*! \fn void QByteArray::reserve(int size)
-
- Attempts to allocate memory for at least \a size bytes. If you
- know in advance how large the byte array will be, you can call
- this function, and if you call resize() often you are likely to
- get better performance. If \a size is an underestimate, the worst
- that will happen is that the QByteArray will be a bit slower.
-
- The sole purpose of this function is to provide a means of fine
- tuning QByteArray's memory usage. In general, you will rarely
- ever need to call this function. If you want to change the size
- of the byte array, call resize().
-
- \sa squeeze(), capacity()
-*/
-
-/*! \fn void QByteArray::squeeze()
-
- Releases any memory not required to store the array's data.
-
- The sole purpose of this function is to provide a means of fine
- tuning QByteArray's memory usage. In general, you will rarely
- ever need to call this function.
-
- \sa reserve(), capacity()
-*/
-
-/*! \fn QByteArray::operator const char *() const
- \fn QByteArray::operator const void *() const
-
- \obsolete Use constData() instead.
-
- Returns a pointer to the data stored in the byte array. The
- pointer can be used to access the bytes that compose the array.
- The data is '\\0'-terminated. The pointer remains valid as long
- as the array isn't reallocated or destroyed.
-
- This operator is mostly useful to pass a byte array to a function
- that accepts a \c{const char *}.
-
- You can disable this operator by defining \c
- QT_NO_CAST_FROM_BYTEARRAY when you compile your applications.
-
- Note: A QByteArray can store any byte values including '\\0's,
- but most functions that take \c{char *} arguments assume that the
- data ends at the first '\\0' they encounter.
-
- \sa constData()
-*/
-
-/*!
- \macro QT_NO_CAST_FROM_BYTEARRAY
- \relates QByteArray
-
- Disables automatic conversions from QByteArray to
- const char * or const void *.
-
- \sa QT_NO_CAST_TO_ASCII, QT_NO_CAST_FROM_ASCII
-*/
-
-/*! \fn char *QByteArray::data()
-
- Returns a pointer to the data stored in the byte array. The
- pointer can be used to access and modify the bytes that compose
- the array. The data is '\\0'-terminated, i.e. the number of
- bytes in the returned character string is size() + 1 for the
- '\\0' terminator.
-
- Example:
- \snippet code/src_corelib_tools_qbytearray.cpp 8
-
- The pointer remains valid as long as the byte array isn't
- reallocated or destroyed. For read-only access, constData() is
- faster because it never causes a \l{deep copy} to occur.
-
- This function is mostly useful to pass a byte array to a function
- that accepts a \c{const char *}.
-
- The following example makes a copy of the char* returned by
- data(), but it will corrupt the heap and cause a crash because it
- does not allocate a byte for the '\\0' at the end:
-
- \snippet code/src_corelib_tools_qbytearray.cpp 46
-
- This one allocates the correct amount of space:
-
- \snippet code/src_corelib_tools_qbytearray.cpp 47
-
- Note: A QByteArray can store any byte values including '\\0's,
- but most functions that take \c{char *} arguments assume that the
- data ends at the first '\\0' they encounter.
-
- \sa constData(), operator[]()
-*/
-
-/*! \fn const char *QByteArray::data() const
-
- \overload
-*/
-
-/*! \fn const char *QByteArray::constData() const
-
- Returns a pointer to the data stored in the byte array. The pointer can be
- used to access the bytes that compose the array. The data is
- '\\0'-terminated unless the QByteArray object was created from raw data.
- The pointer remains valid as long as the byte array isn't reallocated or
- destroyed.
-
- This function is mostly useful to pass a byte array to a function
- that accepts a \c{const char *}.
-
- Note: A QByteArray can store any byte values including '\\0's,
- but most functions that take \c{char *} arguments assume that the
- data ends at the first '\\0' they encounter.
-
- \sa data(), operator[](), fromRawData()
-*/
-
-/*! \fn void QByteArray::detach()
-
- \internal
-*/
-
-/*! \fn bool QByteArray::isDetached() const
-
- \internal
-*/
-
-/*! \fn bool QByteArray::isSharedWith(const QByteArray &other) const
-
- \internal
-*/
-
-/*! \fn char QByteArray::at(int i) const
-
- Returns the character at index position \a i in the byte array.
-
- \a i must be a valid index position in the byte array (i.e., 0 <=
- \a i < size()).
-
- \sa operator[]()
-*/
-
-/*! \fn QByteRef QByteArray::operator[](int i)
-
- Returns the byte at index position \a i as a modifiable reference.
-
- If an assignment is made beyond the end of the byte array, the
- array is extended with resize() before the assignment takes
- place.
-
- Example:
- \snippet code/src_corelib_tools_qbytearray.cpp 9
-
- The return value is of type QByteRef, a helper class for
- QByteArray. When you get an object of type QByteRef, you can use
- it as if it were a char &. If you assign to it, the assignment
- will apply to the character in the QByteArray from which you got
- the reference.
-
- \sa at()
-*/
-
-/*! \fn char QByteArray::operator[](int i) const
-
- \overload
-
- Same as at(\a i).
-*/
-
-/*! \fn QByteRef QByteArray::operator[](uint i)
-
- \overload
-*/
-
-/*! \fn char QByteArray::operator[](uint i) const
-
- \overload
-*/
-
-/*!
- \fn char QByteArray::front() const
- \since 5.10
-
- Returns the first character in the byte array.
- Same as \c{at(0)}.
-
- This function is provided for STL compatibility.
-
- \warning Calling this function on an empty byte array constitutes
- undefined behavior.
-
- \sa back(), at(), operator[]()
-*/
-
-/*!
- \fn char QByteArray::back() const
- \since 5.10
-
- Returns the last character in the byte array.
- Same as \c{at(size() - 1)}.
-
- This function is provided for STL compatibility.
-
- \warning Calling this function on an empty byte array constitutes
- undefined behavior.
-
- \sa front(), at(), operator[]()
-*/
-
-/*!
- \fn QByteRef QByteArray::front()
- \since 5.10
-
- Returns a reference to the first character in the byte array.
- Same as \c{operator[](0)}.
-
- This function is provided for STL compatibility.
-
- \warning Calling this function on an empty byte array constitutes
- undefined behavior.
-
- \sa back(), at(), operator[]()
-*/
-
-/*!
- \fn QByteRef QByteArray::back()
- \since 5.10
-
- Returns a reference to the last character in the byte array.
- Same as \c{operator[](size() - 1)}.
-
- This function is provided for STL compatibility.
-
- \warning Calling this function on an empty byte array constitutes
- undefined behavior.
-
- \sa front(), at(), operator[]()
-*/
-
-/*! \fn bool QByteArray::contains(const QByteArray &ba) const
-
- Returns \c true if the byte array contains an occurrence of the byte
- array \a ba; otherwise returns \c false.
-
- \sa indexOf(), count()
-*/
-
-/*! \fn bool QByteArray::contains(const char *str) const
-
- \overload
-
- Returns \c true if the byte array contains the string \a str;
- otherwise returns \c false.
-*/
-
-/*! \fn bool QByteArray::contains(char ch) const
-
- \overload
-
- Returns \c true if the byte array contains the character \a ch;
- otherwise returns \c false.
-*/
-
-/*!
-
- Truncates the byte array at index position \a pos.
-
- If \a pos is beyond the end of the array, nothing happens.
-
- Example:
- \snippet code/src_corelib_tools_qbytearray.cpp 10
-
- \sa chop(), resize(), left()
-*/
-void QByteArray::truncate(int pos)
-{
- if (pos < d->size)
- resize(pos);
-}
-
-/*!
-
- Removes \a n bytes from the end of the byte array.
-
- If \a n is greater than size(), the result is an empty byte
- array.
-
- Example:
- \snippet code/src_corelib_tools_qbytearray.cpp 11
-
- \sa truncate(), resize(), left()
-*/
-
-void QByteArray::chop(int n)
-{
- if (n > 0)
- resize(d->size - n);
-}
-
-
-/*! \fn QByteArray &QByteArray::operator+=(const QByteArray &ba)
-
- Appends the byte array \a ba onto the end of this byte array and
- returns a reference to this byte array.
-
- Example:
- \snippet code/src_corelib_tools_qbytearray.cpp 12
-
- Note: QByteArray is an \l{implicitly shared} class. Consequently,
- if you append to an empty byte array, then the byte array will just
- share the data held in \a ba. In this case, no copying of data is done,
- taking \l{constant time}. If a shared instance is modified, it will
- be copied (copy-on-write), taking \l{linear time}.
-
- If the byte array being appended to is not empty, a deep copy of the
- data is performed, taking \l{linear time}.
-
- This operation typically does not suffer from allocation overhead,
- because QByteArray preallocates extra space at the end of the data
- so that it may grow without reallocating for each append operation.
-
- \sa append(), prepend()
-*/
-
-/*! \fn QByteArray &QByteArray::operator+=(const QString &str)
-
- \overload
-
- Appends the string \a str onto the end of this byte array and
- returns a reference to this byte array. The Unicode data is
- converted into 8-bit characters using QString::toUtf8().
-
- You can disable this function by defining \c QT_NO_CAST_TO_ASCII when you
- compile your applications. You then need to call QString::toUtf8() (or
- QString::toLatin1() or QString::toLocal8Bit()) explicitly if you want to
- convert the data to \c{const char *}.
-*/
-
-/*! \fn QByteArray &QByteArray::operator+=(const char *str)
-
- \overload
-
- Appends the string \a str onto the end of this byte array and
- returns a reference to this byte array.
-*/
-
-/*! \fn QByteArray &QByteArray::operator+=(char ch)
-
- \overload
-
- Appends the character \a ch onto the end of this byte array and
- returns a reference to this byte array.
-*/
-
-/*! \fn int QByteArray::length() const
-
- Same as size().
-*/
-
-/*! \fn bool QByteArray::isNull() const
-
- Returns \c true if this byte array is null; otherwise returns \c false.
-
- Example:
- \snippet code/src_corelib_tools_qbytearray.cpp 13
-
- Qt makes a distinction between null byte arrays and empty byte
- arrays for historical reasons. For most applications, what
- matters is whether or not a byte array contains any data,
- and this can be determined using isEmpty().
-
- \sa isEmpty()
-*/
-
-/*! \fn QByteArray::QByteArray()
-
- Constructs an empty byte array.
-
- \sa isEmpty()
-*/
-
-/*!
- Constructs a byte array containing the first \a size bytes of
- array \a data.
-
- If \a data is 0, a null byte array is constructed.
-
- If \a size is negative, \a data is assumed to point to a
- '\\0'-terminated string and its length is determined dynamically.
- The terminating \\0 character is not considered part of the
- byte array.
-
- QByteArray makes a deep copy of the string data.
-
- \sa fromRawData()
-*/
-
-QByteArray::QByteArray(const char *data, int size)
-{
- if (!data) {
- d = Data::sharedNull();
- } else {
- if (size < 0)
- size = int(strlen(data));
- if (!size) {
- d = Data::allocate(0);
- } else {
- d = Data::allocate(uint(size) + 1u);
- Q_CHECK_PTR(d);
- d->size = size;
- memcpy(d->data(), data, size);
- d->data()[size] = '\0';
- }
- }
-}
-
-/*!
- Constructs a byte array of size \a size with every byte set to
- character \a ch.
-
- \sa fill()
-*/
-
-QByteArray::QByteArray(int size, char ch)
-{
- if (size <= 0) {
- d = Data::allocate(0);
- } else {
- d = Data::allocate(uint(size) + 1u);
- Q_CHECK_PTR(d);
- d->size = size;
- memset(d->data(), ch, size);
- d->data()[size] = '\0';
- }
-}
-
-/*!
- \internal
-
- Constructs a byte array of size \a size with uninitialized contents.
-*/
-
-QByteArray::QByteArray(int size, Qt::Initialization)
-{
- d = Data::allocate(uint(size) + 1u);
- Q_CHECK_PTR(d);
- d->size = size;
- d->data()[size] = '\0';
-}
-
-/*!
- Sets the size of the byte array to \a size bytes.
-
- If \a size is greater than the current size, the byte array is
- extended to make it \a size bytes with the extra bytes added to
- the end. The new bytes are uninitialized.
-
- If \a size is less than the current size, bytes are removed from
- the end.
-
- \sa size(), truncate()
-*/
-void QByteArray::resize(int size)
-{
- if (size < 0)
- size = 0;
-
- if (IS_RAW_DATA(d) && !d->ref.isShared() && size < d->size) {
- d->size = size;
- return;
- }
-
- if (size == 0 && !d->capacityReserved) {
- Data *x = Data::allocate(0);
- if (!d->ref.deref())
- Data::deallocate(d);
- d = x;
- } else if (d->size == 0 && d->ref.isStatic()) {
- //
- // Optimize the idiom:
- // QByteArray a;
- // a.resize(sz);
- // ...
- // which is used in place of the Qt 3 idiom:
- // QByteArray a(sz);
- //
- Data *x = Data::allocate(uint(size) + 1u);
- Q_CHECK_PTR(x);
- x->size = size;
- x->data()[size] = '\0';
- d = x;
- } else {
- if (d->ref.isShared() || uint(size) + 1u > d->alloc
- || (!d->capacityReserved && size < d->size
- && uint(size) + 1u < uint(d->alloc >> 1)))
- reallocData(uint(size) + 1u, d->detachFlags() | Data::Grow);
- if (d->alloc) {
- d->size = size;
- d->data()[size] = '\0';
- }
- }
-}
-
-/*!
- Sets every byte in the byte array to character \a ch. If \a size
- is different from -1 (the default), the byte array is resized to
- size \a size beforehand.
-
- Example:
- \snippet code/src_corelib_tools_qbytearray.cpp 14
-
- \sa resize()
-*/
-
-QByteArray &QByteArray::fill(char ch, int size)
-{
- resize(size < 0 ? d->size : size);
- if (d->size)
- memset(d->data(), ch, d->size);
- return *this;
-}
-
-void QByteArray::reallocData(uint alloc, Data::AllocationOptions options)
-{
- if (d->ref.isShared() || IS_RAW_DATA(d)) {
- Data *x = Data::allocate(alloc, options);
- Q_CHECK_PTR(x);
- x->size = qMin(int(alloc) - 1, d->size);
- ::memcpy(x->data(), d->data(), x->size);
- x->data()[x->size] = '\0';
- if (!d->ref.deref())
- Data::deallocate(d);
- d = x;
- } else {
- Data *x = Data::reallocateUnaligned(d, alloc, options);
- Q_CHECK_PTR(x);
- d = x;
- }
-}
-
-void QByteArray::expand(int i)
-{
- resize(qMax(i + 1, d->size));
-}
-
-/*!
- \internal
- Return a QByteArray that is sure to be '\\0'-terminated.
-
- By default, all QByteArray have an extra NUL at the end,
- guaranteeing that assumption. However, if QByteArray::fromRawData
- is used, then the NUL is there only if the user put it there. We
- can't be sure.
-*/
-QByteArray QByteArray::nulTerminated() const
-{
- // is this fromRawData?
- if (!IS_RAW_DATA(d))
- return *this; // no, then we're sure we're zero terminated
-
- QByteArray copy(*this);
- copy.detach();
- return copy;
-}
-
-/*!
- Prepends the byte array \a ba to this byte array and returns a
- reference to this byte array.
-
- Example:
- \snippet code/src_corelib_tools_qbytearray.cpp 15
-
- This is the same as insert(0, \a ba).
-
- Note: QByteArray is an \l{implicitly shared} class. Consequently,
- if you prepend to an empty byte array, then the byte array will just
- share the data held in \a ba. In this case, no copying of data is done,
- taking \l{constant time}. If a shared instance is modified, it will
- be copied (copy-on-write), taking \l{linear time}.
-
- If the byte array being prepended to is not empty, a deep copy of the
- data is performed, taking \l{linear time}.
-
- \sa append(), insert()
-*/
-
-QByteArray &QByteArray::prepend(const QByteArray &ba)
-{
- if (d->size == 0 && d->ref.isStatic() && !IS_RAW_DATA(ba.d)) {
- *this = ba;
- } else if (ba.d->size != 0) {
- QByteArray tmp = *this;
- *this = ba;
- append(tmp);
- }
- return *this;
-}
-
-/*!
- \overload
-
- Prepends the string \a str to this byte array.
-*/
-
-QByteArray &QByteArray::prepend(const char *str)
-{
- return prepend(str, qstrlen(str));
-}
-
-/*!
- \overload
- \since 4.6
-
- Prepends \a len bytes of the string \a str to this byte array.
-*/
-
-QByteArray &QByteArray::prepend(const char *str, int len)
-{
- if (str) {
- if (d->ref.isShared() || uint(d->size + len) + 1u > d->alloc)
- reallocData(uint(d->size + len) + 1u, d->detachFlags() | Data::Grow);
- memmove(d->data()+len, d->data(), d->size);
- memcpy(d->data(), str, len);
- d->size += len;
- d->data()[d->size] = '\0';
- }
- return *this;
-}
-
-/*! \fn QByteArray &QByteArray::prepend(int count, char ch)
-
- \overload
- \since 5.7
-
- Prepends \a count copies of character \a ch to this byte array.
-*/
-
-/*!
- \overload
-
- Prepends the character \a ch to this byte array.
-*/
-
-QByteArray &QByteArray::prepend(char ch)
-{
- if (d->ref.isShared() || uint(d->size) + 2u > d->alloc)
- reallocData(uint(d->size) + 2u, d->detachFlags() | Data::Grow);
- memmove(d->data()+1, d->data(), d->size);
- d->data()[0] = ch;
- ++d->size;
- d->data()[d->size] = '\0';
- return *this;
-}
-
-/*!
- Appends the byte array \a ba onto the end of this byte array.
-
- Example:
- \snippet code/src_corelib_tools_qbytearray.cpp 16
-
- This is the same as insert(size(), \a ba).
-
- Note: QByteArray is an \l{implicitly shared} class. Consequently,
- if you append to an empty byte array, then the byte array will just
- share the data held in \a ba. In this case, no copying of data is done,
- taking \l{constant time}. If a shared instance is modified, it will
- be copied (copy-on-write), taking \l{linear time}.
-
- If the byte array being appended to is not empty, a deep copy of the
- data is performed, taking \l{linear time}.
-
- This operation typically does not suffer from allocation overhead,
- because QByteArray preallocates extra space at the end of the data
- so that it may grow without reallocating for each append operation.
-
- \sa operator+=(), prepend(), insert()
-*/
-
-QByteArray &QByteArray::append(const QByteArray &ba)
-{
- if (d->size == 0 && d->ref.isStatic() && !IS_RAW_DATA(ba.d)) {
- *this = ba;
- } else if (ba.d->size != 0) {
- if (d->ref.isShared() || uint(d->size + ba.d->size) + 1u > d->alloc)
- reallocData(uint(d->size + ba.d->size) + 1u, d->detachFlags() | Data::Grow);
- memcpy(d->data() + d->size, ba.d->data(), ba.d->size);
- d->size += ba.d->size;
- d->data()[d->size] = '\0';
- }
- return *this;
-}
-
-/*! \fn QByteArray &QByteArray::append(const QString &str)
-
- \overload
-
- Appends the string \a str to this byte array. The Unicode data is
- converted into 8-bit characters using QString::toUtf8().
-
- You can disable this function by defining \c QT_NO_CAST_TO_ASCII when you
- compile your applications. You then need to call QString::toUtf8() (or
- QString::toLatin1() or QString::toLocal8Bit()) explicitly if you want to
- convert the data to \c{const char *}.
-*/
-
-/*!
- \overload
-
- Appends the string \a str to this byte array.
-*/
-
-QByteArray& QByteArray::append(const char *str)
-{
- if (str) {
- const int len = int(strlen(str));
- if (d->ref.isShared() || uint(d->size + len) + 1u > d->alloc)
- reallocData(uint(d->size + len) + 1u, d->detachFlags() | Data::Grow);
- memcpy(d->data() + d->size, str, len + 1); // include null terminator
- d->size += len;
- }
- return *this;
-}
-
-/*!
- \overload append()
-
- Appends the first \a len characters of the string \a str to this byte
- array and returns a reference to this byte array.
-
- If \a len is negative, the length of the string will be determined
- automatically using qstrlen(). If \a len is zero or \a str is
- null, nothing is appended to the byte array. Ensure that \a len is
- \e not longer than \a str.
-*/
-
-QByteArray &QByteArray::append(const char *str, int len)
-{
- if (len < 0)
- len = qstrlen(str);
- if (str && len) {
- if (d->ref.isShared() || uint(d->size + len) + 1u > d->alloc)
- reallocData(uint(d->size + len) + 1u, d->detachFlags() | Data::Grow);
- memcpy(d->data() + d->size, str, len); // include null terminator
- d->size += len;
- d->data()[d->size] = '\0';
- }
- return *this;
-}
-
-/*! \fn QByteArray &QByteArray::append(int count, char ch)
-
- \overload
- \since 5.7
-
- Appends \a count copies of character \a ch to this byte
- array and returns a reference to this byte array.
-
- If \a count is negative or zero nothing is appended to the byte array.
-*/
-
-/*!
- \overload
-
- Appends the character \a ch to this byte array.
-*/
-
-QByteArray& QByteArray::append(char ch)
-{
- if (d->ref.isShared() || uint(d->size) + 2u > d->alloc)
- reallocData(uint(d->size) + 2u, d->detachFlags() | Data::Grow);
- d->data()[d->size++] = ch;
- d->data()[d->size] = '\0';
- return *this;
-}
-
-/*!
- \internal
- Inserts \a len bytes from the array \a arr at position \a pos and returns a
- reference the modified byte array.
-*/
-static inline QByteArray &qbytearray_insert(QByteArray *ba,
- int pos, const char *arr, int len)
-{
- Q_ASSERT(pos >= 0);
-
- if (pos < 0 || len <= 0 || arr == 0)
- return *ba;
-
- int oldsize = ba->size();
- ba->resize(qMax(pos, oldsize) + len);
- char *dst = ba->data();
- if (pos > oldsize)
- ::memset(dst + oldsize, 0x20, pos - oldsize);
- else
- ::memmove(dst + pos + len, dst + pos, oldsize - pos);
- memcpy(dst + pos, arr, len);
- return *ba;
-}
-
-/*!
- Inserts the byte array \a ba at index position \a i and returns a
- reference to this byte array.
-
- Example:
- \snippet code/src_corelib_tools_qbytearray.cpp 17
-
- \sa append(), prepend(), replace(), remove()
-*/
-
-QByteArray &QByteArray::insert(int i, const QByteArray &ba)
-{
- QByteArray copy(ba);
- return qbytearray_insert(this, i, copy.d->data(), copy.d->size);
-}
-
-/*!
- \fn QByteArray &QByteArray::insert(int i, const QString &str)
-
- \overload
-
- Inserts the string \a str at index position \a i in the byte
- array. The Unicode data is converted into 8-bit characters using
- QString::toUtf8().
-
- If \a i is greater than size(), the array is first extended using
- resize().
-
- You can disable this function by defining \c QT_NO_CAST_TO_ASCII when you
- compile your applications. You then need to call QString::toUtf8() (or
- QString::toLatin1() or QString::toLocal8Bit()) explicitly if you want to
- convert the data to \c{const char *}.
-*/
-
-/*!
- \overload
-
- Inserts the string \a str at position \a i in the byte array.
-
- If \a i is greater than size(), the array is first extended using
- resize().
-*/
-
-QByteArray &QByteArray::insert(int i, const char *str)
-{
- return qbytearray_insert(this, i, str, qstrlen(str));
-}
-
-/*!
- \overload
- \since 4.6
-
- Inserts \a len bytes of the string \a str at position
- \a i in the byte array.
-
- If \a i is greater than size(), the array is first extended using
- resize().
-*/
-
-QByteArray &QByteArray::insert(int i, const char *str, int len)
-{
- return qbytearray_insert(this, i, str, len);
-}
-
-/*!
- \overload
-
- Inserts character \a ch at index position \a i in the byte array.
- If \a i is greater than size(), the array is first extended using
- resize().
-*/
-
-QByteArray &QByteArray::insert(int i, char ch)
-{
- return qbytearray_insert(this, i, &ch, 1);
-}
-
-/*! \fn QByteArray &QByteArray::insert(int i, int count, char ch)
-
- \overload
- \since 5.7
-
- Inserts \a count copies of character \a ch at index position \a i in the
- byte array.
-
- If \a i is greater than size(), the array is first extended using resize().
-*/
-
-QByteArray &QByteArray::insert(int i, int count, char ch)
-{
- if (i < 0 || count <= 0)
- return *this;
-
- int oldsize = size();
- resize(qMax(i, oldsize) + count);
- char *dst = d->data();
- if (i > oldsize)
- ::memset(dst + oldsize, 0x20, i - oldsize);
- else if (i < oldsize)
- ::memmove(dst + i + count, dst + i, oldsize - i);
- ::memset(dst + i, ch, count);
- return *this;
-}
-
-/*!
- Removes \a len bytes from the array, starting at index position \a
- pos, and returns a reference to the array.
-
- If \a pos is out of range, nothing happens. If \a pos is valid,
- but \a pos + \a len is larger than the size of the array, the
- array is truncated at position \a pos.
-
- Example:
- \snippet code/src_corelib_tools_qbytearray.cpp 18
-
- \sa insert(), replace()
-*/
-
-QByteArray &QByteArray::remove(int pos, int len)
-{
- if (len <= 0 || uint(pos) >= uint(d->size))
- return *this;
- detach();
- if (len >= d->size - pos) {
- resize(pos);
- } else {
- memmove(d->data() + pos, d->data() + pos + len, d->size - pos - len);
- resize(d->size - len);
- }
- return *this;
-}
-
-/*!
- Replaces \a len bytes from index position \a pos with the byte
- array \a after, and returns a reference to this byte array.
-
- Example:
- \snippet code/src_corelib_tools_qbytearray.cpp 19
-
- \sa insert(), remove()
-*/
-
-QByteArray &QByteArray::replace(int pos, int len, const QByteArray &after)
-{
- if (len == after.d->size && (pos + len <= d->size)) {
- detach();
- memmove(d->data() + pos, after.d->data(), len*sizeof(char));
- return *this;
- } else {
- QByteArray copy(after);
- // ### optimize me
- remove(pos, len);
- return insert(pos, copy);
- }
-}
-
-/*! \fn QByteArray &QByteArray::replace(int pos, int len, const char *after)
-
- \overload
-
- Replaces \a len bytes from index position \a pos with the
- '\\0'-terminated string \a after.
-
- Notice: this can change the length of the byte array.
-*/
-QByteArray &QByteArray::replace(int pos, int len, const char *after)
-{
- return replace(pos,len,after,qstrlen(after));
-}
-
-/*! \fn QByteArray &QByteArray::replace(int pos, int len, const char *after, int alen)
-
- \overload
-
- Replaces \a len bytes from index position \a pos with \a alen bytes
- from the string \a after. \a after is allowed to have '\\0' characters.
-
- \since 4.7
-*/
-QByteArray &QByteArray::replace(int pos, int len, const char *after, int alen)
-{
- if (len == alen && (pos + len <= d->size)) {
- detach();
- memcpy(d->data() + pos, after, len*sizeof(char));
- return *this;
- } else {
- remove(pos, len);
- return qbytearray_insert(this, pos, after, alen);
- }
-}
-
-// ### optimize all other replace method, by offering
-// QByteArray::replace(const char *before, int blen, const char *after, int alen)
-
-/*!
- \overload
-
- Replaces every occurrence of the byte array \a before with the
- byte array \a after.
-
- Example:
- \snippet code/src_corelib_tools_qbytearray.cpp 20
-*/
-
-QByteArray &QByteArray::replace(const QByteArray &before, const QByteArray &after)
-{
- if (isNull() || before.d == after.d)
- return *this;
-
- QByteArray aft = after;
- if (after.d == d)
- aft.detach();
-
- return replace(before.constData(), before.size(), aft.constData(), aft.size());
-}
-
-/*!
- \fn QByteArray &QByteArray::replace(const char *before, const QByteArray &after)
- \overload
-
- Replaces every occurrence of the string \a before with the
- byte array \a after.
-*/
-
-QByteArray &QByteArray::replace(const char *c, const QByteArray &after)
-{
- QByteArray aft = after;
- if (after.d == d)
- aft.detach();
-
- return replace(c, qstrlen(c), aft.constData(), aft.size());
-}
-
-/*!
- \fn QByteArray &QByteArray::replace(const char *before, int bsize, const char *after, int asize)
- \overload
-
- Replaces every occurrence of the string \a before with the string \a after.
- Since the sizes of the strings are given by \a bsize and \a asize, they
- may contain zero characters and do not need to be '\\0'-terminated.
-*/
-
-QByteArray &QByteArray::replace(const char *before, int bsize, const char *after, int asize)
-{
- if (isNull() || (before == after && bsize == asize))
- return *this;
-
- // protect against before or after being part of this
- const char *a = after;
- const char *b = before;
- if (after >= d->data() && after < d->data() + d->size) {
- char *copy = (char *)malloc(asize);
- Q_CHECK_PTR(copy);
- memcpy(copy, after, asize);
- a = copy;
- }
- if (before >= d->data() && before < d->data() + d->size) {
- char *copy = (char *)malloc(bsize);
- Q_CHECK_PTR(copy);
- memcpy(copy, before, bsize);
- b = copy;
- }
-
- QByteArrayMatcher matcher(before, bsize);
- int index = 0;
- int len = d->size;
- char *d = data();
-
- if (bsize == asize) {
- if (bsize) {
- while ((index = matcher.indexIn(*this, index)) != -1) {
- memcpy(d + index, after, asize);
- index += bsize;
- }
- }
- } else if (asize < bsize) {
- uint to = 0;
- uint movestart = 0;
- uint num = 0;
- while ((index = matcher.indexIn(*this, index)) != -1) {
- if (num) {
- int msize = index - movestart;
- if (msize > 0) {
- memmove(d + to, d + movestart, msize);
- to += msize;
- }
- } else {
- to = index;
- }
- if (asize) {
- memcpy(d + to, after, asize);
- to += asize;
- }
- index += bsize;
- movestart = index;
- num++;
- }
- if (num) {
- int msize = len - movestart;
- if (msize > 0)
- memmove(d + to, d + movestart, msize);
- resize(len - num*(bsize-asize));
- }
- } else {
- // the most complex case. We don't want to lose performance by doing repeated
- // copies and reallocs of the string.
- while (index != -1) {
- uint indices[4096];
- uint pos = 0;
- while(pos < 4095) {
- index = matcher.indexIn(*this, index);
- if (index == -1)
- break;
- indices[pos++] = index;
- index += bsize;
- // avoid infinite loop
- if (!bsize)
- index++;
- }
- if (!pos)
- break;
-
- // we have a table of replacement positions, use them for fast replacing
- int adjust = pos*(asize-bsize);
- // index has to be adjusted in case we get back into the loop above.
- if (index != -1)
- index += adjust;
- int newlen = len + adjust;
- int moveend = len;
- if (newlen > len) {
- resize(newlen);
- len = newlen;
- }
- d = this->d->data();
-
- while(pos) {
- pos--;
- int movestart = indices[pos] + bsize;
- int insertstart = indices[pos] + pos*(asize-bsize);
- int moveto = insertstart + asize;
- memmove(d + moveto, d + movestart, (moveend - movestart));
- if (asize)
- memcpy(d + insertstart, after, asize);
- moveend = movestart - bsize;
- }
- }
- }
-
- if (a != after)
- ::free(const_cast<char *>(a));
- if (b != before)
- ::free(const_cast<char *>(b));
-
-
- return *this;
-}
-
-
-/*!
- \fn QByteArray &QByteArray::replace(const QByteArray &before, const char *after)
- \overload
-
- Replaces every occurrence of the byte array \a before with the
- string \a after.
-*/
-
-/*! \fn QByteArray &QByteArray::replace(const QString &before, const QByteArray &after)
-
- \overload
-
- Replaces every occurrence of the string \a before with the byte
- array \a after. The Unicode data is converted into 8-bit
- characters using QString::toUtf8().
-
- You can disable this function by defining \c QT_NO_CAST_TO_ASCII when you
- compile your applications. You then need to call QString::toUtf8() (or
- QString::toLatin1() or QString::toLocal8Bit()) explicitly if you want to
- convert the data to \c{const char *}.
-*/
-
-/*! \fn QByteArray &QByteArray::replace(const QString &before, const char *after)
- \overload
-
- Replaces every occurrence of the string \a before with the string
- \a after.
-*/
-
-/*! \fn QByteArray &QByteArray::replace(const char *before, const char *after)
-
- \overload
-
- Replaces every occurrence of the string \a before with the string
- \a after.
-*/
-
-/*!
- \overload
-
- Replaces every occurrence of the character \a before with the
- byte array \a after.
-*/
-
-QByteArray &QByteArray::replace(char before, const QByteArray &after)
-{
- char b[2] = { before, '\0' };
- QByteArray cb = fromRawData(b, 1);
- return replace(cb, after);
-}
-
-/*! \fn QByteArray &QByteArray::replace(char before, const QString &after)
-
- \overload
-
- Replaces every occurrence of the character \a before with the
- string \a after. The Unicode data is converted into 8-bit
- characters using QString::toUtf8().
-
- You can disable this function by defining \c QT_NO_CAST_TO_ASCII when you
- compile your applications. You then need to call QString::toUtf8() (or
- QString::toLatin1() or QString::toLocal8Bit()) explicitly if you want to
- convert the data to \c{const char *}.
-*/
-
-/*! \fn QByteArray &QByteArray::replace(char before, const char *after)
-
- \overload
-
- Replaces every occurrence of the character \a before with the
- string \a after.
-*/
-
-/*!
- \overload
-
- Replaces every occurrence of the character \a before with the
- character \a after.
-*/
-
-QByteArray &QByteArray::replace(char before, char after)
-{
- if (d->size) {
- char *i = data();
- char *e = i + d->size;
- for (; i != e; ++i)
- if (*i == before)
- * i = after;
- }
- return *this;
-}
-
-/*!
- Splits the byte array into subarrays wherever \a sep occurs, and
- returns the list of those arrays. If \a sep does not match
- anywhere in the byte array, split() returns a single-element list
- containing this byte array.
-*/
-
-QList<QByteArray> QByteArray::split(char sep) const
-{
- QList<QByteArray> list;
- int start = 0;
- int end;
- while ((end = indexOf(sep, start)) != -1) {
- list.append(mid(start, end - start));
- start = end + 1;
- }
- list.append(mid(start));
- return list;
-}
-
-/*!
- \since 4.5
-
- Returns a copy of this byte array repeated the specified number of \a times.
-
- If \a times is less than 1, an empty byte array is returned.
-
- Example:
-
- \snippet code/src_corelib_tools_qbytearray.cpp 49
-*/
-QByteArray QByteArray::repeated(int times) const
-{
- if (d->size == 0)
- return *this;
-
- if (times <= 1) {
- if (times == 1)
- return *this;
- return QByteArray();
- }
-
- const int resultSize = times * d->size;
-
- QByteArray result;
- result.reserve(resultSize);
- if (result.d->alloc != uint(resultSize) + 1u)
- return QByteArray(); // not enough memory
-
- memcpy(result.d->data(), d->data(), d->size);
-
- int sizeSoFar = d->size;
- char *end = result.d->data() + sizeSoFar;
-
- const int halfResultSize = resultSize >> 1;
- while (sizeSoFar <= halfResultSize) {
- memcpy(end, result.d->data(), sizeSoFar);
- end += sizeSoFar;
- sizeSoFar <<= 1;
- }
- memcpy(end, result.d->data(), resultSize - sizeSoFar);
- result.d->data()[resultSize] = '\0';
- result.d->size = resultSize;
- return result;
-}
-
-#define REHASH(a) \
- if (ol_minus_1 < sizeof(uint) * CHAR_BIT) \
- hashHaystack -= (a) << ol_minus_1; \
- hashHaystack <<= 1
-
-/*!
- Returns the index position of the first occurrence of the byte
- array \a ba in this byte array, searching forward from index
- position \a from. Returns -1 if \a ba could not be found.
-
- Example:
- \snippet code/src_corelib_tools_qbytearray.cpp 21
-
- \sa lastIndexOf(), contains(), count()
-*/
-
-int QByteArray::indexOf(const QByteArray &ba, int from) const
-{
- const int ol = ba.d->size;
- if (ol == 0)
- return from;
- if (ol == 1)
- return indexOf(*ba.d->data(), from);
-
- const int l = d->size;
- if (from > d->size || ol + from > l)
- return -1;
-
- return qFindByteArray(d->data(), d->size, from, ba.d->data(), ol);
-}
-
-/*! \fn int QByteArray::indexOf(const QString &str, int from) const
-
- \overload
-
- Returns the index position of the first occurrence of the string
- \a str in the byte array, searching forward from index position
- \a from. Returns -1 if \a str could not be found.
-
- The Unicode data is converted into 8-bit characters using
- QString::toUtf8().
-
- You can disable this function by defining \c QT_NO_CAST_TO_ASCII when you
- compile your applications. You then need to call QString::toUtf8() (or
- QString::toLatin1() or QString::toLocal8Bit()) explicitly if you want to
- convert the data to \c{const char *}.
-*/
-
-/*! \fn int QByteArray::indexOf(const char *str, int from) const
-
- \overload
-
- Returns the index position of the first occurrence of the string
- \a str in the byte array, searching forward from index position \a
- from. Returns -1 if \a str could not be found.
-*/
-int QByteArray::indexOf(const char *c, int from) const
-{
- const int ol = qstrlen(c);
- if (ol == 1)
- return indexOf(*c, from);
-
- const int l = d->size;
- if (from > d->size || ol + from > l)
- return -1;
- if (ol == 0)
- return from;
-
- return qFindByteArray(d->data(), d->size, from, c, ol);
-}
-
-/*!
- \overload
-
- Returns the index position of the first occurrence of the
- character \a ch in the byte array, searching forward from index
- position \a from. Returns -1 if \a ch could not be found.
-
- Example:
- \snippet code/src_corelib_tools_qbytearray.cpp 22
-
- \sa lastIndexOf(), contains()
-*/
-
-int QByteArray::indexOf(char ch, int from) const
-{
- if (from < 0)
- from = qMax(from + d->size, 0);
- if (from < d->size) {
- const char *n = d->data() + from - 1;
- const char *e = d->data() + d->size;
- while (++n != e)
- if (*n == ch)
- return n - d->data();
- }
- return -1;
-}
-
-
-static int lastIndexOfHelper(const char *haystack, int l, const char *needle, int ol, int from)
-{
- int delta = l - ol;
- if (from < 0)
- from = delta;
- if (from < 0 || from > l)
- return -1;
- if (from > delta)
- from = delta;
-
- const char *end = haystack;
- haystack += from;
- const uint ol_minus_1 = ol - 1;
- const char *n = needle + ol_minus_1;
- const char *h = haystack + ol_minus_1;
- uint hashNeedle = 0, hashHaystack = 0;
- int idx;
- for (idx = 0; idx < ol; ++idx) {
- hashNeedle = ((hashNeedle<<1) + *(n-idx));
- hashHaystack = ((hashHaystack<<1) + *(h-idx));
- }
- hashHaystack -= *haystack;
- while (haystack >= end) {
- hashHaystack += *haystack;
- if (hashHaystack == hashNeedle && memcmp(needle, haystack, ol) == 0)
- return haystack - end;
- --haystack;
- REHASH(*(haystack + ol));
- }
- return -1;
-
-}
-
-/*!
- \fn int QByteArray::lastIndexOf(const QByteArray &ba, int from) const
-
- Returns the index position of the last occurrence of the byte
- array \a ba in this byte array, searching backward from index
- position \a from. If \a from is -1 (the default), the search
- starts at the last byte. Returns -1 if \a ba could not be found.
-
- Example:
- \snippet code/src_corelib_tools_qbytearray.cpp 23
-
- \sa indexOf(), contains(), count()
-*/
-
-int QByteArray::lastIndexOf(const QByteArray &ba, int from) const
-{
- const int ol = ba.d->size;
- if (ol == 1)
- return lastIndexOf(*ba.d->data(), from);
-
- return lastIndexOfHelper(d->data(), d->size, ba.d->data(), ol, from);
-}
-
-/*! \fn int QByteArray::lastIndexOf(const QString &str, int from) const
-
- \overload
-
- Returns the index position of the last occurrence of the string \a
- str in the byte array, searching backward from index position \a
- from. If \a from is -1 (the default), the search starts at the
- last (size() - 1) byte. Returns -1 if \a str could not be found.
-
- The Unicode data is converted into 8-bit characters using
- QString::toUtf8().
-
- You can disable this function by defining \c QT_NO_CAST_TO_ASCII when you
- compile your applications. You then need to call QString::toUtf8() (or
- QString::toLatin1() or QString::toLocal8Bit()) explicitly if you want to
- convert the data to \c{const char *}.
-*/
-
-/*! \fn int QByteArray::lastIndexOf(const char *str, int from) const
- \overload
-
- Returns the index position of the last occurrence of the string \a
- str in the byte array, searching backward from index position \a
- from. If \a from is -1 (the default), the search starts at the
- last (size() - 1) byte. Returns -1 if \a str could not be found.
-*/
-int QByteArray::lastIndexOf(const char *str, int from) const
-{
- const int ol = qstrlen(str);
- if (ol == 1)
- return lastIndexOf(*str, from);
-
- return lastIndexOfHelper(d->data(), d->size, str, ol, from);
-}
-
-/*!
- \overload
-
- Returns the index position of the last occurrence of character \a
- ch in the byte array, searching backward from index position \a
- from. If \a from is -1 (the default), the search starts at the
- last (size() - 1) byte. Returns -1 if \a ch could not be found.
-
- Example:
- \snippet code/src_corelib_tools_qbytearray.cpp 24
-
- \sa indexOf(), contains()
-*/
-
-int QByteArray::lastIndexOf(char ch, int from) const
-{
- if (from < 0)
- from += d->size;
- else if (from > d->size)
- from = d->size-1;
- if (from >= 0) {
- const char *b = d->data();
- const char *n = d->data() + from + 1;
- while (n-- != b)
- if (*n == ch)
- return n - b;
- }
- return -1;
-}
-
-/*!
- Returns the number of (potentially overlapping) occurrences of
- byte array \a ba in this byte array.
-
- \sa contains(), indexOf()
-*/
-
-int QByteArray::count(const QByteArray &ba) const
-{
- int num = 0;
- int i = -1;
- if (d->size > 500 && ba.d->size > 5) {
- QByteArrayMatcher matcher(ba);
- while ((i = matcher.indexIn(*this, i + 1)) != -1)
- ++num;
- } else {
- while ((i = indexOf(ba, i + 1)) != -1)
- ++num;
- }
- return num;
-}
-
-/*!
- \overload
-
- Returns the number of (potentially overlapping) occurrences of
- string \a str in the byte array.
-*/
-
-int QByteArray::count(const char *str) const
-{
- return count(fromRawData(str, qstrlen(str)));
-}
-
-/*!
- \overload
-
- Returns the number of occurrences of character \a ch in the byte
- array.
-
- \sa contains(), indexOf()
-*/
-
-int QByteArray::count(char ch) const
-{
- int num = 0;
- const char *i = d->data() + d->size;
- const char *b = d->data();
- while (i != b)
- if (*--i == ch)
- ++num;
- return num;
-}
-
-/*! \fn int QByteArray::count() const
-
- \overload
-
- Same as size().
-*/
-
-/*!
- \fn int QByteArray::compare(const char *c, Qt::CaseSensitivity cs = Qt::CaseSensitive) const
- \since 5.12
-
- Returns an integer less than, equal to, or greater than zero depending on
- whether this QByteArray sorts before, at the same position, or after the
- string pointed to by \a c. The comparison is performed according to case
- sensitivity \a cs.
-
- \sa operator==
-*/
-
-/*!
- \fn int QByteArray::compare(const QByteArray &a, Qt::CaseSensitivity cs = Qt::CaseSensitive) const
- \overload
- \since 5.12
-
- Returns an integer less than, equal to, or greater than zero depending on
- whether this QByteArray sorts before, at the same position, or after the
- QByteArray \a a. The comparison is performed according to case sensitivity
- \a cs.
-
- \sa operator==
-*/
-
-/*!
- Returns \c true if this byte array starts with byte array \a ba;
- otherwise returns \c false.
-
- Example:
- \snippet code/src_corelib_tools_qbytearray.cpp 25
-
- \sa endsWith(), left()
-*/
-bool QByteArray::startsWith(const QByteArray &ba) const
-{
- if (d == ba.d || ba.d->size == 0)
- return true;
- if (d->size < ba.d->size)
- return false;
- return memcmp(d->data(), ba.d->data(), ba.d->size) == 0;
-}
-
-/*! \overload
-
- Returns \c true if this byte array starts with string \a str;
- otherwise returns \c false.
-*/
-bool QByteArray::startsWith(const char *str) const
-{
- if (!str || !*str)
- return true;
- const int len = int(strlen(str));
- if (d->size < len)
- return false;
- return qstrncmp(d->data(), str, len) == 0;
-}
-
-/*! \overload
-
- Returns \c true if this byte array starts with character \a ch;
- otherwise returns \c false.
-*/
-bool QByteArray::startsWith(char ch) const
-{
- if (d->size == 0)
- return false;
- return d->data()[0] == ch;
-}
-
-/*!
- Returns \c true if this byte array ends with byte array \a ba;
- otherwise returns \c false.
-
- Example:
- \snippet code/src_corelib_tools_qbytearray.cpp 26
-
- \sa startsWith(), right()
-*/
-bool QByteArray::endsWith(const QByteArray &ba) const
-{
- if (d == ba.d || ba.d->size == 0)
- return true;
- if (d->size < ba.d->size)
- return false;
- return memcmp(d->data() + d->size - ba.d->size, ba.d->data(), ba.d->size) == 0;
-}
-
-/*! \overload
-
- Returns \c true if this byte array ends with string \a str; otherwise
- returns \c false.
-*/
-bool QByteArray::endsWith(const char *str) const
-{
- if (!str || !*str)
- return true;
- const int len = int(strlen(str));
- if (d->size < len)
- return false;
- return qstrncmp(d->data() + d->size - len, str, len) == 0;
-}
-
-/*
- Returns true if \a c is an uppercase Latin1 letter.
- \note The multiplication sign 0xD7 and the sz ligature 0xDF are not
- treated as uppercase Latin1.
- */
-static inline bool isUpperCaseLatin1(char c)
-{
- if (c >= 'A' && c <= 'Z')
- return true;
-
- return (uchar(c) >= 0xC0 && uchar(c) <= 0xDE && uchar(c) != 0xD7);
-}
-
-/*!
- Returns \c true if this byte array contains only uppercase letters,
- otherwise returns \c false. The byte array is interpreted as a Latin-1
- encoded string.
- \since 5.12
-
- \sa isLower(), toUpper()
-*/
-bool QByteArray::isUpper() const
-{
- if (isEmpty())
- return false;
-
- const char *d = data();
-
- for (int i = 0, max = size(); i < max; ++i) {
- if (!isUpperCaseLatin1(d[i]))
- return false;
- }
-
- return true;
-}
-
-/*
- Returns true if \a c is an lowercase Latin1 letter.
- \note The division sign 0xF7 is not treated as lowercase Latin1,
- but the small y dieresis 0xFF is.
- */
-static inline bool isLowerCaseLatin1(char c)
-{
- if (c >= 'a' && c <= 'z')
- return true;
-
- return (uchar(c) >= 0xD0 && uchar(c) != 0xF7);
-}
-
-/*!
- Returns \c true if this byte array contains only lowercase letters,
- otherwise returns \c false. The byte array is interpreted as a Latin-1
- encoded string.
- \since 5.12
-
- \sa isUpper(), toLower()
- */
-bool QByteArray::isLower() const
-{
- if (isEmpty())
- return false;
-
- const char *d = data();
-
- for (int i = 0, max = size(); i < max; ++i) {
- if (!isLowerCaseLatin1(d[i]))
- return false;
- }
-
- return true;
-}
-
-/*! \overload
-
- Returns \c true if this byte array ends with character \a ch;
- otherwise returns \c false.
-*/
-bool QByteArray::endsWith(char ch) const
-{
- if (d->size == 0)
- return false;
- return d->data()[d->size - 1] == ch;
-}
-
-/*!
- Returns a byte array that contains the leftmost \a len bytes of
- this byte array.
-
- The entire byte array is returned if \a len is greater than
- size().
-
- Example:
- \snippet code/src_corelib_tools_qbytearray.cpp 27
-
- \sa startsWith(), right(), mid(), chopped(), chop(), truncate()
-*/
-
-QByteArray QByteArray::left(int len) const
-{
- if (len >= d->size)
- return *this;
- if (len < 0)
- len = 0;
- return QByteArray(d->data(), len);
-}
-
-/*!
- Returns a byte array that contains the rightmost \a len bytes of
- this byte array.
-
- The entire byte array is returned if \a len is greater than
- size().
-
- Example:
- \snippet code/src_corelib_tools_qbytearray.cpp 28
-
- \sa endsWith(), left(), mid(), chopped(), chop(), truncate()
-*/
-
-QByteArray QByteArray::right(int len) const
-{
- if (len >= d->size)
- return *this;
- if (len < 0)
- len = 0;
- return QByteArray(d->data() + d->size - len, len);
-}
-
-/*!
- Returns a byte array containing \a len bytes from this byte array,
- starting at position \a pos.
-
- If \a len is -1 (the default), or \a pos + \a len >= size(),
- returns a byte array containing all bytes starting at position \a
- pos until the end of the byte array.
-
- Example:
- \snippet code/src_corelib_tools_qbytearray.cpp 29
-
- \sa left(), right(), chopped(), chop(), truncate()
-*/
-
-QByteArray QByteArray::mid(int pos, int len) const
-{
- using namespace QtPrivate;
- switch (QContainerImplHelper::mid(size(), &pos, &len)) {
- case QContainerImplHelper::Null:
- return QByteArray();
- case QContainerImplHelper::Empty:
- {
- QByteArrayDataPtr empty = { Data::allocate(0) };
- return QByteArray(empty);
- }
- case QContainerImplHelper::Full:
- return *this;
- case QContainerImplHelper::Subset:
- return QByteArray(d->data() + pos, len);
- }
- Q_UNREACHABLE();
- return QByteArray();
-}
-
-/*!
- \fn QByteArray::chopped(int len) const
- \since 5.10
-
- Returns a byte array that contains the leftmost size() - \a len bytes of
- this byte array.
-
- \note The behavior is undefined if \a len is negative or greater than size().
-
- \sa endsWith(), left(), right(), mid(), chop(), truncate()
-*/
-
-/*!
- \fn QByteArray QByteArray::toLower() const
-
- Returns a lowercase copy of the byte array. The bytearray is
- interpreted as a Latin-1 encoded string.
-
- Example:
- \snippet code/src_corelib_tools_qbytearray.cpp 30
-
- \sa isLower(), toUpper(), {8-bit Character Comparisons}
-*/
-
-// prevent the compiler from inlining the function in each of
-// toLower and toUpper when the only difference is the table being used
-// (even with constant propagation, there's no gain in performance).
-template <typename T>
-Q_NEVER_INLINE
-static QByteArray toCase_template(T &input, const uchar * table)
-{
- // find the first bad character in input
- const char *orig_begin = input.constBegin();
- const char *firstBad = orig_begin;
- const char *e = input.constEnd();
- for ( ; firstBad != e ; ++firstBad) {
- uchar ch = uchar(*firstBad);
- uchar converted = table[ch];
- if (ch != converted)
- break;
- }
-
- if (firstBad == e)
- return qMove(input);
-
- // transform the rest
- QByteArray s = qMove(input); // will copy if T is const QByteArray
- char *b = s.begin(); // will detach if necessary
- char *p = b + (firstBad - orig_begin);
- e = b + s.size();
- for ( ; p != e; ++p) {
- *p = char(uchar(table[uchar(*p)]));
- }
- return s;
-}
-
-QByteArray QByteArray::toLower_helper(const QByteArray &a)
-{
- return toCase_template(a, latin1_lowercased);
-}
-
-QByteArray QByteArray::toLower_helper(QByteArray &a)
-{
- return toCase_template(a, latin1_lowercased);
-}
-
-/*!
- \fn QByteArray QByteArray::toUpper() const
-
- Returns an uppercase copy of the byte array. The bytearray is
- interpreted as a Latin-1 encoded string.
-
- Example:
- \snippet code/src_corelib_tools_qbytearray.cpp 31
-
- \sa isUpper(), toLower(), {8-bit Character Comparisons}
-*/
-
-QByteArray QByteArray::toUpper_helper(const QByteArray &a)
-{
- return toCase_template(a, latin1_uppercased);
-}
-
-QByteArray QByteArray::toUpper_helper(QByteArray &a)
-{
- return toCase_template(a, latin1_uppercased);
-}
-
-/*! \fn void QByteArray::clear()
-
- Clears the contents of the byte array and makes it null.
-
- \sa resize(), isNull()
-*/
-
-void QByteArray::clear()
-{
- if (!d->ref.deref())
- Data::deallocate(d);
- d = Data::sharedNull();
-}
-
-#if !defined(QT_NO_DATASTREAM) || (defined(QT_BOOTSTRAPPED) && !defined(QT_BUILD_QMAKE))
-
-/*! \relates QByteArray
-
- Writes byte array \a ba to the stream \a out and returns a reference
- to the stream.
-
- \sa {Serializing Qt Data Types}
-*/
-
-QDataStream &operator<<(QDataStream &out, const QByteArray &ba)
-{
- if (ba.isNull() && out.version() >= 6) {
- out << (quint32)0xffffffff;
- return out;
- }
- return out.writeBytes(ba.constData(), ba.size());
-}
-
-/*! \relates QByteArray
-
- Reads a byte array into \a ba from the stream \a in and returns a
- reference to the stream.
-
- \sa {Serializing Qt Data Types}
-*/
-
-QDataStream &operator>>(QDataStream &in, QByteArray &ba)
-{
- ba.clear();
- quint32 len;
- in >> len;
- if (len == 0xffffffff)
- return in;
-
- const quint32 Step = 1024 * 1024;
- quint32 allocated = 0;
-
- do {
- int blockSize = qMin(Step, len - allocated);
- ba.resize(allocated + blockSize);
- if (in.readRawData(ba.data() + allocated, blockSize) != blockSize) {
- ba.clear();
- in.setStatus(QDataStream::ReadPastEnd);
- return in;
- }
- allocated += blockSize;
- } while (allocated < len);
-
- return in;
-}
-#endif // QT_NO_DATASTREAM
-
-/*! \fn bool QByteArray::operator==(const QString &str) const
-
- Returns \c true if this byte array is equal to string \a str;
- otherwise returns \c false.
-
- The Unicode data is converted into 8-bit characters using
- QString::toUtf8().
-
- The comparison is case sensitive.
-
- You can disable this operator by defining \c
- QT_NO_CAST_FROM_ASCII when you compile your applications. You
- then need to call QString::fromUtf8(), QString::fromLatin1(),
- or QString::fromLocal8Bit() explicitly if you want to convert the byte
- array to a QString before doing the comparison.
-*/
-
-/*! \fn bool QByteArray::operator!=(const QString &str) const
-
- Returns \c true if this byte array is not equal to string \a str;
- otherwise returns \c false.
-
- The Unicode data is converted into 8-bit characters using
- QString::toUtf8().
-
- The comparison is case sensitive.
-
- You can disable this operator by defining \c
- QT_NO_CAST_FROM_ASCII when you compile your applications. You
- then need to call QString::fromUtf8(), QString::fromLatin1(),
- or QString::fromLocal8Bit() explicitly if you want to convert the byte
- array to a QString before doing the comparison.
-*/
-
-/*! \fn bool QByteArray::operator<(const QString &str) const
-
- Returns \c true if this byte array is lexically less than string \a
- str; otherwise returns \c false.
-
- The Unicode data is converted into 8-bit characters using
- QString::toUtf8().
-
- The comparison is case sensitive.
-
- You can disable this operator by defining \c
- QT_NO_CAST_FROM_ASCII when you compile your applications. You
- then need to call QString::fromUtf8(), QString::fromLatin1(),
- or QString::fromLocal8Bit() explicitly if you want to convert the byte
- array to a QString before doing the comparison.
-*/
-
-/*! \fn bool QByteArray::operator>(const QString &str) const
-
- Returns \c true if this byte array is lexically greater than string
- \a str; otherwise returns \c false.
-
- The Unicode data is converted into 8-bit characters using
- QString::toUtf8().
-
- The comparison is case sensitive.
-
- You can disable this operator by defining \c
- QT_NO_CAST_FROM_ASCII when you compile your applications. You
- then need to call QString::fromUtf8(), QString::fromLatin1(),
- or QString::fromLocal8Bit() explicitly if you want to convert the byte
- array to a QString before doing the comparison.
-*/
-
-/*! \fn bool QByteArray::operator<=(const QString &str) const
-
- Returns \c true if this byte array is lexically less than or equal
- to string \a str; otherwise returns \c false.
-
- The Unicode data is converted into 8-bit characters using
- QString::toUtf8().
-
- The comparison is case sensitive.
-
- You can disable this operator by defining \c
- QT_NO_CAST_FROM_ASCII when you compile your applications. You
- then need to call QString::fromUtf8(), QString::fromLatin1(),
- or QString::fromLocal8Bit() explicitly if you want to convert the byte
- array to a QString before doing the comparison.
-*/
-
-/*! \fn bool QByteArray::operator>=(const QString &str) const
-
- Returns \c true if this byte array is greater than or equal to string
- \a str; otherwise returns \c false.
-
- The Unicode data is converted into 8-bit characters using
- QString::toUtf8().
-
- The comparison is case sensitive.
-
- You can disable this operator by defining \c
- QT_NO_CAST_FROM_ASCII when you compile your applications. You
- then need to call QString::fromUtf8(), QString::fromLatin1(),
- or QString::fromLocal8Bit() explicitly if you want to convert the byte
- array to a QString before doing the comparison.
-*/
-
-/*! \fn bool operator==(const QByteArray &a1, const QByteArray &a2)
- \relates QByteArray
-
- \overload
-
- Returns \c true if byte array \a a1 is equal to byte array \a a2;
- otherwise returns \c false.
-
- \sa QByteArray::compare()
-*/
-
-/*! \fn bool operator==(const QByteArray &a1, const char *a2)
- \relates QByteArray
-
- \overload
-
- Returns \c true if byte array \a a1 is equal to string \a a2;
- otherwise returns \c false.
-
- \sa QByteArray::compare()
-*/
-
-/*! \fn bool operator==(const char *a1, const QByteArray &a2)
- \relates QByteArray
-
- \overload
-
- Returns \c true if string \a a1 is equal to byte array \a a2;
- otherwise returns \c false.
-
- \sa QByteArray::compare()
-*/
-
-/*! \fn bool operator!=(const QByteArray &a1, const QByteArray &a2)
- \relates QByteArray
-
- \overload
-
- Returns \c true if byte array \a a1 is not equal to byte array \a a2;
- otherwise returns \c false.
-
- \sa QByteArray::compare()
-*/
-
-/*! \fn bool operator!=(const QByteArray &a1, const char *a2)
- \relates QByteArray
-
- \overload
-
- Returns \c true if byte array \a a1 is not equal to string \a a2;
- otherwise returns \c false.
-
- \sa QByteArray::compare()
-*/
-
-/*! \fn bool operator!=(const char *a1, const QByteArray &a2)
- \relates QByteArray
-
- \overload
-
- Returns \c true if string \a a1 is not equal to byte array \a a2;
- otherwise returns \c false.
-
- \sa QByteArray::compare()
-*/
-
-/*! \fn bool operator<(const QByteArray &a1, const QByteArray &a2)
- \relates QByteArray
-
- \overload
-
- Returns \c true if byte array \a a1 is lexically less than byte array
- \a a2; otherwise returns \c false.
-
- \sa QByteArray::compare()
-*/
-
-/*! \fn inline bool operator<(const QByteArray &a1, const char *a2)
- \relates QByteArray
-
- \overload
-
- Returns \c true if byte array \a a1 is lexically less than string
- \a a2; otherwise returns \c false.
-
- \sa QByteArray::compare()
-*/
-
-/*! \fn bool operator<(const char *a1, const QByteArray &a2)
- \relates QByteArray
-
- \overload
-
- Returns \c true if string \a a1 is lexically less than byte array
- \a a2; otherwise returns \c false.
-
- \sa QByteArray::compare()
-*/
-
-/*! \fn bool operator<=(const QByteArray &a1, const QByteArray &a2)
- \relates QByteArray
-
- \overload
-
- Returns \c true if byte array \a a1 is lexically less than or equal
- to byte array \a a2; otherwise returns \c false.
-
- \sa QByteArray::compare()
-*/
-
-/*! \fn bool operator<=(const QByteArray &a1, const char *a2)
- \relates QByteArray
-
- \overload
-
- Returns \c true if byte array \a a1 is lexically less than or equal
- to string \a a2; otherwise returns \c false.
-
- \sa QByteArray::compare()
-*/
-
-/*! \fn bool operator<=(const char *a1, const QByteArray &a2)
- \relates QByteArray
-
- \overload
-
- Returns \c true if string \a a1 is lexically less than or equal
- to byte array \a a2; otherwise returns \c false.
-
- \sa QByteArray::compare()
-*/
-
-/*! \fn bool operator>(const QByteArray &a1, const QByteArray &a2)
- \relates QByteArray
-
- \overload
-
- Returns \c true if byte array \a a1 is lexically greater than byte
- array \a a2; otherwise returns \c false.
-
- \sa QByteArray::compare()
-*/
-
-/*! \fn bool operator>(const QByteArray &a1, const char *a2)
- \relates QByteArray
-
- \overload
-
- Returns \c true if byte array \a a1 is lexically greater than string
- \a a2; otherwise returns \c false.
-
- \sa QByteArray::compare()
-*/
-
-/*! \fn bool operator>(const char *a1, const QByteArray &a2)
- \relates QByteArray
-
- \overload
-
- Returns \c true if string \a a1 is lexically greater than byte array
- \a a2; otherwise returns \c false.
-
- \sa QByteArray::compare()
-*/
-
-/*! \fn bool operator>=(const QByteArray &a1, const QByteArray &a2)
- \relates QByteArray
-
- \overload
-
- Returns \c true if byte array \a a1 is lexically greater than or
- equal to byte array \a a2; otherwise returns \c false.
-
- \sa QByteArray::compare()
-*/
-
-/*! \fn bool operator>=(const QByteArray &a1, const char *a2)
- \relates QByteArray
-
- \overload
-
- Returns \c true if byte array \a a1 is lexically greater than or
- equal to string \a a2; otherwise returns \c false.
-
- \sa QByteArray::compare()
-*/
-
-/*! \fn bool operator>=(const char *a1, const QByteArray &a2)
- \relates QByteArray
-
- \overload
-
- Returns \c true if string \a a1 is lexically greater than or
- equal to byte array \a a2; otherwise returns \c false.
-
- \sa QByteArray::compare()
-*/
-
-/*! \fn const QByteArray operator+(const QByteArray &a1, const QByteArray &a2)
- \relates QByteArray
-
- Returns a byte array that is the result of concatenating byte
- array \a a1 and byte array \a a2.
-
- \sa QByteArray::operator+=()
-*/
-
-/*! \fn const QByteArray operator+(const QByteArray &a1, const char *a2)
- \relates QByteArray
-
- \overload
-
- Returns a byte array that is the result of concatenating byte
- array \a a1 and string \a a2.
-*/
-
-/*! \fn const QByteArray operator+(const QByteArray &a1, char a2)
- \relates QByteArray
-
- \overload
-
- Returns a byte array that is the result of concatenating byte
- array \a a1 and character \a a2.
-*/
-
-/*! \fn const QByteArray operator+(const char *a1, const QByteArray &a2)
- \relates QByteArray
-
- \overload
-
- Returns a byte array that is the result of concatenating string
- \a a1 and byte array \a a2.
-*/
-
-/*! \fn const QByteArray operator+(char a1, const QByteArray &a2)
- \relates QByteArray
-
- \overload
-
- Returns a byte array that is the result of concatenating character
- \a a1 and byte array \a a2.
-*/
-
-/*!
- \fn QByteArray QByteArray::simplified() const
-
- Returns a byte array that has whitespace removed from the start
- and the end, and which has each sequence of internal whitespace
- replaced with a single space.
-
- Whitespace means any character for which the standard C++
- \c isspace() function returns \c true in the C locale. This includes the ASCII
- isspace() function returns \c true in the C locale. This includes the ASCII
- characters '\\t', '\\n', '\\v', '\\f', '\\r', and ' '.
-
- Example:
- \snippet code/src_corelib_tools_qbytearray.cpp 32
-
- \sa trimmed()
-*/
-QByteArray QByteArray::simplified_helper(const QByteArray &a)
-{
- return QStringAlgorithms<const QByteArray>::simplified_helper(a);
-}
-
-QByteArray QByteArray::simplified_helper(QByteArray &a)
-{
- return QStringAlgorithms<QByteArray>::simplified_helper(a);
-}
-
-/*!
- \fn QByteArray QByteArray::trimmed() const
-
- Returns a byte array that has whitespace removed from the start
- and the end.
-
- Whitespace means any character for which the standard C++
- \c isspace() function returns \c true in the C locale. This includes the ASCII
- characters '\\t', '\\n', '\\v', '\\f', '\\r', and ' '.
-
- Example:
- \snippet code/src_corelib_tools_qbytearray.cpp 33
-
- Unlike simplified(), \l {QByteArray::trimmed()}{trimmed()} leaves internal whitespace alone.
-
- \sa simplified()
-*/
-QByteArray QByteArray::trimmed_helper(const QByteArray &a)
-{
- return QStringAlgorithms<const QByteArray>::trimmed_helper(a);
-}
-
-QByteArray QByteArray::trimmed_helper(QByteArray &a)
-{
- return QStringAlgorithms<QByteArray>::trimmed_helper(a);
-}
-
-
-/*!
- Returns a byte array of size \a width that contains this byte
- array padded by the \a fill character.
-
- If \a truncate is false and the size() of the byte array is more
- than \a width, then the returned byte array is a copy of this byte
- array.
-
- If \a truncate is true and the size() of the byte array is more
- than \a width, then any bytes in a copy of the byte array
- after position \a width are removed, and the copy is returned.
-
- Example:
- \snippet code/src_corelib_tools_qbytearray.cpp 34
-
- \sa rightJustified()
-*/
-
-QByteArray QByteArray::leftJustified(int width, char fill, bool truncate) const
-{
- QByteArray result;
- int len = d->size;
- int padlen = width - len;
- if (padlen > 0) {
- result.resize(len+padlen);
- if (len)
- memcpy(result.d->data(), d->data(), len);
- memset(result.d->data()+len, fill, padlen);
- } else {
- if (truncate)
- result = left(width);
- else
- result = *this;
- }
- return result;
-}
-
-/*!
- Returns a byte array of size \a width that contains the \a fill
- character followed by this byte array.
-
- If \a truncate is false and the size of the byte array is more
- than \a width, then the returned byte array is a copy of this byte
- array.
-
- If \a truncate is true and the size of the byte array is more
- than \a width, then the resulting byte array is truncated at
- position \a width.
-
- Example:
- \snippet code/src_corelib_tools_qbytearray.cpp 35
-
- \sa leftJustified()
-*/
-
-QByteArray QByteArray::rightJustified(int width, char fill, bool truncate) const
-{
- QByteArray result;
- int len = d->size;
- int padlen = width - len;
- if (padlen > 0) {
- result.resize(len+padlen);
- if (len)
- memcpy(result.d->data()+padlen, data(), len);
- memset(result.d->data(), fill, padlen);
- } else {
- if (truncate)
- result = left(width);
- else
- result = *this;
- }
- return result;
-}
-
-bool QByteArray::isNull() const { return d == QArrayData::sharedNull(); }
-
-static qlonglong toIntegral_helper(const char *data, bool *ok, int base, qlonglong)
-{
- return QLocaleData::bytearrayToLongLong(data, base, ok);
-}
-
-static qulonglong toIntegral_helper(const char *data, bool *ok, int base, qulonglong)
-{
- return QLocaleData::bytearrayToUnsLongLong(data, base, ok);
-}
-
-template <typename T> static inline
-T toIntegral_helper(const char *data, bool *ok, int base)
-{
- using Int64 = typename std::conditional<std::is_unsigned<T>::value, qulonglong, qlonglong>::type;
-
-#if defined(QT_CHECK_RANGE)
- if (base != 0 && (base < 2 || base > 36)) {
- qWarning("QByteArray::toIntegral: Invalid base %d", base);
- base = 10;
- }
-#endif
-
- // we select the right overload by the last, unused parameter
- Int64 val = toIntegral_helper(data, ok, base, Int64());
- if (T(val) != val) {
- if (ok)
- *ok = false;
- val = 0;
- }
- return T(val);
-}
-
-/*!
- Returns the byte array converted to a \c {long long} using base \a
- base, which is 10 by default and must be between 2 and 36, or 0.
-
- If \a base is 0, the base is determined automatically using the
- following rules: If the byte array begins with "0x", it is assumed to
- be hexadecimal; if it begins with "0", it is assumed to be octal;
- otherwise it is assumed to be decimal.
-
- Returns 0 if the conversion fails.
-
- If \a ok is not \nullptr, failure is reported by setting *\a{ok}
- to \c false, and success by setting *\a{ok} to \c true.
-
- \note The conversion of the number is performed in the default C locale,
- irrespective of the user's locale.
-
- \sa number()
-*/
-
-qlonglong QByteArray::toLongLong(bool *ok, int base) const
-{
- return toIntegral_helper<qlonglong>(nulTerminated().constData(), ok, base);
-}
-
-/*!
- Returns the byte array converted to an \c {unsigned long long}
- using base \a base, which is 10 by default and must be between 2
- and 36, or 0.
-
- If \a base is 0, the base is determined automatically using the
- following rules: If the byte array begins with "0x", it is assumed to
- be hexadecimal; if it begins with "0", it is assumed to be octal;
- otherwise it is assumed to be decimal.
-
- Returns 0 if the conversion fails.
-
- If \a ok is not \nullptr, failure is reported by setting *\a{ok}
- to \c false, and success by setting *\a{ok} to \c true.
-
- \note The conversion of the number is performed in the default C locale,
- irrespective of the user's locale.
-
- \sa number()
-*/
-
-qulonglong QByteArray::toULongLong(bool *ok, int base) const
-{
- return toIntegral_helper<qulonglong>(nulTerminated().constData(), ok, base);
-}
-
-/*!
- Returns the byte array converted to an \c int using base \a
- base, which is 10 by default and must be between 2 and 36, or 0.
-
- If \a base is 0, the base is determined automatically using the
- following rules: If the byte array begins with "0x", it is assumed to
- be hexadecimal; if it begins with "0", it is assumed to be octal;
- otherwise it is assumed to be decimal.
-
- Returns 0 if the conversion fails.
-
- If \a ok is not \nullptr, failure is reported by setting *\a{ok}
- to \c false, and success by setting *\a{ok} to \c true.
-
- \snippet code/src_corelib_tools_qbytearray.cpp 36
-
- \note The conversion of the number is performed in the default C locale,
- irrespective of the user's locale.
-
- \sa number()
-*/
-
-int QByteArray::toInt(bool *ok, int base) const
-{
- return toIntegral_helper<int>(nulTerminated().constData(), ok, base);
-}
-
-/*!
- Returns the byte array converted to an \c {unsigned int} using base \a
- base, which is 10 by default and must be between 2 and 36, or 0.
-
- If \a base is 0, the base is determined automatically using the
- following rules: If the byte array begins with "0x", it is assumed to
- be hexadecimal; if it begins with "0", it is assumed to be octal;
- otherwise it is assumed to be decimal.
-
- Returns 0 if the conversion fails.
-
- If \a ok is not \nullptr, failure is reported by setting *\a{ok}
- to \c false, and success by setting *\a{ok} to \c true.
-
- \note The conversion of the number is performed in the default C locale,
- irrespective of the user's locale.
-
- \sa number()
-*/
-
-uint QByteArray::toUInt(bool *ok, int base) const
-{
- return toIntegral_helper<uint>(nulTerminated().constData(), ok, base);
-}
-
-/*!
- \since 4.1
-
- Returns the byte array converted to a \c long int using base \a
- base, which is 10 by default and must be between 2 and 36, or 0.
-
- If \a base is 0, the base is determined automatically using the
- following rules: If the byte array begins with "0x", it is assumed to
- be hexadecimal; if it begins with "0", it is assumed to be octal;
- otherwise it is assumed to be decimal.
-
- Returns 0 if the conversion fails.
-
- If \a ok is not \nullptr, failure is reported by setting *\a{ok}
- to \c false, and success by setting *\a{ok} to \c true.
-
- \snippet code/src_corelib_tools_qbytearray.cpp 37
-
- \note The conversion of the number is performed in the default C locale,
- irrespective of the user's locale.
-
- \sa number()
-*/
-long QByteArray::toLong(bool *ok, int base) const
-{
- return toIntegral_helper<long>(nulTerminated().constData(), ok, base);
-}
-
-/*!
- \since 4.1
-
- Returns the byte array converted to an \c {unsigned long int} using base \a
- base, which is 10 by default and must be between 2 and 36, or 0.
-
- If \a base is 0, the base is determined automatically using the
- following rules: If the byte array begins with "0x", it is assumed to
- be hexadecimal; if it begins with "0", it is assumed to be octal;
- otherwise it is assumed to be decimal.
-
- Returns 0 if the conversion fails.
-
- If \a ok is not \nullptr, failure is reported by setting *\a{ok}
- to \c false, and success by setting *\a{ok} to \c true.
-
- \note The conversion of the number is performed in the default C locale,
- irrespective of the user's locale.
-
- \sa number()
-*/
-ulong QByteArray::toULong(bool *ok, int base) const
-{
- return toIntegral_helper<ulong>(nulTerminated().constData(), ok, base);
-}
-
-/*!
- Returns the byte array converted to a \c short using base \a
- base, which is 10 by default and must be between 2 and 36, or 0.
-
- If \a base is 0, the base is determined automatically using the
- following rules: If the byte array begins with "0x", it is assumed to
- be hexadecimal; if it begins with "0", it is assumed to be octal;
- otherwise it is assumed to be decimal.
-
- Returns 0 if the conversion fails.
-
- If \a ok is not \nullptr, failure is reported by setting *\a{ok}
- to \c false, and success by setting *\a{ok} to \c true.
-
- \note The conversion of the number is performed in the default C locale,
- irrespective of the user's locale.
-
- \sa number()
-*/
-
-short QByteArray::toShort(bool *ok, int base) const
-{
- return toIntegral_helper<short>(nulTerminated().constData(), ok, base);
-}
-
-/*!
- Returns the byte array converted to an \c {unsigned short} using base \a
- base, which is 10 by default and must be between 2 and 36, or 0.
-
- If \a base is 0, the base is determined automatically using the
- following rules: If the byte array begins with "0x", it is assumed to
- be hexadecimal; if it begins with "0", it is assumed to be octal;
- otherwise it is assumed to be decimal.
-
- Returns 0 if the conversion fails.
-
- If \a ok is not \nullptr, failure is reported by setting *\a{ok}
- to \c false, and success by setting *\a{ok} to \c true.
-
- \note The conversion of the number is performed in the default C locale,
- irrespective of the user's locale.
-
- \sa number()
-*/
-
-ushort QByteArray::toUShort(bool *ok, int base) const
-{
- return toIntegral_helper<ushort>(nulTerminated().constData(), ok, base);
-}
-
-
-/*!
- Returns the byte array converted to a \c double value.
-
- Returns an infinity if the conversion overflows or 0.0 if the
- conversion fails for other reasons (e.g. underflow).
-
- If \a ok is not \nullptr, failure is reported by setting *\a{ok}
- to \c false, and success by setting *\a{ok} to \c true.
-
- \snippet code/src_corelib_tools_qbytearray.cpp 38
-
- \warning The QByteArray content may only contain valid numerical characters
- which includes the plus/minus sign, the character e used in scientific
- notation, and the decimal point. Including the unit or additional characters
- leads to a conversion error.
-
- \note The conversion of the number is performed in the default C locale,
- irrespective of the user's locale.
-
- This function ignores leading and trailing whitespace.
-
- \sa number()
-*/
-
-double QByteArray::toDouble(bool *ok) const
-{
- QByteArray nulled = nulTerminated();
- bool nonNullOk = false;
- int processed = 0;
- double d = qt_asciiToDouble(nulled.constData(), nulled.length(),
- nonNullOk, processed, WhitespacesAllowed);
- if (ok)
- *ok = nonNullOk;
- return d;
-}
-
-/*!
- Returns the byte array converted to a \c float value.
-
- Returns an infinity if the conversion overflows or 0.0 if the
- conversion fails for other reasons (e.g. underflow).
-
- If \a ok is not \nullptr, failure is reported by setting *\a{ok}
- to \c false, and success by setting *\a{ok} to \c true.
-
- \snippet code/src_corelib_tools_qbytearray.cpp 38float
-
- \warning The QByteArray content may only contain valid numerical characters
- which includes the plus/minus sign, the character e used in scientific
- notation, and the decimal point. Including the unit or additional characters
- leads to a conversion error.
-
- \note The conversion of the number is performed in the default C locale,
- irrespective of the user's locale.
-
- This function ignores leading and trailing whitespace.
-
- \sa number()
-*/
-
-float QByteArray::toFloat(bool *ok) const
-{
- return QLocaleData::convertDoubleToFloat(toDouble(ok), ok);
-}
-
-/*!
- Returns a copy of the byte array, encoded as Base64.
-
- \snippet code/src_corelib_tools_qbytearray.cpp 39
-
- The algorithm used to encode Base64-encoded data is defined in \l{RFC 4648}.
-
- \sa fromBase64()
-*/
-QByteArray QByteArray::toBase64() const
-{
- return toBase64(Base64Encoding);
-}
-
-/*!
- \since 5.2
- \overload
-
- Returns a copy of the byte array, encoded using the options \a options.
-
- \snippet code/src_corelib_tools_qbytearray.cpp 39bis
-
- The algorithm used to encode Base64-encoded data is defined in \l{RFC 4648}.
-
- \sa fromBase64()
-*/
-QByteArray QByteArray::toBase64(Base64Options options) const
-{
- const char alphabet_base64[] = "ABCDEFGH" "IJKLMNOP" "QRSTUVWX" "YZabcdef"
- "ghijklmn" "opqrstuv" "wxyz0123" "456789+/";
- const char alphabet_base64url[] = "ABCDEFGH" "IJKLMNOP" "QRSTUVWX" "YZabcdef"
- "ghijklmn" "opqrstuv" "wxyz0123" "456789-_";
- const char *const alphabet = options & Base64UrlEncoding ? alphabet_base64url : alphabet_base64;
- const char padchar = '=';
- int padlen = 0;
-
- QByteArray tmp((d->size + 2) / 3 * 4, Qt::Uninitialized);
-
- int i = 0;
- char *out = tmp.data();
- while (i < d->size) {
- // encode 3 bytes at a time
- int chunk = 0;
- chunk |= int(uchar(d->data()[i++])) << 16;
- if (i == d->size) {
- padlen = 2;
- } else {
- chunk |= int(uchar(d->data()[i++])) << 8;
- if (i == d->size)
- padlen = 1;
- else
- chunk |= int(uchar(data()[i++]));
- }
-
- int j = (chunk & 0x00fc0000) >> 18;
- int k = (chunk & 0x0003f000) >> 12;
- int l = (chunk & 0x00000fc0) >> 6;
- int m = (chunk & 0x0000003f);
- *out++ = alphabet[j];
- *out++ = alphabet[k];
-
- if (padlen > 1) {
- if ((options & OmitTrailingEquals) == 0)
- *out++ = padchar;
- } else {
- *out++ = alphabet[l];
- }
- if (padlen > 0) {
- if ((options & OmitTrailingEquals) == 0)
- *out++ = padchar;
- } else {
- *out++ = alphabet[m];
- }
- }
- Q_ASSERT((options & OmitTrailingEquals) || (out == tmp.size() + tmp.data()));
- if (options & OmitTrailingEquals)
- tmp.truncate(out - tmp.data());
- return tmp;
-}
-
-/*!
- \fn QByteArray &QByteArray::setNum(int n, int base)
-
- Sets the byte array to the printed value of \a n in base \a base (10
- by default) and returns a reference to the byte array. The \a base can
- be any value between 2 and 36. For bases other than 10, n is treated
- as an unsigned integer.
-
- Example:
- \snippet code/src_corelib_tools_qbytearray.cpp 40
-
- \note The format of the number is not localized; the default C locale
- is used irrespective of the user's locale.
-
- \sa number(), toInt()
-*/
-
-/*!
- \fn QByteArray &QByteArray::setNum(uint n, int base)
- \overload
-
- \sa toUInt()
-*/
-
-/*!
- \fn QByteArray &QByteArray::setNum(short n, int base)
- \overload
-
- \sa toShort()
-*/
-
-/*!
- \fn QByteArray &QByteArray::setNum(ushort n, int base)
- \overload
-
- \sa toUShort()
-*/
-
-static char *qulltoa2(char *p, qulonglong n, int base)
-{
-#if defined(QT_CHECK_RANGE)
- if (base < 2 || base > 36) {
- qWarning("QByteArray::setNum: Invalid base %d", base);
- base = 10;
- }
-#endif
- const char b = 'a' - 10;
- do {
- const int c = n % base;
- n /= base;
- *--p = c + (c < 10 ? '0' : b);
- } while (n);
-
- return p;
-}
-
-/*!
- \overload
-
- \sa toLongLong()
-*/
-QByteArray &QByteArray::setNum(qlonglong n, int base)
-{
- const int buffsize = 66; // big enough for MAX_ULLONG in base 2
- char buff[buffsize];
- char *p;
-
- if (n < 0 && base == 10) {
- p = qulltoa2(buff + buffsize, qulonglong(-(1 + n)) + 1, base);
- *--p = '-';
- } else {
- p = qulltoa2(buff + buffsize, qulonglong(n), base);
- }
-
- clear();
- append(p, buffsize - (p - buff));
- return *this;
-}
-
-/*!
- \overload
-
- \sa toULongLong()
-*/
-
-QByteArray &QByteArray::setNum(qulonglong n, int base)
-{
- const int buffsize = 66; // big enough for MAX_ULLONG in base 2
- char buff[buffsize];
- char *p = qulltoa2(buff + buffsize, n, base);
-
- clear();
- append(p, buffsize - (p - buff));
- return *this;
-}
-
-/*!
- \overload
-
- Sets the byte array to the printed value of \a n, formatted in format
- \a f with precision \a prec, and returns a reference to the
- byte array.
-
- The format \a f can be any of the following:
-
- \table
- \header \li Format \li Meaning
- \row \li \c e \li format as [-]9.9e[+|-]999
- \row \li \c E \li format as [-]9.9E[+|-]999
- \row \li \c f \li format as [-]9.9
- \row \li \c g \li use \c e or \c f format, whichever is the most concise
- \row \li \c G \li use \c E or \c f format, whichever is the most concise
- \endtable
-
- With 'e', 'E', and 'f', \a prec is the number of digits after the
- decimal point. With 'g' and 'G', \a prec is the maximum number of
- significant digits (trailing zeroes are omitted).
-
- \note The format of the number is not localized; the default C locale
- is used irrespective of the user's locale.
-
- \sa toDouble()
-*/
-
-QByteArray &QByteArray::setNum(double n, char f, int prec)
-{
- QLocaleData::DoubleForm form = QLocaleData::DFDecimal;
- uint flags = QLocaleData::ZeroPadExponent;
-
- char lower = latin1_lowercased[uchar(f)];
- if (f != lower)
- flags |= QLocaleData::CapitalEorX;
- f = lower;
-
- switch (f) {
- case 'f':
- form = QLocaleData::DFDecimal;
- break;
- case 'e':
- form = QLocaleData::DFExponent;
- break;
- case 'g':
- form = QLocaleData::DFSignificantDigits;
- break;
- default:
-#if defined(QT_CHECK_RANGE)
- qWarning("QByteArray::setNum: Invalid format char '%c'", f);
-#endif
- break;
- }
-
- *this = QLocaleData::c()->doubleToString(n, prec, form, -1, flags).toLatin1();
- return *this;
-}
-
-/*!
- \fn QByteArray &QByteArray::setNum(float n, char f, int prec)
- \overload
-
- Sets the byte array to the printed value of \a n, formatted in format
- \a f with precision \a prec, and returns a reference to the
- byte array.
-
- \note The format of the number is not localized; the default C locale
- is used irrespective of the user's locale.
-
- \sa toFloat()
-*/
-
-/*!
- Returns a byte array containing the string equivalent of the
- number \a n to base \a base (10 by default). The \a base can be
- any value between 2 and 36.
-
- Example:
- \snippet code/src_corelib_tools_qbytearray.cpp 41
-
- \note The format of the number is not localized; the default C locale
- is used irrespective of the user's locale.
-
- \sa setNum(), toInt()
-*/
-QByteArray QByteArray::number(int n, int base)
-{
- QByteArray s;
- s.setNum(n, base);
- return s;
-}
-
-/*!
- \overload
-
- \sa toUInt()
-*/
-QByteArray QByteArray::number(uint n, int base)
-{
- QByteArray s;
- s.setNum(n, base);
- return s;
-}
-
-/*!
- \overload
-
- \sa toLongLong()
-*/
-QByteArray QByteArray::number(qlonglong n, int base)
-{
- QByteArray s;
- s.setNum(n, base);
- return s;
-}
-
-/*!
- \overload
-
- \sa toULongLong()
-*/
-QByteArray QByteArray::number(qulonglong n, int base)
-{
- QByteArray s;
- s.setNum(n, base);
- return s;
-}
-
-/*!
- \overload
-
- Returns a byte array that contains the printed value of \a n,
- formatted in format \a f with precision \a prec.
-
- Argument \a n is formatted according to the \a f format specified,
- which is \c g by default, and can be any of the following:
-
- \table
- \header \li Format \li Meaning
- \row \li \c e \li format as [-]9.9e[+|-]999
- \row \li \c E \li format as [-]9.9E[+|-]999
- \row \li \c f \li format as [-]9.9
- \row \li \c g \li use \c e or \c f format, whichever is the most concise
- \row \li \c G \li use \c E or \c f format, whichever is the most concise
- \endtable
-
- With 'e', 'E', and 'f', \a prec is the number of digits after the
- decimal point. With 'g' and 'G', \a prec is the maximum number of
- significant digits (trailing zeroes are omitted).
-
- \snippet code/src_corelib_tools_qbytearray.cpp 42
-
- \note The format of the number is not localized; the default C locale
- is used irrespective of the user's locale.
-
- \sa toDouble()
-*/
-QByteArray QByteArray::number(double n, char f, int prec)
-{
- QByteArray s;
- s.setNum(n, f, prec);
- return s;
-}
-
-/*!
- Constructs a QByteArray that uses the first \a size bytes of the
- \a data array. The bytes are \e not copied. The QByteArray will
- contain the \a data pointer. The caller guarantees that \a data
- will not be deleted or modified as long as this QByteArray and any
- copies of it exist that have not been modified. In other words,
- because QByteArray is an \l{implicitly shared} class and the
- instance returned by this function contains the \a data pointer,
- the caller must not delete \a data or modify it directly as long
- as the returned QByteArray and any copies exist. However,
- QByteArray does not take ownership of \a data, so the QByteArray
- destructor will never delete the raw \a data, even when the
- last QByteArray referring to \a data is destroyed.
-
- A subsequent attempt to modify the contents of the returned
- QByteArray or any copy made from it will cause it to create a deep
- copy of the \a data array before doing the modification. This
- ensures that the raw \a data array itself will never be modified
- by QByteArray.
-
- Here is an example of how to read data using a QDataStream on raw
- data in memory without copying the raw data into a QByteArray:
-
- \snippet code/src_corelib_tools_qbytearray.cpp 43
-
- \warning A byte array created with fromRawData() is \e not
- '\\0'-terminated, unless the raw data contains a 0 character at
- position \a size. While that does not matter for QDataStream or
- functions like indexOf(), passing the byte array to a function
- accepting a \c{const char *} expected to be '\\0'-terminated will
- fail.
-
- \sa setRawData(), data(), constData()
-*/
-
-QByteArray QByteArray::fromRawData(const char *data, int size)
-{
- Data *x;
- if (!data) {
- x = Data::sharedNull();
- } else if (!size) {
- x = Data::allocate(0);
- } else {
- x = Data::fromRawData(data, size);
- Q_CHECK_PTR(x);
- }
- QByteArrayDataPtr dataPtr = { x };
- return QByteArray(dataPtr);
-}
-
-/*!
- \since 4.7
-
- Resets the QByteArray to use the first \a size bytes of the
- \a data array. The bytes are \e not copied. The QByteArray will
- contain the \a data pointer. The caller guarantees that \a data
- will not be deleted or modified as long as this QByteArray and any
- copies of it exist that have not been modified.
-
- This function can be used instead of fromRawData() to re-use
- existing QByteArray objects to save memory re-allocations.
-
- \sa fromRawData(), data(), constData()
-*/
-QByteArray &QByteArray::setRawData(const char *data, uint size)
-{
- if (d->ref.isShared() || d->alloc) {
- *this = fromRawData(data, size);
- } else {
- if (data) {
- d->size = size;
- d->offset = data - reinterpret_cast<char *>(d);
- } else {
- d->offset = sizeof(QByteArrayData);
- d->size = 0;
- }
- }
- return *this;
-}
-
-/*!
- Returns a decoded copy of the Base64 array \a base64. Input is not checked
- for validity; invalid characters in the input are skipped, enabling the
- decoding process to continue with subsequent characters.
-
- For example:
-
- \snippet code/src_corelib_tools_qbytearray.cpp 44
-
- The algorithm used to decode Base64-encoded data is defined in \l{RFC 4648}.
-
- \sa toBase64()
-*/
-QByteArray QByteArray::fromBase64(const QByteArray &base64)
-{
- return fromBase64(base64, Base64Encoding);
-}
-
-/*!
- \since 5.2
- \overload
-
- Returns a decoded copy of the Base64 array \a base64, using the alphabet
- defined by \a options. Input is not checked for validity; invalid
- characters in the input are skipped, enabling the decoding process to
- continue with subsequent characters.
-
- For example:
-
- \snippet code/src_corelib_tools_qbytearray.cpp 44bis
-
- The algorithm used to decode Base64-encoded data is defined in \l{RFC 4648}.
-
- \sa toBase64()
-*/
-QByteArray QByteArray::fromBase64(const QByteArray &base64, Base64Options options)
-{
- unsigned int buf = 0;
- int nbits = 0;
- QByteArray tmp((base64.size() * 3) / 4, Qt::Uninitialized);
-
- int offset = 0;
- for (int i = 0; i < base64.size(); ++i) {
- int ch = base64.at(i);
- int d;
-
- if (ch >= 'A' && ch <= 'Z')
- d = ch - 'A';
- else if (ch >= 'a' && ch <= 'z')
- d = ch - 'a' + 26;
- else if (ch >= '0' && ch <= '9')
- d = ch - '0' + 52;
- else if (ch == '+' && (options & Base64UrlEncoding) == 0)
- d = 62;
- else if (ch == '-' && (options & Base64UrlEncoding) != 0)
- d = 62;
- else if (ch == '/' && (options & Base64UrlEncoding) == 0)
- d = 63;
- else if (ch == '_' && (options & Base64UrlEncoding) != 0)
- d = 63;
- else
- d = -1;
-
- if (d != -1) {
- buf = (buf << 6) | d;
- nbits += 6;
- if (nbits >= 8) {
- nbits -= 8;
- tmp[offset++] = buf >> nbits;
- buf &= (1 << nbits) - 1;
- }
- }
- }
-
- tmp.truncate(offset);
- return tmp;
-}
-
-/*!
- Returns a decoded copy of the hex encoded array \a hexEncoded. Input is not checked
- for validity; invalid characters in the input are skipped, enabling the
- decoding process to continue with subsequent characters.
-
- For example:
-
- \snippet code/src_corelib_tools_qbytearray.cpp 45
-
- \sa toHex()
-*/
-QByteArray QByteArray::fromHex(const QByteArray &hexEncoded)
-{
- QByteArray res((hexEncoded.size() + 1)/ 2, Qt::Uninitialized);
- uchar *result = (uchar *)res.data() + res.size();
-
- bool odd_digit = true;
- for (int i = hexEncoded.size() - 1; i >= 0; --i) {
- uchar ch = uchar(hexEncoded.at(i));
- int tmp = QtMiscUtils::fromHex(ch);
- if (tmp == -1)
- continue;
- if (odd_digit) {
- --result;
- *result = tmp;
- odd_digit = false;
- } else {
- *result |= tmp << 4;
- odd_digit = true;
- }
- }
-
- res.remove(0, result - (const uchar *)res.constData());
- return res;
-}
-
-/*!
- Returns a hex encoded copy of the byte array. The hex encoding uses the numbers 0-9 and
- the letters a-f.
-
- \sa fromHex()
-*/
-QByteArray QByteArray::toHex() const
-{
- return toHex('\0');
-}
-
-/*! \overload
- \since 5.9
-
- Returns a hex encoded copy of the byte array. The hex encoding uses the numbers 0-9 and
- the letters a-f.
-
- If \a separator is not '\0', the separator character is inserted between the hex bytes.
-
- Example:
- \snippet code/src_corelib_tools_qbytearray.cpp 50
-
- \sa fromHex()
-*/
-QByteArray QByteArray::toHex(char separator) const
-{
- if (!d->size)
- return QByteArray();
-
- const int length = separator ? (d->size * 3 - 1) : (d->size * 2);
- QByteArray hex(length, Qt::Uninitialized);
- char *hexData = hex.data();
- const uchar *data = (const uchar *)d->data();
- for (int i = 0, o = 0; i < d->size; ++i) {
- hexData[o++] = QtMiscUtils::toHexLower(data[i] >> 4);
- hexData[o++] = QtMiscUtils::toHexLower(data[i] & 0xf);
-
- if ((separator) && (o < length))
- hexData[o++] = separator;
- }
- return hex;
-}
-
-static void q_fromPercentEncoding(QByteArray *ba, char percent)
-{
- if (ba->isEmpty())
- return;
-
- char *data = ba->data();
- const char *inputPtr = data;
-
- int i = 0;
- int len = ba->count();
- int outlen = 0;
- int a, b;
- char c;
- while (i < len) {
- c = inputPtr[i];
- if (c == percent && i + 2 < len) {
- a = inputPtr[++i];
- b = inputPtr[++i];
-
- if (a >= '0' && a <= '9') a -= '0';
- else if (a >= 'a' && a <= 'f') a = a - 'a' + 10;
- else if (a >= 'A' && a <= 'F') a = a - 'A' + 10;
-
- if (b >= '0' && b <= '9') b -= '0';
- else if (b >= 'a' && b <= 'f') b = b - 'a' + 10;
- else if (b >= 'A' && b <= 'F') b = b - 'A' + 10;
-
- *data++ = (char)((a << 4) | b);
- } else {
- *data++ = c;
- }
-
- ++i;
- ++outlen;
- }
-
- if (outlen != len)
- ba->truncate(outlen);
-}
-
-void q_fromPercentEncoding(QByteArray *ba)
-{
- q_fromPercentEncoding(ba, '%');
-}
-
-/*!
- \since 4.4
-
- Returns a decoded copy of the URI/URL-style percent-encoded \a input.
- The \a percent parameter allows you to replace the '%' character for
- another (for instance, '_' or '=').
-
- For example:
- \snippet code/src_corelib_tools_qbytearray.cpp 51
-
- \note Given invalid input (such as a string containing the sequence "%G5",
- which is not a valid hexadecimal number) the output will be invalid as
- well. As an example: the sequence "%G5" could be decoded to 'W'.
-
- \sa toPercentEncoding(), QUrl::fromPercentEncoding()
-*/
-QByteArray QByteArray::fromPercentEncoding(const QByteArray &input, char percent)
-{
- if (input.isNull())
- return QByteArray(); // preserve null
- if (input.isEmpty())
- return QByteArray(input.data(), 0);
-
- QByteArray tmp = input;
- q_fromPercentEncoding(&tmp, percent);
- return tmp;
-}
-
-/*! \fn QByteArray QByteArray::fromStdString(const std::string &str)
- \since 5.4
-
- Returns a copy of the \a str string as a QByteArray.
-
- \sa toStdString(), QString::fromStdString()
-*/
-
-/*!
- \fn std::string QByteArray::toStdString() const
- \since 5.4
-
- Returns a std::string object with the data contained in this
- QByteArray.
-
- This operator is mostly useful to pass a QByteArray to a function
- that accepts a std::string object.
-
- \sa fromStdString(), QString::toStdString()
-*/
-
-static inline bool q_strchr(const char str[], char chr)
-{
- if (!str) return false;
-
- const char *ptr = str;
- char c;
- while ((c = *ptr++))
- if (c == chr)
- return true;
- return false;
-}
-
-static void q_toPercentEncoding(QByteArray *ba, const char *dontEncode, const char *alsoEncode, char percent)
-{
- if (ba->isEmpty())
- return;
-
- QByteArray input = *ba;
- int len = input.count();
- const char *inputData = input.constData();
- char *output = 0;
- int length = 0;
-
- for (int i = 0; i < len; ++i) {
- unsigned char c = *inputData++;
- if (((c >= 0x61 && c <= 0x7A) // ALPHA
- || (c >= 0x41 && c <= 0x5A) // ALPHA
- || (c >= 0x30 && c <= 0x39) // DIGIT
- || c == 0x2D // -
- || c == 0x2E // .
- || c == 0x5F // _
- || c == 0x7E // ~
- || q_strchr(dontEncode, c))
- && !q_strchr(alsoEncode, c)) {
- if (output)
- output[length] = c;
- ++length;
- } else {
- if (!output) {
- // detach now
- ba->resize(len*3); // worst case
- output = ba->data();
- }
- output[length++] = percent;
- output[length++] = QtMiscUtils::toHexUpper((c & 0xf0) >> 4);
- output[length++] = QtMiscUtils::toHexUpper(c & 0xf);
- }
- }
- if (output)
- ba->truncate(length);
-}
-
-void q_toPercentEncoding(QByteArray *ba, const char *exclude, const char *include)
-{
- q_toPercentEncoding(ba, exclude, include, '%');
-}
-
-void q_normalizePercentEncoding(QByteArray *ba, const char *exclude)
-{
- q_fromPercentEncoding(ba, '%');
- q_toPercentEncoding(ba, exclude, 0, '%');
-}
-
-/*!
- \since 4.4
-
- Returns a URI/URL-style percent-encoded copy of this byte array. The
- \a percent parameter allows you to override the default '%'
- character for another.
-
- By default, this function will encode all characters that are not
- one of the following:
-
- ALPHA ("a" to "z" and "A" to "Z") / DIGIT (0 to 9) / "-" / "." / "_" / "~"
-
- To prevent characters from being encoded pass them to \a
- exclude. To force characters to be encoded pass them to \a
- include. The \a percent character is always encoded.
-
- Example:
-
- \snippet code/src_corelib_tools_qbytearray.cpp 52
-
- The hex encoding uses the numbers 0-9 and the uppercase letters A-F.
-
- \sa fromPercentEncoding(), QUrl::toPercentEncoding()
-*/
-QByteArray QByteArray::toPercentEncoding(const QByteArray &exclude, const QByteArray &include,
- char percent) const
-{
- if (isNull())
- return QByteArray(); // preserve null
- if (isEmpty())
- return QByteArray(data(), 0);
-
- QByteArray include2 = include;
- if (percent != '%') // the default
- if ((percent >= 0x61 && percent <= 0x7A) // ALPHA
- || (percent >= 0x41 && percent <= 0x5A) // ALPHA
- || (percent >= 0x30 && percent <= 0x39) // DIGIT
- || percent == 0x2D // -
- || percent == 0x2E // .
- || percent == 0x5F // _
- || percent == 0x7E) // ~
- include2 += percent;
-
- QByteArray result = *this;
- q_toPercentEncoding(&result, exclude.nulTerminated().constData(), include2.nulTerminated().constData(), percent);
-
- return result;
-}
-
-/*! \typedef QByteArray::ConstIterator
- \internal
-*/
-
-/*! \typedef QByteArray::Iterator
- \internal
-*/
-
-/*! \typedef QByteArray::const_iterator
-
- This typedef provides an STL-style const iterator for QByteArray.
-
- \sa QByteArray::const_reverse_iterator, QByteArray::iterator
-*/
-
-/*! \typedef QByteArray::iterator
-
- This typedef provides an STL-style non-const iterator for QByteArray.
-
- \sa QByteArray::reverse_iterator, QByteArray::const_iterator
-*/
-
-/*! \typedef QByteArray::const_reverse_iterator
- \since 5.6
-
- This typedef provides an STL-style const reverse iterator for QByteArray.
-
- \sa QByteArray::reverse_iterator, QByteArray::const_iterator
-*/
-
-/*! \typedef QByteArray::reverse_iterator
- \since 5.6
-
- This typedef provides an STL-style non-const reverse iterator for QByteArray.
-
- \sa QByteArray::const_reverse_iterator, QByteArray::iterator
-*/
-
-/*! \typedef QByteArray::size_type
- \internal
-*/
-
-/*! \typedef QByteArray::difference_type
- \internal
-*/
-
-/*! \typedef QByteArray::const_reference
- \internal
-*/
-
-/*! \typedef QByteArray::reference
- \internal
-*/
-
-/*! \typedef QByteArray::const_pointer
- \internal
-*/
-
-/*! \typedef QByteArray::pointer
- \internal
-*/
-
-/*! \typedef QByteArray::value_type
- \internal
- */
-
-/*!
- \fn DataPtr &QByteArray::data_ptr()
- \internal
-*/
-
-/*!
- \typedef QByteArray::DataPtr
- \internal
-*/
-
-/*!
- \macro QByteArrayLiteral(ba)
- \relates QByteArray
-
- The macro generates the data for a QByteArray out of the string literal
- \a ba at compile time. Creating a QByteArray from it is free in this case, and
- the generated byte array data is stored in the read-only segment of the
- compiled object file.
-
- For instance:
-
- \snippet code/src_corelib_tools_qbytearray.cpp 53
-
- Using QByteArrayLiteral instead of a double quoted plain C++ string literal
- can significantly speed up creation of QByteArray instances from data known
- at compile time.
-
- \sa QStringLiteral
-*/
-
-QT_END_NAMESPACE
diff --git a/src/corelib/tools/qbytearray.h b/src/corelib/tools/qbytearray.h
deleted file mode 100644
index 8ee3a29ecc..0000000000
--- a/src/corelib/tools/qbytearray.h
+++ /dev/null
@@ -1,712 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Copyright (C) 2016 Intel Corporation.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#ifndef QBYTEARRAY_H
-#define QBYTEARRAY_H
-
-#include <QtCore/qrefcount.h>
-#include <QtCore/qnamespace.h>
-#include <QtCore/qarraydata.h>
-
-#include <stdlib.h>
-#include <string.h>
-#include <stdarg.h>
-
-#include <string>
-#include <iterator>
-
-#ifdef truncate
-#error qbytearray.h must be included before any header file that defines truncate
-#endif
-
-#if defined(Q_OS_DARWIN) || defined(Q_QDOC)
-Q_FORWARD_DECLARE_CF_TYPE(CFData);
-Q_FORWARD_DECLARE_OBJC_CLASS(NSData);
-#endif
-
-QT_BEGIN_NAMESPACE
-
-
-/*****************************************************************************
- Safe and portable C string functions; extensions to standard string.h
- *****************************************************************************/
-
-Q_CORE_EXPORT char *qstrdup(const char *);
-
-inline uint qstrlen(const char *str)
-{ return str ? uint(strlen(str)) : 0; }
-
-inline uint qstrnlen(const char *str, uint maxlen)
-{
- uint length = 0;
- if (str) {
- while (length < maxlen && *str++)
- length++;
- }
- return length;
-}
-
-Q_CORE_EXPORT char *qstrcpy(char *dst, const char *src);
-Q_CORE_EXPORT char *qstrncpy(char *dst, const char *src, uint len);
-
-Q_CORE_EXPORT int qstrcmp(const char *str1, const char *str2);
-Q_CORE_EXPORT int qstrcmp(const QByteArray &str1, const QByteArray &str2);
-Q_CORE_EXPORT int qstrcmp(const QByteArray &str1, const char *str2);
-static inline int qstrcmp(const char *str1, const QByteArray &str2)
-{ return -qstrcmp(str2, str1); }
-
-inline int qstrncmp(const char *str1, const char *str2, uint len)
-{
- return (str1 && str2) ? strncmp(str1, str2, len)
- : (str1 ? 1 : (str2 ? -1 : 0));
-}
-Q_CORE_EXPORT int qstricmp(const char *, const char *);
-Q_CORE_EXPORT int qstrnicmp(const char *, const char *, uint len);
-Q_CORE_EXPORT int qstrnicmp(const char *, qsizetype, const char *, qsizetype = -1);
-
-// implemented in qvsnprintf.cpp
-Q_CORE_EXPORT int qvsnprintf(char *str, size_t n, const char *fmt, va_list ap);
-Q_CORE_EXPORT int qsnprintf(char *str, size_t n, const char *fmt, ...);
-
-// qChecksum: Internet checksum
-Q_CORE_EXPORT quint16 qChecksum(const char *s, uint len); // ### Qt 6: Remove
-Q_CORE_EXPORT quint16 qChecksum(const char *s, uint len, Qt::ChecksumType standard); // ### Qt 6: Use Qt::ChecksumType standard = Qt::ChecksumIso3309
-
-class QByteRef;
-class QString;
-class QDataStream;
-template <typename T> class QList;
-
-typedef QArrayData QByteArrayData;
-
-template<int N> struct QStaticByteArrayData
-{
- QByteArrayData ba;
- char data[N + 1];
-
- QByteArrayData *data_ptr() const
- {
- Q_ASSERT(ba.ref.isStatic());
- return const_cast<QByteArrayData *>(&ba);
- }
-};
-
-struct QByteArrayDataPtr
-{
- QByteArrayData *ptr;
-};
-
-#define Q_STATIC_BYTE_ARRAY_DATA_HEADER_INITIALIZER_WITH_OFFSET(size, offset) \
- Q_STATIC_ARRAY_DATA_HEADER_INITIALIZER_WITH_OFFSET(size, offset)
- /**/
-
-#define Q_STATIC_BYTE_ARRAY_DATA_HEADER_INITIALIZER(size) \
- Q_STATIC_BYTE_ARRAY_DATA_HEADER_INITIALIZER_WITH_OFFSET(size, sizeof(QByteArrayData)) \
- /**/
-
-# define QByteArrayLiteral(str) \
- ([]() -> QByteArray { \
- enum { Size = sizeof(str) - 1 }; \
- static const QStaticByteArrayData<Size> qbytearray_literal = { \
- Q_STATIC_BYTE_ARRAY_DATA_HEADER_INITIALIZER(Size), \
- str }; \
- QByteArrayDataPtr holder = { qbytearray_literal.data_ptr() }; \
- const QByteArray ba(holder); \
- return ba; \
- }()) \
- /**/
-
-class Q_CORE_EXPORT QByteArray
-{
-private:
- typedef QTypedArrayData<char> Data;
-
-public:
- enum Base64Option {
- Base64Encoding = 0,
- Base64UrlEncoding = 1,
-
- KeepTrailingEquals = 0,
- OmitTrailingEquals = 2
- };
- Q_DECLARE_FLAGS(Base64Options, Base64Option)
-
- inline QByteArray() Q_DECL_NOTHROW;
- QByteArray(const char *, int size = -1);
- QByteArray(int size, char c);
- QByteArray(int size, Qt::Initialization);
- inline QByteArray(const QByteArray &) Q_DECL_NOTHROW;
- inline ~QByteArray();
-
- QByteArray &operator=(const QByteArray &) Q_DECL_NOTHROW;
- QByteArray &operator=(const char *str);
-#ifdef Q_COMPILER_RVALUE_REFS
- inline QByteArray(QByteArray && other) Q_DECL_NOTHROW : d(other.d) { other.d = Data::sharedNull(); }
- inline QByteArray &operator=(QByteArray &&other) Q_DECL_NOTHROW
- { qSwap(d, other.d); return *this; }
-#endif
-
- inline void swap(QByteArray &other) Q_DECL_NOTHROW
- { qSwap(d, other.d); }
-
- inline int size() const;
- inline bool isEmpty() const;
- void resize(int size);
-
- QByteArray &fill(char c, int size = -1);
-
- inline int capacity() const;
- inline void reserve(int size);
- inline void squeeze();
-
-#ifndef QT_NO_CAST_FROM_BYTEARRAY
- inline operator const char *() const;
- inline operator const void *() const;
-#endif
- inline char *data();
- inline const char *data() const;
- inline const char *constData() const;
- inline void detach();
- inline bool isDetached() const;
- inline bool isSharedWith(const QByteArray &other) const { return d == other.d; }
- void clear();
-
- inline char at(int i) const;
- inline char operator[](int i) const;
- inline char operator[](uint i) const;
- inline QByteRef operator[](int i);
- inline QByteRef operator[](uint i);
- Q_REQUIRED_RESULT char front() const { return at(0); }
- Q_REQUIRED_RESULT inline QByteRef front();
- Q_REQUIRED_RESULT char back() const { return at(size() - 1); }
- Q_REQUIRED_RESULT inline QByteRef back();
-
- int indexOf(char c, int from = 0) const;
- int indexOf(const char *c, int from = 0) const;
- int indexOf(const QByteArray &a, int from = 0) const;
- int lastIndexOf(char c, int from = -1) const;
- int lastIndexOf(const char *c, int from = -1) const;
- int lastIndexOf(const QByteArray &a, int from = -1) const;
-
- inline bool contains(char c) const;
- inline bool contains(const char *a) const;
- inline bool contains(const QByteArray &a) const;
- int count(char c) const;
- int count(const char *a) const;
- int count(const QByteArray &a) const;
-
- inline int compare(const char *c, Qt::CaseSensitivity cs = Qt::CaseSensitive) const;
- inline int compare(const QByteArray &a, Qt::CaseSensitivity cs = Qt::CaseSensitive) const;
-
- Q_REQUIRED_RESULT QByteArray left(int len) const;
- Q_REQUIRED_RESULT QByteArray right(int len) const;
- Q_REQUIRED_RESULT QByteArray mid(int index, int len = -1) const;
- Q_REQUIRED_RESULT QByteArray chopped(int len) const
- { Q_ASSERT(len >= 0); Q_ASSERT(len <= size()); return left(size() - len); }
-
- bool startsWith(const QByteArray &a) const;
- bool startsWith(char c) const;
- bool startsWith(const char *c) const;
-
- bool endsWith(const QByteArray &a) const;
- bool endsWith(char c) const;
- bool endsWith(const char *c) const;
-
- bool isUpper() const;
- bool isLower() const;
-
- void truncate(int pos);
- void chop(int n);
-
-#if defined(Q_COMPILER_REF_QUALIFIERS) && !defined(QT_COMPILING_QSTRING_COMPAT_CPP) && !defined(Q_CLANG_QDOC)
-# if defined(Q_CC_GNU) && !defined(Q_CC_CLANG) && !defined(Q_CC_INTEL) && !QT_HAS_CPP_ATTRIBUTE(nodiscard)
- // required due to https://gcc.gnu.org/bugzilla/show_bug.cgi?id=61941
-# pragma push_macro("Q_REQUIRED_RESULT")
-# undef Q_REQUIRED_RESULT
-# define Q_REQUIRED_RESULT
-# define Q_REQUIRED_RESULT_pushed
-# endif
- Q_REQUIRED_RESULT QByteArray toLower() const &
- { return toLower_helper(*this); }
- Q_REQUIRED_RESULT QByteArray toLower() &&
- { return toLower_helper(*this); }
- Q_REQUIRED_RESULT QByteArray toUpper() const &
- { return toUpper_helper(*this); }
- Q_REQUIRED_RESULT QByteArray toUpper() &&
- { return toUpper_helper(*this); }
- Q_REQUIRED_RESULT QByteArray trimmed() const &
- { return trimmed_helper(*this); }
- Q_REQUIRED_RESULT QByteArray trimmed() &&
- { return trimmed_helper(*this); }
- Q_REQUIRED_RESULT QByteArray simplified() const &
- { return simplified_helper(*this); }
- Q_REQUIRED_RESULT QByteArray simplified() &&
- { return simplified_helper(*this); }
-# ifdef Q_REQUIRED_RESULT_pushed
-# pragma pop_macro("Q_REQUIRED_RESULT")
-# endif
-#else
- Q_REQUIRED_RESULT QByteArray toLower() const;
- Q_REQUIRED_RESULT QByteArray toUpper() const;
- Q_REQUIRED_RESULT QByteArray trimmed() const;
- Q_REQUIRED_RESULT QByteArray simplified() const;
-#endif
-
- Q_REQUIRED_RESULT QByteArray leftJustified(int width, char fill = ' ', bool truncate = false) const;
- Q_REQUIRED_RESULT QByteArray rightJustified(int width, char fill = ' ', bool truncate = false) const;
-
- QByteArray &prepend(char c);
- inline QByteArray &prepend(int count, char c);
- QByteArray &prepend(const char *s);
- QByteArray &prepend(const char *s, int len);
- QByteArray &prepend(const QByteArray &a);
- QByteArray &append(char c);
- inline QByteArray &append(int count, char c);
- QByteArray &append(const char *s);
- QByteArray &append(const char *s, int len);
- QByteArray &append(const QByteArray &a);
- QByteArray &insert(int i, char c);
- QByteArray &insert(int i, int count, char c);
- QByteArray &insert(int i, const char *s);
- QByteArray &insert(int i, const char *s, int len);
- QByteArray &insert(int i, const QByteArray &a);
- QByteArray &remove(int index, int len);
- QByteArray &replace(int index, int len, const char *s);
- QByteArray &replace(int index, int len, const char *s, int alen);
- QByteArray &replace(int index, int len, const QByteArray &s);
- inline QByteArray &replace(char before, const char *after);
- QByteArray &replace(char before, const QByteArray &after);
- inline QByteArray &replace(const char *before, const char *after);
- QByteArray &replace(const char *before, int bsize, const char *after, int asize);
- QByteArray &replace(const QByteArray &before, const QByteArray &after);
- inline QByteArray &replace(const QByteArray &before, const char *after);
- QByteArray &replace(const char *before, const QByteArray &after);
- QByteArray &replace(char before, char after);
- inline QByteArray &operator+=(char c);
- inline QByteArray &operator+=(const char *s);
- inline QByteArray &operator+=(const QByteArray &a);
-
- QList<QByteArray> split(char sep) const;
-
- Q_REQUIRED_RESULT QByteArray repeated(int times) const;
-
-#ifndef QT_NO_CAST_TO_ASCII
- QT_ASCII_CAST_WARN QByteArray &append(const QString &s);
- QT_ASCII_CAST_WARN QByteArray &insert(int i, const QString &s);
- QT_ASCII_CAST_WARN QByteArray &replace(const QString &before, const char *after);
- QT_ASCII_CAST_WARN QByteArray &replace(char c, const QString &after);
- QT_ASCII_CAST_WARN QByteArray &replace(const QString &before, const QByteArray &after);
-
- QT_ASCII_CAST_WARN QByteArray &operator+=(const QString &s);
- QT_ASCII_CAST_WARN int indexOf(const QString &s, int from = 0) const;
- QT_ASCII_CAST_WARN int lastIndexOf(const QString &s, int from = -1) const;
-#endif
-#if !defined(QT_NO_CAST_FROM_ASCII) && !defined(QT_RESTRICTED_CAST_FROM_ASCII)
- inline QT_ASCII_CAST_WARN bool operator==(const QString &s2) const;
- inline QT_ASCII_CAST_WARN bool operator!=(const QString &s2) const;
- inline QT_ASCII_CAST_WARN bool operator<(const QString &s2) const;
- inline QT_ASCII_CAST_WARN bool operator>(const QString &s2) const;
- inline QT_ASCII_CAST_WARN bool operator<=(const QString &s2) const;
- inline QT_ASCII_CAST_WARN bool operator>=(const QString &s2) const;
-#endif
-
- short toShort(bool *ok = nullptr, int base = 10) const;
- ushort toUShort(bool *ok = nullptr, int base = 10) const;
- int toInt(bool *ok = nullptr, int base = 10) const;
- uint toUInt(bool *ok = nullptr, int base = 10) const;
- long toLong(bool *ok = nullptr, int base = 10) const;
- ulong toULong(bool *ok = nullptr, int base = 10) const;
- qlonglong toLongLong(bool *ok = nullptr, int base = 10) const;
- qulonglong toULongLong(bool *ok = nullptr, int base = 10) const;
- float toFloat(bool *ok = nullptr) const;
- double toDouble(bool *ok = nullptr) const;
- QByteArray toBase64(Base64Options options) const;
- QByteArray toBase64() const; // ### Qt6 merge with previous
- QByteArray toHex() const;
- QByteArray toHex(char separator) const; // ### Qt6 merge with previous
- QByteArray toPercentEncoding(const QByteArray &exclude = QByteArray(),
- const QByteArray &include = QByteArray(),
- char percent = '%') const;
-
- inline QByteArray &setNum(short, int base = 10);
- inline QByteArray &setNum(ushort, int base = 10);
- inline QByteArray &setNum(int, int base = 10);
- inline QByteArray &setNum(uint, int base = 10);
- QByteArray &setNum(qlonglong, int base = 10);
- QByteArray &setNum(qulonglong, int base = 10);
- inline QByteArray &setNum(float, char f = 'g', int prec = 6);
- QByteArray &setNum(double, char f = 'g', int prec = 6);
- QByteArray &setRawData(const char *a, uint n); // ### Qt 6: use an int
-
- Q_REQUIRED_RESULT static QByteArray number(int, int base = 10);
- Q_REQUIRED_RESULT static QByteArray number(uint, int base = 10);
- Q_REQUIRED_RESULT static QByteArray number(qlonglong, int base = 10);
- Q_REQUIRED_RESULT static QByteArray number(qulonglong, int base = 10);
- Q_REQUIRED_RESULT static QByteArray number(double, char f = 'g', int prec = 6);
- Q_REQUIRED_RESULT static QByteArray fromRawData(const char *, int size);
- Q_REQUIRED_RESULT static QByteArray fromBase64(const QByteArray &base64, Base64Options options);
- Q_REQUIRED_RESULT static QByteArray fromBase64(const QByteArray &base64); // ### Qt6 merge with previous
- Q_REQUIRED_RESULT static QByteArray fromHex(const QByteArray &hexEncoded);
- Q_REQUIRED_RESULT static QByteArray fromPercentEncoding(const QByteArray &pctEncoded, char percent = '%');
-
-#if defined(Q_OS_DARWIN) || defined(Q_QDOC)
- static QByteArray fromCFData(CFDataRef data);
- static QByteArray fromRawCFData(CFDataRef data);
- CFDataRef toCFData() const Q_DECL_CF_RETURNS_RETAINED;
- CFDataRef toRawCFData() const Q_DECL_CF_RETURNS_RETAINED;
- static QByteArray fromNSData(const NSData *data);
- static QByteArray fromRawNSData(const NSData *data);
- NSData *toNSData() const Q_DECL_NS_RETURNS_AUTORELEASED;
- NSData *toRawNSData() const Q_DECL_NS_RETURNS_AUTORELEASED;
-#endif
-
- typedef char *iterator;
- typedef const char *const_iterator;
- typedef iterator Iterator;
- typedef const_iterator ConstIterator;
- typedef std::reverse_iterator<iterator> reverse_iterator;
- typedef std::reverse_iterator<const_iterator> const_reverse_iterator;
- inline iterator begin();
- inline const_iterator begin() const;
- inline const_iterator cbegin() const;
- inline const_iterator constBegin() const;
- inline iterator end();
- inline const_iterator end() const;
- inline const_iterator cend() const;
- inline const_iterator constEnd() const;
- reverse_iterator rbegin() { return reverse_iterator(end()); }
- reverse_iterator rend() { return reverse_iterator(begin()); }
- const_reverse_iterator rbegin() const { return const_reverse_iterator(end()); }
- const_reverse_iterator rend() const { return const_reverse_iterator(begin()); }
- const_reverse_iterator crbegin() const { return const_reverse_iterator(end()); }
- const_reverse_iterator crend() const { return const_reverse_iterator(begin()); }
-
- // stl compatibility
- typedef int size_type;
- typedef qptrdiff difference_type;
- typedef const char & const_reference;
- typedef char & reference;
- typedef char *pointer;
- typedef const char *const_pointer;
- typedef char value_type;
- inline void push_back(char c);
- inline void push_back(const char *c);
- inline void push_back(const QByteArray &a);
- inline void push_front(char c);
- inline void push_front(const char *c);
- inline void push_front(const QByteArray &a);
- void shrink_to_fit() { squeeze(); }
-
- static inline QByteArray fromStdString(const std::string &s);
- inline std::string toStdString() const;
-
- inline int count() const { return d->size; }
- int length() const { return d->size; }
- bool isNull() const;
-
- inline QByteArray(QByteArrayDataPtr dd)
- : d(static_cast<Data *>(dd.ptr))
- {
- }
-
-private:
- operator QNoImplicitBoolCast() const;
- Data *d;
- void reallocData(uint alloc, Data::AllocationOptions options);
- void expand(int i);
- QByteArray nulTerminated() const;
-
- static QByteArray toLower_helper(const QByteArray &a);
- static QByteArray toLower_helper(QByteArray &a);
- static QByteArray toUpper_helper(const QByteArray &a);
- static QByteArray toUpper_helper(QByteArray &a);
- static QByteArray trimmed_helper(const QByteArray &a);
- static QByteArray trimmed_helper(QByteArray &a);
- static QByteArray simplified_helper(const QByteArray &a);
- static QByteArray simplified_helper(QByteArray &a);
-
- friend class QByteRef;
- friend class QString;
- friend Q_CORE_EXPORT QByteArray qUncompress(const uchar *data, int nbytes);
-public:
- typedef Data * DataPtr;
- inline DataPtr &data_ptr() { return d; }
-};
-
-Q_DECLARE_OPERATORS_FOR_FLAGS(QByteArray::Base64Options)
-
-inline QByteArray::QByteArray() Q_DECL_NOTHROW : d(Data::sharedNull()) { }
-inline QByteArray::~QByteArray() { if (!d->ref.deref()) Data::deallocate(d); }
-inline int QByteArray::size() const
-{ return d->size; }
-
-inline char QByteArray::at(int i) const
-{ Q_ASSERT(uint(i) < uint(size())); return d->data()[i]; }
-inline char QByteArray::operator[](int i) const
-{ Q_ASSERT(uint(i) < uint(size())); return d->data()[i]; }
-inline char QByteArray::operator[](uint i) const
-{ Q_ASSERT(i < uint(size())); return d->data()[i]; }
-
-inline bool QByteArray::isEmpty() const
-{ return d->size == 0; }
-#ifndef QT_NO_CAST_FROM_BYTEARRAY
-inline QByteArray::operator const char *() const
-{ return d->data(); }
-inline QByteArray::operator const void *() const
-{ return d->data(); }
-#endif
-inline char *QByteArray::data()
-{ detach(); return d->data(); }
-inline const char *QByteArray::data() const
-{ return d->data(); }
-inline const char *QByteArray::constData() const
-{ return d->data(); }
-inline void QByteArray::detach()
-{ if (d->ref.isShared() || (d->offset != sizeof(QByteArrayData))) reallocData(uint(d->size) + 1u, d->detachFlags()); }
-inline bool QByteArray::isDetached() const
-{ return !d->ref.isShared(); }
-inline QByteArray::QByteArray(const QByteArray &a) Q_DECL_NOTHROW : d(a.d)
-{ d->ref.ref(); }
-
-inline int QByteArray::capacity() const
-{ return d->alloc ? d->alloc - 1 : 0; }
-
-inline void QByteArray::reserve(int asize)
-{
- if (d->ref.isShared() || uint(asize) + 1u > d->alloc) {
- reallocData(qMax(uint(size()), uint(asize)) + 1u, d->detachFlags() | Data::CapacityReserved);
- } else {
- // cannot set unconditionally, since d could be the shared_null or
- // otherwise static
- d->capacityReserved = true;
- }
-}
-
-inline void QByteArray::squeeze()
-{
- if (d->ref.isShared() || uint(d->size) + 1u < d->alloc) {
- reallocData(uint(d->size) + 1u, d->detachFlags() & ~Data::CapacityReserved);
- } else {
- // cannot set unconditionally, since d could be shared_null or
- // otherwise static.
- d->capacityReserved = false;
- }
-}
-
-class Q_CORE_EXPORT QByteRef {
- QByteArray &a;
- int i;
- inline QByteRef(QByteArray &array, int idx)
- : a(array),i(idx) {}
- friend class QByteArray;
-public:
- inline operator char() const
- { return i < a.d->size ? a.d->data()[i] : char(0); }
- inline QByteRef &operator=(char c)
- { if (i >= a.d->size) a.expand(i); else a.detach();
- a.d->data()[i] = c; return *this; }
- inline QByteRef &operator=(const QByteRef &c)
- { if (i >= a.d->size) a.expand(i); else a.detach();
- a.d->data()[i] = c.a.d->data()[c.i]; return *this; }
- inline bool operator==(char c) const
- { return a.d->data()[i] == c; }
- inline bool operator!=(char c) const
- { return a.d->data()[i] != c; }
- inline bool operator>(char c) const
- { return a.d->data()[i] > c; }
- inline bool operator>=(char c) const
- { return a.d->data()[i] >= c; }
- inline bool operator<(char c) const
- { return a.d->data()[i] < c; }
- inline bool operator<=(char c) const
- { return a.d->data()[i] <= c; }
-};
-
-inline QByteRef QByteArray::operator[](int i)
-{ Q_ASSERT(i >= 0); return QByteRef(*this, i); }
-inline QByteRef QByteArray::operator[](uint i)
-{ return QByteRef(*this, i); }
-inline QByteRef QByteArray::front() { return operator[](0); }
-inline QByteRef QByteArray::back() { return operator[](size() - 1); }
-inline QByteArray::iterator QByteArray::begin()
-{ detach(); return d->data(); }
-inline QByteArray::const_iterator QByteArray::begin() const
-{ return d->data(); }
-inline QByteArray::const_iterator QByteArray::cbegin() const
-{ return d->data(); }
-inline QByteArray::const_iterator QByteArray::constBegin() const
-{ return d->data(); }
-inline QByteArray::iterator QByteArray::end()
-{ detach(); return d->data() + d->size; }
-inline QByteArray::const_iterator QByteArray::end() const
-{ return d->data() + d->size; }
-inline QByteArray::const_iterator QByteArray::cend() const
-{ return d->data() + d->size; }
-inline QByteArray::const_iterator QByteArray::constEnd() const
-{ return d->data() + d->size; }
-inline QByteArray &QByteArray::append(int n, char ch)
-{ return insert(d->size, n, ch); }
-inline QByteArray &QByteArray::prepend(int n, char ch)
-{ return insert(0, n, ch); }
-inline QByteArray &QByteArray::operator+=(char c)
-{ return append(c); }
-inline QByteArray &QByteArray::operator+=(const char *s)
-{ return append(s); }
-inline QByteArray &QByteArray::operator+=(const QByteArray &a)
-{ return append(a); }
-inline void QByteArray::push_back(char c)
-{ append(c); }
-inline void QByteArray::push_back(const char *c)
-{ append(c); }
-inline void QByteArray::push_back(const QByteArray &a)
-{ append(a); }
-inline void QByteArray::push_front(char c)
-{ prepend(c); }
-inline void QByteArray::push_front(const char *c)
-{ prepend(c); }
-inline void QByteArray::push_front(const QByteArray &a)
-{ prepend(a); }
-inline bool QByteArray::contains(const QByteArray &a) const
-{ return indexOf(a) != -1; }
-inline bool QByteArray::contains(char c) const
-{ return indexOf(c) != -1; }
-inline int QByteArray::compare(const char *c, Qt::CaseSensitivity cs) const
-{
- return cs == Qt::CaseSensitive ? qstrcmp(*this, c) :
- qstrnicmp(data(), size(), c, -1);
-}
-inline int QByteArray::compare(const QByteArray &a, Qt::CaseSensitivity cs) const
-{
- return cs == Qt::CaseSensitive ? qstrcmp(*this, a) :
- qstrnicmp(data(), size(), a.data(), a.size());
-}
-inline bool operator==(const QByteArray &a1, const QByteArray &a2) Q_DECL_NOTHROW
-{ return (a1.size() == a2.size()) && (memcmp(a1.constData(), a2.constData(), a1.size())==0); }
-inline bool operator==(const QByteArray &a1, const char *a2) Q_DECL_NOTHROW
-{ return a2 ? qstrcmp(a1,a2) == 0 : a1.isEmpty(); }
-inline bool operator==(const char *a1, const QByteArray &a2) Q_DECL_NOTHROW
-{ return a1 ? qstrcmp(a1,a2) == 0 : a2.isEmpty(); }
-inline bool operator!=(const QByteArray &a1, const QByteArray &a2) Q_DECL_NOTHROW
-{ return !(a1==a2); }
-inline bool operator!=(const QByteArray &a1, const char *a2) Q_DECL_NOTHROW
-{ return a2 ? qstrcmp(a1,a2) != 0 : !a1.isEmpty(); }
-inline bool operator!=(const char *a1, const QByteArray &a2) Q_DECL_NOTHROW
-{ return a1 ? qstrcmp(a1,a2) != 0 : !a2.isEmpty(); }
-inline bool operator<(const QByteArray &a1, const QByteArray &a2) Q_DECL_NOTHROW
-{ return qstrcmp(a1, a2) < 0; }
- inline bool operator<(const QByteArray &a1, const char *a2) Q_DECL_NOTHROW
-{ return qstrcmp(a1, a2) < 0; }
-inline bool operator<(const char *a1, const QByteArray &a2) Q_DECL_NOTHROW
-{ return qstrcmp(a1, a2) < 0; }
-inline bool operator<=(const QByteArray &a1, const QByteArray &a2) Q_DECL_NOTHROW
-{ return qstrcmp(a1, a2) <= 0; }
-inline bool operator<=(const QByteArray &a1, const char *a2) Q_DECL_NOTHROW
-{ return qstrcmp(a1, a2) <= 0; }
-inline bool operator<=(const char *a1, const QByteArray &a2) Q_DECL_NOTHROW
-{ return qstrcmp(a1, a2) <= 0; }
-inline bool operator>(const QByteArray &a1, const QByteArray &a2) Q_DECL_NOTHROW
-{ return qstrcmp(a1, a2) > 0; }
-inline bool operator>(const QByteArray &a1, const char *a2) Q_DECL_NOTHROW
-{ return qstrcmp(a1, a2) > 0; }
-inline bool operator>(const char *a1, const QByteArray &a2) Q_DECL_NOTHROW
-{ return qstrcmp(a1, a2) > 0; }
-inline bool operator>=(const QByteArray &a1, const QByteArray &a2) Q_DECL_NOTHROW
-{ return qstrcmp(a1, a2) >= 0; }
-inline bool operator>=(const QByteArray &a1, const char *a2) Q_DECL_NOTHROW
-{ return qstrcmp(a1, a2) >= 0; }
-inline bool operator>=(const char *a1, const QByteArray &a2) Q_DECL_NOTHROW
-{ return qstrcmp(a1, a2) >= 0; }
-#if !defined(QT_USE_QSTRINGBUILDER)
-inline const QByteArray operator+(const QByteArray &a1, const QByteArray &a2)
-{ return QByteArray(a1) += a2; }
-inline const QByteArray operator+(const QByteArray &a1, const char *a2)
-{ return QByteArray(a1) += a2; }
-inline const QByteArray operator+(const QByteArray &a1, char a2)
-{ return QByteArray(a1) += a2; }
-inline const QByteArray operator+(const char *a1, const QByteArray &a2)
-{ return QByteArray(a1) += a2; }
-inline const QByteArray operator+(char a1, const QByteArray &a2)
-{ return QByteArray(&a1, 1) += a2; }
-#endif // QT_USE_QSTRINGBUILDER
-inline bool QByteArray::contains(const char *c) const
-{ return indexOf(c) != -1; }
-inline QByteArray &QByteArray::replace(char before, const char *c)
-{ return replace(&before, 1, c, qstrlen(c)); }
-inline QByteArray &QByteArray::replace(const QByteArray &before, const char *c)
-{ return replace(before.constData(), before.size(), c, qstrlen(c)); }
-inline QByteArray &QByteArray::replace(const char *before, const char *after)
-{ return replace(before, qstrlen(before), after, qstrlen(after)); }
-
-inline QByteArray &QByteArray::setNum(short n, int base)
-{ return base == 10 ? setNum(qlonglong(n), base) : setNum(qulonglong(ushort(n)), base); }
-inline QByteArray &QByteArray::setNum(ushort n, int base)
-{ return setNum(qulonglong(n), base); }
-inline QByteArray &QByteArray::setNum(int n, int base)
-{ return base == 10 ? setNum(qlonglong(n), base) : setNum(qulonglong(uint(n)), base); }
-inline QByteArray &QByteArray::setNum(uint n, int base)
-{ return setNum(qulonglong(n), base); }
-inline QByteArray &QByteArray::setNum(float n, char f, int prec)
-{ return setNum(double(n),f,prec); }
-
-inline std::string QByteArray::toStdString() const
-{ return std::string(constData(), length()); }
-
-inline QByteArray QByteArray::fromStdString(const std::string &s)
-{ return QByteArray(s.data(), int(s.size())); }
-
-#if !defined(QT_NO_DATASTREAM) || (defined(QT_BOOTSTRAPPED) && !defined(QT_BUILD_QMAKE))
-Q_CORE_EXPORT QDataStream &operator<<(QDataStream &, const QByteArray &);
-Q_CORE_EXPORT QDataStream &operator>>(QDataStream &, QByteArray &);
-#endif
-
-#ifndef QT_NO_COMPRESS
-Q_CORE_EXPORT QByteArray qCompress(const uchar* data, int nbytes, int compressionLevel = -1);
-Q_CORE_EXPORT QByteArray qUncompress(const uchar* data, int nbytes);
-inline QByteArray qCompress(const QByteArray& data, int compressionLevel = -1)
-{ return qCompress(reinterpret_cast<const uchar *>(data.constData()), data.size(), compressionLevel); }
-inline QByteArray qUncompress(const QByteArray& data)
-{ return qUncompress(reinterpret_cast<const uchar*>(data.constData()), data.size()); }
-#endif
-
-Q_DECLARE_SHARED(QByteArray)
-
-QT_END_NAMESPACE
-
-#endif // QBYTEARRAY_H
diff --git a/src/corelib/tools/qbytearray_p.h b/src/corelib/tools/qbytearray_p.h
deleted file mode 100644
index 6ebff739cd..0000000000
--- a/src/corelib/tools/qbytearray_p.h
+++ /dev/null
@@ -1,66 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#ifndef QBYTEARRAY_P_H
-#define QBYTEARRAY_P_H
-
-//
-// W A R N I N G
-// -------------
-//
-// This file is not part of the Qt API. It exists for the convenience
-// of other Qt classes. This header file may change from version to
-// version without notice, or even be removed.
-//
-// We mean it.
-//
-
-#include <QtCore/qbytearray.h>
-#include "qtools_p.h"
-
-QT_BEGIN_NAMESPACE
-
-enum {
- // Define as enum to force inlining. Don't expose MaxAllocSize in a public header.
- MaxByteArraySize = MaxAllocSize - sizeof(std::remove_pointer<QByteArray::DataPtr>::type)
-};
-
-QT_END_NAMESPACE
-
-#endif // QBYTEARRAY_P_H
diff --git a/src/corelib/tools/qbytearraylist.cpp b/src/corelib/tools/qbytearraylist.cpp
deleted file mode 100644
index d04555ed4d..0000000000
--- a/src/corelib/tools/qbytearraylist.cpp
+++ /dev/null
@@ -1,175 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Copyright (C) 2014 by Southwest Research Institute (R)
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#include <qbytearraylist.h>
-
-QT_BEGIN_NAMESPACE
-
-/*! \typedef QByteArrayListIterator
- \relates QByteArrayList
-
- The QByteArrayListIterator type definition provides a Java-style const
- iterator for QByteArrayList.
-
- QByteArrayList provides both \l{Java-style iterators} and
- \l{STL-style iterators}. The Java-style const iterator is simply
- a type definition for QListIterator<QByteArray>.
-
- \sa QMutableByteArrayListIterator, QByteArrayList::const_iterator
-*/
-
-/*! \typedef QMutableByteArrayListIterator
- \relates QByteArrayList
-
- The QByteArrayListIterator type definition provides a Java-style
- non-const iterator for QByteArrayList.
-
- QByteArrayList provides both \l{Java-style iterators} and
- \l{STL-style iterators}. The Java-style non-const iterator is
- simply a type definition for QMutableListIterator<QByteArray>.
-
- \sa QByteArrayListIterator, QByteArrayList::iterator
-*/
-
-/*!
- \class QByteArrayList
- \inmodule QtCore
- \since 5.4
- \brief The QByteArrayList class provides a list of byte arrays.
-
- \ingroup tools
- \ingroup shared
- \ingroup string-processing
-
- \reentrant
-
- QByteArrayList is actually just a QList<QByteArray>. It is documented as a
- full class just for simplicity of documenting the member methods that exist
- only in QList<QByteArray>.
-
- All of QList's functionality also applies to QByteArrayList. For example, you
- can use isEmpty() to test whether the list is empty, and you can call
- functions like append(), prepend(), insert(), replace(), removeAll(),
- removeAt(), removeFirst(), removeLast(), and removeOne() to modify a
- QByteArrayList. In addition, QByteArrayList provides several join()
- methods for concatenating the list into a single QByteArray.
-
- The purpose of QByteArrayList is quite different from that of QStringList.
- Whereas QStringList has many methods for manipulation of elements within
- the list, QByteArrayList does not.
- Normally, QStringList should be used whenever working with a list of printable
- strings. QByteArrayList should be used to handle and efficiently join large blobs
- of binary data, as when sequentially receiving serialized data through a
- QIODevice.
-
- \sa QByteArray, QStringList
-*/
-
-/*!
- \fn QByteArray QByteArrayList::join() const
-
- Joins all the byte arrays into a single byte array.
-*/
-
-/*!
- \fn QByteArray QByteArrayList::join(const QByteArray &separator) const
-
- Joins all the byte arrays into a single byte array with each
- element separated by the given \a separator.
-*/
-
-/*!
- \fn QByteArray QByteArrayList::join(char separator) const
-
- Joins all the byte arrays into a single byte array with each
- element separated by the given \a separator.
-*/
-
-static int QByteArrayList_joinedSize(const QByteArrayList *that, int seplen)
-{
- int totalLength = 0;
- const int size = that->size();
-
- for (int i = 0; i < size; ++i)
- totalLength += that->at(i).size();
-
- if (size > 0)
- totalLength += seplen * (size - 1);
-
- return totalLength;
-}
-
-QByteArray QtPrivate::QByteArrayList_join(const QByteArrayList *that, const char *sep, int seplen)
-{
- QByteArray res;
- if (const int joinedSize = QByteArrayList_joinedSize(that, seplen))
- res.reserve(joinedSize); // don't call reserve(0) - it allocates one byte for the NUL
- const int size = that->size();
- for (int i = 0; i < size; ++i) {
- if (i)
- res.append(sep, seplen);
- res += that->at(i);
- }
- return res;
-}
-
-/*!
- \fn int QByteArrayList::indexOf(const char *needle, int from) const
-
- Returns the index position of the first occurrence of \a needle in
- the list, searching forward from index position \a from. Returns
- -1 if no item matched.
-
- \a needle must be NUL-terminated.
-
- This overload doesn't require creating a QByteArray, thus saving a
- memory allocation and some CPU time.
-
- \since 5.13
- \overload
-*/
-
-int QtPrivate::QByteArrayList_indexOf(const QByteArrayList *that, const char *needle, int from)
-{
- const auto it = std::find_if(that->begin() + from, that->end(), [needle](const QByteArray &item) { return item == needle; });
- return it == that->end() ? -1 : int(std::distance(that->begin(), it));
-}
-
-QT_END_NAMESPACE
diff --git a/src/corelib/tools/qbytearraylist.h b/src/corelib/tools/qbytearraylist.h
deleted file mode 100644
index 1261e1757c..0000000000
--- a/src/corelib/tools/qbytearraylist.h
+++ /dev/null
@@ -1,91 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Copyright (C) 2016 Intel Corporation.
-** Copyright (C) 2014 by Southwest Research Institute (R)
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#include <QtCore/qlist.h>
-
-#ifndef QBYTEARRAYLIST_H
-#define QBYTEARRAYLIST_H
-
-#include <QtCore/qbytearray.h>
-
-QT_BEGIN_NAMESPACE
-
-typedef QListIterator<QByteArray> QByteArrayListIterator;
-typedef QMutableListIterator<QByteArray> QMutableByteArrayListIterator;
-#ifndef Q_CLANG_QDOC
-typedef QList<QByteArray> QByteArrayList;
-
-namespace QtPrivate {
- QByteArray Q_CORE_EXPORT QByteArrayList_join(const QByteArrayList *that, const char *separator, int separatorLength);
- int Q_CORE_EXPORT QByteArrayList_indexOf(const QByteArrayList *that, const char *needle, int from);
-}
-#endif
-
-#ifdef Q_CLANG_QDOC
-class QByteArrayList : public QList<QByteArray>
-#else
-template <> struct QListSpecialMethods<QByteArray>
-#endif
-{
-#ifndef Q_CLANG_QDOC
-protected:
- ~QListSpecialMethods() = default;
-#endif
-public:
- inline QByteArray join() const
- { return QtPrivate::QByteArrayList_join(self(), nullptr, 0); }
- inline QByteArray join(const QByteArray &sep) const
- { return QtPrivate::QByteArrayList_join(self(), sep.constData(), sep.size()); }
- inline QByteArray join(char sep) const
- { return QtPrivate::QByteArrayList_join(self(), &sep, 1); }
-
- inline int indexOf(const char *needle, int from = 0) const
- { return QtPrivate::QByteArrayList_indexOf(self(), needle, from); }
-
-private:
- typedef QList<QByteArray> Self;
- Self *self() { return static_cast<Self *>(this); }
- const Self *self() const { return static_cast<const Self *>(this); }
-};
-
-QT_END_NAMESPACE
-
-#endif // QBYTEARRAYLIST_H
diff --git a/src/corelib/tools/qbytearraymatcher.cpp b/src/corelib/tools/qbytearraymatcher.cpp
deleted file mode 100644
index 72f0e0519d..0000000000
--- a/src/corelib/tools/qbytearraymatcher.cpp
+++ /dev/null
@@ -1,435 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#include "qbytearraymatcher.h"
-
-#include <limits.h>
-
-QT_BEGIN_NAMESPACE
-
-static inline void bm_init_skiptable(const uchar *cc, int len, uchar *skiptable)
-{
- int l = qMin(len, 255);
- memset(skiptable, l, 256*sizeof(uchar));
- cc += len - l;
- while (l--)
- skiptable[*cc++] = l;
-}
-
-static inline int bm_find(const uchar *cc, int l, int index, const uchar *puc, uint pl,
- const uchar *skiptable)
-{
- if (pl == 0)
- return index > l ? -1 : index;
- const uint pl_minus_one = pl - 1;
-
- const uchar *current = cc + index + pl_minus_one;
- const uchar *end = cc + l;
- while (current < end) {
- uint skip = skiptable[*current];
- if (!skip) {
- // possible match
- while (skip < pl) {
- if (*(current - skip) != puc[pl_minus_one - skip])
- break;
- skip++;
- }
- if (skip > pl_minus_one) // we have a match
- return (current - cc) - skip + 1;
-
- // in case we don't have a match we are a bit inefficient as we only skip by one
- // when we have the non matching char in the string.
- if (skiptable[*(current - skip)] == pl)
- skip = pl - skip;
- else
- skip = 1;
- }
- if (current > end - skip)
- break;
- current += skip;
- }
- return -1; // not found
-}
-
-/*! \class QByteArrayMatcher
- \inmodule QtCore
- \brief The QByteArrayMatcher class holds a sequence of bytes that
- can be quickly matched in a byte array.
-
- \ingroup tools
- \ingroup string-processing
-
- This class is useful when you have a sequence of bytes that you
- want to repeatedly match against some byte arrays (perhaps in a
- loop), or when you want to search for the same sequence of bytes
- multiple times in the same byte array. Using a matcher object and
- indexIn() is faster than matching a plain QByteArray with
- QByteArray::indexOf() if repeated matching takes place. This
- class offers no benefit if you are doing one-off byte array
- matches.
-
- Create the QByteArrayMatcher with the QByteArray you want to
- search for. Then call indexIn() on the QByteArray that you want to
- search.
-
- \sa QByteArray, QStringMatcher
-*/
-
-/*!
- Constructs an empty byte array matcher that won't match anything.
- Call setPattern() to give it a pattern to match.
-*/
-QByteArrayMatcher::QByteArrayMatcher()
- : d(0)
-{
- p.p = 0;
- p.l = 0;
- memset(p.q_skiptable, 0, sizeof(p.q_skiptable));
-}
-
-/*!
- Constructs a byte array matcher from \a pattern. \a pattern
- has the given \a length. \a pattern must remain in scope, but
- the destructor does not delete \a pattern.
- */
-QByteArrayMatcher::QByteArrayMatcher(const char *pattern, int length)
- : d(0)
-{
- p.p = reinterpret_cast<const uchar *>(pattern);
- p.l = length;
- bm_init_skiptable(p.p, p.l, p.q_skiptable);
-}
-
-/*!
- Constructs a byte array matcher that will search for \a pattern.
- Call indexIn() to perform a search.
-*/
-QByteArrayMatcher::QByteArrayMatcher(const QByteArray &pattern)
- : d(0), q_pattern(pattern)
-{
- p.p = reinterpret_cast<const uchar *>(pattern.constData());
- p.l = pattern.size();
- bm_init_skiptable(p.p, p.l, p.q_skiptable);
-}
-
-/*!
- Copies the \a other byte array matcher to this byte array matcher.
-*/
-QByteArrayMatcher::QByteArrayMatcher(const QByteArrayMatcher &other)
- : d(0)
-{
- operator=(other);
-}
-
-/*!
- Destroys the byte array matcher.
-*/
-QByteArrayMatcher::~QByteArrayMatcher()
-{
- Q_UNUSED(d);
-}
-
-/*!
- Assigns the \a other byte array matcher to this byte array matcher.
-*/
-QByteArrayMatcher &QByteArrayMatcher::operator=(const QByteArrayMatcher &other)
-{
- q_pattern = other.q_pattern;
- memcpy(&p, &other.p, sizeof(p));
- return *this;
-}
-
-/*!
- Sets the byte array that this byte array matcher will search for
- to \a pattern.
-
- \sa pattern(), indexIn()
-*/
-void QByteArrayMatcher::setPattern(const QByteArray &pattern)
-{
- q_pattern = pattern;
- p.p = reinterpret_cast<const uchar *>(pattern.constData());
- p.l = pattern.size();
- bm_init_skiptable(p.p, p.l, p.q_skiptable);
-}
-
-/*!
- Searches the byte array \a ba, from byte position \a from (default
- 0, i.e. from the first byte), for the byte array pattern() that
- was set in the constructor or in the most recent call to
- setPattern(). Returns the position where the pattern() matched in
- \a ba, or -1 if no match was found.
-*/
-int QByteArrayMatcher::indexIn(const QByteArray &ba, int from) const
-{
- if (from < 0)
- from = 0;
- return bm_find(reinterpret_cast<const uchar *>(ba.constData()), ba.size(), from,
- p.p, p.l, p.q_skiptable);
-}
-
-/*!
- Searches the char string \a str, which has length \a len, from
- byte position \a from (default 0, i.e. from the first byte), for
- the byte array pattern() that was set in the constructor or in the
- most recent call to setPattern(). Returns the position where the
- pattern() matched in \a str, or -1 if no match was found.
-*/
-int QByteArrayMatcher::indexIn(const char *str, int len, int from) const
-{
- if (from < 0)
- from = 0;
- return bm_find(reinterpret_cast<const uchar *>(str), len, from,
- p.p, p.l, p.q_skiptable);
-}
-
-/*!
- \fn QByteArray QByteArrayMatcher::pattern() const
-
- Returns the byte array pattern that this byte array matcher will
- search for.
-
- \sa setPattern()
-*/
-
-
-static int findChar(const char *str, int len, char ch, int from)
-{
- const uchar *s = (const uchar *)str;
- uchar c = (uchar)ch;
- if (from < 0)
- from = qMax(from + len, 0);
- if (from < len) {
- const uchar *n = s + from - 1;
- const uchar *e = s + len;
- while (++n != e)
- if (*n == c)
- return n - s;
- }
- return -1;
-}
-
-/*!
- \internal
- */
-static int qFindByteArrayBoyerMoore(
- const char *haystack, int haystackLen, int haystackOffset,
- const char *needle, int needleLen)
-{
- uchar skiptable[256];
- bm_init_skiptable((const uchar *)needle, needleLen, skiptable);
- if (haystackOffset < 0)
- haystackOffset = 0;
- return bm_find((const uchar *)haystack, haystackLen, haystackOffset,
- (const uchar *)needle, needleLen, skiptable);
-}
-
-#define REHASH(a) \
- if (sl_minus_1 < sizeof(uint) * CHAR_BIT) \
- hashHaystack -= uint(a) << sl_minus_1; \
- hashHaystack <<= 1
-
-/*!
- \internal
- */
-int qFindByteArray(
- const char *haystack0, int haystackLen, int from,
- const char *needle, int needleLen)
-{
- const int l = haystackLen;
- const int sl = needleLen;
- if (from < 0)
- from += l;
- if (uint(sl + from) > (uint)l)
- return -1;
- if (!sl)
- return from;
- if (!l)
- return -1;
-
- if (sl == 1)
- return findChar(haystack0, haystackLen, needle[0], from);
-
- /*
- We use the Boyer-Moore algorithm in cases where the overhead
- for the skip table should pay off, otherwise we use a simple
- hash function.
- */
- if (l > 500 && sl > 5)
- return qFindByteArrayBoyerMoore(haystack0, haystackLen, from,
- needle, needleLen);
-
- /*
- We use some hashing for efficiency's sake. Instead of
- comparing strings, we compare the hash value of str with that
- of a part of this QString. Only if that matches, we call memcmp().
- */
- const char *haystack = haystack0 + from;
- const char *end = haystack0 + (l - sl);
- const uint sl_minus_1 = sl - 1;
- uint hashNeedle = 0, hashHaystack = 0;
- int idx;
- for (idx = 0; idx < sl; ++idx) {
- hashNeedle = ((hashNeedle<<1) + needle[idx]);
- hashHaystack = ((hashHaystack<<1) + haystack[idx]);
- }
- hashHaystack -= *(haystack + sl_minus_1);
-
- while (haystack <= end) {
- hashHaystack += *(haystack + sl_minus_1);
- if (hashHaystack == hashNeedle && *needle == *haystack
- && memcmp(needle, haystack, sl) == 0)
- return haystack - haystack0;
-
- REHASH(*haystack);
- ++haystack;
- }
- return -1;
-}
-
-/*!
- \class QStaticByteArrayMatcherBase
- \since 5.9
- \internal
- \brief Non-template base class of QStaticByteArrayMatcher.
-*/
-
-/*!
- \class QStaticByteArrayMatcher
- \since 5.9
- \inmodule QtCore
- \brief The QStaticByteArrayMatcher class is a compile-time version of QByteArrayMatcher.
-
- \ingroup tools
- \ingroup string-processing
-
- This class is useful when you have a sequence of bytes that you
- want to repeatedly match against some byte arrays (perhaps in a
- loop), or when you want to search for the same sequence of bytes
- multiple times in the same byte array. Using a matcher object and
- indexIn() is faster than matching a plain QByteArray with
- QByteArray::indexOf(), in particular if repeated matching takes place.
-
- Unlike QByteArrayMatcher, this class calculates the internal
- representation at \e{compile-time}, if your compiler supports
- C++14-level \c{constexpr} (C++11 is not sufficient), so it can
- even benefit if you are doing one-off byte array matches.
-
- Create the QStaticByteArrayMatcher by calling qMakeStaticByteArrayMatcher(),
- passing it the C string literal you want to search for. Store the return
- value of that function in a \c{static const auto} variable, so you don't need
- to pass the \c{N} template parameter explicitly:
-
- \snippet code/src_corelib_tools_qbytearraymatcher.cpp 0
-
- Then call indexIn() on the QByteArray in which you want to search, just like
- with QByteArrayMatcher.
-
- Since this class is designed to do all the up-front calculations at compile-time,
- it does not offer a setPattern() method.
-
- \note Qt detects the necessary C++14 compiler support by way of the feature
- test recommendations from
- \l{https://isocpp.org/std/standing-documents/sd-6-sg10-feature-test-recommendations}
- {C++ Committee's Standing Document 6}.
-
- \sa QByteArrayMatcher, QStringMatcher
-*/
-
-/*!
- \fn template <uint N> int QStaticByteArrayMatcher<N>::indexIn(const char *haystack, int hlen, int from = 0) const
-
- Searches the char string \a haystack, which has length \a hlen, from
- byte position \a from (default 0, i.e. from the first byte), for
- the byte array pattern() that was set in the constructor.
-
- Returns the position where the pattern() matched in \a haystack, or -1 if no match was found.
-*/
-
-/*!
- \fn template <uint N> int QStaticByteArrayMatcher<N>::indexIn(const QByteArray &haystack, int from = 0) const
-
- Searches the char string \a haystack, from byte position \a from
- (default 0, i.e. from the first byte), for the byte array pattern()
- that was set in the constructor.
-
- Returns the position where the pattern() matched in \a haystack, or -1 if no match was found.
-*/
-
-/*!
- \fn template <uint N> QByteArray QStaticByteArrayMatcher<N>::pattern() const
-
- Returns the byte array pattern that this byte array matcher will
- search for.
-
- \sa QByteArrayMatcher::setPattern()
-*/
-
-/*!
- \internal
-*/
-int QStaticByteArrayMatcherBase::indexOfIn(const char *needle, uint nlen, const char *haystack, int hlen, int from) const Q_DECL_NOTHROW
-{
- if (from < 0)
- from = 0;
- return bm_find(reinterpret_cast<const uchar *>(haystack), hlen, from,
- reinterpret_cast<const uchar *>(needle), nlen, m_skiptable.data);
-}
-
-/*!
- \fn template <uint N> QStaticByteArrayMatcher<N>::QStaticByteArrayMatcher(const char (&pattern)[N])
- \internal
-*/
-
-/*!
- \fn template <uint N> QStaticByteArrayMatcher qMakeStaticByteArrayMatcher(const char (&pattern)[N])
- \since 5.9
- \relates QStaticByteArrayMatcher
-
- Return a QStaticByteArrayMatcher with the correct \c{N} determined
- automatically from the \a pattern passed.
-
- To take full advantage of this function, assign the result to an
- \c{auto} variable:
-
- \snippet code/src_corelib_tools_qbytearraymatcher.cpp 1
-*/
-
-
-QT_END_NAMESPACE
diff --git a/src/corelib/tools/qbytearraymatcher.h b/src/corelib/tools/qbytearraymatcher.h
deleted file mode 100644
index dafaea9c12..0000000000
--- a/src/corelib/tools/qbytearraymatcher.h
+++ /dev/null
@@ -1,164 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#ifndef QBYTEARRAYMATCHER_H
-#define QBYTEARRAYMATCHER_H
-
-#include <QtCore/qbytearray.h>
-
-QT_BEGIN_NAMESPACE
-
-
-class QByteArrayMatcherPrivate;
-
-class Q_CORE_EXPORT QByteArrayMatcher
-{
-public:
- QByteArrayMatcher();
- explicit QByteArrayMatcher(const QByteArray &pattern);
- explicit QByteArrayMatcher(const char *pattern, int length);
- QByteArrayMatcher(const QByteArrayMatcher &other);
- ~QByteArrayMatcher();
-
- QByteArrayMatcher &operator=(const QByteArrayMatcher &other);
-
- void setPattern(const QByteArray &pattern);
-
- int indexIn(const QByteArray &ba, int from = 0) const;
- int indexIn(const char *str, int len, int from = 0) const;
- inline QByteArray pattern() const
- {
- if (q_pattern.isNull())
- return QByteArray(reinterpret_cast<const char*>(p.p), p.l);
- return q_pattern;
- }
-
-private:
- QByteArrayMatcherPrivate *d;
- QByteArray q_pattern;
- struct Data {
- uchar q_skiptable[256];
- const uchar *p;
- int l;
- };
- union {
- uint dummy[256];
- Data p;
- };
-};
-
-class QStaticByteArrayMatcherBase
-{
- Q_DECL_ALIGN(16)
- struct Skiptable {
- uchar data[256];
- } m_skiptable;
-protected:
- explicit Q_DECL_RELAXED_CONSTEXPR QStaticByteArrayMatcherBase(const char *pattern, uint n) Q_DECL_NOTHROW
- : m_skiptable(generate(pattern, n)) {}
- // compiler-generated copy/more ctors/assignment operators are ok!
- // compiler-generated dtor is ok!
-
- Q_CORE_EXPORT int indexOfIn(const char *needle, uint nlen, const char *haystack, int hlen, int from) const Q_DECL_NOTHROW;
-
-private:
- static Q_DECL_RELAXED_CONSTEXPR Skiptable generate(const char *pattern, uint n) Q_DECL_NOTHROW
- {
- const auto uchar_max = (std::numeric_limits<uchar>::max)();
- uchar max = n > uchar_max ? uchar_max : n;
- Skiptable table = {
- // this verbose initialization code aims to avoid some opaque error messages
- // even on powerful compilers such as GCC 5.3. Even though for GCC a loop
- // format can be found that v5.3 groks, it's probably better to go with this
- // for the time being:
- {
- max, max, max, max, max, max, max, max, max, max, max, max, max, max, max, max,
- max, max, max, max, max, max, max, max, max, max, max, max, max, max, max, max,
- max, max, max, max, max, max, max, max, max, max, max, max, max, max, max, max,
- max, max, max, max, max, max, max, max, max, max, max, max, max, max, max, max,
- max, max, max, max, max, max, max, max, max, max, max, max, max, max, max, max,
- max, max, max, max, max, max, max, max, max, max, max, max, max, max, max, max,
- max, max, max, max, max, max, max, max, max, max, max, max, max, max, max, max,
- max, max, max, max, max, max, max, max, max, max, max, max, max, max, max, max,
-
- max, max, max, max, max, max, max, max, max, max, max, max, max, max, max, max,
- max, max, max, max, max, max, max, max, max, max, max, max, max, max, max, max,
- max, max, max, max, max, max, max, max, max, max, max, max, max, max, max, max,
- max, max, max, max, max, max, max, max, max, max, max, max, max, max, max, max,
- max, max, max, max, max, max, max, max, max, max, max, max, max, max, max, max,
- max, max, max, max, max, max, max, max, max, max, max, max, max, max, max, max,
- max, max, max, max, max, max, max, max, max, max, max, max, max, max, max, max,
- max, max, max, max, max, max, max, max, max, max, max, max, max, max, max, max,
- }
- };
- pattern += n - max;
- while (max--)
- table.data[uchar(*pattern++)] = max;
- return table;
- }
-};
-
-template <uint N>
-class QStaticByteArrayMatcher : QStaticByteArrayMatcherBase
-{
- char m_pattern[N];
- Q_STATIC_ASSERT_X(N > 2, "QStaticByteArrayMatcher makes no sense for finding a single-char pattern");
-public:
- explicit Q_DECL_RELAXED_CONSTEXPR QStaticByteArrayMatcher(const char (&patternToMatch)[N]) Q_DECL_NOTHROW
- : QStaticByteArrayMatcherBase(patternToMatch, N - 1), m_pattern()
- {
- for (uint i = 0; i < N; ++i)
- m_pattern[i] = patternToMatch[i];
- }
-
- int indexIn(const QByteArray &haystack, int from = 0) const Q_DECL_NOTHROW
- { return this->indexOfIn(m_pattern, N - 1, haystack.data(), haystack.size(), from); }
- int indexIn(const char *haystack, int hlen, int from = 0) const Q_DECL_NOTHROW
- { return this->indexOfIn(m_pattern, N - 1, haystack, hlen, from); }
-
- QByteArray pattern() const { return QByteArray(m_pattern, int(N - 1)); }
-};
-
-template <uint N>
-Q_DECL_RELAXED_CONSTEXPR QStaticByteArrayMatcher<N> qMakeStaticByteArrayMatcher(const char (&pattern)[N]) Q_DECL_NOTHROW
-{ return QStaticByteArrayMatcher<N>(pattern); }
-
-QT_END_NAMESPACE
-
-#endif // QBYTEARRAYMATCHER_H
diff --git a/src/corelib/tools/qbytedata_p.h b/src/corelib/tools/qbytedata_p.h
deleted file mode 100644
index 8331be112d..0000000000
--- a/src/corelib/tools/qbytedata_p.h
+++ /dev/null
@@ -1,245 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#ifndef QBYTEDATA_P_H
-#define QBYTEDATA_P_H
-
-//
-// W A R N I N G
-// -------------
-//
-// This file is not part of the Qt API. It exists purely as an
-// implementation detail. This header file may change from version to
-// version without notice, or even be removed.
-//
-// We mean it.
-//
-
-#include <QtCore/private/qglobal_p.h>
-#include <qbytearray.h>
-
-QT_BEGIN_NAMESPACE
-
-// this class handles a list of QByteArrays. It is a variant of QRingBuffer
-// that avoid malloc/realloc/memcpy.
-class QByteDataBuffer
-{
-private:
- QList<QByteArray> buffers;
- qint64 bufferCompleteSize;
- qint64 firstPos;
-public:
- QByteDataBuffer() : bufferCompleteSize(0), firstPos(0)
- {
- }
-
- ~QByteDataBuffer()
- {
- clear();
- }
-
- static inline void popFront(QByteArray &ba, qint64 n)
- {
- ba = QByteArray(ba.constData() + n, ba.size() - n);
- }
-
- inline void squeezeFirst()
- {
- if (!buffers.isEmpty() && firstPos > 0) {
- popFront(buffers.first(), firstPos);
- firstPos = 0;
- }
- }
-
- inline void append(const QByteDataBuffer& other)
- {
- if (other.isEmpty())
- return;
-
- buffers.append(other.buffers);
- bufferCompleteSize += other.byteAmount();
-
- if (other.firstPos > 0)
- popFront(buffers[bufferCount() - other.bufferCount()], other.firstPos);
- }
-
-
- inline void append(const QByteArray& bd)
- {
- if (bd.isEmpty())
- return;
-
- buffers.append(bd);
- bufferCompleteSize += bd.size();
- }
-
- inline void prepend(const QByteArray& bd)
- {
- if (bd.isEmpty())
- return;
-
- squeezeFirst();
-
- buffers.prepend(bd);
- bufferCompleteSize += bd.size();
- }
-
- // return the first QByteData. User of this function has to free() its .data!
- // preferably use this function to read data.
- inline QByteArray read()
- {
- squeezeFirst();
- bufferCompleteSize -= buffers.first().size();
- return buffers.takeFirst();
- }
-
- // return everything. User of this function has to free() its .data!
- // avoid to use this, it might malloc and memcpy.
- inline QByteArray readAll()
- {
- return read(byteAmount());
- }
-
- // return amount. User of this function has to free() its .data!
- // avoid to use this, it might malloc and memcpy.
- inline QByteArray read(qint64 amount)
- {
- amount = qMin(byteAmount(), amount);
- QByteArray byteData;
- byteData.resize(amount);
- read(byteData.data(), byteData.size());
- return byteData;
- }
-
- // return amount bytes. User of this function has to free() its .data!
- // avoid to use this, it will memcpy.
- qint64 read(char* dst, qint64 amount)
- {
- amount = qMin(amount, byteAmount());
- qint64 originalAmount = amount;
- char *writeDst = dst;
-
- while (amount > 0) {
- const QByteArray &first = buffers.first();
- qint64 firstSize = first.size() - firstPos;
- if (amount >= firstSize) {
- // take it completely
- bufferCompleteSize -= firstSize;
- amount -= firstSize;
- memcpy(writeDst, first.constData() + firstPos, firstSize);
- writeDst += firstSize;
- firstPos = 0;
- buffers.takeFirst();
- } else {
- // take a part of it & it is the last one to take
- bufferCompleteSize -= amount;
- memcpy(writeDst, first.constData() + firstPos, amount);
- firstPos += amount;
- amount = 0;
- }
- }
-
- return originalAmount;
- }
-
- inline char getChar()
- {
- char c;
- read(&c, 1);
- return c;
- }
-
- inline void clear()
- {
- buffers.clear();
- bufferCompleteSize = 0;
- firstPos = 0;
- }
-
- // The byte count of all QByteArrays
- inline qint64 byteAmount() const
- {
- return bufferCompleteSize;
- }
-
- // the number of QByteArrays
- inline qint64 bufferCount() const
- {
- return buffers.length();
- }
-
- inline bool isEmpty() const
- {
- return byteAmount() == 0;
- }
-
- inline qint64 sizeNextBlock() const
- {
- if(buffers.isEmpty())
- return 0;
- else
- return buffers.first().size() - firstPos;
- }
-
- inline QByteArray& operator[](int i)
- {
- if (i == 0)
- squeezeFirst();
-
- return buffers[i];
- }
-
- inline bool canReadLine() const {
- int i = 0;
- if (i < buffers.length()) {
- if (buffers.at(i).indexOf('\n', firstPos) != -1)
- return true;
- ++i;
-
- for (; i < buffers.length(); i++)
- if (buffers.at(i).contains('\n'))
- return true;
- }
- return false;
- }
-};
-
-QT_END_NAMESPACE
-
-#endif // QBYTEDATA_P_H
diff --git a/src/corelib/tools/qcache.h b/src/corelib/tools/qcache.h
index 8c0e7860f7..4fcde46fbc 100644
--- a/src/corelib/tools/qcache.h
+++ b/src/corelib/tools/qcache.h
@@ -51,7 +51,7 @@ class QCache
struct Node {
inline Node() : keyPtr(0) {}
inline Node(T *data, int cost)
- : keyPtr(0), t(data), c(cost), p(0), n(0) {}
+ : keyPtr(nullptr), t(data), c(cost), p(nullptr), n(nullptr) {}
const Key *keyPtr; T *t; int c; Node *p,*n;
};
Node *f, *l;
@@ -71,14 +71,14 @@ class QCache
inline T *relink(const Key &key) {
typename QHash<Key, Node>::iterator i = hash.find(key);
if (typename QHash<Key, Node>::const_iterator(i) == hash.constEnd())
- return 0;
+ return nullptr;
Node &n = *i;
if (f != &n) {
if (n.p) n.p->n = n.n;
if (n.n) n.n->p = n.p;
if (l == &n) l = n.p;
- n.p = 0;
+ n.p = nullptr;
n.n = f;
f->p = &n;
f = &n;
@@ -89,7 +89,7 @@ class QCache
Q_DISABLE_COPY(QCache)
public:
- inline explicit QCache(int maxCost = 100) Q_DECL_NOTHROW;
+ inline explicit QCache(int maxCost = 100) noexcept;
inline ~QCache() { clear(); }
inline int maxCost() const { return mx; }
@@ -116,13 +116,13 @@ private:
};
template <class Key, class T>
-inline QCache<Key, T>::QCache(int amaxCost) Q_DECL_NOTHROW
- : f(0), l(0), mx(amaxCost), total(0) {}
+inline QCache<Key, T>::QCache(int amaxCost) noexcept
+ : f(nullptr), l(nullptr), mx(amaxCost), total(0) {}
template <class Key, class T>
inline void QCache<Key,T>::clear()
{ while (f) { delete f->t; f = f->n; }
- hash.clear(); l = 0; total = 0; }
+ hash.clear(); l = nullptr; total = 0; }
template <class Key, class T>
inline void QCache<Key,T>::setMaxCost(int m)
@@ -153,11 +153,11 @@ inline T *QCache<Key,T>::take(const Key &key)
{
typename QHash<Key, Node>::iterator i = hash.find(key);
if (i == hash.end())
- return 0;
+ return nullptr;
Node &n = *i;
T *t = n.t;
- n.t = 0;
+ n.t = nullptr;
unlink(n);
return t;
}
diff --git a/src/corelib/tools/qchar.cpp b/src/corelib/tools/qchar.cpp
deleted file mode 100644
index 47c853084b..0000000000
--- a/src/corelib/tools/qchar.cpp
+++ /dev/null
@@ -1,2059 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-// Don't define it while compiling this module, or USERS of Qt will
-// not be able to link.
-#ifdef QT_NO_CAST_FROM_ASCII
-# undef QT_NO_CAST_FROM_ASCII
-#endif
-#ifdef QT_NO_CAST_TO_ASCII
-# undef QT_NO_CAST_TO_ASCII
-#endif
-#include "qchar.h"
-
-#include "qdatastream.h"
-
-#include "qunicodetables_p.h"
-#include "qunicodetables.cpp"
-
-#include <algorithm>
-
-QT_BEGIN_NAMESPACE
-
-#define FLAG(x) (1 << (x))
-
-/*!
- \class QLatin1Char
- \inmodule QtCore
- \brief The QLatin1Char class provides an 8-bit ASCII/Latin-1 character.
-
- \ingroup string-processing
-
- This class is only useful to construct a QChar with 8-bit character.
-
- \sa QChar, QLatin1String, QString
-*/
-
-/*!
- \fn const char QLatin1Char::toLatin1() const
-
- Converts a Latin-1 character to an 8-bit ASCII representation of the character.
-*/
-
-/*!
- \fn const ushort QLatin1Char::unicode() const
-
- Converts a Latin-1 character to an 16-bit-encoded Unicode representation
- of the character.
-*/
-
-/*!
- \fn QLatin1Char::QLatin1Char(char c)
-
- Constructs a Latin-1 character for \a c. This constructor should be
- used when the encoding of the input character is known to be Latin-1.
-*/
-
-/*!
- \class QChar
- \inmodule QtCore
- \brief The QChar class provides a 16-bit Unicode character.
-
- \ingroup string-processing
- \reentrant
-
- In Qt, Unicode characters are 16-bit entities without any markup
- or structure. This class represents such an entity. It is
- lightweight, so it can be used everywhere. Most compilers treat
- it like an \c{unsigned short}.
-
- QChar provides a full complement of testing/classification
- functions, converting to and from other formats, converting from
- composed to decomposed Unicode, and trying to compare and
- case-convert if you ask it to.
-
- The classification functions include functions like those in the
- standard C++ header \<cctype\> (formerly \<ctype.h\>), but
- operating on the full range of Unicode characters, not just for the ASCII
- range. They all return true if the character is a certain type of character;
- otherwise they return false. These classification functions are
- isNull() (returns \c true if the character is '\\0'), isPrint()
- (true if the character is any sort of printable character,
- including whitespace), isPunct() (any sort of punctation),
- isMark() (Unicode Mark), isLetter() (a letter), isNumber() (any
- sort of numeric character, not just 0-9), isLetterOrNumber(), and
- isDigit() (decimal digits). All of these are wrappers around
- category() which return the Unicode-defined category of each
- character. Some of these also calculate the derived properties
- (for example isSpace() returns \c true if the character is of category
- Separator_* or an exceptional code point from Other_Control category).
-
- QChar also provides direction(), which indicates the "natural"
- writing direction of this character. The joiningType() function
- indicates how the character joins with it's neighbors (needed
- mostly for Arabic or Syriac) and finally hasMirrored(), which indicates
- whether the character needs to be mirrored when it is printed in
- it's "unnatural" writing direction.
-
- Composed Unicode characters (like \a ring) can be converted to
- decomposed Unicode ("a" followed by "ring above") by using decomposition().
-
- In Unicode, comparison is not necessarily possible and case
- conversion is very difficult at best. Unicode, covering the
- "entire" world, also includes most of the world's case and
- sorting problems. operator==() and friends will do comparison
- based purely on the numeric Unicode value (code point) of the
- characters, and toUpper() and toLower() will do case changes when
- the character has a well-defined uppercase/lowercase equivalent.
- For locale-dependent comparisons, use QString::localeAwareCompare().
-
- The conversion functions include unicode() (to a scalar),
- toLatin1() (to scalar, but converts all non-Latin-1 characters to
- 0), row() (gives the Unicode row), cell() (gives the Unicode
- cell), digitValue() (gives the integer value of any of the
- numerous digit characters), and a host of constructors.
-
- QChar provides constructors and cast operators that make it easy
- to convert to and from traditional 8-bit \c{char}s. If you
- defined \c QT_NO_CAST_FROM_ASCII and \c QT_NO_CAST_TO_ASCII, as
- explained in the QString documentation, you will need to
- explicitly call fromLatin1(), or use QLatin1Char,
- to construct a QChar from an 8-bit \c char, and you will need to
- call toLatin1() to get the 8-bit value back.
-
- For more information see
- \l{http://www.unicode.org/ucd/}{"About the Unicode Character Database"}.
-
- \sa Unicode, QString, QLatin1Char
-*/
-
-/*!
- \enum QChar::UnicodeVersion
-
- Specifies which version of the \l{http://www.unicode.org/}{Unicode standard}
- introduced a certain character.
-
- \value Unicode_1_1 Version 1.1
- \value Unicode_2_0 Version 2.0
- \value Unicode_2_1_2 Version 2.1.2
- \value Unicode_3_0 Version 3.0
- \value Unicode_3_1 Version 3.1
- \value Unicode_3_2 Version 3.2
- \value Unicode_4_0 Version 4.0
- \value Unicode_4_1 Version 4.1
- \value Unicode_5_0 Version 5.0
- \value Unicode_5_1 Version 5.1
- \value Unicode_5_2 Version 5.2
- \value Unicode_6_0 Version 6.0
- \value Unicode_6_1 Version 6.1
- \value Unicode_6_2 Version 6.2
- \value Unicode_6_3 Version 6.3 Since Qt 5.3
- \value Unicode_7_0 Version 7.0 Since Qt 5.5
- \value Unicode_8_0 Version 8.0 Since Qt 5.6
- \value Unicode_9_0 Version 9.0 Since Qt 5.11
- \value Unicode_10_0 Version 10.0 Since Qt 5.11
- \value Unicode_Unassigned The value is not assigned to any character
- in version 8.0 of Unicode.
-
- \sa unicodeVersion(), currentUnicodeVersion()
-*/
-
-/*!
- \enum QChar::Category
-
- This enum maps the Unicode character categories.
-
- The following characters are normative in Unicode:
-
- \value Mark_NonSpacing Unicode class name Mn
-
- \value Mark_SpacingCombining Unicode class name Mc
-
- \value Mark_Enclosing Unicode class name Me
-
- \value Number_DecimalDigit Unicode class name Nd
-
- \value Number_Letter Unicode class name Nl
-
- \value Number_Other Unicode class name No
-
- \value Separator_Space Unicode class name Zs
-
- \value Separator_Line Unicode class name Zl
-
- \value Separator_Paragraph Unicode class name Zp
-
- \value Other_Control Unicode class name Cc
-
- \value Other_Format Unicode class name Cf
-
- \value Other_Surrogate Unicode class name Cs
-
- \value Other_PrivateUse Unicode class name Co
-
- \value Other_NotAssigned Unicode class name Cn
-
-
- The following categories are informative in Unicode:
-
- \value Letter_Uppercase Unicode class name Lu
-
- \value Letter_Lowercase Unicode class name Ll
-
- \value Letter_Titlecase Unicode class name Lt
-
- \value Letter_Modifier Unicode class name Lm
-
- \value Letter_Other Unicode class name Lo
-
- \value Punctuation_Connector Unicode class name Pc
-
- \value Punctuation_Dash Unicode class name Pd
-
- \value Punctuation_Open Unicode class name Ps
-
- \value Punctuation_Close Unicode class name Pe
-
- \value Punctuation_InitialQuote Unicode class name Pi
-
- \value Punctuation_FinalQuote Unicode class name Pf
-
- \value Punctuation_Other Unicode class name Po
-
- \value Symbol_Math Unicode class name Sm
-
- \value Symbol_Currency Unicode class name Sc
-
- \value Symbol_Modifier Unicode class name Sk
-
- \value Symbol_Other Unicode class name So
-
- \sa category()
-*/
-
-/*!
- \enum QChar::Script
- \since 5.1
-
- This enum type defines the Unicode script property values.
-
- For details about the Unicode script property values see
- \l{http://www.unicode.org/reports/tr24/}{Unicode Standard Annex #24}.
-
- In order to conform to C/C++ naming conventions "Script_" is prepended
- to the codes used in the Unicode Standard.
-
- \value Script_Unknown For unassigned, private-use, noncharacter, and surrogate code points.
- \value Script_Inherited For characters that may be used with multiple scripts
- and that inherit their script from the preceding characters.
- These include nonspacing marks, enclosing marks,
- and zero width joiner/non-joiner characters.
- \value Script_Common For characters that may be used with multiple scripts
- and that do not inherit their script from the preceding characters.
-
- \value Script_Latin
- \value Script_Greek
- \value Script_Cyrillic
- \value Script_Armenian
- \value Script_Hebrew
- \value Script_Arabic
- \value Script_Syriac
- \value Script_Thaana
- \value Script_Devanagari
- \value Script_Bengali
- \value Script_Gurmukhi
- \value Script_Gujarati
- \value Script_Oriya
- \value Script_Tamil
- \value Script_Telugu
- \value Script_Kannada
- \value Script_Malayalam
- \value Script_Sinhala
- \value Script_Thai
- \value Script_Lao
- \value Script_Tibetan
- \value Script_Myanmar
- \value Script_Georgian
- \value Script_Hangul
- \value Script_Ethiopic
- \value Script_Cherokee
- \value Script_CanadianAboriginal
- \value Script_Ogham
- \value Script_Runic
- \value Script_Khmer
- \value Script_Mongolian
- \value Script_Hiragana
- \value Script_Katakana
- \value Script_Bopomofo
- \value Script_Han
- \value Script_Yi
- \value Script_OldItalic
- \value Script_Gothic
- \value Script_Deseret
- \value Script_Tagalog
- \value Script_Hanunoo
- \value Script_Buhid
- \value Script_Tagbanwa
- \value Script_Coptic
- \value Script_Limbu
- \value Script_TaiLe
- \value Script_LinearB
- \value Script_Ugaritic
- \value Script_Shavian
- \value Script_Osmanya
- \value Script_Cypriot
- \value Script_Braille
- \value Script_Buginese
- \value Script_NewTaiLue
- \value Script_Glagolitic
- \value Script_Tifinagh
- \value Script_SylotiNagri
- \value Script_OldPersian
- \value Script_Kharoshthi
- \value Script_Balinese
- \value Script_Cuneiform
- \value Script_Phoenician
- \value Script_PhagsPa
- \value Script_Nko
- \value Script_Sundanese
- \value Script_Lepcha
- \value Script_OlChiki
- \value Script_Vai
- \value Script_Saurashtra
- \value Script_KayahLi
- \value Script_Rejang
- \value Script_Lycian
- \value Script_Carian
- \value Script_Lydian
- \value Script_Cham
- \value Script_TaiTham
- \value Script_TaiViet
- \value Script_Avestan
- \value Script_EgyptianHieroglyphs
- \value Script_Samaritan
- \value Script_Lisu
- \value Script_Bamum
- \value Script_Javanese
- \value Script_MeeteiMayek
- \value Script_ImperialAramaic
- \value Script_OldSouthArabian
- \value Script_InscriptionalParthian
- \value Script_InscriptionalPahlavi
- \value Script_OldTurkic
- \value Script_Kaithi
- \value Script_Batak
- \value Script_Brahmi
- \value Script_Mandaic
- \value Script_Chakma
- \value Script_MeroiticCursive
- \value Script_MeroiticHieroglyphs
- \value Script_Miao
- \value Script_Sharada
- \value Script_SoraSompeng
- \value Script_Takri
- \value Script_CaucasianAlbanian
- \value Script_BassaVah
- \value Script_Duployan
- \value Script_Elbasan
- \value Script_Grantha
- \value Script_PahawhHmong
- \value Script_Khojki
- \value Script_LinearA
- \value Script_Mahajani
- \value Script_Manichaean
- \value Script_MendeKikakui
- \value Script_Modi
- \value Script_Mro
- \value Script_OldNorthArabian
- \value Script_Nabataean
- \value Script_Palmyrene
- \value Script_PauCinHau
- \value Script_OldPermic
- \value Script_PsalterPahlavi
- \value Script_Siddham
- \value Script_Khudawadi
- \value Script_Tirhuta
- \value Script_WarangCiti
- \value Script_Ahom
- \value Script_AnatolianHieroglyphs
- \value Script_Hatran
- \value Script_Multani
- \value Script_OldHungarian
- \value Script_SignWriting
- \value Script_Adlam
- \value Script_Bhaiksuki
- \value Script_Marchen
- \value Script_Newa
- \value Script_Osage
- \value Script_Tangut
- \value Script_MasaramGondi
- \value Script_Nushu
- \value Script_Soyombo
- \value Script_ZanabazarSquare
-
- \omitvalue ScriptCount
-
- \sa script()
-*/
-
-/*!
- \enum QChar::Direction
-
- This enum type defines the Unicode direction attributes. See the
- \l{http://www.unicode.org/reports/tr9/tr9-35.html#Table_Bidirectional_Character_Types}{Unicode Standard} for a description
- of the values.
-
- In order to conform to C/C++ naming conventions "Dir" is prepended
- to the codes used in the Unicode Standard.
-
- \value DirAL
- \value DirAN
- \value DirB
- \value DirBN
- \value DirCS
- \value DirEN
- \value DirES
- \value DirET
- \value DirFSI Since Qt 5.3
- \value DirL
- \value DirLRE
- \value DirLRI Since Qt 5.3
- \value DirLRO
- \value DirNSM
- \value DirON
- \value DirPDF
- \value DirPDI Since Qt 5.3
- \value DirR
- \value DirRLE
- \value DirRLI Since Qt 5.3
- \value DirRLO
- \value DirS
- \value DirWS
-
- \sa direction()
-*/
-
-/*!
- \enum QChar::Decomposition
-
- This enum type defines the Unicode decomposition attributes. See
- the \l{http://www.unicode.org/}{Unicode Standard} for a
- description of the values.
-
- \value NoDecomposition
- \value Canonical
- \value Circle
- \value Compat
- \value Final
- \value Font
- \value Fraction
- \value Initial
- \value Isolated
- \value Medial
- \value Narrow
- \value NoBreak
- \value Small
- \value Square
- \value Sub
- \value Super
- \value Vertical
- \value Wide
-
- \sa decomposition()
-*/
-
-/*!
- \enum QChar::JoiningType
- since 5.3
-
- This enum type defines the Unicode joining type attributes. See the
- \l{http://www.unicode.org/}{Unicode Standard} for a description of the values.
-
- In order to conform to C/C++ naming conventions "Joining_" is prepended
- to the codes used in the Unicode Standard.
-
- \value Joining_None
- \value Joining_Causing
- \value Joining_Dual
- \value Joining_Right
- \value Joining_Left
- \value Joining_Transparent
-
- \sa joiningType()
-*/
-
-#if QT_DEPRECATED_SINCE(5, 3)
-/*!
- \enum QChar::Joining
- \deprecated in 5.3, use JoiningType instead.
-
- This enum type defines the Unicode joining attributes. See the
- \l{http://www.unicode.org/}{Unicode Standard} for a description
- of the values.
-
- \value Center
- \value Dual
- \value OtherJoining
- \value Right
-
- \sa joining()
-*/
-#endif
-
-/*!
- \enum QChar::CombiningClass
-
- \internal
-
- This enum type defines names for some of the Unicode combining
- classes. See the \l{http://www.unicode.org/}{Unicode Standard}
- for a description of the values.
-
- \value Combining_Above
- \value Combining_AboveAttached
- \value Combining_AboveLeft
- \value Combining_AboveLeftAttached
- \value Combining_AboveRight
- \value Combining_AboveRightAttached
- \value Combining_Below
- \value Combining_BelowAttached
- \value Combining_BelowLeft
- \value Combining_BelowLeftAttached
- \value Combining_BelowRight
- \value Combining_BelowRightAttached
- \value Combining_DoubleAbove
- \value Combining_DoubleBelow
- \value Combining_IotaSubscript
- \value Combining_Left
- \value Combining_LeftAttached
- \value Combining_Right
- \value Combining_RightAttached
-*/
-
-/*!
- \enum QChar::SpecialCharacter
-
- \value Null A QChar with this value isNull().
- \value Tabulation Character tabulation.
- \value LineFeed
- \value CarriageReturn
- \value Space
- \value Nbsp Non-breaking space.
- \value SoftHyphen
- \value ReplacementCharacter The character shown when a font has no glyph
- for a certain codepoint. A special question mark character is often
- used. Codecs use this codepoint when input data cannot be
- represented in Unicode.
- \value ObjectReplacementCharacter Used to represent an object such as an
- image when such objects cannot be presented.
- \value ByteOrderMark
- \value ByteOrderSwapped
- \value ParagraphSeparator
- \value LineSeparator
- \value LastValidCodePoint
-*/
-
-/*!
- \fn void QChar::setCell(uchar cell)
- \internal
-*/
-
-/*!
- \fn void QChar::setRow(uchar row)
- \internal
-*/
-
-/*!
- \fn QChar::QChar()
-
- Constructs a null QChar ('\\0').
-
- \sa isNull()
-*/
-
-/*!
- \fn QChar::QChar(QLatin1Char ch)
-
- Constructs a QChar corresponding to ASCII/Latin-1 character \a ch.
-*/
-
-/*!
- \fn QChar::QChar(SpecialCharacter ch)
-
- Constructs a QChar for the predefined character value \a ch.
-*/
-
-/*!
- \fn QChar::QChar(char16_t ch)
- \since 5.10
-
- Constructs a QChar corresponding to the UTF-16 character \a ch.
-*/
-
-/*!
- \fn QChar::QChar(wchar_t ch)
- \since 5.10
-
- Constructs a QChar corresponding to the wide character \a ch.
-
- \note This constructor is only available on Windows.
-*/
-
-/*!
- \fn QChar::QChar(char ch)
-
- Constructs a QChar corresponding to ASCII/Latin-1 character \a ch.
-
- \note This constructor is not available when \c QT_NO_CAST_FROM_ASCII
- is defined.
-
- \sa QT_NO_CAST_FROM_ASCII
-*/
-
-/*!
- \fn QChar::QChar(uchar ch)
-
- Constructs a QChar corresponding to ASCII/Latin-1 character \a ch.
-
- \note This constructor is not available when \c QT_NO_CAST_FROM_ASCII
- or \c QT_RESTRICTED_CAST_FROM_ASCII is defined.
-
- \sa QT_NO_CAST_FROM_ASCII, QT_RESTRICTED_CAST_FROM_ASCII
-*/
-
-/*!
- \fn QChar::QChar(uchar cell, uchar row)
-
- Constructs a QChar for Unicode cell \a cell in row \a row.
-
- \sa cell(), row()
-*/
-
-/*!
- \fn QChar::QChar(ushort code)
-
- Constructs a QChar for the character with Unicode code point \a code.
-*/
-
-/*!
- \fn QChar::QChar(short code)
-
- Constructs a QChar for the character with Unicode code point \a code.
-*/
-
-/*!
- \fn QChar::QChar(uint code)
-
- Constructs a QChar for the character with Unicode code point \a code.
-*/
-
-/*!
- \fn QChar::QChar(int code)
-
- Constructs a QChar for the character with Unicode code point \a code.
-*/
-
-/*!
- \fn bool QChar::isNull() const
-
- Returns \c true if the character is the Unicode character 0x0000
- ('\\0'); otherwise returns \c false.
-*/
-
-/*!
- \fn uchar QChar::cell() const
-
- Returns the cell (least significant byte) of the Unicode character.
-
- \sa row()
-*/
-
-/*!
- \fn uchar QChar::row() const
-
- Returns the row (most significant byte) of the Unicode character.
-
- \sa cell()
-*/
-
-/*!
- \fn bool QChar::isPrint() const
-
- Returns \c true if the character is a printable character; otherwise
- returns \c false. This is any character not of category Other_*.
-
- Note that this gives no indication of whether the character is
- available in a particular font.
-*/
-
-/*!
- \overload
- \since 5.0
-
- Returns \c true if the UCS-4-encoded character specified by \a ucs4 is
- a printable character; otherwise returns \c false.
- This is any character not of category Other_*.
-
- Note that this gives no indication of whether the character is
- available in a particular font.
-*/
-bool QChar::isPrint(uint ucs4) Q_DECL_NOTHROW
-{
- if (ucs4 > LastValidCodePoint)
- return false;
- const int test = FLAG(Other_Control) |
- FLAG(Other_Format) |
- FLAG(Other_Surrogate) |
- FLAG(Other_PrivateUse) |
- FLAG(Other_NotAssigned);
- return !(FLAG(qGetProp(ucs4)->category) & test);
-}
-
-/*!
- \fn bool QChar::isSpace() const
-
- Returns \c true if the character is a separator character
- (Separator_* categories or certain code points from Other_Control category);
- otherwise returns \c false.
-*/
-
-/*!
- \fn bool QChar::isSpace(uint ucs4)
- \overload
- \since 5.0
-
- Returns \c true if the UCS-4-encoded character specified by \a ucs4 is
- a separator character (Separator_* categories or certain code points
- from Other_Control category); otherwise returns \c false.
-*/
-
-/*!
- \internal
-*/
-bool QT_FASTCALL QChar::isSpace_helper(uint ucs4) Q_DECL_NOTHROW
-{
- if (ucs4 > LastValidCodePoint)
- return false;
- const int test = FLAG(Separator_Space) |
- FLAG(Separator_Line) |
- FLAG(Separator_Paragraph);
- return FLAG(qGetProp(ucs4)->category) & test;
-}
-
-/*!
- \fn bool QChar::isMark() const
-
- Returns \c true if the character is a mark (Mark_* categories);
- otherwise returns \c false.
-
- See QChar::Category for more information regarding marks.
-*/
-
-/*!
- \overload
- \since 5.0
-
- Returns \c true if the UCS-4-encoded character specified by \a ucs4 is
- a mark (Mark_* categories); otherwise returns \c false.
-*/
-bool QChar::isMark(uint ucs4) Q_DECL_NOTHROW
-{
- if (ucs4 > LastValidCodePoint)
- return false;
- const int test = FLAG(Mark_NonSpacing) |
- FLAG(Mark_SpacingCombining) |
- FLAG(Mark_Enclosing);
- return FLAG(qGetProp(ucs4)->category) & test;
-}
-
-/*!
- \fn bool QChar::isPunct() const
-
- Returns \c true if the character is a punctuation mark (Punctuation_*
- categories); otherwise returns \c false.
-*/
-
-/*!
- \overload
- \since 5.0
-
- Returns \c true if the UCS-4-encoded character specified by \a ucs4 is
- a punctuation mark (Punctuation_* categories); otherwise returns \c false.
-*/
-bool QChar::isPunct(uint ucs4) Q_DECL_NOTHROW
-{
- if (ucs4 > LastValidCodePoint)
- return false;
- const int test = FLAG(Punctuation_Connector) |
- FLAG(Punctuation_Dash) |
- FLAG(Punctuation_Open) |
- FLAG(Punctuation_Close) |
- FLAG(Punctuation_InitialQuote) |
- FLAG(Punctuation_FinalQuote) |
- FLAG(Punctuation_Other);
- return FLAG(qGetProp(ucs4)->category) & test;
-}
-
-/*!
- \fn bool QChar::isSymbol() const
-
- Returns \c true if the character is a symbol (Symbol_* categories);
- otherwise returns \c false.
-*/
-
-/*!
- \overload
- \since 5.0
-
- Returns \c true if the UCS-4-encoded character specified by \a ucs4 is
- a symbol (Symbol_* categories); otherwise returns \c false.
-*/
-bool QChar::isSymbol(uint ucs4) Q_DECL_NOTHROW
-{
- if (ucs4 > LastValidCodePoint)
- return false;
- const int test = FLAG(Symbol_Math) |
- FLAG(Symbol_Currency) |
- FLAG(Symbol_Modifier) |
- FLAG(Symbol_Other);
- return FLAG(qGetProp(ucs4)->category) & test;
-}
-
-/*!
- \fn bool QChar::isLetter() const
-
- Returns \c true if the character is a letter (Letter_* categories);
- otherwise returns \c false.
-*/
-
-/*!
- \fn bool QChar::isLetter(uint ucs4)
- \overload
- \since 5.0
-
- Returns \c true if the UCS-4-encoded character specified by \a ucs4 is
- a letter (Letter_* categories); otherwise returns \c false.
-*/
-
-/*!
- \internal
-*/
-bool QT_FASTCALL QChar::isLetter_helper(uint ucs4) Q_DECL_NOTHROW
-{
- if (ucs4 > LastValidCodePoint)
- return false;
- const int test = FLAG(Letter_Uppercase) |
- FLAG(Letter_Lowercase) |
- FLAG(Letter_Titlecase) |
- FLAG(Letter_Modifier) |
- FLAG(Letter_Other);
- return FLAG(qGetProp(ucs4)->category) & test;
-}
-
-/*!
- \fn bool QChar::isNumber() const
-
- Returns \c true if the character is a number (Number_* categories,
- not just 0-9); otherwise returns \c false.
-
- \sa isDigit()
-*/
-
-/*!
- \fn bool QChar::isNumber(uint ucs4)
- \overload
- \since 5.0
-
- Returns \c true if the UCS-4-encoded character specified by \a ucs4 is
- a number (Number_* categories, not just 0-9); otherwise returns \c false.
-
- \sa isDigit()
-*/
-
-/*!
- \internal
-*/
-bool QT_FASTCALL QChar::isNumber_helper(uint ucs4) Q_DECL_NOTHROW
-{
- if (ucs4 > LastValidCodePoint)
- return false;
- const int test = FLAG(Number_DecimalDigit) |
- FLAG(Number_Letter) |
- FLAG(Number_Other);
- return FLAG(qGetProp(ucs4)->category) & test;
-}
-
-/*!
- \fn bool QChar::isLetterOrNumber() const
-
- Returns \c true if the character is a letter or number (Letter_* or
- Number_* categories); otherwise returns \c false.
-*/
-
-/*!
- \fn bool QChar::isLetterOrNumber(uint ucs4)
- \overload
- \since 5.0
-
- Returns \c true if the UCS-4-encoded character specified by \a ucs4 is
- a letter or number (Letter_* or Number_* categories); otherwise returns \c false.
-*/
-
-/*!
- \internal
-*/
-bool QT_FASTCALL QChar::isLetterOrNumber_helper(uint ucs4) Q_DECL_NOTHROW
-{
- if (ucs4 > LastValidCodePoint)
- return false;
- const int test = FLAG(Letter_Uppercase) |
- FLAG(Letter_Lowercase) |
- FLAG(Letter_Titlecase) |
- FLAG(Letter_Modifier) |
- FLAG(Letter_Other) |
- FLAG(Number_DecimalDigit) |
- FLAG(Number_Letter) |
- FLAG(Number_Other);
- return FLAG(qGetProp(ucs4)->category) & test;
-}
-
-/*!
- \fn bool QChar::isDigit() const
-
- Returns \c true if the character is a decimal digit
- (Number_DecimalDigit); otherwise returns \c false.
-
- \sa isNumber()
-*/
-
-/*!
- \fn bool QChar::isDigit(uint ucs4)
- \overload
- \since 5.0
-
- Returns \c true if the UCS-4-encoded character specified by \a ucs4 is
- a decimal digit (Number_DecimalDigit); otherwise returns \c false.
-
- \sa isNumber()
-*/
-
-/*!
- \fn bool QChar::isNonCharacter() const
- \since 5.0
-
- Returns \c true if the QChar is a non-character; false otherwise.
-
- Unicode has a certain number of code points that are classified
- as "non-characters:" that is, they can be used for internal purposes
- in applications but cannot be used for text interchange.
- Those are the last two entries each Unicode Plane ([0xfffe..0xffff],
- [0x1fffe..0x1ffff], etc.) as well as the entries in range [0xfdd0..0xfdef].
-*/
-
-/*!
- \fn bool QChar::isHighSurrogate() const
-
- Returns \c true if the QChar is the high part of a UTF16 surrogate
- (for example if its code point is in range [0xd800..0xdbff]); false otherwise.
-*/
-
-/*!
- \fn bool QChar::isLowSurrogate() const
-
- Returns \c true if the QChar is the low part of a UTF16 surrogate
- (for example if its code point is in range [0xdc00..0xdfff]); false otherwise.
-*/
-
-/*!
- \fn bool QChar::isSurrogate() const
- \since 5.0
-
- Returns \c true if the QChar contains a code point that is in either
- the high or the low part of the UTF-16 surrogate range
- (for example if its code point is in range [0xd800..0xdfff]); false otherwise.
-*/
-
-/*!
- \fn static bool QChar::isNonCharacter(uint ucs4)
- \overload
- \since 5.0
-
- Returns \c true if the UCS-4-encoded character specified by \a ucs4
- is a non-character; false otherwise.
-
- Unicode has a certain number of code points that are classified
- as "non-characters:" that is, they can be used for internal purposes
- in applications but cannot be used for text interchange.
- Those are the last two entries each Unicode Plane ([0xfffe..0xffff],
- [0x1fffe..0x1ffff], etc.) as well as the entries in range [0xfdd0..0xfdef].
-*/
-
-/*!
- \fn static bool QChar::isHighSurrogate(uint ucs4)
- \overload
-
- Returns \c true if the UCS-4-encoded character specified by \a ucs4
- is the high part of a UTF16 surrogate
- (for example if its code point is in range [0xd800..0xdbff]); false otherwise.
-*/
-
-/*!
- \fn static bool QChar::isLowSurrogate(uint ucs4)
- \overload
-
- Returns \c true if the UCS-4-encoded character specified by \a ucs4
- is the low part of a UTF16 surrogate
- (for example if its code point is in range [0xdc00..0xdfff]); false otherwise.
-*/
-
-/*!
- \fn static bool QChar::isSurrogate(uint ucs4)
- \overload
- \since 5.0
-
- Returns \c true if the UCS-4-encoded character specified by \a ucs4
- contains a code point that is in either the high or the low part of the
- UTF-16 surrogate range (for example if its code point is in range [0xd800..0xdfff]);
- false otherwise.
-*/
-
-/*!
- \fn static bool QChar::requiresSurrogates(uint ucs4)
-
- Returns \c true if the UCS-4-encoded character specified by \a ucs4
- can be split into the high and low parts of a UTF16 surrogate
- (for example if its code point is greater than or equals to 0x10000);
- false otherwise.
-*/
-
-/*!
- \fn static uint QChar::surrogateToUcs4(ushort high, ushort low)
-
- Converts a UTF16 surrogate pair with the given \a high and \a low values
- to it's UCS-4-encoded code point.
-*/
-
-/*!
- \fn static uint QChar::surrogateToUcs4(QChar high, QChar low)
- \overload
-
- Converts a UTF16 surrogate pair (\a high, \a low) to it's UCS-4-encoded code point.
-*/
-
-/*!
- \fn static ushort QChar::highSurrogate(uint ucs4)
-
- Returns the high surrogate part of a UCS-4-encoded code point.
- The returned result is undefined if \a ucs4 is smaller than 0x10000.
-*/
-
-/*!
- \fn static ushort QChar::lowSurrogate(uint ucs4)
-
- Returns the low surrogate part of a UCS-4-encoded code point.
- The returned result is undefined if \a ucs4 is smaller than 0x10000.
-*/
-
-/*!
- \fn int QChar::digitValue() const
-
- Returns the numeric value of the digit, or -1 if the character is not a digit.
-*/
-
-/*!
- \overload
- Returns the numeric value of the digit specified by the UCS-4-encoded
- character, \a ucs4, or -1 if the character is not a digit.
-*/
-int QChar::digitValue(uint ucs4) Q_DECL_NOTHROW
-{
- if (ucs4 > LastValidCodePoint)
- return -1;
- return qGetProp(ucs4)->digitValue;
-}
-
-/*!
- \fn QChar::Category QChar::category() const
-
- Returns the character's category.
-*/
-
-/*!
- \overload
- Returns the category of the UCS-4-encoded character specified by \a ucs4.
-*/
-QChar::Category QChar::category(uint ucs4) Q_DECL_NOTHROW
-{
- if (ucs4 > LastValidCodePoint)
- return QChar::Other_NotAssigned;
- return (QChar::Category) qGetProp(ucs4)->category;
-}
-
-/*!
- \fn QChar::Direction QChar::direction() const
-
- Returns the character's direction.
-*/
-
-/*!
- \overload
- Returns the direction of the UCS-4-encoded character specified by \a ucs4.
-*/
-QChar::Direction QChar::direction(uint ucs4) Q_DECL_NOTHROW
-{
- if (ucs4 > LastValidCodePoint)
- return QChar::DirL;
- return (QChar::Direction) qGetProp(ucs4)->direction;
-}
-
-/*!
- \fn QChar::JoiningType QChar::joiningType() const
- \since 5.3
-
- Returns information about the joining type attributes of the character
- (needed for certain languages such as Arabic or Syriac).
-*/
-
-/*!
- \overload
- \since 5.3
-
- Returns information about the joining type attributes of the UCS-4-encoded
- character specified by \a ucs4
- (needed for certain languages such as Arabic or Syriac).
-*/
-QChar::JoiningType QChar::joiningType(uint ucs4) Q_DECL_NOTHROW
-{
- if (ucs4 > LastValidCodePoint)
- return QChar::Joining_None;
- return QChar::JoiningType(qGetProp(ucs4)->joining);
-}
-
-#if QT_DEPRECATED_SINCE(5, 3)
-/*!
- \fn QChar::Joining QChar::joining() const
- \deprecated in 5.3, use joiningType() instead.
-
- Returns information about the joining properties of the character
- (needed for certain languages such as Arabic).
-*/
-
-/*!
- \overload
- \deprecated in 5.3, use joiningType() instead.
-
- Returns information about the joining properties of the UCS-4-encoded
- character specified by \a ucs4 (needed for certain languages such as Arabic).
-*/
-QChar::Joining QChar::joining(uint ucs4) Q_DECL_NOTHROW
-{
- if (ucs4 > LastValidCodePoint)
- return QChar::OtherJoining;
- switch (qGetProp(ucs4)->joining) {
- case QChar::Joining_Causing: return QChar::Center;
- case QChar::Joining_Dual: return QChar::Dual;
- case QChar::Joining_Right: return QChar::Right;
- default: break;
- }
- return QChar::OtherJoining;
-}
-#endif
-
-/*!
- \fn bool QChar::hasMirrored() const
-
- Returns \c true if the character should be reversed if the text
- direction is reversed; otherwise returns \c false.
-
- A bit faster equivalent of (ch.mirroredChar() != ch).
-
- \sa mirroredChar()
-*/
-
-/*!
- \overload
- \since 5.0
-
- Returns \c true if the UCS-4-encoded character specified by \a ucs4
- should be reversed if the text direction is reversed; otherwise returns \c false.
-
- A bit faster equivalent of (QChar::mirroredChar(ucs4) != ucs4).
-
- \sa mirroredChar()
-*/
-bool QChar::hasMirrored(uint ucs4) Q_DECL_NOTHROW
-{
- if (ucs4 > LastValidCodePoint)
- return false;
- return qGetProp(ucs4)->mirrorDiff != 0;
-}
-
-/*!
- \fn bool QChar::isLower() const
-
- Returns \c true if the character is a lowercase letter, for example
- category() is Letter_Lowercase.
-
- \sa isUpper(), toLower(), toUpper()
-*/
-
-/*!
- \fn static bool QChar::isLower(uint ucs4)
- \overload
- \since 5.0
-
- Returns \c true if the UCS-4-encoded character specified by \a ucs4
- is a lowercase letter, for example category() is Letter_Lowercase.
-
- \sa isUpper(), toLower(), toUpper()
-*/
-
-/*!
- \fn bool QChar::isUpper() const
-
- Returns \c true if the character is an uppercase letter, for example
- category() is Letter_Uppercase.
-
- \sa isLower(), toUpper(), toLower()
-*/
-
-/*!
- \fn static bool QChar::isUpper(uint ucs4)
- \overload
- \since 5.0
-
- Returns \c true if the UCS-4-encoded character specified by \a ucs4
- is an uppercase letter, for example category() is Letter_Uppercase.
-
- \sa isLower(), toUpper(), toLower()
-*/
-
-/*!
- \fn bool QChar::isTitleCase() const
-
- Returns \c true if the character is a titlecase letter, for example
- category() is Letter_Titlecase.
-
- \sa isLower(), toUpper(), toLower(), toTitleCase()
-*/
-
-/*!
- \fn static bool QChar::isTitleCase(uint ucs4)
- \overload
- \since 5.0
-
- Returns \c true if the UCS-4-encoded character specified by \a ucs4
- is a titlecase letter, for example category() is Letter_Titlecase.
-
- \sa isLower(), toUpper(), toLower(), toTitleCase()
-*/
-/*!
- \fn QChar QChar::mirroredChar() const
-
- Returns the mirrored character if this character is a mirrored
- character; otherwise returns the character itself.
-
- \sa hasMirrored()
-*/
-
-/*!
- \overload
- Returns the mirrored character if the UCS-4-encoded character specified
- by \a ucs4 is a mirrored character; otherwise returns the character itself.
-
- \sa hasMirrored()
-*/
-uint QChar::mirroredChar(uint ucs4) Q_DECL_NOTHROW
-{
- if (ucs4 > LastValidCodePoint)
- return ucs4;
- return ucs4 + qGetProp(ucs4)->mirrorDiff;
-}
-
-
-// constants for Hangul (de)composition, see UAX #15
-enum {
- Hangul_SBase = 0xac00,
- Hangul_LBase = 0x1100,
- Hangul_VBase = 0x1161,
- Hangul_TBase = 0x11a7,
- Hangul_LCount = 19,
- Hangul_VCount = 21,
- Hangul_TCount = 28,
- Hangul_NCount = Hangul_VCount * Hangul_TCount,
- Hangul_SCount = Hangul_LCount * Hangul_NCount
-};
-
-// buffer has to have a length of 3. It's needed for Hangul decomposition
-static const unsigned short * QT_FASTCALL decompositionHelper
- (uint ucs4, int *length, int *tag, unsigned short *buffer)
-{
- if (ucs4 >= Hangul_SBase && ucs4 < Hangul_SBase + Hangul_SCount) {
- // compute Hangul syllable decomposition as per UAX #15
- const uint SIndex = ucs4 - Hangul_SBase;
- buffer[0] = Hangul_LBase + SIndex / Hangul_NCount; // L
- buffer[1] = Hangul_VBase + (SIndex % Hangul_NCount) / Hangul_TCount; // V
- buffer[2] = Hangul_TBase + SIndex % Hangul_TCount; // T
- *length = buffer[2] == Hangul_TBase ? 2 : 3;
- *tag = QChar::Canonical;
- return buffer;
- }
-
- const unsigned short index = GET_DECOMPOSITION_INDEX(ucs4);
- if (index == 0xffff) {
- *length = 0;
- *tag = QChar::NoDecomposition;
- return 0;
- }
-
- const unsigned short *decomposition = uc_decomposition_map+index;
- *tag = (*decomposition) & 0xff;
- *length = (*decomposition) >> 8;
- return decomposition+1;
-}
-
-/*!
- Decomposes a character into it's constituent parts. Returns an empty string
- if no decomposition exists.
-*/
-QString QChar::decomposition() const
-{
- return QChar::decomposition(ucs);
-}
-
-/*!
- \overload
- Decomposes the UCS-4-encoded character specified by \a ucs4 into it's
- constituent parts. Returns an empty string if no decomposition exists.
-*/
-QString QChar::decomposition(uint ucs4)
-{
- unsigned short buffer[3];
- int length;
- int tag;
- const unsigned short *d = decompositionHelper(ucs4, &length, &tag, buffer);
- return QString(reinterpret_cast<const QChar *>(d), length);
-}
-
-/*!
- \fn QChar::Decomposition QChar::decompositionTag() const
-
- Returns the tag defining the composition of the character. Returns
- QChar::NoDecomposition if no decomposition exists.
-*/
-
-/*!
- \overload
- Returns the tag defining the composition of the UCS-4-encoded character
- specified by \a ucs4. Returns QChar::NoDecomposition if no decomposition exists.
-*/
-QChar::Decomposition QChar::decompositionTag(uint ucs4) Q_DECL_NOTHROW
-{
- if (ucs4 >= Hangul_SBase && ucs4 < Hangul_SBase + Hangul_SCount)
- return QChar::Canonical;
- const unsigned short index = GET_DECOMPOSITION_INDEX(ucs4);
- if (index == 0xffff)
- return QChar::NoDecomposition;
- return (QChar::Decomposition)(uc_decomposition_map[index] & 0xff);
-}
-
-/*!
- \fn unsigned char QChar::combiningClass() const
-
- Returns the combining class for the character as defined in the
- Unicode standard. This is mainly useful as a positioning hint for
- marks attached to a base character.
-
- The Qt text rendering engine uses this information to correctly
- position non-spacing marks around a base character.
-*/
-
-/*!
- \overload
- Returns the combining class for the UCS-4-encoded character specified by
- \a ucs4, as defined in the Unicode standard.
-*/
-unsigned char QChar::combiningClass(uint ucs4) Q_DECL_NOTHROW
-{
- if (ucs4 > LastValidCodePoint)
- return 0;
- return (unsigned char) qGetProp(ucs4)->combiningClass;
-}
-
-/*!
- \fn QChar::Script QChar::script() const
- \since 5.1
-
- Returns the Unicode script property value for this character.
-*/
-
-/*!
- \overload
- \since 5.1
-
- Returns the Unicode script property value for the character specified in
- its UCS-4-encoded form as \a ucs4.
-*/
-QChar::Script QChar::script(uint ucs4) Q_DECL_NOTHROW
-{
- if (ucs4 > LastValidCodePoint)
- return QChar::Script_Unknown;
- return (QChar::Script) qGetProp(ucs4)->script;
-}
-
-/*!
- \fn QChar::UnicodeVersion QChar::unicodeVersion() const
-
- Returns the Unicode version that introduced this character.
-*/
-
-/*!
- \overload
- Returns the Unicode version that introduced the character specified in
- its UCS-4-encoded form as \a ucs4.
-*/
-QChar::UnicodeVersion QChar::unicodeVersion(uint ucs4) Q_DECL_NOTHROW
-{
- if (ucs4 > LastValidCodePoint)
- return QChar::Unicode_Unassigned;
- return (QChar::UnicodeVersion) qGetProp(ucs4)->unicodeVersion;
-}
-
-/*!
- Returns the most recent supported Unicode version.
-*/
-QChar::UnicodeVersion QChar::currentUnicodeVersion() Q_DECL_NOTHROW
-{
- return UNICODE_DATA_VERSION;
-}
-
-
-template <typename Traits, typename T>
-Q_DECL_CONST_FUNCTION static inline T convertCase_helper(T uc) Q_DECL_NOTHROW
-{
- const QUnicodeTables::Properties *prop = qGetProp(uc);
-
- if (Q_UNLIKELY(Traits::caseSpecial(prop))) {
- const ushort *specialCase = specialCaseMap + Traits::caseDiff(prop);
- // so far, there are no special cases beyond BMP (guaranteed by the qunicodetables generator)
- return *specialCase == 1 ? specialCase[1] : uc;
- }
-
- return uc + Traits::caseDiff(prop);
-}
-
-/*!
- \fn QChar QChar::toLower() const
-
- Returns the lowercase equivalent if the character is uppercase or titlecase;
- otherwise returns the character itself.
-*/
-
-/*!
- \overload
- Returns the lowercase equivalent of the UCS-4-encoded character specified
- by \a ucs4 if the character is uppercase or titlecase; otherwise returns
- the character itself.
-*/
-uint QChar::toLower(uint ucs4) Q_DECL_NOTHROW
-{
- if (ucs4 > LastValidCodePoint)
- return ucs4;
- return convertCase_helper<QUnicodeTables::LowercaseTraits>(ucs4);
-}
-
-/*!
- \fn QChar QChar::toUpper() const
-
- Returns the uppercase equivalent if the character is lowercase or titlecase;
- otherwise returns the character itself.
-*/
-
-/*!
- \overload
- Returns the uppercase equivalent of the UCS-4-encoded character specified
- by \a ucs4 if the character is lowercase or titlecase; otherwise returns
- the character itself.
-*/
-uint QChar::toUpper(uint ucs4) Q_DECL_NOTHROW
-{
- if (ucs4 > LastValidCodePoint)
- return ucs4;
- return convertCase_helper<QUnicodeTables::UppercaseTraits>(ucs4);
-}
-
-/*!
- \fn QChar QChar::toTitleCase() const
-
- Returns the title case equivalent if the character is lowercase or uppercase;
- otherwise returns the character itself.
-*/
-
-/*!
- \overload
- Returns the title case equivalent of the UCS-4-encoded character specified
- by \a ucs4 if the character is lowercase or uppercase; otherwise returns
- the character itself.
-*/
-uint QChar::toTitleCase(uint ucs4) Q_DECL_NOTHROW
-{
- if (ucs4 > LastValidCodePoint)
- return ucs4;
- return convertCase_helper<QUnicodeTables::TitlecaseTraits>(ucs4);
-}
-
-static inline uint foldCase(const ushort *ch, const ushort *start)
-{
- uint ucs4 = *ch;
- if (QChar::isLowSurrogate(ucs4) && ch > start && QChar::isHighSurrogate(*(ch - 1)))
- ucs4 = QChar::surrogateToUcs4(*(ch - 1), ucs4);
- return convertCase_helper<QUnicodeTables::CasefoldTraits>(ucs4);
-}
-
-static inline uint foldCase(uint ch, uint &last) Q_DECL_NOTHROW
-{
- uint ucs4 = ch;
- if (QChar::isLowSurrogate(ucs4) && QChar::isHighSurrogate(last))
- ucs4 = QChar::surrogateToUcs4(last, ucs4);
- last = ch;
- return convertCase_helper<QUnicodeTables::CasefoldTraits>(ucs4);
-}
-
-static inline ushort foldCase(ushort ch) Q_DECL_NOTHROW
-{
- return convertCase_helper<QUnicodeTables::CasefoldTraits>(ch);
-}
-
-static inline QChar foldCase(QChar ch) Q_DECL_NOTHROW
-{
- return QChar(foldCase(ch.unicode()));
-}
-
-/*!
- \fn QChar QChar::toCaseFolded() const
-
- Returns the case folded equivalent of the character.
- For most Unicode characters this is the same as toLower().
-*/
-
-/*!
- \overload
- Returns the case folded equivalent of the UCS-4-encoded character specified
- by \a ucs4. For most Unicode characters this is the same as toLower().
-*/
-uint QChar::toCaseFolded(uint ucs4) Q_DECL_NOTHROW
-{
- if (ucs4 > LastValidCodePoint)
- return ucs4;
- return convertCase_helper<QUnicodeTables::CasefoldTraits>(ucs4);
-}
-
-/*!
- \fn char QChar::toLatin1() const
-
- Returns the Latin-1 character equivalent to the QChar, or 0. This
- is mainly useful for non-internationalized software.
-
- \note It is not possible to distinguish a non-Latin-1 character from a Latin-1 0
- (NUL) character. Prefer to use unicode(), which does not have this ambiguity.
-
- \sa unicode()
-*/
-
-/*!
- \fn QChar QChar::fromLatin1(char)
-
- Converts the Latin-1 character \a c to its equivalent QChar. This
- is mainly useful for non-internationalized software.
-
- An alternative is to use QLatin1Char.
-
- \sa toLatin1(), unicode()
-*/
-
-/*!
- \fn char QChar::toAscii() const
- \deprecated
-
- Returns the Latin-1 character value of the QChar, or 0 if the character is not
- representable.
-
- The main purpose of this function is to preserve ASCII characters used
- in C strings. This is mainly useful for developers of non-internationalized
- software.
-
- \note It is not possible to distinguish a non-Latin 1 character from an ASCII 0
- (NUL) character. Prefer to use unicode(), which does not have this ambiguity.
-
- \note This function does not check whether the character value is inside
- the valid range of US-ASCII.
-
- \sa toLatin1(), unicode()
-*/
-
-/*!
- \fn QChar QChar::fromAscii(char)
- \deprecated
-
- Converts the ASCII character \a c to it's equivalent QChar. This
- is mainly useful for non-internationalized software.
-
- An alternative is to use QLatin1Char.
-
- \sa fromLatin1(), unicode()
-*/
-
-#ifndef QT_NO_DATASTREAM
-/*!
- \relates QChar
-
- Writes the char \a chr to the stream \a out.
-
- \sa {Serializing Qt Data Types}
-*/
-QDataStream &operator<<(QDataStream &out, QChar chr)
-{
- out << quint16(chr.unicode());
- return out;
-}
-
-/*!
- \relates QChar
-
- Reads a char from the stream \a in into char \a chr.
-
- \sa {Serializing Qt Data Types}
-*/
-QDataStream &operator>>(QDataStream &in, QChar &chr)
-{
- quint16 u;
- in >> u;
- chr.unicode() = ushort(u);
- return in;
-}
-#endif // QT_NO_DATASTREAM
-
-/*!
- \fn ushort & QChar::unicode()
-
- Returns a reference to the numeric Unicode value of the QChar.
-*/
-
-/*!
- \fn ushort QChar::unicode() const
-
- Returns the numeric Unicode value of the QChar.
-*/
-
-/*****************************************************************************
- Documentation of QChar related functions
- *****************************************************************************/
-
-/*!
- \fn bool operator==(QChar c1, QChar c2)
-
- \relates QChar
-
- Returns \c true if \a c1 and \a c2 are the same Unicode character;
- otherwise returns \c false.
-*/
-
-/*!
- \fn int operator!=(QChar c1, QChar c2)
-
- \relates QChar
-
- Returns \c true if \a c1 and \a c2 are not the same Unicode
- character; otherwise returns \c false.
-*/
-
-/*!
- \fn int operator<=(QChar c1, QChar c2)
-
- \relates QChar
-
- Returns \c true if the numeric Unicode value of \a c1 is less than
- or equal to that of \a c2; otherwise returns \c false.
-*/
-
-/*!
- \fn int operator>=(QChar c1, QChar c2)
-
- \relates QChar
-
- Returns \c true if the numeric Unicode value of \a c1 is greater than
- or equal to that of \a c2; otherwise returns \c false.
-*/
-
-/*!
- \fn int operator<(QChar c1, QChar c2)
-
- \relates QChar
-
- Returns \c true if the numeric Unicode value of \a c1 is less than
- that of \a c2; otherwise returns \c false.
-*/
-
-/*!
- \fn int operator>(QChar c1, QChar c2)
-
- \relates QChar
-
- Returns \c true if the numeric Unicode value of \a c1 is greater than
- that of \a c2; otherwise returns \c false.
-*/
-
-
-// ---------------------------------------------------------------------------
-
-
-static void decomposeHelper(QString *str, bool canonical, QChar::UnicodeVersion version, int from)
-{
- int length;
- int tag;
- unsigned short buffer[3];
-
- QString &s = *str;
-
- const unsigned short *utf16 = reinterpret_cast<unsigned short *>(s.data());
- const unsigned short *uc = utf16 + s.length();
- while (uc != utf16 + from) {
- uint ucs4 = *(--uc);
- if (QChar(ucs4).isLowSurrogate() && uc != utf16) {
- ushort high = *(uc - 1);
- if (QChar(high).isHighSurrogate()) {
- --uc;
- ucs4 = QChar::surrogateToUcs4(high, ucs4);
- }
- }
-
- if (QChar::unicodeVersion(ucs4) > version)
- continue;
-
- const unsigned short *d = decompositionHelper(ucs4, &length, &tag, buffer);
- if (!d || (canonical && tag != QChar::Canonical))
- continue;
-
- int pos = uc - utf16;
- s.replace(pos, QChar::requiresSurrogates(ucs4) ? 2 : 1, reinterpret_cast<const QChar *>(d), length);
- // since the replace invalidates the pointers and we do decomposition recursive
- utf16 = reinterpret_cast<unsigned short *>(s.data());
- uc = utf16 + pos + length;
- }
-}
-
-
-struct UCS2Pair {
- ushort u1;
- ushort u2;
-};
-
-inline bool operator<(const UCS2Pair &ligature1, const UCS2Pair &ligature2)
-{ return ligature1.u1 < ligature2.u1; }
-inline bool operator<(ushort u1, const UCS2Pair &ligature)
-{ return u1 < ligature.u1; }
-inline bool operator<(const UCS2Pair &ligature, ushort u1)
-{ return ligature.u1 < u1; }
-
-struct UCS2SurrogatePair {
- UCS2Pair p1;
- UCS2Pair p2;
-};
-
-inline bool operator<(const UCS2SurrogatePair &ligature1, const UCS2SurrogatePair &ligature2)
-{ return QChar::surrogateToUcs4(ligature1.p1.u1, ligature1.p1.u2) < QChar::surrogateToUcs4(ligature2.p1.u1, ligature2.p1.u2); }
-inline bool operator<(uint u1, const UCS2SurrogatePair &ligature)
-{ return u1 < QChar::surrogateToUcs4(ligature.p1.u1, ligature.p1.u2); }
-inline bool operator<(const UCS2SurrogatePair &ligature, uint u1)
-{ return QChar::surrogateToUcs4(ligature.p1.u1, ligature.p1.u2) < u1; }
-
-static uint inline ligatureHelper(uint u1, uint u2)
-{
- if (u1 >= Hangul_LBase && u1 <= Hangul_SBase + Hangul_SCount) {
- // compute Hangul syllable composition as per UAX #15
- // hangul L-V pair
- const uint LIndex = u1 - Hangul_LBase;
- if (LIndex < Hangul_LCount) {
- const uint VIndex = u2 - Hangul_VBase;
- if (VIndex < Hangul_VCount)
- return Hangul_SBase + (LIndex * Hangul_VCount + VIndex) * Hangul_TCount;
- }
- // hangul LV-T pair
- const uint SIndex = u1 - Hangul_SBase;
- if (SIndex < Hangul_SCount && (SIndex % Hangul_TCount) == 0) {
- const uint TIndex = u2 - Hangul_TBase;
- if (TIndex <= Hangul_TCount)
- return u1 + TIndex;
- }
- }
-
- const unsigned short index = GET_LIGATURE_INDEX(u2);
- if (index == 0xffff)
- return 0;
- const unsigned short *ligatures = uc_ligature_map+index;
- ushort length = *ligatures++;
- if (QChar::requiresSurrogates(u1)) {
- const UCS2SurrogatePair *data = reinterpret_cast<const UCS2SurrogatePair *>(ligatures);
- const UCS2SurrogatePair *r = std::lower_bound(data, data + length, u1);
- if (r != data + length && QChar::surrogateToUcs4(r->p1.u1, r->p1.u2) == u1)
- return QChar::surrogateToUcs4(r->p2.u1, r->p2.u2);
- } else {
- const UCS2Pair *data = reinterpret_cast<const UCS2Pair *>(ligatures);
- const UCS2Pair *r = std::lower_bound(data, data + length, ushort(u1));
- if (r != data + length && r->u1 == ushort(u1))
- return r->u2;
- }
-
- return 0;
-}
-
-static void composeHelper(QString *str, QChar::UnicodeVersion version, int from)
-{
- QString &s = *str;
-
- if (from < 0 || s.length() - from < 2)
- return;
-
- uint stcode = 0; // starter code point
- int starter = -1; // starter position
- int next = -1; // to prevent i == next
- int lastCombining = 255; // to prevent combining > lastCombining
-
- int pos = from;
- while (pos < s.length()) {
- int i = pos;
- uint uc = s.at(pos).unicode();
- if (QChar(uc).isHighSurrogate() && pos < s.length()-1) {
- ushort low = s.at(pos+1).unicode();
- if (QChar(low).isLowSurrogate()) {
- uc = QChar::surrogateToUcs4(uc, low);
- ++pos;
- }
- }
-
- const QUnicodeTables::Properties *p = qGetProp(uc);
- if (p->unicodeVersion > version) {
- starter = -1;
- next = -1; // to prevent i == next
- lastCombining = 255; // to prevent combining > lastCombining
- ++pos;
- continue;
- }
-
- int combining = p->combiningClass;
- if ((i == next || combining > lastCombining) && starter >= from) {
- // allowed to form ligature with S
- uint ligature = ligatureHelper(stcode, uc);
- if (ligature) {
- stcode = ligature;
- QChar *d = s.data();
- // ligatureHelper() never changes planes
- if (QChar::requiresSurrogates(ligature)) {
- d[starter] = QChar::highSurrogate(ligature);
- d[starter + 1] = QChar::lowSurrogate(ligature);
- s.remove(i, 2);
- } else {
- d[starter] = ligature;
- s.remove(i, 1);
- }
- continue;
- }
- }
- if (combining == 0) {
- starter = i;
- stcode = uc;
- next = pos + 1;
- }
- lastCombining = combining;
-
- ++pos;
- }
-}
-
-
-static void canonicalOrderHelper(QString *str, QChar::UnicodeVersion version, int from)
-{
- QString &s = *str;
- const int l = s.length()-1;
-
- uint u1, u2;
- ushort c1, c2;
-
- int pos = from;
- while (pos < l) {
- int p2 = pos+1;
- u1 = s.at(pos).unicode();
- if (QChar(u1).isHighSurrogate()) {
- ushort low = s.at(p2).unicode();
- if (QChar(low).isLowSurrogate()) {
- u1 = QChar::surrogateToUcs4(u1, low);
- if (p2 >= l)
- break;
- ++p2;
- }
- }
- c1 = 0;
-
- advance:
- u2 = s.at(p2).unicode();
- if (QChar(u2).isHighSurrogate() && p2 < l) {
- ushort low = s.at(p2+1).unicode();
- if (QChar(low).isLowSurrogate()) {
- u2 = QChar::surrogateToUcs4(u2, low);
- ++p2;
- }
- }
-
- c2 = 0;
- {
- const QUnicodeTables::Properties *p = qGetProp(u2);
- if (p->unicodeVersion <= version)
- c2 = p->combiningClass;
- }
- if (c2 == 0) {
- pos = p2+1;
- continue;
- }
-
- if (c1 == 0) {
- const QUnicodeTables::Properties *p = qGetProp(u1);
- if (p->unicodeVersion <= version)
- c1 = p->combiningClass;
- }
-
- if (c1 > c2) {
- QChar *uc = s.data();
- int p = pos;
- // exchange characters
- if (!QChar::requiresSurrogates(u2)) {
- uc[p++] = u2;
- } else {
- uc[p++] = QChar::highSurrogate(u2);
- uc[p++] = QChar::lowSurrogate(u2);
- }
- if (!QChar::requiresSurrogates(u1)) {
- uc[p++] = u1;
- } else {
- uc[p++] = QChar::highSurrogate(u1);
- uc[p++] = QChar::lowSurrogate(u1);
- }
- if (pos > 0)
- --pos;
- if (pos > 0 && s.at(pos).isLowSurrogate())
- --pos;
- } else {
- ++pos;
- if (QChar::requiresSurrogates(u1))
- ++pos;
-
- u1 = u2;
- c1 = c2; // != 0
- p2 = pos + 1;
- if (QChar::requiresSurrogates(u1))
- ++p2;
- if (p2 > l)
- break;
-
- goto advance;
- }
- }
-}
-
-// returns true if the text is in a desired Normalization Form already; false otherwise.
-// sets lastStable to the position of the last stable code point
-static bool normalizationQuickCheckHelper(QString *str, QString::NormalizationForm mode, int from, int *lastStable)
-{
- Q_STATIC_ASSERT(QString::NormalizationForm_D == 0);
- Q_STATIC_ASSERT(QString::NormalizationForm_C == 1);
- Q_STATIC_ASSERT(QString::NormalizationForm_KD == 2);
- Q_STATIC_ASSERT(QString::NormalizationForm_KC == 3);
-
- enum { NFQC_YES = 0, NFQC_NO = 1, NFQC_MAYBE = 3 };
-
- const ushort *string = reinterpret_cast<const ushort *>(str->constData());
- int length = str->length();
-
- // this avoids one out of bounds check in the loop
- while (length > from && QChar::isHighSurrogate(string[length - 1]))
- --length;
-
- uchar lastCombining = 0;
- for (int i = from; i < length; ++i) {
- int pos = i;
- uint uc = string[i];
- if (uc < 0x80) {
- // ASCII characters are stable code points
- lastCombining = 0;
- *lastStable = pos;
- continue;
- }
-
- if (QChar::isHighSurrogate(uc)) {
- ushort low = string[i + 1];
- if (!QChar::isLowSurrogate(low)) {
- // treat surrogate like stable code point
- lastCombining = 0;
- *lastStable = pos;
- continue;
- }
- ++i;
- uc = QChar::surrogateToUcs4(uc, low);
- }
-
- const QUnicodeTables::Properties *p = qGetProp(uc);
-
- if (p->combiningClass < lastCombining && p->combiningClass > 0)
- return false;
-
- const uchar check = (p->nfQuickCheck >> (mode << 1)) & 0x03;
- if (check != NFQC_YES)
- return false; // ### can we quick check NFQC_MAYBE ?
-
- lastCombining = p->combiningClass;
- if (lastCombining == 0)
- *lastStable = pos;
- }
-
- if (length != str->length()) // low surrogate parts at the end of text
- *lastStable = str->length() - 1;
-
- return true;
-}
-
-QT_END_NAMESPACE
diff --git a/src/corelib/tools/qchar.h b/src/corelib/tools/qchar.h
deleted file mode 100644
index 8590b91ba3..0000000000
--- a/src/corelib/tools/qchar.h
+++ /dev/null
@@ -1,631 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#ifndef QCHAR_H
-#define QCHAR_H
-
-#include <QtCore/qglobal.h>
-
-QT_BEGIN_NAMESPACE
-
-
-class QString;
-
-struct QLatin1Char
-{
-public:
- Q_DECL_CONSTEXPR inline explicit QLatin1Char(char c) Q_DECL_NOTHROW : ch(c) {}
- Q_DECL_CONSTEXPR inline char toLatin1() const Q_DECL_NOTHROW { return ch; }
- Q_DECL_CONSTEXPR inline ushort unicode() const Q_DECL_NOTHROW { return ushort(uchar(ch)); }
-
-private:
- char ch;
-};
-
-
-class Q_CORE_EXPORT QChar {
-public:
- enum SpecialCharacter {
- Null = 0x0000,
- Tabulation = 0x0009,
- LineFeed = 0x000a,
- CarriageReturn = 0x000d,
- Space = 0x0020,
- Nbsp = 0x00a0,
- SoftHyphen = 0x00ad,
- ReplacementCharacter = 0xfffd,
- ObjectReplacementCharacter = 0xfffc,
- ByteOrderMark = 0xfeff,
- ByteOrderSwapped = 0xfffe,
- ParagraphSeparator = 0x2029,
- LineSeparator = 0x2028,
- LastValidCodePoint = 0x10ffff
- };
-
- Q_DECL_CONSTEXPR QChar() Q_DECL_NOTHROW : ucs(0) {}
- Q_DECL_CONSTEXPR QChar(ushort rc) Q_DECL_NOTHROW : ucs(rc) {} // implicit
- Q_DECL_CONSTEXPR QChar(uchar c, uchar r) Q_DECL_NOTHROW : ucs(ushort((r << 8) | c)) {}
- Q_DECL_CONSTEXPR QChar(short rc) Q_DECL_NOTHROW : ucs(ushort(rc)) {} // implicit
- Q_DECL_CONSTEXPR QChar(uint rc) Q_DECL_NOTHROW : ucs(ushort(rc & 0xffff)) {}
- Q_DECL_CONSTEXPR QChar(int rc) Q_DECL_NOTHROW : ucs(ushort(rc & 0xffff)) {}
- Q_DECL_CONSTEXPR QChar(SpecialCharacter s) Q_DECL_NOTHROW : ucs(ushort(s)) {} // implicit
- Q_DECL_CONSTEXPR QChar(QLatin1Char ch) Q_DECL_NOTHROW : ucs(ch.unicode()) {} // implicit
-#if defined(Q_COMPILER_UNICODE_STRINGS)
- Q_DECL_CONSTEXPR QChar(char16_t ch) Q_DECL_NOTHROW : ucs(ushort(ch)) {} // implicit
-#endif
-#if defined(Q_OS_WIN)
- Q_STATIC_ASSERT(sizeof(wchar_t) == sizeof(ushort));
-#endif
-#if defined(Q_OS_WIN) || defined(Q_CLANG_QDOC)
-# if !defined(_WCHAR_T_DEFINED) || defined(_NATIVE_WCHAR_T_DEFINED)
- Q_DECL_CONSTEXPR QChar(wchar_t ch) Q_DECL_NOTHROW : ucs(ushort(ch)) {} // implicit
-# endif
-#endif
-
-#ifndef QT_NO_CAST_FROM_ASCII
- QT_ASCII_CAST_WARN Q_DECL_CONSTEXPR explicit QChar(char c) Q_DECL_NOTHROW : ucs(uchar(c)) { }
-#ifndef QT_RESTRICTED_CAST_FROM_ASCII
- QT_ASCII_CAST_WARN Q_DECL_CONSTEXPR explicit QChar(uchar c) Q_DECL_NOTHROW : ucs(c) { }
-#endif
-#endif
- // Unicode information
-
- enum Category
- {
- Mark_NonSpacing, // Mn
- Mark_SpacingCombining, // Mc
- Mark_Enclosing, // Me
-
- Number_DecimalDigit, // Nd
- Number_Letter, // Nl
- Number_Other, // No
-
- Separator_Space, // Zs
- Separator_Line, // Zl
- Separator_Paragraph, // Zp
-
- Other_Control, // Cc
- Other_Format, // Cf
- Other_Surrogate, // Cs
- Other_PrivateUse, // Co
- Other_NotAssigned, // Cn
-
- Letter_Uppercase, // Lu
- Letter_Lowercase, // Ll
- Letter_Titlecase, // Lt
- Letter_Modifier, // Lm
- Letter_Other, // Lo
-
- Punctuation_Connector, // Pc
- Punctuation_Dash, // Pd
- Punctuation_Open, // Ps
- Punctuation_Close, // Pe
- Punctuation_InitialQuote, // Pi
- Punctuation_FinalQuote, // Pf
- Punctuation_Other, // Po
-
- Symbol_Math, // Sm
- Symbol_Currency, // Sc
- Symbol_Modifier, // Sk
- Symbol_Other // So
- };
-
- enum Script
- {
- Script_Unknown,
- Script_Inherited,
- Script_Common,
-
- Script_Latin,
- Script_Greek,
- Script_Cyrillic,
- Script_Armenian,
- Script_Hebrew,
- Script_Arabic,
- Script_Syriac,
- Script_Thaana,
- Script_Devanagari,
- Script_Bengali,
- Script_Gurmukhi,
- Script_Gujarati,
- Script_Oriya,
- Script_Tamil,
- Script_Telugu,
- Script_Kannada,
- Script_Malayalam,
- Script_Sinhala,
- Script_Thai,
- Script_Lao,
- Script_Tibetan,
- Script_Myanmar,
- Script_Georgian,
- Script_Hangul,
- Script_Ethiopic,
- Script_Cherokee,
- Script_CanadianAboriginal,
- Script_Ogham,
- Script_Runic,
- Script_Khmer,
- Script_Mongolian,
- Script_Hiragana,
- Script_Katakana,
- Script_Bopomofo,
- Script_Han,
- Script_Yi,
- Script_OldItalic,
- Script_Gothic,
- Script_Deseret,
- Script_Tagalog,
- Script_Hanunoo,
- Script_Buhid,
- Script_Tagbanwa,
- Script_Coptic,
-
- // Unicode 4.0 additions
- Script_Limbu,
- Script_TaiLe,
- Script_LinearB,
- Script_Ugaritic,
- Script_Shavian,
- Script_Osmanya,
- Script_Cypriot,
- Script_Braille,
-
- // Unicode 4.1 additions
- Script_Buginese,
- Script_NewTaiLue,
- Script_Glagolitic,
- Script_Tifinagh,
- Script_SylotiNagri,
- Script_OldPersian,
- Script_Kharoshthi,
-
- // Unicode 5.0 additions
- Script_Balinese,
- Script_Cuneiform,
- Script_Phoenician,
- Script_PhagsPa,
- Script_Nko,
-
- // Unicode 5.1 additions
- Script_Sundanese,
- Script_Lepcha,
- Script_OlChiki,
- Script_Vai,
- Script_Saurashtra,
- Script_KayahLi,
- Script_Rejang,
- Script_Lycian,
- Script_Carian,
- Script_Lydian,
- Script_Cham,
-
- // Unicode 5.2 additions
- Script_TaiTham,
- Script_TaiViet,
- Script_Avestan,
- Script_EgyptianHieroglyphs,
- Script_Samaritan,
- Script_Lisu,
- Script_Bamum,
- Script_Javanese,
- Script_MeeteiMayek,
- Script_ImperialAramaic,
- Script_OldSouthArabian,
- Script_InscriptionalParthian,
- Script_InscriptionalPahlavi,
- Script_OldTurkic,
- Script_Kaithi,
-
- // Unicode 6.0 additions
- Script_Batak,
- Script_Brahmi,
- Script_Mandaic,
-
- // Unicode 6.1 additions
- Script_Chakma,
- Script_MeroiticCursive,
- Script_MeroiticHieroglyphs,
- Script_Miao,
- Script_Sharada,
- Script_SoraSompeng,
- Script_Takri,
-
- // Unicode 7.0 additions
- Script_CaucasianAlbanian,
- Script_BassaVah,
- Script_Duployan,
- Script_Elbasan,
- Script_Grantha,
- Script_PahawhHmong,
- Script_Khojki,
- Script_LinearA,
- Script_Mahajani,
- Script_Manichaean,
- Script_MendeKikakui,
- Script_Modi,
- Script_Mro,
- Script_OldNorthArabian,
- Script_Nabataean,
- Script_Palmyrene,
- Script_PauCinHau,
- Script_OldPermic,
- Script_PsalterPahlavi,
- Script_Siddham,
- Script_Khudawadi,
- Script_Tirhuta,
- Script_WarangCiti,
-
- // Unicode 8.0 additions
- Script_Ahom,
- Script_AnatolianHieroglyphs,
- Script_Hatran,
- Script_Multani,
- Script_OldHungarian,
- Script_SignWriting,
-
- // Unicode 9.0 additions
- Script_Adlam,
- Script_Bhaiksuki,
- Script_Marchen,
- Script_Newa,
- Script_Osage,
- Script_Tangut,
-
- // Unicode 10.0 additions
- Script_MasaramGondi,
- Script_Nushu,
- Script_Soyombo,
- Script_ZanabazarSquare,
-
- ScriptCount
- };
-
- enum Direction
- {
- DirL, DirR, DirEN, DirES, DirET, DirAN, DirCS, DirB, DirS, DirWS, DirON,
- DirLRE, DirLRO, DirAL, DirRLE, DirRLO, DirPDF, DirNSM, DirBN,
- DirLRI, DirRLI, DirFSI, DirPDI
- };
-
- enum Decomposition
- {
- NoDecomposition,
- Canonical,
- Font,
- NoBreak,
- Initial,
- Medial,
- Final,
- Isolated,
- Circle,
- Super,
- Sub,
- Vertical,
- Wide,
- Narrow,
- Small,
- Square,
- Compat,
- Fraction
- };
-
- enum JoiningType {
- Joining_None,
- Joining_Causing,
- Joining_Dual,
- Joining_Right,
- Joining_Left,
- Joining_Transparent
- };
-
-#if QT_DEPRECATED_SINCE(5, 3)
- enum Joining
- {
- OtherJoining, Dual, Right, Center
- };
-#endif
-
- enum CombiningClass
- {
- Combining_BelowLeftAttached = 200,
- Combining_BelowAttached = 202,
- Combining_BelowRightAttached = 204,
- Combining_LeftAttached = 208,
- Combining_RightAttached = 210,
- Combining_AboveLeftAttached = 212,
- Combining_AboveAttached = 214,
- Combining_AboveRightAttached = 216,
-
- Combining_BelowLeft = 218,
- Combining_Below = 220,
- Combining_BelowRight = 222,
- Combining_Left = 224,
- Combining_Right = 226,
- Combining_AboveLeft = 228,
- Combining_Above = 230,
- Combining_AboveRight = 232,
-
- Combining_DoubleBelow = 233,
- Combining_DoubleAbove = 234,
- Combining_IotaSubscript = 240
- };
-
- enum UnicodeVersion {
- Unicode_Unassigned,
- Unicode_1_1,
- Unicode_2_0,
- Unicode_2_1_2,
- Unicode_3_0,
- Unicode_3_1,
- Unicode_3_2,
- Unicode_4_0,
- Unicode_4_1,
- Unicode_5_0,
- Unicode_5_1,
- Unicode_5_2,
- Unicode_6_0,
- Unicode_6_1,
- Unicode_6_2,
- Unicode_6_3,
- Unicode_7_0,
- Unicode_8_0,
- Unicode_9_0,
- Unicode_10_0
- };
- // ****** WHEN ADDING FUNCTIONS, CONSIDER ADDING TO QCharRef TOO
-
- inline Category category() const Q_DECL_NOTHROW { return QChar::category(ucs); }
- inline Direction direction() const Q_DECL_NOTHROW { return QChar::direction(ucs); }
- inline JoiningType joiningType() const Q_DECL_NOTHROW { return QChar::joiningType(ucs); }
-#if QT_DEPRECATED_SINCE(5, 3)
- QT_DEPRECATED inline Joining joining() const Q_DECL_NOTHROW
- {
- switch (QChar::joiningType(ucs)) {
- case QChar::Joining_Causing: return QChar::Center;
- case QChar::Joining_Dual: return QChar::Dual;
- case QChar::Joining_Right: return QChar::Right;
- case QChar::Joining_None:
- case QChar::Joining_Left:
- case QChar::Joining_Transparent:
- default: return QChar::OtherJoining;
- }
- }
-#endif
- inline unsigned char combiningClass() const Q_DECL_NOTHROW { return QChar::combiningClass(ucs); }
-
- inline QChar mirroredChar() const Q_DECL_NOTHROW { return QChar::mirroredChar(ucs); }
- inline bool hasMirrored() const Q_DECL_NOTHROW { return QChar::hasMirrored(ucs); }
-
- QString decomposition() const;
- inline Decomposition decompositionTag() const Q_DECL_NOTHROW { return QChar::decompositionTag(ucs); }
-
- inline int digitValue() const Q_DECL_NOTHROW { return QChar::digitValue(ucs); }
- inline QChar toLower() const Q_DECL_NOTHROW { return QChar::toLower(ucs); }
- inline QChar toUpper() const Q_DECL_NOTHROW { return QChar::toUpper(ucs); }
- inline QChar toTitleCase() const Q_DECL_NOTHROW { return QChar::toTitleCase(ucs); }
- inline QChar toCaseFolded() const Q_DECL_NOTHROW { return QChar::toCaseFolded(ucs); }
-
- inline Script script() const Q_DECL_NOTHROW { return QChar::script(ucs); }
-
- inline UnicodeVersion unicodeVersion() const Q_DECL_NOTHROW { return QChar::unicodeVersion(ucs); }
-
-#if QT_DEPRECATED_SINCE(5, 0)
- QT_DEPRECATED Q_DECL_CONSTEXPR inline char toAscii() const Q_DECL_NOTHROW { return toLatin1(); }
-#endif
- Q_DECL_CONSTEXPR inline char toLatin1() const Q_DECL_NOTHROW { return ucs > 0xff ? '\0' : char(ucs); }
- Q_DECL_CONSTEXPR inline ushort unicode() const Q_DECL_NOTHROW { return ucs; }
- Q_DECL_RELAXED_CONSTEXPR inline ushort &unicode() Q_DECL_NOTHROW { return ucs; }
-
-#if QT_DEPRECATED_SINCE(5, 0)
- QT_DEPRECATED static Q_DECL_CONSTEXPR inline QChar fromAscii(char c) Q_DECL_NOTHROW
- { return fromLatin1(c); }
-#endif
- static Q_DECL_CONSTEXPR inline QChar fromLatin1(char c) Q_DECL_NOTHROW { return QChar(ushort(uchar(c))); }
-
- Q_DECL_CONSTEXPR inline bool isNull() const Q_DECL_NOTHROW { return ucs == 0; }
-
- inline bool isPrint() const Q_DECL_NOTHROW { return QChar::isPrint(ucs); }
- Q_DECL_CONSTEXPR inline bool isSpace() const Q_DECL_NOTHROW { return QChar::isSpace(ucs); }
- inline bool isMark() const Q_DECL_NOTHROW { return QChar::isMark(ucs); }
- inline bool isPunct() const Q_DECL_NOTHROW { return QChar::isPunct(ucs); }
- inline bool isSymbol() const Q_DECL_NOTHROW { return QChar::isSymbol(ucs); }
- Q_DECL_CONSTEXPR inline bool isLetter() const Q_DECL_NOTHROW { return QChar::isLetter(ucs); }
- Q_DECL_CONSTEXPR inline bool isNumber() const Q_DECL_NOTHROW { return QChar::isNumber(ucs); }
- Q_DECL_CONSTEXPR inline bool isLetterOrNumber() const Q_DECL_NOTHROW { return QChar::isLetterOrNumber(ucs); }
- Q_DECL_CONSTEXPR inline bool isDigit() const Q_DECL_NOTHROW { return QChar::isDigit(ucs); }
- Q_DECL_CONSTEXPR inline bool isLower() const Q_DECL_NOTHROW { return QChar::isLower(ucs); }
- Q_DECL_CONSTEXPR inline bool isUpper() const Q_DECL_NOTHROW { return QChar::isUpper(ucs); }
- Q_DECL_CONSTEXPR inline bool isTitleCase() const Q_DECL_NOTHROW { return QChar::isTitleCase(ucs); }
-
- Q_DECL_CONSTEXPR inline bool isNonCharacter() const Q_DECL_NOTHROW { return QChar::isNonCharacter(ucs); }
- Q_DECL_CONSTEXPR inline bool isHighSurrogate() const Q_DECL_NOTHROW { return QChar::isHighSurrogate(ucs); }
- Q_DECL_CONSTEXPR inline bool isLowSurrogate() const Q_DECL_NOTHROW { return QChar::isLowSurrogate(ucs); }
- Q_DECL_CONSTEXPR inline bool isSurrogate() const Q_DECL_NOTHROW { return QChar::isSurrogate(ucs); }
-
- Q_DECL_CONSTEXPR inline uchar cell() const Q_DECL_NOTHROW { return uchar(ucs & 0xff); }
- Q_DECL_CONSTEXPR inline uchar row() const Q_DECL_NOTHROW { return uchar((ucs>>8)&0xff); }
- Q_DECL_RELAXED_CONSTEXPR inline void setCell(uchar acell) Q_DECL_NOTHROW { ucs = ushort((ucs & 0xff00) + acell); }
- Q_DECL_RELAXED_CONSTEXPR inline void setRow(uchar arow) Q_DECL_NOTHROW { ucs = ushort((ushort(arow)<<8) + (ucs&0xff)); }
-
- static Q_DECL_CONSTEXPR inline bool isNonCharacter(uint ucs4) Q_DECL_NOTHROW
- {
- return ucs4 >= 0xfdd0 && (ucs4 <= 0xfdef || (ucs4 & 0xfffe) == 0xfffe);
- }
- static Q_DECL_CONSTEXPR inline bool isHighSurrogate(uint ucs4) Q_DECL_NOTHROW
- {
- return ((ucs4 & 0xfffffc00) == 0xd800);
- }
- static Q_DECL_CONSTEXPR inline bool isLowSurrogate(uint ucs4) Q_DECL_NOTHROW
- {
- return ((ucs4 & 0xfffffc00) == 0xdc00);
- }
- static Q_DECL_CONSTEXPR inline bool isSurrogate(uint ucs4) Q_DECL_NOTHROW
- {
- return (ucs4 - 0xd800u < 2048u);
- }
- static Q_DECL_CONSTEXPR inline bool requiresSurrogates(uint ucs4) Q_DECL_NOTHROW
- {
- return (ucs4 >= 0x10000);
- }
- static Q_DECL_CONSTEXPR inline uint surrogateToUcs4(ushort high, ushort low) Q_DECL_NOTHROW
- {
- return (uint(high)<<10) + low - 0x35fdc00;
- }
- static Q_DECL_CONSTEXPR inline uint surrogateToUcs4(QChar high, QChar low) Q_DECL_NOTHROW
- {
- return surrogateToUcs4(high.ucs, low.ucs);
- }
- static Q_DECL_CONSTEXPR inline ushort highSurrogate(uint ucs4) Q_DECL_NOTHROW
- {
- return ushort((ucs4>>10) + 0xd7c0);
- }
- static Q_DECL_CONSTEXPR inline ushort lowSurrogate(uint ucs4) Q_DECL_NOTHROW
- {
- return ushort(ucs4%0x400 + 0xdc00);
- }
-
- static Category QT_FASTCALL category(uint ucs4) Q_DECL_NOTHROW Q_DECL_CONST_FUNCTION;
- static Direction QT_FASTCALL direction(uint ucs4) Q_DECL_NOTHROW Q_DECL_CONST_FUNCTION;
- static JoiningType QT_FASTCALL joiningType(uint ucs4) Q_DECL_NOTHROW Q_DECL_CONST_FUNCTION;
-#if QT_DEPRECATED_SINCE(5, 3)
- QT_DEPRECATED static Joining QT_FASTCALL joining(uint ucs4) Q_DECL_NOTHROW Q_DECL_CONST_FUNCTION;
-#endif
- static unsigned char QT_FASTCALL combiningClass(uint ucs4) Q_DECL_NOTHROW Q_DECL_CONST_FUNCTION;
-
- static uint QT_FASTCALL mirroredChar(uint ucs4) Q_DECL_NOTHROW Q_DECL_CONST_FUNCTION;
- static bool QT_FASTCALL hasMirrored(uint ucs4) Q_DECL_NOTHROW Q_DECL_CONST_FUNCTION;
-
- static QString QT_FASTCALL decomposition(uint ucs4);
- static Decomposition QT_FASTCALL decompositionTag(uint ucs4) Q_DECL_NOTHROW Q_DECL_CONST_FUNCTION;
-
- static int QT_FASTCALL digitValue(uint ucs4) Q_DECL_NOTHROW Q_DECL_CONST_FUNCTION;
- static uint QT_FASTCALL toLower(uint ucs4) Q_DECL_NOTHROW Q_DECL_CONST_FUNCTION;
- static uint QT_FASTCALL toUpper(uint ucs4) Q_DECL_NOTHROW Q_DECL_CONST_FUNCTION;
- static uint QT_FASTCALL toTitleCase(uint ucs4) Q_DECL_NOTHROW Q_DECL_CONST_FUNCTION;
- static uint QT_FASTCALL toCaseFolded(uint ucs4) Q_DECL_NOTHROW Q_DECL_CONST_FUNCTION;
-
- static Script QT_FASTCALL script(uint ucs4) Q_DECL_NOTHROW Q_DECL_CONST_FUNCTION;
-
- static UnicodeVersion QT_FASTCALL unicodeVersion(uint ucs4) Q_DECL_NOTHROW Q_DECL_CONST_FUNCTION;
-
- static UnicodeVersion QT_FASTCALL currentUnicodeVersion() Q_DECL_NOTHROW Q_DECL_CONST_FUNCTION;
-
- static bool QT_FASTCALL isPrint(uint ucs4) Q_DECL_NOTHROW Q_DECL_CONST_FUNCTION;
- static Q_DECL_CONSTEXPR inline bool isSpace(uint ucs4) Q_DECL_NOTHROW Q_DECL_CONST_FUNCTION
- {
- // note that [0x09..0x0d] + 0x85 are exceptional Cc-s and must be handled explicitly
- return ucs4 == 0x20 || (ucs4 <= 0x0d && ucs4 >= 0x09)
- || (ucs4 > 127 && (ucs4 == 0x85 || ucs4 == 0xa0 || QChar::isSpace_helper(ucs4)));
- }
- static bool QT_FASTCALL isMark(uint ucs4) Q_DECL_NOTHROW Q_DECL_CONST_FUNCTION;
- static bool QT_FASTCALL isPunct(uint ucs4) Q_DECL_NOTHROW Q_DECL_CONST_FUNCTION;
- static bool QT_FASTCALL isSymbol(uint ucs4) Q_DECL_NOTHROW Q_DECL_CONST_FUNCTION;
- static Q_DECL_CONSTEXPR inline bool isLetter(uint ucs4) Q_DECL_NOTHROW Q_DECL_CONST_FUNCTION
- {
- return (ucs4 >= 'A' && ucs4 <= 'z' && (ucs4 >= 'a' || ucs4 <= 'Z'))
- || (ucs4 > 127 && QChar::isLetter_helper(ucs4));
- }
- static Q_DECL_CONSTEXPR inline bool isNumber(uint ucs4) Q_DECL_NOTHROW Q_DECL_CONST_FUNCTION
- { return (ucs4 <= '9' && ucs4 >= '0') || (ucs4 > 127 && QChar::isNumber_helper(ucs4)); }
- static Q_DECL_CONSTEXPR inline bool isLetterOrNumber(uint ucs4) Q_DECL_NOTHROW Q_DECL_CONST_FUNCTION
- {
- return (ucs4 >= 'A' && ucs4 <= 'z' && (ucs4 >= 'a' || ucs4 <= 'Z'))
- || (ucs4 >= '0' && ucs4 <= '9')
- || (ucs4 > 127 && QChar::isLetterOrNumber_helper(ucs4));
- }
- static Q_DECL_CONSTEXPR inline bool isDigit(uint ucs4) Q_DECL_NOTHROW Q_DECL_CONST_FUNCTION
- { return (ucs4 <= '9' && ucs4 >= '0') || (ucs4 > 127 && QChar::category(ucs4) == Number_DecimalDigit); }
- static Q_DECL_CONSTEXPR inline bool isLower(uint ucs4) Q_DECL_NOTHROW Q_DECL_CONST_FUNCTION
- { return (ucs4 <= 'z' && ucs4 >= 'a') || (ucs4 > 127 && QChar::category(ucs4) == Letter_Lowercase); }
- static Q_DECL_CONSTEXPR inline bool isUpper(uint ucs4) Q_DECL_NOTHROW Q_DECL_CONST_FUNCTION
- { return (ucs4 <= 'Z' && ucs4 >= 'A') || (ucs4 > 127 && QChar::category(ucs4) == Letter_Uppercase); }
- static Q_DECL_CONSTEXPR inline bool isTitleCase(uint ucs4) Q_DECL_NOTHROW Q_DECL_CONST_FUNCTION
- { return ucs4 > 127 && QChar::category(ucs4) == Letter_Titlecase; }
-
-private:
- static bool QT_FASTCALL isSpace_helper(uint ucs4) Q_DECL_NOTHROW Q_DECL_CONST_FUNCTION;
- static bool QT_FASTCALL isLetter_helper(uint ucs4) Q_DECL_NOTHROW Q_DECL_CONST_FUNCTION;
- static bool QT_FASTCALL isNumber_helper(uint ucs4) Q_DECL_NOTHROW Q_DECL_CONST_FUNCTION;
- static bool QT_FASTCALL isLetterOrNumber_helper(uint ucs4) Q_DECL_NOTHROW Q_DECL_CONST_FUNCTION;
-
-#ifdef QT_NO_CAST_FROM_ASCII
- QChar(char c) Q_DECL_NOTHROW;
- QChar(uchar c) Q_DECL_NOTHROW;
-#endif
-
- friend Q_DECL_CONSTEXPR bool operator==(QChar, QChar) Q_DECL_NOTHROW;
- friend Q_DECL_CONSTEXPR bool operator< (QChar, QChar) Q_DECL_NOTHROW;
- ushort ucs;
-};
-
-Q_DECLARE_TYPEINFO(QChar, Q_MOVABLE_TYPE);
-
-Q_DECL_CONSTEXPR inline bool operator==(QChar c1, QChar c2) Q_DECL_NOTHROW { return c1.ucs == c2.ucs; }
-Q_DECL_CONSTEXPR inline bool operator< (QChar c1, QChar c2) Q_DECL_NOTHROW { return c1.ucs < c2.ucs; }
-
-Q_DECL_CONSTEXPR inline bool operator!=(QChar c1, QChar c2) Q_DECL_NOTHROW { return !operator==(c1, c2); }
-Q_DECL_CONSTEXPR inline bool operator>=(QChar c1, QChar c2) Q_DECL_NOTHROW { return !operator< (c1, c2); }
-Q_DECL_CONSTEXPR inline bool operator> (QChar c1, QChar c2) Q_DECL_NOTHROW { return operator< (c2, c1); }
-Q_DECL_CONSTEXPR inline bool operator<=(QChar c1, QChar c2) Q_DECL_NOTHROW { return !operator< (c2, c1); }
-
-
-Q_DECL_CONSTEXPR inline bool operator==(QChar lhs, std::nullptr_t) Q_DECL_NOTHROW { return lhs.isNull(); }
-Q_DECL_CONSTEXPR inline bool operator< (QChar, std::nullptr_t) Q_DECL_NOTHROW { return false; }
-Q_DECL_CONSTEXPR inline bool operator==(std::nullptr_t, QChar rhs) Q_DECL_NOTHROW { return rhs.isNull(); }
-Q_DECL_CONSTEXPR inline bool operator< (std::nullptr_t, QChar rhs) Q_DECL_NOTHROW { return !rhs.isNull(); }
-
-Q_DECL_CONSTEXPR inline bool operator!=(QChar lhs, std::nullptr_t) Q_DECL_NOTHROW { return !operator==(lhs, nullptr); }
-Q_DECL_CONSTEXPR inline bool operator>=(QChar lhs, std::nullptr_t) Q_DECL_NOTHROW { return !operator< (lhs, nullptr); }
-Q_DECL_CONSTEXPR inline bool operator> (QChar lhs, std::nullptr_t) Q_DECL_NOTHROW { return operator< (nullptr, lhs); }
-Q_DECL_CONSTEXPR inline bool operator<=(QChar lhs, std::nullptr_t) Q_DECL_NOTHROW { return !operator< (nullptr, lhs); }
-
-Q_DECL_CONSTEXPR inline bool operator!=(std::nullptr_t, QChar rhs) Q_DECL_NOTHROW { return !operator==(nullptr, rhs); }
-Q_DECL_CONSTEXPR inline bool operator>=(std::nullptr_t, QChar rhs) Q_DECL_NOTHROW { return !operator< (nullptr, rhs); }
-Q_DECL_CONSTEXPR inline bool operator> (std::nullptr_t, QChar rhs) Q_DECL_NOTHROW { return operator< (rhs, nullptr); }
-Q_DECL_CONSTEXPR inline bool operator<=(std::nullptr_t, QChar rhs) Q_DECL_NOTHROW { return !operator< (rhs, nullptr); }
-
-#ifndef QT_NO_DATASTREAM
-Q_CORE_EXPORT QDataStream &operator<<(QDataStream &, QChar);
-Q_CORE_EXPORT QDataStream &operator>>(QDataStream &, QChar &);
-#endif
-
-QT_END_NAMESPACE
-
-#endif // QCHAR_H
diff --git a/src/corelib/tools/qcollator.cpp b/src/corelib/tools/qcollator.cpp
deleted file mode 100644
index 76dcf35833..0000000000
--- a/src/corelib/tools/qcollator.cpp
+++ /dev/null
@@ -1,408 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Copyright (C) 2013 Aleix Pol Gonzalez <aleixpol@kde.org>
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#include "qcollator_p.h"
-#include "qstringlist.h"
-#include "qstring.h"
-
-#include "qdebug.h"
-
-QT_BEGIN_NAMESPACE
-
-
-/*!
- \class QCollator
- \inmodule QtCore
- \brief The QCollator class compares strings according to a localized collation algorithm.
-
- \since 5.2
-
- \reentrant
- \ingroup i18n
- \ingroup string-processing
- \ingroup shared
-
- QCollator is initialized with a QLocale and an optional collation strategy. It tries to
- initialize the collator with the specified values. The collator can then be used to compare
- and sort strings in a locale dependent fashion.
-
- A QCollator object can be used together with template based sorting algorithms such as std::sort
- to sort a list of QStrings.
-
- In addition to the locale and collation strategy, several optional flags can be set that influence
- the result of the collation.
-*/
-
-/*!
- Constructs a QCollator from \a locale. If \a locale is not specified
- the system's default locale is used.
-
- \sa setLocale()
- */
-QCollator::QCollator(const QLocale &locale)
- : d(new QCollatorPrivate(locale))
-{
-}
-
-/*!
- Creates a copy of \a other.
- */
-QCollator::QCollator(const QCollator &other)
- : d(other.d)
-{
- if (d) {
- // Ensure clean, lest both copies try to init() at the same time:
- if (d->dirty)
- d->init();
- d->ref.ref();
- }
-}
-
-/*!
- Destroys the collator.
- */
-QCollator::~QCollator()
-{
- if (d && !d->ref.deref())
- delete d;
-}
-
-/*!
- Assigns \a other to this collator.
- */
-QCollator &QCollator::operator=(const QCollator &other)
-{
- if (this != &other) {
- if (d && !d->ref.deref())
- delete d;
- d = other.d;
- if (d) {
- // Ensure clean, lest both copies try to init() at the same time:
- if (d->dirty)
- d->init();
- d->ref.ref();
- }
- }
- return *this;
-}
-
-/*!
- \fn QCollator::QCollator(QCollator &&other)
-
- Move constructor. Moves from \a other into this collator.
-
- Note that a moved-from QCollator can only be destroyed or assigned
- to. The effect of calling other functions than the destructor or
- one of the assignment operators is undefined.
-*/
-
-/*!
- \fn QCollator & QCollator::operator=(QCollator && other)
-
- Move-assigns from \a other to this collator.
-
- Note that a moved-from QCollator can only be destroyed or assigned
- to. The effect of calling other functions than the destructor or
- one of the assignment operators is undefined.
-*/
-
-/*!
- \fn void QCollator::swap(QCollator &other)
-
- Swaps this collator with \a other. This function is very fast and
- never fails.
-*/
-
-/*!
- \internal
- */
-void QCollator::detach()
-{
- if (d->ref.load() != 1) {
- QCollatorPrivate *x = new QCollatorPrivate(d->locale);
- if (!d->ref.deref())
- delete d;
- d = x;
- }
- // All callers need this, because about to modify the object:
- d->dirty = true;
-}
-
-/*!
- Sets the locale of the collator to \a locale.
- */
-void QCollator::setLocale(const QLocale &locale)
-{
- if (locale == d->locale)
- return;
-
- detach();
- d->locale = locale;
-}
-
-/*!
- Returns the locale of the collator.
- */
-QLocale QCollator::locale() const
-{
- return d->locale;
-}
-
-/*!
- \fn void QCollator::setCaseSensitivity(Qt::CaseSensitivity sensitivity)
-
- Sets the case \a sensitivity of the collator.
-
- \sa caseSensitivity()
- */
-void QCollator::setCaseSensitivity(Qt::CaseSensitivity cs)
-{
- if (d->caseSensitivity == cs)
- return;
-
- detach();
- d->caseSensitivity = cs;
-}
-
-/*!
- \fn Qt::CaseSensitivity QCollator::caseSensitivity() const
-
- Returns case sensitivity of the collator.
-
- \sa setCaseSensitivity()
- */
-Qt::CaseSensitivity QCollator::caseSensitivity() const
-{
- return d->caseSensitivity;
-}
-
-/*!
- \fn void QCollator::setNumericMode(bool on)
-
- Enables numeric sorting mode when \a on is set to true.
-
- This will enable proper sorting of numeric digits, so that e.g. 100 sorts after 99.
-
- By default this mode is off.
-
- \sa numericMode()
- */
-void QCollator::setNumericMode(bool on)
-{
- if (d->numericMode == on)
- return;
-
- detach();
- d->numericMode = on;
-}
-
-/*!
- \fn bool QCollator::numericMode() const
-
- Returns \c true if numeric sorting is enabled, false otherwise.
-
- \sa setNumericMode()
- */
-bool QCollator::numericMode() const
-{
- return d->numericMode;
-}
-
-/*!
- \fn void QCollator::setIgnorePunctuation(bool on)
-
- If \a on is set to true, punctuation characters and symbols are ignored when determining sort order.
-
- The default is locale dependent.
-
- \note This method is not currently supported if Qt is configured to not use ICU on Linux.
-
- \sa ignorePunctuation()
- */
-void QCollator::setIgnorePunctuation(bool on)
-{
- if (d->ignorePunctuation == on)
- return;
-
- detach();
- d->ignorePunctuation = on;
-}
-
-/*!
- \fn bool QCollator::ignorePunctuation() const
-
- Returns \c true if punctuation characters and symbols are ignored when determining sort order.
-
- \sa setIgnorePunctuation()
- */
-bool QCollator::ignorePunctuation() const
-{
- return d->ignorePunctuation;
-}
-
-/*!
- \fn int QCollator::compare(const QString &s1, const QString &s2) const
-
- Compares \a s1 with \a s2. Returns an integer less than, equal to, or greater than zero
- depending on whether \a s1 is smaller, equal or larger than \a s2.
- */
-
-/*!
- \fn bool QCollator::operator()(const QString &s1, const QString &s2) const
- \internal
-*/
-
-/*!
- \fn int QCollator::compare(const QStringRef &s1, const QStringRef &s2) const
- \overload
-
- Compares \a s1 with \a s2. Returns an integer less than, equal to, or greater than zero
- depending on whether \a s1 is smaller, equal or larger than \a s2.
- */
-
-/*!
- \fn int QCollator::compare(const QChar *s1, int len1, const QChar *s2, int len2) const
- \overload
-
- Compares \a s1 with \a s2. \a len1 and \a len2 specify the length of the
- QChar arrays pointer to by \a s1 and \a s2.
-
- Returns an integer less than, equal to, or greater than zero
- depending on whether \a s1 is smaller, equal or larger than \a s2.
-*/
-
-/*!
- \fn QCollatorSortKey QCollator::sortKey(const QString &string) const
-
- Returns a sortKey for \a string.
-
- Creating the sort key is usually somewhat slower, than using the compare()
- methods directly. But if the string is compared repeatedly (e.g. when sorting
- a whole list of strings), it's usually faster to create the sort keys for each
- string and then sort using the keys.
-
- \note Not supported with the C (a.k.a. POSIX) locale on Darwin.
- */
-
-/*!
- \class QCollatorSortKey
- \inmodule QtCore
- \brief The QCollatorSortKey class can be used to speed up string collation.
-
- \since 5.2
-
- The QCollatorSortKey class is always created by QCollator::sortKey()
- and is used for fast strings collation, for example when collating many strings.
-
- \reentrant
- \ingroup i18n
- \ingroup string-processing
- \ingroup shared
-
- \sa QCollator, QCollator::sortKey()
-*/
-
-/*!
- \internal
- */
-QCollatorSortKey::QCollatorSortKey(QCollatorSortKeyPrivate *d)
- : d(d)
-{
-}
-
-/*!
- Constructs a copy of the \a other collator key.
-*/
-QCollatorSortKey::QCollatorSortKey(const QCollatorSortKey &other)
- : d(other.d)
-{
-}
-
-/*!
- Destroys the collator key.
- */
-QCollatorSortKey::~QCollatorSortKey()
-{
-}
-
-/*!
- Assigns \a other to this collator key.
- */
-QCollatorSortKey& QCollatorSortKey::operator=(const QCollatorSortKey &other)
-{
- if (this != &other) {
- d = other.d;
- }
- return *this;
-}
-
-/*!
- \fn QCollatorSortKey &QCollatorSortKey::operator=(QCollatorSortKey && other)
-
- Move-assigns \a other to this collator key.
-*/
-
-/*!
- \fn bool operator<(const QCollatorSortKey &lhs, const QCollatorSortKey &rhs)
- \relates QCollatorSortKey
-
- According to the QCollator that created the keys, returns \c true if \a lhs
- should be sorted before \a rhs; otherwise returns \c false.
-
- \sa QCollatorSortKey::compare()
- */
-
-/*!
- \fn void QCollatorSortKey::swap(QCollatorSortKey & other)
-
- Swaps this collator key with \a other.
-*/
-
-/*!
- \fn int QCollatorSortKey::compare(const QCollatorSortKey &otherKey) const
-
- Compares the key to \a otherKey. Returns a negative value if the key
- is less than \a otherKey, 0 if the key is equal to \a otherKey or a
- positive value if the key is greater than \a otherKey.
-
- \sa operator<()
- */
-
-QT_END_NAMESPACE
diff --git a/src/corelib/tools/qcollator.h b/src/corelib/tools/qcollator.h
deleted file mode 100644
index 6fa199cb0f..0000000000
--- a/src/corelib/tools/qcollator.h
+++ /dev/null
@@ -1,132 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Copyright (C) 2013 Aleix Pol Gonzalez <aleixpol@kde.org>
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#ifndef QCOLLATOR_H
-#define QCOLLATOR_H
-
-#include <QtCore/qstring.h>
-#include <QtCore/qstringlist.h>
-#include <QtCore/qlocale.h>
-
-QT_BEGIN_NAMESPACE
-
-class QCollatorPrivate;
-class QCollatorSortKeyPrivate;
-
-class Q_CORE_EXPORT QCollatorSortKey
-{
- friend class QCollator;
-public:
- QCollatorSortKey(const QCollatorSortKey &other);
- ~QCollatorSortKey();
- QCollatorSortKey &operator=(const QCollatorSortKey &other);
-#ifdef Q_COMPILER_RVALUE_REFS
- inline QCollatorSortKey &operator=(QCollatorSortKey &&other) Q_DECL_NOTHROW
- { swap(other); return *this; }
-#endif
- void swap(QCollatorSortKey &other) Q_DECL_NOTHROW
- { d.swap(other.d); }
-
- int compare(const QCollatorSortKey &key) const;
-
-protected:
- QCollatorSortKey(QCollatorSortKeyPrivate*);
-
- QExplicitlySharedDataPointer<QCollatorSortKeyPrivate> d;
-
-private:
- QCollatorSortKey();
-};
-
-inline bool operator<(const QCollatorSortKey &lhs, const QCollatorSortKey &rhs)
-{
- return lhs.compare(rhs) < 0;
-}
-
-class Q_CORE_EXPORT QCollator
-{
-public:
- explicit QCollator(const QLocale &locale = QLocale());
- QCollator(const QCollator &);
- ~QCollator();
- QCollator &operator=(const QCollator &);
-#ifdef Q_COMPILER_RVALUE_REFS
- QCollator(QCollator &&other) Q_DECL_NOTHROW
- : d(other.d) { other.d = nullptr; }
- QCollator &operator=(QCollator &&other) Q_DECL_NOTHROW
- { swap(other); return *this; }
-#endif
-
- void swap(QCollator &other) Q_DECL_NOTHROW
- { qSwap(d, other.d); }
-
- void setLocale(const QLocale &locale);
- QLocale locale() const;
-
- Qt::CaseSensitivity caseSensitivity() const;
- void setCaseSensitivity(Qt::CaseSensitivity cs);
-
- void setNumericMode(bool on);
- bool numericMode() const;
-
- void setIgnorePunctuation(bool on);
- bool ignorePunctuation() const;
-
- int compare(const QString &s1, const QString &s2) const;
- int compare(const QStringRef &s1, const QStringRef &s2) const;
- int compare(const QChar *s1, int len1, const QChar *s2, int len2) const;
-
- bool operator()(const QString &s1, const QString &s2) const
- { return compare(s1, s2) < 0; }
-
- QCollatorSortKey sortKey(const QString &string) const;
-
-private:
- QCollatorPrivate *d;
-
- void detach();
-};
-
-Q_DECLARE_SHARED(QCollatorSortKey)
-Q_DECLARE_SHARED(QCollator)
-
-QT_END_NAMESPACE
-
-#endif // QCOLLATOR_P_H
diff --git a/src/corelib/tools/qcollator_icu.cpp b/src/corelib/tools/qcollator_icu.cpp
deleted file mode 100644
index ab45b9a1a1..0000000000
--- a/src/corelib/tools/qcollator_icu.cpp
+++ /dev/null
@@ -1,169 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Copyright (C) 2013 Aleix Pol Gonzalez <aleixpol@kde.org>
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#include "qcollator_p.h"
-#include "qlocale_p.h"
-#include "qstringlist.h"
-#include "qstring.h"
-
-#include <unicode/utypes.h>
-#include <unicode/ucol.h>
-#include <unicode/ustring.h>
-#include <unicode/ures.h>
-
-#include "qdebug.h"
-
-QT_BEGIN_NAMESPACE
-
-void QCollatorPrivate::init()
-{
- cleanup();
- if (isC())
- return;
-
- UErrorCode status = U_ZERO_ERROR;
- QByteArray name = QLocalePrivate::get(locale)->bcp47Name('_');
- collator = ucol_open(name.constData(), &status);
- if (U_FAILURE(status)) {
- qWarning("Could not create collator: %d", status);
- collator = nullptr;
- dirty = false;
- return;
- }
-
- // enable normalization by default
- ucol_setAttribute(collator, UCOL_NORMALIZATION_MODE, UCOL_ON, &status);
-
- // The strength attribute in ICU is rather badly documented. Basically UCOL_PRIMARY
- // ignores differences between base characters and accented characters as well as case.
- // So A and A-umlaut would compare equal.
- // UCOL_SECONDARY ignores case differences. UCOL_TERTIARY is the default in most languages
- // and does case sensitive comparison.
- // UCOL_QUATERNARY is used as default in a few languages such as Japanese to take care of some
- // additional differences in those languages.
- UColAttributeValue val = (caseSensitivity == Qt::CaseSensitive) ? UCOL_DEFAULT_STRENGTH : UCOL_SECONDARY;
-
- status = U_ZERO_ERROR;
- ucol_setAttribute(collator, UCOL_STRENGTH, val, &status);
- if (U_FAILURE(status))
- qWarning("ucol_setAttribute: Case First failed: %d", status);
-
- status = U_ZERO_ERROR;
- ucol_setAttribute(collator, UCOL_NUMERIC_COLLATION, numericMode ? UCOL_ON : UCOL_OFF, &status);
- if (U_FAILURE(status))
- qWarning("ucol_setAttribute: numeric collation failed: %d", status);
-
- status = U_ZERO_ERROR;
- ucol_setAttribute(collator, UCOL_ALTERNATE_HANDLING, ignorePunctuation ? UCOL_SHIFTED : UCOL_NON_IGNORABLE, &status);
- if (U_FAILURE(status))
- qWarning("ucol_setAttribute: Alternate handling failed: %d", status);
-
- dirty = false;
-}
-
-void QCollatorPrivate::cleanup()
-{
- if (collator)
- ucol_close(collator);
- collator = nullptr;
-}
-
-int QCollator::compare(const QChar *s1, int len1, const QChar *s2, int len2) const
-{
- if (d->dirty)
- d->init();
-
- if (d->collator)
- return ucol_strcoll(d->collator, (const UChar *)s1, len1, (const UChar *)s2, len2);
-
- return QString::compare_helper(s1, len1, s2, len2, d->caseSensitivity);
-}
-
-int QCollator::compare(const QString &s1, const QString &s2) const
-{
- if (d->dirty)
- d->init();
-
- if (d->collator)
- return compare(s1.constData(), s1.size(), s2.constData(), s2.size());
-
- return QString::compare(s1, s2, d->caseSensitivity);
-}
-
-int QCollator::compare(const QStringRef &s1, const QStringRef &s2) const
-{
- if (d->dirty)
- d->init();
-
- if (d->collator)
- return compare(s1.constData(), s1.size(), s2.constData(), s2.size());
-
- return QStringRef::compare(s1, s2, d->caseSensitivity);
-}
-
-QCollatorSortKey QCollator::sortKey(const QString &string) const
-{
- if (d->dirty)
- d->init();
- if (d->isC())
- return QCollatorSortKey(new QCollatorSortKeyPrivate(string.toUtf8()));
-
- if (d->collator) {
- QByteArray result(16 + string.size() + (string.size() >> 2), Qt::Uninitialized);
- int size = ucol_getSortKey(d->collator, (const UChar *)string.constData(),
- string.size(), (uint8_t *)result.data(), result.size());
- if (size > result.size()) {
- result.resize(size);
- size = ucol_getSortKey(d->collator, (const UChar *)string.constData(),
- string.size(), (uint8_t *)result.data(), result.size());
- }
- result.truncate(size);
- return QCollatorSortKey(new QCollatorSortKeyPrivate(std::move(result)));
- }
-
- return QCollatorSortKey(new QCollatorSortKeyPrivate(QByteArray()));
-}
-
-int QCollatorSortKey::compare(const QCollatorSortKey &otherKey) const
-{
- return qstrcmp(d->m_key, otherKey.d->m_key);
-}
-
-QT_END_NAMESPACE
diff --git a/src/corelib/tools/qcollator_macx.cpp b/src/corelib/tools/qcollator_macx.cpp
deleted file mode 100644
index 42e67e0c12..0000000000
--- a/src/corelib/tools/qcollator_macx.cpp
+++ /dev/null
@@ -1,166 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2013 Aleix Pol Gonzalez <aleixpol@kde.org>
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#include "qcollator_p.h"
-#include "qlocale_p.h"
-#include "qstringlist.h"
-#include "qstring.h"
-
-#include <QtCore/private/qcore_mac_p.h>
-
-#include <CoreFoundation/CoreFoundation.h>
-#include <CoreFoundation/CFLocale.h>
-
-#include <cstring>
-#include <QDebug>
-
-QT_BEGIN_NAMESPACE
-
-void QCollatorPrivate::init()
-{
- cleanup();
- /*
- LocaleRefFromLocaleString() will accept "POSIX" as the locale name, but
- the locale it produces (named "pos") doesn't implement the [A-Z] < [a-z]
- behavior we expect of the C locale. We can use QStringView to get round
- that for collation, but this leaves no way to do a sort key.
- */
- if (isC())
- return;
-
- LocaleRef localeRef;
- int rc = LocaleRefFromLocaleString(QLocalePrivate::get(locale)->bcp47Name().constData(), &localeRef);
- if (rc != 0)
- qWarning("couldn't initialize the locale");
-
- UInt32 options = 0;
-
- if (caseSensitivity == Qt::CaseInsensitive)
- options |= kUCCollateCaseInsensitiveMask;
- if (numericMode)
- options |= kUCCollateDigitsAsNumberMask | kUCCollateDigitsOverrideMask;
- if (!ignorePunctuation)
- options |= kUCCollatePunctuationSignificantMask;
-
- OSStatus status = UCCreateCollator(
- localeRef,
- 0,
- options,
- &collator
- );
- if (status != 0)
- qWarning("Couldn't initialize the collator");
-
- dirty = false;
-}
-
-void QCollatorPrivate::cleanup()
-{
- if (collator)
- UCDisposeCollator(&collator);
- collator = 0;
-}
-
-int QCollator::compare(const QChar *s1, int len1, const QChar *s2, int len2) const
-{
- if (d->dirty)
- d->init();
- if (!d->collator)
- return QStringView(s1, len1).compare(QStringView(s2, len2), caseSensitivity());
-
- SInt32 result;
- Boolean equivalent;
- UCCompareText(d->collator,
- reinterpret_cast<const UniChar *>(s1), len1,
- reinterpret_cast<const UniChar *>(s2), len2,
- &equivalent,
- &result);
- if (equivalent)
- return 0;
- return result < 0 ? -1 : 1;
-}
-
-int QCollator::compare(const QString &str1, const QString &str2) const
-{
- return compare(str1.constData(), str1.size(), str2.constData(), str2.size());
-}
-
-int QCollator::compare(const QStringRef &s1, const QStringRef &s2) const
-{
- return compare(s1.constData(), s1.size(), s2.constData(), s2.size());
-}
-
-QCollatorSortKey QCollator::sortKey(const QString &string) const
-{
- if (d->dirty)
- d->init();
- if (!d->collator) {
- // What should (or even *can*) we do here ? (See init()'s comment.)
- qWarning("QCollator doesn't support sort keys for the C locale on Darwin");
- return QCollatorSortKey(nullptr);
- }
-
- //Documentation recommends having it 5 times as big as the input
- QVector<UCCollationValue> ret(string.size() * 5);
- ItemCount actualSize;
- int status = UCGetCollationKey(d->collator, reinterpret_cast<const UniChar *>(string.constData()), string.count(),
- ret.size(), &actualSize, ret.data());
-
- ret.resize(actualSize+1);
- if (status == kUCOutputBufferTooSmall) {
- UCGetCollationKey(d->collator, reinterpret_cast<const UniChar *>(string.constData()), string.count(),
- ret.size(), &actualSize, ret.data());
- }
- ret[actualSize] = 0;
- return QCollatorSortKey(new QCollatorSortKeyPrivate(std::move(ret)));
-}
-
-int QCollatorSortKey::compare(const QCollatorSortKey &key) const
-{
- if (!d.data())
- return 0;
-
- SInt32 order;
- UCCompareCollationKeys(d->m_key.data(), d->m_key.size(),
- key.d->m_key.data(), key.d->m_key.size(),
- 0, &order);
- return order;
-}
-
-QT_END_NAMESPACE
diff --git a/src/corelib/tools/qcollator_p.h b/src/corelib/tools/qcollator_p.h
deleted file mode 100644
index fc2d434a8d..0000000000
--- a/src/corelib/tools/qcollator_p.h
+++ /dev/null
@@ -1,148 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Copyright (C) 2013 Aleix Pol Gonzalez <aleixpol@kde.org>
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#ifndef QCOLLATOR_P_H
-#define QCOLLATOR_P_H
-
-//
-// W A R N I N G
-// -------------
-//
-// This file is not part of the Qt API. It exists purely as an
-// implementation detail. This header file may change from version to
-// version without notice, or even be removed.
-//
-// We mean it.
-//
-
-#include <QtCore/private/qglobal_p.h>
-#include "qcollator.h"
-#include <QVector>
-#if QT_CONFIG(icu)
-#include <unicode/ucol.h>
-#elif defined(Q_OS_OSX)
-#include <CoreServices/CoreServices.h>
-#elif defined(Q_OS_WIN)
-#include <qt_windows.h>
-#endif
-
-QT_BEGIN_NAMESPACE
-
-#if QT_CONFIG(icu)
-typedef UCollator *CollatorType;
-typedef QByteArray CollatorKeyType;
-const CollatorType NoCollator = nullptr;
-
-#elif defined(Q_OS_OSX)
-typedef CollatorRef CollatorType;
-typedef QVector<UCCollationValue> CollatorKeyType;
-const CollatorType NoCollator = 0;
-
-#elif defined(Q_OS_WIN)
-typedef QString CollatorKeyType;
-typedef int CollatorType;
-const CollatorType NoCollator = 0;
-# ifdef Q_OS_WINRT
-# define USE_COMPARESTRINGEX
-# endif
-
-#else // posix - ignores CollatorType collator, only handles system locale
-typedef QVector<wchar_t> CollatorKeyType;
-typedef bool CollatorType;
-const CollatorType NoCollator = false;
-#endif
-
-class QCollatorPrivate
-{
-public:
- QAtomicInt ref = 1;
- QLocale locale;
-#if defined(Q_OS_WIN) && !QT_CONFIG(icu)
-#ifdef USE_COMPARESTRINGEX
- QString localeName;
-#else
- LCID localeID;
-#endif
-#endif
- Qt::CaseSensitivity caseSensitivity = Qt::CaseSensitive;
- bool numericMode = false;
- bool ignorePunctuation = false;
- bool dirty = true;
-
- CollatorType collator = NoCollator;
-
- QCollatorPrivate(const QLocale &locale) : locale(locale) {}
- ~QCollatorPrivate() { cleanup(); }
- bool isC() { return locale.language() == QLocale::C; }
-
- void clear() {
- cleanup();
- collator = NoCollator;
- }
-
- // Implemented by each back-end, in its own way:
- void init();
- void cleanup();
-
-private:
- Q_DISABLE_COPY_MOVE(QCollatorPrivate)
-};
-
-class QCollatorSortKeyPrivate : public QSharedData
-{
- friend class QCollator;
-public:
- template <typename...T>
- explicit QCollatorSortKeyPrivate(T &&...args)
- : QSharedData()
- , m_key(std::forward<T>(args)...)
- {
- }
-
- CollatorKeyType m_key;
-
-private:
- Q_DISABLE_COPY_MOVE(QCollatorSortKeyPrivate)
-};
-
-
-QT_END_NAMESPACE
-
-#endif // QCOLLATOR_P_H
diff --git a/src/corelib/tools/qcollator_posix.cpp b/src/corelib/tools/qcollator_posix.cpp
deleted file mode 100644
index 81f97a02e1..0000000000
--- a/src/corelib/tools/qcollator_posix.cpp
+++ /dev/null
@@ -1,126 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2013 Aleix Pol Gonzalez <aleixpol@kde.org>
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#include "qcollator_p.h"
-#include "qstringlist.h"
-#include "qstring.h"
-
-#include <cstring>
-#include <cwchar>
-
-QT_BEGIN_NAMESPACE
-
-void QCollatorPrivate::init()
-{
- if (!isC()) {
- if (locale != QLocale())
- qWarning("Only C and default locale supported with the posix collation implementation");
- if (caseSensitivity != Qt::CaseSensitive)
- qWarning("Case insensitive sorting unsupported in the posix collation implementation");
- }
- if (numericMode)
- qWarning("Numeric mode unsupported in the posix collation implementation");
- if (ignorePunctuation)
- qWarning("Ignoring punctuation unsupported in the posix collation implementation");
- dirty = false;
-}
-
-void QCollatorPrivate::cleanup()
-{
-}
-
-static void stringToWCharArray(QVarLengthArray<wchar_t> &ret, const QString &string)
-{
- ret.resize(string.length());
- int len = string.toWCharArray(ret.data());
- ret.resize(len+1);
- ret[len] = 0;
-}
-
-int QCollator::compare(const QChar *s1, int len1, const QChar *s2, int len2) const
-{
- return compare(QString::fromRawData(s1, len1), QString::fromRawData(s2, len2));
-}
-
-int QCollator::compare(const QString &s1, const QString &s2) const
-{
- if (d->isC())
- return s1.compare(s2, caseSensitivity());
- if (d->dirty)
- d->init();
-
- QVarLengthArray<wchar_t> array1, array2;
- stringToWCharArray(array1, s1);
- stringToWCharArray(array2, s2);
- return std::wcscoll(array1.constData(), array2.constData());
-}
-
-int QCollator::compare(const QStringRef &s1, const QStringRef &s2) const
-{
- return compare(s1.toString(), s2.toString());
-}
-
-QCollatorSortKey QCollator::sortKey(const QString &string) const
-{
- if (d->dirty)
- d->init();
-
- QVarLengthArray<wchar_t> original;
- stringToWCharArray(original, string);
- QVector<wchar_t> result(original.size());
- if (d->isC()) {
- std::copy(original.cbegin(), original.cend(), result.begin());
- } else {
- size_t size = std::wcsxfrm(result.data(), original.constData(), string.size());
- if (size > uint(result.size())) {
- result.resize(size+1);
- size = std::wcsxfrm(result.data(), original.constData(), string.size());
- }
- result.resize(size+1);
- result[size] = 0;
- }
- return QCollatorSortKey(new QCollatorSortKeyPrivate(std::move(result)));
-}
-
-int QCollatorSortKey::compare(const QCollatorSortKey &otherKey) const
-{
- return std::wcscmp(d->m_key.constData(), otherKey.d->m_key.constData());
-}
-
-QT_END_NAMESPACE
diff --git a/src/corelib/tools/qcollator_win.cpp b/src/corelib/tools/qcollator_win.cpp
deleted file mode 100644
index 10cfdaa264..0000000000
--- a/src/corelib/tools/qcollator_win.cpp
+++ /dev/null
@@ -1,183 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2013 Aleix Pol Gonzalez <aleixpol@kde.org>
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#include "qcollator_p.h"
-#include "qlocale_p.h"
-#include "qstringlist.h"
-#include "qstring.h"
-
-#include <QDebug>
-
-#include <qt_windows.h>
-#include <qsysinfo.h>
-
-QT_BEGIN_NAMESPACE
-
-//NOTE: SORT_DIGITSASNUMBERS is available since win7
-#ifndef SORT_DIGITSASNUMBERS
-#define SORT_DIGITSASNUMBERS 8
-#endif
-
-// implemented in qlocale_win.cpp
-extern LCID qt_inIsoNametoLCID(const char *name);
-
-void QCollatorPrivate::init()
-{
- collator = 0;
- if (isC())
- return;
-
-#ifndef USE_COMPARESTRINGEX
- localeID = qt_inIsoNametoLCID(QLocalePrivate::get(locale)->bcp47Name().constData());
-#else
- localeName = locale.bcp47Name();
-#endif
-
- if (caseSensitivity == Qt::CaseInsensitive)
- collator |= NORM_IGNORECASE;
-
- // WINE does not support SORT_DIGITSASNUMBERS :-(
- // (and its std::sort() crashes on bad comparisons, QTBUG-74209)
- if (numericMode)
- collator |= SORT_DIGITSASNUMBERS;
-
- if (ignorePunctuation)
- collator |= NORM_IGNORESYMBOLS;
-
- dirty = false;
-}
-
-void QCollatorPrivate::cleanup()
-{
-}
-
-
-int QCollator::compare(const QChar *s1, int len1, const QChar *s2, int len2) const
-{
- if (d->isC())
- return QString::compare_helper(s1, len1, s2, len2, d->caseSensitivity);
-
- if (d->dirty)
- d->init();
-
- //* from Windows documentation *
- // Returns one of the following values if successful. To maintain the C runtime convention of
- // comparing strings, the value 2 can be subtracted from a nonzero return value. Then, the
- // meaning of <0, ==0, and >0 is consistent with the C runtime.
- // [...] The function returns 0 if it does not succeed.
- // https://docs.microsoft.com/en-us/windows/desktop/api/stringapiset/nf-stringapiset-comparestringex#return-value
-
-#ifndef USE_COMPARESTRINGEX
- const int ret = CompareString(d->localeID, d->collator,
- reinterpret_cast<const wchar_t*>(s1), len1,
- reinterpret_cast<const wchar_t*>(s2), len2);
-#else
- const int ret = CompareStringEx(LPCWSTR(d->localeName.utf16()), d->collator,
- reinterpret_cast<LPCWSTR>(s1), len1,
- reinterpret_cast<LPCWSTR>(s2), len2,
- nullptr, nullptr, 0);
-#endif
- if (Q_LIKELY(ret))
- return ret - 2;
-
- switch (DWORD error = GetLastError()) {
- case ERROR_INVALID_FLAGS:
- qWarning("Unsupported flags (%d) used in QCollator", int(d->collator));
- break;
- case ERROR_INVALID_PARAMETER:
- qWarning("Invalid parameter for QCollator::compare()");
- break;
- default:
- qWarning("Failed (%ld) comparison in QCollator::compare()", long(error));
- break;
- }
- // We have no idea what to return, so pretend we think they're equal.
- // At least that way we'll be consistent if we get the same values swapped ...
- return 0;
-}
-
-int QCollator::compare(const QString &str1, const QString &str2) const
-{
- return compare(str1.constData(), str1.size(), str2.constData(), str2.size());
-}
-
-int QCollator::compare(const QStringRef &s1, const QStringRef &s2) const
-{
- return compare(s1.constData(), s1.size(), s2.constData(), s2.size());
-}
-
-QCollatorSortKey QCollator::sortKey(const QString &string) const
-{
- if (d->dirty)
- d->init();
- if (d->isC())
- return QCollatorSortKey(new QCollatorSortKeyPrivate(string));
-
-#ifndef USE_COMPARESTRINGEX
- int size = LCMapStringW(d->localeID, LCMAP_SORTKEY | d->collator,
- reinterpret_cast<const wchar_t*>(string.constData()), string.size(),
- 0, 0);
-#else
- int size = LCMapStringEx(LPCWSTR(d->localeName.utf16()), LCMAP_SORTKEY | d->collator,
- reinterpret_cast<LPCWSTR>(string.constData()), string.size(),
- 0, 0, NULL, NULL, 0);
-#endif
- QString ret(size, Qt::Uninitialized);
-#ifndef USE_COMPARESTRINGEX
- int finalSize = LCMapStringW(d->localeID, LCMAP_SORTKEY | d->collator,
- reinterpret_cast<const wchar_t*>(string.constData()), string.size(),
- reinterpret_cast<wchar_t*>(ret.data()), ret.size());
-#else
- int finalSize = LCMapStringEx(LPCWSTR(d->localeName.utf16()), LCMAP_SORTKEY | d->collator,
- reinterpret_cast<LPCWSTR>(string.constData()), string.size(),
- reinterpret_cast<LPWSTR>(ret.data()), ret.size(),
- NULL, NULL, 0);
-#endif
- if (finalSize == 0) {
- qWarning() << "there were problems when generating the ::sortKey by LCMapStringW with error:" << GetLastError();
- }
- return QCollatorSortKey(new QCollatorSortKeyPrivate(std::move(ret)));
-}
-
-int QCollatorSortKey::compare(const QCollatorSortKey &otherKey) const
-{
- return d->m_key.compare(otherKey.d->m_key);
-}
-
-QT_END_NAMESPACE
diff --git a/src/corelib/tools/qcommandlineoption.cpp b/src/corelib/tools/qcommandlineoption.cpp
index c2b86014ba..aff684fad2 100644
--- a/src/corelib/tools/qcommandlineoption.cpp
+++ b/src/corelib/tools/qcommandlineoption.cpp
@@ -254,7 +254,7 @@ namespace {
typedef QString argument_type;
Q_NEVER_INLINE
- result_type operator()(const QString &name) const Q_DECL_NOEXCEPT
+ result_type operator()(const QString &name) const noexcept
{
if (Q_UNLIKELY(name.isEmpty()))
return warn("be empty");
@@ -271,7 +271,7 @@ namespace {
}
Q_NEVER_INLINE
- static bool warn(const char *what) Q_DECL_NOEXCEPT
+ static bool warn(const char *what) noexcept
{
qWarning("QCommandLineOption: Option names cannot %s", what);
return true;
diff --git a/src/corelib/tools/qcommandlineoption.h b/src/corelib/tools/qcommandlineoption.h
index 276be042de..e2ca64acef 100644
--- a/src/corelib/tools/qcommandlineoption.h
+++ b/src/corelib/tools/qcommandlineoption.h
@@ -71,11 +71,9 @@ public:
~QCommandLineOption();
QCommandLineOption &operator=(const QCommandLineOption &other);
-#ifdef Q_COMPILER_RVALUE_REFS
- QCommandLineOption &operator=(QCommandLineOption &&other) Q_DECL_NOTHROW { swap(other); return *this; }
-#endif
+ QCommandLineOption &operator=(QCommandLineOption &&other) noexcept { swap(other); return *this; }
- void swap(QCommandLineOption &other) Q_DECL_NOTHROW
+ void swap(QCommandLineOption &other) noexcept
{ qSwap(d, other.d); }
QStringList names() const;
diff --git a/src/corelib/tools/qcommandlineparser.cpp b/src/corelib/tools/qcommandlineparser.cpp
index 6817d73143..48501f5271 100644
--- a/src/corelib/tools/qcommandlineparser.cpp
+++ b/src/corelib/tools/qcommandlineparser.cpp
@@ -41,6 +41,7 @@
#include "qcommandlineparser.h"
#include <qcoreapplication.h>
+#include <private/qcoreapplication_p.h>
#include <qhash.h>
#include <qvector.h>
#include <qdebug.h>
@@ -70,11 +71,12 @@ public:
bool parse(const QStringList &args);
void checkParsed(const char *method);
QStringList aliases(const QString &name) const;
- QString helpText() const;
+ QString helpText(bool includeQtOptions) const;
bool registerFoundOption(const QString &optionName);
bool parseOptionValue(const QString &optionName, const QString &argument,
QStringList::const_iterator *argumentIterator,
QStringList::const_iterator argsEnd);
+ Q_NORETURN void showHelp(int exitCode, bool includeQtOptions);
//! Error text set when parse() returns false
QString errorText;
@@ -130,7 +132,7 @@ QStringList QCommandLineParserPrivate::aliases(const QString &optionName) const
{
const NameHash_t::const_iterator it = nameHash.constFind(optionName);
if (it == nameHash.cend()) {
- qWarning("QCommandLineParser: option not defined: \"%s\"", qPrintable(optionName));
+ qWarning("QCommandLineParser: option not defined: \"%ls\"", qUtf16Printable(optionName));
return QStringList();
}
return commandLineOptionList.at(*it).names();
@@ -362,8 +364,10 @@ bool QCommandLineParser::addOption(const QCommandLineOption &option)
if (!optionNames.isEmpty()) {
for (const QString &name : optionNames) {
- if (d->nameHash.contains(name))
+ if (d->nameHash.contains(name)) {
+ qWarning() << "QCommandLineParser: already having an option named" << name;
return false;
+ }
}
d->commandLineOptionList.append(option);
@@ -417,7 +421,9 @@ QCommandLineOption QCommandLineParser::addVersionOption()
/*!
Adds the help option (\c{-h}, \c{--help} and \c{-?} on Windows)
- This option is handled automatically by QCommandLineParser.
+ as well as an option \c{--help-all} to include Qt-specific options in the output.
+
+ These options are handled automatically by QCommandLineParser.
Remember to use setApplicationDescription to set the application description,
which will be displayed when this option is used.
@@ -434,8 +440,10 @@ QCommandLineOption QCommandLineParser::addHelpOption()
<< QStringLiteral("?")
#endif
<< QStringLiteral("h")
- << QStringLiteral("help"), tr("Displays this help."));
+ << QStringLiteral("help"), tr("Displays help on commandline options."));
addOption(opt);
+ QCommandLineOption optHelpAll(QStringLiteral("help-all"), tr("Displays help including Qt specific options."));
+ addOption(optHelpAll);
d->builtinHelpOption = true;
return opt;
}
@@ -552,9 +560,9 @@ static void showParserMessage(const QString &message, MessageType type)
{
#if defined(Q_OS_WINRT)
if (type == UsageMessage)
- qInfo(qPrintable(message));
+ qInfo("%ls", qUtf16Printable(message));
else
- qCritical(qPrintable(message));
+ qCritical("%ls", qUtf16Printable(message));
return;
#elif defined(Q_OS_WIN) && !defined(QT_BOOTSTRAPPED)
if (displayMessageBox()) {
@@ -579,7 +587,8 @@ static void showParserMessage(const QString &message, MessageType type)
In addition to parsing the options (like parse()), this function also handles the builtin
options and handles errors.
- The builtin options are \c{--version} if addVersionOption was called and \c{--help} if addHelpOption was called.
+ The builtin options are \c{--version} if addVersionOption was called and
+ \c{--help} / \c{--help-all} if addHelpOption was called.
When invoking one of these options, or when an error happens (for instance an unknown option was
passed), the current process will then stop, using the exit() function.
@@ -598,7 +607,10 @@ void QCommandLineParser::process(const QStringList &arguments)
showVersion();
if (d->builtinHelpOption && isSet(QStringLiteral("help")))
- showHelp(EXIT_SUCCESS);
+ d->showHelp(EXIT_SUCCESS, false);
+
+ if (d->builtinHelpOption && isSet(QStringLiteral("help-all")))
+ d->showHelp(EXIT_SUCCESS, true);
}
/*!
@@ -886,7 +898,7 @@ QStringList QCommandLineParser::values(const QString &optionName) const
return values;
}
- qWarning("QCommandLineParser: option not defined: \"%s\"", qPrintable(optionName));
+ qWarning("QCommandLineParser: option not defined: \"%ls\"", qUtf16Printable(optionName));
return QStringList();
}
@@ -1031,7 +1043,12 @@ Q_NORETURN void QCommandLineParser::showVersion()
*/
Q_NORETURN void QCommandLineParser::showHelp(int exitCode)
{
- showParserMessage(d->helpText(), UsageMessage);
+ d->showHelp(exitCode, false);
+}
+
+Q_NORETURN void QCommandLineParserPrivate::showHelp(int exitCode, bool includeQtOptions)
+{
+ showParserMessage(helpText(includeQtOptions), UsageMessage);
qt_call_post_routines();
::exit(exitCode);
}
@@ -1043,7 +1060,7 @@ Q_NORETURN void QCommandLineParser::showHelp(int exitCode)
*/
QString QCommandLineParser::helpText() const
{
- return d->helpText();
+ return d->helpText(false);
}
static QString wrapText(const QString &names, int longestOptionNameString, const QString &description)
@@ -1101,13 +1118,16 @@ static QString wrapText(const QString &names, int longestOptionNameString, const
return text;
}
-QString QCommandLineParserPrivate::helpText() const
+QString QCommandLineParserPrivate::helpText(bool includeQtOptions) const
{
const QLatin1Char nl('\n');
QString text;
QString usage;
usage += QCoreApplication::instance()->arguments().constFirst(); // executable name
- if (!commandLineOptionList.isEmpty())
+ QList<QCommandLineOption> options = commandLineOptionList;
+ if (includeQtOptions)
+ QCoreApplication::instance()->d_func()->addQtOptions(&options);
+ if (!options.isEmpty())
usage += QLatin1Char(' ') + QCommandLineParser::tr("[options]");
for (const PositionalArgumentDefinition &arg : positionalArgumentDefinitions)
usage += QLatin1Char(' ') + arg.syntax;
@@ -1115,12 +1135,12 @@ QString QCommandLineParserPrivate::helpText() const
if (!description.isEmpty())
text += description + nl;
text += nl;
- if (!commandLineOptionList.isEmpty())
+ if (!options.isEmpty())
text += QCommandLineParser::tr("Options:") + nl;
QStringList optionNameList;
- optionNameList.reserve(commandLineOptionList.size());
+ optionNameList.reserve(options.size());
int longestOptionNameString = 0;
- for (const QCommandLineOption &option : commandLineOptionList) {
+ for (const QCommandLineOption &option : qAsConst(options)) {
if (option.flags() & QCommandLineOption::HiddenFromHelp)
continue;
const QStringList optionNames = option.names();
@@ -1139,14 +1159,14 @@ QString QCommandLineParserPrivate::helpText() const
}
++longestOptionNameString;
auto optionNameIterator = optionNameList.cbegin();
- for (const QCommandLineOption &option : commandLineOptionList) {
+ for (const QCommandLineOption &option : qAsConst(options)) {
if (option.flags() & QCommandLineOption::HiddenFromHelp)
continue;
text += wrapText(*optionNameIterator, longestOptionNameString, option.description());
++optionNameIterator;
}
if (!positionalArgumentDefinitions.isEmpty()) {
- if (!commandLineOptionList.isEmpty())
+ if (!options.isEmpty())
text += nl;
text += QCommandLineParser::tr("Arguments:") + nl;
for (const PositionalArgumentDefinition &arg : positionalArgumentDefinitions)
diff --git a/src/corelib/tools/qcontainerfwd.h b/src/corelib/tools/qcontainerfwd.h
index 646d8908c3..532b4c95ce 100644
--- a/src/corelib/tools/qcontainerfwd.h
+++ b/src/corelib/tools/qcontainerfwd.h
@@ -47,7 +47,9 @@ QT_BEGIN_NAMESPACE
template <class Key, class T> class QCache;
template <class Key, class T> class QHash;
+#ifndef QT_NO_LINKED_LIST
template <class T> class QLinkedList;
+#endif
template <class T> class QList;
template <class Key, class T> class QMap;
template <class Key, class T> class QMultiHash;
diff --git a/src/corelib/tools/qcontainertools_impl.h b/src/corelib/tools/qcontainertools_impl.h
new file mode 100644
index 0000000000..3a0c4381f1
--- /dev/null
+++ b/src/corelib/tools/qcontainertools_impl.h
@@ -0,0 +1,132 @@
+/****************************************************************************
+**
+** Copyright (C) 2018 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.com, author Marc Mutz <marc.mutz@kdab.com>
+** Copyright (C) 2018 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.com, author Giuseppe D'Angelo <giuseppe.dangelo@kdab.com>
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the QtCore module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#if 0
+#pragma qt_sync_skip_header_check
+#pragma qt_sync_stop_processing
+#endif
+
+#ifndef QCONTAINERTOOLS_IMPL_H
+#define QCONTAINERTOOLS_IMPL_H
+
+#include <QtCore/qglobal.h>
+#include <iterator>
+
+QT_BEGIN_NAMESPACE
+
+namespace QtPrivate
+{
+template <typename Iterator>
+using IfIsInputIterator = typename std::enable_if<
+ std::is_convertible<typename std::iterator_traits<Iterator>::iterator_category, std::input_iterator_tag>::value,
+ bool>::type;
+
+template <typename Iterator>
+using IfIsForwardIterator = typename std::enable_if<
+ std::is_convertible<typename std::iterator_traits<Iterator>::iterator_category, std::forward_iterator_tag>::value,
+ bool>::type;
+
+template <typename Iterator>
+using IfIsNotForwardIterator = typename std::enable_if<
+ !std::is_convertible<typename std::iterator_traits<Iterator>::iterator_category, std::forward_iterator_tag>::value,
+ bool>::type;
+
+template <typename Container,
+ typename InputIterator,
+ IfIsNotForwardIterator<InputIterator> = true>
+void reserveIfForwardIterator(Container *, InputIterator, InputIterator)
+{
+}
+
+template <typename Container,
+ typename ForwardIterator,
+ IfIsForwardIterator<ForwardIterator> = true>
+void reserveIfForwardIterator(Container *c, ForwardIterator f, ForwardIterator l)
+{
+ c->reserve(static_cast<typename Container::size_type>(std::distance(f, l)));
+}
+
+// for detecting expression validity
+template <typename ... T>
+using void_t = void;
+
+template <typename Iterator, typename = void_t<>>
+struct AssociativeIteratorHasKeyAndValue : std::false_type
+{
+};
+
+template <typename Iterator>
+struct AssociativeIteratorHasKeyAndValue<
+ Iterator,
+ void_t<decltype(std::declval<Iterator &>().key()),
+ decltype(std::declval<Iterator &>().value())>
+ >
+ : std::true_type
+{
+};
+
+template <typename Iterator, typename = void_t<>, typename = void_t<>>
+struct AssociativeIteratorHasFirstAndSecond : std::false_type
+{
+};
+
+template <typename Iterator>
+struct AssociativeIteratorHasFirstAndSecond<
+ Iterator,
+ void_t<decltype(std::declval<Iterator &>()->first),
+ decltype(std::declval<Iterator &>()->second)>
+ >
+ : std::true_type
+{
+};
+
+template <typename Iterator>
+using IfAssociativeIteratorHasKeyAndValue =
+ typename std::enable_if<AssociativeIteratorHasKeyAndValue<Iterator>::value, bool>::type;
+
+template <typename Iterator>
+using IfAssociativeIteratorHasFirstAndSecond =
+ typename std::enable_if<AssociativeIteratorHasFirstAndSecond<Iterator>::value, bool>::type;
+
+} // namespace QtPrivate
+
+QT_END_NAMESPACE
+
+#endif // QCONTAINERTOOLS_IMPL_H
diff --git a/src/corelib/tools/qcontiguouscache.h b/src/corelib/tools/qcontiguouscache.h
index fdb9c6d19a..7b74b4f526 100644
--- a/src/corelib/tools/qcontiguouscache.h
+++ b/src/corelib/tools/qcontiguouscache.h
@@ -100,18 +100,16 @@ public:
inline ~QContiguousCache() { if (!d) return; if (!d->ref.deref()) freeData(p); }
- inline void detach() { if (d->ref.load() != 1) detach_helper(); }
- inline bool isDetached() const { return d->ref.load() == 1; }
+ inline void detach() { if (d->ref.loadRelaxed() != 1) detach_helper(); }
+ inline bool isDetached() const { return d->ref.loadRelaxed() == 1; }
#if !defined(QT_NO_UNSHARABLE_CONTAINERS)
inline void setSharable(bool sharable) { if (!sharable) detach(); d->sharable = sharable; }
#endif
QContiguousCache<T> &operator=(const QContiguousCache<T> &other);
-#ifdef Q_COMPILER_RVALUE_REFS
- inline QContiguousCache<T> &operator=(QContiguousCache<T> &&other)
+ inline QContiguousCache<T> &operator=(QContiguousCache<T> &&other) noexcept
{ qSwap(d, other.d); return *this; }
-#endif
- inline void swap(QContiguousCache<T> &other) { qSwap(d, other.d); }
+ inline void swap(QContiguousCache<T> &other) noexcept { qSwap(d, other.d); }
bool operator==(const QContiguousCache<T> &other) const;
inline bool operator!=(const QContiguousCache<T> &other) const { return !(*this == other); }
@@ -178,7 +176,7 @@ void QContiguousCache<T>::detach_helper()
union { QContiguousCacheData *d; QContiguousCacheTypedData<T> *p; } x;
x.d = allocateData(d->alloc);
- x.d->ref.store(1);
+ x.d->ref.storeRelaxed(1);
x.d->count = d->count;
x.d->start = d->start;
x.d->offset = d->offset;
@@ -217,7 +215,7 @@ void QContiguousCache<T>::setCapacity(int asize)
detach();
union { QContiguousCacheData *d; QContiguousCacheTypedData<T> *p; } x;
x.d = allocateData(asize);
- x.d->ref.store(1);
+ x.d->ref.storeRelaxed(1);
x.d->alloc = asize;
x.d->count = qMin(d->count, asize);
x.d->offset = d->offset + d->count - x.d->count;
@@ -253,7 +251,7 @@ void QContiguousCache<T>::setCapacity(int asize)
template <typename T>
void QContiguousCache<T>::clear()
{
- if (d->ref.load() == 1) {
+ if (d->ref.loadRelaxed() == 1) {
if (QTypeInfo<T>::isComplex) {
int oldcount = d->count;
T * i = p->array + d->start;
@@ -269,7 +267,7 @@ void QContiguousCache<T>::clear()
} else {
union { QContiguousCacheData *d; QContiguousCacheTypedData<T> *p; } x;
x.d = allocateData(d->alloc);
- x.d->ref.store(1);
+ x.d->ref.storeRelaxed(1);
x.d->alloc = d->alloc;
x.d->count = x.d->start = x.d->offset = 0;
x.d->sharable = true;
@@ -289,7 +287,7 @@ QContiguousCache<T>::QContiguousCache(int cap)
{
Q_ASSERT(cap >= 0);
d = allocateData(cap);
- d->ref.store(1);
+ d->ref.storeRelaxed(1);
d->alloc = cap;
d->count = d->start = d->offset = 0;
d->sharable = true;
diff --git a/src/corelib/tools/qcryptographichash.cpp b/src/corelib/tools/qcryptographichash.cpp
index 51f48503fb..fa8d21e07a 100644
--- a/src/corelib/tools/qcryptographichash.cpp
+++ b/src/corelib/tools/qcryptographichash.cpp
@@ -58,6 +58,10 @@ typedef unsigned char BitSequence;
typedef unsigned long long DataLength;
typedef enum { SUCCESS = 0, FAIL = 1, BAD_HASHLEN = 2 } HashReturn;
+#ifdef Q_OS_RTEMS
+# undef ALIGN
+#endif
+
#include "../../3rdparty/sha3/KeccakSponge.c"
typedef spongeState hashState;
diff --git a/src/corelib/tools/qdatetime.cpp b/src/corelib/tools/qdatetime.cpp
deleted file mode 100644
index aa1ffff400..0000000000
--- a/src/corelib/tools/qdatetime.cpp
+++ /dev/null
@@ -1,5436 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2017 The Qt Company Ltd.
-** Copyright (C) 2016 Intel Corporation.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#include "qplatformdefs.h"
-#include "private/qdatetime_p.h"
-#if QT_CONFIG(datetimeparser)
-#include "private/qdatetimeparser_p.h"
-#endif
-
-#include "qdatastream.h"
-#include "qset.h"
-#include "qlocale.h"
-#include "qdatetime.h"
-#if QT_CONFIG(timezone)
-#include "qtimezoneprivate_p.h"
-#endif
-#include "qregexp.h"
-#include "qdebug.h"
-#ifndef Q_OS_WIN
-#include <locale.h>
-#endif
-
-#include <cmath>
-#ifdef Q_CC_MINGW
-# include <unistd.h> // Define _POSIX_THREAD_SAFE_FUNCTIONS to obtain localtime_r()
-#endif
-#include <time.h>
-#ifdef Q_OS_WIN
-# include <qt_windows.h>
-# ifdef Q_OS_WINRT
-# include "qfunctions_winrt.h"
-# endif
-#endif
-
-#if defined(Q_OS_MAC)
-#include <private/qcore_mac_p.h>
-#endif
-
-QT_BEGIN_NAMESPACE
-
-/*****************************************************************************
- Date/Time Constants
- *****************************************************************************/
-
-enum {
- SECS_PER_DAY = 86400,
- MSECS_PER_DAY = 86400000,
- SECS_PER_HOUR = 3600,
- MSECS_PER_HOUR = 3600000,
- SECS_PER_MIN = 60,
- MSECS_PER_MIN = 60000,
- TIME_T_MAX = 2145916799, // int maximum 2037-12-31T23:59:59 UTC
- JULIAN_DAY_FOR_EPOCH = 2440588 // result of julianDayFromDate(1970, 1, 1)
-};
-
-/*****************************************************************************
- QDate static helper functions
- *****************************************************************************/
-
-static inline QDate fixedDate(int y, int m, int d)
-{
- QDate result(y, m, 1);
- result.setDate(y, m, qMin(d, result.daysInMonth()));
- return result;
-}
-
-/*
- Division, rounding down (rather than towards zero).
-
- From C++11 onwards, integer division is defined to round towards zero, so we
- can rely on that when implementing this. This is only used with denominator b
- > 0, so we only have to treat negative numerator, a, specially.
- */
-static inline qint64 floordiv(qint64 a, int b)
-{
- return (a - (a < 0 ? b - 1 : 0)) / b;
-}
-
-static inline int floordiv(int a, int b)
-{
- return (a - (a < 0 ? b - 1 : 0)) / b;
-}
-
-static inline qint64 julianDayFromDate(int year, int month, int day)
-{
- // Adjust for no year 0
- if (year < 0)
- ++year;
-
-/*
- * Math from The Calendar FAQ at http://www.tondering.dk/claus/cal/julperiod.php
- * This formula is correct for all julian days, when using mathematical integer
- * division (round to negative infinity), not c++11 integer division (round to zero)
- */
- int a = floordiv(14 - month, 12);
- qint64 y = (qint64)year + 4800 - a;
- int m = month + 12 * a - 3;
- return day + floordiv(153 * m + 2, 5) + 365 * y + floordiv(y, 4) - floordiv(y, 100) + floordiv(y, 400) - 32045;
-}
-
-struct ParsedDate
-{
- int year, month, day;
-};
-
-// prevent this function from being inlined into all 10 users
-Q_NEVER_INLINE
-static ParsedDate getDateFromJulianDay(qint64 julianDay)
-{
-/*
- * Math from The Calendar FAQ at http://www.tondering.dk/claus/cal/julperiod.php
- * This formula is correct for all julian days, when using mathematical integer
- * division (round to negative infinity), not c++11 integer division (round to zero)
- */
- qint64 a = julianDay + 32044;
- qint64 b = floordiv(4 * a + 3, 146097);
- int c = a - floordiv(146097 * b, 4);
-
- int d = floordiv(4 * c + 3, 1461);
- int e = c - floordiv(1461 * d, 4);
- int m = floordiv(5 * e + 2, 153);
-
- int day = e - floordiv(153 * m + 2, 5) + 1;
- int month = m + 3 - 12 * floordiv(m, 10);
- int year = 100 * b + d - 4800 + floordiv(m, 10);
-
- // Adjust for no year 0
- if (year <= 0)
- --year ;
-
- return { year, month, day };
-}
-
-/*****************************************************************************
- Date/Time formatting helper functions
- *****************************************************************************/
-
-static const char monthDays[] = { 0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
-
-#if QT_CONFIG(textdate)
-static const char qt_shortMonthNames[][4] = {
- "Jan", "Feb", "Mar", "Apr", "May", "Jun",
- "Jul", "Aug", "Sep", "Oct", "Nov", "Dec" };
-
-static int qt_monthNumberFromShortName(QStringRef shortName)
-{
- for (unsigned int i = 0; i < sizeof(qt_shortMonthNames) / sizeof(qt_shortMonthNames[0]); ++i) {
- if (shortName == QLatin1String(qt_shortMonthNames[i], 3))
- return i + 1;
- }
- return -1;
-}
-static int qt_monthNumberFromShortName(const QString &shortName)
-{ return qt_monthNumberFromShortName(QStringRef(&shortName)); }
-
-static int fromShortMonthName(const QStringRef &monthName)
-{
- // Assume that English monthnames are the default
- int month = qt_monthNumberFromShortName(monthName);
- if (month != -1)
- return month;
- // If English names can't be found, search the localized ones
- for (int i = 1; i <= 12; ++i) {
- if (monthName == QLocale::system().monthName(i, QLocale::ShortFormat))
- return i;
- }
- return -1;
-}
-#endif // textdate
-
-#if QT_CONFIG(datestring)
-struct ParsedRfcDateTime {
- QDate date;
- QTime time;
- int utcOffset;
-};
-
-static ParsedRfcDateTime rfcDateImpl(const QString &s)
-{
- ParsedRfcDateTime result;
-
- // Matches "Wdy, dd Mon yyyy HH:mm:ss ±hhmm" (Wdy, being optional)
- QRegExp rex(QStringLiteral("^(?:[A-Z][a-z]+,)?[ \\t]*(\\d{1,2})[ \\t]+([A-Z][a-z]+)[ \\t]+(\\d\\d\\d\\d)(?:[ \\t]+(\\d\\d):(\\d\\d)(?::(\\d\\d))?)?[ \\t]*(?:([+-])(\\d\\d)(\\d\\d))?"));
- if (s.indexOf(rex) == 0) {
- const QStringList cap = rex.capturedTexts();
- result.date = QDate(cap[3].toInt(), qt_monthNumberFromShortName(cap[2]), cap[1].toInt());
- if (!cap[4].isEmpty())
- result.time = QTime(cap[4].toInt(), cap[5].toInt(), cap[6].toInt());
- const bool positiveOffset = (cap[7] == QLatin1String("+"));
- const int hourOffset = cap[8].toInt();
- const int minOffset = cap[9].toInt();
- result.utcOffset = ((hourOffset * 60 + minOffset) * (positiveOffset ? 60 : -60));
- } else {
- // Matches "Wdy Mon dd HH:mm:ss yyyy"
- QRegExp rex(QStringLiteral("^[A-Z][a-z]+[ \\t]+([A-Z][a-z]+)[ \\t]+(\\d\\d)(?:[ \\t]+(\\d\\d):(\\d\\d):(\\d\\d))?[ \\t]+(\\d\\d\\d\\d)[ \\t]*(?:([+-])(\\d\\d)(\\d\\d))?"));
- if (s.indexOf(rex) == 0) {
- const QStringList cap = rex.capturedTexts();
- result.date = QDate(cap[6].toInt(), qt_monthNumberFromShortName(cap[1]), cap[2].toInt());
- if (!cap[3].isEmpty())
- result.time = QTime(cap[3].toInt(), cap[4].toInt(), cap[5].toInt());
- const bool positiveOffset = (cap[7] == QLatin1String("+"));
- const int hourOffset = cap[8].toInt();
- const int minOffset = cap[9].toInt();
- result.utcOffset = ((hourOffset * 60 + minOffset) * (positiveOffset ? 60 : -60));
- }
- }
-
- return result;
-}
-#endif // datestring
-
-// Return offset in [+-]HH:mm format
-static QString toOffsetString(Qt::DateFormat format, int offset)
-{
- return QString::asprintf("%c%02d%s%02d",
- offset >= 0 ? '+' : '-',
- qAbs(offset) / SECS_PER_HOUR,
- // Qt::ISODate puts : between the hours and minutes, but Qt:TextDate does not:
- format == Qt::TextDate ? "" : ":",
- (qAbs(offset) / 60) % 60);
-}
-
-#if QT_CONFIG(datestring)
-// Parse offset in [+-]HH[[:]mm] format
-static int fromOffsetString(const QStringRef &offsetString, bool *valid) Q_DECL_NOTHROW
-{
- *valid = false;
-
- const int size = offsetString.size();
- if (size < 2 || size > 6)
- return 0;
-
- // sign will be +1 for a positive and -1 for a negative offset
- int sign;
-
- // First char must be + or -
- const QChar signChar = offsetString.at(0);
- if (signChar == QLatin1Char('+'))
- sign = 1;
- else if (signChar == QLatin1Char('-'))
- sign = -1;
- else
- return 0;
-
- // Split the hour and minute parts
- const QStringRef time = offsetString.mid(1);
- int hhLen = time.indexOf(QLatin1Char(':'));
- int mmIndex;
- if (hhLen == -1)
- mmIndex = hhLen = 2; // [+-]HHmm or [+-]HH format
- else
- mmIndex = hhLen + 1;
-
- const QStringRef hhRef = time.left(hhLen);
- bool ok = false;
- const int hour = hhRef.toInt(&ok);
- if (!ok)
- return 0;
-
- const QStringRef mmRef = time.mid(mmIndex);
- const int minute = mmRef.isEmpty() ? 0 : mmRef.toInt(&ok);
- if (!ok || minute < 0 || minute > 59)
- return 0;
-
- *valid = true;
- return sign * ((hour * 60) + minute) * 60;
-}
-#endif // datestring
-
-/*****************************************************************************
- QDate member functions
- *****************************************************************************/
-
-/*!
- \since 4.5
-
- \enum QDate::MonthNameType
-
- This enum describes the types of the string representation used
- for the month name.
-
- \value DateFormat This type of name can be used for date-to-string formatting.
- \value StandaloneFormat This type is used when you need to enumerate months or weekdays.
- Usually standalone names are represented in singular forms with
- capitalized first letter.
-*/
-
-/*!
- \class QDate
- \inmodule QtCore
- \reentrant
- \brief The QDate class provides date functions.
-
-
- A QDate object represents a particular date. This can be expressed as a
- calendar date, i.e. year, month, and day numbers, in the proleptic Gregorian
- calendar.
-
- A QDate object is typically created by giving the year, month, and day
- numbers explicitly. Note that QDate interprets year numbers less than 100 as
- presented, i.e., as years 1 through 99, without adding any offset. The
- static function currentDate() creates a QDate object containing the date
- read from the system clock. An explicit date can also be set using
- setDate(). The fromString() function returns a QDate given a string and a
- date format which is used to interpret the date within the string.
-
- The year(), month(), and day() functions provide access to the year, month,
- and day numbers. Also, dayOfWeek() and dayOfYear() functions are
- provided. The same information is provided in textual format by
- toString(). The day and month numbers can be mapped to names using QLocal.
-
- QDate provides a full set of operators to compare two QDate
- objects where smaller means earlier, and larger means later.
-
- You can increment (or decrement) a date by a given number of days
- using addDays(). Similarly you can use addMonths() and addYears().
- The daysTo() function returns the number of days between two
- dates.
-
- The daysInMonth() and daysInYear() functions return how many days
- there are in this date's month and year, respectively. The
- isLeapYear() function indicates whether a date is in a leap year.
-
- \section1 Remarks
-
- \section2 No Year 0
-
- There is no year 0. Dates in that year are considered invalid. The year -1
- is the year "1 before Christ" or "1 before current era." The day before 1
- January 1 CE, QDate(1, 1, 1), is 31 December 1 BCE, QDate(-1, 12, 31).
-
- \section2 Range of Valid Dates
-
- Dates are stored internally as a Julian Day number, an integer count of
- every day in a contiguous range, with 24 November 4714 BCE in the Gregorian
- calendar being Julian Day 0 (1 January 4713 BCE in the Julian calendar).
- As well as being an efficient and accurate way of storing an absolute date,
- it is suitable for converting a date into other calendar systems such as
- Hebrew, Islamic or Chinese. The Julian Day number can be obtained using
- QDate::toJulianDay() and can be set using QDate::fromJulianDay().
-
- The range of dates able to be stored by QDate as a Julian Day number is
- for technical reasons limited to between -784350574879 and 784354017364,
- which means from before 2 billion BCE to after 2 billion CE.
-
- \sa QTime, QDateTime, QDateEdit, QDateTimeEdit, QCalendarWidget
-*/
-
-/*!
- \fn QDate::QDate()
-
- Constructs a null date. Null dates are invalid.
-
- \sa isNull(), isValid()
-*/
-
-/*!
- Constructs a date with year \a y, month \a m and day \a d.
-
- If the specified date is invalid, the date is not set and
- isValid() returns \c false.
-
- \warning Years 1 to 99 are interpreted as is. Year 0 is invalid.
-
- \sa isValid()
-*/
-
-QDate::QDate(int y, int m, int d)
-{
- setDate(y, m, d);
-}
-
-
-/*!
- \fn bool QDate::isNull() const
-
- Returns \c true if the date is null; otherwise returns \c false. A null
- date is invalid.
-
- \note The behavior of this function is equivalent to isValid().
-
- \sa isValid()
-*/
-
-
-/*!
- \fn bool QDate::isValid() const
-
- Returns \c true if this date is valid; otherwise returns \c false.
-
- \sa isNull()
-*/
-
-
-/*!
- Returns the year of this date. Negative numbers indicate years
- before 1 CE, such that year -44 is 44 BCE.
-
- Returns 0 if the date is invalid.
-
- \sa month(), day()
-*/
-
-int QDate::year() const
-{
- if (isNull())
- return 0;
-
- return getDateFromJulianDay(jd).year;
-}
-
-/*!
- Returns the number corresponding to the month of this date, using
- the following convention:
-
- \list
- \li 1 = "January"
- \li 2 = "February"
- \li 3 = "March"
- \li 4 = "April"
- \li 5 = "May"
- \li 6 = "June"
- \li 7 = "July"
- \li 8 = "August"
- \li 9 = "September"
- \li 10 = "October"
- \li 11 = "November"
- \li 12 = "December"
- \endlist
-
- Returns 0 if the date is invalid.
-
- \sa year(), day()
-*/
-
-int QDate::month() const
-{
- if (isNull())
- return 0;
-
- return getDateFromJulianDay(jd).month;
-}
-
-/*!
- Returns the day of the month (1 to 31) of this date.
-
- Returns 0 if the date is invalid.
-
- \sa year(), month(), dayOfWeek()
-*/
-
-int QDate::day() const
-{
- if (isNull())
- return 0;
-
- return getDateFromJulianDay(jd).day;
-}
-
-/*!
- Returns the weekday (1 = Monday to 7 = Sunday) for this date.
-
- Returns 0 if the date is invalid.
-
- \sa day(), dayOfYear(), Qt::DayOfWeek
-*/
-
-int QDate::dayOfWeek() const
-{
- if (isNull())
- return 0;
-
- if (jd >= 0)
- return (jd % 7) + 1;
- else
- return ((jd + 1) % 7) + 7;
-}
-
-/*!
- Returns the day of the year (1 to 365 or 366 on leap years) for
- this date.
-
- Returns 0 if the date is invalid.
-
- \sa day(), dayOfWeek()
-*/
-
-int QDate::dayOfYear() const
-{
- if (isNull())
- return 0;
-
- return jd - julianDayFromDate(year(), 1, 1) + 1;
-}
-
-/*!
- Returns the number of days in the month (28 to 31) for this date.
-
- Returns 0 if the date is invalid.
-
- \sa day(), daysInYear()
-*/
-
-int QDate::daysInMonth() const
-{
- if (isNull())
- return 0;
-
- const ParsedDate pd = getDateFromJulianDay(jd);
- if (pd.month == 2 && isLeapYear(pd.year))
- return 29;
- else
- return monthDays[pd.month];
-}
-
-/*!
- Returns the number of days in the year (365 or 366) for this date.
-
- Returns 0 if the date is invalid.
-
- \sa day(), daysInMonth()
-*/
-
-int QDate::daysInYear() const
-{
- if (isNull())
- return 0;
-
- return isLeapYear(getDateFromJulianDay(jd).year) ? 366 : 365;
-}
-
-/*!
- Returns the week number (1 to 53), and stores the year in
- *\a{yearNumber} unless \a yearNumber is null (the default).
-
- Returns 0 if the date is invalid.
-
- In accordance with ISO 8601, weeks start on Monday and the first
- Thursday of a year is always in week 1 of that year. Most years
- have 52 weeks, but some have 53.
-
- *\a{yearNumber} is not always the same as year(). For example, 1
- January 2000 has week number 52 in the year 1999, and 31 December
- 2002 has week number 1 in the year 2003.
-
- \sa isValid()
-*/
-
-int QDate::weekNumber(int *yearNumber) const
-{
- if (!isValid())
- return 0;
-
- int year = QDate::year();
- int yday = dayOfYear();
- int wday = dayOfWeek();
-
- int week = (yday - wday + 10) / 7;
-
- if (week == 0) {
- // last week of previous year
- --year;
- week = (yday + 365 + (QDate::isLeapYear(year) ? 1 : 0) - wday + 10) / 7;
- Q_ASSERT(week == 52 || week == 53);
- } else if (week == 53) {
- // maybe first week of next year
- int w = (yday - 365 - (QDate::isLeapYear(year) ? 1 : 0) - wday + 10) / 7;
- if (w > 0) {
- ++year;
- week = w;
- }
- Q_ASSERT(week == 53 || week == 1);
- }
-
- if (yearNumber != 0)
- *yearNumber = year;
- return week;
-}
-
-#if QT_DEPRECATED_SINCE(5, 11) && QT_CONFIG(textdate)
-/*!
- \since 4.5
- \deprecated
-
- Returns the short name of the \a month for the representation specified
- by \a type.
-
- The months are enumerated using the following convention:
-
- \list
- \li 1 = "Jan"
- \li 2 = "Feb"
- \li 3 = "Mar"
- \li 4 = "Apr"
- \li 5 = "May"
- \li 6 = "Jun"
- \li 7 = "Jul"
- \li 8 = "Aug"
- \li 9 = "Sep"
- \li 10 = "Oct"
- \li 11 = "Nov"
- \li 12 = "Dec"
- \endlist
-
- The month names will be localized according to the system's
- locale settings, i.e. using QLocale::system().
-
- Returns an empty string if the date is invalid.
-
- \sa toString(), longMonthName(), shortDayName(), longDayName()
-*/
-
-QString QDate::shortMonthName(int month, QDate::MonthNameType type)
-{
- switch (type) {
- case QDate::DateFormat:
- return QLocale::system().monthName(month, QLocale::ShortFormat);
- case QDate::StandaloneFormat:
- return QLocale::system().standaloneMonthName(month, QLocale::ShortFormat);
- }
- return QString();
-}
-
-/*!
- \since 4.5
- \deprecated
-
- Returns the long name of the \a month for the representation specified
- by \a type.
-
- The months are enumerated using the following convention:
-
- \list
- \li 1 = "January"
- \li 2 = "February"
- \li 3 = "March"
- \li 4 = "April"
- \li 5 = "May"
- \li 6 = "June"
- \li 7 = "July"
- \li 8 = "August"
- \li 9 = "September"
- \li 10 = "October"
- \li 11 = "November"
- \li 12 = "December"
- \endlist
-
- The month names will be localized according to the system's
- locale settings, i.e. using QLocale::system().
-
- Returns an empty string if the date is invalid.
-
- \sa toString(), shortMonthName(), shortDayName(), longDayName()
-*/
-
-QString QDate::longMonthName(int month, MonthNameType type)
-{
- switch (type) {
- case QDate::DateFormat:
- return QLocale::system().monthName(month, QLocale::LongFormat);
- case QDate::StandaloneFormat:
- return QLocale::system().standaloneMonthName(month, QLocale::LongFormat);
- }
- return QString();
-}
-
-/*!
- \since 4.5
- \deprecated
-
- Returns the short name of the \a weekday for the representation specified
- by \a type.
-
- The days are enumerated using the following convention:
-
- \list
- \li 1 = "Mon"
- \li 2 = "Tue"
- \li 3 = "Wed"
- \li 4 = "Thu"
- \li 5 = "Fri"
- \li 6 = "Sat"
- \li 7 = "Sun"
- \endlist
-
- The day names will be localized according to the system's
- locale settings, i.e. using QLocale::system().
-
- Returns an empty string if the date is invalid.
-
- \sa toString(), shortMonthName(), longMonthName(), longDayName()
-*/
-
-QString QDate::shortDayName(int weekday, MonthNameType type)
-{
- switch (type) {
- case QDate::DateFormat:
- return QLocale::system().dayName(weekday, QLocale::ShortFormat);
- case QDate::StandaloneFormat:
- return QLocale::system().standaloneDayName(weekday, QLocale::ShortFormat);
- }
- return QString();
-}
-
-/*!
- \since 4.5
- \deprecated
-
- Returns the long name of the \a weekday for the representation specified
- by \a type.
-
- The days are enumerated using the following convention:
-
- \list
- \li 1 = "Monday"
- \li 2 = "Tuesday"
- \li 3 = "Wednesday"
- \li 4 = "Thursday"
- \li 5 = "Friday"
- \li 6 = "Saturday"
- \li 7 = "Sunday"
- \endlist
-
- The day names will be localized according to the system's
- locale settings, i.e. using QLocale::system().
-
- Returns an empty string if the date is invalid.
-
- \sa toString(), shortDayName(), shortMonthName(), longMonthName()
-*/
-
-QString QDate::longDayName(int weekday, MonthNameType type)
-{
- switch (type) {
- case QDate::DateFormat:
- return QLocale::system().dayName(weekday, QLocale::LongFormat);
- case QDate::StandaloneFormat:
- return QLocale::system().standaloneDayName(weekday, QLocale::LongFormat);
- }
- return QString();
-}
-#endif // textdate && deprecated
-
-#if QT_CONFIG(datestring)
-
-#if QT_CONFIG(textdate)
-static QString toStringTextDate(QDate date)
-{
- const ParsedDate pd = getDateFromJulianDay(date.toJulianDay());
- static const QLatin1Char sp(' ');
- return QLocale::system().dayName(date.dayOfWeek(), QLocale::ShortFormat) + sp
- + QLocale::system().monthName(pd.month, QLocale::ShortFormat) + sp
- + QString::number(pd.day) + sp
- + QString::number(pd.year);
-}
-#endif // textdate
-
-static QString toStringIsoDate(qint64 jd)
-{
- const ParsedDate pd = getDateFromJulianDay(jd);
- if (pd.year >= 0 && pd.year <= 9999)
- return QString::asprintf("%04d-%02d-%02d", pd.year, pd.month, pd.day);
- else
- return QString();
-}
-
-/*!
- \fn QString QDate::toString(Qt::DateFormat format) const
-
- \overload
-
- Returns the date as a string. The \a format parameter determines
- the format of the string.
-
- If the \a format is Qt::TextDate, the string is formatted in the default
- way. The day and month names will be localized names using the system
- locale, i.e. QLocale::system(). An example of this formatting
- is "Sat May 20 1995".
-
- If the \a format is Qt::ISODate, the string format corresponds
- to the ISO 8601 extended specification for representations of
- dates and times, taking the form yyyy-MM-dd, where yyyy is the
- year, MM is the month of the year (between 01 and 12), and dd is
- the day of the month between 01 and 31.
-
- If the \a format is Qt::SystemLocaleShortDate or
- Qt::SystemLocaleLongDate, the string format depends on the locale
- settings of the system. Identical to calling
- QLocale::system().toString(date, QLocale::ShortFormat) or
- QLocale::system().toString(date, QLocale::LongFormat).
-
- If the \a format is Qt::DefaultLocaleShortDate or
- Qt::DefaultLocaleLongDate, the string format depends on the
- default application locale. This is the locale set with
- QLocale::setDefault(), or the system locale if no default locale
- has been set. Identical to calling
- \l {QLocale::toString()}{QLocale().toString(date, QLocale::ShortFormat) } or
- \l {QLocale::toString()}{QLocale().toString(date, QLocale::LongFormat)}.
-
- If the \a format is Qt::RFC2822Date, the string is formatted in
- an \l{RFC 2822} compatible way. An example of this formatting is
- "20 May 1995".
-
- If the date is invalid, an empty string will be returned.
-
- \warning The Qt::ISODate format is only valid for years in the
- range 0 to 9999. This restriction may apply to locale-aware
- formats as well, depending on the locale settings.
-
- \sa fromString(), QLocale::toString()
-*/
-QString QDate::toString(Qt::DateFormat format) const
-{
- if (!isValid())
- return QString();
-
- switch (format) {
- case Qt::SystemLocaleDate:
- case Qt::SystemLocaleShortDate:
- return QLocale::system().toString(*this, QLocale::ShortFormat);
- case Qt::SystemLocaleLongDate:
- return QLocale::system().toString(*this, QLocale::LongFormat);
- case Qt::LocaleDate:
- case Qt::DefaultLocaleShortDate:
- return QLocale().toString(*this, QLocale::ShortFormat);
- case Qt::DefaultLocaleLongDate:
- return QLocale().toString(*this, QLocale::LongFormat);
- case Qt::RFC2822Date:
- return QLocale::c().toString(*this, QStringViewLiteral("dd MMM yyyy"));
- default:
-#if QT_CONFIG(textdate)
- case Qt::TextDate:
- return toStringTextDate(*this);
-#endif
- case Qt::ISODate:
- case Qt::ISODateWithMs:
- return toStringIsoDate(jd);
- }
-}
-
-/*!
- \fn QString QDate::toString(const QString &format) const
- \fn QString QDate::toString(QStringView format) const
-
- Returns the date as a string. The \a format parameter determines
- the format of the result string.
-
- These expressions may be used:
-
- \table
- \header \li Expression \li Output
- \row \li d \li the day as number without a leading zero (1 to 31)
- \row \li dd \li the day as number with a leading zero (01 to 31)
- \row \li ddd
- \li the abbreviated localized day name (e.g. 'Mon' to 'Sun').
- Uses the system locale to localize the name, i.e. QLocale::system().
- \row \li dddd
- \li the long localized day name (e.g. 'Monday' to 'Sunday').
- Uses the system locale to localize the name, i.e. QLocale::system().
- \row \li M \li the month as number without a leading zero (1 to 12)
- \row \li MM \li the month as number with a leading zero (01 to 12)
- \row \li MMM
- \li the abbreviated localized month name (e.g. 'Jan' to 'Dec').
- Uses the system locale to localize the name, i.e. QLocale::system().
- \row \li MMMM
- \li the long localized month name (e.g. 'January' to 'December').
- Uses the system locale to localize the name, i.e. QLocale::system().
- \row \li yy \li the year as two digit number (00 to 99)
- \row \li yyyy \li the year as four digit number. If the year is negative,
- a minus sign is prepended in addition.
- \endtable
-
- Any sequence of characters enclosed in single quotes will be included
- verbatim in the output string (stripped of the quotes), even if it contains
- formatting characters. Two consecutive single quotes ("''") are replaced by
- a single quote in the output. All other characters in the format string are
- included verbatim in the output string.
-
- Formats without separators (e.g. "ddMM") are supported but must be used with
- care, as the resulting strings aren't always reliably readable (e.g. if "dM"
- produces "212" it could mean either the 2nd of December or the 21st of
- February).
-
- Example format strings (assuming that the QDate is the 20 July
- 1969):
-
- \table
- \header \li Format \li Result
- \row \li dd.MM.yyyy \li 20.07.1969
- \row \li ddd MMMM d yy \li Sun July 20 69
- \row \li 'The day is' dddd \li The day is Sunday
- \endtable
-
- If the datetime is invalid, an empty string will be returned.
-
- \sa fromString(), QDateTime::toString(), QTime::toString(), QLocale::toString()
-
-*/
-QString QDate::toString(QStringView format) const
-{
- return QLocale::system().toString(*this, format); // QLocale::c() ### Qt6
-}
-
-#if QT_STRINGVIEW_LEVEL < 2
-QString QDate::toString(const QString &format) const
-{
- return toString(qToStringViewIgnoringNull(format));
-}
-#endif
-
-#endif // datestring
-
-/*!
- \fn bool QDate::setYMD(int y, int m, int d)
-
- \deprecated in 5.0, use setDate() instead.
-
- Sets the date's year \a y, month \a m, and day \a d.
-
- If \a y is in the range 0 to 99, it is interpreted as 1900 to
- 1999.
- Returns \c false if the date is invalid.
-
- Use setDate() instead.
-*/
-
-/*!
- \since 4.2
-
- Sets the date's \a year, \a month, and \a day. Returns \c true if
- the date is valid; otherwise returns \c false.
-
- If the specified date is invalid, the QDate object is set to be
- invalid.
-
- \sa isValid()
-*/
-bool QDate::setDate(int year, int month, int day)
-{
- if (isValid(year, month, day))
- jd = julianDayFromDate(year, month, day);
- else
- jd = nullJd();
-
- return isValid();
-}
-
-/*!
- \since 4.5
-
- Extracts the date's year, month, and day, and assigns them to
- *\a year, *\a month, and *\a day. The pointers may be null.
-
- Returns 0 if the date is invalid.
-
- \note In Qt versions prior to 5.7, this function is marked as non-\c{const}.
-
- \sa year(), month(), day(), isValid()
-*/
-void QDate::getDate(int *year, int *month, int *day) const
-{
- ParsedDate pd = { 0, 0, 0 };
- if (isValid())
- pd = getDateFromJulianDay(jd);
-
- if (year)
- *year = pd.year;
- if (month)
- *month = pd.month;
- if (day)
- *day = pd.day;
-}
-
-#if QT_VERSION < QT_VERSION_CHECK(6, 0, 0)
-/*!
- \overload
- \internal
-*/
-void QDate::getDate(int *year, int *month, int *day)
-{
- qAsConst(*this).getDate(year, month, day);
-}
-#endif // < Qt 6
-
-/*!
- Returns a QDate object containing a date \a ndays later than the
- date of this object (or earlier if \a ndays is negative).
-
- Returns a null date if the current date is invalid or the new date is
- out of range.
-
- \sa addMonths(), addYears(), daysTo()
-*/
-
-QDate QDate::addDays(qint64 ndays) const
-{
- if (isNull())
- return QDate();
-
- // Due to limits on minJd() and maxJd() we know that any overflow
- // will be invalid and caught by fromJulianDay().
- return fromJulianDay(jd + ndays);
-}
-
-/*!
- Returns a QDate object containing a date \a nmonths later than the
- date of this object (or earlier if \a nmonths is negative).
-
- \note If the ending day/month combination does not exist in the
- resulting month/year, this function will return a date that is the
- latest valid date.
-
- \sa addDays(), addYears()
-*/
-
-QDate QDate::addMonths(int nmonths) const
-{
- if (!isValid())
- return QDate();
- if (!nmonths)
- return *this;
-
- int old_y, y, m, d;
- {
- const ParsedDate pd = getDateFromJulianDay(jd);
- y = pd.year;
- m = pd.month;
- d = pd.day;
- }
- old_y = y;
-
- bool increasing = nmonths > 0;
-
- while (nmonths != 0) {
- if (nmonths < 0 && nmonths + 12 <= 0) {
- y--;
- nmonths+=12;
- } else if (nmonths < 0) {
- m+= nmonths;
- nmonths = 0;
- if (m <= 0) {
- --y;
- m += 12;
- }
- } else if (nmonths - 12 >= 0) {
- y++;
- nmonths -= 12;
- } else if (m == 12) {
- y++;
- m = 0;
- } else {
- m += nmonths;
- nmonths = 0;
- if (m > 12) {
- ++y;
- m -= 12;
- }
- }
- }
-
- // was there a sign change?
- if ((old_y > 0 && y <= 0) ||
- (old_y < 0 && y >= 0))
- // yes, adjust the date by +1 or -1 years
- y += increasing ? +1 : -1;
-
- return fixedDate(y, m, d);
-}
-
-/*!
- Returns a QDate object containing a date \a nyears later than the
- date of this object (or earlier if \a nyears is negative).
-
- \note If the ending day/month combination does not exist in the
- resulting year (i.e., if the date was Feb 29 and the final year is
- not a leap year), this function will return a date that is the
- latest valid date (that is, Feb 28).
-
- \sa addDays(), addMonths()
-*/
-
-QDate QDate::addYears(int nyears) const
-{
- if (!isValid())
- return QDate();
-
- ParsedDate pd = getDateFromJulianDay(jd);
-
- int old_y = pd.year;
- pd.year += nyears;
-
- // was there a sign change?
- if ((old_y > 0 && pd.year <= 0) ||
- (old_y < 0 && pd.year >= 0))
- // yes, adjust the date by +1 or -1 years
- pd.year += nyears > 0 ? +1 : -1;
-
- return fixedDate(pd.year, pd.month, pd.day);
-}
-
-/*!
- Returns the number of days from this date to \a d (which is
- negative if \a d is earlier than this date).
-
- Returns 0 if either date is invalid.
-
- Example:
- \snippet code/src_corelib_tools_qdatetime.cpp 0
-
- \sa addDays()
-*/
-
-qint64 QDate::daysTo(const QDate &d) const
-{
- if (isNull() || d.isNull())
- return 0;
-
- // Due to limits on minJd() and maxJd() we know this will never overflow
- return d.jd - jd;
-}
-
-
-/*!
- \fn bool QDate::operator==(const QDate &d) const
-
- Returns \c true if this date is equal to \a d; otherwise returns
- false.
-
-*/
-
-/*!
- \fn bool QDate::operator!=(const QDate &d) const
-
- Returns \c true if this date is different from \a d; otherwise
- returns \c false.
-*/
-
-/*!
- \fn bool QDate::operator<(const QDate &d) const
-
- Returns \c true if this date is earlier than \a d; otherwise returns
- false.
-*/
-
-/*!
- \fn bool QDate::operator<=(const QDate &d) const
-
- Returns \c true if this date is earlier than or equal to \a d;
- otherwise returns \c false.
-*/
-
-/*!
- \fn bool QDate::operator>(const QDate &d) const
-
- Returns \c true if this date is later than \a d; otherwise returns
- false.
-*/
-
-/*!
- \fn bool QDate::operator>=(const QDate &d) const
-
- Returns \c true if this date is later than or equal to \a d;
- otherwise returns \c false.
-*/
-
-/*!
- \fn QDate::currentDate()
- Returns the current date, as reported by the system clock.
-
- \sa QTime::currentTime(), QDateTime::currentDateTime()
-*/
-
-#if QT_CONFIG(datestring)
-/*!
- \fn QDate QDate::fromString(const QString &string, Qt::DateFormat format)
-
- Returns the QDate represented by the \a string, using the
- \a format given, or an invalid date if the string cannot be
- parsed.
-
- Note for Qt::TextDate: It is recommended that you use the
- English short month names (e.g. "Jan"). Although localized month
- names can also be used, they depend on the user's locale settings.
-
- \sa toString(), QLocale::toDate()
-*/
-QDate QDate::fromString(const QString& string, Qt::DateFormat format)
-{
- if (string.isEmpty())
- return QDate();
-
- switch (format) {
- case Qt::SystemLocaleDate:
- case Qt::SystemLocaleShortDate:
- return QLocale::system().toDate(string, QLocale::ShortFormat);
- case Qt::SystemLocaleLongDate:
- return QLocale::system().toDate(string, QLocale::LongFormat);
- case Qt::LocaleDate:
- case Qt::DefaultLocaleShortDate:
- return QLocale().toDate(string, QLocale::ShortFormat);
- case Qt::DefaultLocaleLongDate:
- return QLocale().toDate(string, QLocale::LongFormat);
- case Qt::RFC2822Date:
- return rfcDateImpl(string).date;
- default:
-#if QT_CONFIG(textdate)
- case Qt::TextDate: {
- QVector<QStringRef> parts = string.splitRef(QLatin1Char(' '), QString::SkipEmptyParts);
-
- if (parts.count() != 4)
- return QDate();
-
- QStringRef monthName = parts.at(1);
- const int month = fromShortMonthName(monthName);
- if (month == -1) {
- // Month name matches neither English nor other localised name.
- return QDate();
- }
-
- bool ok = false;
- int year = parts.at(3).toInt(&ok);
- if (!ok)
- return QDate();
-
- return QDate(year, month, parts.at(2).toInt());
- }
-#endif // textdate
- case Qt::ISODate: {
- // Semi-strict parsing, must be long enough and have non-numeric separators
- if (string.size() < 10 || string.at(4).isDigit() || string.at(7).isDigit()
- || (string.size() > 10 && string.at(10).isDigit())) {
- return QDate();
- }
- const int year = string.midRef(0, 4).toInt();
- if (year <= 0 || year > 9999)
- return QDate();
- return QDate(year, string.midRef(5, 2).toInt(), string.midRef(8, 2).toInt());
- }
- }
- return QDate();
-}
-
-/*!
- \fn QDate QDate::fromString(const QString &string, const QString &format)
-
- Returns the QDate represented by the \a string, using the \a
- format given, or an invalid date if the string cannot be parsed.
-
- These expressions may be used for the format:
-
- \table
- \header \li Expression \li Output
- \row \li d \li The day as a number without a leading zero (1 to 31)
- \row \li dd \li The day as a number with a leading zero (01 to 31)
- \row \li ddd
- \li The abbreviated localized day name (e.g. 'Mon' to 'Sun').
- Uses the system locale to localize the name, i.e. QLocale::system().
- \row \li dddd
- \li The long localized day name (e.g. 'Monday' to 'Sunday').
- Uses the system locale to localize the name, i.e. QLocale::system().
- \row \li M \li The month as a number without a leading zero (1 to 12)
- \row \li MM \li The month as a number with a leading zero (01 to 12)
- \row \li MMM
- \li The abbreviated localized month name (e.g. 'Jan' to 'Dec').
- Uses the system locale to localize the name, i.e. QLocale::system().
- \row \li MMMM
- \li The long localized month name (e.g. 'January' to 'December').
- Uses the system locale to localize the name, i.e. QLocale::system().
- \row \li yy \li The year as two digit number (00 to 99)
- \row \li yyyy \li The year as four digit number. If the year is negative,
- a minus sign is prepended in addition.
- \endtable
-
- All other input characters will be treated as text. Any sequence
- of characters that are enclosed in single quotes will also be
- treated as text and will not be used as an expression. For example:
-
- \snippet code/src_corelib_tools_qdatetime.cpp 1
-
- If the format is not satisfied, an invalid QDate is returned. The
- expressions that don't expect leading zeroes (d, M) will be
- greedy. This means that they will use two digits even if this
- will put them outside the accepted range of values and leaves too
- few digits for other sections. For example, the following format
- string could have meant January 30 but the M will grab two
- digits, resulting in an invalid date:
-
- \snippet code/src_corelib_tools_qdatetime.cpp 2
-
- For any field that is not represented in the format the following
- defaults are used:
-
- \table
- \header \li Field \li Default value
- \row \li Year \li 1900
- \row \li Month \li 1
- \row \li Day \li 1
- \endtable
-
- The following examples demonstrate the default values:
-
- \snippet code/src_corelib_tools_qdatetime.cpp 3
-
- \sa toString(), QDateTime::fromString(), QTime::fromString(),
- QLocale::toDate()
-*/
-
-QDate QDate::fromString(const QString &string, const QString &format)
-{
- QDate date;
-#if QT_CONFIG(datetimeparser)
- QDateTimeParser dt(QVariant::Date, QDateTimeParser::FromString);
- // dt.setDefaultLocale(QLocale::c()); ### Qt 6
- if (dt.parseFormat(format))
- dt.fromString(string, &date, 0);
-#else
- Q_UNUSED(string);
- Q_UNUSED(format);
-#endif
- return date;
-}
-#endif // datestring
-
-/*!
- \overload
-
- Returns \c true if the specified date (\a year, \a month, and \a
- day) is valid; otherwise returns \c false.
-
- Example:
- \snippet code/src_corelib_tools_qdatetime.cpp 4
-
- \sa isNull(), setDate()
-*/
-
-bool QDate::isValid(int year, int month, int day)
-{
- // there is no year 0 in the Gregorian calendar
- if (year == 0)
- return false;
-
- return (day > 0 && month > 0 && month <= 12) &&
- (day <= monthDays[month] || (day == 29 && month == 2 && isLeapYear(year)));
-}
-
-/*!
- \fn bool QDate::isLeapYear(int year)
-
- Returns \c true if the specified \a year is a leap year; otherwise
- returns \c false.
-*/
-
-bool QDate::isLeapYear(int y)
-{
- // No year 0 in Gregorian calendar, so -1, -5, -9 etc are leap years
- if ( y < 1)
- ++y;
-
- return (y % 4 == 0 && y % 100 != 0) || y % 400 == 0;
-}
-
-/*! \fn static QDate QDate::fromJulianDay(qint64 jd)
-
- Converts the Julian day \a jd to a QDate.
-
- \sa toJulianDay()
-*/
-
-/*! \fn int QDate::toJulianDay() const
-
- Converts the date to a Julian day.
-
- \sa fromJulianDay()
-*/
-
-/*****************************************************************************
- QTime member functions
- *****************************************************************************/
-
-/*!
- \class QTime
- \inmodule QtCore
- \reentrant
-
- \brief The QTime class provides clock time functions.
-
-
- A QTime object contains a clock time, which it can express as the
- numbers of hours, minutes, seconds, and milliseconds since
- midnight. It can read the current time from the system clock and
- measure a span of elapsed time. It provides functions for
- comparing times and for manipulating a time by adding a number of
- milliseconds.
-
- QTime uses the 24-hour clock format; it has no concept of AM/PM.
- Unlike QDateTime, QTime knows nothing about time zones or
- daylight-saving time (DST).
-
- A QTime object is typically created either by giving the number of hours,
- minutes, seconds, and milliseconds explicitly, or by using the static
- function currentTime(), which creates a QTime object that represents the
- system's local time.
-
- The hour(), minute(), second(), and msec() functions provide
- access to the number of hours, minutes, seconds, and milliseconds
- of the time. The same information is provided in textual format by
- the toString() function.
-
- The addSecs() and addMSecs() functions provide the time a given
- number of seconds or milliseconds later than a given time.
- Correspondingly, the number of seconds or milliseconds
- between two times can be found using secsTo() or msecsTo().
-
- QTime provides a full set of operators to compare two QTime
- objects; an earlier time is considered smaller than a later one;
- if A.msecsTo(B) is positive, then A < B.
-
- QTime can be used to measure a span of elapsed time using the
- start(), restart(), and elapsed() functions.
-
- \sa QDate, QDateTime
-*/
-
-/*!
- \fn QTime::QTime()
-
- Constructs a null time object. A null time can be a QTime(0, 0, 0, 0)
- (i.e., midnight) object, except that isNull() returns \c true and isValid()
- returns \c false.
-
- \sa isNull(), isValid()
-*/
-
-/*!
- Constructs a time with hour \a h, minute \a m, seconds \a s and
- milliseconds \a ms.
-
- \a h must be in the range 0 to 23, \a m and \a s must be in the
- range 0 to 59, and \a ms must be in the range 0 to 999.
-
- \sa isValid()
-*/
-
-QTime::QTime(int h, int m, int s, int ms)
-{
- setHMS(h, m, s, ms);
-}
-
-
-/*!
- \fn bool QTime::isNull() const
-
- Returns \c true if the time is null (i.e., the QTime object was
- constructed using the default constructor); otherwise returns
- false. A null time is also an invalid time.
-
- \sa isValid()
-*/
-
-/*!
- Returns \c true if the time is valid; otherwise returns \c false. For example,
- the time 23:30:55.746 is valid, but 24:12:30 is invalid.
-
- \sa isNull()
-*/
-
-bool QTime::isValid() const
-{
- return mds > NullTime && mds < MSECS_PER_DAY;
-}
-
-
-/*!
- Returns the hour part (0 to 23) of the time.
-
- Returns -1 if the time is invalid.
-
- \sa minute(), second(), msec()
-*/
-
-int QTime::hour() const
-{
- if (!isValid())
- return -1;
-
- return ds() / MSECS_PER_HOUR;
-}
-
-/*!
- Returns the minute part (0 to 59) of the time.
-
- Returns -1 if the time is invalid.
-
- \sa hour(), second(), msec()
-*/
-
-int QTime::minute() const
-{
- if (!isValid())
- return -1;
-
- return (ds() % MSECS_PER_HOUR) / MSECS_PER_MIN;
-}
-
-/*!
- Returns the second part (0 to 59) of the time.
-
- Returns -1 if the time is invalid.
-
- \sa hour(), minute(), msec()
-*/
-
-int QTime::second() const
-{
- if (!isValid())
- return -1;
-
- return (ds() / 1000)%SECS_PER_MIN;
-}
-
-/*!
- Returns the millisecond part (0 to 999) of the time.
-
- Returns -1 if the time is invalid.
-
- \sa hour(), minute(), second()
-*/
-
-int QTime::msec() const
-{
- if (!isValid())
- return -1;
-
- return ds() % 1000;
-}
-
-#if QT_CONFIG(datestring)
-/*!
- \overload
-
- Returns the time as a string. The \a format parameter determines
- the format of the string.
-
- If \a format is Qt::TextDate, the string format is HH:mm:ss;
- e.g. 1 second before midnight would be "23:59:59".
-
- If \a format is Qt::ISODate, the string format corresponds to the
- ISO 8601 extended specification for representations of dates,
- represented by HH:mm:ss. To include milliseconds in the ISO 8601
- date, use the \a format Qt::ISODateWithMs, which corresponds to
- HH:mm:ss.zzz.
-
- If the \a format is Qt::SystemLocaleShortDate or
- Qt::SystemLocaleLongDate, the string format depends on the locale
- settings of the system. Identical to calling
- QLocale::system().toString(time, QLocale::ShortFormat) or
- QLocale::system().toString(time, QLocale::LongFormat).
-
- If the \a format is Qt::DefaultLocaleShortDate or
- Qt::DefaultLocaleLongDate, the string format depends on the
- default application locale. This is the locale set with
- QLocale::setDefault(), or the system locale if no default locale
- has been set. Identical to calling
-
- \l {QLocale::toString()}{QLocale().toString(time, QLocale::ShortFormat)} or
- \l {QLocale::toString()}{QLocale().toString(time, QLocale::LongFormat)}.
-
- If the \a format is Qt::RFC2822Date, the string is formatted in
- an \l{RFC 2822} compatible way. An example of this formatting is
- "23:59:20".
-
- If the time is invalid, an empty string will be returned.
-
- \sa fromString(), QDate::toString(), QDateTime::toString(), QLocale::toString()
-*/
-
-QString QTime::toString(Qt::DateFormat format) const
-{
- if (!isValid())
- return QString();
-
- switch (format) {
- case Qt::SystemLocaleDate:
- case Qt::SystemLocaleShortDate:
- return QLocale::system().toString(*this, QLocale::ShortFormat);
- case Qt::SystemLocaleLongDate:
- return QLocale::system().toString(*this, QLocale::LongFormat);
- case Qt::LocaleDate:
- case Qt::DefaultLocaleShortDate:
- return QLocale().toString(*this, QLocale::ShortFormat);
- case Qt::DefaultLocaleLongDate:
- return QLocale().toString(*this, QLocale::LongFormat);
- case Qt::ISODateWithMs:
- return QString::asprintf("%02d:%02d:%02d.%03d", hour(), minute(), second(), msec());
- case Qt::RFC2822Date:
- case Qt::ISODate:
- case Qt::TextDate:
- default:
- return QString::asprintf("%02d:%02d:%02d", hour(), minute(), second());
- }
-}
-
-/*!
- \fn QString QTime::toString(const QString &format) const
- \fn QString QTime::toString(QStringView format) const
-
- Returns the time as a string. The \a format parameter determines
- the format of the result string.
-
- These expressions may be used:
-
- \table
- \header \li Expression \li Output
- \row \li h
- \li the hour without a leading zero (0 to 23 or 1 to 12 if AM/PM display)
- \row \li hh
- \li the hour with a leading zero (00 to 23 or 01 to 12 if AM/PM display)
- \row \li H
- \li the hour without a leading zero (0 to 23, even with AM/PM display)
- \row \li HH
- \li the hour with a leading zero (00 to 23, even with AM/PM display)
- \row \li m \li the minute without a leading zero (0 to 59)
- \row \li mm \li the minute with a leading zero (00 to 59)
- \row \li s \li the whole second, without any leading zero (0 to 59)
- \row \li ss \li the whole second, with a leading zero where applicable (00 to 59)
- \row \li z \li the fractional part of the second, to go after a decimal
- point, without trailing zeroes (0 to 999). Thus "\c{s.z}"
- reports the seconds to full available (millisecond) precision
- without trailing zeroes.
- \row \li zzz \li the fractional part of the second, to millisecond
- precision, including trailing zeroes where applicable (000 to 999).
- \row \li AP or A
- \li use AM/PM display. \e A/AP will be replaced by either
- QLocale::amText() or QLocale::pmText().
- \row \li ap or a
- \li use am/pm display. \e a/ap will be replaced by a lower-case version of
- QLocale::amText() or QLocale::pmText().
- \row \li t \li the timezone (for example "CEST")
- \endtable
-
- Any sequence of characters enclosed in single quotes will be included
- verbatim in the output string (stripped of the quotes), even if it contains
- formatting characters. Two consecutive single quotes ("''") are replaced by
- a single quote in the output. All other characters in the format string are
- included verbatim in the output string.
-
- Formats without separators (e.g. "ddMM") are supported but must be used with
- care, as the resulting strings aren't always reliably readable (e.g. if "dM"
- produces "212" it could mean either the 2nd of December or the 21st of
- February).
-
- Example format strings (assuming that the QTime is 14:13:09.042 and the system
- locale is \c{en_US})
-
- \table
- \header \li Format \li Result
- \row \li hh:mm:ss.zzz \li 14:13:09.042
- \row \li h:m:s ap \li 2:13:9 pm
- \row \li H:m:s a \li 14:13:9 pm
- \endtable
-
- If the time is invalid, an empty string will be returned.
- If \a format is empty, the default format "hh:mm:ss" is used.
-
- \sa fromString(), QDate::toString(), QDateTime::toString(), QLocale::toString()
-*/
-QString QTime::toString(QStringView format) const
-{
- return QLocale::system().toString(*this, format); // QLocale::c() ### Qt6
-}
-
-#if QT_STRINGVIEW_VERSION < 2
-QString QTime::toString(const QString &format) const
-{
- return toString(qToStringViewIgnoringNull(format));
-}
-#endif
-
-#endif // datestring
-
-/*!
- Sets the time to hour \a h, minute \a m, seconds \a s and
- milliseconds \a ms.
-
- \a h must be in the range 0 to 23, \a m and \a s must be in the
- range 0 to 59, and \a ms must be in the range 0 to 999.
- Returns \c true if the set time is valid; otherwise returns \c false.
-
- \sa isValid()
-*/
-
-bool QTime::setHMS(int h, int m, int s, int ms)
-{
- if (!isValid(h,m,s,ms)) {
- mds = NullTime; // make this invalid
- return false;
- }
- mds = (h*SECS_PER_HOUR + m*SECS_PER_MIN + s)*1000 + ms;
- return true;
-}
-
-/*!
- Returns a QTime object containing a time \a s seconds later
- than the time of this object (or earlier if \a s is negative).
-
- Note that the time will wrap if it passes midnight.
-
- Returns a null time if this time is invalid.
-
- Example:
-
- \snippet code/src_corelib_tools_qdatetime.cpp 5
-
- \sa addMSecs(), secsTo(), QDateTime::addSecs()
-*/
-
-QTime QTime::addSecs(int s) const
-{
- s %= SECS_PER_DAY;
- return addMSecs(s * 1000);
-}
-
-/*!
- Returns the number of seconds from this time to \a t.
- If \a t is earlier than this time, the number of seconds returned
- is negative.
-
- Because QTime measures time within a day and there are 86400
- seconds in a day, the result is always between -86400 and 86400.
-
- secsTo() does not take into account any milliseconds.
-
- Returns 0 if either time is invalid.
-
- \sa addSecs(), QDateTime::secsTo()
-*/
-
-int QTime::secsTo(const QTime &t) const
-{
- if (!isValid() || !t.isValid())
- return 0;
-
- // Truncate milliseconds as we do not want to consider them.
- int ourSeconds = ds() / 1000;
- int theirSeconds = t.ds() / 1000;
- return theirSeconds - ourSeconds;
-}
-
-/*!
- Returns a QTime object containing a time \a ms milliseconds later
- than the time of this object (or earlier if \a ms is negative).
-
- Note that the time will wrap if it passes midnight. See addSecs()
- for an example.
-
- Returns a null time if this time is invalid.
-
- \sa addSecs(), msecsTo(), QDateTime::addMSecs()
-*/
-
-QTime QTime::addMSecs(int ms) const
-{
- QTime t;
- if (isValid()) {
- if (ms < 0) {
- // %,/ not well-defined for -ve, so always work with +ve.
- int negdays = (MSECS_PER_DAY - ms) / MSECS_PER_DAY;
- t.mds = (ds() + ms + negdays * MSECS_PER_DAY) % MSECS_PER_DAY;
- } else {
- t.mds = (ds() + ms) % MSECS_PER_DAY;
- }
- }
- return t;
-}
-
-/*!
- Returns the number of milliseconds from this time to \a t.
- If \a t is earlier than this time, the number of milliseconds returned
- is negative.
-
- Because QTime measures time within a day and there are 86400
- seconds in a day, the result is always between -86400000 and
- 86400000 ms.
-
- Returns 0 if either time is invalid.
-
- \sa secsTo(), addMSecs(), QDateTime::msecsTo()
-*/
-
-int QTime::msecsTo(const QTime &t) const
-{
- if (!isValid() || !t.isValid())
- return 0;
- return t.ds() - ds();
-}
-
-
-/*!
- \fn bool QTime::operator==(const QTime &t) const
-
- Returns \c true if this time is equal to \a t; otherwise returns \c false.
-*/
-
-/*!
- \fn bool QTime::operator!=(const QTime &t) const
-
- Returns \c true if this time is different from \a t; otherwise returns \c false.
-*/
-
-/*!
- \fn bool QTime::operator<(const QTime &t) const
-
- Returns \c true if this time is earlier than \a t; otherwise returns \c false.
-*/
-
-/*!
- \fn bool QTime::operator<=(const QTime &t) const
-
- Returns \c true if this time is earlier than or equal to \a t;
- otherwise returns \c false.
-*/
-
-/*!
- \fn bool QTime::operator>(const QTime &t) const
-
- Returns \c true if this time is later than \a t; otherwise returns \c false.
-*/
-
-/*!
- \fn bool QTime::operator>=(const QTime &t) const
-
- Returns \c true if this time is later than or equal to \a t;
- otherwise returns \c false.
-*/
-
-/*!
- \fn QTime QTime::fromMSecsSinceStartOfDay(int msecs)
-
- Returns a new QTime instance with the time set to the number of \a msecs
- since the start of the day, i.e. since 00:00:00.
-
- If \a msecs falls outside the valid range an invalid QTime will be returned.
-
- \sa msecsSinceStartOfDay()
-*/
-
-/*!
- \fn int QTime::msecsSinceStartOfDay() const
-
- Returns the number of msecs since the start of the day, i.e. since 00:00:00.
-
- \sa fromMSecsSinceStartOfDay()
-*/
-
-/*!
- \fn QTime::currentTime()
-
- Returns the current time as reported by the system clock.
-
- Note that the accuracy depends on the accuracy of the underlying
- operating system; not all systems provide 1-millisecond accuracy.
-
- Furthermore, currentTime() only increases within each day; it shall drop by
- 24 hours each time midnight passes; and, beside this, changes in it may not
- correspond to elapsed time, if a daylight-saving transition intervenes.
-
- \sa QDateTime::currentDateTime(), QDateTime::currentDateTimeUtc()
-*/
-
-#if QT_CONFIG(datestring)
-
-static QTime fromIsoTimeString(const QStringRef &string, Qt::DateFormat format, bool *isMidnight24)
-{
- if (isMidnight24)
- *isMidnight24 = false;
-
- const int size = string.size();
- if (size < 5)
- return QTime();
-
- bool ok = false;
- int hour = string.mid(0, 2).toInt(&ok);
- if (!ok)
- return QTime();
- const int minute = string.mid(3, 2).toInt(&ok);
- if (!ok)
- return QTime();
- int second = 0;
- int msec = 0;
-
- if (size == 5) {
- // HH:mm format
- second = 0;
- msec = 0;
- } else if (string.at(5) == QLatin1Char(',') || string.at(5) == QLatin1Char('.')) {
- if (format == Qt::TextDate)
- return QTime();
- // ISODate HH:mm.ssssss format
- // We only want 5 digits worth of fraction of minute. This follows the existing
- // behavior that determines how milliseconds are read; 4 millisecond digits are
- // read and then rounded to 3. If we read at most 5 digits for fraction of minute,
- // the maximum amount of millisecond digits it will expand to once converted to
- // seconds is 4. E.g. 12:34,99999 will expand to 12:34:59.9994. The milliseconds
- // will then be rounded up AND clamped to 999.
-
- const QStringRef minuteFractionStr = string.mid(6, 5);
- const long minuteFractionInt = minuteFractionStr.toLong(&ok);
- if (!ok)
- return QTime();
- const float minuteFraction = double(minuteFractionInt) / (std::pow(double(10), minuteFractionStr.count()));
-
- const float secondWithMs = minuteFraction * 60;
- const float secondNoMs = std::floor(secondWithMs);
- const float secondFraction = secondWithMs - secondNoMs;
- second = secondNoMs;
- msec = qMin(qRound(secondFraction * 1000.0), 999);
- } else {
- // HH:mm:ss or HH:mm:ss.zzz
- second = string.mid(6, 2).toInt(&ok);
- if (!ok)
- return QTime();
- if (size > 8 && (string.at(8) == QLatin1Char(',') || string.at(8) == QLatin1Char('.'))) {
- const QStringRef msecStr(string.mid(9, 4));
- int msecInt = msecStr.isEmpty() ? 0 : msecStr.toInt(&ok);
- if (!ok)
- return QTime();
- const double secondFraction(msecInt / (std::pow(double(10), msecStr.count())));
- msec = qMin(qRound(secondFraction * 1000.0), 999);
- }
- }
-
- const bool isISODate = format == Qt::ISODate || format == Qt::ISODateWithMs;
- if (isISODate && hour == 24 && minute == 0 && second == 0 && msec == 0) {
- if (isMidnight24)
- *isMidnight24 = true;
- hour = 0;
- }
-
- return QTime(hour, minute, second, msec);
-}
-
-/*!
- \fn QTime QTime::fromString(const QString &string, Qt::DateFormat format)
-
- Returns the time represented in the \a string as a QTime using the
- \a format given, or an invalid time if this is not possible.
-
- Note that fromString() uses a "C" locale encoded string to convert
- milliseconds to a float value. If the default locale is not "C",
- this may result in two conversion attempts (if the conversion
- fails for the default locale). This should be considered an
- implementation detail.
-
- \sa toString(), QLocale::toTime()
-*/
-QTime QTime::fromString(const QString& string, Qt::DateFormat format)
-{
- if (string.isEmpty())
- return QTime();
-
- switch (format) {
- case Qt::SystemLocaleDate:
- case Qt::SystemLocaleShortDate:
- return QLocale::system().toTime(string, QLocale::ShortFormat);
- case Qt::SystemLocaleLongDate:
- return QLocale::system().toTime(string, QLocale::LongFormat);
- case Qt::LocaleDate:
- case Qt::DefaultLocaleShortDate:
- return QLocale().toTime(string, QLocale::ShortFormat);
- case Qt::DefaultLocaleLongDate:
- return QLocale().toTime(string, QLocale::LongFormat);
- case Qt::RFC2822Date:
- return rfcDateImpl(string).time;
- case Qt::ISODate:
- case Qt::ISODateWithMs:
- case Qt::TextDate:
- default:
- return fromIsoTimeString(QStringRef(&string), format, 0);
- }
-}
-
-/*!
- \fn QTime QTime::fromString(const QString &string, const QString &format)
-
- Returns the QTime represented by the \a string, using the \a
- format given, or an invalid time if the string cannot be parsed.
-
- These expressions may be used for the format:
-
- \table
- \header \li Expression \li Output
- \row \li h
- \li the hour without a leading zero (0 to 23 or 1 to 12 if AM/PM display)
- \row \li hh
- \li the hour with a leading zero (00 to 23 or 01 to 12 if AM/PM display)
- \row \li m \li the minute without a leading zero (0 to 59)
- \row \li mm \li the minute with a leading zero (00 to 59)
- \row \li s \li the whole second, without any leading zero (0 to 59)
- \row \li ss \li the whole second, with a leading zero where applicable (00 to 59)
- \row \li z \li the fractional part of the second, to go after a decimal
- point, without trailing zeroes (0 to 999). Thus "\c{s.z}"
- reports the seconds to full available (millisecond) precision
- without trailing zeroes.
- \row \li zzz \li the fractional part of the second, to millisecond
- precision, including trailing zeroes where applicable (000 to 999).
- \row \li AP
- \li interpret as an AM/PM time. \e AP must be either "AM" or "PM".
- \row \li ap
- \li Interpret as an AM/PM time. \e ap must be either "am" or "pm".
- \endtable
-
- All other input characters will be treated as text. Any sequence
- of characters that are enclosed in single quotes will also be
- treated as text and not be used as an expression.
-
- \snippet code/src_corelib_tools_qdatetime.cpp 6
-
- If the format is not satisfied, an invalid QTime is returned.
- Expressions that do not expect leading zeroes to be given (h, m, s
- and z) are greedy. This means that they will use two digits even if
- this puts them outside the range of accepted values and leaves too
- few digits for other sections. For example, the following string
- could have meant 00:07:10, but the m will grab two digits, resulting
- in an invalid time:
-
- \snippet code/src_corelib_tools_qdatetime.cpp 7
-
- Any field that is not represented in the format will be set to zero.
- For example:
-
- \snippet code/src_corelib_tools_qdatetime.cpp 8
-
- \sa toString(), QDateTime::fromString(), QDate::fromString(),
- QLocale::toTime()
-*/
-
-QTime QTime::fromString(const QString &string, const QString &format)
-{
- QTime time;
-#if QT_CONFIG(datetimeparser)
- QDateTimeParser dt(QVariant::Time, QDateTimeParser::FromString);
- // dt.setDefaultLocale(QLocale::c()); ### Qt 6
- if (dt.parseFormat(format))
- dt.fromString(string, 0, &time);
-#else
- Q_UNUSED(string);
- Q_UNUSED(format);
-#endif
- return time;
-}
-
-#endif // datestring
-
-
-/*!
- \overload
-
- Returns \c true if the specified time is valid; otherwise returns
- false.
-
- The time is valid if \a h is in the range 0 to 23, \a m and
- \a s are in the range 0 to 59, and \a ms is in the range 0 to 999.
-
- Example:
-
- \snippet code/src_corelib_tools_qdatetime.cpp 9
-*/
-
-bool QTime::isValid(int h, int m, int s, int ms)
-{
- return (uint)h < 24 && (uint)m < 60 && (uint)s < 60 && (uint)ms < 1000;
-}
-
-
-/*!
- Sets this time to the current time. This is practical for timing:
-
- \snippet code/src_corelib_tools_qdatetime.cpp 10
-
- \sa restart(), elapsed(), currentTime()
-*/
-
-void QTime::start()
-{
- *this = currentTime();
-}
-
-/*!
- Sets this time to the current time and returns the number of
- milliseconds that have elapsed since the last time start() or
- restart() was called.
-
- This function is guaranteed to be atomic and is thus very handy
- for repeated measurements. Call start() to start the first
- measurement, and restart() for each later measurement.
-
- Note that the counter wraps to zero 24 hours after the last call
- to start() or restart().
-
- \warning If the system's clock setting has been changed since the
- last time start() or restart() was called, the result is
- undefined. This can happen when daylight-saving time is turned on
- or off.
-
- \sa start(), elapsed(), currentTime()
-*/
-
-int QTime::restart()
-{
- QTime t = currentTime();
- int n = msecsTo(t);
- if (n < 0) // passed midnight
- n += 86400*1000;
- *this = t;
- return n;
-}
-
-/*!
- Returns the number of milliseconds that have elapsed since the
- last time start() or restart() was called.
-
- Note that the counter wraps to zero 24 hours after the last call
- to start() or restart.
-
- Note that the accuracy depends on the accuracy of the underlying
- operating system; not all systems provide 1-millisecond accuracy.
-
- \warning If the system's clock setting has been changed since the
- last time start() or restart() was called, the result is
- undefined. This can happen when daylight-saving time is turned on
- or off.
-
- \sa start(), restart()
-*/
-
-int QTime::elapsed() const
-{
- int n = msecsTo(currentTime());
- if (n < 0) // passed midnight
- n += 86400 * 1000;
- return n;
-}
-
-/*****************************************************************************
- QDateTime static helper functions
- *****************************************************************************/
-
-// get the types from QDateTime (through QDateTimePrivate)
-typedef QDateTimePrivate::QDateTimeShortData ShortData;
-typedef QDateTimePrivate::QDateTimeData QDateTimeData;
-
-// Returns the platform variant of timezone, i.e. the standard time offset
-// The timezone external variable is documented as always holding the
-// Standard Time offset as seconds west of Greenwich, i.e. UTC+01:00 is -3600
-// Note this may not be historicaly accurate.
-// Relies on tzset, mktime, or localtime having been called to populate timezone
-static int qt_timezone()
-{
-#if defined(_MSC_VER)
- long offset;
- _get_timezone(&offset);
- return offset;
-#elif defined(Q_OS_BSD4) && !defined(Q_OS_DARWIN)
- time_t clock = time(NULL);
- struct tm t;
- localtime_r(&clock, &t);
- // QTBUG-36080 Workaround for systems without the POSIX timezone
- // variable. This solution is not very efficient but fixing it is up to
- // the libc implementations.
- //
- // tm_gmtoff has some important differences compared to the timezone
- // variable:
- // - It returns the number of seconds east of UTC, and we want the
- // number of seconds west of UTC.
- // - It also takes DST into account, so we need to adjust it to always
- // get the Standard Time offset.
- return -t.tm_gmtoff + (t.tm_isdst ? (long)SECS_PER_HOUR : 0L);
-#elif defined(Q_OS_INTEGRITY)
- return 0;
-#else
- return timezone;
-#endif // Q_OS_WIN
-}
-
-// Returns the tzname, assume tzset has been called already
-static QString qt_tzname(QDateTimePrivate::DaylightStatus daylightStatus)
-{
- int isDst = (daylightStatus == QDateTimePrivate::DaylightTime) ? 1 : 0;
-#if defined(Q_CC_MSVC)
- size_t s = 0;
- char name[512];
- if (_get_tzname(&s, name, 512, isDst))
- return QString();
- return QString::fromLocal8Bit(name);
-#else
- return QString::fromLocal8Bit(tzname[isDst]);
-#endif // Q_OS_WIN
-}
-
-#if QT_CONFIG(datetimeparser) && QT_CONFIG(timezone)
-/*
- \internal
- Implemented here to share qt_tzname()
-*/
-int QDateTimeParser::startsWithLocalTimeZone(const QStringRef name)
-{
- QDateTimePrivate::DaylightStatus zones[2] = {
- QDateTimePrivate::StandardTime,
- QDateTimePrivate::DaylightTime
- };
- for (const auto z : zones) {
- QString zone(qt_tzname(z));
- if (name.startsWith(zone))
- return zone.size();
- }
- return 0;
-}
-#endif // datetimeparser && timezone
-
-// Calls the platform variant of mktime for the given date, time and daylightStatus,
-// and updates the date, time, daylightStatus and abbreviation with the returned values
-// If the date falls outside the 1970 to 2037 range supported by mktime / time_t
-// then null date/time will be returned, you should adjust the date first if
-// you need a guaranteed result.
-static qint64 qt_mktime(QDate *date, QTime *time, QDateTimePrivate::DaylightStatus *daylightStatus,
- QString *abbreviation, bool *ok = 0)
-{
- const qint64 msec = time->msec();
- int yy, mm, dd;
- date->getDate(&yy, &mm, &dd);
-
- // All other platforms provide standard C library time functions
- tm local;
- memset(&local, 0, sizeof(local)); // tm_[wy]day plus any non-standard fields
- local.tm_sec = time->second();
- local.tm_min = time->minute();
- local.tm_hour = time->hour();
- local.tm_mday = dd;
- local.tm_mon = mm - 1;
- local.tm_year = yy - 1900;
- if (daylightStatus)
- local.tm_isdst = int(*daylightStatus);
- else
- local.tm_isdst = -1;
-
-#if defined(Q_OS_WIN)
- int hh = local.tm_hour;
-#endif // Q_OS_WIN
- time_t secsSinceEpoch = qMkTime(&local);
- if (secsSinceEpoch != time_t(-1)) {
- *date = QDate(local.tm_year + 1900, local.tm_mon + 1, local.tm_mday);
- *time = QTime(local.tm_hour, local.tm_min, local.tm_sec, msec);
-#if defined(Q_OS_WIN)
- // Windows mktime for the missing hour subtracts 1 hour from the time
- // instead of adding 1 hour. If time differs and is standard time then
- // this has happened, so add 2 hours to the time and 1 hour to the msecs
- if (local.tm_isdst == 0 && local.tm_hour != hh) {
- if (time->hour() >= 22)
- *date = date->addDays(1);
- *time = time->addSecs(2 * SECS_PER_HOUR);
- secsSinceEpoch += SECS_PER_HOUR;
- local.tm_isdst = 1;
- }
-#endif // Q_OS_WIN
- if (local.tm_isdst >= 1) {
- if (daylightStatus)
- *daylightStatus = QDateTimePrivate::DaylightTime;
- if (abbreviation)
- *abbreviation = qt_tzname(QDateTimePrivate::DaylightTime);
- } else if (local.tm_isdst == 0) {
- if (daylightStatus)
- *daylightStatus = QDateTimePrivate::StandardTime;
- if (abbreviation)
- *abbreviation = qt_tzname(QDateTimePrivate::StandardTime);
- } else {
- if (daylightStatus)
- *daylightStatus = QDateTimePrivate::UnknownDaylightTime;
- if (abbreviation)
- *abbreviation = qt_tzname(QDateTimePrivate::StandardTime);
- }
- if (ok)
- *ok = true;
- } else {
- *date = QDate();
- *time = QTime();
- if (daylightStatus)
- *daylightStatus = QDateTimePrivate::UnknownDaylightTime;
- if (abbreviation)
- *abbreviation = QString();
- if (ok)
- *ok = false;
- }
-
- return ((qint64)secsSinceEpoch * 1000) + msec;
-}
-
-// Calls the platform variant of localtime for the given msecs, and updates
-// the date, time, and DST status with the returned values.
-static bool qt_localtime(qint64 msecsSinceEpoch, QDate *localDate, QTime *localTime,
- QDateTimePrivate::DaylightStatus *daylightStatus)
-{
- const time_t secsSinceEpoch = msecsSinceEpoch / 1000;
- const int msec = msecsSinceEpoch % 1000;
-
- tm local;
- bool valid = false;
-
- // localtime() is specified to work as if it called tzset().
- // localtime_r() does not have this constraint, so make an explicit call.
- // The explicit call should also request the timezone info be re-parsed.
- qTzSet();
-#if QT_CONFIG(thread) && defined(_POSIX_THREAD_SAFE_FUNCTIONS)
- // Use the reentrant version of localtime() where available
- // as is thread-safe and doesn't use a shared static data area
- tm *res = 0;
- res = localtime_r(&secsSinceEpoch, &local);
- if (res)
- valid = true;
-#elif defined(Q_CC_MSVC)
- if (!_localtime64_s(&local, &secsSinceEpoch))
- valid = true;
-#else
- // Returns shared static data which may be overwritten at any time
- // So copy the result asap
- tm *res = 0;
- res = localtime(&secsSinceEpoch);
- if (res) {
- local = *res;
- valid = true;
- }
-#endif
- if (valid) {
- *localDate = QDate(local.tm_year + 1900, local.tm_mon + 1, local.tm_mday);
- *localTime = QTime(local.tm_hour, local.tm_min, local.tm_sec, msec);
- if (daylightStatus) {
- if (local.tm_isdst > 0)
- *daylightStatus = QDateTimePrivate::DaylightTime;
- else if (local.tm_isdst < 0)
- *daylightStatus = QDateTimePrivate::UnknownDaylightTime;
- else
- *daylightStatus = QDateTimePrivate::StandardTime;
- }
- return true;
- } else {
- *localDate = QDate();
- *localTime = QTime();
- if (daylightStatus)
- *daylightStatus = QDateTimePrivate::UnknownDaylightTime;
- return false;
- }
-}
-
-// Converts an msecs value into a date and time
-static void msecsToTime(qint64 msecs, QDate *date, QTime *time)
-{
- qint64 jd = JULIAN_DAY_FOR_EPOCH;
- qint64 ds = 0;
-
- if (qAbs(msecs) >= MSECS_PER_DAY) {
- jd += (msecs / MSECS_PER_DAY);
- msecs %= MSECS_PER_DAY;
- }
-
- if (msecs < 0) {
- ds = MSECS_PER_DAY - msecs - 1;
- jd -= ds / MSECS_PER_DAY;
- ds = ds % MSECS_PER_DAY;
- ds = MSECS_PER_DAY - ds - 1;
- } else {
- ds = msecs;
- }
-
- if (date)
- *date = QDate::fromJulianDay(jd);
- if (time)
- *time = QTime::fromMSecsSinceStartOfDay(ds);
-}
-
-// Converts a date/time value into msecs
-static qint64 timeToMSecs(const QDate &date, const QTime &time)
-{
- return ((date.toJulianDay() - JULIAN_DAY_FOR_EPOCH) * MSECS_PER_DAY)
- + time.msecsSinceStartOfDay();
-}
-
-// Convert an MSecs Since Epoch into Local Time
-static bool epochMSecsToLocalTime(qint64 msecs, QDate *localDate, QTime *localTime,
- QDateTimePrivate::DaylightStatus *daylightStatus = 0)
-{
- if (msecs < 0) {
- // Docs state any LocalTime before 1970-01-01 will *not* have any Daylight Time applied
- // Instead just use the standard offset from UTC to convert to UTC time
- qTzSet();
- msecsToTime(msecs - qt_timezone() * 1000, localDate, localTime);
- if (daylightStatus)
- *daylightStatus = QDateTimePrivate::StandardTime;
- return true;
- } else if (msecs > (qint64(TIME_T_MAX) * 1000)) {
- // Docs state any LocalTime after 2037-12-31 *will* have any DST applied
- // but this may fall outside the supported time_t range, so need to fake it.
- // Use existing method to fake the conversion, but this is deeply flawed as it may
- // apply the conversion from the wrong day number, e.g. if rule is last Sunday of month
- // TODO Use QTimeZone when available to apply the future rule correctly
- QDate utcDate;
- QTime utcTime;
- msecsToTime(msecs, &utcDate, &utcTime);
- int year, month, day;
- utcDate.getDate(&year, &month, &day);
- // 2037 is not a leap year, so make sure date isn't Feb 29
- if (month == 2 && day == 29)
- --day;
- QDate fakeDate(2037, month, day);
- qint64 fakeMsecs = QDateTime(fakeDate, utcTime, Qt::UTC).toMSecsSinceEpoch();
- bool res = qt_localtime(fakeMsecs, localDate, localTime, daylightStatus);
- *localDate = localDate->addDays(fakeDate.daysTo(utcDate));
- return res;
- } else {
- // Falls inside time_t suported range so can use localtime
- return qt_localtime(msecs, localDate, localTime, daylightStatus);
- }
-}
-
-// Convert a LocalTime expressed in local msecs encoding and the corresponding
-// DST status into a UTC epoch msecs. Optionally populate the returned
-// values from mktime for the adjusted local date and time.
-static qint64 localMSecsToEpochMSecs(qint64 localMsecs,
- QDateTimePrivate::DaylightStatus *daylightStatus,
- QDate *localDate = 0, QTime *localTime = 0,
- QString *abbreviation = 0)
-{
- QDate dt;
- QTime tm;
- msecsToTime(localMsecs, &dt, &tm);
-
- const qint64 msecsMax = qint64(TIME_T_MAX) * 1000;
-
- if (localMsecs <= qint64(MSECS_PER_DAY)) {
-
- // Docs state any LocalTime before 1970-01-01 will *not* have any DST applied
-
- // First, if localMsecs is within +/- 1 day of minimum time_t try mktime in case it does
- // fall after minimum and needs proper DST conversion
- if (localMsecs >= -qint64(MSECS_PER_DAY)) {
- bool valid;
- qint64 utcMsecs = qt_mktime(&dt, &tm, daylightStatus, abbreviation, &valid);
- if (valid && utcMsecs >= 0) {
- // mktime worked and falls in valid range, so use it
- if (localDate)
- *localDate = dt;
- if (localTime)
- *localTime = tm;
- return utcMsecs;
- }
- } else {
- // If we don't call mktime then need to call tzset to get offset
- qTzSet();
- }
- // Time is clearly before 1970-01-01 so just use standard offset to convert
- qint64 utcMsecs = localMsecs + qt_timezone() * 1000;
- if (localDate || localTime)
- msecsToTime(localMsecs, localDate, localTime);
- if (daylightStatus)
- *daylightStatus = QDateTimePrivate::StandardTime;
- if (abbreviation)
- *abbreviation = qt_tzname(QDateTimePrivate::StandardTime);
- return utcMsecs;
-
- } else if (localMsecs >= msecsMax - MSECS_PER_DAY) {
-
- // Docs state any LocalTime after 2037-12-31 *will* have any DST applied
- // but this may fall outside the supported time_t range, so need to fake it.
-
- // First, if localMsecs is within +/- 1 day of maximum time_t try mktime in case it does
- // fall before maximum and can use proper DST conversion
- if (localMsecs <= msecsMax + MSECS_PER_DAY) {
- bool valid;
- qint64 utcMsecs = qt_mktime(&dt, &tm, daylightStatus, abbreviation, &valid);
- if (valid && utcMsecs <= msecsMax) {
- // mktime worked and falls in valid range, so use it
- if (localDate)
- *localDate = dt;
- if (localTime)
- *localTime = tm;
- return utcMsecs;
- }
- }
- // Use existing method to fake the conversion, but this is deeply flawed as it may
- // apply the conversion from the wrong day number, e.g. if rule is last Sunday of month
- // TODO Use QTimeZone when available to apply the future rule correctly
- int year, month, day;
- dt.getDate(&year, &month, &day);
- // 2037 is not a leap year, so make sure date isn't Feb 29
- if (month == 2 && day == 29)
- --day;
- QDate fakeDate(2037, month, day);
- qint64 fakeDiff = fakeDate.daysTo(dt);
- qint64 utcMsecs = qt_mktime(&fakeDate, &tm, daylightStatus, abbreviation);
- if (localDate)
- *localDate = fakeDate.addDays(fakeDiff);
- if (localTime)
- *localTime = tm;
- QDate utcDate;
- QTime utcTime;
- msecsToTime(utcMsecs, &utcDate, &utcTime);
- utcDate = utcDate.addDays(fakeDiff);
- utcMsecs = timeToMSecs(utcDate, utcTime);
- return utcMsecs;
-
- } else {
-
- // Clearly falls inside 1970-2037 suported range so can use mktime
- qint64 utcMsecs = qt_mktime(&dt, &tm, daylightStatus, abbreviation);
- if (localDate)
- *localDate = dt;
- if (localTime)
- *localTime = tm;
- return utcMsecs;
-
- }
-}
-
-static inline bool specCanBeSmall(Qt::TimeSpec spec)
-{
- return spec == Qt::LocalTime || spec == Qt::UTC;
-}
-
-static inline bool msecsCanBeSmall(qint64 msecs)
-{
- if (!QDateTimeData::CanBeSmall)
- return false;
-
- ShortData sd;
- sd.msecs = qintptr(msecs);
- return sd.msecs == msecs;
-}
-
-static Q_DECL_CONSTEXPR inline
-QDateTimePrivate::StatusFlags mergeSpec(QDateTimePrivate::StatusFlags status, Qt::TimeSpec spec)
-{
- return QDateTimePrivate::StatusFlags((status & ~QDateTimePrivate::TimeSpecMask) |
- (int(spec) << QDateTimePrivate::TimeSpecShift));
-}
-
-static Q_DECL_CONSTEXPR inline Qt::TimeSpec extractSpec(QDateTimePrivate::StatusFlags status)
-{
- return Qt::TimeSpec((status & QDateTimePrivate::TimeSpecMask) >> QDateTimePrivate::TimeSpecShift);
-}
-
-// Set the Daylight Status if LocalTime set via msecs
-static Q_DECL_RELAXED_CONSTEXPR inline QDateTimePrivate::StatusFlags
-mergeDaylightStatus(QDateTimePrivate::StatusFlags sf, QDateTimePrivate::DaylightStatus status)
-{
- sf &= ~QDateTimePrivate::DaylightMask;
- if (status == QDateTimePrivate::DaylightTime) {
- sf |= QDateTimePrivate::SetToDaylightTime;
- } else if (status == QDateTimePrivate::StandardTime) {
- sf |= QDateTimePrivate::SetToStandardTime;
- }
- return sf;
-}
-
-// Get the DST Status if LocalTime set via msecs
-static Q_DECL_RELAXED_CONSTEXPR inline
-QDateTimePrivate::DaylightStatus extractDaylightStatus(QDateTimePrivate::StatusFlags status)
-{
- if (status & QDateTimePrivate::SetToDaylightTime)
- return QDateTimePrivate::DaylightTime;
- if (status & QDateTimePrivate::SetToStandardTime)
- return QDateTimePrivate::StandardTime;
- return QDateTimePrivate::UnknownDaylightTime;
-}
-
-static inline qint64 getMSecs(const QDateTimeData &d)
-{
- if (d.isShort()) {
- // same as, but producing better code
- //return d.data.msecs;
- return qintptr(d.d) >> 8;
- }
- return d->m_msecs;
-}
-
-static inline QDateTimePrivate::StatusFlags getStatus(const QDateTimeData &d)
-{
- if (d.isShort()) {
- // same as, but producing better code
- //return StatusFlag(d.data.status);
- return QDateTimePrivate::StatusFlag(qintptr(d.d) & 0xFF);
- }
- return d->m_status;
-}
-
-static inline Qt::TimeSpec getSpec(const QDateTimeData &d)
-{
- return extractSpec(getStatus(d));
-}
-
-#if QT_CONFIG(timezone)
-void QDateTimePrivate::setUtcOffsetByTZ(qint64 atMSecsSinceEpoch)
-{
- m_offsetFromUtc = m_timeZone.d->offsetFromUtc(atMSecsSinceEpoch);
-}
-#endif
-
-// Refresh the LocalTime validity and offset
-static void refreshDateTime(QDateTimeData &d)
-{
- auto status = getStatus(d);
- const auto spec = extractSpec(status);
- const qint64 msecs = getMSecs(d);
- qint64 epochMSecs = 0;
- int offsetFromUtc = 0;
- QDate testDate;
- QTime testTime;
- Q_ASSERT(spec == Qt::TimeZone || spec == Qt::LocalTime);
-
-#if QT_CONFIG(timezone)
- // If not valid time zone then is invalid
- if (spec == Qt::TimeZone) {
- if (!d->m_timeZone.isValid()) {
- status &= ~QDateTimePrivate::ValidDateTime;
- } else {
- epochMSecs = QDateTimePrivate::zoneMSecsToEpochMSecs(msecs, d->m_timeZone, extractDaylightStatus(status), &testDate, &testTime);
- d->setUtcOffsetByTZ(epochMSecs);
- }
- }
-#endif // timezone
-
- // If not valid date and time then is invalid
- if (!(status & QDateTimePrivate::ValidDate) || !(status & QDateTimePrivate::ValidTime)) {
- status &= ~QDateTimePrivate::ValidDateTime;
- if (status & QDateTimePrivate::ShortData) {
- d.data.status = status;
- } else {
- d->m_status = status;
- d->m_offsetFromUtc = 0;
- }
- return;
- }
-
- // We have a valid date and time and a Qt::LocalTime or Qt::TimeZone that needs calculating
- // LocalTime and TimeZone might fall into a "missing" DST transition hour
- // Calling toEpochMSecs will adjust the returned date/time if it does
- if (spec == Qt::LocalTime) {
- auto dstStatus = extractDaylightStatus(status);
- epochMSecs = localMSecsToEpochMSecs(msecs, &dstStatus, &testDate, &testTime);
- }
- if (timeToMSecs(testDate, testTime) == msecs) {
- status |= QDateTimePrivate::ValidDateTime;
- // Cache the offset to use in offsetFromUtc()
- offsetFromUtc = (msecs - epochMSecs) / 1000;
- } else {
- status &= ~QDateTimePrivate::ValidDateTime;
- }
-
- if (status & QDateTimePrivate::ShortData) {
- d.data.status = status;
- } else {
- d->m_status = status;
- d->m_offsetFromUtc = offsetFromUtc;
- }
-}
-
-// Check the UTC / offsetFromUTC validity
-static void checkValidDateTime(QDateTimeData &d)
-{
- auto status = getStatus(d);
- auto spec = extractSpec(status);
- switch (spec) {
- case Qt::OffsetFromUTC:
- case Qt::UTC:
- // for these, a valid date and a valid time imply a valid QDateTime
- if ((status & QDateTimePrivate::ValidDate) && (status & QDateTimePrivate::ValidTime))
- status |= QDateTimePrivate::ValidDateTime;
- else
- status &= ~QDateTimePrivate::ValidDateTime;
- if (status & QDateTimePrivate::ShortData)
- d.data.status = status;
- else
- d->m_status = status;
- break;
- case Qt::TimeZone:
- case Qt::LocalTime:
- // for these, we need to check whether the timezone is valid and whether
- // the time is valid in that timezone. Expensive, but no other option.
- refreshDateTime(d);
- break;
- }
-}
-
-static void setTimeSpec(QDateTimeData &d, Qt::TimeSpec spec, int offsetSeconds)
-{
- auto status = getStatus(d);
- status &= ~(QDateTimePrivate::ValidDateTime | QDateTimePrivate::DaylightMask |
- QDateTimePrivate::TimeSpecMask);
-
- switch (spec) {
- case Qt::OffsetFromUTC:
- if (offsetSeconds == 0)
- spec = Qt::UTC;
- break;
- case Qt::TimeZone:
- // Use system time zone instead
- spec = Qt::LocalTime;
- Q_FALLTHROUGH();
- case Qt::UTC:
- case Qt::LocalTime:
- offsetSeconds = 0;
- break;
- }
-
- status = mergeSpec(status, spec);
- if (d.isShort() && offsetSeconds == 0) {
- d.data.status = status;
- } else {
- d.detach();
- d->m_status = status & ~QDateTimePrivate::ShortData;
- d->m_offsetFromUtc = offsetSeconds;
-#if QT_CONFIG(timezone)
- d->m_timeZone = QTimeZone();
-#endif // timezone
- }
-}
-
-static void setDateTime(QDateTimeData &d, const QDate &date, const QTime &time)
-{
- // If the date is valid and the time is not we set time to 00:00:00
- QTime useTime = time;
- if (!useTime.isValid() && date.isValid())
- useTime = QTime::fromMSecsSinceStartOfDay(0);
-
- QDateTimePrivate::StatusFlags newStatus = 0;
-
- // Set date value and status
- qint64 days = 0;
- if (date.isValid()) {
- days = date.toJulianDay() - JULIAN_DAY_FOR_EPOCH;
- newStatus = QDateTimePrivate::ValidDate;
- }
-
- // Set time value and status
- int ds = 0;
- if (useTime.isValid()) {
- ds = useTime.msecsSinceStartOfDay();
- newStatus |= QDateTimePrivate::ValidTime;
- }
-
- // Set msecs serial value
- qint64 msecs = (days * MSECS_PER_DAY) + ds;
- if (d.isShort()) {
- // let's see if we can keep this short
- if (msecsCanBeSmall(msecs)) {
- // yes, we can
- d.data.msecs = qintptr(msecs);
- d.data.status &= ~(QDateTimePrivate::ValidityMask | QDateTimePrivate::DaylightMask);
- d.data.status |= newStatus;
- } else {
- // nope...
- d.detach();
- }
- }
- if (!d.isShort()) {
- d.detach();
- d->m_msecs = msecs;
- d->m_status &= ~(QDateTimePrivate::ValidityMask | QDateTimePrivate::DaylightMask);
- d->m_status |= newStatus;
- }
-
- // Set if date and time are valid
- checkValidDateTime(d);
-}
-
-static QPair<QDate, QTime> getDateTime(const QDateTimeData &d)
-{
- QPair<QDate, QTime> result;
- qint64 msecs = getMSecs(d);
- auto status = getStatus(d);
- msecsToTime(msecs, &result.first, &result.second);
-
- if (!status.testFlag(QDateTimePrivate::ValidDate))
- result.first = QDate();
-
- if (!status.testFlag(QDateTimePrivate::ValidTime))
- result.second = QTime();
-
- return result;
-}
-
-/*****************************************************************************
- QDateTime::Data member functions
- *****************************************************************************/
-
-inline QDateTime::Data::Data()
-{
- // default-constructed data has a special exception:
- // it can be small even if CanBeSmall == false
- // (optimization so we don't allocate memory in the default constructor)
- quintptr value = quintptr(mergeSpec(QDateTimePrivate::ShortData, Qt::LocalTime));
- d = reinterpret_cast<QDateTimePrivate *>(value);
-}
-
-inline QDateTime::Data::Data(Qt::TimeSpec spec)
-{
- if (CanBeSmall && Q_LIKELY(specCanBeSmall(spec))) {
- d = reinterpret_cast<QDateTimePrivate *>(quintptr(mergeSpec(QDateTimePrivate::ShortData, spec)));
- } else {
- // the structure is too small, we need to detach
- d = new QDateTimePrivate;
- d->ref.ref();
- d->m_status = mergeSpec(0, spec);
- }
-}
-
-inline QDateTime::Data::Data(const Data &other)
- : d(other.d)
-{
- if (!isShort()) {
- // check if we could shrink
- if (specCanBeSmall(extractSpec(d->m_status)) && msecsCanBeSmall(d->m_msecs)) {
- ShortData sd;
- sd.msecs = qintptr(d->m_msecs);
- sd.status = d->m_status | QDateTimePrivate::ShortData;
- data = sd;
- } else {
- // no, have to keep it big
- d->ref.ref();
- }
- }
-}
-
-inline QDateTime::Data::Data(Data &&other)
- : d(other.d)
-{
- // reset the other to a short state
- Data dummy;
- Q_ASSERT(dummy.isShort());
- other.d = dummy.d;
-}
-
-inline QDateTime::Data &QDateTime::Data::operator=(const Data &other)
-{
- if (d == other.d)
- return *this;
-
- auto x = d;
- d = other.d;
- if (!other.isShort()) {
- // check if we could shrink
- if (specCanBeSmall(extractSpec(other.d->m_status)) && msecsCanBeSmall(other.d->m_msecs)) {
- ShortData sd;
- sd.msecs = qintptr(other.d->m_msecs);
- sd.status = other.d->m_status | QDateTimePrivate::ShortData;
- data = sd;
- } else {
- // no, have to keep it big
- other.d->ref.ref();
- }
- }
-
- if (!(quintptr(x) & QDateTimePrivate::ShortData) && !x->ref.deref())
- delete x;
- return *this;
-}
-
-inline QDateTime::Data::~Data()
-{
- if (!isShort() && !d->ref.deref())
- delete d;
-}
-
-inline bool QDateTime::Data::isShort() const
-{
- bool b = quintptr(d) & QDateTimePrivate::ShortData;
-
- // sanity check:
- Q_ASSERT(b || (d->m_status & QDateTimePrivate::ShortData) == 0);
-
- // even if CanBeSmall = false, we have short data for a default-constructed
- // QDateTime object. But it's unlikely.
- if (CanBeSmall)
- return Q_LIKELY(b);
- return Q_UNLIKELY(b);
-}
-
-inline void QDateTime::Data::detach()
-{
- QDateTimePrivate *x;
- bool wasShort = isShort();
- if (wasShort) {
- // force enlarging
- x = new QDateTimePrivate;
- x->m_status = QDateTimePrivate::StatusFlag(data.status & ~QDateTimePrivate::ShortData);
- x->m_msecs = data.msecs;
- } else {
- if (d->ref.load() == 1)
- return;
-
- x = new QDateTimePrivate(*d);
- }
-
- x->ref.store(1);
- if (!wasShort && !d->ref.deref())
- delete d;
- d = x;
-}
-
-inline const QDateTimePrivate *QDateTime::Data::operator->() const
-{
- Q_ASSERT(!isShort());
- return d;
-}
-
-inline QDateTimePrivate *QDateTime::Data::operator->()
-{
- // should we attempt to detach here?
- Q_ASSERT(!isShort());
- Q_ASSERT(d->ref.load() == 1);
- return d;
-}
-
-/*****************************************************************************
- QDateTimePrivate member functions
- *****************************************************************************/
-
-Q_NEVER_INLINE
-QDateTime::Data QDateTimePrivate::create(const QDate &toDate, const QTime &toTime, Qt::TimeSpec toSpec,
- int offsetSeconds)
-{
- QDateTime::Data result(toSpec);
- setTimeSpec(result, toSpec, offsetSeconds);
- setDateTime(result, toDate, toTime);
- return result;
-}
-
-#if QT_CONFIG(timezone)
-inline QDateTime::Data QDateTimePrivate::create(const QDate &toDate, const QTime &toTime,
- const QTimeZone &toTimeZone)
-{
- QDateTime::Data result(Qt::TimeZone);
- Q_ASSERT(!result.isShort());
-
- result.d->m_status = mergeSpec(result.d->m_status, Qt::TimeZone);
- result.d->m_timeZone = toTimeZone;
- setDateTime(result, toDate, toTime);
- return result;
-}
-
-// Convert a TimeZone time expressed in zone msecs encoding into a UTC epoch msecs
-// DST transitions are disambiguated by hint.
-inline qint64 QDateTimePrivate::zoneMSecsToEpochMSecs(qint64 zoneMSecs, const QTimeZone &zone,
- DaylightStatus hint,
- QDate *zoneDate, QTime *zoneTime)
-{
- // Get the effective data from QTimeZone
- QTimeZonePrivate::Data data = zone.d->dataForLocalTime(zoneMSecs, int(hint));
- // Docs state any time before 1970-01-01 will *not* have any DST applied
- // but all affected times afterwards will have DST applied.
- if (data.atMSecsSinceEpoch < 0) {
- msecsToTime(zoneMSecs, zoneDate, zoneTime);
- return zoneMSecs - data.standardTimeOffset * 1000;
- } else {
- msecsToTime(data.atMSecsSinceEpoch + data.offsetFromUtc * 1000, zoneDate, zoneTime);
- return data.atMSecsSinceEpoch;
- }
-}
-#endif // timezone
-
-/*****************************************************************************
- QDateTime member functions
- *****************************************************************************/
-
-/*!
- \class QDateTime
- \inmodule QtCore
- \ingroup shared
- \reentrant
- \brief The QDateTime class provides date and time functions.
-
-
- A QDateTime object encodes a calendar date and a clock time (a
- "datetime"). It combines features of the QDate and QTime classes.
- It can read the current datetime from the system clock. It
- provides functions for comparing datetimes and for manipulating a
- datetime by adding a number of seconds, days, months, or years.
-
- QDateTime can describe datetimes with respect to \l{Qt::LocalTime}{local
- time}, to \l{Qt::UTC}{UTC}, to a specified \l{Qt::OffsetFromUTC}{offset
- from UTC} or to a specified \l{Qt::TimeZone}{time zone}, in conjunction
- with the QTimeZone class. For example, a time zone of "Europe/Berlin" will
- apply the daylight-saving rules as used in Germany since 1970. In contrast,
- an offset from UTC of +3600 seconds is one hour ahead of UTC (usually
- written in ISO standard notation as "UTC+01:00"), with no daylight-saving
- offset or changes. When using either local time or a specified time zone,
- time-zone transitions such as the starts and ends of daylight-saving time
- (DST) are taken into account. The choice of system used to represent a
- datetime is described as its "timespec".
-
- A QDateTime object is typically created either by giving a date and time
- explicitly in the constructor, or by using a static function such as
- currentDateTime() or fromMSecsSinceEpoch(). The date and time can be changed
- with setDate() and setTime(). A datetime can also be set using the
- setMSecsSinceEpoch() function that takes the time, in milliseconds, since
- 00:00:00 on January 1, 1970. The fromString() function returns a QDateTime,
- given a string and a date format used to interpret the date within the
- string.
-
- QDateTime::currentDateTime() returns a QDateTime that expresses the current
- time with respect to local time. QDateTime::currentDateTimeUtc() returns a
- QDateTime that expresses the current time with respect to UTC.
-
- The date() and time() functions provide access to the date and
- time parts of the datetime. The same information is provided in
- textual format by the toString() function.
-
- QDateTime provides a full set of operators to compare two
- QDateTime objects, where smaller means earlier and larger means
- later.
-
- You can increment (or decrement) a datetime by a given number of
- milliseconds using addMSecs(), seconds using addSecs(), or days using
- addDays(). Similarly, you can use addMonths() and addYears(). The daysTo()
- function returns the number of days between two datetimes, secsTo() returns
- the number of seconds between two datetimes, and msecsTo() returns the
- number of milliseconds between two datetimes. These operations are aware of
- daylight-saving time (DST) and other time-zone transitions, where
- applicable.
-
- Use toTimeSpec() to express a datetime in local time or UTC,
- toOffsetFromUtc() to express in terms of an offset from UTC, or toTimeZone()
- to express it with respect to a general time zone. You can use timeSpec() to
- find out what time-spec a QDateTime object stores its time relative to. When
- that is Qt::TimeZone, you can use timeZone() to find out which zone it is
- using.
-
- \note QDateTime does not account for leap seconds.
-
- \section1 Remarks
-
- \section2 No Year 0
-
- There is no year 0. Dates in that year are considered invalid. The
- year -1 is the year "1 before Christ" or "1 before current era."
- The day before 1 January 1 CE is 31 December 1 BCE.
-
- \section2 Range of Valid Dates
-
- The range of values that QDateTime can represent is dependent on the
- internal storage implementation. QDateTime is currently stored in a qint64
- as a serial msecs value encoding the date and time. This restricts the date
- range to about +/- 292 million years, compared to the QDate range of +/- 2
- billion years. Care must be taken when creating a QDateTime with extreme
- values that you do not overflow the storage. The exact range of supported
- values varies depending on the Qt::TimeSpec and time zone.
-
- \section2 Use of Timezones
-
- QDateTime uses the system's time zone information to determine the current
- local time zone and its offset from UTC. If the system is not configured
- correctly or not up-to-date, QDateTime will give wrong results.
-
- QDateTime likewise uses system-provided information to determine the offsets
- of other timezones from UTC. If this information is incomplete or out of
- date, QDateTime will give wrong results. See the QTimeZone documentation for
- more details.
-
- On modern Unix systems, this means QDateTime usually has accurate
- information about historical transitions (including DST, see below) whenever
- possible. On Windows, where the system doesn't support historical timezone
- data, historical accuracy is not maintained with respect to timezone
- transitions, notably including DST.
-
- \section2 Daylight-Saving Time (DST)
-
- QDateTime takes into account transitions between Standard Time and
- Daylight-Saving Time. For example, if the transition is at 2am and the clock
- goes forward to 3am, then there is a "missing" hour from 02:00:00 to
- 02:59:59.999 which QDateTime considers to be invalid. Any date arithmetic
- performed will take this missing hour into account and return a valid
- result. For example, adding one minute to 01:59:59 will get 03:00:00.
-
- The range of valid dates taking DST into account is 1970-01-01 to the
- present, and rules are in place for handling DST correctly until 2037-12-31,
- but these could change. For dates falling outside that range, QDateTime
- makes a \e{best guess} using the rules for year 1970 or 2037, but we can't
- guarantee accuracy. This means QDateTime doesn't take into account changes
- in a time zone before 1970, even if the system's time zone database provides
- that information.
-
- \section2 Offsets From UTC
-
- There is no explicit size restriction on an offset from UTC, but there is an
- implicit limit imposed when using the toString() and fromString() methods
- which use a [+|-]hh:mm format, effectively limiting the range to +/- 99
- hours and 59 minutes and whole minutes only. Note that currently no time
- zone lies outside the range of +/- 14 hours.
-
- \sa QDate, QTime, QDateTimeEdit, QTimeZone
-*/
-
-/*!
- Constructs a null datetime (i.e. null date and null time). A null
- datetime is invalid, since the date is invalid.
-
- \sa isValid()
-*/
-QDateTime::QDateTime() Q_DECL_NOEXCEPT_EXPR(Data::CanBeSmall)
-{
-}
-
-
-/*!
- Constructs a datetime with the given \a date, a valid
- time(00:00:00.000), and sets the timeSpec() to Qt::LocalTime.
-*/
-
-QDateTime::QDateTime(const QDate &date)
- : d(QDateTimePrivate::create(date, QTime(0, 0, 0), Qt::LocalTime, 0))
-{
-}
-
-/*!
- Constructs a datetime with the given \a date and \a time, using
- the time specification defined by \a spec.
-
- If \a date is valid and \a time is not, the time will be set to midnight.
-
- If \a spec is Qt::OffsetFromUTC then it will be set to Qt::UTC, i.e. an
- offset of 0 seconds. To create a Qt::OffsetFromUTC datetime use the
- correct constructor.
-
- If \a spec is Qt::TimeZone then the spec will be set to Qt::LocalTime,
- i.e. the current system time zone. To create a Qt::TimeZone datetime
- use the correct constructor.
-*/
-
-QDateTime::QDateTime(const QDate &date, const QTime &time, Qt::TimeSpec spec)
- : d(QDateTimePrivate::create(date, time, spec, 0))
-{
-}
-
-/*!
- \since 5.2
-
- Constructs a datetime with the given \a date and \a time, using
- the time specification defined by \a spec and \a offsetSeconds seconds.
-
- If \a date is valid and \a time is not, the time will be set to midnight.
-
- If the \a spec is not Qt::OffsetFromUTC then \a offsetSeconds will be ignored.
-
- If the \a spec is Qt::OffsetFromUTC and \a offsetSeconds is 0 then the
- timeSpec() will be set to Qt::UTC, i.e. an offset of 0 seconds.
-
- If \a spec is Qt::TimeZone then the spec will be set to Qt::LocalTime,
- i.e. the current system time zone. To create a Qt::TimeZone datetime
- use the correct constructor.
-*/
-
-QDateTime::QDateTime(const QDate &date, const QTime &time, Qt::TimeSpec spec, int offsetSeconds)
- : d(QDateTimePrivate::create(date, time, spec, offsetSeconds))
-{
-}
-
-#if QT_CONFIG(timezone)
-/*!
- \since 5.2
-
- Constructs a datetime with the given \a date and \a time, using
- the Time Zone specified by \a timeZone.
-
- If \a date is valid and \a time is not, the time will be set to 00:00:00.
-
- If \a timeZone is invalid then the datetime will be invalid.
-*/
-
-QDateTime::QDateTime(const QDate &date, const QTime &time, const QTimeZone &timeZone)
- : d(QDateTimePrivate::create(date, time, timeZone))
-{
-}
-#endif // timezone
-
-/*!
- Constructs a copy of the \a other datetime.
-*/
-QDateTime::QDateTime(const QDateTime &other) Q_DECL_NOTHROW
- : d(other.d)
-{
-}
-
-/*!
- \since 5.8
- Moves the content of the temporary \a other datetime to this object and
- leaves \a other in an unspecified (but proper) state.
-*/
-QDateTime::QDateTime(QDateTime &&other) Q_DECL_NOTHROW
- : d(std::move(other.d))
-{
-}
-
-/*!
- Destroys the datetime.
-*/
-QDateTime::~QDateTime()
-{
-}
-
-/*!
- Makes a copy of the \a other datetime and returns a reference to the
- copy.
-*/
-
-QDateTime &QDateTime::operator=(const QDateTime &other) Q_DECL_NOTHROW
-{
- d = other.d;
- return *this;
-}
-/*!
- \fn void QDateTime::swap(QDateTime &other)
- \since 5.0
-
- Swaps this datetime with \a other. This operation is very fast
- and never fails.
-*/
-
-/*!
- Returns \c true if both the date and the time are null; otherwise
- returns \c false. A null datetime is invalid.
-
- \sa QDate::isNull(), QTime::isNull(), isValid()
-*/
-
-bool QDateTime::isNull() const
-{
- auto status = getStatus(d);
- return !status.testFlag(QDateTimePrivate::ValidDate) &&
- !status.testFlag(QDateTimePrivate::ValidTime);
-}
-
-/*!
- Returns \c true if both the date and the time are valid and they are valid in
- the current Qt::TimeSpec, otherwise returns \c false.
-
- If the timeSpec() is Qt::LocalTime or Qt::TimeZone then the date and time are
- checked to see if they fall in the Standard Time to Daylight-Saving Time transition
- hour, i.e. if the transition is at 2am and the clock goes forward to 3am
- then the time from 02:00:00 to 02:59:59.999 is considered to be invalid.
-
- \sa QDate::isValid(), QTime::isValid()
-*/
-
-bool QDateTime::isValid() const
-{
- auto status = getStatus(d);
- return status & QDateTimePrivate::ValidDateTime;
-}
-
-/*!
- Returns the date part of the datetime.
-
- \sa setDate(), time(), timeSpec()
-*/
-
-QDate QDateTime::date() const
-{
- auto status = getStatus(d);
- if (!status.testFlag(QDateTimePrivate::ValidDate))
- return QDate();
- QDate dt;
- msecsToTime(getMSecs(d), &dt, 0);
- return dt;
-}
-
-/*!
- Returns the time part of the datetime.
-
- \sa setTime(), date(), timeSpec()
-*/
-
-QTime QDateTime::time() const
-{
- auto status = getStatus(d);
- if (!status.testFlag(QDateTimePrivate::ValidTime))
- return QTime();
- QTime tm;
- msecsToTime(getMSecs(d), 0, &tm);
- return tm;
-}
-
-/*!
- Returns the time specification of the datetime.
-
- \sa setTimeSpec(), date(), time(), Qt::TimeSpec
-*/
-
-Qt::TimeSpec QDateTime::timeSpec() const
-{
- return getSpec(d);
-}
-
-#if QT_CONFIG(timezone)
-/*!
- \since 5.2
-
- Returns the time zone of the datetime.
-
- If the timeSpec() is Qt::LocalTime then an instance of the current system
- time zone will be returned. Note however that if you copy this time zone
- the instance will not remain in sync if the system time zone changes.
-
- \sa setTimeZone(), Qt::TimeSpec
-*/
-
-QTimeZone QDateTime::timeZone() const
-{
- switch (getSpec(d)) {
- case Qt::UTC:
- return QTimeZone::utc();
- case Qt::OffsetFromUTC:
- return QTimeZone(d->m_offsetFromUtc);
- case Qt::TimeZone:
- Q_ASSERT(d->m_timeZone.isValid());
- return d->m_timeZone;
- case Qt::LocalTime:
- return QTimeZone::systemTimeZone();
- }
- return QTimeZone();
-}
-#endif // timezone
-
-/*!
- \since 5.2
-
- Returns the current Offset From UTC in seconds.
-
- If the timeSpec() is Qt::OffsetFromUTC this will be the value originally set.
-
- If the timeSpec() is Qt::TimeZone this will be the offset effective in the
- Time Zone including any Daylight-Saving Offset.
-
- If the timeSpec() is Qt::LocalTime this will be the difference between the
- Local Time and UTC including any Daylight-Saving Offset.
-
- If the timeSpec() is Qt::UTC this will be 0.
-
- \sa setOffsetFromUtc()
-*/
-
-int QDateTime::offsetFromUtc() const
-{
- if (!d.isShort())
- return d->m_offsetFromUtc;
- if (!isValid())
- return 0;
-
- auto spec = getSpec(d);
- if (spec == Qt::LocalTime) {
- // we didn't cache the value, so we need to calculate it now...
- qint64 msecs = getMSecs(d);
- return (msecs - toMSecsSinceEpoch()) / 1000;
- }
-
- Q_ASSERT(spec == Qt::UTC);
- return 0;
-}
-
-/*!
- \since 5.2
-
- Returns the Time Zone Abbreviation for the datetime.
-
- If the timeSpec() is Qt::UTC this will be "UTC".
-
- If the timeSpec() is Qt::OffsetFromUTC this will be in the format
- "UTC[+-]00:00".
-
- If the timeSpec() is Qt::LocalTime then the host system is queried for the
- correct abbreviation.
-
- Note that abbreviations may or may not be localized.
-
- Note too that the abbreviation is not guaranteed to be a unique value,
- i.e. different time zones may have the same abbreviation.
-
- \sa timeSpec()
-*/
-
-QString QDateTime::timeZoneAbbreviation() const
-{
- switch (getSpec(d)) {
- case Qt::UTC:
- return QLatin1String("UTC");
- case Qt::OffsetFromUTC:
- return QLatin1String("UTC") + toOffsetString(Qt::ISODate, d->m_offsetFromUtc);
- case Qt::TimeZone:
-#if !QT_CONFIG(timezone)
- break;
-#else
- return d->m_timeZone.d->abbreviation(toMSecsSinceEpoch());
-#endif // timezone
- case Qt::LocalTime: {
- QString abbrev;
- auto status = extractDaylightStatus(getStatus(d));
- localMSecsToEpochMSecs(getMSecs(d), &status, 0, 0, &abbrev);
- return abbrev;
- }
- }
- return QString();
-}
-
-/*!
- \since 5.2
-
- Returns if this datetime falls in Daylight-Saving Time.
-
- If the Qt::TimeSpec is not Qt::LocalTime or Qt::TimeZone then will always
- return false.
-
- \sa timeSpec()
-*/
-
-bool QDateTime::isDaylightTime() const
-{
- switch (getSpec(d)) {
- case Qt::UTC:
- case Qt::OffsetFromUTC:
- return false;
- case Qt::TimeZone:
-#if !QT_CONFIG(timezone)
- break;
-#else
- return d->m_timeZone.d->isDaylightTime(toMSecsSinceEpoch());
-#endif // timezone
- case Qt::LocalTime: {
- auto status = extractDaylightStatus(getStatus(d));
- if (status == QDateTimePrivate::UnknownDaylightTime)
- localMSecsToEpochMSecs(getMSecs(d), &status);
- return (status == QDateTimePrivate::DaylightTime);
- }
- }
- return false;
-}
-
-/*!
- Sets the date part of this datetime to \a date. If no time is set yet, it
- is set to midnight. If \a date is invalid, this QDateTime becomes invalid.
-
- \sa date(), setTime(), setTimeSpec()
-*/
-
-void QDateTime::setDate(const QDate &date)
-{
- setDateTime(d, date, time());
-}
-
-/*!
- Sets the time part of this datetime to \a time. If \a time is not valid,
- this function sets it to midnight. Therefore, it's possible to clear any
- set time in a QDateTime by setting it to a default QTime:
-
- \code
- QDateTime dt = QDateTime::currentDateTime();
- dt.setTime(QTime());
- \endcode
-
- \sa time(), setDate(), setTimeSpec()
-*/
-
-void QDateTime::setTime(const QTime &time)
-{
- setDateTime(d, date(), time);
-}
-
-/*!
- Sets the time specification used in this datetime to \a spec.
- The datetime will refer to a different point in time.
-
- If \a spec is Qt::OffsetFromUTC then the timeSpec() will be set
- to Qt::UTC, i.e. an effective offset of 0.
-
- If \a spec is Qt::TimeZone then the spec will be set to Qt::LocalTime,
- i.e. the current system time zone.
-
- Example:
- \snippet code/src_corelib_tools_qdatetime.cpp 19
-
- \sa timeSpec(), setDate(), setTime(), setTimeZone(), Qt::TimeSpec
-*/
-
-void QDateTime::setTimeSpec(Qt::TimeSpec spec)
-{
- QT_PREPEND_NAMESPACE(setTimeSpec(d, spec, 0));
- checkValidDateTime(d);
-}
-
-/*!
- \since 5.2
-
- Sets the timeSpec() to Qt::OffsetFromUTC and the offset to \a offsetSeconds.
- The datetime will refer to a different point in time.
-
- The maximum and minimum offset is 14 positive or negative hours. If
- \a offsetSeconds is larger or smaller than that, then the result is
- undefined.
-
- If \a offsetSeconds is 0 then the timeSpec() will be set to Qt::UTC.
-
- \sa isValid(), offsetFromUtc()
-*/
-
-void QDateTime::setOffsetFromUtc(int offsetSeconds)
-{
- QT_PREPEND_NAMESPACE(setTimeSpec(d, Qt::OffsetFromUTC, offsetSeconds));
- checkValidDateTime(d);
-}
-
-#if QT_CONFIG(timezone)
-/*!
- \since 5.2
-
- Sets the time zone used in this datetime to \a toZone.
- The datetime will refer to a different point in time.
-
- If \a toZone is invalid then the datetime will be invalid.
-
- \sa timeZone(), Qt::TimeSpec
-*/
-
-void QDateTime::setTimeZone(const QTimeZone &toZone)
-{
- d.detach(); // always detach
- d->m_status = mergeSpec(d->m_status, Qt::TimeZone);
- d->m_offsetFromUtc = 0;
- d->m_timeZone = toZone;
- refreshDateTime(d);
-}
-#endif // timezone
-
-/*!
- \since 4.7
-
- Returns the datetime as the number of milliseconds that have passed
- since 1970-01-01T00:00:00.000, Coordinated Universal Time (Qt::UTC).
-
- On systems that do not support time zones, this function will
- behave as if local time were Qt::UTC.
-
- The behavior for this function is undefined if the datetime stored in
- this object is not valid. However, for all valid dates, this function
- returns a unique value.
-
- \sa toSecsSinceEpoch(), setMSecsSinceEpoch()
-*/
-qint64 QDateTime::toMSecsSinceEpoch() const
-{
- switch (getSpec(d)) {
- case Qt::UTC:
- return getMSecs(d);
-
- case Qt::OffsetFromUTC:
- return d->m_msecs - (d->m_offsetFromUtc * 1000);
-
- case Qt::LocalTime: {
- // recalculate the local timezone
- auto status = extractDaylightStatus(getStatus(d));
- return localMSecsToEpochMSecs(getMSecs(d), &status);
- }
-
- case Qt::TimeZone:
-#if !QT_CONFIG(timezone)
- return 0;
-#else
- return QDateTimePrivate::zoneMSecsToEpochMSecs(d->m_msecs, d->m_timeZone,
- extractDaylightStatus(getStatus(d)));
-#endif
- }
- Q_UNREACHABLE();
- return 0;
-}
-
-/*!
- \since 5.8
-
- Returns the datetime as the number of seconds that have passed since
- 1970-01-01T00:00:00.000, Coordinated Universal Time (Qt::UTC).
-
- On systems that do not support time zones, this function will
- behave as if local time were Qt::UTC.
-
- The behavior for this function is undefined if the datetime stored in
- this object is not valid. However, for all valid dates, this function
- returns a unique value.
-
- \sa toMSecsSinceEpoch(), setSecsSinceEpoch()
-*/
-qint64 QDateTime::toSecsSinceEpoch() const
-{
- return toMSecsSinceEpoch() / 1000;
-}
-
-#if QT_DEPRECATED_SINCE(5, 8)
-/*!
- \deprecated
-
- Returns the datetime as the number of seconds that have passed
- since 1970-01-01T00:00:00, Coordinated Universal Time (Qt::UTC).
-
- On systems that do not support time zones, this function will
- behave as if local time were Qt::UTC.
-
- \note This function returns a 32-bit unsigned integer and is deprecated.
-
- If the date is outside the range 1970-01-01T00:00:00 to
- 2106-02-07T06:28:14, this function returns -1 cast to an unsigned integer
- (i.e., 0xFFFFFFFF).
-
- To get an extended range, use toMSecsSinceEpoch() or toSecsSinceEpoch().
-
- \sa toSecsSinceEpoch(), toMSecsSinceEpoch(), setTime_t()
-*/
-
-uint QDateTime::toTime_t() const
-{
- if (!isValid())
- return uint(-1);
- qint64 retval = toMSecsSinceEpoch() / 1000;
- if (quint64(retval) >= Q_UINT64_C(0xFFFFFFFF))
- return uint(-1);
- return uint(retval);
-}
-#endif
-
-/*!
- \since 4.7
-
- Sets the date and time given the number of milliseconds \a msecs that have
- passed since 1970-01-01T00:00:00.000, Coordinated Universal Time
- (Qt::UTC). On systems that do not support time zones this function
- will behave as if local time were Qt::UTC.
-
- Note that passing the minimum of \c qint64
- (\c{std::numeric_limits<qint64>::min()}) to \a msecs will result in
- undefined behavior.
-
- \sa toMSecsSinceEpoch(), setSecsSinceEpoch()
-*/
-void QDateTime::setMSecsSinceEpoch(qint64 msecs)
-{
- const auto spec = getSpec(d);
- auto status = getStatus(d);
-
- status &= ~QDateTimePrivate::ValidityMask;
- switch (spec) {
- case Qt::UTC:
- status = status
- | QDateTimePrivate::ValidDate
- | QDateTimePrivate::ValidTime
- | QDateTimePrivate::ValidDateTime;
- break;
- case Qt::OffsetFromUTC:
- msecs = msecs + (d->m_offsetFromUtc * 1000);
- status = status
- | QDateTimePrivate::ValidDate
- | QDateTimePrivate::ValidTime
- | QDateTimePrivate::ValidDateTime;
- break;
- case Qt::TimeZone:
- Q_ASSERT(!d.isShort());
-#if QT_CONFIG(timezone)
- // Docs state any LocalTime before 1970-01-01 will *not* have any DST applied
- // but all affected times afterwards will have DST applied.
- d.detach();
- if (msecs >= 0) {
- status = mergeDaylightStatus(status,
- d->m_timeZone.d->isDaylightTime(msecs)
- ? QDateTimePrivate::DaylightTime
- : QDateTimePrivate::StandardTime);
- d->m_offsetFromUtc = d->m_timeZone.d->offsetFromUtc(msecs);
- } else {
- status = mergeDaylightStatus(status, QDateTimePrivate::StandardTime);
- d->m_offsetFromUtc = d->m_timeZone.d->standardTimeOffset(msecs);
- }
- msecs = msecs + (d->m_offsetFromUtc * 1000);
- status = status
- | QDateTimePrivate::ValidDate
- | QDateTimePrivate::ValidTime
- | QDateTimePrivate::ValidDateTime;
-#endif // timezone
- break;
- case Qt::LocalTime: {
- QDate dt;
- QTime tm;
- QDateTimePrivate::DaylightStatus dstStatus;
- epochMSecsToLocalTime(msecs, &dt, &tm, &dstStatus);
- setDateTime(d, dt, tm);
- msecs = getMSecs(d);
- status = mergeDaylightStatus(getStatus(d), dstStatus);
- break;
- }
- }
-
- if (msecsCanBeSmall(msecs) && d.isShort()) {
- // we can keep short
- d.data.msecs = qintptr(msecs);
- d.data.status = status;
- } else {
- d.detach();
- d->m_status = status & ~QDateTimePrivate::ShortData;
- d->m_msecs = msecs;
- }
-
- if (spec == Qt::LocalTime || spec == Qt::TimeZone)
- refreshDateTime(d);
-}
-
-/*!
- \since 5.8
-
- Sets the date and time given the number of seconds \a secs that have
- passed since 1970-01-01T00:00:00.000, Coordinated Universal Time
- (Qt::UTC). On systems that do not support time zones this function
- will behave as if local time were Qt::UTC.
-
- \sa toSecsSinceEpoch(), setMSecsSinceEpoch()
-*/
-void QDateTime::setSecsSinceEpoch(qint64 secs)
-{
- setMSecsSinceEpoch(secs * 1000);
-}
-
-#if QT_DEPRECATED_SINCE(5, 8)
-/*!
- \fn void QDateTime::setTime_t(uint seconds)
- \deprecated
-
- Sets the date and time given the number of \a seconds that have
- passed since 1970-01-01T00:00:00, Coordinated Universal Time
- (Qt::UTC). On systems that do not support time zones this function
- will behave as if local time were Qt::UTC.
-
- \note This function is deprecated. For new code, use setSecsSinceEpoch().
-
- \sa toTime_t()
-*/
-
-void QDateTime::setTime_t(uint secsSince1Jan1970UTC)
-{
- setMSecsSinceEpoch((qint64)secsSince1Jan1970UTC * 1000);
-}
-#endif
-
-#if QT_CONFIG(datestring)
-/*!
- \fn QString QDateTime::toString(Qt::DateFormat format) const
-
- \overload
-
- Returns the datetime as a string in the \a format given.
-
- If the \a format is Qt::TextDate, the string is formatted in the default
- way. The day and month names will be localized names using the system
- locale, i.e. QLocale::system(). An example of this formatting is "Wed May 20
- 03:40:13 1998".
-
- If the \a format is Qt::ISODate, the string format corresponds
- to the ISO 8601 extended specification for representations of
- dates and times, taking the form yyyy-MM-ddTHH:mm:ss[Z|[+|-]HH:mm],
- depending on the timeSpec() of the QDateTime. If the timeSpec()
- is Qt::UTC, Z will be appended to the string; if the timeSpec() is
- Qt::OffsetFromUTC, the offset in hours and minutes from UTC will
- be appended to the string. To include milliseconds in the ISO 8601
- date, use the \a format Qt::ISODateWithMs, which corresponds to
- yyyy-MM-ddTHH:mm:ss.zzz[Z|[+|-]HH:mm].
-
- If the \a format is Qt::SystemLocaleShortDate or
- Qt::SystemLocaleLongDate, the string format depends on the locale
- settings of the system. Identical to calling
- QLocale::system().toString(datetime, QLocale::ShortFormat) or
- QLocale::system().toString(datetime, QLocale::LongFormat).
-
- If the \a format is Qt::DefaultLocaleShortDate or
- Qt::DefaultLocaleLongDate, the string format depends on the
- default application locale. This is the locale set with
- QLocale::setDefault(), or the system locale if no default locale
- has been set. Identical to calling QLocale().toString(datetime,
- QLocale::ShortFormat) or QLocale().toString(datetime,
- QLocale::LongFormat).
-
- If the \a format is Qt::RFC2822Date, the string is formatted
- following \l{RFC 2822}.
-
- If the datetime is invalid, an empty string will be returned.
-
- \warning The Qt::ISODate format is only valid for years in the
- range 0 to 9999. This restriction may apply to locale-aware
- formats as well, depending on the locale settings.
-
- \sa fromString(), QDate::toString(), QTime::toString(),
- QLocale::toString()
-*/
-
-QString QDateTime::toString(Qt::DateFormat format) const
-{
- QString buf;
- if (!isValid())
- return buf;
-
- switch (format) {
- case Qt::SystemLocaleDate:
- case Qt::SystemLocaleShortDate:
- return QLocale::system().toString(*this, QLocale::ShortFormat);
- case Qt::SystemLocaleLongDate:
- return QLocale::system().toString(*this, QLocale::LongFormat);
- case Qt::LocaleDate:
- case Qt::DefaultLocaleShortDate:
- return QLocale().toString(*this, QLocale::ShortFormat);
- case Qt::DefaultLocaleLongDate:
- return QLocale().toString(*this, QLocale::LongFormat);
- case Qt::RFC2822Date: {
- buf = QLocale::c().toString(*this, QStringViewLiteral("dd MMM yyyy hh:mm:ss "));
- buf += toOffsetString(Qt::TextDate, offsetFromUtc());
- return buf;
- }
- default:
-#if QT_CONFIG(textdate)
- case Qt::TextDate: {
- const QPair<QDate, QTime> p = getDateTime(d);
- buf = p.first.toString(Qt::TextDate);
- // Insert time between date's day and year:
- buf.insert(buf.lastIndexOf(QLatin1Char(' ')),
- QLatin1Char(' ') + p.second.toString(Qt::TextDate));
- // Append zone/offset indicator, as appropriate:
- switch (timeSpec()) {
- case Qt::LocalTime:
- break;
-# if QT_CONFIG(timezone)
- case Qt::TimeZone:
- buf += QLatin1Char(' ') + d->m_timeZone.abbreviation(*this);
- break;
-# endif
- default:
- buf += QLatin1String(" GMT");
- if (getSpec(d) == Qt::OffsetFromUTC)
- buf += toOffsetString(Qt::TextDate, offsetFromUtc());
- }
- return buf;
- }
-#endif
- case Qt::ISODate:
- case Qt::ISODateWithMs: {
- const QPair<QDate, QTime> p = getDateTime(d);
- const QDate &dt = p.first;
- const QTime &tm = p.second;
- buf = dt.toString(Qt::ISODate);
- if (buf.isEmpty())
- return QString(); // failed to convert
- buf += QLatin1Char('T');
- buf += tm.toString(format);
- switch (getSpec(d)) {
- case Qt::UTC:
- buf += QLatin1Char('Z');
- break;
- case Qt::OffsetFromUTC:
-#if QT_CONFIG(timezone)
- case Qt::TimeZone:
-#endif
- buf += toOffsetString(Qt::ISODate, offsetFromUtc());
- break;
- default:
- break;
- }
- return buf;
- }
- }
-}
-
-/*!
- \fn QString QDateTime::toString(const QString &format) const
- \fn QString QDateTime::toString(QStringView format) const
-
- Returns the datetime as a string. The \a format parameter
- determines the format of the result string.
-
- These expressions may be used for the date:
-
- \table
- \header \li Expression \li Output
- \row \li d \li the day as number without a leading zero (1 to 31)
- \row \li dd \li the day as number with a leading zero (01 to 31)
- \row \li ddd
- \li the abbreviated localized day name (e.g. 'Mon' to 'Sun').
- Uses the system locale to localize the name, i.e. QLocale::system().
- \row \li dddd
- \li the long localized day name (e.g. 'Monday' to 'Sunday').
- Uses the system locale to localize the name, i.e. QLocale::system().
- \row \li M \li the month as number without a leading zero (1-12)
- \row \li MM \li the month as number with a leading zero (01-12)
- \row \li MMM
- \li the abbreviated localized month name (e.g. 'Jan' to 'Dec').
- Uses the system locale to localize the name, i.e. QLocale::system().
- \row \li MMMM
- \li the long localized month name (e.g. 'January' to 'December').
- Uses the system locale to localize the name, i.e. QLocale::system().
- \row \li yy \li the year as two digit number (00-99)
- \row \li yyyy \li the year as four digit number
- \endtable
-
- These expressions may be used for the time:
-
- \table
- \header \li Expression \li Output
- \row \li h
- \li the hour without a leading zero (0 to 23 or 1 to 12 if AM/PM display)
- \row \li hh
- \li the hour with a leading zero (00 to 23 or 01 to 12 if AM/PM display)
- \row \li H
- \li the hour without a leading zero (0 to 23, even with AM/PM display)
- \row \li HH
- \li the hour with a leading zero (00 to 23, even with AM/PM display)
- \row \li m \li the minute without a leading zero (0 to 59)
- \row \li mm \li the minute with a leading zero (00 to 59)
- \row \li s \li the whole second without a leading zero (0 to 59)
- \row \li ss \li the whole second with a leading zero where applicable (00 to 59)
- \row \li z \li the fractional part of the second, to go after a decimal
- point, without trailing zeroes (0 to 999). Thus "\c{s.z}"
- reports the seconds to full available (millisecond) precision
- without trailing zeroes.
- \row \li zzz \li the fractional part of the second, to millisecond
- precision, including trailing zeroes where applicable (000 to 999).
- \row \li AP or A
- \li use AM/PM display. \e A/AP will be replaced by either "AM" or "PM".
- \row \li ap or a
- \li use am/pm display. \e a/ap will be replaced by either "am" or "pm".
- \row \li t \li the timezone (for example "CEST")
- \endtable
-
- Any sequence of characters enclosed in single quotes will be included
- verbatim in the output string (stripped of the quotes), even if it contains
- formatting characters. Two consecutive single quotes ("''") are replaced by
- a single quote in the output. All other characters in the format string are
- included verbatim in the output string.
-
- Formats without separators (e.g. "ddMM") are supported but must be used with
- care, as the resulting strings aren't always reliably readable (e.g. if "dM"
- produces "212" it could mean either the 2nd of December or the 21st of
- February).
-
- Example format strings (assumed that the QDateTime is 21 May 2001
- 14:13:09.120):
-
- \table
- \header \li Format \li Result
- \row \li dd.MM.yyyy \li 21.05.2001
- \row \li ddd MMMM d yy \li Tue May 21 01
- \row \li hh:mm:ss.zzz \li 14:13:09.120
- \row \li hh:mm:ss.z \li 14:13:09.12
- \row \li h:m:s ap \li 2:13:9 pm
- \endtable
-
- If the datetime is invalid, an empty string will be returned.
-
- \sa fromString(), QDate::toString(), QTime::toString(), QLocale::toString()
-*/
-QString QDateTime::toString(QStringView format) const
-{
- return QLocale::system().toString(*this, format); // QLocale::c() ### Qt6
-}
-
-#if QT_STRINGVIEW_LEVEL < 2
-QString QDateTime::toString(const QString &format) const
-{
- return toString(qToStringViewIgnoringNull(format));
-}
-#endif
-
-#endif // datestring
-
-static inline void massageAdjustedDateTime(const QDateTimeData &d, QDate *date, QTime *time)
-{
- /*
- If we have just adjusted to a day with a DST transition, our given time
- may lie in the transition hour (either missing or duplicated). For any
- other time, telling mktime (deep in the bowels of localMSecsToEpochMSecs)
- we don't know its DST-ness will produce no adjustment (just a decision as
- to its DST-ness); but for a time in spring's missing hour it'll adjust the
- time while picking a DST-ness. (Handling of autumn is trickier, as either
- DST-ness is valid, without adjusting the time. We might want to propagate
- the daylight status in that case, but it's hard to do so without breaking
- (far more common) other cases; and it makes little difference, as the two
- answers do then differ only in DST-ness.)
- */
- auto spec = getSpec(d);
- if (spec == Qt::LocalTime) {
- QDateTimePrivate::DaylightStatus status = QDateTimePrivate::UnknownDaylightTime;
- localMSecsToEpochMSecs(timeToMSecs(*date, *time), &status, date, time);
-#if QT_CONFIG(timezone)
- } else if (spec == Qt::TimeZone) {
- QDateTimePrivate::zoneMSecsToEpochMSecs(timeToMSecs(*date, *time),
- d->m_timeZone,
- QDateTimePrivate::UnknownDaylightTime,
- date, time);
-#endif // timezone
- }
-}
-
-/*!
- Returns a QDateTime object containing a datetime \a ndays days
- later than the datetime of this object (or earlier if \a ndays is
- negative).
-
- If the timeSpec() is Qt::LocalTime and the resulting
- date and time fall in the Standard Time to Daylight-Saving Time transition
- hour then the result will be adjusted accordingly, i.e. if the transition
- is at 2am and the clock goes forward to 3am and the result falls between
- 2am and 3am then the result will be adjusted to fall after 3am.
-
- \sa daysTo(), addMonths(), addYears(), addSecs()
-*/
-
-QDateTime QDateTime::addDays(qint64 ndays) const
-{
- QDateTime dt(*this);
- QPair<QDate, QTime> p = getDateTime(d);
- QDate &date = p.first;
- QTime &time = p.second;
- date = date.addDays(ndays);
- massageAdjustedDateTime(dt.d, &date, &time);
- setDateTime(dt.d, date, time);
- return dt;
-}
-
-/*!
- Returns a QDateTime object containing a datetime \a nmonths months
- later than the datetime of this object (or earlier if \a nmonths
- is negative).
-
- If the timeSpec() is Qt::LocalTime and the resulting
- date and time fall in the Standard Time to Daylight-Saving Time transition
- hour then the result will be adjusted accordingly, i.e. if the transition
- is at 2am and the clock goes forward to 3am and the result falls between
- 2am and 3am then the result will be adjusted to fall after 3am.
-
- \sa daysTo(), addDays(), addYears(), addSecs()
-*/
-
-QDateTime QDateTime::addMonths(int nmonths) const
-{
- QDateTime dt(*this);
- QPair<QDate, QTime> p = getDateTime(d);
- QDate &date = p.first;
- QTime &time = p.second;
- date = date.addMonths(nmonths);
- massageAdjustedDateTime(dt.d, &date, &time);
- setDateTime(dt.d, date, time);
- return dt;
-}
-
-/*!
- Returns a QDateTime object containing a datetime \a nyears years
- later than the datetime of this object (or earlier if \a nyears is
- negative).
-
- If the timeSpec() is Qt::LocalTime and the resulting
- date and time fall in the Standard Time to Daylight-Saving Time transition
- hour then the result will be adjusted accordingly, i.e. if the transition
- is at 2am and the clock goes forward to 3am and the result falls between
- 2am and 3am then the result will be adjusted to fall after 3am.
-
- \sa daysTo(), addDays(), addMonths(), addSecs()
-*/
-
-QDateTime QDateTime::addYears(int nyears) const
-{
- QDateTime dt(*this);
- QPair<QDate, QTime> p = getDateTime(d);
- QDate &date = p.first;
- QTime &time = p.second;
- date = date.addYears(nyears);
- massageAdjustedDateTime(dt.d, &date, &time);
- setDateTime(dt.d, date, time);
- return dt;
-}
-
-/*!
- Returns a QDateTime object containing a datetime \a s seconds
- later than the datetime of this object (or earlier if \a s is
- negative).
-
- If this datetime is invalid, an invalid datetime will be returned.
-
- \sa addMSecs(), secsTo(), addDays(), addMonths(), addYears()
-*/
-
-QDateTime QDateTime::addSecs(qint64 s) const
-{
- return addMSecs(s * 1000);
-}
-
-/*!
- Returns a QDateTime object containing a datetime \a msecs miliseconds
- later than the datetime of this object (or earlier if \a msecs is
- negative).
-
- If this datetime is invalid, an invalid datetime will be returned.
-
- \sa addSecs(), msecsTo(), addDays(), addMonths(), addYears()
-*/
-QDateTime QDateTime::addMSecs(qint64 msecs) const
-{
- if (!isValid())
- return QDateTime();
-
- QDateTime dt(*this);
- auto spec = getSpec(d);
- if (spec == Qt::LocalTime || spec == Qt::TimeZone) {
- // Convert to real UTC first in case crosses DST transition
- dt.setMSecsSinceEpoch(toMSecsSinceEpoch() + msecs);
- } else {
- // No need to convert, just add on
- if (d.isShort()) {
- // need to check if we need to enlarge first
- msecs += dt.d.data.msecs;
- if (msecsCanBeSmall(msecs)) {
- dt.d.data.msecs = qintptr(msecs);
- } else {
- dt.d.detach();
- dt.d->m_msecs = msecs;
- }
- } else {
- dt.d.detach();
- dt.d->m_msecs += msecs;
- }
- }
- return dt;
-}
-
-/*!
- Returns the number of days from this datetime to the \a other
- datetime. The number of days is counted as the number of times
- midnight is reached between this datetime to the \a other
- datetime. This means that a 10 minute difference from 23:55 to
- 0:05 the next day counts as one day.
-
- If the \a other datetime is earlier than this datetime,
- the value returned is negative.
-
- Example:
- \snippet code/src_corelib_tools_qdatetime.cpp 15
-
- \sa addDays(), secsTo(), msecsTo()
-*/
-
-qint64 QDateTime::daysTo(const QDateTime &other) const
-{
- return date().daysTo(other.date());
-}
-
-/*!
- Returns the number of seconds from this datetime to the \a other
- datetime. If the \a other datetime is earlier than this datetime,
- the value returned is negative.
-
- Before performing the comparison, the two datetimes are converted
- to Qt::UTC to ensure that the result is correct if daylight-saving
- (DST) applies to one of the two datetimes but not the other.
-
- Returns 0 if either datetime is invalid.
-
- Example:
- \snippet code/src_corelib_tools_qdatetime.cpp 11
-
- \sa addSecs(), daysTo(), QTime::secsTo()
-*/
-
-qint64 QDateTime::secsTo(const QDateTime &other) const
-{
- return (msecsTo(other) / 1000);
-}
-
-/*!
- Returns the number of milliseconds from this datetime to the \a other
- datetime. If the \a other datetime is earlier than this datetime,
- the value returned is negative.
-
- Before performing the comparison, the two datetimes are converted
- to Qt::UTC to ensure that the result is correct if daylight-saving
- (DST) applies to one of the two datetimes and but not the other.
-
- Returns 0 if either datetime is invalid.
-
- \sa addMSecs(), daysTo(), QTime::msecsTo()
-*/
-
-qint64 QDateTime::msecsTo(const QDateTime &other) const
-{
- if (!isValid() || !other.isValid())
- return 0;
-
- return other.toMSecsSinceEpoch() - toMSecsSinceEpoch();
-}
-
-/*!
- \fn QDateTime QDateTime::toTimeSpec(Qt::TimeSpec spec) const
-
- Returns a copy of this datetime converted to the given time
- \a spec.
-
- If \a spec is Qt::OffsetFromUTC then it is set to Qt::UTC. To set to a
- spec of Qt::OffsetFromUTC use toOffsetFromUtc().
-
- If \a spec is Qt::TimeZone then it is set to Qt::LocalTime,
- i.e. the local Time Zone.
-
- Example:
- \snippet code/src_corelib_tools_qdatetime.cpp 16
-
- \sa timeSpec(), toTimeZone(), toOffsetFromUtc()
-*/
-
-QDateTime QDateTime::toTimeSpec(Qt::TimeSpec spec) const
-{
- if (getSpec(d) == spec && (spec == Qt::UTC || spec == Qt::LocalTime))
- return *this;
-
- if (!isValid()) {
- QDateTime ret = *this;
- ret.setTimeSpec(spec);
- return ret;
- }
-
- return fromMSecsSinceEpoch(toMSecsSinceEpoch(), spec, 0);
-}
-
-/*!
- \since 5.2
-
- \fn QDateTime QDateTime::toOffsetFromUtc(int offsetSeconds) const
-
- Returns a copy of this datetime converted to a spec of Qt::OffsetFromUTC
- with the given \a offsetSeconds.
-
- If the \a offsetSeconds equals 0 then a UTC datetime will be returned
-
- \sa setOffsetFromUtc(), offsetFromUtc(), toTimeSpec()
-*/
-
-QDateTime QDateTime::toOffsetFromUtc(int offsetSeconds) const
-{
- if (getSpec(d) == Qt::OffsetFromUTC
- && d->m_offsetFromUtc == offsetSeconds)
- return *this;
-
- if (!isValid()) {
- QDateTime ret = *this;
- ret.setOffsetFromUtc(offsetSeconds);
- return ret;
- }
-
- return fromMSecsSinceEpoch(toMSecsSinceEpoch(), Qt::OffsetFromUTC, offsetSeconds);
-}
-
-#if QT_CONFIG(timezone)
-/*!
- \since 5.2
-
- Returns a copy of this datetime converted to the given \a timeZone
-
- \sa timeZone(), toTimeSpec()
-*/
-
-QDateTime QDateTime::toTimeZone(const QTimeZone &timeZone) const
-{
- if (getSpec(d) == Qt::TimeZone && d->m_timeZone == timeZone)
- return *this;
-
- if (!isValid()) {
- QDateTime ret = *this;
- ret.setTimeZone(timeZone);
- return ret;
- }
-
- return fromMSecsSinceEpoch(toMSecsSinceEpoch(), timeZone);
-}
-#endif // timezone
-
-/*!
- Returns \c true if this datetime is equal to the \a other datetime;
- otherwise returns \c false.
-
- \sa operator!=()
-*/
-
-bool QDateTime::operator==(const QDateTime &other) const
-{
- if (getSpec(d) == Qt::LocalTime
- && getStatus(d) == getStatus(other.d)) {
- return getMSecs(d) == getMSecs(other.d);
- }
- // Convert to UTC and compare
- return (toMSecsSinceEpoch() == other.toMSecsSinceEpoch());
-}
-
-/*!
- \fn bool QDateTime::operator!=(const QDateTime &other) const
-
- Returns \c true if this datetime is different from the \a other
- datetime; otherwise returns \c false.
-
- Two datetimes are different if either the date, the time, or the
- time zone components are different.
-
- \sa operator==()
-*/
-
-/*!
- Returns \c true if this datetime is earlier than the \a other
- datetime; otherwise returns \c false.
-*/
-
-bool QDateTime::operator<(const QDateTime &other) const
-{
- if (getSpec(d) == Qt::LocalTime
- && getStatus(d) == getStatus(other.d)) {
- return getMSecs(d) < getMSecs(other.d);
- }
- // Convert to UTC and compare
- return (toMSecsSinceEpoch() < other.toMSecsSinceEpoch());
-}
-
-/*!
- \fn bool QDateTime::operator<=(const QDateTime &other) const
-
- Returns \c true if this datetime is earlier than or equal to the
- \a other datetime; otherwise returns \c false.
-*/
-
-/*!
- \fn bool QDateTime::operator>(const QDateTime &other) const
-
- Returns \c true if this datetime is later than the \a other datetime;
- otherwise returns \c false.
-*/
-
-/*!
- \fn bool QDateTime::operator>=(const QDateTime &other) const
-
- Returns \c true if this datetime is later than or equal to the
- \a other datetime; otherwise returns \c false.
-*/
-
-/*!
- \fn QDateTime QDateTime::currentDateTime()
- Returns the current datetime, as reported by the system clock, in
- the local time zone.
-
- \sa currentDateTimeUtc(), QDate::currentDate(), QTime::currentTime(), toTimeSpec()
-*/
-
-/*!
- \fn QDateTime QDateTime::currentDateTimeUtc()
- \since 4.7
- Returns the current datetime, as reported by the system clock, in
- UTC.
-
- \sa currentDateTime(), QDate::currentDate(), QTime::currentTime(), toTimeSpec()
-*/
-
-/*!
- \fn qint64 QDateTime::currentMSecsSinceEpoch()
- \since 4.7
-
- Returns the number of milliseconds since 1970-01-01T00:00:00 Universal
- Coordinated Time. This number is like the POSIX time_t variable, but
- expressed in milliseconds instead.
-
- \sa currentDateTime(), currentDateTimeUtc(), toTime_t(), toTimeSpec()
-*/
-
-/*!
- \fn qint64 QDateTime::currentSecsSinceEpoch()
- \since 5.8
-
- Returns the number of seconds since 1970-01-01T00:00:00 Universal
- Coordinated Time.
-
- \sa currentMSecsSinceEpoch()
-*/
-
-#if defined(Q_OS_WIN)
-static inline uint msecsFromDecomposed(int hour, int minute, int sec, int msec = 0)
-{
- return MSECS_PER_HOUR * hour + MSECS_PER_MIN * minute + 1000 * sec + msec;
-}
-
-QDate QDate::currentDate()
-{
- QDate d;
- SYSTEMTIME st;
- memset(&st, 0, sizeof(SYSTEMTIME));
- GetLocalTime(&st);
- d.jd = julianDayFromDate(st.wYear, st.wMonth, st.wDay);
- return d;
-}
-
-QTime QTime::currentTime()
-{
- QTime ct;
- SYSTEMTIME st;
- memset(&st, 0, sizeof(SYSTEMTIME));
- GetLocalTime(&st);
- ct.setHMS(st.wHour, st.wMinute, st.wSecond, st.wMilliseconds);
- return ct;
-}
-
-QDateTime QDateTime::currentDateTime()
-{
- QDate d;
- QTime t;
- SYSTEMTIME st;
- memset(&st, 0, sizeof(SYSTEMTIME));
- GetLocalTime(&st);
- d.jd = julianDayFromDate(st.wYear, st.wMonth, st.wDay);
- t.mds = msecsFromDecomposed(st.wHour, st.wMinute, st.wSecond, st.wMilliseconds);
- return QDateTime(d, t);
-}
-
-QDateTime QDateTime::currentDateTimeUtc()
-{
- QDate d;
- QTime t;
- SYSTEMTIME st;
- memset(&st, 0, sizeof(SYSTEMTIME));
- GetSystemTime(&st);
- d.jd = julianDayFromDate(st.wYear, st.wMonth, st.wDay);
- t.mds = msecsFromDecomposed(st.wHour, st.wMinute, st.wSecond, st.wMilliseconds);
- return QDateTime(d, t, Qt::UTC);
-}
-
-qint64 QDateTime::currentMSecsSinceEpoch() Q_DECL_NOTHROW
-{
- SYSTEMTIME st;
- memset(&st, 0, sizeof(SYSTEMTIME));
- GetSystemTime(&st);
-
- return msecsFromDecomposed(st.wHour, st.wMinute, st.wSecond, st.wMilliseconds) +
- qint64(julianDayFromDate(st.wYear, st.wMonth, st.wDay)
- - julianDayFromDate(1970, 1, 1)) * Q_INT64_C(86400000);
-}
-
-qint64 QDateTime::currentSecsSinceEpoch() Q_DECL_NOTHROW
-{
- SYSTEMTIME st;
- memset(&st, 0, sizeof(SYSTEMTIME));
- GetSystemTime(&st);
-
- return st.wHour * SECS_PER_HOUR + st.wMinute * SECS_PER_MIN + st.wSecond +
- qint64(julianDayFromDate(st.wYear, st.wMonth, st.wDay)
- - julianDayFromDate(1970, 1, 1)) * Q_INT64_C(86400);
-}
-
-#elif defined(Q_OS_UNIX)
-QDate QDate::currentDate()
-{
- return QDateTime::currentDateTime().date();
-}
-
-QTime QTime::currentTime()
-{
- return QDateTime::currentDateTime().time();
-}
-
-QDateTime QDateTime::currentDateTime()
-{
- return fromMSecsSinceEpoch(currentMSecsSinceEpoch(), Qt::LocalTime);
-}
-
-QDateTime QDateTime::currentDateTimeUtc()
-{
- return fromMSecsSinceEpoch(currentMSecsSinceEpoch(), Qt::UTC);
-}
-
-qint64 QDateTime::currentMSecsSinceEpoch() Q_DECL_NOTHROW
-{
- // posix compliant system
- // we have milliseconds
- struct timeval tv;
- gettimeofday(&tv, 0);
- return qint64(tv.tv_sec) * Q_INT64_C(1000) + tv.tv_usec / 1000;
-}
-
-qint64 QDateTime::currentSecsSinceEpoch() Q_DECL_NOTHROW
-{
- struct timeval tv;
- gettimeofday(&tv, 0);
- return qint64(tv.tv_sec);
-}
-#else
-#error "What system is this?"
-#endif
-
-#if QT_DEPRECATED_SINCE(5, 8)
-/*!
- \since 4.2
- \deprecated
-
- Returns a datetime whose date and time are the number of \a seconds
- that have passed since 1970-01-01T00:00:00, Coordinated Universal
- Time (Qt::UTC) and converted to Qt::LocalTime. On systems that do not
- support time zones, the time will be set as if local time were Qt::UTC.
-
- \note This function is deprecated. Please use fromSecsSinceEpoch() in new
- code.
-
- \sa toTime_t(), setTime_t()
-*/
-QDateTime QDateTime::fromTime_t(uint seconds)
-{
- return fromMSecsSinceEpoch((qint64)seconds * 1000, Qt::LocalTime);
-}
-
-/*!
- \since 5.2
- \deprecated
-
- Returns a datetime whose date and time are the number of \a seconds
- that have passed since 1970-01-01T00:00:00, Coordinated Universal
- Time (Qt::UTC) and converted to the given \a spec.
-
- If the \a spec is not Qt::OffsetFromUTC then the \a offsetSeconds will be
- ignored. If the \a spec is Qt::OffsetFromUTC and the \a offsetSeconds is 0
- then the spec will be set to Qt::UTC, i.e. an offset of 0 seconds.
-
- \note This function is deprecated. Please use fromSecsSinceEpoch() in new
- code.
-
- \sa toTime_t(), setTime_t()
-*/
-QDateTime QDateTime::fromTime_t(uint seconds, Qt::TimeSpec spec, int offsetSeconds)
-{
- return fromMSecsSinceEpoch((qint64)seconds * 1000, spec, offsetSeconds);
-}
-
-#if QT_CONFIG(timezone)
-/*!
- \since 5.2
- \deprecated
-
- Returns a datetime whose date and time are the number of \a seconds
- that have passed since 1970-01-01T00:00:00, Coordinated Universal
- Time (Qt::UTC) and with the given \a timeZone.
-
- \note This function is deprecated. Please use fromSecsSinceEpoch() in new
- code.
-
- \sa toTime_t(), setTime_t()
-*/
-QDateTime QDateTime::fromTime_t(uint seconds, const QTimeZone &timeZone)
-{
- return fromMSecsSinceEpoch((qint64)seconds * 1000, timeZone);
-}
-#endif
-#endif // QT_DEPRECATED_SINCE(5, 8)
-
-/*!
- \since 4.7
-
- Returns a datetime whose date and time are the number of milliseconds, \a msecs,
- that have passed since 1970-01-01T00:00:00.000, Coordinated Universal
- Time (Qt::UTC), and converted to Qt::LocalTime. On systems that do not
- support time zones, the time will be set as if local time were Qt::UTC.
-
- Note that there are possible values for \a msecs that lie outside the valid
- range of QDateTime, both negative and positive. The behavior of this
- function is undefined for those values.
-
- \sa toMSecsSinceEpoch(), setMSecsSinceEpoch()
-*/
-QDateTime QDateTime::fromMSecsSinceEpoch(qint64 msecs)
-{
- return fromMSecsSinceEpoch(msecs, Qt::LocalTime);
-}
-
-/*!
- \since 5.2
-
- Returns a datetime whose date and time are the number of milliseconds \a msecs
- that have passed since 1970-01-01T00:00:00.000, Coordinated Universal
- Time (Qt::UTC) and converted to the given \a spec.
-
- Note that there are possible values for \a msecs that lie outside the valid
- range of QDateTime, both negative and positive. The behavior of this
- function is undefined for those values.
-
- If the \a spec is not Qt::OffsetFromUTC then the \a offsetSeconds will be
- ignored. If the \a spec is Qt::OffsetFromUTC and the \a offsetSeconds is 0
- then the spec will be set to Qt::UTC, i.e. an offset of 0 seconds.
-
- If \a spec is Qt::TimeZone then the spec will be set to Qt::LocalTime,
- i.e. the current system time zone.
-
- \sa toMSecsSinceEpoch(), setMSecsSinceEpoch()
-*/
-QDateTime QDateTime::fromMSecsSinceEpoch(qint64 msecs, Qt::TimeSpec spec, int offsetSeconds)
-{
- QDateTime dt;
- QT_PREPEND_NAMESPACE(setTimeSpec(dt.d, spec, offsetSeconds));
- dt.setMSecsSinceEpoch(msecs);
- return dt;
-}
-
-/*!
- \since 5.8
-
- Returns a datetime whose date and time are the number of seconds \a secs
- that have passed since 1970-01-01T00:00:00.000, Coordinated Universal
- Time (Qt::UTC) and converted to the given \a spec.
-
- Note that there are possible values for \a secs that lie outside the valid
- range of QDateTime, both negative and positive. The behavior of this
- function is undefined for those values.
-
- If the \a spec is not Qt::OffsetFromUTC then the \a offsetSeconds will be
- ignored. If the \a spec is Qt::OffsetFromUTC and the \a offsetSeconds is 0
- then the spec will be set to Qt::UTC, i.e. an offset of 0 seconds.
-
- If \a spec is Qt::TimeZone then the spec will be set to Qt::LocalTime,
- i.e. the current system time zone.
-
- \sa toSecsSinceEpoch(), setSecsSinceEpoch()
-*/
-QDateTime QDateTime::fromSecsSinceEpoch(qint64 secs, Qt::TimeSpec spec, int offsetSeconds)
-{
- return fromMSecsSinceEpoch(secs * 1000, spec, offsetSeconds);
-}
-
-#if QT_CONFIG(timezone)
-/*!
- \since 5.2
-
- Returns a datetime whose date and time are the number of milliseconds \a msecs
- that have passed since 1970-01-01T00:00:00.000, Coordinated Universal
- Time (Qt::UTC) and with the given \a timeZone.
-
- \sa fromSecsSinceEpoch()
-*/
-QDateTime QDateTime::fromMSecsSinceEpoch(qint64 msecs, const QTimeZone &timeZone)
-{
- QDateTime dt;
- dt.setTimeZone(timeZone);
- dt.setMSecsSinceEpoch(msecs);
- return dt;
-}
-
-/*!
- \since 5.8
-
- Returns a datetime whose date and time are the number of seconds \a secs
- that have passed since 1970-01-01T00:00:00.000, Coordinated Universal
- Time (Qt::UTC) and with the given \a timeZone.
-
- \sa fromMSecsSinceEpoch()
-*/
-QDateTime QDateTime::fromSecsSinceEpoch(qint64 secs, const QTimeZone &timeZone)
-{
- return fromMSecsSinceEpoch(secs * 1000, timeZone);
-}
-#endif
-
-#if QT_DEPRECATED_SINCE(5, 2)
-/*!
- \since 4.4
- \internal
- \obsolete
-
- This method was added in 4.4 but never documented as public. It was replaced
- in 5.2 with public method setOffsetFromUtc() for consistency with QTimeZone.
-
- This method should never be made public.
-
- \sa setOffsetFromUtc()
- */
-void QDateTime::setUtcOffset(int seconds)
-{
- setOffsetFromUtc(seconds);
-}
-
-/*!
- \since 4.4
- \internal
- \obsolete
-
- This method was added in 4.4 but never documented as public. It was replaced
- in 5.1 with public method offsetFromUTC() for consistency with QTimeZone.
-
- This method should never be made public.
-
- \sa offsetFromUTC()
-*/
-int QDateTime::utcOffset() const
-{
- return offsetFromUtc();
-}
-#endif // QT_DEPRECATED_SINCE
-
-#if QT_CONFIG(datestring)
-
-/*!
- \fn QDateTime QDateTime::fromString(const QString &string, Qt::DateFormat format)
-
- Returns the QDateTime represented by the \a string, using the
- \a format given, or an invalid datetime if this is not possible.
-
- Note for Qt::TextDate: It is recommended that you use the
- English short month names (e.g. "Jan"). Although localized month
- names can also be used, they depend on the user's locale settings.
-
- \sa toString(), QLocale::toDateTime()
-*/
-QDateTime QDateTime::fromString(const QString& string, Qt::DateFormat format)
-{
- if (string.isEmpty())
- return QDateTime();
-
- switch (format) {
- case Qt::SystemLocaleDate:
- case Qt::SystemLocaleShortDate:
- return QLocale::system().toDateTime(string, QLocale::ShortFormat);
- case Qt::SystemLocaleLongDate:
- return QLocale::system().toDateTime(string, QLocale::LongFormat);
- case Qt::LocaleDate:
- case Qt::DefaultLocaleShortDate:
- return QLocale().toDateTime(string, QLocale::ShortFormat);
- case Qt::DefaultLocaleLongDate:
- return QLocale().toDateTime(string, QLocale::LongFormat);
- case Qt::RFC2822Date: {
- const ParsedRfcDateTime rfc = rfcDateImpl(string);
-
- if (!rfc.date.isValid() || !rfc.time.isValid())
- return QDateTime();
-
- QDateTime dateTime(rfc.date, rfc.time, Qt::UTC);
- dateTime.setOffsetFromUtc(rfc.utcOffset);
- return dateTime;
- }
- case Qt::ISODate:
- case Qt::ISODateWithMs: {
- const int size = string.size();
- if (size < 10)
- return QDateTime();
-
- QDate date = QDate::fromString(string.left(10), Qt::ISODate);
- if (!date.isValid())
- return QDateTime();
- if (size == 10)
- return QDateTime(date);
-
- Qt::TimeSpec spec = Qt::LocalTime;
- QStringRef isoString(&string);
- isoString = isoString.mid(10); // trim "yyyy-MM-dd"
-
- // Must be left with T and at least one digit for the hour:
- if (isoString.size() < 2
- || !(isoString.startsWith(QLatin1Char('T'))
- // FIXME: QSql relies on QVariant::toDateTime() accepting a space here:
- || isoString.startsWith(QLatin1Char(' ')))) {
- return QDateTime();
- }
- isoString = isoString.mid(1); // trim 'T' (or space)
-
- int offset = 0;
- // Check end of string for Time Zone definition, either Z for UTC or [+-]HH:mm for Offset
- if (isoString.endsWith(QLatin1Char('Z'))) {
- spec = Qt::UTC;
- isoString.chop(1); // trim 'Z'
- } else {
- // the loop below is faster but functionally equal to:
- // const int signIndex = isoString.indexOf(QRegExp(QStringLiteral("[+-]")));
- int signIndex = isoString.size() - 1;
- Q_ASSERT(signIndex >= 0);
- bool found = false;
- {
- const QChar plus = QLatin1Char('+');
- const QChar minus = QLatin1Char('-');
- do {
- QChar character(isoString.at(signIndex));
- found = character == plus || character == minus;
- } while (!found && --signIndex >= 0);
- }
-
- if (found) {
- bool ok;
- offset = fromOffsetString(isoString.mid(signIndex), &ok);
- if (!ok)
- return QDateTime();
- isoString = isoString.left(signIndex);
- spec = Qt::OffsetFromUTC;
- }
- }
-
- // Might be end of day (24:00, including variants), which QTime considers invalid.
- // ISO 8601 (section 4.2.3) says that 24:00 is equivalent to 00:00 the next day.
- bool isMidnight24 = false;
- QTime time = fromIsoTimeString(isoString, format, &isMidnight24);
- if (!time.isValid())
- return QDateTime();
- if (isMidnight24)
- date = date.addDays(1);
- return QDateTime(date, time, spec, offset);
- }
-#if QT_CONFIG(textdate)
- case Qt::TextDate: {
- QVector<QStringRef> parts = string.splitRef(QLatin1Char(' '), QString::SkipEmptyParts);
-
- if ((parts.count() < 5) || (parts.count() > 6))
- return QDateTime();
-
- // Accept "Sun Dec 1 13:02:00 1974" and "Sun 1. Dec 13:02:00 1974"
- int month = 0;
- int day = 0;
- bool ok = false;
-
- // First try month then day
- month = fromShortMonthName(parts.at(1));
- if (month)
- day = parts.at(2).toInt();
-
- // If failed try day then month
- if (!month || !day) {
- month = fromShortMonthName(parts.at(2));
- if (month) {
- QStringRef dayStr = parts.at(1);
- if (dayStr.endsWith(QLatin1Char('.'))) {
- dayStr = dayStr.left(dayStr.size() - 1);
- day = dayStr.toInt();
- }
- }
- }
-
- // If both failed, give up
- if (!month || !day)
- return QDateTime();
-
- // Year can be before or after time, "Sun Dec 1 1974 13:02:00" or "Sun Dec 1 13:02:00 1974"
- // Guess which by looking for ':' in the time
- int year = 0;
- int yearPart = 0;
- int timePart = 0;
- if (parts.at(3).contains(QLatin1Char(':'))) {
- yearPart = 4;
- timePart = 3;
- } else if (parts.at(4).contains(QLatin1Char(':'))) {
- yearPart = 3;
- timePart = 4;
- } else {
- return QDateTime();
- }
-
- year = parts.at(yearPart).toInt(&ok);
- if (!ok)
- return QDateTime();
-
- QDate date(year, month, day);
- if (!date.isValid())
- return QDateTime();
-
- QVector<QStringRef> timeParts = parts.at(timePart).split(QLatin1Char(':'));
- if (timeParts.count() < 2 || timeParts.count() > 3)
- return QDateTime();
-
- int hour = timeParts.at(0).toInt(&ok);
- if (!ok)
- return QDateTime();
-
- int minute = timeParts.at(1).toInt(&ok);
- if (!ok)
- return QDateTime();
-
- int second = 0;
- int millisecond = 0;
- if (timeParts.count() > 2) {
- const QVector<QStringRef> secondParts = timeParts.at(2).split(QLatin1Char('.'));
- if (secondParts.size() > 2) {
- return QDateTime();
- }
-
- second = secondParts.first().toInt(&ok);
- if (!ok) {
- return QDateTime();
- }
-
- if (secondParts.size() > 1) {
- millisecond = secondParts.last().toInt(&ok);
- if (!ok) {
- return QDateTime();
- }
- }
- }
-
- QTime time(hour, minute, second, millisecond);
- if (!time.isValid())
- return QDateTime();
-
- if (parts.count() == 5)
- return QDateTime(date, time, Qt::LocalTime);
-
- QStringRef tz = parts.at(5);
- if (!tz.startsWith(QLatin1String("GMT"), Qt::CaseInsensitive))
- return QDateTime();
- tz = tz.mid(3);
- if (!tz.isEmpty()) {
- int offset = fromOffsetString(tz, &ok);
- if (!ok)
- return QDateTime();
- return QDateTime(date, time, Qt::OffsetFromUTC, offset);
- } else {
- return QDateTime(date, time, Qt::UTC);
- }
- }
-#endif // textdate
- }
-
- return QDateTime();
-}
-
-/*!
- \fn QDateTime QDateTime::fromString(const QString &string, const QString &format)
-
- Returns the QDateTime represented by the \a string, using the \a
- format given, or an invalid datetime if the string cannot be parsed.
-
- These expressions may be used for the date part of the format string:
-
- \table
- \header \li Expression \li Output
- \row \li d \li the day as number without a leading zero (1 to 31)
- \row \li dd \li the day as number with a leading zero (01 to 31)
- \row \li ddd
- \li the abbreviated localized day name (e.g. 'Mon' to 'Sun').
- \row \li dddd
- \li the long localized day name (e.g. 'Monday' to 'Sunday').
- \row \li M \li the month as number without a leading zero (1-12)
- \row \li MM \li the month as number with a leading zero (01-12)
- \row \li MMM
- \li the abbreviated localized month name (e.g. 'Jan' to 'Dec').
- \row \li MMMM
- \li the long localized month name (e.g. 'January' to 'December').
- \row \li yy \li the year as two digit number (00-99)
- \row \li yyyy \li the year as four digit number
- \endtable
-
- \note Unlike the other version of this function, day and month names must
- be given in the user's local language. It is only possible to use the English
- names if the user's language is English.
-
- These expressions may be used for the time part of the format string:
-
- \table
- \header \li Expression \li Output
- \row \li h
- \li the hour without a leading zero (0 to 23 or 1 to 12 if AM/PM display)
- \row \li hh
- \li the hour with a leading zero (00 to 23 or 01 to 12 if AM/PM display)
- \row \li H
- \li the hour without a leading zero (0 to 23, even with AM/PM display)
- \row \li HH
- \li the hour with a leading zero (00 to 23, even with AM/PM display)
- \row \li m \li the minute without a leading zero (0 to 59)
- \row \li mm \li the minute with a leading zero (00 to 59)
- \row \li s \li the whole second without a leading zero (0 to 59)
- \row \li ss \li the whole second with a leading zero where applicable (00 to 59)
- \row \li z \li the fractional part of the second, to go after a decimal
- point, without trailing zeroes (0 to 999). Thus "\c{s.z}"
- reports the seconds to full available (millisecond) precision
- without trailing zeroes.
- \row \li zzz \li the fractional part of the second, to millisecond
- precision, including trailing zeroes where applicable (000 to 999).
- \row \li AP or A
- \li interpret as an AM/PM time. \e AP must be either "AM" or "PM".
- \row \li ap or a
- \li Interpret as an AM/PM time. \e ap must be either "am" or "pm".
- \endtable
-
- All other input characters will be treated as text. Any sequence
- of characters that are enclosed in single quotes will also be
- treated as text and not be used as an expression.
-
- \snippet code/src_corelib_tools_qdatetime.cpp 12
-
- If the format is not satisfied, an invalid QDateTime is returned.
- The expressions that don't have leading zeroes (d, M, h, m, s, z) will be
- greedy. This means that they will use two digits even if this will
- put them outside the range and/or leave too few digits for other
- sections.
-
- \snippet code/src_corelib_tools_qdatetime.cpp 13
-
- This could have meant 1 January 00:30.00 but the M will grab
- two digits.
-
- Incorrectly specified fields of the \a string will cause an invalid
- QDateTime to be returned. For example, consider the following code,
- where the two digit year 12 is read as 1912 (see the table below for all
- field defaults); the resulting datetime is invalid because 23 April 1912
- was a Tuesday, not a Monday:
-
- \snippet code/src_corelib_tools_qdatetime.cpp 20
-
- The correct code is:
-
- \snippet code/src_corelib_tools_qdatetime.cpp 21
-
- For any field that is not represented in the format, the following
- defaults are used:
-
- \table
- \header \li Field \li Default value
- \row \li Year \li 1900
- \row \li Month \li 1 (January)
- \row \li Day \li 1
- \row \li Hour \li 0
- \row \li Minute \li 0
- \row \li Second \li 0
- \endtable
-
- For example:
-
- \snippet code/src_corelib_tools_qdatetime.cpp 14
-
- \sa toString(), QDate::fromString(), QTime::fromString(),
- QLocale::toDateTime()
-*/
-
-QDateTime QDateTime::fromString(const QString &string, const QString &format)
-{
-#if QT_CONFIG(datetimeparser)
- QTime time;
- QDate date;
-
- QDateTimeParser dt(QVariant::DateTime, QDateTimeParser::FromString);
- // dt.setDefaultLocale(QLocale::c()); ### Qt 6
- if (dt.parseFormat(format) && dt.fromString(string, &date, &time))
- return QDateTime(date, time);
-#else
- Q_UNUSED(string);
- Q_UNUSED(format);
-#endif
- return QDateTime();
-}
-
-#endif // datestring
-/*!
- \fn QDateTime QDateTime::toLocalTime() const
-
- Returns a datetime containing the date and time information in
- this datetime, but specified using the Qt::LocalTime definition.
-
- Example:
-
- \snippet code/src_corelib_tools_qdatetime.cpp 17
-
- \sa toTimeSpec()
-*/
-
-/*!
- \fn QDateTime QDateTime::toUTC() const
-
- Returns a datetime containing the date and time information in
- this datetime, but specified using the Qt::UTC definition.
-
- Example:
-
- \snippet code/src_corelib_tools_qdatetime.cpp 18
-
- \sa toTimeSpec()
-*/
-
-/*****************************************************************************
- Date/time stream functions
- *****************************************************************************/
-
-#ifndef QT_NO_DATASTREAM
-/*!
- \relates QDate
-
- Writes the \a date to stream \a out.
-
- \sa {Serializing Qt Data Types}
-*/
-
-QDataStream &operator<<(QDataStream &out, const QDate &date)
-{
- if (out.version() < QDataStream::Qt_5_0)
- return out << quint32(date.jd);
- else
- return out << qint64(date.jd);
-}
-
-/*!
- \relates QDate
-
- Reads a date from stream \a in into the \a date.
-
- \sa {Serializing Qt Data Types}
-*/
-
-QDataStream &operator>>(QDataStream &in, QDate &date)
-{
- if (in.version() < QDataStream::Qt_5_0) {
- quint32 jd;
- in >> jd;
- // Older versions consider 0 an invalid jd.
- date.jd = (jd != 0 ? jd : QDate::nullJd());
- } else {
- qint64 jd;
- in >> jd;
- date.jd = jd;
- }
-
- return in;
-}
-
-/*!
- \relates QTime
-
- Writes \a time to stream \a out.
-
- \sa {Serializing Qt Data Types}
-*/
-
-QDataStream &operator<<(QDataStream &out, const QTime &time)
-{
- if (out.version() >= QDataStream::Qt_4_0) {
- return out << quint32(time.mds);
- } else {
- // Qt3 had no support for reading -1, QTime() was valid and serialized as 0
- return out << quint32(time.isNull() ? 0 : time.mds);
- }
-}
-
-/*!
- \relates QTime
-
- Reads a time from stream \a in into the given \a time.
-
- \sa {Serializing Qt Data Types}
-*/
-
-QDataStream &operator>>(QDataStream &in, QTime &time)
-{
- quint32 ds;
- in >> ds;
- if (in.version() >= QDataStream::Qt_4_0) {
- time.mds = int(ds);
- } else {
- // Qt3 would write 0 for a null time
- time.mds = (ds == 0) ? QTime::NullTime : int(ds);
- }
- return in;
-}
-
-/*!
- \relates QDateTime
-
- Writes \a dateTime to the \a out stream.
-
- \sa {Serializing Qt Data Types}
-*/
-QDataStream &operator<<(QDataStream &out, const QDateTime &dateTime)
-{
- QPair<QDate, QTime> dateAndTime;
-
- if (out.version() >= QDataStream::Qt_5_2) {
-
- // In 5.2 we switched to using Qt::TimeSpec and added offset support
- dateAndTime = getDateTime(dateTime.d);
- out << dateAndTime << qint8(dateTime.timeSpec());
- if (dateTime.timeSpec() == Qt::OffsetFromUTC)
- out << qint32(dateTime.offsetFromUtc());
-#if QT_CONFIG(timezone)
- else if (dateTime.timeSpec() == Qt::TimeZone)
- out << dateTime.timeZone();
-#endif // timezone
-
- } else if (out.version() == QDataStream::Qt_5_0) {
-
- // In Qt 5.0 we incorrectly serialised all datetimes as UTC.
- // This approach is wrong and should not be used again; it breaks
- // the guarantee that a deserialised local datetime is the same time
- // of day, regardless of which timezone it was serialised in.
- dateAndTime = getDateTime((dateTime.isValid() ? dateTime.toUTC() : dateTime).d);
- out << dateAndTime << qint8(dateTime.timeSpec());
-
- } else if (out.version() >= QDataStream::Qt_4_0) {
-
- // From 4.0 to 5.1 (except 5.0) we used QDateTimePrivate::Spec
- dateAndTime = getDateTime(dateTime.d);
- out << dateAndTime;
- switch (dateTime.timeSpec()) {
- case Qt::UTC:
- out << (qint8)QDateTimePrivate::UTC;
- break;
- case Qt::OffsetFromUTC:
- out << (qint8)QDateTimePrivate::OffsetFromUTC;
- break;
- case Qt::TimeZone:
- out << (qint8)QDateTimePrivate::TimeZone;
- break;
- case Qt::LocalTime:
- out << (qint8)QDateTimePrivate::LocalUnknown;
- break;
- }
-
- } else { // version < QDataStream::Qt_4_0
-
- // Before 4.0 there was no TimeSpec, only Qt::LocalTime was supported
- dateAndTime = getDateTime(dateTime.d);
- out << dateAndTime;
-
- }
-
- return out;
-}
-
-/*!
- \relates QDateTime
-
- Reads a datetime from the stream \a in into \a dateTime.
-
- \sa {Serializing Qt Data Types}
-*/
-
-QDataStream &operator>>(QDataStream &in, QDateTime &dateTime)
-{
- QDate dt;
- QTime tm;
- qint8 ts = 0;
- Qt::TimeSpec spec = Qt::LocalTime;
- qint32 offset = 0;
-#if QT_CONFIG(timezone)
- QTimeZone tz;
-#endif // timezone
-
- if (in.version() >= QDataStream::Qt_5_2) {
-
- // In 5.2 we switched to using Qt::TimeSpec and added offset support
- in >> dt >> tm >> ts;
- spec = static_cast<Qt::TimeSpec>(ts);
- if (spec == Qt::OffsetFromUTC) {
- in >> offset;
- dateTime = QDateTime(dt, tm, spec, offset);
-#if QT_CONFIG(timezone)
- } else if (spec == Qt::TimeZone) {
- in >> tz;
- dateTime = QDateTime(dt, tm, tz);
-#endif // timezone
- } else {
- dateTime = QDateTime(dt, tm, spec);
- }
-
- } else if (in.version() == QDataStream::Qt_5_0) {
-
- // In Qt 5.0 we incorrectly serialised all datetimes as UTC
- in >> dt >> tm >> ts;
- spec = static_cast<Qt::TimeSpec>(ts);
- dateTime = QDateTime(dt, tm, Qt::UTC);
- dateTime = dateTime.toTimeSpec(spec);
-
- } else if (in.version() >= QDataStream::Qt_4_0) {
-
- // From 4.0 to 5.1 (except 5.0) we used QDateTimePrivate::Spec
- in >> dt >> tm >> ts;
- switch ((QDateTimePrivate::Spec)ts) {
- case QDateTimePrivate::UTC:
- spec = Qt::UTC;
- break;
- case QDateTimePrivate::OffsetFromUTC:
- spec = Qt::OffsetFromUTC;
- break;
- case QDateTimePrivate::TimeZone:
- spec = Qt::TimeZone;
-#if QT_CONFIG(timezone)
- // FIXME: need to use a different constructor !
-#endif
- break;
- case QDateTimePrivate::LocalUnknown:
- case QDateTimePrivate::LocalStandard:
- case QDateTimePrivate::LocalDST:
- spec = Qt::LocalTime;
- break;
- }
- dateTime = QDateTime(dt, tm, spec, offset);
-
- } else { // version < QDataStream::Qt_4_0
-
- // Before 4.0 there was no TimeSpec, only Qt::LocalTime was supported
- in >> dt >> tm;
- dateTime = QDateTime(dt, tm, spec, offset);
-
- }
-
- return in;
-}
-#endif // QT_NO_DATASTREAM
-
-/*****************************************************************************
- Date / Time Debug Streams
-*****************************************************************************/
-
-#if !defined(QT_NO_DEBUG_STREAM) && QT_CONFIG(datestring)
-QDebug operator<<(QDebug dbg, const QDate &date)
-{
- QDebugStateSaver saver(dbg);
- dbg.nospace() << "QDate(";
- if (date.isValid())
- dbg.nospace() << date.toString(Qt::ISODate);
- else
- dbg.nospace() << "Invalid";
- dbg.nospace() << ')';
- return dbg;
-}
-
-QDebug operator<<(QDebug dbg, const QTime &time)
-{
- QDebugStateSaver saver(dbg);
- dbg.nospace() << "QTime(";
- if (time.isValid())
- dbg.nospace() << time.toString(QStringViewLiteral("HH:mm:ss.zzz"));
- else
- dbg.nospace() << "Invalid";
- dbg.nospace() << ')';
- return dbg;
-}
-
-QDebug operator<<(QDebug dbg, const QDateTime &date)
-{
- QDebugStateSaver saver(dbg);
- dbg.nospace() << "QDateTime(";
- if (date.isValid()) {
- const Qt::TimeSpec ts = date.timeSpec();
- dbg.noquote() << date.toString(QStringViewLiteral("yyyy-MM-dd HH:mm:ss.zzz t"))
- << ' ' << ts;
- switch (ts) {
- case Qt::UTC:
- break;
- case Qt::OffsetFromUTC:
- dbg.space() << date.offsetFromUtc() << 's';
- break;
- case Qt::TimeZone:
-#if QT_CONFIG(timezone)
- dbg.space() << date.timeZone().id();
-#endif // timezone
- break;
- case Qt::LocalTime:
- break;
- }
- } else {
- dbg.nospace() << "Invalid";
- }
- return dbg.nospace() << ')';
-}
-#endif // debug_stream && datestring
-
-/*! \fn uint qHash(const QDateTime &key, uint seed = 0)
- \relates QHash
- \since 5.0
-
- Returns the hash value for the \a key, using \a seed to seed the calculation.
-*/
-uint qHash(const QDateTime &key, uint seed)
-{
- // Use to toMSecsSinceEpoch instead of individual qHash functions for
- // QDate/QTime/spec/offset because QDateTime::operator== converts both arguments
- // to the same timezone. If we don't, qHash would return different hashes for
- // two QDateTimes that are equivalent once converted to the same timezone.
- return qHash(key.toMSecsSinceEpoch(), seed);
-}
-
-/*! \fn uint qHash(const QDate &key, uint seed = 0)
- \relates QHash
- \since 5.0
-
- Returns the hash value for the \a key, using \a seed to seed the calculation.
-*/
-uint qHash(const QDate &key, uint seed) Q_DECL_NOTHROW
-{
- return qHash(key.toJulianDay(), seed);
-}
-
-/*! \fn uint qHash(const QTime &key, uint seed = 0)
- \relates QHash
- \since 5.0
-
- Returns the hash value for the \a key, using \a seed to seed the calculation.
-*/
-uint qHash(const QTime &key, uint seed) Q_DECL_NOTHROW
-{
- return qHash(key.msecsSinceStartOfDay(), seed);
-}
-
-QT_END_NAMESPACE
diff --git a/src/corelib/tools/qdatetime.h b/src/corelib/tools/qdatetime.h
deleted file mode 100644
index 8b2a60acaa..0000000000
--- a/src/corelib/tools/qdatetime.h
+++ /dev/null
@@ -1,418 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2017 The Qt Company Ltd.
-** Copyright (C) 2016 Intel Corporation.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#ifndef QDATETIME_H
-#define QDATETIME_H
-
-#include <QtCore/qstring.h>
-#include <QtCore/qnamespace.h>
-#include <QtCore/qshareddata.h>
-
-#include <limits>
-
-#if defined(Q_OS_DARWIN) || defined(Q_QDOC)
-Q_FORWARD_DECLARE_CF_TYPE(CFDate);
-Q_FORWARD_DECLARE_OBJC_CLASS(NSDate);
-#endif
-
-QT_BEGIN_NAMESPACE
-
-class QTimeZone;
-
-class Q_CORE_EXPORT QDate
-{
-public:
- enum MonthNameType { // ### Qt 6: remove, along with methods using it
- DateFormat = 0,
- StandaloneFormat
- };
-private:
- explicit Q_DECL_CONSTEXPR QDate(qint64 julianDay) : jd(julianDay) {}
-public:
- Q_DECL_CONSTEXPR QDate() : jd(nullJd()) {}
- QDate(int y, int m, int d);
-
- Q_DECL_CONSTEXPR bool isNull() const { return !isValid(); }
- Q_DECL_CONSTEXPR bool isValid() const { return jd >= minJd() && jd <= maxJd(); }
-
- int year() const;
- int month() const;
- int day() const;
- int dayOfWeek() const;
- int dayOfYear() const;
- int daysInMonth() const;
- int daysInYear() const;
- int weekNumber(int *yearNum = nullptr) const;
-
-#if QT_DEPRECATED_SINCE(5, 10) && QT_CONFIG(textdate)
- QT_DEPRECATED_X("Use QLocale::monthName or QLocale::standaloneMonthName")
- static QString shortMonthName(int month, MonthNameType type = DateFormat);
- QT_DEPRECATED_X("Use QLocale::dayName or QLocale::standaloneDayName")
- static QString shortDayName(int weekday, MonthNameType type = DateFormat);
- QT_DEPRECATED_X("Use QLocale::monthName or QLocale::standaloneMonthName")
- static QString longMonthName(int month, MonthNameType type = DateFormat);
- QT_DEPRECATED_X("Use QLocale::dayName or QLocale::standaloneDayName")
- static QString longDayName(int weekday, MonthNameType type = DateFormat);
-#endif // textdate && deprecated
-#if QT_CONFIG(datestring)
- QString toString(Qt::DateFormat f = Qt::TextDate) const;
-#if QT_STRINGVIEW_LEVEL < 2
- QString toString(const QString &format) const;
-#endif
- QString toString(QStringView format) const;
-#endif
-#if QT_DEPRECATED_SINCE(5,0)
-QT_DEPRECATED inline bool setYMD(int y, int m, int d)
-{ if (uint(y) <= 99) y += 1900; return setDate(y, m, d); }
-#endif
-
- bool setDate(int year, int month, int day);
-
-#if QT_VERSION < QT_VERSION_CHECK(6, 0, 0)
- void getDate(int *year, int *month, int *day); // ### Qt 6: remove
-#endif // < Qt 6
- void getDate(int *year, int *month, int *day) const;
-
- Q_REQUIRED_RESULT QDate addDays(qint64 days) const;
- Q_REQUIRED_RESULT QDate addMonths(int months) const;
- Q_REQUIRED_RESULT QDate addYears(int years) const;
- qint64 daysTo(const QDate &) const;
-
- Q_DECL_CONSTEXPR bool operator==(const QDate &other) const { return jd == other.jd; }
- Q_DECL_CONSTEXPR bool operator!=(const QDate &other) const { return jd != other.jd; }
- Q_DECL_CONSTEXPR bool operator< (const QDate &other) const { return jd < other.jd; }
- Q_DECL_CONSTEXPR bool operator<=(const QDate &other) const { return jd <= other.jd; }
- Q_DECL_CONSTEXPR bool operator> (const QDate &other) const { return jd > other.jd; }
- Q_DECL_CONSTEXPR bool operator>=(const QDate &other) const { return jd >= other.jd; }
-
- static QDate currentDate();
-#if QT_CONFIG(datestring)
- static QDate fromString(const QString &s, Qt::DateFormat f = Qt::TextDate);
- static QDate fromString(const QString &s, const QString &format);
-#endif
- static bool isValid(int y, int m, int d);
- static bool isLeapYear(int year);
-
- static Q_DECL_CONSTEXPR inline QDate fromJulianDay(qint64 jd_)
- { return jd_ >= minJd() && jd_ <= maxJd() ? QDate(jd_) : QDate() ; }
- Q_DECL_CONSTEXPR inline qint64 toJulianDay() const { return jd; }
-
-private:
- // using extra parentheses around min to avoid expanding it if it is a macro
- static Q_DECL_CONSTEXPR inline qint64 nullJd() { return (std::numeric_limits<qint64>::min)(); }
- static Q_DECL_CONSTEXPR inline qint64 minJd() { return Q_INT64_C(-784350574879); }
- static Q_DECL_CONSTEXPR inline qint64 maxJd() { return Q_INT64_C( 784354017364); }
-
- qint64 jd;
-
- friend class QDateTime;
- friend class QDateTimePrivate;
-#ifndef QT_NO_DATASTREAM
- friend Q_CORE_EXPORT QDataStream &operator<<(QDataStream &, const QDate &);
- friend Q_CORE_EXPORT QDataStream &operator>>(QDataStream &, QDate &);
-#endif
-};
-Q_DECLARE_TYPEINFO(QDate, Q_MOVABLE_TYPE);
-
-class Q_CORE_EXPORT QTime
-{
- explicit Q_DECL_CONSTEXPR QTime(int ms) : mds(ms)
- {}
-public:
- Q_DECL_CONSTEXPR QTime(): mds(NullTime)
- {}
- QTime(int h, int m, int s = 0, int ms = 0);
-
- Q_DECL_CONSTEXPR bool isNull() const { return mds == NullTime; }
- bool isValid() const;
-
- int hour() const;
- int minute() const;
- int second() const;
- int msec() const;
-#if QT_CONFIG(datestring)
- QString toString(Qt::DateFormat f = Qt::TextDate) const;
-#if QT_STRINGVIEW_LEVEL < 2
- QString toString(const QString &format) const;
-#endif
- QString toString(QStringView format) const;
-#endif
- bool setHMS(int h, int m, int s, int ms = 0);
-
- Q_REQUIRED_RESULT QTime addSecs(int secs) const;
- int secsTo(const QTime &) const;
- Q_REQUIRED_RESULT QTime addMSecs(int ms) const;
- int msecsTo(const QTime &) const;
-
- Q_DECL_CONSTEXPR bool operator==(const QTime &other) const { return mds == other.mds; }
- Q_DECL_CONSTEXPR bool operator!=(const QTime &other) const { return mds != other.mds; }
- Q_DECL_CONSTEXPR bool operator< (const QTime &other) const { return mds < other.mds; }
- Q_DECL_CONSTEXPR bool operator<=(const QTime &other) const { return mds <= other.mds; }
- Q_DECL_CONSTEXPR bool operator> (const QTime &other) const { return mds > other.mds; }
- Q_DECL_CONSTEXPR bool operator>=(const QTime &other) const { return mds >= other.mds; }
-
- static Q_DECL_CONSTEXPR inline QTime fromMSecsSinceStartOfDay(int msecs) { return QTime(msecs); }
- Q_DECL_CONSTEXPR inline int msecsSinceStartOfDay() const { return mds == NullTime ? 0 : mds; }
-
- static QTime currentTime();
-#if QT_CONFIG(datestring)
- static QTime fromString(const QString &s, Qt::DateFormat f = Qt::TextDate);
- static QTime fromString(const QString &s, const QString &format);
-#endif
- static bool isValid(int h, int m, int s, int ms = 0);
-
- void start();
- int restart();
- int elapsed() const;
-private:
- enum TimeFlag { NullTime = -1 };
- Q_DECL_CONSTEXPR inline int ds() const { return mds == -1 ? 0 : mds; }
- int mds;
-
- friend class QDateTime;
- friend class QDateTimePrivate;
-#ifndef QT_NO_DATASTREAM
- friend Q_CORE_EXPORT QDataStream &operator<<(QDataStream &, const QTime &);
- friend Q_CORE_EXPORT QDataStream &operator>>(QDataStream &, QTime &);
-#endif
-};
-Q_DECLARE_TYPEINFO(QTime, Q_MOVABLE_TYPE);
-
-class QDateTimePrivate;
-
-class Q_CORE_EXPORT QDateTime
-{
- // ### Qt 6: revisit the optimization
- struct ShortData {
-#if Q_BYTE_ORDER == Q_LITTLE_ENDIAN
- quintptr status : 8;
-#endif
- // note: this is only 24 bits on 32-bit systems...
- qintptr msecs : sizeof(void *) * 8 - 8;
-
-#if Q_BYTE_ORDER == Q_BIG_ENDIAN
- quintptr status : 8;
-#endif
- };
-
- union Data {
- enum {
- // To be of any use, we need at least 60 years around 1970, which
- // is 1,893,456,000,000 ms. That requires 41 bits to store, plus
- // the sign bit. With the status byte, the minimum size is 50 bits.
- CanBeSmall = sizeof(ShortData) * 8 > 50
- };
-
- Data();
- Data(Qt::TimeSpec);
- Data(const Data &other);
- Data(Data &&other);
- Data &operator=(const Data &other);
- ~Data();
-
- bool isShort() const;
- void detach();
-
- const QDateTimePrivate *operator->() const;
- QDateTimePrivate *operator->();
-
- QDateTimePrivate *d;
- ShortData data;
- };
-
-public:
- QDateTime() Q_DECL_NOEXCEPT_EXPR(Data::CanBeSmall);
- explicit QDateTime(const QDate &);
- QDateTime(const QDate &, const QTime &, Qt::TimeSpec spec = Qt::LocalTime);
- // ### Qt 6: Merge with above with default offsetSeconds = 0
- QDateTime(const QDate &date, const QTime &time, Qt::TimeSpec spec, int offsetSeconds);
-#if QT_CONFIG(timezone)
- QDateTime(const QDate &date, const QTime &time, const QTimeZone &timeZone);
-#endif // timezone
- QDateTime(const QDateTime &other) Q_DECL_NOTHROW;
- QDateTime(QDateTime &&other) Q_DECL_NOTHROW;
- ~QDateTime();
-
-#ifdef Q_COMPILER_RVALUE_REFS
- QDateTime &operator=(QDateTime &&other) Q_DECL_NOTHROW { swap(other); return *this; }
-#endif
- QDateTime &operator=(const QDateTime &other) Q_DECL_NOTHROW;
-
- void swap(QDateTime &other) Q_DECL_NOTHROW { qSwap(d.d, other.d.d); }
-
- bool isNull() const;
- bool isValid() const;
-
- QDate date() const;
- QTime time() const;
- Qt::TimeSpec timeSpec() const;
- int offsetFromUtc() const;
-#if QT_CONFIG(timezone)
- QTimeZone timeZone() const;
-#endif // timezone
- QString timeZoneAbbreviation() const;
- bool isDaylightTime() const;
-
- qint64 toMSecsSinceEpoch() const;
- qint64 toSecsSinceEpoch() const;
-
- void setDate(const QDate &date);
- void setTime(const QTime &time);
- void setTimeSpec(Qt::TimeSpec spec);
- void setOffsetFromUtc(int offsetSeconds);
-#if QT_CONFIG(timezone)
- void setTimeZone(const QTimeZone &toZone);
-#endif // timezone
- void setMSecsSinceEpoch(qint64 msecs);
- void setSecsSinceEpoch(qint64 secs);
-
-#if QT_CONFIG(datestring)
- QString toString(Qt::DateFormat f = Qt::TextDate) const;
-#if QT_STRINGVIEW_LEVEL < 2
- QString toString(const QString &format) const;
-#endif
- QString toString(QStringView format) const;
-#endif
- Q_REQUIRED_RESULT QDateTime addDays(qint64 days) const;
- Q_REQUIRED_RESULT QDateTime addMonths(int months) const;
- Q_REQUIRED_RESULT QDateTime addYears(int years) const;
- Q_REQUIRED_RESULT QDateTime addSecs(qint64 secs) const;
- Q_REQUIRED_RESULT QDateTime addMSecs(qint64 msecs) const;
-
- QDateTime toTimeSpec(Qt::TimeSpec spec) const;
- inline QDateTime toLocalTime() const { return toTimeSpec(Qt::LocalTime); }
- inline QDateTime toUTC() const { return toTimeSpec(Qt::UTC); }
- QDateTime toOffsetFromUtc(int offsetSeconds) const;
-#if QT_CONFIG(timezone)
- QDateTime toTimeZone(const QTimeZone &toZone) const;
-#endif // timezone
-
- qint64 daysTo(const QDateTime &) const;
- qint64 secsTo(const QDateTime &) const;
- qint64 msecsTo(const QDateTime &) const;
-
- bool operator==(const QDateTime &other) const;
- inline bool operator!=(const QDateTime &other) const { return !(*this == other); }
- bool operator<(const QDateTime &other) const;
- inline bool operator<=(const QDateTime &other) const { return !(other < *this); }
- inline bool operator>(const QDateTime &other) const { return other < *this; }
- inline bool operator>=(const QDateTime &other) const { return !(*this < other); }
-
-#if QT_DEPRECATED_SINCE(5, 2) // ### Qt 6: remove
- QT_DEPRECATED void setUtcOffset(int seconds);
- QT_DEPRECATED int utcOffset() const;
-#endif // QT_DEPRECATED_SINCE
-
- static QDateTime currentDateTime();
- static QDateTime currentDateTimeUtc();
-#if QT_CONFIG(datestring)
- static QDateTime fromString(const QString &s, Qt::DateFormat f = Qt::TextDate);
- static QDateTime fromString(const QString &s, const QString &format);
-#endif
-
-#if QT_DEPRECATED_SINCE(5, 8)
- uint toTime_t() const;
- void setTime_t(uint secsSince1Jan1970UTC);
- static QDateTime fromTime_t(uint secsSince1Jan1970UTC);
- static QDateTime fromTime_t(uint secsSince1Jan1970UTC, Qt::TimeSpec spec,
- int offsetFromUtc = 0);
- static QDateTime fromTime_t(uint secsSince1Jan1970UTC, const QTimeZone &timeZone);
-#endif
-
- static QDateTime fromMSecsSinceEpoch(qint64 msecs);
- // ### Qt 6: Merge with above with default spec = Qt::LocalTime
- static QDateTime fromMSecsSinceEpoch(qint64 msecs, Qt::TimeSpec spec, int offsetFromUtc = 0);
- static QDateTime fromSecsSinceEpoch(qint64 secs, Qt::TimeSpec spe = Qt::LocalTime, int offsetFromUtc = 0);
-
-#if QT_CONFIG(timezone)
- static QDateTime fromMSecsSinceEpoch(qint64 msecs, const QTimeZone &timeZone);
- static QDateTime fromSecsSinceEpoch(qint64 secs, const QTimeZone &timeZone);
-#endif
-
- static qint64 currentMSecsSinceEpoch() Q_DECL_NOTHROW;
- static qint64 currentSecsSinceEpoch() Q_DECL_NOTHROW;
-
-#if defined(Q_OS_DARWIN) || defined(Q_QDOC)
- static QDateTime fromCFDate(CFDateRef date);
- CFDateRef toCFDate() const Q_DECL_CF_RETURNS_RETAINED;
- static QDateTime fromNSDate(const NSDate *date);
- NSDate *toNSDate() const Q_DECL_NS_RETURNS_AUTORELEASED;
-#endif
-
-private:
- friend class QDateTimePrivate;
-
- Data d;
-
-#ifndef QT_NO_DATASTREAM
- friend Q_CORE_EXPORT QDataStream &operator<<(QDataStream &, const QDateTime &);
- friend Q_CORE_EXPORT QDataStream &operator>>(QDataStream &, QDateTime &);
-#endif
-
-#if !defined(QT_NO_DEBUG_STREAM) && QT_CONFIG(datestring)
- friend Q_CORE_EXPORT QDebug operator<<(QDebug, const QDateTime &);
-#endif
-};
-Q_DECLARE_SHARED(QDateTime)
-
-#ifndef QT_NO_DATASTREAM
-Q_CORE_EXPORT QDataStream &operator<<(QDataStream &, const QDate &);
-Q_CORE_EXPORT QDataStream &operator>>(QDataStream &, QDate &);
-Q_CORE_EXPORT QDataStream &operator<<(QDataStream &, const QTime &);
-Q_CORE_EXPORT QDataStream &operator>>(QDataStream &, QTime &);
-Q_CORE_EXPORT QDataStream &operator<<(QDataStream &, const QDateTime &);
-Q_CORE_EXPORT QDataStream &operator>>(QDataStream &, QDateTime &);
-#endif // QT_NO_DATASTREAM
-
-#if !defined(QT_NO_DEBUG_STREAM) && QT_CONFIG(datestring)
-Q_CORE_EXPORT QDebug operator<<(QDebug, const QDate &);
-Q_CORE_EXPORT QDebug operator<<(QDebug, const QTime &);
-Q_CORE_EXPORT QDebug operator<<(QDebug, const QDateTime &);
-#endif
-
-// QDateTime is not noexcept for now -- to be revised once
-// timezone and calendaring support is added
-Q_CORE_EXPORT uint qHash(const QDateTime &key, uint seed = 0);
-Q_CORE_EXPORT uint qHash(const QDate &key, uint seed = 0) Q_DECL_NOTHROW;
-Q_CORE_EXPORT uint qHash(const QTime &key, uint seed = 0) Q_DECL_NOTHROW;
-
-QT_END_NAMESPACE
-
-#endif // QDATETIME_H
diff --git a/src/corelib/tools/qdatetime_p.h b/src/corelib/tools/qdatetime_p.h
deleted file mode 100644
index b3d00745d0..0000000000
--- a/src/corelib/tools/qdatetime_p.h
+++ /dev/null
@@ -1,151 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Copyright (C) 2016 Intel Corporation.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#ifndef QDATETIME_P_H
-#define QDATETIME_P_H
-
-//
-// W A R N I N G
-// -------------
-//
-// This file is not part of the Qt API. It exists purely as an
-// implementation detail. This header file may change from version to
-// version without notice, or even be removed.
-//
-// We mean it.
-//
-
-#include <QtCore/private/qglobal_p.h>
-#include "qplatformdefs.h"
-#include "QtCore/qatomic.h"
-#include "QtCore/qdatetime.h"
-#include "QtCore/qpair.h"
-
-#if QT_CONFIG(timezone)
-#include "qtimezone.h"
-#endif
-
-QT_BEGIN_NAMESPACE
-
-class QDateTimePrivate
-{
-public:
- // forward the declarations from QDateTime (this makes them public)
- typedef QDateTime::ShortData QDateTimeShortData;
- typedef QDateTime::Data QDateTimeData;
-
- // Never change or delete this enum, it is required for backwards compatible
- // serialization of QDateTime before 5.2, so is essentially public API
- enum Spec {
- LocalUnknown = -1,
- LocalStandard = 0,
- LocalDST = 1,
- UTC = 2,
- OffsetFromUTC = 3,
- TimeZone = 4
- };
-
- // Daylight Time Status
- enum DaylightStatus {
- UnknownDaylightTime = -1,
- StandardTime = 0,
- DaylightTime = 1
- };
-
- // Status of date/time
- enum StatusFlag {
- ShortData = 0x01,
-
- ValidDate = 0x02,
- ValidTime = 0x04,
- ValidDateTime = 0x08,
-
- TimeSpecMask = 0x30,
-
- SetToStandardTime = 0x40,
- SetToDaylightTime = 0x80
- };
- Q_DECLARE_FLAGS(StatusFlags, StatusFlag)
-
- enum {
- TimeSpecShift = 4,
- ValidityMask = ValidDate | ValidTime | ValidDateTime,
- DaylightMask = SetToStandardTime | SetToDaylightTime
- };
-
- QDateTimePrivate() : m_msecs(0),
- m_status(StatusFlag(Qt::LocalTime << TimeSpecShift)),
- m_offsetFromUtc(0),
- ref(0)
- {
- }
-
- static QDateTime::Data create(const QDate &toDate, const QTime &toTime, Qt::TimeSpec toSpec,
- int offsetSeconds);
-
-#if QT_CONFIG(timezone)
- static QDateTime::Data create(const QDate &toDate, const QTime &toTime, const QTimeZone & timeZone);
-#endif // timezone
-
- qint64 m_msecs;
- StatusFlags m_status;
- int m_offsetFromUtc;
- mutable QAtomicInt ref;
-#if QT_CONFIG(timezone)
- QTimeZone m_timeZone;
-#endif // timezone
-
-#if QT_CONFIG(timezone)
- static qint64 zoneMSecsToEpochMSecs(qint64 msecs, const QTimeZone &zone,
- DaylightStatus hint = UnknownDaylightTime,
- QDate *localDate = 0, QTime *localTime = 0);
-
- // Inlined for its one caller in qdatetime.cpp
- inline void setUtcOffsetByTZ(qint64 atMSecsSinceEpoch);
-#endif // timezone
-
- // ### Qt 5.14: expose publicly in QDateTime
- // The first and last years of which QDateTime can represent some part:
- enum class YearRange : qint32 { First = -292275056, Last = +292278994 };
-};
-
-QT_END_NAMESPACE
-
-#endif // QDATETIME_P_H
diff --git a/src/corelib/tools/qdatetimeparser.cpp b/src/corelib/tools/qdatetimeparser.cpp
deleted file mode 100644
index adc5451dec..0000000000
--- a/src/corelib/tools/qdatetimeparser.cpp
+++ /dev/null
@@ -1,2051 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#include "qplatformdefs.h"
-#include "private/qdatetimeparser_p.h"
-
-#include "qdatastream.h"
-#include "qset.h"
-#include "qlocale.h"
-#include "qdatetime.h"
-#if QT_CONFIG(timezone)
-#include "qtimezone.h"
-#endif
-#include "qregexp.h"
-#include "qdebug.h"
-
-//#define QDATETIMEPARSER_DEBUG
-#if defined (QDATETIMEPARSER_DEBUG) && !defined(QT_NO_DEBUG_STREAM)
-# define QDTPDEBUG qDebug()
-# define QDTPDEBUGN qDebug
-#else
-# define QDTPDEBUG if (false) qDebug()
-# define QDTPDEBUGN if (false) qDebug
-#endif
-
-QT_BEGIN_NAMESPACE
-
-QDateTimeParser::~QDateTimeParser()
-{
-}
-
-/*!
- \internal
- Gets the digit from a datetime. E.g.
-
- QDateTime var(QDate(2004, 02, 02));
- int digit = getDigit(var, Year);
- // digit = 2004
-*/
-
-int QDateTimeParser::getDigit(const QDateTime &t, int index) const
-{
- if (index < 0 || index >= sectionNodes.size()) {
-#if QT_CONFIG(datestring)
- qWarning("QDateTimeParser::getDigit() Internal error (%s %d)",
- qPrintable(t.toString()), index);
-#else
- qWarning("QDateTimeParser::getDigit() Internal error (%d)", index);
-#endif
- return -1;
- }
- const SectionNode &node = sectionNodes.at(index);
- switch (node.type) {
- case TimeZoneSection: return t.offsetFromUtc();
- case Hour24Section: case Hour12Section: return t.time().hour();
- case MinuteSection: return t.time().minute();
- case SecondSection: return t.time().second();
- case MSecSection: return t.time().msec();
- case YearSection2Digits:
- case YearSection: return t.date().year();
- case MonthSection: return t.date().month();
- case DaySection: return t.date().day();
- case DayOfWeekSectionShort:
- case DayOfWeekSectionLong: return t.date().day();
- case AmPmSection: return t.time().hour() > 11 ? 1 : 0;
-
- default: break;
- }
-
-#if QT_CONFIG(datestring)
- qWarning("QDateTimeParser::getDigit() Internal error 2 (%s %d)",
- qPrintable(t.toString()), index);
-#else
- qWarning("QDateTimeParser::getDigit() Internal error 2 (%d)", index);
-#endif
- return -1;
-}
-
-/*!
- \internal
- Sets a digit in a datetime. E.g.
-
- QDateTime var(QDate(2004, 02, 02));
- int digit = getDigit(var, Year);
- // digit = 2004
- setDigit(&var, Year, 2005);
- digit = getDigit(var, Year);
- // digit = 2005
-*/
-
-bool QDateTimeParser::setDigit(QDateTime &v, int index, int newVal) const
-{
- if (index < 0 || index >= sectionNodes.size()) {
-#if QT_CONFIG(datestring)
- qWarning("QDateTimeParser::setDigit() Internal error (%s %d %d)",
- qPrintable(v.toString()), index, newVal);
-#else
- qWarning("QDateTimeParser::setDigit() Internal error (%d %d)", index, newVal);
-#endif
- return false;
- }
- const SectionNode &node = sectionNodes.at(index);
-
- const QDate date = v.date();
- const QTime time = v.time();
- int year = date.year();
- int month = date.month();
- int day = date.day();
- int hour = time.hour();
- int minute = time.minute();
- int second = time.second();
- int msec = time.msec();
- Qt::TimeSpec tspec = v.timeSpec();
- // Only offset from UTC is amenable to setting an int value:
- int offset = tspec == Qt::OffsetFromUTC ? v.offsetFromUtc() : 0;
-
- switch (node.type) {
- case Hour24Section: case Hour12Section: hour = newVal; break;
- case MinuteSection: minute = newVal; break;
- case SecondSection: second = newVal; break;
- case MSecSection: msec = newVal; break;
- case YearSection2Digits:
- case YearSection: year = newVal; break;
- case MonthSection: month = newVal; break;
- case DaySection:
- case DayOfWeekSectionShort:
- case DayOfWeekSectionLong:
- if (newVal > 31) {
- // have to keep legacy behavior. setting the
- // date to 32 should return false. Setting it
- // to 31 for february should return true
- return false;
- }
- day = newVal;
- break;
- case TimeZoneSection:
- if (newVal < absoluteMin(index) || newVal > absoluteMax(index))
- return false;
- tspec = Qt::OffsetFromUTC;
- offset = newVal;
- break;
- case AmPmSection: hour = (newVal == 0 ? hour % 12 : (hour % 12) + 12); break;
- default:
- qWarning("QDateTimeParser::setDigit() Internal error (%s)",
- qPrintable(node.name()));
- break;
- }
-
- if (!(node.type & DaySectionMask)) {
- if (day < cachedDay)
- day = cachedDay;
- const int max = QDate(year, month, 1).daysInMonth();
- if (day > max) {
- day = max;
- }
- }
-
- const QDate newDate(year, month, day);
- const QTime newTime(hour, minute, second, msec);
- if (!newDate.isValid() || !newTime.isValid())
- return false;
-
- // Preserve zone:
- v =
-#if QT_CONFIG(timezone)
- tspec == Qt::TimeZone ? QDateTime(newDate, newTime, v.timeZone()) :
-#endif
- QDateTime(newDate, newTime, tspec, offset);
- return true;
-}
-
-
-
-/*!
- \internal
-
- Returns the absolute maximum for a section
-*/
-
-int QDateTimeParser::absoluteMax(int s, const QDateTime &cur) const
-{
- const SectionNode &sn = sectionNode(s);
- switch (sn.type) {
-#if QT_CONFIG(timezone)
- case TimeZoneSection: return QTimeZone::MaxUtcOffsetSecs;
-#endif
- case Hour24Section:
- case Hour12Section: return 23; // this is special-cased in
- // parseSection. We want it to be
- // 23 for the stepBy case.
- case MinuteSection:
- case SecondSection: return 59;
- case MSecSection: return 999;
- case YearSection2Digits:
- case YearSection: return 9999; // sectionMaxSize will prevent
- // people from typing in a larger
- // number in count == 2 sections.
- // stepBy() will work on real years anyway
- case MonthSection: return 12;
- case DaySection:
- case DayOfWeekSectionShort:
- case DayOfWeekSectionLong: return cur.isValid() ? cur.date().daysInMonth() : 31;
- case AmPmSection: return 1;
- default: break;
- }
- qWarning("QDateTimeParser::absoluteMax() Internal error (%s)",
- qPrintable(sn.name()));
- return -1;
-}
-
-/*!
- \internal
-
- Returns the absolute minimum for a section
-*/
-
-int QDateTimeParser::absoluteMin(int s) const
-{
- const SectionNode &sn = sectionNode(s);
- switch (sn.type) {
-#if QT_CONFIG(timezone)
- case TimeZoneSection: return QTimeZone::MinUtcOffsetSecs;
-#endif
- case Hour24Section:
- case Hour12Section:
- case MinuteSection:
- case SecondSection:
- case MSecSection:
- case YearSection2Digits:
- case YearSection: return 0;
- case MonthSection:
- case DaySection:
- case DayOfWeekSectionShort:
- case DayOfWeekSectionLong: return 1;
- case AmPmSection: return 0;
- default: break;
- }
- qWarning("QDateTimeParser::absoluteMin() Internal error (%s, %0x)",
- qPrintable(sn.name()), sn.type);
- return -1;
-}
-
-/*!
- \internal
-
- Returns the sectionNode for the Section \a s.
-*/
-
-const QDateTimeParser::SectionNode &QDateTimeParser::sectionNode(int sectionIndex) const
-{
- if (sectionIndex < 0) {
- switch (sectionIndex) {
- case FirstSectionIndex:
- return first;
- case LastSectionIndex:
- return last;
- case NoSectionIndex:
- return none;
- }
- } else if (sectionIndex < sectionNodes.size()) {
- return sectionNodes.at(sectionIndex);
- }
-
- qWarning("QDateTimeParser::sectionNode() Internal error (%d)",
- sectionIndex);
- return none;
-}
-
-QDateTimeParser::Section QDateTimeParser::sectionType(int sectionIndex) const
-{
- return sectionNode(sectionIndex).type;
-}
-
-
-/*!
- \internal
-
- Returns the starting position for section \a s.
-*/
-
-int QDateTimeParser::sectionPos(int sectionIndex) const
-{
- return sectionPos(sectionNode(sectionIndex));
-}
-
-int QDateTimeParser::sectionPos(const SectionNode &sn) const
-{
- switch (sn.type) {
- case FirstSection: return 0;
- case LastSection: return displayText().size() - 1;
- default: break;
- }
- if (sn.pos == -1) {
- qWarning("QDateTimeParser::sectionPos Internal error (%s)", qPrintable(sn.name()));
- return -1;
- }
- return sn.pos;
-}
-
-
-/*!
- \internal
-
- helper function for parseFormat. removes quotes that are
- not escaped and removes the escaping on those that are escaped
-
-*/
-
-static QString unquote(const QStringRef &str)
-{
- const QChar quote(QLatin1Char('\''));
- const QChar slash(QLatin1Char('\\'));
- const QChar zero(QLatin1Char('0'));
- QString ret;
- QChar status(zero);
- const int max = str.size();
- for (int i=0; i<max; ++i) {
- if (str.at(i) == quote) {
- if (status != quote) {
- status = quote;
- } else if (!ret.isEmpty() && str.at(i - 1) == slash) {
- ret[ret.size() - 1] = quote;
- } else {
- status = zero;
- }
- } else {
- ret += str.at(i);
- }
- }
- return ret;
-}
-/*!
- \internal
-
- Parses the format \a newFormat. If successful, returns \c true and
- sets up the format. Else keeps the old format and returns \c false.
-
-*/
-
-static inline int countRepeat(const QString &str, int index, int maxCount)
-{
- int count = 1;
- const QChar ch(str.at(index));
- const int max = qMin(index + maxCount, str.size());
- while (index + count < max && str.at(index + count) == ch) {
- ++count;
- }
- return count;
-}
-
-static inline void appendSeparator(QStringList *list, const QString &string, int from, int size, int lastQuote)
-{
- const QStringRef separator = string.midRef(from, size);
- list->append(lastQuote >= from ? unquote(separator) : separator.toString());
-}
-
-
-bool QDateTimeParser::parseFormat(const QString &newFormat)
-{
- const QLatin1Char quote('\'');
- const QLatin1Char slash('\\');
- const QLatin1Char zero('0');
- if (newFormat == displayFormat && !newFormat.isEmpty()) {
- return true;
- }
-
- QDTPDEBUGN("parseFormat: %s", newFormat.toLatin1().constData());
-
- QVector<SectionNode> newSectionNodes;
- Sections newDisplay = 0;
- QStringList newSeparators;
- int i, index = 0;
- int add = 0;
- QChar status(zero);
- const int max = newFormat.size();
- int lastQuote = -1;
- for (i = 0; i<max; ++i) {
- if (newFormat.at(i) == quote) {
- lastQuote = i;
- ++add;
- if (status != quote) {
- status = quote;
- } else if (i > 0 && newFormat.at(i - 1) != slash) {
- status = zero;
- }
- } else if (status != quote) {
- const char sect = newFormat.at(i).toLatin1();
- switch (sect) {
- case 'H':
- case 'h':
- if (parserType != QVariant::Date) {
- const Section hour = (sect == 'h') ? Hour12Section : Hour24Section;
- const SectionNode sn = { hour, i - add, countRepeat(newFormat, i, 2), 0 };
- newSectionNodes.append(sn);
- appendSeparator(&newSeparators, newFormat, index, i - index, lastQuote);
- i += sn.count - 1;
- index = i + 1;
- newDisplay |= hour;
- }
- break;
- case 'm':
- if (parserType != QVariant::Date) {
- const SectionNode sn = { MinuteSection, i - add, countRepeat(newFormat, i, 2), 0 };
- newSectionNodes.append(sn);
- appendSeparator(&newSeparators, newFormat, index, i - index, lastQuote);
- i += sn.count - 1;
- index = i + 1;
- newDisplay |= MinuteSection;
- }
- break;
- case 's':
- if (parserType != QVariant::Date) {
- const SectionNode sn = { SecondSection, i - add, countRepeat(newFormat, i, 2), 0 };
- newSectionNodes.append(sn);
- appendSeparator(&newSeparators, newFormat, index, i - index, lastQuote);
- i += sn.count - 1;
- index = i + 1;
- newDisplay |= SecondSection;
- }
- break;
-
- case 'z':
- if (parserType != QVariant::Date) {
- const SectionNode sn = { MSecSection, i - add, countRepeat(newFormat, i, 3) < 3 ? 1 : 3, 0 };
- newSectionNodes.append(sn);
- appendSeparator(&newSeparators, newFormat, index, i - index, lastQuote);
- i += sn.count - 1;
- index = i + 1;
- newDisplay |= MSecSection;
- }
- break;
- case 'A':
- case 'a':
- if (parserType != QVariant::Date) {
- const bool cap = (sect == 'A');
- const SectionNode sn = { AmPmSection, i - add, (cap ? 1 : 0), 0 };
- newSectionNodes.append(sn);
- appendSeparator(&newSeparators, newFormat, index, i - index, lastQuote);
- newDisplay |= AmPmSection;
- if (i + 1 < newFormat.size()
- && newFormat.at(i+1) == (cap ? QLatin1Char('P') : QLatin1Char('p'))) {
- ++i;
- }
- index = i + 1;
- }
- break;
- case 'y':
- if (parserType != QVariant::Time) {
- const int repeat = countRepeat(newFormat, i, 4);
- if (repeat >= 2) {
- const SectionNode sn = { repeat == 4 ? YearSection : YearSection2Digits,
- i - add, repeat == 4 ? 4 : 2, 0 };
- newSectionNodes.append(sn);
- appendSeparator(&newSeparators, newFormat, index, i - index, lastQuote);
- i += sn.count - 1;
- index = i + 1;
- newDisplay |= sn.type;
- }
- }
- break;
- case 'M':
- if (parserType != QVariant::Time) {
- const SectionNode sn = { MonthSection, i - add, countRepeat(newFormat, i, 4), 0 };
- newSectionNodes.append(sn);
- newSeparators.append(unquote(newFormat.midRef(index, i - index)));
- i += sn.count - 1;
- index = i + 1;
- newDisplay |= MonthSection;
- }
- break;
- case 'd':
- if (parserType != QVariant::Time) {
- const int repeat = countRepeat(newFormat, i, 4);
- const Section sectionType = (repeat == 4 ? DayOfWeekSectionLong
- : (repeat == 3 ? DayOfWeekSectionShort : DaySection));
- const SectionNode sn = { sectionType, i - add, repeat, 0 };
- newSectionNodes.append(sn);
- appendSeparator(&newSeparators, newFormat, index, i - index, lastQuote);
- i += sn.count - 1;
- index = i + 1;
- newDisplay |= sn.type;
- }
- break;
- case 't':
- if (parserType != QVariant::Time) {
- const SectionNode sn = { TimeZoneSection, i - add, countRepeat(newFormat, i, 4), 0 };
- newSectionNodes.append(sn);
- appendSeparator(&newSeparators, newFormat, index, i - index, lastQuote);
- i += sn.count - 1;
- index = i + 1;
- newDisplay |= TimeZoneSection;
- }
- break;
- default:
- break;
- }
- }
- }
- if (newSectionNodes.isEmpty() && context == DateTimeEdit) {
- return false;
- }
-
- if ((newDisplay & (AmPmSection|Hour12Section)) == Hour12Section) {
- const int count = newSectionNodes.size();
- for (int i = 0; i < count; ++i) {
- SectionNode &node = newSectionNodes[i];
- if (node.type == Hour12Section)
- node.type = Hour24Section;
- }
- }
-
- if (index < max) {
- appendSeparator(&newSeparators, newFormat, index, index - max, lastQuote);
- } else {
- newSeparators.append(QString());
- }
-
- displayFormat = newFormat;
- separators = newSeparators;
- sectionNodes = newSectionNodes;
- display = newDisplay;
- last.pos = -1;
-
-// for (int i=0; i<sectionNodes.size(); ++i) {
-// QDTPDEBUG << sectionNodes.at(i).name() << sectionNodes.at(i).count;
-// }
-
- QDTPDEBUG << newFormat << displayFormat;
- QDTPDEBUGN("separators:\n'%s'", separators.join(QLatin1String("\n")).toLatin1().constData());
-
- return true;
-}
-
-/*!
- \internal
-
- Returns the size of section \a s.
-*/
-
-int QDateTimeParser::sectionSize(int sectionIndex) const
-{
- if (sectionIndex < 0)
- return 0;
-
- if (sectionIndex >= sectionNodes.size()) {
- qWarning("QDateTimeParser::sectionSize Internal error (%d)", sectionIndex);
- return -1;
- }
-
- if (sectionIndex == sectionNodes.size() - 1) {
- // In some cases there is a difference between displayText() and text.
- // e.g. when text is 2000/01/31 and displayText() is "2000/2/31" - text
- // is the previous value and displayText() is the new value.
- // The size difference is always due to leading zeroes.
- int sizeAdjustment = 0;
- const int displayTextSize = displayText().size();
- if (displayTextSize != text.size()) {
- // Any zeroes added before this section will affect our size.
- int preceedingZeroesAdded = 0;
- if (sectionNodes.size() > 1 && context == DateTimeEdit) {
- const auto begin = sectionNodes.cbegin();
- const auto end = begin + sectionIndex;
- for (auto sectionIt = begin; sectionIt != end; ++sectionIt)
- preceedingZeroesAdded += sectionIt->zeroesAdded;
- }
- sizeAdjustment = preceedingZeroesAdded;
- }
-
- return displayTextSize + sizeAdjustment - sectionPos(sectionIndex) - separators.last().size();
- } else {
- return sectionPos(sectionIndex + 1) - sectionPos(sectionIndex)
- - separators.at(sectionIndex + 1).size();
- }
-}
-
-
-int QDateTimeParser::sectionMaxSize(Section s, int count) const
-{
-#if QT_CONFIG(textdate)
- int mcount = 12;
-#endif
-
- switch (s) {
- case FirstSection:
- case NoSection:
- case LastSection: return 0;
-
- case AmPmSection: {
- const int lowerMax = qMax(getAmPmText(AmText, LowerCase).size(),
- getAmPmText(PmText, LowerCase).size());
- const int upperMax = qMax(getAmPmText(AmText, UpperCase).size(),
- getAmPmText(PmText, UpperCase).size());
- return qMax(lowerMax, upperMax);
- }
-
- case Hour24Section:
- case Hour12Section:
- case MinuteSection:
- case SecondSection:
- case DaySection: return 2;
- case DayOfWeekSectionShort:
- case DayOfWeekSectionLong:
-#if !QT_CONFIG(textdate)
- return 2;
-#else
- mcount = 7;
- Q_FALLTHROUGH();
-#endif
- case MonthSection:
-#if !QT_CONFIG(textdate)
- return 2;
-#else
- if (count <= 2)
- return 2;
-
- {
- int ret = 0;
- const QLocale l = locale();
- const QLocale::FormatType format = count == 4 ? QLocale::LongFormat : QLocale::ShortFormat;
- for (int i=1; i<=mcount; ++i) {
- const QString str = (s == MonthSection
- ? l.monthName(i, format)
- : l.dayName(i, format));
- ret = qMax(str.size(), ret);
- }
- return ret;
- }
-#endif
- case MSecSection: return 3;
- case YearSection: return 4;
- case YearSection2Digits: return 2;
- // Arbitrarily many tokens (each up to 14 bytes) joined with / separators:
- case TimeZoneSection: return std::numeric_limits<int>::max();
-
- case CalendarPopupSection:
- case Internal:
- case TimeSectionMask:
- case DateSectionMask:
- case HourSectionMask:
- case YearSectionMask:
- case DayOfWeekSectionMask:
- case DaySectionMask:
- qWarning("QDateTimeParser::sectionMaxSize: Invalid section %s",
- SectionNode::name(s).toLatin1().constData());
-
- case NoSectionIndex:
- case FirstSectionIndex:
- case LastSectionIndex:
- case CalendarPopupIndex:
- // these cases can't happen
- break;
- }
- return -1;
-}
-
-
-int QDateTimeParser::sectionMaxSize(int index) const
-{
- const SectionNode &sn = sectionNode(index);
- return sectionMaxSize(sn.type, sn.count);
-}
-
-/*!
- \internal
-
- Returns the text of section \a s. This function operates on the
- arg text rather than edit->text().
-*/
-
-
-QString QDateTimeParser::sectionText(const QString &text, int sectionIndex, int index) const
-{
- const SectionNode &sn = sectionNode(sectionIndex);
- switch (sn.type) {
- case NoSectionIndex:
- case FirstSectionIndex:
- case LastSectionIndex:
- return QString();
- default: break;
- }
-
- return text.mid(index, sectionSize(sectionIndex));
-}
-
-QString QDateTimeParser::sectionText(int sectionIndex) const
-{
- const SectionNode &sn = sectionNode(sectionIndex);
- return sectionText(displayText(), sectionIndex, sn.pos);
-}
-
-
-#if QT_CONFIG(datestring)
-
-QDateTimeParser::ParsedSection
-QDateTimeParser::parseSection(const QDateTime &currentValue, int sectionIndex,
- int offset, QString *text) const
-{
- ParsedSection result; // initially Invalid
- const SectionNode &sn = sectionNode(sectionIndex);
- if (sn.type & Internal) {
- qWarning("QDateTimeParser::parseSection Internal error (%s %d)",
- qPrintable(sn.name()), sectionIndex);
- return result;
- }
-
- const int sectionmaxsize = sectionMaxSize(sectionIndex);
- QStringRef sectionTextRef = text->midRef(offset, sectionmaxsize);
-
- QDTPDEBUG << "sectionValue for" << sn.name()
- << "with text" << *text << "and (at" << offset
- << ") st:" << sectionTextRef;
-
- switch (sn.type) {
- case AmPmSection: {
- QString sectiontext = sectionTextRef.toString();
- int used;
- const int ampm = findAmPm(sectiontext, sectionIndex, &used);
- switch (ampm) {
- case AM: // sectiontext == AM
- case PM: // sectiontext == PM
- result = ParsedSection(Acceptable, ampm, used);
- break;
- case PossibleAM: // sectiontext => AM
- case PossiblePM: // sectiontext => PM
- result = ParsedSection(Intermediate, ampm - 2, used);
- break;
- case PossibleBoth: // sectiontext => AM|PM
- result = ParsedSection(Intermediate, 0, used);
- break;
- case Neither:
- QDTPDEBUG << "invalid because findAmPm(" << sectiontext << ") returned -1";
- break;
- default:
- QDTPDEBUGN("This should never happen (findAmPm returned %d)", ampm);
- break;
- }
- if (result.state != Invalid)
- text->replace(offset, used, sectiontext.constData(), used);
- break; }
- case TimeZoneSection:
-#if QT_CONFIG(timezone)
- result = findTimeZone(sectionTextRef, currentValue,
- absoluteMax(sectionIndex),
- absoluteMin(sectionIndex));
-#endif
- break;
- case MonthSection:
- case DayOfWeekSectionShort:
- case DayOfWeekSectionLong:
- if (sn.count >= 3) {
- QString sectiontext = sectionTextRef.toString();
- int num = 0, used = 0;
- if (sn.type == MonthSection) {
- const QDate minDate = getMinimum().date();
- const int min = (currentValue.date().year() == minDate.year())
- ? minDate.month() : 1;
- num = findMonth(sectiontext.toLower(), min, sectionIndex, &sectiontext, &used);
- } else {
- num = findDay(sectiontext.toLower(), 1, sectionIndex, &sectiontext, &used);
- }
-
- result = ParsedSection(Intermediate, num, used);
- if (num != -1) {
- text->replace(offset, used, sectiontext.constData(), used);
- if (used == sectiontext.size())
- result = ParsedSection(Acceptable, num, used);
- }
- break;
- }
- Q_FALLTHROUGH();
- // All numeric:
- case DaySection:
- case YearSection:
- case YearSection2Digits:
- case Hour12Section:
- case Hour24Section:
- case MinuteSection:
- case SecondSection:
- case MSecSection: {
- int sectiontextSize = sectionTextRef.size();
- if (sectiontextSize == 0) {
- result = ParsedSection(Intermediate);
- } else {
- for (int i = 0; i < sectiontextSize; ++i) {
- if (sectionTextRef.at(i).isSpace())
- sectiontextSize = i; // which exits the loop
- }
-
- const int absMax = absoluteMax(sectionIndex);
- QLocale loc;
- bool ok = true;
- int last = -1, used = -1;
-
- Q_ASSERT(sectiontextSize <= sectionmaxsize);
- QStringRef digitsStr = sectionTextRef.left(sectiontextSize);
- for (int digits = sectiontextSize; digits >= 1; --digits) {
- digitsStr.truncate(digits);
- int tmp = (int)loc.toUInt(digitsStr, &ok);
- if (ok && sn.type == Hour12Section) {
- if (tmp > 12) {
- tmp = -1;
- ok = false;
- } else if (tmp == 12) {
- tmp = 0;
- }
- }
- if (ok && tmp <= absMax) {
- QDTPDEBUG << sectionTextRef.left(digits) << tmp << digits;
- last = tmp;
- used = digits;
- break;
- }
- }
-
- if (last == -1) {
- QChar first(sectionTextRef.at(0));
- if (separators.at(sectionIndex + 1).startsWith(first))
- result = ParsedSection(Intermediate, 0, used);
- else
- QDTPDEBUG << "invalid because" << sectionTextRef << "can't become a uint" << last << ok;
- } else {
- const FieldInfo fi = fieldInfo(sectionIndex);
- const bool unfilled = used < sectionmaxsize;
- if (unfilled && fi & Fraction) { // typing 2 in a zzz field should be .200, not .002
- for (int i = used; i < sectionmaxsize; ++i)
- last *= 10;
- }
- // Even those *= 10s can't take last above absMax:
- Q_ASSERT(last <= absMax);
- const int absMin = absoluteMin(sectionIndex);
- if (last < absMin) {
- if (unfilled)
- result = ParsedSection(Intermediate, last, used);
- else
- QDTPDEBUG << "invalid because" << last << "is less than absoluteMin" << absMin;
- } else if (unfilled && (fi & (FixedWidth|Numeric)) == (FixedWidth|Numeric)) {
- if (skipToNextSection(sectionIndex, currentValue, digitsStr)) {
- const int missingZeroes = sectionmaxsize - digitsStr.size();
- result = ParsedSection(Acceptable, last, sectionmaxsize, missingZeroes);
- text->insert(offset, QString(missingZeroes, QLatin1Char('0')));
- ++(const_cast<QDateTimeParser*>(this)->sectionNodes[sectionIndex].zeroesAdded);
- } else {
- result = ParsedSection(Intermediate, last, used);;
- }
- } else {
- result = ParsedSection(Acceptable, last, used);
- }
- }
- }
- break; }
- default:
- qWarning("QDateTimeParser::parseSection Internal error (%s %d)",
- qPrintable(sn.name()), sectionIndex);
- return result;
- }
- Q_ASSERT(result.state != Invalid || result.value == -1);
-
- return result;
-}
-
-/*!
- \internal
-
- Returns a date consistent with the given data on parts specified by known,
- while staying as close to the given data as it can. Returns an invalid date
- when on valid date is consistent with the data.
-*/
-
-static QDate actualDate(QDateTimeParser::Sections known, int year, int year2digits,
- int month, int day, int dayofweek)
-{
- QDate actual(year, month, day);
- if (actual.isValid() && year % 100 == year2digits && actual.dayOfWeek() == dayofweek)
- return actual; // The obvious candidate is fine :-)
-
- if (dayofweek < 1 || dayofweek > 7) // Invalid: ignore
- known &= ~QDateTimeParser::DayOfWeekSectionMask;
-
- // Assuming year > 0 ...
- if (year % 100 != year2digits) {
- if (known & QDateTimeParser::YearSection2Digits) {
- // Over-ride year, even if specified:
- year += year2digits - year % 100;
- known &= ~QDateTimeParser::YearSection;
- } else {
- year2digits = year % 100;
- }
- }
- Q_ASSERT(year % 100 == year2digits);
-
- if (month < 1) { // If invalid, clip to nearest valid and ignore in known.
- month = 1;
- known &= ~QDateTimeParser::MonthSection;
- } else if (month > 12) {
- month = 12;
- known &= ~QDateTimeParser::MonthSection;
- }
-
- QDate first(year, month, 1);
- int last = known & QDateTimeParser::YearSection && known & QDateTimeParser::MonthSection
- ? first.daysInMonth() : 0;
- // If we also know day-of-week, tweak last to the last in the month that matches it:
- if (last && known & QDateTimeParser::DayOfWeekSectionMask) {
- int diff = (dayofweek - first.dayOfWeek() - last) % 7;
- Q_ASSERT(diff <= 0); // C++11 specifies (-ve) % (+ve) to be <= 0.
- last += diff;
- }
- if (day < 1) {
- if (known & QDateTimeParser::DayOfWeekSectionMask && last) {
- day = 1 + dayofweek - first.dayOfWeek();
- if (day < 1)
- day += 7;
- } else {
- day = 1;
- }
- known &= ~QDateTimeParser::DaySection;
- } else if (day > 31) {
- day = last;
- known &= ~QDateTimeParser::DaySection;
- } else if (last && day > last && (known & QDateTimeParser::DaySection) == 0) {
- day = last;
- }
-
- actual = QDate(year, month, day);
- if (!actual.isValid() // We can't do better than we have, in this case
- || (known & QDateTimeParser::DaySection
- && known & QDateTimeParser::MonthSection
- && known & QDateTimeParser::YearSection) // ditto
- || actual.dayOfWeek() == dayofweek // Good enough, use it.
- || (known & QDateTimeParser::DayOfWeekSectionMask) == 0) { // No contradiction, use it.
- return actual;
- }
-
- /*
- Now it gets trickier.
-
- We have some inconsistency in our data; we've been told day of week, but
- it doesn't fit with our year, month and day. At least one of these is
- unknown, though: so we can fix day of week by tweaking it.
- */
-
- if ((known & QDateTimeParser::DaySection) == 0) {
- // Relatively easy to fix.
- day += dayofweek - actual.dayOfWeek();
- if (day < 1)
- day += 7;
- else if (day > actual.daysInMonth())
- day -= 7;
- actual = QDate(year, month, day);
- return actual;
- }
-
- if ((known & QDateTimeParser::MonthSection) == 0) {
- /*
- Try possible month-offsets, m, preferring small; at least one (present
- month doesn't work) and at most 11 (max month, 12, minus min, 1); try
- in both directions, ignoring any offset that takes us out of range.
- */
- for (int m = 1; m < 12; m++) {
- if (m < month) {
- actual = QDate(year, month - m, day);
- if (actual.dayOfWeek() == dayofweek)
- return actual;
- }
- if (m + month <= 12) {
- actual = QDate(year, month + m, day);
- if (actual.dayOfWeek() == dayofweek)
- return actual;
- }
- }
- // Should only get here in corner cases; e.g. day == 31
- actual = QDate(year, month, day); // Restore from trial values.
- }
-
- if ((known & QDateTimeParser::YearSection) == 0) {
- if (known & QDateTimeParser::YearSection2Digits) {
- /*
- Two-digit year and month are specified; choice of century can only
- fix this if diff is in one of {1, 2, 5} or {2, 4, 6}; but not if
- diff is in the other. It's also only reasonable to consider
- adjacent century, e.g. if year thinks it's 2012 and two-digit year
- is '97, it makes sense to consider 1997. If either adjacent
- century does work, the other won't.
- */
- actual = QDate(year + 100, month, day);
- if (actual.dayOfWeek() == dayofweek)
- return actual;
- actual = QDate(year - 100, month, day);
- if (actual.dayOfWeek() == dayofweek)
- return actual;
- } else {
- // Offset by 7 is usually enough, but rare cases may need more:
- for (int y = 1; y < 12; y++) {
- actual = QDate(year - y, month, day);
- if (actual.dayOfWeek() == dayofweek)
- return actual;
- actual = QDate(year + y, month, day);
- if (actual.dayOfWeek() == dayofweek)
- return actual;
- }
- }
- actual = QDate(year, month, day); // Restore from trial values.
- }
-
- return actual; // It'll just have to do :-(
-}
-
-/*!
- \internal
-*/
-
-static QTime actualTime(QDateTimeParser::Sections known,
- int hour, int hour12, int ampm,
- int minute, int second, int msec)
-{
- // If we have no conflict, or don't know enough to diagonose one, use this:
- QTime actual(hour, minute, second, msec);
- if (hour12 < 0 || hour12 > 12) { // ignore bogus value
- known &= ~QDateTimeParser::Hour12Section;
- hour12 = hour % 12;
- }
-
- if (ampm == -1 || (known & QDateTimeParser::AmPmSection) == 0) {
- if ((known & QDateTimeParser::Hour12Section) == 0 || hour % 12 == hour12)
- return actual;
-
- if ((known & QDateTimeParser::Hour24Section) == 0)
- hour = hour12 + (hour > 12 ? 12 : 0);
- } else {
- Q_ASSERT(ampm == 0 || ampm == 1);
- if (hour - hour12 == ampm * 12)
- return actual;
-
- if ((known & QDateTimeParser::Hour24Section) == 0
- && known & QDateTimeParser::Hour12Section) {
- hour = hour12 + ampm * 12;
- }
- }
- actual = QTime(hour, minute, second, msec);
- return actual;
-}
-
-/*!
- \internal
-*/
-QDateTimeParser::StateNode
-QDateTimeParser::scanString(const QDateTime &defaultValue,
- bool fixup, QString *input) const
-{
- State state = Acceptable;
- bool conflicts = false;
- const int sectionNodesCount = sectionNodes.size();
- int padding = 0;
- int pos = 0;
- int year, month, day;
- const QDate defaultDate = defaultValue.date();
- const QTime defaultTime = defaultValue.time();
- defaultDate.getDate(&year, &month, &day);
- int year2digits = year % 100;
- int hour = defaultTime.hour();
- int hour12 = -1;
- int minute = defaultTime.minute();
- int second = defaultTime.second();
- int msec = defaultTime.msec();
- int dayofweek = defaultDate.dayOfWeek();
- Qt::TimeSpec tspec = defaultValue.timeSpec();
- int zoneOffset = 0; // In seconds; local - UTC
-#if QT_CONFIG(timezone)
- QTimeZone timeZone;
-#endif
- switch (tspec) {
- case Qt::OffsetFromUTC: // timeZone is ignored
- zoneOffset = defaultValue.offsetFromUtc();
- break;
-#if QT_CONFIG(timezone)
- case Qt::TimeZone:
- timeZone = defaultValue.timeZone();
- if (timeZone.isValid())
- zoneOffset = timeZone.offsetFromUtc(defaultValue);
- // else: is there anything we can do about this ?
- break;
-#endif
- default: // zoneOffset and timeZone are ignored
- break;
- }
-
- int ampm = -1;
- Sections isSet = NoSection;
-
- for (int index = 0; index < sectionNodesCount; ++index) {
- Q_ASSERT(state != Invalid);
- const QString &separator = separators.at(index);
- if (input->midRef(pos, separator.size()) != separator) {
- QDTPDEBUG << "invalid because" << input->midRef(pos, separator.size())
- << "!=" << separator
- << index << pos << currentSectionIndex;
- return StateNode();
- }
- pos += separator.size();
- sectionNodes[index].pos = pos;
- int *current = 0;
- const SectionNode sn = sectionNodes.at(index);
- ParsedSection sect;
-
- {
- const QDate date = actualDate(isSet, year, year2digits, month, day, dayofweek);
- const QTime time = actualTime(isSet, hour, hour12, ampm, minute, second, msec);
- sect = parseSection(
-#if QT_CONFIG(timezone)
- tspec == Qt::TimeZone ? QDateTime(date, time, timeZone) :
-#endif
- QDateTime(date, time, tspec, zoneOffset),
- index, pos, input);
- }
-
- QDTPDEBUG << "sectionValue" << sn.name() << *input
- << "pos" << pos << "used" << sect.used << stateName(sect.state);
-
- padding += sect.zeroes;
- if (fixup && sect.state == Intermediate && sect.used < sn.count) {
- const FieldInfo fi = fieldInfo(index);
- if ((fi & (Numeric|FixedWidth)) == (Numeric|FixedWidth)) {
- const QString newText = QString::fromLatin1("%1").arg(sect.value, sn.count, 10, QLatin1Char('0'));
- input->replace(pos, sect.used, newText);
- sect.used = sn.count;
- }
- }
-
- state = qMin<State>(state, sect.state);
- // QDateTimeEdit can fix Intermediate and zeroes, but input needing that didn't match format:
- if (state == Invalid || (context == FromString && (state == Intermediate || sect.zeroes)))
- return StateNode();
-
- switch (sn.type) {
- case TimeZoneSection:
- current = &zoneOffset;
- if (sect.used > 0) {
-#if QT_CONFIG(timezone) // Synchronize with what findTimeZone() found:
- QStringRef zoneName = input->midRef(pos, sect.used);
- Q_ASSERT(!zoneName.isEmpty()); // sect.used > 0
- const QByteArray latinZone(zoneName == QLatin1String("Z")
- ? QByteArray("UTC") : zoneName.toLatin1());
- timeZone = QTimeZone(latinZone);
- tspec = timeZone.isValid()
- ? (QTimeZone::isTimeZoneIdAvailable(latinZone)
- ? Qt::TimeZone
- : Qt::OffsetFromUTC)
- : (Q_ASSERT(startsWithLocalTimeZone(zoneName)), Qt::LocalTime);
-#else
- tspec = Qt::LocalTime;
-#endif
- }
- break;
- case Hour24Section: current = &hour; break;
- case Hour12Section: current = &hour12; break;
- case MinuteSection: current = &minute; break;
- case SecondSection: current = &second; break;
- case MSecSection: current = &msec; break;
- case YearSection: current = &year; break;
- case YearSection2Digits: current = &year2digits; break;
- case MonthSection: current = &month; break;
- case DayOfWeekSectionShort:
- case DayOfWeekSectionLong: current = &dayofweek; break;
- case DaySection: current = &day; sect.value = qMax<int>(1, sect.value); break;
- case AmPmSection: current = &ampm; break;
- default:
- qWarning("QDateTimeParser::parse Internal error (%s)",
- qPrintable(sn.name()));
- break;
- }
-
- if (sect.used > 0)
- pos += sect.used;
- QDTPDEBUG << index << sn.name() << "is set to"
- << pos << "state is" << stateName(state);
-
- if (!current) {
- qWarning("QDateTimeParser::parse Internal error 2");
- return StateNode();
- }
- if (isSet & sn.type && *current != sect.value) {
- QDTPDEBUG << "CONFLICT " << sn.name() << *current << sect.value;
- conflicts = true;
- if (index != currentSectionIndex || sect.state == Invalid) {
- continue;
- }
- }
- if (sect.state != Invalid)
- *current = sect.value;
-
- // Record the present section:
- isSet |= sn.type;
- }
-
- if (input->midRef(pos) != separators.last()) {
- QDTPDEBUG << "invalid because" << input->midRef(pos)
- << "!=" << separators.last() << pos;
- return StateNode();
- }
-
- if (parserType != QVariant::Time) {
- if (year % 100 != year2digits && (isSet & YearSection2Digits)) {
- if (!(isSet & YearSection)) {
- year = (year / 100) * 100;
- year += year2digits;
- } else {
- conflicts = true;
- const SectionNode &sn = sectionNode(currentSectionIndex);
- if (sn.type == YearSection2Digits) {
- year = (year / 100) * 100;
- year += year2digits;
- }
- }
- }
-
- const QDate date(year, month, day);
- const int diff = dayofweek - date.dayOfWeek();
- if (diff != 0 && state == Acceptable && isSet & DayOfWeekSectionMask) {
- if (isSet & DaySection)
- conflicts = true;
- const SectionNode &sn = sectionNode(currentSectionIndex);
- if (sn.type & DayOfWeekSectionMask || currentSectionIndex == -1) {
- // dayofweek should be preferred
- day += diff;
- if (day <= 0) {
- day += 7;
- } else if (day > date.daysInMonth()) {
- day -= 7;
- }
- QDTPDEBUG << year << month << day << dayofweek
- << diff << QDate(year, month, day).dayOfWeek();
- }
- }
-
- bool needfixday = false;
- if (sectionType(currentSectionIndex) & DaySectionMask) {
- cachedDay = day;
- } else if (cachedDay > day) {
- day = cachedDay;
- needfixday = true;
- }
-
- if (!QDate::isValid(year, month, day)) {
- if (day < 32) {
- cachedDay = day;
- }
- if (day > 28 && QDate::isValid(year, month, 1)) {
- needfixday = true;
- }
- }
- if (needfixday) {
- if (context == FromString) {
- return StateNode();
- }
- if (state == Acceptable && fixday) {
- day = qMin<int>(day, QDate(year, month, 1).daysInMonth());
-
- const QLocale loc = locale();
- for (int i=0; i<sectionNodesCount; ++i) {
- const SectionNode sn = sectionNode(i);
- if (sn.type & DaySection) {
- input->replace(sectionPos(sn), sectionSize(i), loc.toString(day));
- } else if (sn.type & DayOfWeekSectionMask) {
- const int dayOfWeek = QDate(year, month, day).dayOfWeek();
- const QLocale::FormatType dayFormat =
- (sn.type == DayOfWeekSectionShort
- ? QLocale::ShortFormat : QLocale::LongFormat);
- const QString dayName(loc.dayName(dayOfWeek, dayFormat));
- input->replace(sectionPos(sn), sectionSize(i), dayName);
- }
- }
- } else if (state > Intermediate) {
- state = Intermediate;
- }
- }
- }
-
- if (parserType != QVariant::Date) {
- if (isSet & Hour12Section) {
- const bool hasHour = isSet & Hour24Section;
- if (ampm == -1) {
- if (hasHour) {
- ampm = (hour < 12 ? 0 : 1);
- } else {
- ampm = 0; // no way to tell if this is am or pm so I assume am
- }
- }
- hour12 = (ampm == 0 ? hour12 % 12 : (hour12 % 12) + 12);
- if (!hasHour) {
- hour = hour12;
- } else if (hour != hour12) {
- conflicts = true;
- }
- } else if (ampm != -1) {
- if (!(isSet & (Hour24Section))) {
- hour = (12 * ampm); // special case. Only ap section
- } else if ((ampm == 0) != (hour < 12)) {
- conflicts = true;
- }
- }
-
- }
-
- QDTPDEBUG << year << month << day << hour << minute << second << msec;
- Q_ASSERT(state != Invalid);
-
- const QDate date(year, month, day);
- const QTime time(hour, minute, second, msec);
- const QDateTime when =
-#if QT_CONFIG(timezone)
- tspec == Qt::TimeZone ? QDateTime(date, time, timeZone) :
-#endif
- QDateTime(date, time, tspec, zoneOffset);
-
- // If hour wasn't specified, check the default we're using exists on the
- // given date (which might be a spring-forward, skipping an hour).
- if (parserType == QVariant::DateTime && !(isSet & HourSectionMask) && !when.isValid()) {
- qint64 msecs = when.toMSecsSinceEpoch();
- // Fortunately, that gets a useful answer ...
- const QDateTime replace =
-#if QT_CONFIG(timezone)
- tspec == Qt::TimeZone
- ? QDateTime::fromMSecsSinceEpoch(msecs, timeZone) :
-#endif
- QDateTime::fromMSecsSinceEpoch(msecs, tspec, zoneOffset);
- const QTime tick = replace.time();
- if (replace.date() == date
- && (!(isSet & MinuteSection) || tick.minute() == minute)
- && (!(isSet & SecondSection) || tick.second() == second)
- && (!(isSet & MSecSection) || tick.msec() == msec)) {
- return StateNode(replace, state, padding, conflicts);
- }
- }
-
- return StateNode(when, state, padding, conflicts);
-}
-
-/*!
- \internal
-*/
-
-QDateTimeParser::StateNode
-QDateTimeParser::parse(QString input, int position, const QDateTime &defaultValue, bool fixup) const
-{
- const QDateTime minimum = getMinimum();
- const QDateTime maximum = getMaximum();
-
- QDTPDEBUG << "parse" << input;
- StateNode scan = scanString(defaultValue, fixup, &input);
- QDTPDEBUGN("'%s' => '%s'(%s)", input.toLatin1().constData(),
- scan.value.toString(QLatin1String("yyyy/MM/dd hh:mm:ss.zzz")).toLatin1().constData(),
- stateName(scan.state).toLatin1().constData());
-
- if (scan.value.isValid() && scan.state != Invalid) {
- if (context != FromString && scan.value < minimum) {
- const QLatin1Char space(' ');
- if (scan.value >= minimum)
- qWarning("QDateTimeParser::parse Internal error 3 (%s %s)",
- qPrintable(scan.value.toString()), qPrintable(minimum.toString()));
-
- bool done = false;
- scan.state = Invalid;
- const int sectionNodesCount = sectionNodes.size();
- for (int i=0; i<sectionNodesCount && !done; ++i) {
- const SectionNode &sn = sectionNodes.at(i);
- QString t = sectionText(input, i, sn.pos).toLower();
- if ((t.size() < sectionMaxSize(i)
- && (((int)fieldInfo(i) & (FixedWidth|Numeric)) != Numeric))
- || t.contains(space)) {
- switch (sn.type) {
- case AmPmSection:
- switch (findAmPm(t, i)) {
- case AM:
- case PM:
- scan.state = Acceptable;
- done = true;
- break;
- case Neither:
- scan.state = Invalid;
- done = true;
- break;
- case PossibleAM:
- case PossiblePM:
- case PossibleBoth: {
- const QDateTime copy(scan.value.addSecs(12 * 60 * 60));
- if (copy >= minimum && copy <= maximum) {
- scan.state = Intermediate;
- done = true;
- }
- break; }
- }
- Q_FALLTHROUGH();
- case MonthSection:
- if (sn.count >= 3) {
- const int finalMonth = scan.value.date().month();
- int tmp = finalMonth;
- // I know the first possible month makes the date too early
- while ((tmp = findMonth(t, tmp + 1, i)) != -1) {
- const QDateTime copy(scan.value.addMonths(tmp - finalMonth));
- if (copy >= minimum && copy <= maximum)
- break; // break out of while
- }
- if (tmp != -1) {
- scan.state = Intermediate;
- done = true;
- }
- break;
- }
- Q_FALLTHROUGH();
- default: {
- int toMin;
- int toMax;
-
- if (sn.type & TimeSectionMask) {
- if (scan.value.daysTo(minimum) != 0) {
- break;
- }
- const QTime time = scan.value.time();
- toMin = time.msecsTo(minimum.time());
- if (scan.value.daysTo(maximum) > 0)
- toMax = -1; // can't get to max
- else
- toMax = time.msecsTo(maximum.time());
- } else {
- toMin = scan.value.daysTo(minimum);
- toMax = scan.value.daysTo(maximum);
- }
- const int maxChange = sn.maxChange();
- if (toMin > maxChange) {
- QDTPDEBUG << "invalid because toMin > maxChange" << toMin
- << maxChange << t << scan.value << minimum;
- scan.state = Invalid;
- done = true;
- break;
- } else if (toMax > maxChange) {
- toMax = -1; // can't get to max
- }
-
- const int min = getDigit(minimum, i);
- if (min == -1) {
- qWarning("QDateTimeParser::parse Internal error 4 (%s)",
- qPrintable(sn.name()));
- scan.state = Invalid;
- done = true;
- break;
- }
-
- int max = toMax != -1 ? getDigit(maximum, i) : absoluteMax(i, scan.value);
- int pos = position + scan.padded - sn.pos;
- if (pos < 0 || pos >= t.size())
- pos = -1;
- if (!potentialValue(t.simplified(), min, max, i, scan.value, pos)) {
- QDTPDEBUG << "invalid because potentialValue(" << t.simplified() << min << max
- << sn.name() << "returned" << toMax << toMin << pos;
- scan.state = Invalid;
- done = true;
- break;
- }
- scan.state = Intermediate;
- done = true;
- break; }
- }
- }
- }
- } else {
- if (context == FromString) {
- // optimization
- Q_ASSERT(maximum.date().toJulianDay() == 5373484);
- if (scan.value.date().toJulianDay() > 5373484)
- scan.state = Invalid;
- } else {
- if (scan.value > maximum)
- scan.state = Invalid;
- }
-
- QDTPDEBUG << "not checking intermediate because scanned value is" << scan.value << minimum << maximum;
- }
- }
- text = scan.input = input;
- // Set spec *after* all checking, so validity is a property of the string:
- scan.value = scan.value.toTimeSpec(spec);
- return scan;
-}
-
-/*
- \internal
- \brief Returns the index in \a entries with the best prefix match to \a text
-
- Scans \a entries looking for an entry overlapping \a text as much as possible
- (an exact match beats any prefix match; a match of the full entry as prefix of
- text beats any entry but one matching a longer prefix; otherwise, the match of
- longest prefix wins, earlier entries beating later on a draw). Records the
- length of overlap in *used (if \a used is non-NULL) and the first entry that
- overlapped this much in *usedText (if \a usedText is non-NULL).
- */
-static int findTextEntry(const QString &text, const QVector<QString> &entries, QString *usedText, int *used)
-{
- if (text.isEmpty())
- return -1;
-
- int bestMatch = -1;
- int bestCount = 0;
- for (int n = 0; n < entries.size(); ++n)
- {
- const QString &name = entries.at(n);
-
- const int limit = qMin(text.size(), name.size());
- int i = 0;
- while (i < limit && text.at(i) == name.at(i).toLower())
- ++i;
- // Full match beats an equal prefix match:
- if (i > bestCount || (i == bestCount && i == name.size())) {
- bestCount = i;
- bestMatch = n;
- if (i == name.size() && i == text.size())
- break; // Exact match, name == text, wins.
- }
- }
- if (usedText && bestMatch != -1)
- *usedText = entries.at(bestMatch);
- if (used)
- *used = bestCount;
-
- return bestMatch;
-}
-
-/*!
- \internal
- finds the first possible monthname that \a str1 can
- match. Starting from \a index; str should already by lowered
-*/
-
-int QDateTimeParser::findMonth(const QString &str1, int startMonth, int sectionIndex,
- QString *usedMonth, int *used) const
-{
- const SectionNode &sn = sectionNode(sectionIndex);
- if (sn.type != MonthSection) {
- qWarning("QDateTimeParser::findMonth Internal error");
- return -1;
- }
-
- QLocale::FormatType type = sn.count == 3 ? QLocale::ShortFormat : QLocale::LongFormat;
- QLocale l = locale();
- QVector<QString> monthNames;
- monthNames.reserve(13 - startMonth);
- for (int month = startMonth; month <= 12; ++month)
- monthNames.append(l.monthName(month, type));
-
- const int index = findTextEntry(str1, monthNames, usedMonth, used);
- return index < 0 ? index : index + startMonth;
-}
-
-int QDateTimeParser::findDay(const QString &str1, int startDay, int sectionIndex, QString *usedDay, int *used) const
-{
- const SectionNode &sn = sectionNode(sectionIndex);
- if (!(sn.type & DaySectionMask)) {
- qWarning("QDateTimeParser::findDay Internal error");
- return -1;
- }
-
- QLocale::FormatType type = sn.count == 4 ? QLocale::LongFormat : QLocale::ShortFormat;
- QLocale l = locale();
- QVector<QString> daysOfWeek;
- daysOfWeek.reserve(8 - startDay);
- for (int day = startDay; day <= 7; ++day)
- daysOfWeek.append(l.dayName(day, type));
-
- const int index = findTextEntry(str1, daysOfWeek, usedDay, used);
- return index < 0 ? index : index + startDay;
-}
-
-/*!
- \internal
-
- Return's .value is zone's offset, zone time - UTC time, in seconds.
- See QTimeZonePrivate::isValidId() for the format of zone names.
- */
-QDateTimeParser::ParsedSection
-QDateTimeParser::findTimeZone(QStringRef str, const QDateTime &when,
- int maxVal, int minVal) const
-{
-#if QT_CONFIG(timezone)
- int index = startsWithLocalTimeZone(str);
- int offset;
-
- if (index > 0) {
- // We won't actually use this, but we need a valid return:
- offset = QDateTime(when.date(), when.time(), Qt::LocalTime).offsetFromUtc();
- } else {
- int size = str.length();
- offset = std::numeric_limits<int>::max(); // deliberately out of range
- Q_ASSERT(offset > QTimeZone::MaxUtcOffsetSecs); // cf. absoluteMax()
-
- // Collect up plausibly-valid characters; let QTimeZone work out what's truly valid.
- while (index < size) {
- QChar here = str[index];
- if (here < 127
- && (here.isLetterOrNumber()
- || here == '/' || here == '-'
- || here == '_' || here == '.'
- || here == '+' || here == ':'))
- index++;
- else
- break;
- }
-
- while (index > 0) {
- str.truncate(index);
- if (str == QLatin1String("Z")) {
- offset = 0; // "Zulu" time - a.k.a. UTC
- break;
- }
- QTimeZone zone(str.toLatin1());
- if (zone.isValid()) {
- offset = zone.offsetFromUtc(when);
- break;
- }
- index--; // maybe we collected too much ...
- }
- }
-
- if (index > 0 && maxVal >= offset && offset >= minVal)
- return ParsedSection(Acceptable, offset, index);
-
-#endif // timezone
- return ParsedSection();
-}
-
-/*!
- \internal
-
- Compares str to the am/pm texts returned by getAmPmText().
- Returns AM or PM if str is one of those texts. Failing that, it looks to see
- whether, ignoring spaces and case, each character of str appears in one of
- the am/pm texts.
- If neither text can be the result of the user typing more into str, returns
- Neither. If both texts are possible results of further typing, returns
- PossibleBoth. Otherwise, only one of them is a possible completion, so this
- returns PossibleAM or PossiblePM to indicate which.
-
- \sa getAmPmText()
-*/
-QDateTimeParser::AmPmFinder QDateTimeParser::findAmPm(QString &str, int sectionIndex, int *used) const
-{
- const SectionNode &s = sectionNode(sectionIndex);
- if (s.type != AmPmSection) {
- qWarning("QDateTimeParser::findAmPm Internal error");
- return Neither;
- }
- if (used)
- *used = str.size();
- if (QStringRef(&str).trimmed().isEmpty()) {
- return PossibleBoth;
- }
- const QLatin1Char space(' ');
- int size = sectionMaxSize(sectionIndex);
-
- enum {
- amindex = 0,
- pmindex = 1
- };
- QString ampm[2];
- ampm[amindex] = getAmPmText(AmText, s.count == 1 ? UpperCase : LowerCase);
- ampm[pmindex] = getAmPmText(PmText, s.count == 1 ? UpperCase : LowerCase);
- for (int i=0; i<2; ++i)
- ampm[i].truncate(size);
-
- QDTPDEBUG << "findAmPm" << str << ampm[0] << ampm[1];
-
- if (str.startsWith(ampm[amindex], Qt::CaseInsensitive)) {
- str = ampm[amindex];
- return AM;
- } else if (str.startsWith(ampm[pmindex], Qt::CaseInsensitive)) {
- str = ampm[pmindex];
- return PM;
- } else if (context == FromString || (str.count(space) == 0 && str.size() >= size)) {
- return Neither;
- }
- size = qMin(size, str.size());
-
- bool broken[2] = {false, false};
- for (int i=0; i<size; ++i) {
- if (str.at(i) != space) {
- for (int j=0; j<2; ++j) {
- if (!broken[j]) {
- int index = ampm[j].indexOf(str.at(i));
- QDTPDEBUG << "looking for" << str.at(i)
- << "in" << ampm[j] << "and got" << index;
- if (index == -1) {
- if (str.at(i).category() == QChar::Letter_Uppercase) {
- index = ampm[j].indexOf(str.at(i).toLower());
- QDTPDEBUG << "trying with" << str.at(i).toLower()
- << "in" << ampm[j] << "and got" << index;
- } else if (str.at(i).category() == QChar::Letter_Lowercase) {
- index = ampm[j].indexOf(str.at(i).toUpper());
- QDTPDEBUG << "trying with" << str.at(i).toUpper()
- << "in" << ampm[j] << "and got" << index;
- }
- if (index == -1) {
- broken[j] = true;
- if (broken[amindex] && broken[pmindex]) {
- QDTPDEBUG << str << "didn't make it";
- return Neither;
- }
- continue;
- } else {
- str[i] = ampm[j].at(index); // fix case
- }
- }
- ampm[j].remove(index, 1);
- }
- }
- }
- }
- if (!broken[pmindex] && !broken[amindex])
- return PossibleBoth;
- return (!broken[amindex] ? PossibleAM : PossiblePM);
-}
-#endif // datestring
-
-/*!
- \internal
- Max number of units that can be changed by this section.
-*/
-
-int QDateTimeParser::SectionNode::maxChange() const
-{
- switch (type) {
- // Time. unit is msec
- case MSecSection: return 999;
- case SecondSection: return 59 * 1000;
- case MinuteSection: return 59 * 60 * 1000;
- case Hour24Section: case Hour12Section: return 59 * 60 * 60 * 1000;
-
- // Date. unit is day
- case DayOfWeekSectionShort:
- case DayOfWeekSectionLong: return 7;
- case DaySection: return 30;
- case MonthSection: return 365 - 31;
- case YearSection: return 9999 * 365;
- case YearSection2Digits: return 100 * 365;
- default:
- qWarning("QDateTimeParser::maxChange() Internal error (%s)",
- qPrintable(name()));
- }
-
- return -1;
-}
-
-QDateTimeParser::FieldInfo QDateTimeParser::fieldInfo(int index) const
-{
- FieldInfo ret = 0;
- const SectionNode &sn = sectionNode(index);
- switch (sn.type) {
- case MSecSection:
- ret |= Fraction;
- Q_FALLTHROUGH();
- case SecondSection:
- case MinuteSection:
- case Hour24Section:
- case Hour12Section:
- case YearSection2Digits:
- ret |= AllowPartial;
- Q_FALLTHROUGH();
- case YearSection:
- ret |= Numeric;
- if (sn.count != 1)
- ret |= FixedWidth;
- break;
- case MonthSection:
- case DaySection:
- switch (sn.count) {
- case 2:
- ret |= FixedWidth;
- Q_FALLTHROUGH();
- case 1:
- ret |= (Numeric|AllowPartial);
- break;
- }
- break;
- case DayOfWeekSectionShort:
- case DayOfWeekSectionLong:
- if (sn.count == 3)
- ret |= FixedWidth;
- break;
- case AmPmSection:
- ret |= FixedWidth;
- break;
- case TimeZoneSection:
- break;
- default:
- qWarning("QDateTimeParser::fieldInfo Internal error 2 (%d %s %d)",
- index, qPrintable(sn.name()), sn.count);
- break;
- }
- return ret;
-}
-
-QString QDateTimeParser::SectionNode::format() const
-{
- QChar fillChar;
- switch (type) {
- case AmPmSection: return count == 1 ? QLatin1String("AP") : QLatin1String("ap");
- case MSecSection: fillChar = QLatin1Char('z'); break;
- case SecondSection: fillChar = QLatin1Char('s'); break;
- case MinuteSection: fillChar = QLatin1Char('m'); break;
- case Hour24Section: fillChar = QLatin1Char('H'); break;
- case Hour12Section: fillChar = QLatin1Char('h'); break;
- case DayOfWeekSectionShort:
- case DayOfWeekSectionLong:
- case DaySection: fillChar = QLatin1Char('d'); break;
- case MonthSection: fillChar = QLatin1Char('M'); break;
- case YearSection2Digits:
- case YearSection: fillChar = QLatin1Char('y'); break;
- default:
- qWarning("QDateTimeParser::sectionFormat Internal error (%s)",
- qPrintable(name(type)));
- return QString();
- }
- if (fillChar.isNull()) {
- qWarning("QDateTimeParser::sectionFormat Internal error 2");
- return QString();
- }
- return QString(count, fillChar);
-}
-
-
-/*!
- \internal
-
- Returns \c true if str can be modified to represent a
- number that is within min and max.
-*/
-
-bool QDateTimeParser::potentialValue(const QStringRef &str, int min, int max, int index,
- const QDateTime &currentValue, int insert) const
-{
- if (str.isEmpty()) {
- return true;
- }
- const int size = sectionMaxSize(index);
- int val = (int)locale().toUInt(str);
- const SectionNode &sn = sectionNode(index);
- if (sn.type == YearSection2Digits) {
- const int year = currentValue.date().year();
- val += year - (year % 100);
- }
- if (val >= min && val <= max && str.size() == size) {
- return true;
- } else if (val > max) {
- return false;
- } else if (str.size() == size && val < min) {
- return false;
- }
-
- const int len = size - str.size();
- for (int i=0; i<len; ++i) {
- for (int j=0; j<10; ++j) {
- if (potentialValue(str + QLatin1Char('0' + j), min, max, index, currentValue, insert)) {
- return true;
- } else if (insert >= 0) {
- const QString tmp = str.left(insert) + QLatin1Char('0' + j) + str.mid(insert);
- if (potentialValue(tmp, min, max, index, currentValue, insert))
- return true;
- }
- }
- }
-
- return false;
-}
-
-/*!
- \internal
-*/
-bool QDateTimeParser::skipToNextSection(int index, const QDateTime &current, const QStringRef &text) const
-{
- Q_ASSERT(text.size() < sectionMaxSize(index));
- const SectionNode &node = sectionNode(index);
- int min = absoluteMin(index);
- int max = absoluteMax(index, current);
- // Time-zone field is only numeric if given as offset from UTC:
- if (node.type != TimeZoneSection || current.timeSpec() == Qt::OffsetFromUTC) {
- const QDateTime maximum = getMaximum();
- const QDateTime minimum = getMinimum();
- Q_ASSERT(current >= minimum && current <= maximum);
-
- QDateTime tmp = current;
- if (!setDigit(tmp, index, min) || tmp < minimum)
- min = getDigit(minimum, index);
-
- if (!setDigit(tmp, index, max) || tmp > maximum)
- max = getDigit(maximum, index);
- }
- int pos = cursorPosition() - node.pos;
- if (pos < 0 || pos >= text.size())
- pos = -1;
-
- /*
- If the value potentially can become another valid entry we don't want to
- skip to the next. E.g. In a M field (month without leading 0) if you type
- 1 we don't want to autoskip (there might be [012] following) but if you
- type 3 we do.
- */
- return !potentialValue(text, min, max, index, current, pos);
-}
-
-/*!
- \internal
- For debugging. Returns the name of the section \a s.
-*/
-
-QString QDateTimeParser::SectionNode::name(QDateTimeParser::Section s)
-{
- switch (s) {
- case QDateTimeParser::AmPmSection: return QLatin1String("AmPmSection");
- case QDateTimeParser::DaySection: return QLatin1String("DaySection");
- case QDateTimeParser::DayOfWeekSectionShort: return QLatin1String("DayOfWeekSectionShort");
- case QDateTimeParser::DayOfWeekSectionLong: return QLatin1String("DayOfWeekSectionLong");
- case QDateTimeParser::Hour24Section: return QLatin1String("Hour24Section");
- case QDateTimeParser::Hour12Section: return QLatin1String("Hour12Section");
- case QDateTimeParser::MSecSection: return QLatin1String("MSecSection");
- case QDateTimeParser::MinuteSection: return QLatin1String("MinuteSection");
- case QDateTimeParser::MonthSection: return QLatin1String("MonthSection");
- case QDateTimeParser::SecondSection: return QLatin1String("SecondSection");
- case QDateTimeParser::TimeZoneSection: return QLatin1String("TimeZoneSection");
- case QDateTimeParser::YearSection: return QLatin1String("YearSection");
- case QDateTimeParser::YearSection2Digits: return QLatin1String("YearSection2Digits");
- case QDateTimeParser::NoSection: return QLatin1String("NoSection");
- case QDateTimeParser::FirstSection: return QLatin1String("FirstSection");
- case QDateTimeParser::LastSection: return QLatin1String("LastSection");
- default: return QLatin1String("Unknown section ") + QString::number(int(s));
- }
-}
-
-/*!
- \internal
- For debugging. Returns the name of the state \a s.
-*/
-
-QString QDateTimeParser::stateName(State s) const
-{
- switch (s) {
- case Invalid: return QLatin1String("Invalid");
- case Intermediate: return QLatin1String("Intermediate");
- case Acceptable: return QLatin1String("Acceptable");
- default: return QLatin1String("Unknown state ") + QString::number(s);
- }
-}
-
-#if QT_CONFIG(datestring)
-bool QDateTimeParser::fromString(const QString &t, QDate *date, QTime *time) const
-{
- QDateTime val(QDate(1900, 1, 1), QDATETIMEEDIT_TIME_MIN);
- const StateNode tmp = parse(t, -1, val, false);
- if (tmp.state != Acceptable || tmp.conflicts) {
- return false;
- }
- if (time) {
- const QTime t = tmp.value.time();
- if (!t.isValid()) {
- return false;
- }
- *time = t;
- }
-
- if (date) {
- const QDate d = tmp.value.date();
- if (!d.isValid()) {
- return false;
- }
- *date = d;
- }
- return true;
-}
-#endif // datestring
-
-QDateTime QDateTimeParser::getMinimum() const
-{
- // Cache the most common case
- if (spec == Qt::LocalTime) {
- static const QDateTime localTimeMin(QDATETIMEEDIT_DATE_MIN, QDATETIMEEDIT_TIME_MIN, Qt::LocalTime);
- return localTimeMin;
- }
- return QDateTime(QDATETIMEEDIT_DATE_MIN, QDATETIMEEDIT_TIME_MIN, spec);
-}
-
-QDateTime QDateTimeParser::getMaximum() const
-{
- // Cache the most common case
- if (spec == Qt::LocalTime) {
- static const QDateTime localTimeMax(QDATETIMEEDIT_DATE_MAX, QDATETIMEEDIT_TIME_MAX, Qt::LocalTime);
- return localTimeMax;
- }
- return QDateTime(QDATETIMEEDIT_DATE_MAX, QDATETIMEEDIT_TIME_MAX, spec);
-}
-
-QString QDateTimeParser::getAmPmText(AmPm ap, Case cs) const
-{
- const QLocale loc = locale();
- QString raw = ap == AmText ? loc.amText() : loc.pmText();
- return cs == UpperCase ? raw.toUpper() : raw.toLower();
-}
-
-/*
- \internal
-
- I give arg2 preference because arg1 is always a QDateTime.
-*/
-
-bool operator==(const QDateTimeParser::SectionNode &s1, const QDateTimeParser::SectionNode &s2)
-{
- return (s1.type == s2.type) && (s1.pos == s2.pos) && (s1.count == s2.count);
-}
-
-QT_END_NAMESPACE
diff --git a/src/corelib/tools/qdatetimeparser_p.h b/src/corelib/tools/qdatetimeparser_p.h
deleted file mode 100644
index f7e6e351fe..0000000000
--- a/src/corelib/tools/qdatetimeparser_p.h
+++ /dev/null
@@ -1,313 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#ifndef QDATETIMEPARSER_P_H
-#define QDATETIMEPARSER_P_H
-
-//
-// W A R N I N G
-// -------------
-//
-// This file is not part of the Qt API. It exists purely as an
-// implementation detail. This header file may change from version to
-// version without notice, or even be removed.
-//
-// We mean it.
-//
-
-#include <QtCore/private/qglobal_p.h>
-#include "qplatformdefs.h"
-#include "QtCore/qatomic.h"
-#include "QtCore/qdatetime.h"
-#include "QtCore/qstringlist.h"
-#include "QtCore/qlocale.h"
-#ifndef QT_BOOTSTRAPPED
-# include "QtCore/qvariant.h"
-#endif
-#include "QtCore/qvector.h"
-#include "QtCore/qcoreapplication.h"
-
-QT_REQUIRE_CONFIG(datetimeparser);
-
-#define QDATETIMEEDIT_TIME_MIN QTime(0, 0, 0, 0)
-#define QDATETIMEEDIT_TIME_MAX QTime(23, 59, 59, 999)
-#define QDATETIMEEDIT_DATE_MIN QDate(100, 1, 1)
-#define QDATETIMEEDIT_COMPAT_DATE_MIN QDate(1752, 9, 14)
-#define QDATETIMEEDIT_DATE_MAX QDate(9999, 12, 31)
-#define QDATETIMEEDIT_DATETIME_MIN QDateTime(QDATETIMEEDIT_DATE_MIN, QDATETIMEEDIT_TIME_MIN)
-#define QDATETIMEEDIT_COMPAT_DATETIME_MIN QDateTime(QDATETIMEEDIT_COMPAT_DATE_MIN, QDATETIMEEDIT_TIME_MIN)
-#define QDATETIMEEDIT_DATETIME_MAX QDateTime(QDATETIMEEDIT_DATE_MAX, QDATETIMEEDIT_TIME_MAX)
-#define QDATETIMEEDIT_DATE_INITIAL QDate(2000, 1, 1)
-
-QT_BEGIN_NAMESPACE
-
-class Q_CORE_EXPORT QDateTimeParser
-{
- Q_DECLARE_TR_FUNCTIONS(QDateTimeParser)
-public:
- enum Context {
- FromString,
- DateTimeEdit
- };
- QDateTimeParser(QVariant::Type t, Context ctx)
- : currentSectionIndex(-1), display(0), cachedDay(-1), parserType(t),
- fixday(false), spec(Qt::LocalTime), context(ctx)
- {
- defaultLocale = QLocale::system();
- first.type = FirstSection;
- first.pos = -1;
- first.count = -1;
- first.zeroesAdded = 0;
- last.type = LastSection;
- last.pos = -1;
- last.count = -1;
- last.zeroesAdded = 0;
- none.type = NoSection;
- none.pos = -1;
- none.count = -1;
- none.zeroesAdded = 0;
- }
- virtual ~QDateTimeParser();
-
- enum Section {
- NoSection = 0x00000,
- AmPmSection = 0x00001,
- MSecSection = 0x00002,
- SecondSection = 0x00004,
- MinuteSection = 0x00008,
- Hour12Section = 0x00010,
- Hour24Section = 0x00020,
- TimeZoneSection = 0x00040,
- HourSectionMask = (Hour12Section | Hour24Section),
- TimeSectionMask = (MSecSection | SecondSection | MinuteSection |
- HourSectionMask | AmPmSection | TimeZoneSection),
-
- DaySection = 0x00100,
- MonthSection = 0x00200,
- YearSection = 0x00400,
- YearSection2Digits = 0x00800,
- YearSectionMask = YearSection | YearSection2Digits,
- DayOfWeekSectionShort = 0x01000,
- DayOfWeekSectionLong = 0x02000,
- DayOfWeekSectionMask = DayOfWeekSectionShort | DayOfWeekSectionLong,
- DaySectionMask = DaySection | DayOfWeekSectionMask,
- DateSectionMask = DaySectionMask | MonthSection | YearSectionMask,
-
- Internal = 0x10000,
- FirstSection = 0x20000 | Internal,
- LastSection = 0x40000 | Internal,
- CalendarPopupSection = 0x80000 | Internal,
-
- NoSectionIndex = -1,
- FirstSectionIndex = -2,
- LastSectionIndex = -3,
- CalendarPopupIndex = -4
- }; // extending qdatetimeedit.h's equivalent
- Q_DECLARE_FLAGS(Sections, Section)
-
- struct Q_CORE_EXPORT SectionNode {
- Section type;
- mutable int pos;
- int count;
- int zeroesAdded;
-
- static QString name(Section s);
- QString name() const { return name(type); }
- QString format() const;
- int maxChange() const;
- };
-
- enum State { // duplicated from QValidator
- Invalid,
- Intermediate,
- Acceptable
- };
-
- struct StateNode {
- StateNode() : state(Invalid), padded(0), conflicts(false) {}
- StateNode(const QDateTime &val, State ok=Acceptable, int pad=0, bool bad=false)
- : value(val), state(ok), padded(pad), conflicts(bad) {}
- QString input;
- QDateTime value;
- State state;
- int padded;
- bool conflicts;
- };
-
- enum AmPm {
- AmText,
- PmText
- };
-
- enum Case {
- UpperCase,
- LowerCase
- };
-
-#if QT_CONFIG(datestring)
- StateNode parse(QString input, int position, const QDateTime &defaultValue, bool fixup) const;
- bool fromString(const QString &text, QDate *date, QTime *time) const;
-#endif
- bool parseFormat(const QString &format);
-
- enum FieldInfoFlag {
- Numeric = 0x01,
- FixedWidth = 0x02,
- AllowPartial = 0x04,
- Fraction = 0x08
- };
- Q_DECLARE_FLAGS(FieldInfo, FieldInfoFlag)
-
- FieldInfo fieldInfo(int index) const;
-
- void setDefaultLocale(const QLocale &loc) { defaultLocale = loc; }
- virtual QString displayText() const { return text; }
-
-private:
- int sectionMaxSize(Section s, int count) const;
- QString sectionText(const QString &text, int sectionIndex, int index) const;
-#if QT_CONFIG(datestring)
- StateNode scanString(const QDateTime &defaultValue,
- bool fixup, QString *input) const;
- struct ParsedSection {
- int value;
- int used;
- int zeroes;
- State state;
- Q_DECL_CONSTEXPR ParsedSection(State ok = Invalid,
- int val = 0, int read = 0, int zs = 0)
- : value(ok == Invalid ? -1 : val), used(read), zeroes(zs), state(ok)
- {}
- };
- ParsedSection parseSection(const QDateTime &currentValue, int sectionIndex,
- int offset, QString *text) const;
- int findMonth(const QString &str1, int monthstart, int sectionIndex,
- QString *monthName = 0, int *used = 0) const;
- int findDay(const QString &str1, int intDaystart, int sectionIndex,
- QString *dayName = 0, int *used = 0) const;
- ParsedSection findTimeZone(QStringRef str, const QDateTime &when,
- int maxVal, int minVal) const;
-#if QT_CONFIG(timezone)
- // Implemented in qdatetime.cpp:
- static int startsWithLocalTimeZone(const QStringRef name);
-#endif
-
- enum AmPmFinder {
- Neither = -1,
- AM = 0,
- PM = 1,
- PossibleAM = 2,
- PossiblePM = 3,
- PossibleBoth = 4
- };
- AmPmFinder findAmPm(QString &str, int index, int *used = 0) const;
-#endif // datestring
-
- bool potentialValue(const QStringRef &str, int min, int max, int index,
- const QDateTime &currentValue, int insert) const;
- bool potentialValue(const QString &str, int min, int max, int index,
- const QDateTime &currentValue, int insert) const
- {
- return potentialValue(QStringRef(&str), min, max, index, currentValue, insert);
- }
-
-protected: // for the benefit of QDateTimeEditPrivate
- int sectionSize(int index) const;
- int sectionMaxSize(int index) const;
- int sectionPos(int index) const;
- int sectionPos(const SectionNode &sn) const;
-
- const SectionNode &sectionNode(int index) const;
- Section sectionType(int index) const;
- QString sectionText(int sectionIndex) const;
- int getDigit(const QDateTime &dt, int index) const;
- bool setDigit(QDateTime &t, int index, int newval) const;
-
- int absoluteMax(int index, const QDateTime &value = QDateTime()) const;
- int absoluteMin(int index) const;
-
- bool skipToNextSection(int section, const QDateTime &current, const QStringRef &sectionText) const;
- bool skipToNextSection(int section, const QDateTime &current, const QString &sectionText) const
- {
- return skipToNextSection(section, current, QStringRef(&sectionText));
- }
- QString stateName(State s) const;
- virtual QDateTime getMinimum() const;
- virtual QDateTime getMaximum() const;
- virtual int cursorPosition() const { return -1; }
- virtual QString getAmPmText(AmPm ap, Case cs) const;
- virtual QLocale locale() const { return defaultLocale; }
-
- mutable int currentSectionIndex;
- Sections display;
- /*
- This stores the most recently selected day.
- It is useful when considering the following scenario:
-
- 1. Date is: 31/01/2000
- 2. User increments month: 29/02/2000
- 3. User increments month: 31/03/2000
-
- At step 1, cachedDay stores 31. At step 2, the 31 is invalid for February, so the cachedDay is not updated.
- At step 3, the month is changed to March, for which 31 is a valid day. Since 29 < 31, the day is set to cachedDay.
- This is good for when users have selected their desired day and are scrolling up or down in the month or year section
- and do not want smaller months (or non-leap years) to alter the day that they chose.
- */
- mutable int cachedDay;
- mutable QString text;
- QVector<SectionNode> sectionNodes;
- SectionNode first, last, none, popup;
- QStringList separators;
- QString displayFormat;
- QLocale defaultLocale;
- QVariant::Type parserType;
- bool fixday;
- Qt::TimeSpec spec; // spec if used by QDateTimeEdit
- Context context;
-};
-Q_DECLARE_TYPEINFO(QDateTimeParser::SectionNode, Q_PRIMITIVE_TYPE);
-
-Q_CORE_EXPORT bool operator==(const QDateTimeParser::SectionNode &s1, const QDateTimeParser::SectionNode &s2);
-
-Q_DECLARE_OPERATORS_FOR_FLAGS(QDateTimeParser::Sections)
-Q_DECLARE_OPERATORS_FOR_FLAGS(QDateTimeParser::FieldInfo)
-
-QT_END_NAMESPACE
-
-#endif // QDATETIME_P_H
diff --git a/src/corelib/tools/qdoublescanprint_p.h b/src/corelib/tools/qdoublescanprint_p.h
deleted file mode 100644
index 3865c69a99..0000000000
--- a/src/corelib/tools/qdoublescanprint_p.h
+++ /dev/null
@@ -1,156 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#ifndef QDOUBLESCANPRINT_P_H
-#define QDOUBLESCANPRINT_P_H
-
-//
-// W A R N I N G
-// -------------
-//
-// This file is not part of the Qt API. It exists for the convenience
-// of internal files. This header file may change from version to version
-// without notice, or even be removed.
-//
-// We mean it.
-//
-
-#include <qglobal.h>
-
-#if defined(Q_CC_MSVC) && (defined(QT_BOOTSTRAPPED) || defined(QT_NO_DOUBLECONVERSION))
-# include <stdio.h>
-# include <locale.h>
-
-QT_BEGIN_NAMESPACE
-
-// We can always use _sscanf_l and _snprintf_l on MSVC as those were introduced in 2005.
-
-// MSVC doesn't document what it will do with a NULL locale passed to _sscanf_l or _snprintf_l.
-// The documentation for _create_locale() does not formally document "C" to be valid, but an example
-// code snippet in the same documentation shows it.
-
-struct QCLocaleT {
- QCLocaleT() : locale(_create_locale(LC_ALL, "C"))
- {
- }
-
- ~QCLocaleT()
- {
- _free_locale(locale);
- }
-
- const _locale_t locale;
-};
-
-# define QT_CLOCALE_HOLDER Q_GLOBAL_STATIC(QCLocaleT, cLocaleT)
-# define QT_CLOCALE cLocaleT()->locale
-
-inline int qDoubleSscanf(const char *buf, _locale_t locale, const char *format, double *d,
- int *processed)
-{
- return _sscanf_l(buf, format, locale, d, processed);
-}
-
-inline int qDoubleSnprintf(char *buf, size_t buflen, _locale_t locale, const char *format, double d)
-{
- return _snprintf_l(buf, buflen, format, locale, d);
-}
-
-QT_END_NAMESPACE
-
-#elif defined(QT_BOOTSTRAPPED)
-# include <stdio.h>
-
-QT_BEGIN_NAMESPACE
-
-// When bootstrapping we don't have libdouble-conversion available, yet. We can also not use locale
-// aware snprintf and sscanf variants in the general case because those are only available on select
-// platforms. We can use the regular snprintf and sscanf because we don't do setlocale(3) when
-// bootstrapping and the locale is always "C" then.
-
-# define QT_CLOCALE_HOLDER
-# define QT_CLOCALE 0
-
-inline int qDoubleSscanf(const char *buf, int, const char *format, double *d, int *processed)
-{
- return sscanf(buf, format, d, processed);
-}
-inline int qDoubleSnprintf(char *buf, size_t buflen, int, const char *format, double d)
-{
- return snprintf(buf, buflen, format, d);
-}
-
-QT_END_NAMESPACE
-
-#else // !QT_BOOTSTRAPPED && (!Q_CC_MSVC || !QT_NO_DOUBLECONVERSION)
-# ifdef QT_NO_DOUBLECONVERSION
-# include <stdio.h>
-# include <xlocale.h>
-
-QT_BEGIN_NAMESPACE
-
-// OS X and FreeBSD both treat NULL as the "C" locale for snprintf_l and sscanf_l.
-// When other implementations with different behavior show up, we'll have to do newlocale(3) and
-// freelocale(3) here. The arguments to those will depend on what the other implementations will
-// offer. OS X and FreeBSD again interpret a locale name of NULL as "C", but "C" itself is not
-// documented as valid locale name. Mind that the names of the LC_* constants differ between e.g.
-// BSD variants and linux.
-
-# define QT_CLOCALE_HOLDER
-# define QT_CLOCALE NULL
-
-inline int qDoubleSscanf(const char *buf, locale_t locale, const char *format, double *d,
- int *processed)
-{
- return sscanf_l(buf, locale, format, d, processed);
-}
-inline int qDoubleSnprintf(char *buf, size_t buflen, locale_t locale, const char *format, double d)
-{
- return snprintf_l(buf, buflen, locale, format, d);
-}
-
-QT_END_NAMESPACE
-
-# else // !QT_NO_DOUBLECONVERSION
-# include <double-conversion/double-conversion.h>
-# define QT_CLOCALE_HOLDER
-# endif // QT_NO_DOUBLECONVERSION
-#endif // QT_BOOTSTRAPPED
-
-#endif // QDOUBLESCANPRINT_P_H
diff --git a/src/corelib/tools/qeasingcurve.cpp b/src/corelib/tools/qeasingcurve.cpp
index f82048db0f..52c8d13fe3 100644
--- a/src/corelib/tools/qeasingcurve.cpp
+++ b/src/corelib/tools/qeasingcurve.cpp
@@ -339,6 +339,23 @@ struct TCBPoint {
};
Q_DECLARE_TYPEINFO(TCBPoint, Q_PRIMITIVE_TYPE);
+QDataStream &operator<<(QDataStream &stream, const TCBPoint &point)
+{
+ stream << point._point
+ << point._t
+ << point._c
+ << point._b;
+ return stream;
+}
+
+QDataStream &operator>>(QDataStream &stream, TCBPoint &point)
+{
+ stream >> point._point
+ >> point._t
+ >> point._c
+ >> point._b;
+ return stream;
+}
typedef QVector<TCBPoint> TCBPoints;
@@ -363,6 +380,34 @@ public:
};
+QDataStream &operator<<(QDataStream &stream, QEasingCurveFunction *func)
+{
+ if (func) {
+ stream << func->_p;
+ stream << func->_a;
+ stream << func->_o;
+ if (stream.version() > QDataStream::Qt_5_12) {
+ stream << func->_bezierCurves;
+ stream << func->_tcbPoints;
+ }
+ }
+ return stream;
+}
+
+QDataStream &operator>>(QDataStream &stream, QEasingCurveFunction *func)
+{
+ if (func) {
+ stream >> func->_p;
+ stream >> func->_a;
+ stream >> func->_o;
+ if (stream.version() > QDataStream::Qt_5_12) {
+ stream >> func->_bezierCurves;
+ stream >> func->_tcbPoints;
+ }
+ }
+ return stream;
+}
+
static QEasingCurve::EasingFunction curveToFunc(QEasingCurve::Type curve);
qreal QEasingCurveFunction::value(qreal t)
@@ -538,6 +583,13 @@ struct BezierEase : public QEasingCurveFunction
qWarning("QEasingCurve: Invalid bezier curve");
return x;
}
+
+ // The bezier computation is not always precise on the endpoints, so handle explicitly
+ if (!(x > 0))
+ return 0;
+ if (!(x < 1))
+ return 1;
+
SingleCubicBezier *singleCubicBezier = 0;
getBezierSegment(singleCubicBezier, x);
@@ -862,6 +914,10 @@ struct TCBEase : public BezierEase
return BezierEase::value(x);
}
+ QEasingCurveFunction *copy() const override
+ {
+ return new TCBEase{*this};
+ }
};
struct ElasticEase : public QEasingCurveFunction
@@ -949,6 +1005,11 @@ struct BackEase : public QEasingCurveFunction
qreal value(qreal t) override
{
+ // The *Back() functions are not always precise on the endpoints, so handle explicitly
+ if (!(t > 0))
+ return 0;
+ if (!(t < 1))
+ return 1;
qreal o = (_o < 0) ? qreal(1.70158) : _o;
switch(_t) {
case QEasingCurve::InBack:
@@ -1480,9 +1541,7 @@ QDataStream &operator<<(QDataStream &stream, const QEasingCurve &easing)
bool hasConfig = easing.d_ptr->config;
stream << hasConfig;
if (hasConfig) {
- stream << easing.d_ptr->config->_p;
- stream << easing.d_ptr->config->_a;
- stream << easing.d_ptr->config->_o;
+ stream << easing.d_ptr->config;
}
return stream;
}
@@ -1515,9 +1574,7 @@ QDataStream &operator>>(QDataStream &stream, QEasingCurve &easing)
easing.d_ptr->config = nullptr;
if (hasConfig) {
QEasingCurveFunction *config = curveToFunctionObject(type);
- stream >> config->_p;
- stream >> config->_a;
- stream >> config->_o;
+ stream >> config;
easing.d_ptr->config = config;
}
return stream;
diff --git a/src/corelib/tools/qeasingcurve.h b/src/corelib/tools/qeasingcurve.h
index 74bde5825a..d3a468bb22 100644
--- a/src/corelib/tools/qeasingcurve.h
+++ b/src/corelib/tools/qeasingcurve.h
@@ -41,6 +41,9 @@
#define QEASINGCURVE_H
#include <QtCore/qglobal.h>
+
+QT_REQUIRE_CONFIG(easingcurve);
+
#include <QtCore/qobjectdefs.h>
#include <QtCore/qvector.h>
#if QT_DEPRECATED_SINCE(5, 0)
@@ -80,13 +83,11 @@ public:
QEasingCurve &operator=(const QEasingCurve &other)
{ if ( this != &other ) { QEasingCurve copy(other); swap(copy); } return *this; }
-#ifdef Q_COMPILER_RVALUE_REFS
- QEasingCurve(QEasingCurve &&other) Q_DECL_NOTHROW : d_ptr(other.d_ptr) { other.d_ptr = nullptr; }
- QEasingCurve &operator=(QEasingCurve &&other) Q_DECL_NOTHROW
+ QEasingCurve(QEasingCurve &&other) noexcept : d_ptr(other.d_ptr) { other.d_ptr = nullptr; }
+ QEasingCurve &operator=(QEasingCurve &&other) noexcept
{ qSwap(d_ptr, other.d_ptr); return *this; }
-#endif
- void swap(QEasingCurve &other) Q_DECL_NOTHROW { qSwap(d_ptr, other.d_ptr); }
+ void swap(QEasingCurve &other) noexcept { qSwap(d_ptr, other.d_ptr); }
bool operator==(const QEasingCurve &other) const;
inline bool operator!=(const QEasingCurve &other) const
diff --git a/src/corelib/tools/qfreelist_p.h b/src/corelib/tools/qfreelist_p.h
index 7776dd8c4e..5ba23b344b 100644
--- a/src/corelib/tools/qfreelist_p.h
+++ b/src/corelib/tools/qfreelist_p.h
@@ -171,7 +171,7 @@ class QFreeList
// qDebug("QFreeList: allocating %d elements (%ld bytes) with offset %d", size, size * sizeof(ElementType), offset);
ElementType *v = new ElementType[size];
for (int i = 0; i < size; ++i)
- v[i].next.store(offset + i + 1);
+ v[i].next.storeRelaxed(offset + i + 1);
return v;
}
@@ -225,14 +225,14 @@ template <typename T, typename ConstantsType>
inline typename QFreeList<T, ConstantsType>::ConstReferenceType QFreeList<T, ConstantsType>::at(int x) const
{
const int block = blockfor(x);
- return (_v[block].load())[x].t();
+ return (_v[block].loadRelaxed())[x].t();
}
template <typename T, typename ConstantsType>
inline typename QFreeList<T, ConstantsType>::ReferenceType QFreeList<T, ConstantsType>::operator[](int x)
{
const int block = blockfor(x);
- return (_v[block].load())[x].t();
+ return (_v[block].loadRelaxed())[x].t();
}
template <typename T, typename ConstantsType>
@@ -249,15 +249,15 @@ inline int QFreeList<T, ConstantsType>::next()
if (!v) {
v = allocate((id & ConstantsType::IndexMask) - at, ConstantsType::Sizes[block]);
- if (!_v[block].testAndSetRelease(0, v)) {
+ if (!_v[block].testAndSetRelease(nullptr, v)) {
// race with another thread lost
delete [] v;
v = _v[block].loadAcquire();
- Q_ASSERT(v != 0);
+ Q_ASSERT(v != nullptr);
}
}
- newid = v[at].next.load() | (id & ~ConstantsType::IndexMask);
+ newid = v[at].next.loadRelaxed() | (id & ~ConstantsType::IndexMask);
} while (!_next.testAndSetRelease(id, newid));
// qDebug("QFreeList::next(): returning %d (_next now %d, serial %d)",
// id & ConstantsType::IndexMask,
@@ -271,12 +271,12 @@ inline void QFreeList<T, ConstantsType>::release(int id)
{
int at = id & ConstantsType::IndexMask;
const int block = blockfor(at);
- ElementType *v = _v[block].load();
+ ElementType *v = _v[block].loadRelaxed();
int x, newid;
do {
x = _next.loadAcquire();
- v[at].next.store(x & ConstantsType::IndexMask);
+ v[at].next.storeRelaxed(x & ConstantsType::IndexMask);
newid = incrementserial(x, id);
} while (!_next.testAndSetRelease(x, newid));
diff --git a/src/corelib/tools/qharfbuzz.cpp b/src/corelib/tools/qharfbuzz.cpp
deleted file mode 100644
index a3e266ccd2..0000000000
--- a/src/corelib/tools/qharfbuzz.cpp
+++ /dev/null
@@ -1,109 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#include "qharfbuzz_p.h"
-
-#include "qunicodetables_p.h"
-#if QT_CONFIG(library)
-#include "qlibrary.h"
-#endif
-
-QT_USE_NAMESPACE
-
-extern "C" {
-
-void HB_GetUnicodeCharProperties(HB_UChar32 ch, HB_CharCategory *category, int *combiningClass)
-{
- const QUnicodeTables::Properties *prop = QUnicodeTables::properties(ch);
- *category = (HB_CharCategory)prop->category;
- *combiningClass = prop->combiningClass;
-}
-
-HB_CharCategory HB_GetUnicodeCharCategory(HB_UChar32 ch)
-{
- return (HB_CharCategory)QChar::category(ch);
-}
-
-int HB_GetUnicodeCharCombiningClass(HB_UChar32 ch)
-{
- return QChar::combiningClass(ch);
-}
-
-HB_UChar16 HB_GetMirroredChar(HB_UChar16 ch)
-{
- return QChar::mirroredChar(ch);
-}
-
-void (*HB_Library_Resolve(const char *library, int version, const char *symbol))()
-{
-#if !QT_CONFIG(library)
- Q_UNUSED(library);
- Q_UNUSED(version);
- Q_UNUSED(symbol);
- return 0;
-#else
- return QLibrary::resolve(QLatin1String(library), version, symbol);
-#endif
-}
-
-} // extern "C"
-
-QT_BEGIN_NAMESPACE
-
-HB_Bool qShapeItem(HB_ShaperItem *item)
-{
- return HB_ShapeItem(item);
-}
-
-HB_Face qHBNewFace(void *font, HB_GetFontTableFunc tableFunc)
-{
- return HB_AllocFace(font, tableFunc);
-}
-
-HB_Face qHBLoadFace(HB_Face face)
-{
- return HB_LoadFace(face);
-}
-
-void qHBFreeFace(HB_Face face)
-{
- HB_FreeFace(face);
-}
-
-QT_END_NAMESPACE
diff --git a/src/corelib/tools/qharfbuzz_p.h b/src/corelib/tools/qharfbuzz_p.h
deleted file mode 100644
index 2a0307d35f..0000000000
--- a/src/corelib/tools/qharfbuzz_p.h
+++ /dev/null
@@ -1,357 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-//
-// W A R N I N G
-// -------------
-//
-// This file is not part of the Qt API. It exists purely as an
-// implementation detail. This header file may change from version to
-// version without notice, or even be removed.
-//
-// We mean it.
-//
-
-#include <QtCore/private/qglobal_p.h>
-
-#ifndef QHARFBUZZ_P_H
-#define QHARFBUZZ_P_H
-
-#include <QtCore/qchar.h>
-
-#if defined(QT_BUILD_CORE_LIB)
-# include <harfbuzz-shaper.h>
-#else
-// a minimal set of HB types required for Qt libs other than Core
-extern "C" {
-
-typedef enum {
- /* no error */
- HB_Err_Ok = 0x0000,
- HB_Err_Not_Covered = 0xFFFF,
-
- /* _hb_err() is called whenever returning the following errors,
- * and in a couple places for HB_Err_Not_Covered too. */
-
- /* programmer error */
- HB_Err_Invalid_Argument = 0x1A66,
-
- /* font error */
- HB_Err_Invalid_SubTable_Format = 0x157F,
- HB_Err_Invalid_SubTable = 0x1570,
- HB_Err_Read_Error = 0x6EAD,
-
- /* system error */
- HB_Err_Out_Of_Memory = 0xDEAD
-} HB_Error;
-
-typedef QT_PREPEND_NAMESPACE(qint8) hb_int8;
-typedef QT_PREPEND_NAMESPACE(quint8) hb_uint8;
-typedef QT_PREPEND_NAMESPACE(qint16) hb_int16;
-typedef QT_PREPEND_NAMESPACE(quint16) hb_uint16;
-typedef QT_PREPEND_NAMESPACE(qint32) hb_int32;
-typedef QT_PREPEND_NAMESPACE(quint32) hb_uint32;
-
-typedef hb_uint8 HB_Bool;
-typedef hb_uint8 HB_Byte;
-typedef hb_uint16 HB_UShort;
-typedef hb_uint32 HB_UInt;
-typedef hb_int8 HB_Char;
-typedef hb_int16 HB_Short;
-typedef hb_int32 HB_Int;
-typedef hb_uint16 HB_UChar16;
-typedef hb_uint32 HB_UChar32;
-typedef hb_uint32 HB_Glyph;
-typedef hb_int32 HB_Fixed; /* 26.6 */
-typedef hb_int32 HB_16Dot16; /* 16.16 */
-typedef hb_uint32 HB_Tag;
-
-typedef struct {
- HB_Fixed x;
- HB_Fixed y;
-} HB_FixedPoint;
-
-typedef enum {
- HB_Script_Common,
- HB_Script_Greek,
- HB_Script_Cyrillic,
- HB_Script_Armenian,
- HB_Script_Hebrew,
- HB_Script_Arabic,
- HB_Script_Syriac,
- HB_Script_Thaana,
- HB_Script_Devanagari,
- HB_Script_Bengali,
- HB_Script_Gurmukhi,
- HB_Script_Gujarati,
- HB_Script_Oriya,
- HB_Script_Tamil,
- HB_Script_Telugu,
- HB_Script_Kannada,
- HB_Script_Malayalam,
- HB_Script_Sinhala,
- HB_Script_Thai,
- HB_Script_Lao,
- HB_Script_Tibetan,
- HB_Script_Myanmar,
- HB_Script_Georgian,
- HB_Script_Hangul,
- HB_Script_Ogham,
- HB_Script_Runic,
- HB_Script_Khmer,
- HB_Script_Nko,
- HB_Script_Inherited,
- HB_ScriptCount = HB_Script_Inherited
-} HB_Script;
-
-#ifdef __xlC__
-typedef unsigned hb_bitfield;
-#else
-typedef hb_uint8 hb_bitfield;
-#endif
-
-typedef struct {
- hb_bitfield justification :4; /* Justification class */
- hb_bitfield clusterStart :1; /* First glyph of representation of cluster */
- hb_bitfield mark :1; /* needs to be positioned around base char */
- hb_bitfield zeroWidth :1; /* ZWJ, ZWNJ etc, with no width */
- hb_bitfield dontPrint :1;
- hb_bitfield combiningClass :8;
-} HB_GlyphAttributes;
-
-typedef void * HB_GDEF;
-typedef void * HB_GSUB;
-typedef void * HB_GPOS;
-typedef void * HB_Buffer;
-
-typedef HB_Error (*HB_GetFontTableFunc)(void *font, HB_Tag tag, HB_Byte *buffer, HB_UInt *length);
-
-typedef struct HB_FaceRec_ {
- HB_Bool isSymbolFont;
-
- HB_GDEF gdef;
- HB_GSUB gsub;
- HB_GPOS gpos;
- HB_Bool supported_scripts[HB_ScriptCount];
- HB_Buffer buffer;
- HB_Script current_script;
- int current_flags; /* HB_ShaperFlags */
- HB_Bool has_opentype_kerning;
- HB_Bool glyphs_substituted;
- HB_GlyphAttributes *tmpAttributes;
- unsigned int *tmpLogClusters;
- int length;
- int orig_nglyphs;
- void *font_for_init;
- HB_GetFontTableFunc get_font_table_func;
-} HB_FaceRec;
-
-typedef struct {
- HB_Fixed x, y;
- HB_Fixed width, height;
- HB_Fixed xOffset, yOffset;
-} HB_GlyphMetrics;
-
-typedef enum {
- HB_FontAscent
-} HB_FontMetric;
-
-struct HB_Font_;
-typedef struct HB_Font_ *HB_Font;
-typedef struct HB_FaceRec_ *HB_Face;
-
-typedef struct {
- HB_Bool (*convertStringToGlyphIndices)(HB_Font font, const HB_UChar16 *string, hb_uint32 length, HB_Glyph *glyphs, hb_uint32 *numGlyphs, HB_Bool rightToLeft);
- void (*getGlyphAdvances)(HB_Font font, const HB_Glyph *glyphs, hb_uint32 numGlyphs, HB_Fixed *advances, int flags /*HB_ShaperFlag*/);
- HB_Bool (*canRender)(HB_Font font, const HB_UChar16 *string, hb_uint32 length);
- /* implementation needs to make sure to load a scaled glyph, so /no/ FT_LOAD_NO_SCALE */
- HB_Error (*getPointInOutline)(HB_Font font, HB_Glyph glyph, int flags /*HB_ShaperFlag*/, hb_uint32 point, HB_Fixed *xpos, HB_Fixed *ypos, hb_uint32 *nPoints);
- void (*getGlyphMetrics)(HB_Font font, HB_Glyph glyph, HB_GlyphMetrics *metrics);
- HB_Fixed (*getFontMetric)(HB_Font font, HB_FontMetric metric);
-} HB_FontClass;
-
-typedef struct HB_Font_ {
- const HB_FontClass *klass;
-
- /* Metrics */
- HB_UShort x_ppem, y_ppem;
- HB_16Dot16 x_scale, y_scale;
-
- void *userData;
-} HB_FontRec;
-
-typedef enum {
- HB_LeftToRight = 0,
- HB_RightToLeft = 1
-} HB_StringToGlyphsFlags;
-
-typedef enum {
- HB_ShaperFlag_Default = 0,
- HB_ShaperFlag_NoKerning = 1,
- HB_ShaperFlag_UseDesignMetrics = 2
-} HB_ShaperFlag;
-
-typedef struct
-{
- hb_uint32 pos;
- hb_uint32 length;
- HB_Script script;
- hb_uint8 bidiLevel;
-} HB_ScriptItem;
-
-typedef struct HB_ShaperItem_ HB_ShaperItem;
-
-struct HB_ShaperItem_ {
- const HB_UChar16 *string; /* input: the Unicode UTF16 text to be shaped */
- hb_uint32 stringLength; /* input: the length of the input in 16-bit words */
- HB_ScriptItem item; /* input: the current run to be shaped: a run of text all in the same script that is a substring of <string> */
- HB_Font font; /* input: the font: scale, units and function pointers supplying glyph indices and metrics */
- HB_Face face; /* input: the shaper state; current script, access to the OpenType tables , etc. */
- int shaperFlags; /* input (unused) should be set to 0; intended to support flags defined in HB_ShaperFlag */
- HB_Bool glyphIndicesPresent; /* input: true if the <glyphs> array contains glyph indices ready to be shaped */
- hb_uint32 initialGlyphCount; /* input: if glyphIndicesPresent is true, the number of glyph indices in the <glyphs> array */
-
- hb_uint32 num_glyphs; /* input: capacity of output arrays <glyphs>, <attributes>, <advances>, <offsets>, and <log_clusters>; */
- /* output: required capacity (may be larger than actual capacity) */
-
- HB_Glyph *glyphs; /* output: <num_glyphs> indices of shaped glyphs */
- HB_GlyphAttributes *attributes; /* output: <num_glyphs> glyph attributes */
- HB_Fixed *advances; /* output: <num_glyphs> advances */
- HB_FixedPoint *offsets; /* output: <num_glyphs> offsets */
- unsigned short *log_clusters; /* output: for each output glyph, the index in the input of the start of its logical cluster */
-
- /* internal */
- HB_Bool kerning_applied; /* output: true if kerning was applied by the shaper */
-};
-
-}
-
-#endif // QT_BUILD_CORE_LIB
-
-
-QT_BEGIN_NAMESPACE
-
-static inline HB_Script script_to_hbscript(uchar script)
-{
- switch (script) {
- case QChar::Script_Inherited: return HB_Script_Inherited;
- case QChar::Script_Common: return HB_Script_Common;
- case QChar::Script_Arabic: return HB_Script_Arabic;
- case QChar::Script_Armenian: return HB_Script_Armenian;
- case QChar::Script_Bengali: return HB_Script_Bengali;
- case QChar::Script_Cyrillic: return HB_Script_Cyrillic;
- case QChar::Script_Devanagari: return HB_Script_Devanagari;
- case QChar::Script_Georgian: return HB_Script_Georgian;
- case QChar::Script_Greek: return HB_Script_Greek;
- case QChar::Script_Gujarati: return HB_Script_Gujarati;
- case QChar::Script_Gurmukhi: return HB_Script_Gurmukhi;
- case QChar::Script_Hangul: return HB_Script_Hangul;
- case QChar::Script_Hebrew: return HB_Script_Hebrew;
- case QChar::Script_Kannada: return HB_Script_Kannada;
- case QChar::Script_Khmer: return HB_Script_Khmer;
- case QChar::Script_Lao: return HB_Script_Lao;
- case QChar::Script_Malayalam: return HB_Script_Malayalam;
- case QChar::Script_Myanmar: return HB_Script_Myanmar;
- case QChar::Script_Ogham: return HB_Script_Ogham;
- case QChar::Script_Oriya: return HB_Script_Oriya;
- case QChar::Script_Runic: return HB_Script_Runic;
- case QChar::Script_Sinhala: return HB_Script_Sinhala;
- case QChar::Script_Syriac: return HB_Script_Syriac;
- case QChar::Script_Tamil: return HB_Script_Tamil;
- case QChar::Script_Telugu: return HB_Script_Telugu;
- case QChar::Script_Thaana: return HB_Script_Thaana;
- case QChar::Script_Thai: return HB_Script_Thai;
- case QChar::Script_Tibetan: return HB_Script_Tibetan;
- case QChar::Script_Nko: return HB_Script_Nko;
- default: break;
- };
- return HB_Script_Common;
-}
-
-static inline uchar hbscript_to_script(uchar script)
-{
- switch (script) {
- case HB_Script_Inherited: return QChar::Script_Inherited;
- case HB_Script_Common: return QChar::Script_Common;
- case HB_Script_Arabic: return QChar::Script_Arabic;
- case HB_Script_Armenian: return QChar::Script_Armenian;
- case HB_Script_Bengali: return QChar::Script_Bengali;
- case HB_Script_Cyrillic: return QChar::Script_Cyrillic;
- case HB_Script_Devanagari: return QChar::Script_Devanagari;
- case HB_Script_Georgian: return QChar::Script_Georgian;
- case HB_Script_Greek: return QChar::Script_Greek;
- case HB_Script_Gujarati: return QChar::Script_Gujarati;
- case HB_Script_Gurmukhi: return QChar::Script_Gurmukhi;
- case HB_Script_Hangul: return QChar::Script_Hangul;
- case HB_Script_Hebrew: return QChar::Script_Hebrew;
- case HB_Script_Kannada: return QChar::Script_Kannada;
- case HB_Script_Khmer: return QChar::Script_Khmer;
- case HB_Script_Lao: return QChar::Script_Lao;
- case HB_Script_Malayalam: return QChar::Script_Malayalam;
- case HB_Script_Myanmar: return QChar::Script_Myanmar;
- case HB_Script_Ogham: return QChar::Script_Ogham;
- case HB_Script_Oriya: return QChar::Script_Oriya;
- case HB_Script_Runic: return QChar::Script_Runic;
- case HB_Script_Sinhala: return QChar::Script_Sinhala;
- case HB_Script_Syriac: return QChar::Script_Syriac;
- case HB_Script_Tamil: return QChar::Script_Tamil;
- case HB_Script_Telugu: return QChar::Script_Telugu;
- case HB_Script_Thaana: return QChar::Script_Thaana;
- case HB_Script_Thai: return QChar::Script_Thai;
- case HB_Script_Tibetan: return QChar::Script_Tibetan;
- case HB_Script_Nko: return QChar::Script_Nko;
- default: break;
- };
- return QChar::Script_Common;
-}
-
-Q_CORE_EXPORT HB_Bool qShapeItem(HB_ShaperItem *item);
-
-// ### temporary
-Q_CORE_EXPORT HB_Face qHBNewFace(void *font, HB_GetFontTableFunc tableFunc);
-Q_CORE_EXPORT void qHBFreeFace(HB_Face);
-Q_CORE_EXPORT HB_Face qHBLoadFace(HB_Face face);
-
-Q_DECLARE_TYPEINFO(HB_GlyphAttributes, Q_PRIMITIVE_TYPE);
-Q_DECLARE_TYPEINFO(HB_FixedPoint, Q_PRIMITIVE_TYPE);
-Q_DECLARE_TYPEINFO(HB_ScriptItem, Q_PRIMITIVE_TYPE);
-
-QT_END_NAMESPACE
-
-#endif // QHARFBUZZ_P_H
diff --git a/src/corelib/tools/qhash.cpp b/src/corelib/tools/qhash.cpp
index 32e9a4269c..a53d6db997 100644
--- a/src/corelib/tools/qhash.cpp
+++ b/src/corelib/tools/qhash.cpp
@@ -197,7 +197,7 @@ static uint crc32(...)
}
#endif
-static inline uint hash(const uchar *p, size_t len, uint seed) Q_DECL_NOTHROW
+static inline uint hash(const uchar *p, size_t len, uint seed) noexcept
{
uint h = seed;
@@ -210,12 +210,12 @@ static inline uint hash(const uchar *p, size_t len, uint seed) Q_DECL_NOTHROW
return h;
}
-uint qHashBits(const void *p, size_t len, uint seed) Q_DECL_NOTHROW
+uint qHashBits(const void *p, size_t len, uint seed) noexcept
{
return hash(static_cast<const uchar*>(p), int(len), seed);
}
-static inline uint hash(const QChar *p, size_t len, uint seed) Q_DECL_NOTHROW
+static inline uint hash(const QChar *p, size_t len, uint seed) noexcept
{
uint h = seed;
@@ -228,29 +228,29 @@ static inline uint hash(const QChar *p, size_t len, uint seed) Q_DECL_NOTHROW
return h;
}
-uint qHash(const QByteArray &key, uint seed) Q_DECL_NOTHROW
+uint qHash(const QByteArray &key, uint seed) noexcept
{
return hash(reinterpret_cast<const uchar *>(key.constData()), size_t(key.size()), seed);
}
#if QT_STRINGVIEW_LEVEL < 2
-uint qHash(const QString &key, uint seed) Q_DECL_NOTHROW
+uint qHash(const QString &key, uint seed) noexcept
{
return hash(key.unicode(), size_t(key.size()), seed);
}
-uint qHash(const QStringRef &key, uint seed) Q_DECL_NOTHROW
+uint qHash(const QStringRef &key, uint seed) noexcept
{
return hash(key.unicode(), size_t(key.size()), seed);
}
#endif
-uint qHash(QStringView key, uint seed) Q_DECL_NOTHROW
+uint qHash(QStringView key, uint seed) noexcept
{
return hash(key.data(), key.size(), seed);
}
-uint qHash(const QBitArray &bitArray, uint seed) Q_DECL_NOTHROW
+uint qHash(const QBitArray &bitArray, uint seed) noexcept
{
int m = bitArray.d.size() - 1;
uint result = hash(reinterpret_cast<const uchar *>(bitArray.d.constData()),
@@ -264,7 +264,7 @@ uint qHash(const QBitArray &bitArray, uint seed) Q_DECL_NOTHROW
return result;
}
-uint qHash(QLatin1String key, uint seed) Q_DECL_NOTHROW
+uint qHash(QLatin1String key, uint seed) noexcept
{
return hash(reinterpret_cast<const uchar *>(key.data()), size_t(key.size()), seed);
}
@@ -321,7 +321,7 @@ static QBasicAtomicInt qt_qhash_seed = Q_BASIC_ATOMIC_INITIALIZER(-1);
*/
static void qt_initialize_qhash_seed()
{
- if (qt_qhash_seed.load() == -1) {
+ if (qt_qhash_seed.loadRelaxed() == -1) {
int x(qt_create_qhash_seed() & INT_MAX);
qt_qhash_seed.testAndSetRelaxed(-1, x);
}
@@ -340,7 +340,7 @@ static void qt_initialize_qhash_seed()
int qGlobalQHashSeed()
{
qt_initialize_qhash_seed();
- return qt_qhash_seed.load();
+ return qt_qhash_seed.loadRelaxed();
}
/*! \relates QHash
@@ -372,14 +372,14 @@ void qSetGlobalQHashSeed(int newSeed)
return;
if (newSeed == -1) {
int x(qt_create_qhash_seed() & INT_MAX);
- qt_qhash_seed.store(x);
+ qt_qhash_seed.storeRelaxed(x);
} else {
if (newSeed) {
// can't use qWarning here (reentrancy)
fprintf(stderr, "qSetGlobalQHashSeed: forced seed value is not 0, cannot guarantee that the "
"hashing functions will produce a stable value.");
}
- qt_qhash_seed.store(newSeed & INT_MAX);
+ qt_qhash_seed.storeRelaxed(newSeed & INT_MAX);
}
}
@@ -398,7 +398,7 @@ void qSetGlobalQHashSeed(int newSeed)
This function can hash discontiguous memory by invoking it on each chunk,
passing the previous's result in the next call's \a chained argument.
*/
-uint qt_hash(QStringView key, uint chained) Q_DECL_NOTHROW
+uint qt_hash(QStringView key, uint chained) noexcept
{
auto n = key.size();
auto p = key.utf16();
@@ -471,7 +471,7 @@ static int countBits(int hint)
const int MinNumBits = 4;
const QHashData QHashData::shared_null = {
- 0, 0, Q_REFCOUNT_INITIALIZE_STATIC, 0, 0, MinNumBits, 0, 0, 0, true, false, 0
+ nullptr, nullptr, Q_REFCOUNT_INITIALIZE_STATIC, 0, 0, MinNumBits, 0, 0, 0, true, false, 0
};
void *QHashData::allocateNode(int nodeAlign)
@@ -501,15 +501,15 @@ QHashData *QHashData::detach_helper(void (*node_duplicate)(Node *, void *),
if (this == &shared_null)
qt_initialize_qhash_seed(); // may throw
d = new QHashData;
- d->fakeNext = 0;
- d->buckets = 0;
+ d->fakeNext = nullptr;
+ d->buckets = nullptr;
d->ref.initializeOwned();
d->size = size;
d->nodeSize = nodeSize;
d->userNumBits = userNumBits;
d->numBits = numBits;
d->numBuckets = numBuckets;
- d->seed = (this == &shared_null) ? uint(qt_qhash_seed.load()) : seed;
+ d->seed = (this == &shared_null) ? uint(qt_qhash_seed.loadRelaxed()) : seed;
d->sharable = true;
d->strictAlignment = nodeAlign > 8;
d->reserved = 0;
@@ -709,7 +709,7 @@ void QHashData::dump()
}
n = n->next;
}
- qDebug("%s", qPrintable(line));
+ qDebug("%ls", qUtf16Printable(line));
}
}
}
@@ -938,7 +938,7 @@ void QHashData::checkSanity()
Returns the hash value for the \a key, using \a seed to seed the calculation.
*/
-uint qHash(float key, uint seed) Q_DECL_NOTHROW
+uint qHash(float key, uint seed) noexcept
{
return key != 0.0f ? hash(reinterpret_cast<const uchar *>(&key), sizeof(key), seed) : seed ;
}
@@ -948,7 +948,7 @@ uint qHash(float key, uint seed) Q_DECL_NOTHROW
Returns the hash value for the \a key, using \a seed to seed the calculation.
*/
-uint qHash(double key, uint seed) Q_DECL_NOTHROW
+uint qHash(double key, uint seed) noexcept
{
return key != 0.0 ? hash(reinterpret_cast<const uchar *>(&key), sizeof(key), seed) : seed ;
}
@@ -959,7 +959,7 @@ uint qHash(double key, uint seed) Q_DECL_NOTHROW
Returns the hash value for the \a key, using \a seed to seed the calculation.
*/
-uint qHash(long double key, uint seed) Q_DECL_NOTHROW
+uint qHash(long double key, uint seed) noexcept
{
return key != 0.0L ? hash(reinterpret_cast<const uchar *>(&key), sizeof(key), seed) : seed ;
}
@@ -1251,6 +1251,17 @@ uint qHash(long double key, uint seed) Q_DECL_NOTHROW
compiled in C++11 mode.
*/
+/*! \fn template <class Key, class T> template <class InputIterator> QHash<Key, T>::QHash(InputIterator begin, InputIterator end)
+ \since 5.14
+
+ Constructs a hash with a copy of each of the elements in the iterator range
+ [\a begin, \a end). Either the elements iterated by the range must be
+ objects with \c{first} and \c{second} data members (like \c{QPair},
+ \c{std::pair}, etc.) convertible to \c Key and to \c T respectively; or the
+ iterators must have \c{key()} and \c{value()} member functions, returning a
+ key convertible to \c Key and a value convertible to \c T respectively.
+*/
+
/*! \fn template <class Key, class T> QHash<Key, T>::QHash(const QHash &other)
Constructs a copy of \a other.
@@ -2586,6 +2597,17 @@ uint qHash(long double key, uint seed) Q_DECL_NOTHROW
\sa operator=()
*/
+/*! \fn template <class Key, class T> template <class InputIterator> QMultiHash::QMultiHash(InputIterator begin, InputIterator end)
+ \since 5.14
+
+ Constructs a multi-hash with a copy of each of the elements in the iterator range
+ [\a begin, \a end). Either the elements iterated by the range must be
+ objects with \c{first} and \c{second} data members (like \c{QPair},
+ \c{std::pair}, etc.) convertible to \c Key and to \c T respectively; or the
+ iterators must have \c{key()} and \c{value()} member functions, returning a
+ key convertible to \c Key and a value convertible to \c T respectively.
+*/
+
/*! \fn template <class Key, class T> QMultiHash<Key, T>::iterator QMultiHash<Key, T>::replace(const Key &key, const T &value)
Inserts a new item with the \a key and a value of \a value.
diff --git a/src/corelib/tools/qhash.h b/src/corelib/tools/qhash.h
index a586ca5671..236e433101 100644
--- a/src/corelib/tools/qhash.h
+++ b/src/corelib/tools/qhash.h
@@ -46,12 +46,10 @@
#include <QtCore/qlist.h>
#include <QtCore/qrefcount.h>
#include <QtCore/qhashfunctions.h>
-
-#ifdef Q_COMPILER_INITIALIZER_LISTS
-#include <initializer_list>
-#endif
+#include <QtCore/qcontainertools_impl.h>
#include <algorithm>
+#include <initializer_list>
#if defined(Q_CC_MSVC)
#pragma warning( push )
@@ -138,7 +136,7 @@ struct QHashDummyValue
{
};
-inline bool operator==(const QHashDummyValue & /* v1 */, const QHashDummyValue & /* v2 */)
+constexpr bool operator==(const QHashDummyValue &, const QHashDummyValue &) noexcept
{
return true;
}
@@ -240,8 +238,7 @@ class QHash
static inline int alignOfNode() { return qMax<int>(sizeof(void*), Q_ALIGNOF(Node)); }
public:
- inline QHash() Q_DECL_NOTHROW : d(const_cast<QHashData *>(&QHashData::shared_null)) { }
-#ifdef Q_COMPILER_INITIALIZER_LISTS
+ inline QHash() noexcept : d(const_cast<QHashData *>(&QHashData::shared_null)) { }
inline QHash(std::initializer_list<std::pair<Key,T> > list)
: d(const_cast<QHashData *>(&QHashData::shared_null))
{
@@ -249,17 +246,36 @@ public:
for (typename std::initializer_list<std::pair<Key,T> >::const_iterator it = list.begin(); it != list.end(); ++it)
insert(it->first, it->second);
}
-#endif
QHash(const QHash &other) : d(other.d) { d->ref.ref(); if (!d->sharable) detach(); }
~QHash() { if (!d->ref.deref()) freeData(d); }
QHash &operator=(const QHash &other);
-#ifdef Q_COMPILER_RVALUE_REFS
- QHash(QHash &&other) Q_DECL_NOTHROW : d(other.d) { other.d = const_cast<QHashData *>(&QHashData::shared_null); }
- QHash &operator=(QHash &&other) Q_DECL_NOTHROW
+ QHash(QHash &&other) noexcept : d(other.d) { other.d = const_cast<QHashData *>(&QHashData::shared_null); }
+ QHash &operator=(QHash &&other) noexcept
{ QHash moved(std::move(other)); swap(moved); return *this; }
+#ifdef Q_QDOC
+ template <typename InputIterator>
+ QHash(InputIterator f, InputIterator l);
+#else
+ template <typename InputIterator, QtPrivate::IfAssociativeIteratorHasKeyAndValue<InputIterator> = true>
+ QHash(InputIterator f, InputIterator l)
+ : QHash()
+ {
+ QtPrivate::reserveIfForwardIterator(this, f, l);
+ for (; f != l; ++f)
+ insert(f.key(), f.value());
+ }
+
+ template <typename InputIterator, QtPrivate::IfAssociativeIteratorHasFirstAndSecond<InputIterator> = true>
+ QHash(InputIterator f, InputIterator l)
+ : QHash()
+ {
+ QtPrivate::reserveIfForwardIterator(this, f, l);
+ for (; f != l; ++f)
+ insert(f->first, f->second);
+ }
#endif
- void swap(QHash &other) Q_DECL_NOTHROW { qSwap(d, other.d); }
+ void swap(QHash &other) noexcept { qSwap(d, other.d); }
bool operator==(const QHash &other) const;
bool operator!=(const QHash &other) const { return !(*this == other); }
@@ -473,7 +489,7 @@ public:
inline const_key_value_iterator constKeyValueEnd() const { return const_key_value_iterator(end()); }
QPair<iterator, iterator> equal_range(const Key &key);
- QPair<const_iterator, const_iterator> equal_range(const Key &key) const Q_DECL_NOTHROW;
+ QPair<const_iterator, const_iterator> equal_range(const Key &key) const noexcept;
iterator erase(iterator it) { return erase(const_iterator(it.i)); }
iterator erase(const_iterator it);
@@ -512,11 +528,11 @@ private:
static void duplicateNode(QHashData::Node *originalNode, void *newNode);
- bool isValidIterator(const iterator &it) const Q_DECL_NOTHROW
+ bool isValidIterator(const iterator &it) const noexcept
{ return isValidNode(it.i); }
- bool isValidIterator(const const_iterator &it) const Q_DECL_NOTHROW
+ bool isValidIterator(const const_iterator &it) const noexcept
{ return isValidNode(it.i); }
- bool isValidNode(QHashData::Node *node) const Q_DECL_NOTHROW
+ bool isValidNode(QHashData::Node *node) const noexcept
{
#if defined(QT_DEBUG) && !defined(Q_HASH_NO_ITERATOR_DEBUG)
while (node->next)
@@ -941,44 +957,32 @@ Q_OUTOFLINE_TEMPLATE typename QHash<Key, T>::Node **QHash<Key, T>::findNode(cons
template <class Key, class T>
Q_OUTOFLINE_TEMPLATE bool QHash<Key, T>::operator==(const QHash &other) const
{
- if (size() != other.size())
- return false;
if (d == other.d)
return true;
+ if (size() != other.size())
+ return false;
const_iterator it = begin();
while (it != end()) {
// Build two equal ranges for i.key(); one for *this and one for other.
// For *this we can avoid a lookup via equal_range, as we know the beginning of the range.
- auto thisEqualRangeEnd = it;
- while (thisEqualRangeEnd != end() && it.key() == thisEqualRangeEnd.key())
- ++thisEqualRangeEnd;
+ auto thisEqualRangeStart = it;
+ const Key &thisEqualRangeKey = it.key();
+ size_type n = 0;
+ do {
+ ++it;
+ ++n;
+ } while (it != end() && it.key() == thisEqualRangeKey);
- const auto otherEqualRange = other.equal_range(it.key());
+ const auto otherEqualRange = other.equal_range(thisEqualRangeKey);
- if (std::distance(it, thisEqualRangeEnd) != std::distance(otherEqualRange.first, otherEqualRange.second))
+ if (n != std::distance(otherEqualRange.first, otherEqualRange.second))
return false;
// Keys in the ranges are equal by construction; this checks only the values.
- //
- // When using the 3-arg std::is_permutation, MSVC will emit warning C4996,
- // passing an unchecked iterator to a Standard Library algorithm. We don't
- // want to suppress the warning, and we can't use stdext::make_checked_array_iterator
- // because QHash::(const_)iterator does not work with size_t and thus will
- // emit more warnings. Use the 4-arg std::is_permutation instead (which
- // is supported since MSVC 2015).
- //
- // ### Qt 6: if C++14 library support is a mandated minimum, remove the ifdef for MSVC.
- if (!std::is_permutation(it, thisEqualRangeEnd, otherEqualRange.first
-#ifdef Q_CC_MSVC
- , otherEqualRange.second
-#endif
- )) {
+ if (!qt_is_permutation(thisEqualRangeStart, it, otherEqualRange.first, otherEqualRange.second))
return false;
- }
-
- it = thisEqualRangeEnd;
}
return true;
@@ -993,7 +997,7 @@ QPair<typename QHash<Key, T>::iterator, typename QHash<Key, T>::iterator> QHash<
}
template <class Key, class T>
-QPair<typename QHash<Key, T>::const_iterator, typename QHash<Key, T>::const_iterator> QHash<Key, T>::equal_range(const Key &akey) const Q_DECL_NOTHROW
+QPair<typename QHash<Key, T>::const_iterator, typename QHash<Key, T>::const_iterator> QHash<Key, T>::equal_range(const Key &akey) const noexcept
{
Node *node = *findNode(akey);
const_iterator firstIt = const_iterator(node);
@@ -1020,23 +1024,39 @@ template <class Key, class T>
class QMultiHash : public QHash<Key, T>
{
public:
- QMultiHash() Q_DECL_NOTHROW {}
-#ifdef Q_COMPILER_INITIALIZER_LISTS
+ QMultiHash() noexcept {}
inline QMultiHash(std::initializer_list<std::pair<Key,T> > list)
{
this->reserve(int(list.size()));
for (typename std::initializer_list<std::pair<Key,T> >::const_iterator it = list.begin(); it != list.end(); ++it)
insert(it->first, it->second);
}
+#ifdef Q_QDOC
+ template <typename InputIterator>
+ QMultiHash(InputIterator f, InputIterator l);
+#else
+ template <typename InputIterator, QtPrivate::IfAssociativeIteratorHasKeyAndValue<InputIterator> = true>
+ QMultiHash(InputIterator f, InputIterator l)
+ {
+ QtPrivate::reserveIfForwardIterator(this, f, l);
+ for (; f != l; ++f)
+ insert(f.key(), f.value());
+ }
+
+ template <typename InputIterator, QtPrivate::IfAssociativeIteratorHasFirstAndSecond<InputIterator> = true>
+ QMultiHash(InputIterator f, InputIterator l)
+ {
+ QtPrivate::reserveIfForwardIterator(this, f, l);
+ for (; f != l; ++f)
+ insert(f->first, f->second);
+ }
#endif
// compiler-generated copy/move ctors/assignment operators are fine!
// compiler-generated destructor is fine!
QMultiHash(const QHash<Key, T> &other) : QHash<Key, T>(other) {}
-#ifdef Q_COMPILER_RVALUE_REFS
- QMultiHash(QHash<Key, T> &&other) Q_DECL_NOTHROW : QHash<Key, T>(std::move(other)) {}
-#endif
- void swap(QMultiHash &other) Q_DECL_NOTHROW { QHash<Key, T>::swap(other); } // prevent QMultiHash<->QHash swaps
+ QMultiHash(QHash<Key, T> &&other) noexcept : QHash<Key, T>(std::move(other)) {}
+ void swap(QMultiHash &other) noexcept { QHash<Key, T>::swap(other); } // prevent QMultiHash<->QHash swaps
inline typename QHash<Key, T>::iterator replace(const Key &key, const T &value)
{ return QHash<Key, T>::insert(key, value); }
@@ -1130,7 +1150,7 @@ Q_DECLARE_MUTABLE_ASSOCIATIVE_ITERATOR(Hash)
template <class Key, class T>
uint qHash(const QHash<Key, T> &key, uint seed = 0)
- Q_DECL_NOEXCEPT_EXPR(noexcept(qHash(std::declval<Key&>())) && noexcept(qHash(std::declval<T&>())))
+ noexcept(noexcept(qHash(std::declval<Key&>())) && noexcept(qHash(std::declval<T&>())))
{
QtPrivate::QHashCombineCommutative hash;
for (auto it = key.begin(), end = key.end(); it != end; ++it) {
@@ -1143,7 +1163,7 @@ uint qHash(const QHash<Key, T> &key, uint seed = 0)
template <class Key, class T>
inline uint qHash(const QMultiHash<Key, T> &key, uint seed = 0)
- Q_DECL_NOEXCEPT_EXPR(noexcept(qHash(std::declval<Key&>())) && noexcept(qHash(std::declval<T&>())))
+ noexcept(noexcept(qHash(std::declval<Key&>())) && noexcept(qHash(std::declval<T&>())))
{
const QHash<Key, T> &key2 = key;
return qHash(key2, seed);
diff --git a/src/corelib/tools/qhashfunctions.h b/src/corelib/tools/qhashfunctions.h
index d013c26d66..2ff3464912 100644
--- a/src/corelib/tools/qhashfunctions.h
+++ b/src/corelib/tools/qhashfunctions.h
@@ -45,6 +45,7 @@
#include <QtCore/qpair.h>
#include <numeric> // for std::accumulate
+#include <functional> // for std::hash
#if 0
#pragma qt_class(QHashFunctions)
@@ -67,54 +68,54 @@ class QLatin1String;
Q_CORE_EXPORT int qGlobalQHashSeed();
Q_CORE_EXPORT void qSetGlobalQHashSeed(int newSeed);
-Q_CORE_EXPORT Q_DECL_PURE_FUNCTION uint qHashBits(const void *p, size_t size, uint seed = 0) Q_DECL_NOTHROW;
+Q_CORE_EXPORT Q_DECL_PURE_FUNCTION uint qHashBits(const void *p, size_t size, uint seed = 0) noexcept;
-Q_DECL_CONST_FUNCTION Q_DECL_CONSTEXPR inline uint qHash(char key, uint seed = 0) Q_DECL_NOTHROW { return uint(key) ^ seed; }
-Q_DECL_CONST_FUNCTION Q_DECL_CONSTEXPR inline uint qHash(uchar key, uint seed = 0) Q_DECL_NOTHROW { return uint(key) ^ seed; }
-Q_DECL_CONST_FUNCTION Q_DECL_CONSTEXPR inline uint qHash(signed char key, uint seed = 0) Q_DECL_NOTHROW { return uint(key) ^ seed; }
-Q_DECL_CONST_FUNCTION Q_DECL_CONSTEXPR inline uint qHash(ushort key, uint seed = 0) Q_DECL_NOTHROW { return uint(key) ^ seed; }
-Q_DECL_CONST_FUNCTION Q_DECL_CONSTEXPR inline uint qHash(short key, uint seed = 0) Q_DECL_NOTHROW { return uint(key) ^ seed; }
-Q_DECL_CONST_FUNCTION Q_DECL_CONSTEXPR inline uint qHash(uint key, uint seed = 0) Q_DECL_NOTHROW { return key ^ seed; }
-Q_DECL_CONST_FUNCTION Q_DECL_CONSTEXPR inline uint qHash(int key, uint seed = 0) Q_DECL_NOTHROW { return uint(key) ^ seed; }
-Q_DECL_CONST_FUNCTION Q_DECL_CONSTEXPR inline uint qHash(ulong key, uint seed = 0) Q_DECL_NOTHROW
+Q_DECL_CONST_FUNCTION Q_DECL_CONSTEXPR inline uint qHash(char key, uint seed = 0) noexcept { return uint(key) ^ seed; }
+Q_DECL_CONST_FUNCTION Q_DECL_CONSTEXPR inline uint qHash(uchar key, uint seed = 0) noexcept { return uint(key) ^ seed; }
+Q_DECL_CONST_FUNCTION Q_DECL_CONSTEXPR inline uint qHash(signed char key, uint seed = 0) noexcept { return uint(key) ^ seed; }
+Q_DECL_CONST_FUNCTION Q_DECL_CONSTEXPR inline uint qHash(ushort key, uint seed = 0) noexcept { return uint(key) ^ seed; }
+Q_DECL_CONST_FUNCTION Q_DECL_CONSTEXPR inline uint qHash(short key, uint seed = 0) noexcept { return uint(key) ^ seed; }
+Q_DECL_CONST_FUNCTION Q_DECL_CONSTEXPR inline uint qHash(uint key, uint seed = 0) noexcept { return key ^ seed; }
+Q_DECL_CONST_FUNCTION Q_DECL_CONSTEXPR inline uint qHash(int key, uint seed = 0) noexcept { return uint(key) ^ seed; }
+Q_DECL_CONST_FUNCTION Q_DECL_CONSTEXPR inline uint qHash(ulong key, uint seed = 0) noexcept
{
return (sizeof(ulong) > sizeof(uint))
? (uint(((key >> (8 * sizeof(uint) - 1)) ^ key) & (~0U)) ^ seed)
: (uint(key & (~0U)) ^ seed);
}
-Q_DECL_CONST_FUNCTION Q_DECL_CONSTEXPR inline uint qHash(long key, uint seed = 0) Q_DECL_NOTHROW { return qHash(ulong(key), seed); }
-Q_DECL_CONST_FUNCTION Q_DECL_CONSTEXPR inline uint qHash(quint64 key, uint seed = 0) Q_DECL_NOTHROW
+Q_DECL_CONST_FUNCTION Q_DECL_CONSTEXPR inline uint qHash(long key, uint seed = 0) noexcept { return qHash(ulong(key), seed); }
+Q_DECL_CONST_FUNCTION Q_DECL_CONSTEXPR inline uint qHash(quint64 key, uint seed = 0) noexcept
{
return uint(((key >> (8 * sizeof(uint) - 1)) ^ key) & (~0U)) ^ seed;
}
-Q_DECL_CONST_FUNCTION Q_DECL_CONSTEXPR inline uint qHash(qint64 key, uint seed = 0) Q_DECL_NOTHROW { return qHash(quint64(key), seed); }
-Q_CORE_EXPORT Q_DECL_CONST_FUNCTION uint qHash(float key, uint seed = 0) Q_DECL_NOTHROW;
-Q_CORE_EXPORT Q_DECL_CONST_FUNCTION uint qHash(double key, uint seed = 0) Q_DECL_NOTHROW;
+Q_DECL_CONST_FUNCTION Q_DECL_CONSTEXPR inline uint qHash(qint64 key, uint seed = 0) noexcept { return qHash(quint64(key), seed); }
+Q_CORE_EXPORT Q_DECL_CONST_FUNCTION uint qHash(float key, uint seed = 0) noexcept;
+Q_CORE_EXPORT Q_DECL_CONST_FUNCTION uint qHash(double key, uint seed = 0) noexcept;
#if !defined(Q_OS_DARWIN) || defined(Q_CLANG_QDOC)
-Q_CORE_EXPORT Q_DECL_CONST_FUNCTION uint qHash(long double key, uint seed = 0) Q_DECL_NOTHROW;
+Q_CORE_EXPORT Q_DECL_CONST_FUNCTION uint qHash(long double key, uint seed = 0) noexcept;
#endif
-Q_DECL_CONST_FUNCTION Q_DECL_CONSTEXPR inline uint qHash(const QChar key, uint seed = 0) Q_DECL_NOTHROW { return qHash(key.unicode(), seed); }
-Q_CORE_EXPORT Q_DECL_PURE_FUNCTION uint qHash(const QByteArray &key, uint seed = 0) Q_DECL_NOTHROW;
+Q_DECL_CONST_FUNCTION Q_DECL_CONSTEXPR inline uint qHash(const QChar key, uint seed = 0) noexcept { return qHash(key.unicode(), seed); }
+Q_CORE_EXPORT Q_DECL_PURE_FUNCTION uint qHash(const QByteArray &key, uint seed = 0) noexcept;
#if QT_STRINGVIEW_LEVEL < 2
-Q_CORE_EXPORT Q_DECL_PURE_FUNCTION uint qHash(const QString &key, uint seed = 0) Q_DECL_NOTHROW;
-Q_CORE_EXPORT Q_DECL_PURE_FUNCTION uint qHash(const QStringRef &key, uint seed = 0) Q_DECL_NOTHROW;
+Q_CORE_EXPORT Q_DECL_PURE_FUNCTION uint qHash(const QString &key, uint seed = 0) noexcept;
+Q_CORE_EXPORT Q_DECL_PURE_FUNCTION uint qHash(const QStringRef &key, uint seed = 0) noexcept;
#endif
-Q_CORE_EXPORT Q_DECL_PURE_FUNCTION uint qHash(QStringView key, uint seed = 0) Q_DECL_NOTHROW;
-Q_CORE_EXPORT Q_DECL_PURE_FUNCTION uint qHash(const QBitArray &key, uint seed = 0) Q_DECL_NOTHROW;
-Q_CORE_EXPORT Q_DECL_PURE_FUNCTION uint qHash(QLatin1String key, uint seed = 0) Q_DECL_NOTHROW;
-Q_CORE_EXPORT Q_DECL_PURE_FUNCTION uint qt_hash(QStringView key, uint chained = 0) Q_DECL_NOTHROW;
+Q_CORE_EXPORT Q_DECL_PURE_FUNCTION uint qHash(QStringView key, uint seed = 0) noexcept;
+Q_CORE_EXPORT Q_DECL_PURE_FUNCTION uint qHash(const QBitArray &key, uint seed = 0) noexcept;
+Q_CORE_EXPORT Q_DECL_PURE_FUNCTION uint qHash(QLatin1String key, uint seed = 0) noexcept;
+Q_CORE_EXPORT Q_DECL_PURE_FUNCTION uint qt_hash(QStringView key, uint chained = 0) noexcept;
-Q_DECL_CONST_FUNCTION inline uint qHash(std::nullptr_t, uint seed = 0) Q_DECL_NOTHROW
+Q_DECL_CONST_FUNCTION inline uint qHash(std::nullptr_t, uint seed = 0) noexcept
{
return qHash(reinterpret_cast<quintptr>(nullptr), seed);
}
-template <class T> inline uint qHash(const T *key, uint seed = 0) Q_DECL_NOTHROW
+template <class T> inline uint qHash(const T *key, uint seed = 0) noexcept
{
return qHash(reinterpret_cast<quintptr>(key), seed);
}
template<typename T> inline uint qHash(const T &t, uint seed)
- Q_DECL_NOEXCEPT_EXPR(noexcept(qHash(t)))
+ noexcept(noexcept(qHash(t)))
{ return qHash(t) ^ seed; }
namespace QtPrivate {
@@ -122,7 +123,7 @@ namespace QtPrivate {
struct QHashCombine {
typedef uint result_type;
template <typename T>
- Q_DECL_CONSTEXPR result_type operator()(uint seed, const T &t) const Q_DECL_NOEXCEPT_EXPR(noexcept(qHash(t)))
+ Q_DECL_CONSTEXPR result_type operator()(uint seed, const T &t) const noexcept(noexcept(qHash(t)))
// combiner taken from N3876 / boost::hash_combine
{ return seed ^ (qHash(t) + 0x9e3779b9 + (seed << 6) + (seed >> 2)) ; }
};
@@ -135,7 +136,7 @@ struct QHashCombineCommutative {
// QHash). Therefore, provide a commutative combiner, too.
typedef uint result_type;
template <typename T>
- Q_DECL_CONSTEXPR result_type operator()(uint seed, const T &t) const Q_DECL_NOEXCEPT_EXPR(noexcept(qHash(t)))
+ Q_DECL_CONSTEXPR result_type operator()(uint seed, const T &t) const noexcept(noexcept(qHash(t)))
{ return seed + qHash(t); } // don't use xor!
};
@@ -143,20 +144,20 @@ struct QHashCombineCommutative {
template <typename InputIterator>
inline uint qHashRange(InputIterator first, InputIterator last, uint seed = 0)
- Q_DECL_NOEXCEPT_EXPR(noexcept(qHash(*first))) // assume iterator operations don't throw
+ noexcept(noexcept(qHash(*first))) // assume iterator operations don't throw
{
return std::accumulate(first, last, seed, QtPrivate::QHashCombine());
}
template <typename InputIterator>
inline uint qHashRangeCommutative(InputIterator first, InputIterator last, uint seed = 0)
- Q_DECL_NOEXCEPT_EXPR(noexcept(qHash(*first))) // assume iterator operations don't throw
+ noexcept(noexcept(qHash(*first))) // assume iterator operations don't throw
{
return std::accumulate(first, last, seed, QtPrivate::QHashCombineCommutative());
}
template <typename T1, typename T2> inline uint qHash(const QPair<T1, T2> &key, uint seed = 0)
- Q_DECL_NOEXCEPT_EXPR(noexcept(qHash(key.first, seed)) && noexcept(qHash(key.second, seed)))
+ noexcept(noexcept(qHash(key.first, seed)) && noexcept(qHash(key.second, seed)))
{
uint h1 = qHash(key.first, seed);
uint h2 = qHash(key.second, seed);
@@ -164,7 +165,7 @@ template <typename T1, typename T2> inline uint qHash(const QPair<T1, T2> &key,
}
template <typename T1, typename T2> inline uint qHash(const std::pair<T1, T2> &key, uint seed = 0)
- Q_DECL_NOEXCEPT_EXPR(noexcept(qHash(key.first, seed)) && noexcept(qHash(key.second, seed)))
+ noexcept(noexcept(qHash(key.first, seed)) && noexcept(qHash(key.second, seed)))
{
QtPrivate::QHashCombine hash;
seed = hash(seed, key.first);
@@ -172,6 +173,41 @@ template <typename T1, typename T2> inline uint qHash(const std::pair<T1, T2> &k
return seed;
}
+#define QT_SPECIALIZE_STD_HASH_TO_CALL_QHASH(Class, Arguments) \
+ QT_BEGIN_INCLUDE_NAMESPACE \
+ namespace std { \
+ template <> \
+ struct hash< QT_PREPEND_NAMESPACE(Class) > { \
+ using argument_type = QT_PREPEND_NAMESPACE(Class); \
+ using result_type = size_t; \
+ size_t operator()(Arguments s) const \
+ noexcept(noexcept(QT_PREPEND_NAMESPACE(qHash)(s))) \
+ { \
+ /* this seeds qHash with the result of */ \
+ /* std::hash applied to an int, to reap */ \
+ /* any protection against predictable hash */ \
+ /* values the std implementation may provide */ \
+ return QT_PREPEND_NAMESPACE(qHash)(s, \
+ QT_PREPEND_NAMESPACE(qHash)( \
+ std::hash<int>{}(0))); \
+ } \
+ }; \
+ } \
+ QT_END_INCLUDE_NAMESPACE \
+ /*end*/
+
+#define QT_SPECIALIZE_STD_HASH_TO_CALL_QHASH_BY_CREF(Class) \
+ QT_SPECIALIZE_STD_HASH_TO_CALL_QHASH(Class, const argument_type &)
+#define QT_SPECIALIZE_STD_HASH_TO_CALL_QHASH_BY_VALUE(Class) \
+ QT_SPECIALIZE_STD_HASH_TO_CALL_QHASH(Class, argument_type)
+
+QT_SPECIALIZE_STD_HASH_TO_CALL_QHASH_BY_CREF(QString)
+QT_SPECIALIZE_STD_HASH_TO_CALL_QHASH_BY_CREF(QStringRef)
+QT_SPECIALIZE_STD_HASH_TO_CALL_QHASH_BY_VALUE(QStringView)
+QT_SPECIALIZE_STD_HASH_TO_CALL_QHASH_BY_VALUE(QLatin1String)
+QT_SPECIALIZE_STD_HASH_TO_CALL_QHASH_BY_CREF(QByteArray)
+QT_SPECIALIZE_STD_HASH_TO_CALL_QHASH_BY_CREF(QBitArray)
+
QT_END_NAMESPACE
#if defined(Q_CC_MSVC)
diff --git a/src/corelib/tools/qiterator.h b/src/corelib/tools/qiterator.h
index 177a4f1a4c..84a0e116ca 100644
--- a/src/corelib/tools/qiterator.h
+++ b/src/corelib/tools/qiterator.h
@@ -44,6 +44,8 @@
QT_BEGIN_NAMESPACE
+#if !defined(QT_NO_JAVA_STYLE_ITERATORS)
+
#define Q_DECLARE_SEQUENTIAL_ITERATOR(C) \
\
template <class T> \
@@ -179,6 +181,13 @@ public: \
n = c->end(); return false; } \
};
+#else // QT_NO_JAVA_STYLE_ITERATORS
+#define Q_DECLARE_SEQUENTIAL_ITERATOR(C)
+#define Q_DECLARE_MUTABLE_SEQUENTIAL_ITERATOR(C)
+#define Q_DECLARE_ASSOCIATIVE_ITERATOR(C)
+#define Q_DECLARE_MUTABLE_ASSOCIATIVE_ITERATOR(C)
+#endif // QT_NO_JAVA_STYLE_ITERATORS
+
template<typename Key, typename T, class Iterator>
class QKeyValueIterator
{
@@ -190,15 +199,15 @@ public:
typedef const value_type &reference;
QKeyValueIterator() = default;
- Q_DECL_CONSTEXPR explicit QKeyValueIterator(Iterator o) Q_DECL_NOEXCEPT_EXPR(std::is_nothrow_move_constructible<Iterator>::value)
+ Q_DECL_CONSTEXPR explicit QKeyValueIterator(Iterator o) noexcept(std::is_nothrow_move_constructible<Iterator>::value)
: i(std::move(o)) {}
std::pair<Key, T> operator*() const {
return std::pair<Key, T>(i.key(), i.value());
}
- friend bool operator==(QKeyValueIterator lhs, QKeyValueIterator rhs) Q_DECL_NOEXCEPT { return lhs.i == rhs.i; }
- friend bool operator!=(QKeyValueIterator lhs, QKeyValueIterator rhs) Q_DECL_NOEXCEPT { return lhs.i != rhs.i; }
+ friend bool operator==(QKeyValueIterator lhs, QKeyValueIterator rhs) noexcept { return lhs.i == rhs.i; }
+ friend bool operator!=(QKeyValueIterator lhs, QKeyValueIterator rhs) noexcept { return lhs.i != rhs.i; }
inline QKeyValueIterator &operator++() { ++i; return *this; }
inline QKeyValueIterator operator++(int) { return QKeyValueIterator(i++);}
diff --git a/src/corelib/tools/qline.cpp b/src/corelib/tools/qline.cpp
index 949f63ea15..3afd23d76b 100644
--- a/src/corelib/tools/qline.cpp
+++ b/src/corelib/tools/qline.cpp
@@ -347,7 +347,7 @@ QDataStream &operator>>(QDataStream &stream, QLine &line)
function to determine whether the QLineF represents a valid line
or a null line.
- The intersect() function determines the IntersectType for this
+ The intersects() function determines the IntersectionType for this
line and a given line, while the angleTo() function returns the
angle between the lines. In addition, the unitVector() function
returns a line that has the same starting point as this line, but
@@ -370,6 +370,11 @@ QDataStream &operator>>(QDataStream &stream, QLine &line)
/*!
\enum QLineF::IntersectType
+ \obsolete Use QLineF::IntersectionType instead
+*/
+
+/*!
+ \enum QLineF::IntersectionType
Describes the intersection between two lines.
@@ -657,8 +662,10 @@ QLineF QLineF::unitVector() const
return f;
}
+#if QT_DEPRECATED_SINCE(5, 14)
/*!
\fn QLineF::IntersectType QLineF::intersect(const QLineF &line, QPointF *intersectionPoint) const
+ \obsolete Use intersects() instead
Returns a value indicating whether or not \e this line intersects
with the given \a line.
@@ -670,6 +677,23 @@ QLineF QLineF::unitVector() const
QLineF::IntersectType QLineF::intersect(const QLineF &l, QPointF *intersectionPoint) const
{
+ return intersects(l, intersectionPoint);
+}
+#endif
+
+/*!
+ \fn QLineF::IntersectionType QLineF::intersects(const QLineF &line, QPointF *intersectionPoint) const
+ \since 5.14
+
+ Returns a value indicating whether or not \e this line intersects
+ with the given \a line.
+
+ The actual intersection point is extracted to \a intersectionPoint
+ (if the pointer is valid). If the lines are parallel, the
+ intersection point is undefined.
+*/
+QLineF::IntersectionType QLineF::intersects(const QLineF &l, QPointF *intersectionPoint) const
+{
// ipmlementation is based on Graphics Gems III's "Faster Line Segment Intersection"
const QPointF a = pt2 - pt1;
const QPointF b = l.pt1 - l.pt2;
@@ -805,6 +829,7 @@ qreal QLineF::angleTo(const QLineF &l) const
return delta_normalized;
}
+#if QT_DEPRECATED_SINCE(5, 14)
/*!
\fn qreal QLineF::angle(const QLineF &line) const
@@ -837,6 +862,7 @@ qreal QLineF::angle(const QLineF &l) const
if (cos_line >= -1.0 && cos_line <= 1.0) rad = qAcos( cos_line );
return rad * 360 / M_2PI;
}
+#endif
#ifndef QT_NO_DEBUG_STREAM
diff --git a/src/corelib/tools/qline.h b/src/corelib/tools/qline.h
index 6361c1af9f..c96d624afd 100644
--- a/src/corelib/tools/qline.h
+++ b/src/corelib/tools/qline.h
@@ -215,6 +215,7 @@ class Q_CORE_EXPORT QLineF {
public:
enum IntersectType { NoIntersection, BoundedIntersection, UnboundedIntersection };
+ using IntersectionType = IntersectType;
Q_DECL_CONSTEXPR inline QLineF();
Q_DECL_CONSTEXPR inline QLineF(const QPointF &pt1, const QPointF &pt2);
@@ -248,10 +249,14 @@ public:
Q_REQUIRED_RESULT QLineF unitVector() const;
Q_REQUIRED_RESULT Q_DECL_CONSTEXPR inline QLineF normalVector() const;
- // ### Qt 6: rename intersects() or intersection() and rename IntersectType IntersectionType
- IntersectType intersect(const QLineF &l, QPointF *intersectionPoint) const;
+ IntersectionType intersects(const QLineF &l, QPointF *intersectionPoint) const;
+#if QT_DEPRECATED_SINCE(5, 14)
+ QT_DEPRECATED_VERSION_X(5, 14, "Use intersects() instead")
+ IntersectType intersect(const QLineF &l, QPointF *intersectionPoint) const;
+ QT_DEPRECATED_X("Use angleTo() instead, take care that the return value is between 0 and 360 degree.")
qreal angle(const QLineF &l) const;
+#endif
Q_DECL_CONSTEXPR inline QPointF pointAt(qreal t) const;
inline void translate(const QPointF &p);
diff --git a/src/corelib/tools/qlinkedlist.cpp b/src/corelib/tools/qlinkedlist.cpp
index d9d93862e5..3b1bc8aab1 100644
--- a/src/corelib/tools/qlinkedlist.cpp
+++ b/src/corelib/tools/qlinkedlist.cpp
@@ -37,6 +37,10 @@
**
****************************************************************************/
+#ifdef QT_NO_LINKED_LIST
+# undef QT_NO_LINKED_LIST
+#endif
+
#include "qlinkedlist.h"
QT_BEGIN_NAMESPACE
@@ -153,6 +157,14 @@ const QLinkedListData QLinkedListData::shared_null = {
initializer lists.
*/
+/*! \fn template <class T> template<typename InputIterator> QLinkedList<T>::QLinkedList(InputIterator first, InputIterator last)
+ \since 5.14
+
+ Constructs a list with the contents in the iterator range [\a first, \a last).
+
+ The value type of \c InputIterator must be convertible to \c T.
+*/
+
/*! \fn template <class T> QLinkedList<T>::~QLinkedList()
Destroys the list. References to the values in the list, and all
@@ -734,8 +746,7 @@ const QLinkedListData QLinkedListData::shared_null = {
\snippet code/src_corelib_tools_qlinkedlist.cpp 7
STL-style iterators can be used as arguments to \l{generic
- algorithms}. For example, here's how to find an item in the list
- using the qFind() algorithm:
+ algorithms}. For example, here's how to find an item in the list:
\snippet code/src_corelib_tools_qlinkedlist.cpp 8
@@ -979,8 +990,7 @@ const QLinkedListData QLinkedListData::shared_null = {
\snippet code/src_corelib_tools_qlinkedlist.cpp 14
STL-style iterators can be used as arguments to \l{generic
- algorithms}. For example, here's how to find an item in the list
- using the qFind() algorithm:
+ algorithms}. For example, here's how to find an item in the list:
\snippet code/src_corelib_tools_qlinkedlist.cpp 15
diff --git a/src/corelib/tools/qlinkedlist.h b/src/corelib/tools/qlinkedlist.h
index 1e6d4df474..8970d39be0 100644
--- a/src/corelib/tools/qlinkedlist.h
+++ b/src/corelib/tools/qlinkedlist.h
@@ -40,18 +40,21 @@
#ifndef QLINKEDLIST_H
#define QLINKEDLIST_H
+#include <QtCore/qglobal.h>
+
+#ifndef QT_NO_LINKED_LIST
+
#include <QtCore/qiterator.h>
#include <QtCore/qrefcount.h>
+#include <QtCore/qcontainertools_impl.h>
+#include <QtCore/qdatastream.h>
+#include <QtCore/qtypeinfo.h>
+#include <algorithm>
+#include <initializer_list>
#include <iterator>
#include <list>
-#include <algorithm>
-
-#if defined(Q_COMPILER_INITIALIZER_LISTS)
-# include <initializer_list>
-#endif
-
QT_BEGIN_NAMESPACE
@@ -80,24 +83,23 @@ class QLinkedList
union { QLinkedListData *d; QLinkedListNode<T> *e; };
public:
- inline QLinkedList() Q_DECL_NOTHROW : d(const_cast<QLinkedListData *>(&QLinkedListData::shared_null)) { }
+ inline QLinkedList() noexcept : d(const_cast<QLinkedListData *>(&QLinkedListData::shared_null)) { }
inline QLinkedList(const QLinkedList<T> &l) : d(l.d) { d->ref.ref(); if (!d->sharable) detach(); }
-#if defined(Q_COMPILER_INITIALIZER_LISTS)
inline QLinkedList(std::initializer_list<T> list)
- : d(const_cast<QLinkedListData *>(&QLinkedListData::shared_null))
+ : QLinkedList(list.begin(), list.end()) {}
+ template <typename InputIterator, QtPrivate::IfIsInputIterator<InputIterator> = true>
+ inline QLinkedList(InputIterator first, InputIterator last)
+ : QLinkedList()
{
- std::copy(list.begin(), list.end(), std::back_inserter(*this));
+ std::copy(first, last, std::back_inserter(*this));
}
-#endif
~QLinkedList();
QLinkedList<T> &operator=(const QLinkedList<T> &);
-#ifdef Q_COMPILER_RVALUE_REFS
- QLinkedList(QLinkedList<T> &&other) Q_DECL_NOTHROW
+ QLinkedList(QLinkedList<T> &&other) noexcept
: d(other.d) { other.d = const_cast<QLinkedListData *>(&QLinkedListData::shared_null); }
- QLinkedList<T> &operator=(QLinkedList<T> &&other) Q_DECL_NOTHROW
+ QLinkedList<T> &operator=(QLinkedList<T> &&other) noexcept
{ QLinkedList moved(std::move(other)); swap(moved); return *this; }
-#endif
- inline void swap(QLinkedList<T> &other) Q_DECL_NOTHROW { qSwap(d, other.d); }
+ inline void swap(QLinkedList<T> &other) noexcept { qSwap(d, other.d); }
bool operator==(const QLinkedList<T> &l) const;
inline bool operator!=(const QLinkedList<T> &l) const { return !(*this == l); }
@@ -137,10 +139,10 @@ public:
inline iterator() : i(nullptr) {}
inline iterator(Node *n) : i(n) {}
#if QT_VERSION < QT_VERSION_CHECK(6,0,0)
- iterator(const iterator &other) Q_DECL_NOTHROW : i(other.i) {}
- iterator &operator=(const iterator &other) Q_DECL_NOTHROW { i = other.i; return *this; }
- iterator(iterator &&other) Q_DECL_NOTHROW : i(other.i) {}
- iterator &operator=(iterator &&other) Q_DECL_NOTHROW { return *this = other; }
+ iterator(const iterator &other) noexcept : i(other.i) {}
+ iterator &operator=(const iterator &other) noexcept { i = other.i; return *this; }
+ iterator(iterator &&other) noexcept : i(other.i) {}
+ iterator &operator=(iterator &&other) noexcept { return *this = other; }
#endif
inline T &operator*() const { return i->t; }
inline T *operator->() const { return &i->t; }
@@ -176,10 +178,10 @@ public:
inline const_iterator(Node *n) : i(n) {}
inline const_iterator(iterator ci) : i(ci.i){}
#if QT_VERSION < QT_VERSION_CHECK(6,0,0)
- const_iterator(const const_iterator &other) Q_DECL_NOTHROW : i(other.i) {}
- const_iterator &operator=(const const_iterator &other) Q_DECL_NOTHROW { i = other.i; return *this; }
- const_iterator(const_iterator &&other) Q_DECL_NOTHROW : i(other.i) {}
- const_iterator &operator=(const_iterator &&other) Q_DECL_NOTHROW { return *this = other; }
+ const_iterator(const const_iterator &other) noexcept : i(other.i) {}
+ const_iterator &operator=(const const_iterator &other) noexcept { i = other.i; return *this; }
+ const_iterator(const_iterator &&other) noexcept : i(other.i) {}
+ const_iterator &operator=(const_iterator &&other) noexcept { return *this = other; }
#endif
inline const T &operator*() const { return i->t; }
inline const T *operator->() const { return &i->t; }
@@ -203,20 +205,20 @@ public:
typedef std::reverse_iterator<const_iterator> const_reverse_iterator;
inline iterator begin() { detach(); return e->n; }
- inline const_iterator begin() const Q_DECL_NOTHROW { return e->n; }
- inline const_iterator cbegin() const Q_DECL_NOTHROW { return e->n; }
- inline const_iterator constBegin() const Q_DECL_NOTHROW { return e->n; }
+ inline const_iterator begin() const noexcept { return e->n; }
+ inline const_iterator cbegin() const noexcept { return e->n; }
+ inline const_iterator constBegin() const noexcept { return e->n; }
inline iterator end() { detach(); return e; }
- inline const_iterator end() const Q_DECL_NOTHROW { return e; }
- inline const_iterator cend() const Q_DECL_NOTHROW { return e; }
- inline const_iterator constEnd() const Q_DECL_NOTHROW { return e; }
+ inline const_iterator end() const noexcept { return e; }
+ inline const_iterator cend() const noexcept { return e; }
+ inline const_iterator constEnd() const noexcept { return e; }
reverse_iterator rbegin() { return reverse_iterator(end()); }
reverse_iterator rend() { return reverse_iterator(begin()); }
- const_reverse_iterator rbegin() const Q_DECL_NOTHROW { return const_reverse_iterator(end()); }
- const_reverse_iterator rend() const Q_DECL_NOTHROW { return const_reverse_iterator(begin()); }
- const_reverse_iterator crbegin() const Q_DECL_NOTHROW { return const_reverse_iterator(end()); }
- const_reverse_iterator crend() const Q_DECL_NOTHROW { return const_reverse_iterator(begin()); }
+ const_reverse_iterator rbegin() const noexcept { return const_reverse_iterator(end()); }
+ const_reverse_iterator rend() const noexcept { return const_reverse_iterator(begin()); }
+ const_reverse_iterator crbegin() const noexcept { return const_reverse_iterator(end()); }
+ const_reverse_iterator crend() const noexcept { return const_reverse_iterator(begin()); }
iterator insert(iterator before, const T &t);
iterator erase(iterator pos);
@@ -270,6 +272,15 @@ private:
iterator detach_helper2(iterator);
void freeData(QLinkedListData*);
};
+template <typename T>
+Q_DECLARE_TYPEINFO_BODY(QLinkedList<T>, Q_MOVABLE_TYPE|Q_RELOCATABLE_TYPE);
+
+#if defined(__cpp_deduction_guides) && __cpp_deduction_guides >= 201606
+template <typename InputIterator,
+ typename ValueType = typename std::iterator_traits<InputIterator>::value_type,
+ QtPrivate::IfIsInputIterator<InputIterator> = true>
+QLinkedList(InputIterator, InputIterator) -> QLinkedList<ValueType>;
+#endif
template <typename T>
inline QLinkedList<T>::~QLinkedList()
@@ -340,7 +351,7 @@ void QLinkedList<T>::freeData(QLinkedListData *x)
{
Node *y = reinterpret_cast<Node*>(x);
Node *i = y->n;
- Q_ASSERT(x->ref.atomic.load() == 0);
+ Q_ASSERT(x->ref.atomic.loadRelaxed() == 0);
while (i != y) {
Node *n = i;
i = i->n;
@@ -565,6 +576,24 @@ QLinkedList<T> QLinkedList<T>::operator+(const QLinkedList<T> &l) const
Q_DECLARE_SEQUENTIAL_ITERATOR(LinkedList)
Q_DECLARE_MUTABLE_SEQUENTIAL_ITERATOR(LinkedList)
+#ifndef QT_NO_DATASTREAM
+template <typename T>
+inline QDataStream &operator>>(QDataStream &s, QLinkedList<T> &l)
+{
+ return QtPrivate::readListBasedContainer(s, l);
+}
+
+template <typename T>
+inline QDataStream &operator<<(QDataStream &s, const QLinkedList<T> &l)
+{
+ return QtPrivate::writeSequentialContainer(s, l);
+}
+#endif
+
QT_END_NAMESPACE
+Q_DECLARE_SEQUENTIAL_CONTAINER_METATYPE(QLinkedList)
+
+#endif // QT_NO_LINKED_LIST
+
#endif // QLINKEDLIST_H
diff --git a/src/corelib/tools/qlist.cpp b/src/corelib/tools/qlist.cpp
index 6f8084c676..66770f6866 100644
--- a/src/corelib/tools/qlist.cpp
+++ b/src/corelib/tools/qlist.cpp
@@ -75,7 +75,7 @@ template class Q_CORE_EXPORT QVector<QPoint>;
the number of elements in the list.
*/
-const QListData::Data QListData::shared_null = { Q_REFCOUNT_INITIALIZE_STATIC, 0, 0, 0, { 0 } };
+const QListData::Data QListData::shared_null = { Q_REFCOUNT_INITIALIZE_STATIC, 0, 0, 0, { nullptr } };
/*!
* Detaches the QListData by allocating new memory for a list which will be bigger
@@ -545,6 +545,14 @@ void **QListData::erase(void **xi)
\since 5.2
*/
+/*! \fn template <class T> template<typename InputIterator> QList<T>::QList(InputIterator first, InputIterator last)
+ \since 5.14
+
+ Constructs a QList with the contents in the iterator range [\a first, \a last).
+
+ The value type of \c InputIterator must be convertible to \c T.
+*/
+
/*!
\fn template <class T> QList<T> QList<T>::mid(int pos, int length) const
@@ -2006,6 +2014,8 @@ void **QListData::erase(void **xi)
\snippet code/src_corelib_tools_qlistdata.cpp 21
+ \include containers-range-constructor.qdocinc
+
\sa fromSet(), toVector(), QVector::toList()
*/
@@ -2017,6 +2027,8 @@ void **QListData::erase(void **xi)
\snippet code/src_corelib_tools_qlistdata.cpp 22
+ \include containers-range-constructor.qdocinc
+
\sa toSet(), fromVector(), QVector::fromList()
*/
@@ -2029,6 +2041,8 @@ void **QListData::erase(void **xi)
\snippet code/src_corelib_tools_qlistdata.cpp 23
+ \include containers-range-constructor.qdocinc
+
\sa fromVector(), toSet(), QSet::toList()
*/
@@ -2042,6 +2056,8 @@ void **QListData::erase(void **xi)
\snippet code/src_corelib_tools_qlistdata.cpp 24
+ \include containers-range-constructor.qdocinc
+
\sa toVector(), fromSet(), QSet::fromList()
*/
@@ -2054,6 +2070,8 @@ void **QListData::erase(void **xi)
\snippet code/src_corelib_tools_qlistdata.cpp 25
+ \include containers-range-constructor.qdocinc
+
\sa toStdList(), QVector::fromStdVector()
*/
@@ -2064,6 +2082,8 @@ void **QListData::erase(void **xi)
\snippet code/src_corelib_tools_qlistdata.cpp 26
+ \include containers-range-constructor.qdocinc
+
\sa fromStdList(), QVector::toStdVector()
*/
diff --git a/src/corelib/tools/qlist.h b/src/corelib/tools/qlist.h
index a98a9147d6..425ffa42a5 100644
--- a/src/corelib/tools/qlist.h
+++ b/src/corelib/tools/qlist.h
@@ -46,12 +46,13 @@
#include <QtCore/qarraydata.h>
#include <QtCore/qhashfunctions.h>
#include <QtCore/qvector.h>
+#include <QtCore/qcontainertools_impl.h>
-#include <iterator>
-#include <list>
#include <algorithm>
-#ifdef Q_COMPILER_INITIALIZER_LISTS
#include <initializer_list>
+#include <iterator>
+#if QT_VERSION < QT_VERSION_CHECK(6,0,0)
+#include <list>
#endif
#include <stdlib.h>
@@ -111,11 +112,11 @@ struct Q_CORE_EXPORT QListData {
void remove(int i);
void remove(int i, int n);
void move(int from, int to);
- inline int size() const Q_DECL_NOTHROW { return int(d->end - d->begin); } // q6sizetype
- inline bool isEmpty() const Q_DECL_NOTHROW { return d->end == d->begin; }
- inline void **at(int i) const Q_DECL_NOTHROW { return d->array + d->begin + i; }
- inline void **begin() const Q_DECL_NOTHROW { return d->array + d->begin; }
- inline void **end() const Q_DECL_NOTHROW { return d->array + d->end; }
+ inline int size() const noexcept { return int(d->end - d->begin); } // q6sizetype
+ inline bool isEmpty() const noexcept { return d->end == d->begin; }
+ inline void **at(int i) const noexcept { return d->array + d->begin + i; }
+ inline void **begin() const noexcept { return d->array + d->begin; }
+ inline void **end() const noexcept { return d->array + d->end; }
};
namespace QtPrivate {
@@ -156,26 +157,23 @@ private:
union { QListData p; QListData::Data *d; };
public:
- inline QList() Q_DECL_NOTHROW : d(const_cast<QListData::Data *>(&QListData::shared_null)) { }
+ inline QList() noexcept : d(const_cast<QListData::Data *>(&QListData::shared_null)) { }
QList(const QList<T> &l);
~QList();
QList<T> &operator=(const QList<T> &l);
-#ifdef Q_COMPILER_RVALUE_REFS
- inline QList(QList<T> &&other) Q_DECL_NOTHROW
+ inline QList(QList<T> &&other) noexcept
: d(other.d) { other.d = const_cast<QListData::Data *>(&QListData::shared_null); }
- inline QList &operator=(QList<T> &&other) Q_DECL_NOTHROW
+ inline QList &operator=(QList<T> &&other) noexcept
{ QList moved(std::move(other)); swap(moved); return *this; }
-#endif
- inline void swap(QList<T> &other) Q_DECL_NOTHROW { qSwap(d, other.d); }
-#ifdef Q_COMPILER_INITIALIZER_LISTS
+ inline void swap(QList<T> &other) noexcept { qSwap(d, other.d); }
inline QList(std::initializer_list<T> args)
- : d(const_cast<QListData::Data *>(&QListData::shared_null))
- { reserve(int(args.size())); std::copy(args.begin(), args.end(), std::back_inserter(*this)); }
-#endif
+ : QList(args.begin(), args.end()) {}
+ template <typename InputIterator, QtPrivate::IfIsInputIterator<InputIterator> = true>
+ QList(InputIterator first, InputIterator last);
bool operator==(const QList<T> &l) const;
inline bool operator!=(const QList<T> &l) const { return !(*this == l); }
- inline int size() const Q_DECL_NOTHROW { return p.size(); }
+ inline int size() const noexcept { return p.size(); }
inline void detach() { if (d->ref.isShared()) detach_helper(); }
@@ -198,9 +196,9 @@ public:
d->ref.setSharable(sharable);
}
#endif
- inline bool isSharedWith(const QList<T> &other) const Q_DECL_NOTHROW { return d == other.d; }
+ inline bool isSharedWith(const QList<T> &other) const noexcept { return d == other.d; }
- inline bool isEmpty() const Q_DECL_NOTHROW { return p.isEmpty(); }
+ inline bool isEmpty() const noexcept { return p.isEmpty(); }
void clear();
@@ -243,36 +241,36 @@ public:
typedef T *pointer;
typedef T &reference;
- inline iterator() Q_DECL_NOTHROW : i(nullptr) {}
- inline iterator(Node *n) Q_DECL_NOTHROW : i(n) {}
+ inline iterator() noexcept : i(nullptr) {}
+ inline iterator(Node *n) noexcept : i(n) {}
#if QT_VERSION < QT_VERSION_CHECK(6,0,0)
// can't remove it in Qt 5, since doing so would make the type trivial,
// which changes the way it's passed to functions by value.
- inline iterator(const iterator &o) Q_DECL_NOTHROW : i(o.i){}
- inline iterator &operator=(const iterator &o) Q_DECL_NOTHROW
+ inline iterator(const iterator &o) noexcept : i(o.i){}
+ inline iterator &operator=(const iterator &o) noexcept
{ i = o.i; return *this; }
#endif
inline T &operator*() const { return i->t(); }
inline T *operator->() const { return &i->t(); }
inline T &operator[](difference_type j) const { return i[j].t(); }
- inline bool operator==(const iterator &o) const Q_DECL_NOTHROW { return i == o.i; }
- inline bool operator!=(const iterator &o) const Q_DECL_NOTHROW { return i != o.i; }
- inline bool operator<(const iterator& other) const Q_DECL_NOTHROW { return i < other.i; }
- inline bool operator<=(const iterator& other) const Q_DECL_NOTHROW { return i <= other.i; }
- inline bool operator>(const iterator& other) const Q_DECL_NOTHROW { return i > other.i; }
- inline bool operator>=(const iterator& other) const Q_DECL_NOTHROW { return i >= other.i; }
+ inline bool operator==(const iterator &o) const noexcept { return i == o.i; }
+ inline bool operator!=(const iterator &o) const noexcept { return i != o.i; }
+ inline bool operator<(const iterator& other) const noexcept { return i < other.i; }
+ inline bool operator<=(const iterator& other) const noexcept { return i <= other.i; }
+ inline bool operator>(const iterator& other) const noexcept { return i > other.i; }
+ inline bool operator>=(const iterator& other) const noexcept { return i >= other.i; }
#ifndef QT_STRICT_ITERATORS
- inline bool operator==(const const_iterator &o) const Q_DECL_NOTHROW
+ inline bool operator==(const const_iterator &o) const noexcept
{ return i == o.i; }
- inline bool operator!=(const const_iterator &o) const Q_DECL_NOTHROW
+ inline bool operator!=(const const_iterator &o) const noexcept
{ return i != o.i; }
- inline bool operator<(const const_iterator& other) const Q_DECL_NOTHROW
+ inline bool operator<(const const_iterator& other) const noexcept
{ return i < other.i; }
- inline bool operator<=(const const_iterator& other) const Q_DECL_NOTHROW
+ inline bool operator<=(const const_iterator& other) const noexcept
{ return i <= other.i; }
- inline bool operator>(const const_iterator& other) const Q_DECL_NOTHROW
+ inline bool operator>(const const_iterator& other) const noexcept
{ return i > other.i; }
- inline bool operator>=(const const_iterator& other) const Q_DECL_NOTHROW
+ inline bool operator>=(const const_iterator& other) const noexcept
{ return i >= other.i; }
#endif
inline iterator &operator++() { ++i; return *this; }
@@ -298,29 +296,29 @@ public:
typedef const T *pointer;
typedef const T &reference;
- inline const_iterator() Q_DECL_NOTHROW : i(nullptr) {}
- inline const_iterator(Node *n) Q_DECL_NOTHROW : i(n) {}
+ inline const_iterator() noexcept : i(nullptr) {}
+ inline const_iterator(Node *n) noexcept : i(n) {}
#if QT_VERSION < QT_VERSION_CHECK(6,0,0)
// can't remove it in Qt 5, since doing so would make the type trivial,
// which changes the way it's passed to functions by value.
- inline const_iterator(const const_iterator &o) Q_DECL_NOTHROW : i(o.i) {}
- inline const_iterator &operator=(const const_iterator &o) Q_DECL_NOTHROW
+ inline const_iterator(const const_iterator &o) noexcept : i(o.i) {}
+ inline const_iterator &operator=(const const_iterator &o) noexcept
{ i = o.i; return *this; }
#endif
#ifdef QT_STRICT_ITERATORS
- inline explicit const_iterator(const iterator &o) Q_DECL_NOTHROW : i(o.i) {}
+ inline explicit const_iterator(const iterator &o) noexcept : i(o.i) {}
#else
- inline const_iterator(const iterator &o) Q_DECL_NOTHROW : i(o.i) {}
+ inline const_iterator(const iterator &o) noexcept : i(o.i) {}
#endif
inline const T &operator*() const { return i->t(); }
inline const T *operator->() const { return &i->t(); }
inline const T &operator[](difference_type j) const { return i[j].t(); }
- inline bool operator==(const const_iterator &o) const Q_DECL_NOTHROW { return i == o.i; }
- inline bool operator!=(const const_iterator &o) const Q_DECL_NOTHROW { return i != o.i; }
- inline bool operator<(const const_iterator& other) const Q_DECL_NOTHROW { return i < other.i; }
- inline bool operator<=(const const_iterator& other) const Q_DECL_NOTHROW { return i <= other.i; }
- inline bool operator>(const const_iterator& other) const Q_DECL_NOTHROW { return i > other.i; }
- inline bool operator>=(const const_iterator& other) const Q_DECL_NOTHROW { return i >= other.i; }
+ inline bool operator==(const const_iterator &o) const noexcept { return i == o.i; }
+ inline bool operator!=(const const_iterator &o) const noexcept { return i != o.i; }
+ inline bool operator<(const const_iterator& other) const noexcept { return i < other.i; }
+ inline bool operator<=(const const_iterator& other) const noexcept { return i <= other.i; }
+ inline bool operator>(const const_iterator& other) const noexcept { return i > other.i; }
+ inline bool operator>=(const const_iterator& other) const noexcept { return i >= other.i; }
inline const_iterator &operator++() { ++i; return *this; }
inline const_iterator operator++(int) { Node *n = i; ++i; return n; }
inline const_iterator &operator--() { i--; return *this; }
@@ -338,19 +336,19 @@ public:
typedef std::reverse_iterator<iterator> reverse_iterator;
typedef std::reverse_iterator<const_iterator> const_reverse_iterator;
inline iterator begin() { detach(); return reinterpret_cast<Node *>(p.begin()); }
- inline const_iterator begin() const Q_DECL_NOTHROW { return reinterpret_cast<Node *>(p.begin()); }
- inline const_iterator cbegin() const Q_DECL_NOTHROW { return reinterpret_cast<Node *>(p.begin()); }
- inline const_iterator constBegin() const Q_DECL_NOTHROW { return reinterpret_cast<Node *>(p.begin()); }
+ inline const_iterator begin() const noexcept { return reinterpret_cast<Node *>(p.begin()); }
+ inline const_iterator cbegin() const noexcept { return reinterpret_cast<Node *>(p.begin()); }
+ inline const_iterator constBegin() const noexcept { return reinterpret_cast<Node *>(p.begin()); }
inline iterator end() { detach(); return reinterpret_cast<Node *>(p.end()); }
- inline const_iterator end() const Q_DECL_NOTHROW { return reinterpret_cast<Node *>(p.end()); }
- inline const_iterator cend() const Q_DECL_NOTHROW { return reinterpret_cast<Node *>(p.end()); }
- inline const_iterator constEnd() const Q_DECL_NOTHROW { return reinterpret_cast<Node *>(p.end()); }
+ inline const_iterator end() const noexcept { return reinterpret_cast<Node *>(p.end()); }
+ inline const_iterator cend() const noexcept { return reinterpret_cast<Node *>(p.end()); }
+ inline const_iterator constEnd() const noexcept { return reinterpret_cast<Node *>(p.end()); }
reverse_iterator rbegin() { return reverse_iterator(end()); }
reverse_iterator rend() { return reverse_iterator(begin()); }
- const_reverse_iterator rbegin() const Q_DECL_NOTHROW { return const_reverse_iterator(end()); }
- const_reverse_iterator rend() const Q_DECL_NOTHROW { return const_reverse_iterator(begin()); }
- const_reverse_iterator crbegin() const Q_DECL_NOTHROW { return const_reverse_iterator(end()); }
- const_reverse_iterator crend() const Q_DECL_NOTHROW { return const_reverse_iterator(begin()); }
+ const_reverse_iterator rbegin() const noexcept { return const_reverse_iterator(end()); }
+ const_reverse_iterator rend() const noexcept { return const_reverse_iterator(begin()); }
+ const_reverse_iterator crbegin() const noexcept { return const_reverse_iterator(end()); }
+ const_reverse_iterator crend() const noexcept { return const_reverse_iterator(begin()); }
iterator insert(iterator before, const T &t);
iterator erase(iterator pos);
iterator erase(iterator first, iterator last);
@@ -405,16 +403,22 @@ public:
inline QList<T> &operator<<(const QList<T> &l)
{ *this += l; return *this; }
+ static QList<T> fromVector(const QVector<T> &vector);
QVector<T> toVector() const;
- QSet<T> toSet() const;
- static QList<T> fromVector(const QVector<T> &vector);
+#if QT_VERSION < QT_VERSION_CHECK(6,0,0)
+ Q_DECL_DEPRECATED_X("Use QList<T>(set.begin(), set.end()) instead.")
static QList<T> fromSet(const QSet<T> &set);
+ Q_DECL_DEPRECATED_X("Use QSet<T>(list.begin(), list.end()) instead.")
+ QSet<T> toSet() const;
+ Q_DECL_DEPRECATED_X("Use QList<T>(list.begin(), list.end()) instead.")
static inline QList<T> fromStdList(const std::list<T> &list)
- { QList<T> tmp; std::copy(list.begin(), list.end(), std::back_inserter(tmp)); return tmp; }
+ { return QList<T>(list.begin(), list.end()); }
+ Q_DECL_DEPRECATED_X("Use std::list<T>(list.begin(), list.end()) instead.")
inline std::list<T> toStdList() const
- { std::list<T> tmp; std::copy(constBegin(), constEnd(), std::back_inserter(tmp)); return tmp; }
+ { return std::list<T>(begin(), end()); }
+#endif
private:
Node *detach_helper_grow(int i, int n);
@@ -427,7 +431,7 @@ private:
void node_copy(Node *from, Node *to, Node *src);
void node_destruct(Node *from, Node *to);
- bool isValidIterator(const iterator &i) const Q_DECL_NOTHROW
+ bool isValidIterator(const iterator &i) const noexcept
{
const std::less<const Node *> less = {};
return !less(i.i, cbegin().i) && !less(cend().i, i.i);
@@ -442,6 +446,13 @@ private:
inline int count_impl(const T &, QListData::ArrayCompatibleLayout) const;
};
+#if defined(__cpp_deduction_guides) && __cpp_deduction_guides >= 201606
+template <typename InputIterator,
+ typename ValueType = typename std::iterator_traits<InputIterator>::value_type,
+ QtPrivate::IfIsInputIterator<InputIterator> = true>
+QList(InputIterator, InputIterator) -> QList<ValueType>;
+#endif
+
#if defined(Q_CC_BOR)
template <typename T>
Q_INLINE_TEMPLATE T &QList<T>::Node::t()
@@ -530,7 +541,7 @@ inline typename QList<T>::iterator QList<T>::insert(iterator before, const T &t)
Q_ASSERT_X(isValidIterator(before), "QList::insert", "The specified iterator argument 'before' is invalid");
int iBefore = int(before.i - reinterpret_cast<Node *>(p.begin()));
- Node *n = 0;
+ Node *n = nullptr;
if (d->ref.isShared())
n = detach_helper_grow(iBefore, 1);
else
@@ -710,7 +721,7 @@ inline void QList<T>::swapItemsAt(int i, int j)
Q_ASSERT_X(i >= 0 && i < p.size() && j >= 0 && j < p.size(),
"QList<T>::swap", "index out of range");
detach();
- std::swap(d->array[d->begin + i], d->array[d->begin + j]);
+ qSwap(d->array[d->begin + i], d->array[d->begin + j]);
}
template <typename T>
@@ -847,6 +858,15 @@ Q_OUTOFLINE_TEMPLATE QList<T>::~QList()
}
template <typename T>
+template <typename InputIterator, QtPrivate::IfIsInputIterator<InputIterator>>
+QList<T>::QList(InputIterator first, InputIterator last)
+ : QList()
+{
+ QtPrivate::reserveIfForwardIterator(this, first, last);
+ std::copy(first, last, std::back_inserter(*this));
+}
+
+template <typename T>
Q_OUTOFLINE_TEMPLATE bool QList<T>::operator==(const QList<T> &l) const
{
if (d == l.d)
@@ -1092,10 +1112,7 @@ inline int QList<T>::count_impl(const T &t, QListData::ArrayCompatibleLayout) co
template <typename T>
Q_OUTOFLINE_TEMPLATE QVector<T> QList<T>::toVector() const
{
- QVector<T> result(size());
- for (int i = 0; i < size(); ++i)
- result[i] = at(i);
- return result;
+ return QVector<T>(begin(), end());
}
template <typename T>
@@ -1107,11 +1124,7 @@ QList<T> QList<T>::fromVector(const QVector<T> &vector)
template <typename T>
Q_OUTOFLINE_TEMPLATE QList<T> QVector<T>::toList() const
{
- QList<T> result;
- result.reserve(size());
- for (int i = 0; i < size(); ++i)
- result.append(at(i));
- return result;
+ return QList<T>(begin(), end());
}
template <typename T>
@@ -1125,14 +1138,14 @@ Q_DECLARE_MUTABLE_SEQUENTIAL_ITERATOR(List)
template <typename T>
uint qHash(const QList<T> &key, uint seed = 0)
- Q_DECL_NOEXCEPT_EXPR(noexcept(qHashRange(key.cbegin(), key.cend(), seed)))
+ noexcept(noexcept(qHashRange(key.cbegin(), key.cend(), seed)))
{
return qHashRange(key.cbegin(), key.cend(), seed);
}
template <typename T>
bool operator<(const QList<T> &lhs, const QList<T> &rhs)
- Q_DECL_NOEXCEPT_EXPR(noexcept(std::lexicographical_compare(lhs.begin(), lhs.end(),
+ noexcept(noexcept(std::lexicographical_compare(lhs.begin(), lhs.end(),
rhs.begin(), rhs.end())))
{
return std::lexicographical_compare(lhs.begin(), lhs.end(),
@@ -1141,21 +1154,21 @@ bool operator<(const QList<T> &lhs, const QList<T> &rhs)
template <typename T>
inline bool operator>(const QList<T> &lhs, const QList<T> &rhs)
- Q_DECL_NOEXCEPT_EXPR(noexcept(lhs < rhs))
+ noexcept(noexcept(lhs < rhs))
{
return rhs < lhs;
}
template <typename T>
inline bool operator<=(const QList<T> &lhs, const QList<T> &rhs)
- Q_DECL_NOEXCEPT_EXPR(noexcept(lhs < rhs))
+ noexcept(noexcept(lhs < rhs))
{
return !(lhs > rhs);
}
template <typename T>
inline bool operator>=(const QList<T> &lhs, const QList<T> &rhs)
- Q_DECL_NOEXCEPT_EXPR(noexcept(lhs < rhs))
+ noexcept(noexcept(lhs < rhs))
{
return !(lhs < rhs);
}
diff --git a/src/corelib/tools/qlocale.cpp b/src/corelib/tools/qlocale.cpp
deleted file mode 100644
index 152c2edb50..0000000000
--- a/src/corelib/tools/qlocale.cpp
+++ /dev/null
@@ -1,4200 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Copyright (C) 2019 Intel Corporation.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#include "qglobal.h"
-
-#if !defined(QWS) && defined(Q_OS_MAC)
-# include "private/qcore_mac_p.h"
-# include <CoreFoundation/CoreFoundation.h>
-#endif
-
-#include "qplatformdefs.h"
-
-#include "qdatastream.h"
-#include "qdebug.h"
-#include "qhashfunctions.h"
-#include "qstring.h"
-#include "qlocale.h"
-#include "qlocale_p.h"
-#include "qlocale_tools_p.h"
-#if QT_CONFIG(datetimeparser)
-#include "qdatetimeparser_p.h"
-#endif
-#include "qnamespace.h"
-#include "qdatetime.h"
-#include "qstringlist.h"
-#include "qvariant.h"
-#include "qstringbuilder.h"
-#include "private/qnumeric_p.h"
-#include <cmath>
-#ifndef QT_NO_SYSTEMLOCALE
-# include "qmutex.h"
-#endif
-#ifdef Q_OS_WIN
-# include <qt_windows.h>
-# include <time.h>
-#endif
-
-QT_BEGIN_NAMESPACE
-
-#ifndef QT_NO_SYSTEMLOCALE
-static QSystemLocale *_systemLocale = 0;
-class QSystemLocaleSingleton: public QSystemLocale
-{
-public:
- QSystemLocaleSingleton() : QSystemLocale(true) {}
-};
-
-Q_GLOBAL_STATIC(QSystemLocaleSingleton, QSystemLocale_globalSystemLocale)
-static QLocaleData globalLocaleData;
-#endif
-
-/******************************************************************************
-** Helpers for accessing Qt locale database
-*/
-
-QT_BEGIN_INCLUDE_NAMESPACE
-#include "qlocale_data_p.h"
-QT_END_INCLUDE_NAMESPACE
-
-QLocale::Language QLocalePrivate::codeToLanguage(QStringView code) Q_DECL_NOTHROW
-{
- const auto len = code.size();
- if (len != 2 && len != 3)
- return QLocale::C;
- ushort uc1 = code[0].toLower().unicode();
- ushort uc2 = code[1].toLower().unicode();
- ushort uc3 = len > 2 ? code[2].toLower().unicode() : 0;
-
- const unsigned char *c = language_code_list;
- for (; *c != 0; c += 3) {
- if (uc1 == c[0] && uc2 == c[1] && uc3 == c[2])
- return QLocale::Language((c - language_code_list)/3);
- }
-
- if (uc3 == 0) {
- // legacy codes
- if (uc1 == 'n' && uc2 == 'o') { // no -> nb
- Q_STATIC_ASSERT(QLocale::Norwegian == QLocale::NorwegianBokmal);
- return QLocale::Norwegian;
- }
- if (uc1 == 't' && uc2 == 'l') { // tl -> fil
- Q_STATIC_ASSERT(QLocale::Tagalog == QLocale::Filipino);
- return QLocale::Tagalog;
- }
- if (uc1 == 's' && uc2 == 'h') { // sh -> sr[_Latn]
- Q_STATIC_ASSERT(QLocale::SerboCroatian == QLocale::Serbian);
- return QLocale::SerboCroatian;
- }
- if (uc1 == 'm' && uc2 == 'o') { // mo -> ro
- Q_STATIC_ASSERT(QLocale::Moldavian == QLocale::Romanian);
- return QLocale::Moldavian;
- }
- // Android uses the following deprecated codes
- if (uc1 == 'i' && uc2 == 'w') // iw -> he
- return QLocale::Hebrew;
- if (uc1 == 'i' && uc2 == 'n') // in -> id
- return QLocale::Indonesian;
- if (uc1 == 'j' && uc2 == 'i') // ji -> yi
- return QLocale::Yiddish;
- }
- return QLocale::C;
-}
-
-QLocale::Script QLocalePrivate::codeToScript(QStringView code) Q_DECL_NOTHROW
-{
- const auto len = code.size();
- if (len != 4)
- return QLocale::AnyScript;
-
- // script is titlecased in our data
- unsigned char c0 = code[0].toUpper().toLatin1();
- unsigned char c1 = code[1].toLower().toLatin1();
- unsigned char c2 = code[2].toLower().toLatin1();
- unsigned char c3 = code[3].toLower().toLatin1();
-
- const unsigned char *c = script_code_list;
- for (int i = 0; i < QLocale::LastScript; ++i, c += 4) {
- if (c0 == c[0] && c1 == c[1] && c2 == c[2] && c3 == c[3])
- return QLocale::Script(i);
- }
- return QLocale::AnyScript;
-}
-
-QLocale::Country QLocalePrivate::codeToCountry(QStringView code) Q_DECL_NOTHROW
-{
- const auto len = code.size();
- if (len != 2 && len != 3)
- return QLocale::AnyCountry;
-
- ushort uc1 = code[0].toUpper().unicode();
- ushort uc2 = code[1].toUpper().unicode();
- ushort uc3 = len > 2 ? code[2].toUpper().unicode() : 0;
-
- const unsigned char *c = country_code_list;
- for (; *c != 0; c += 3) {
- if (uc1 == c[0] && uc2 == c[1] && uc3 == c[2])
- return QLocale::Country((c - country_code_list)/3);
- }
-
- return QLocale::AnyCountry;
-}
-
-QLatin1String QLocalePrivate::languageToCode(QLocale::Language language)
-{
- if (language == QLocale::AnyLanguage)
- return QLatin1String();
- if (language == QLocale::C)
- return QLatin1String("C");
-
- const unsigned char *c = language_code_list + 3*(uint(language));
-
- return QLatin1String(reinterpret_cast<const char*>(c), c[2] == 0 ? 2 : 3);
-
-}
-
-QLatin1String QLocalePrivate::scriptToCode(QLocale::Script script)
-{
- if (script == QLocale::AnyScript || script > QLocale::LastScript)
- return QLatin1String();
- const unsigned char *c = script_code_list + 4*(uint(script));
- return QLatin1String(reinterpret_cast<const char *>(c), 4);
-}
-
-QLatin1String QLocalePrivate::countryToCode(QLocale::Country country)
-{
- if (country == QLocale::AnyCountry)
- return QLatin1String();
-
- const unsigned char *c = country_code_list + 3*(uint(country));
-
- return QLatin1String(reinterpret_cast<const char*>(c), c[2] == 0 ? 2 : 3);
-}
-
-// http://www.unicode.org/reports/tr35/#Likely_Subtags
-static bool addLikelySubtags(QLocaleId &localeId)
-{
- // ### optimize with bsearch
- const int likely_subtags_count = sizeof(likely_subtags) / sizeof(likely_subtags[0]);
- const QLocaleId *p = likely_subtags;
- const QLocaleId *const e = p + likely_subtags_count;
- for ( ; p < e; p += 2) {
- if (localeId == p[0]) {
- localeId = p[1];
- return true;
- }
- }
- return false;
-}
-
-QLocaleId QLocaleId::withLikelySubtagsAdded() const
-{
- // language_script_region
- if (language_id || script_id || country_id) {
- QLocaleId id = QLocaleId::fromIds(language_id, script_id, country_id);
- if (addLikelySubtags(id))
- return id;
- }
- // language_region
- if (script_id) {
- QLocaleId id = QLocaleId::fromIds(language_id, 0, country_id);
- if (addLikelySubtags(id)) {
- id.script_id = script_id;
- return id;
- }
- }
- // language_script
- if (country_id) {
- QLocaleId id = QLocaleId::fromIds(language_id, script_id, 0);
- if (addLikelySubtags(id)) {
- id.country_id = country_id;
- return id;
- }
- }
- // language
- if (script_id && country_id) {
- QLocaleId id = QLocaleId::fromIds(language_id, 0, 0);
- if (addLikelySubtags(id)) {
- id.script_id = script_id;
- id.country_id = country_id;
- return id;
- }
- }
- // und_script
- if (language_id) {
- QLocaleId id = QLocaleId::fromIds(0, script_id, 0);
- if (addLikelySubtags(id)) {
- id.language_id = language_id;
- return id;
- }
- }
- return *this;
-}
-
-QLocaleId QLocaleId::withLikelySubtagsRemoved() const
-{
- QLocaleId max = withLikelySubtagsAdded();
- // language
- {
- QLocaleId id = QLocaleId::fromIds(language_id, 0, 0);
- if (id.withLikelySubtagsAdded() == max)
- return id;
- }
- // language_region
- if (country_id) {
- QLocaleId id = QLocaleId::fromIds(language_id, 0, country_id);
- if (id.withLikelySubtagsAdded() == max)
- return id;
- }
- // language_script
- if (script_id) {
- QLocaleId id = QLocaleId::fromIds(language_id, script_id, 0);
- if (id.withLikelySubtagsAdded() == max)
- return id;
- }
- return max;
-}
-
-QByteArray QLocaleId::name(char separator) const
-{
- if (language_id == QLocale::AnyLanguage)
- return QByteArray();
- if (language_id == QLocale::C)
- return QByteArrayLiteral("C");
-
- const unsigned char *lang = language_code_list + 3 * language_id;
- const unsigned char *script =
- (script_id != QLocale::AnyScript ? script_code_list + 4 * script_id : 0);
- const unsigned char *country =
- (country_id != QLocale::AnyCountry ? country_code_list + 3 * country_id : 0);
- char len = (lang[2] != 0 ? 3 : 2) + (script ? 4+1 : 0) + (country ? (country[2] != 0 ? 3 : 2)+1 : 0);
- QByteArray name(len, Qt::Uninitialized);
- char *uc = name.data();
- *uc++ = lang[0];
- *uc++ = lang[1];
- if (lang[2] != 0)
- *uc++ = lang[2];
- if (script) {
- *uc++ = separator;
- *uc++ = script[0];
- *uc++ = script[1];
- *uc++ = script[2];
- *uc++ = script[3];
- }
- if (country) {
- *uc++ = separator;
- *uc++ = country[0];
- *uc++ = country[1];
- if (country[2] != 0)
- *uc++ = country[2];
- }
- return name;
-}
-
-QByteArray QLocalePrivate::bcp47Name(char separator) const
-{
- if (m_data->m_language_id == QLocale::AnyLanguage)
- return QByteArray();
- if (m_data->m_language_id == QLocale::C)
- return QByteArrayLiteral("en");
-
- QLocaleId localeId = QLocaleId::fromIds(m_data->m_language_id, m_data->m_script_id, m_data->m_country_id);
- return localeId.withLikelySubtagsRemoved().name(separator);
-}
-
-static const QLocaleData *findLocaleDataById(const QLocaleId &localeId)
-{
- const uint idx = locale_index[localeId.language_id];
-
- const QLocaleData *data = locale_data + idx;
-
- if (idx == 0) // default language has no associated script or country
- return data;
-
- Q_ASSERT(data->m_language_id == localeId.language_id);
-
- if (localeId.script_id == QLocale::AnyScript && localeId.country_id == QLocale::AnyCountry)
- return data;
-
- if (localeId.script_id == QLocale::AnyScript) {
- do {
- if (data->m_country_id == localeId.country_id)
- return data;
- ++data;
- } while (data->m_language_id && data->m_language_id == localeId.language_id);
- } else if (localeId.country_id == QLocale::AnyCountry) {
- do {
- if (data->m_script_id == localeId.script_id)
- return data;
- ++data;
- } while (data->m_language_id && data->m_language_id == localeId.language_id);
- } else {
- do {
- if (data->m_script_id == localeId.script_id && data->m_country_id == localeId.country_id)
- return data;
- ++data;
- } while (data->m_language_id && data->m_language_id == localeId.language_id);
- }
-
- return 0;
-}
-
-const QLocaleData *QLocaleData::findLocaleData(QLocale::Language language, QLocale::Script script, QLocale::Country country)
-{
- QLocaleId localeId = QLocaleId::fromIds(language, script, country);
- QLocaleId likelyId = localeId.withLikelySubtagsAdded();
-
- const uint idx = locale_index[likelyId.language_id];
-
- // Try a straight match with the likely data:
- if (const QLocaleData *const data = findLocaleDataById(likelyId))
- return data;
- QList<QLocaleId> tried;
- tried.push_back(likelyId);
-
- // No match; try again with raw data:
- if (!tried.contains(localeId)) {
- if (const QLocaleData *const data = findLocaleDataById(localeId))
- return data;
- tried.push_back(localeId);
- }
-
- // No match; try again with likely country
- if (country != QLocale::AnyCountry
- && (language != QLocale::AnyLanguage || script != QLocale::AnyScript)) {
- localeId = QLocaleId::fromIds(language, script, QLocale::AnyCountry);
- likelyId = localeId.withLikelySubtagsAdded();
- if (!tried.contains(likelyId)) {
- if (const QLocaleData *const data = findLocaleDataById(likelyId))
- return data;
- tried.push_back(likelyId);
- }
-
- // No match; try again with any country
- if (!tried.contains(localeId)) {
- if (const QLocaleData *const data = findLocaleDataById(localeId))
- return data;
- tried.push_back(localeId);
- }
- }
-
- // No match; try again with likely script
- if (script != QLocale::AnyScript
- && (language != QLocale::AnyLanguage || country != QLocale::AnyCountry)) {
- localeId = QLocaleId::fromIds(language, QLocale::AnyScript, country);
- likelyId = localeId.withLikelySubtagsAdded();
- if (!tried.contains(likelyId)) {
- if (const QLocaleData *const data = findLocaleDataById(likelyId))
- return data;
- tried.push_back(likelyId);
- }
-
- // No match; try again with any script
- if (!tried.contains(localeId)) {
- if (const QLocaleData *const data = findLocaleDataById(localeId))
- return data;
- tried.push_back(localeId);
- }
- }
-
- // No match; return data at original index
- return locale_data + idx;
-}
-
-static bool parse_locale_tag(const QString &input, int &i, QString *result, const QString &separators)
-{
- *result = QString(8, Qt::Uninitialized); // worst case according to BCP47
- QChar *pch = result->data();
- const QChar *uc = input.data() + i;
- const int l = input.length();
- int size = 0;
- for (; i < l && size < 8; ++i, ++size) {
- if (separators.contains(*uc))
- break;
- if (! ((uc->unicode() >= 'a' && uc->unicode() <= 'z') ||
- (uc->unicode() >= 'A' && uc->unicode() <= 'Z') ||
- (uc->unicode() >= '0' && uc->unicode() <= '9')) ) // latin only
- return false;
- *pch++ = *uc++;
- }
- result->truncate(size);
- return true;
-}
-
-bool qt_splitLocaleName(const QString &name, QString &lang, QString &script, QString &cntry)
-{
- const int length = name.length();
-
- lang = script = cntry = QString();
-
- const QString separators = QStringLiteral("_-.@");
- enum ParserState { NoState, LangState, ScriptState, CountryState };
- ParserState state = LangState;
- for (int i = 0; i < length && state != NoState; ) {
- QString value;
- if (!parse_locale_tag(name, i, &value, separators) ||value.isEmpty())
- break;
- QChar sep = i < length ? name.at(i) : QChar();
- switch (state) {
- case LangState:
- if (!sep.isNull() && !separators.contains(sep)) {
- state = NoState;
- break;
- }
- lang = value;
- if (i == length) {
- // just language was specified
- state = NoState;
- break;
- }
- state = ScriptState;
- break;
- case ScriptState: {
- QString scripts = QString::fromLatin1((const char *)script_code_list, sizeof(script_code_list) - 1);
- if (value.length() == 4 && scripts.indexOf(value) % 4 == 0) {
- // script name is always 4 characters
- script = value;
- state = CountryState;
- } else {
- // it wasn't a script, maybe it is a country then?
- cntry = value;
- state = NoState;
- }
- break;
- }
- case CountryState:
- cntry = value;
- state = NoState;
- break;
- case NoState:
- // shouldn't happen
- qWarning("QLocale: This should never happen");
- break;
- }
- ++i;
- }
- return lang.length() == 2 || lang.length() == 3;
-}
-
-void QLocalePrivate::getLangAndCountry(const QString &name, QLocale::Language &lang,
- QLocale::Script &script, QLocale::Country &cntry)
-{
- lang = QLocale::C;
- script = QLocale::AnyScript;
- cntry = QLocale::AnyCountry;
-
- QString lang_code;
- QString script_code;
- QString cntry_code;
- if (!qt_splitLocaleName(name, lang_code, script_code, cntry_code))
- return;
-
- lang = QLocalePrivate::codeToLanguage(lang_code);
- if (lang == QLocale::C)
- return;
- script = QLocalePrivate::codeToScript(script_code);
- cntry = QLocalePrivate::codeToCountry(cntry_code);
-}
-
-static const QLocaleData *findLocaleData(const QString &name)
-{
- QLocale::Language lang;
- QLocale::Script script;
- QLocale::Country cntry;
- QLocalePrivate::getLangAndCountry(name, lang, script, cntry);
-
- return QLocaleData::findLocaleData(lang, script, cntry);
-}
-
-QString qt_readEscapedFormatString(QStringView format, int *idx)
-{
- int &i = *idx;
-
- Q_ASSERT(format.at(i) == QLatin1Char('\''));
- ++i;
- if (i == format.size())
- return QString();
- if (format.at(i).unicode() == '\'') { // "''" outside of a quoted stirng
- ++i;
- return QLatin1String("'");
- }
-
- QString result;
-
- while (i < format.size()) {
- if (format.at(i).unicode() == '\'') {
- if (i + 1 < format.size() && format.at(i + 1).unicode() == '\'') {
- // "''" inside of a quoted string
- result.append(QLatin1Char('\''));
- i += 2;
- } else {
- break;
- }
- } else {
- result.append(format.at(i++));
- }
- }
- if (i < format.size())
- ++i;
-
- return result;
-}
-
-/*!
- \internal
-
- Counts the number of identical leading characters in \a s.
-
- If \a s is empty, returns 0.
-
- Otherwise, returns the number of consecutive \c{s.front()}
- characters at the start of \a s.
-
- \code
- qt_repeatCount(u"a"); // == 1
- qt_repeatCount(u"ab"); // == 1
- qt_repeatCount(u"aab"); // == 2
- \endcode
-*/
-int qt_repeatCount(QStringView s)
-{
- if (s.isEmpty())
- return 0;
- const QChar c = s.front();
- qsizetype j = 1;
- while (j < s.size() && s.at(j) == c)
- ++j;
- return int(j);
-}
-
-static const QLocaleData *default_data = 0;
-static QLocale::NumberOptions default_number_options = QLocale::DefaultNumberOptions;
-
-static const QLocaleData *const c_data = locale_data;
-static QLocalePrivate *c_private()
-{
- static QLocalePrivate c_locale = { c_data, Q_BASIC_ATOMIC_INITIALIZER(1), QLocale::OmitGroupSeparator };
- return &c_locale;
-}
-
-#ifndef QT_NO_SYSTEMLOCALE
-/******************************************************************************
-** Default system locale behavior
-*/
-
-/*!
- Constructs a QSystemLocale object.
-
- The constructor will automatically install this object as the system locale,
- if there's not one active. It also resets the flag that'll prompt
- QLocale::system() to re-initialize its data, so that instantiating a
- QSystemLocale transiently (doesn't install the transient as system locale if
- there was one already and) triggers an update to the system locale's data.
-*/
-QSystemLocale::QSystemLocale()
-{
- if (!_systemLocale)
- _systemLocale = this;
-
- globalLocaleData.m_language_id = 0;
-}
-
-/*!
- \internal
-*/
-QSystemLocale::QSystemLocale(bool)
-{ }
-
-/*!
- Deletes the object.
-*/
-QSystemLocale::~QSystemLocale()
-{
- if (_systemLocale == this) {
- _systemLocale = 0;
-
- globalLocaleData.m_language_id = 0;
- }
-}
-
-static const QSystemLocale *systemLocale()
-{
- if (_systemLocale)
- return _systemLocale;
- return QSystemLocale_globalSystemLocale();
-}
-
-static void updateSystemPrivate()
-{
- // This function is NOT thread-safe!
- // It *should not* be called by anything but systemData()
- const QSystemLocale *sys_locale = systemLocale();
-
- // tell the object that the system locale has changed.
- sys_locale->query(QSystemLocale::LocaleChanged, QVariant());
-
- // Populate global with fallback as basis:
- globalLocaleData = *sys_locale->fallbackUiLocaleData();
-
- QVariant res = sys_locale->query(QSystemLocale::LanguageId, QVariant());
- if (!res.isNull()) {
- globalLocaleData.m_language_id = res.toInt();
- globalLocaleData.m_script_id = QLocale::AnyScript; // default for compatibility
- }
- res = sys_locale->query(QSystemLocale::CountryId, QVariant());
- if (!res.isNull()) {
- globalLocaleData.m_country_id = res.toInt();
- globalLocaleData.m_script_id = QLocale::AnyScript; // default for compatibility
- }
- res = sys_locale->query(QSystemLocale::ScriptId, QVariant());
- if (!res.isNull())
- globalLocaleData.m_script_id = res.toInt();
-
- res = sys_locale->query(QSystemLocale::DecimalPoint, QVariant());
- if (!res.isNull())
- globalLocaleData.m_decimal = res.toString().at(0).unicode();
-
- res = sys_locale->query(QSystemLocale::GroupSeparator, QVariant());
- if (!res.isNull())
- globalLocaleData.m_group = res.toString().at(0).unicode();
-
- res = sys_locale->query(QSystemLocale::ZeroDigit, QVariant());
- if (!res.isNull())
- globalLocaleData.m_zero = res.toString().at(0).unicode();
-
- res = sys_locale->query(QSystemLocale::NegativeSign, QVariant());
- if (!res.isNull())
- globalLocaleData.m_minus = res.toString().at(0).unicode();
-
- res = sys_locale->query(QSystemLocale::PositiveSign, QVariant());
- if (!res.isNull())
- globalLocaleData.m_plus = res.toString().at(0).unicode();
-}
-#endif // !QT_NO_SYSTEMLOCALE
-
-static const QLocaleData *systemData()
-{
-#ifndef QT_NO_SYSTEMLOCALE
- /*
- Copy over the information from the fallback locale and modify.
-
- This modifies (cross-thread) global state, so take care to only call it in
- one thread.
- */
- {
- static QBasicMutex systemDataMutex;
- systemDataMutex.lock();
- if (globalLocaleData.m_language_id == 0)
- updateSystemPrivate();
- systemDataMutex.unlock();
- }
-
- return &globalLocaleData;
-#else
- return locale_data;
-#endif
-}
-
-static const QLocaleData *defaultData()
-{
- if (!default_data)
- default_data = systemData();
- return default_data;
-}
-
-const QLocaleData *QLocaleData::c()
-{
- Q_ASSERT(locale_index[QLocale::C] == 0);
- return c_data;
-}
-
-static inline QString getLocaleData(const ushort *data, int size)
-{
- return size > 0 ? QString::fromRawData(reinterpret_cast<const QChar *>(data), size) : QString();
-}
-
-static QString getLocaleListData(const ushort *data, int size, int index)
-{
- static const ushort separator = ';';
- while (index && size > 0) {
- while (*data != separator)
- ++data, --size;
- --index;
- ++data;
- --size;
- }
- const ushort *end = data;
- while (size > 0 && *end != separator)
- ++end, --size;
- return getLocaleData(data, end - data);
-}
-
-
-#ifndef QT_NO_DATASTREAM
-QDataStream &operator<<(QDataStream &ds, const QLocale &l)
-{
- ds << l.name();
- return ds;
-}
-
-QDataStream &operator>>(QDataStream &ds, QLocale &l)
-{
- QString s;
- ds >> s;
- l = QLocale(s);
- return ds;
-}
-#endif // QT_NO_DATASTREAM
-
-
-static const int locale_data_size = sizeof(locale_data)/sizeof(QLocaleData) - 1;
-
-Q_GLOBAL_STATIC_WITH_ARGS(QSharedDataPointer<QLocalePrivate>, defaultLocalePrivate,
- (QLocalePrivate::create(defaultData(), default_number_options)))
-Q_GLOBAL_STATIC_WITH_ARGS(QExplicitlySharedDataPointer<QLocalePrivate>, systemLocalePrivate,
- (QLocalePrivate::create(systemData())))
-
-static QLocalePrivate *localePrivateByName(const QString &name)
-{
- if (name == QLatin1String("C"))
- return c_private();
- const QLocaleData *data = findLocaleData(name);
- return QLocalePrivate::create(data, data->m_language_id == QLocale::C ?
- QLocale::OmitGroupSeparator : QLocale::DefaultNumberOptions);
-}
-
-static QLocalePrivate *findLocalePrivate(QLocale::Language language, QLocale::Script script,
- QLocale::Country country)
-{
- if (language == QLocale::C)
- return c_private();
-
- const QLocaleData *data = QLocaleData::findLocaleData(language, script, country);
-
- QLocale::NumberOptions numberOptions = QLocale::DefaultNumberOptions;
-
- // If not found, should default to system
- if (data->m_language_id == QLocale::C && language != QLocale::C) {
- numberOptions = default_number_options;
- data = defaultData();
- }
- return QLocalePrivate::create(data, numberOptions);
-}
-
-
-/*!
- \internal
-*/
-QLocale::QLocale(QLocalePrivate &dd)
- : d(&dd)
-{}
-
-
-/*!
- Constructs a QLocale object with the specified \a name,
- which has the format
- "language[_script][_country][.codeset][@modifier]" or "C", where:
-
- \list
- \li language is a lowercase, two-letter, ISO 639 language code (also some three-letter codes),
- \li script is a titlecase, four-letter, ISO 15924 script code,
- \li country is an uppercase, two-letter, ISO 3166 country code (also "419" as defined by United Nations),
- \li and codeset and modifier are ignored.
- \endlist
-
- The separator can be either underscore or a minus sign.
-
- If the string violates the locale format, or language is not
- a valid ISO 639 code, the "C" locale is used instead. If country
- is not present, or is not a valid ISO 3166 code, the most
- appropriate country is chosen for the specified language.
-
- The language, script and country codes are converted to their respective
- \c Language, \c Script and \c Country enums. After this conversion is
- performed, the constructor behaves exactly like QLocale(Country, Script,
- Language).
-
- This constructor is much slower than QLocale(Country, Script, Language).
-
- \sa bcp47Name()
-*/
-
-QLocale::QLocale(const QString &name)
- : d(localePrivateByName(name))
-{
-}
-
-/*!
- Constructs a QLocale object initialized with the default locale. If
- no default locale was set using setDefault(), this locale will
- be the same as the one returned by system().
-
- \sa setDefault()
-*/
-
-QLocale::QLocale()
- : d(*defaultLocalePrivate)
-{
- // Make sure system data is up to date
- systemData();
-}
-
-/*!
- Constructs a QLocale object with the specified \a language and \a
- country.
-
- \list
- \li If the language/country pair is found in the database, it is used.
- \li If the language is found but the country is not, or if the country
- is \c AnyCountry, the language is used with the most
- appropriate available country (for example, Germany for German),
- \li If neither the language nor the country are found, QLocale
- defaults to the default locale (see setDefault()).
- \endlist
-
- The language and country that are actually used can be queried
- using language() and country().
-
- \sa setDefault(), language(), country()
-*/
-
-QLocale::QLocale(Language language, Country country)
- : d(findLocalePrivate(language, QLocale::AnyScript, country))
-{
-}
-
-/*!
- \since 4.8
-
- Constructs a QLocale object with the specified \a language, \a script and
- \a country.
-
- \list
- \li If the language/script/country is found in the database, it is used.
- \li If both \a script is AnyScript and \a country is AnyCountry, the
- language is used with the most appropriate available script and country
- (for example, Germany for German),
- \li If either \a script is AnyScript or \a country is AnyCountry, the
- language is used with the first locale that matches the given \a script
- and \a country.
- \li If neither the language nor the country are found, QLocale
- defaults to the default locale (see setDefault()).
- \endlist
-
- The language, script and country that are actually used can be queried
- using language(), script() and country().
-
- \sa setDefault(), language(), script(), country()
-*/
-
-QLocale::QLocale(Language language, Script script, Country country)
- : d(findLocalePrivate(language, script, country))
-{
-}
-
-/*!
- Constructs a QLocale object as a copy of \a other.
-*/
-
-QLocale::QLocale(const QLocale &other)
-{
- d = other.d;
-}
-
-/*!
- Destructor
-*/
-
-QLocale::~QLocale()
-{
-}
-
-/*!
- Assigns \a other to this QLocale object and returns a reference
- to this QLocale object.
-*/
-
-QLocale &QLocale::operator=(const QLocale &other)
-{
- d = other.d;
- return *this;
-}
-
-bool QLocale::operator==(const QLocale &other) const
-{
- return d->m_data == other.d->m_data && d->m_numberOptions == other.d->m_numberOptions;
-}
-
-bool QLocale::operator!=(const QLocale &other) const
-{
- return d->m_data != other.d->m_data || d->m_numberOptions != other.d->m_numberOptions;
-}
-
-/*!
- \fn void QLocale::swap(QLocale &other)
- \since 5.6
-
- Swaps locale \a other with this locale. This operation is very fast and
- never fails.
-*/
-
-/*!
- \since 5.6
- \relates QLocale
-
- Returns the hash value for \a key, using
- \a seed to seed the calculation.
-*/
-uint qHash(const QLocale &key, uint seed) Q_DECL_NOTHROW
-{
- QtPrivate::QHashCombine hash;
- seed = hash(seed, key.d->m_data);
- seed = hash(seed, key.d->m_numberOptions);
- return seed;
-}
-
-/*!
- \since 4.2
-
- Sets the \a options related to number conversions for this
- QLocale instance.
-*/
-void QLocale::setNumberOptions(NumberOptions options)
-{
- d->m_numberOptions = options;
-}
-
-/*!
- \since 4.2
-
- Returns the options related to number conversions for this
- QLocale instance.
-
- By default, no options are set for the standard locales.
-*/
-QLocale::NumberOptions QLocale::numberOptions() const
-{
- return static_cast<NumberOptions>(d->m_numberOptions);
-}
-
-/*!
- \since 4.8
-
- Returns \a str quoted according to the current locale using the given
- quotation \a style.
-*/
-QString QLocale::quoteString(const QString &str, QuotationStyle style) const
-{
- return quoteString(QStringRef(&str), style);
-}
-
-/*!
- \since 4.8
-
- \overload
-*/
-QString QLocale::quoteString(const QStringRef &str, QuotationStyle style) const
-{
-#ifndef QT_NO_SYSTEMLOCALE
- if (d->m_data == systemData()) {
- QVariant res;
- if (style == QLocale::AlternateQuotation)
- res = systemLocale()->query(QSystemLocale::StringToAlternateQuotation, QVariant::fromValue(str));
- if (res.isNull() || style == QLocale::StandardQuotation)
- res = systemLocale()->query(QSystemLocale::StringToStandardQuotation, QVariant::fromValue(str));
- if (!res.isNull())
- return res.toString();
- }
-#endif
-
- if (style == QLocale::StandardQuotation)
- return QChar(d->m_data->m_quotation_start) % str % QChar(d->m_data->m_quotation_end);
- else
- return QChar(d->m_data->m_alternate_quotation_start) % str % QChar(d->m_data->m_alternate_quotation_end);
-}
-
-/*!
- \since 4.8
-
- Returns a string that represents a join of a given \a list of strings with
- a separator defined by the locale.
-*/
-QString QLocale::createSeparatedList(const QStringList &list) const
-{
-#ifndef QT_NO_SYSTEMLOCALE
- if (d->m_data == systemData()) {
- QVariant res;
- res = systemLocale()->query(QSystemLocale::ListToSeparatedString, QVariant::fromValue(list));
-
- if (!res.isNull())
- return res.toString();
- }
-#endif
-
- const int size = list.size();
- if (size == 1) {
- return list.at(0);
- } else if (size == 2) {
- QString format = getLocaleData(list_pattern_part_data + d->m_data->m_list_pattern_part_two_idx, d->m_data->m_list_pattern_part_two_size);
- return format.arg(list.at(0), list.at(1));
- } else if (size > 2) {
- QString formatStart = getLocaleData(list_pattern_part_data + d->m_data->m_list_pattern_part_start_idx, d->m_data->m_list_pattern_part_start_size);
- QString formatMid = getLocaleData(list_pattern_part_data + d->m_data->m_list_pattern_part_mid_idx, d->m_data->m_list_pattern_part_mid_size);
- QString formatEnd = getLocaleData(list_pattern_part_data + d->m_data->m_list_pattern_part_end_idx, d->m_data->m_list_pattern_part_end_size);
- QString result = formatStart.arg(list.at(0), list.at(1));
- for (int i = 2; i < size - 1; ++i)
- result = formatMid.arg(result, list.at(i));
- result = formatEnd.arg(result, list.at(size - 1));
- return result;
- }
-
- return QString();
-}
-
-/*!
- \nonreentrant
-
- Sets the global default locale to \a locale. These
- values are used when a QLocale object is constructed with
- no arguments. If this function is not called, the system's
- locale is used.
-
- \warning In a multithreaded application, the default locale
- should be set at application startup, before any non-GUI threads
- are created.
-
- \sa system(), c()
-*/
-
-void QLocale::setDefault(const QLocale &locale)
-{
- default_data = locale.d->m_data;
- default_number_options = locale.numberOptions();
-
- if (defaultLocalePrivate.exists()) {
- // update the cached private
- *defaultLocalePrivate = locale.d;
- }
-}
-
-/*!
- Returns the language of this locale.
-
- \sa script(), country(), languageToString(), bcp47Name()
-*/
-QLocale::Language QLocale::language() const
-{
- return Language(d->languageId());
-}
-
-/*!
- \since 4.8
-
- Returns the script of this locale.
-
- \sa language(), country(), languageToString(), scriptToString(), bcp47Name()
-*/
-QLocale::Script QLocale::script() const
-{
- return Script(d->m_data->m_script_id);
-}
-
-/*!
- Returns the country of this locale.
-
- \sa language(), script(), countryToString(), bcp47Name()
-*/
-QLocale::Country QLocale::country() const
-{
- return Country(d->countryId());
-}
-
-/*!
- Returns the language and country of this locale as a
- string of the form "language_country", where
- language is a lowercase, two-letter ISO 639 language code,
- and country is an uppercase, two- or three-letter ISO 3166 country code.
-
- Note that even if QLocale object was constructed with an explicit script,
- name() will not contain it for compatibility reasons. Use bcp47Name() instead
- if you need a full locale name.
-
- \sa QLocale(), language(), script(), country(), bcp47Name()
-*/
-
-QString QLocale::name() const
-{
- Language l = language();
- if (l == C)
- return d->languageCode();
-
- Country c = country();
- if (c == AnyCountry)
- return d->languageCode();
-
- return d->languageCode() + QLatin1Char('_') + d->countryCode();
-}
-
-static qlonglong toIntegral_helper(const QLocaleData *d, QStringView str, bool *ok,
- QLocale::NumberOptions mode, qlonglong)
-{
- return d->stringToLongLong(str, 10, ok, mode);
-}
-
-static qulonglong toIntegral_helper(const QLocaleData *d, QStringView str, bool *ok,
- QLocale::NumberOptions mode, qulonglong)
-{
- return d->stringToUnsLongLong(str, 10, ok, mode);
-}
-
-template <typename T> static inline
-T toIntegral_helper(const QLocalePrivate *d, QStringView str, bool *ok)
-{
- using Int64 = typename std::conditional<std::is_unsigned<T>::value, qulonglong, qlonglong>::type;
-
- // we select the right overload by the last, unused parameter
- Int64 val = toIntegral_helper(d->m_data, str, ok, d->m_numberOptions, Int64());
- if (T(val) != val) {
- if (ok != nullptr)
- *ok = false;
- val = 0;
- }
- return T(val);
-}
-
-
-/*!
- \since 4.8
-
- Returns the dash-separated language, script and country (and possibly other BCP47 fields)
- of this locale as a string.
-
- Unlike the uiLanguages() the returned value of the bcp47Name() represents
- the locale name of the QLocale data but not the language the user-interface
- should be in.
-
- This function tries to conform the locale name to BCP47.
-
- \sa language(), country(), script(), uiLanguages()
-*/
-QString QLocale::bcp47Name() const
-{
- return QString::fromLatin1(d->bcp47Name());
-}
-
-/*!
- Returns a QString containing the name of \a language.
-
- \sa countryToString(), scriptToString(), bcp47Name()
-*/
-
-QString QLocale::languageToString(Language language)
-{
- if (uint(language) > uint(QLocale::LastLanguage))
- return QLatin1String("Unknown");
- return QLatin1String(language_name_list + language_name_index[language]);
-}
-
-/*!
- Returns a QString containing the name of \a country.
-
- \sa languageToString(), scriptToString(), country(), bcp47Name()
-*/
-
-QString QLocale::countryToString(Country country)
-{
- if (uint(country) > uint(QLocale::LastCountry))
- return QLatin1String("Unknown");
- return QLatin1String(country_name_list + country_name_index[country]);
-}
-
-/*!
- \since 4.8
-
- Returns a QString containing the name of \a script.
-
- \sa languageToString(), countryToString(), script(), bcp47Name()
-*/
-QString QLocale::scriptToString(QLocale::Script script)
-{
- if (uint(script) > uint(QLocale::LastScript))
- return QLatin1String("Unknown");
- return QLatin1String(script_name_list + script_name_index[script]);
-}
-
-#if QT_STRINGVIEW_LEVEL < 2
-/*!
- Returns the short int represented by the localized string \a s.
-
- If the conversion fails the function returns 0.
-
- If \a ok is not \nullptr, failure is reported by setting *\a{ok}
- to \c false, and success by setting *\a{ok} to \c true.
-
- This function ignores leading and trailing whitespace.
-
- \sa toUShort(), toString()
-*/
-
-short QLocale::toShort(const QString &s, bool *ok) const
-{
- return toIntegral_helper<short>(d, s, ok);
-}
-
-/*!
- Returns the unsigned short int represented by the localized string \a s.
-
- If the conversion fails the function returns 0.
-
- If \a ok is not \nullptr, failure is reported by setting *\a{ok}
- to \c false, and success by setting *\a{ok} to \c true.
-
- This function ignores leading and trailing whitespace.
-
- \sa toShort(), toString()
-*/
-
-ushort QLocale::toUShort(const QString &s, bool *ok) const
-{
- return toIntegral_helper<ushort>(d, s, ok);
-}
-
-/*!
- Returns the int represented by the localized string \a s.
-
- If the conversion fails the function returns 0.
-
- If \a ok is not \nullptr, failure is reported by setting *\a{ok}
- to \c false, and success by setting *\a{ok} to \c true.
-
- This function ignores leading and trailing whitespace.
-
- \sa toUInt(), toString()
-*/
-
-int QLocale::toInt(const QString &s, bool *ok) const
-{
- return toIntegral_helper<int>(d, s, ok);
-}
-
-/*!
- Returns the unsigned int represented by the localized string \a s.
-
- If the conversion fails the function returns 0.
-
- If \a ok is not \nullptr, failure is reported by setting *\a{ok}
- to \c false, and success by setting *\a{ok} to \c true.
-
- This function ignores leading and trailing whitespace.
-
- \sa toInt(), toString()
-*/
-
-uint QLocale::toUInt(const QString &s, bool *ok) const
-{
- return toIntegral_helper<uint>(d, s, ok);
-}
-
-/*!
- Returns the long int represented by the localized string \a s.
-
- If the conversion fails the function returns 0.
-
- If \a ok is not \nullptr, failure is reported by setting *\a{ok}
- to \c false, and success by setting *\a{ok} to \c true.
-
- This function ignores leading and trailing whitespace.
-
- \sa toInt(), toULong(), toDouble(), toString()
-
- \since 5.13
- */
-
-
-long QLocale::toLong(const QString &s, bool *ok) const
-{
- return toIntegral_helper<long>(d, s, ok);
-}
-
-/*!
- Returns the unsigned long int represented by the localized
- string \a s.
-
- If the conversion fails the function returns 0.
-
- If \a ok is not \nullptr, failure is reported by setting *\a{ok}
- to \c false, and success by setting *\a{ok} to \c true.
-
- This function ignores leading and trailing whitespace.
-
- \sa toLong(), toInt(), toDouble(), toString()
-
- \since 5.13
-*/
-
-ulong QLocale::toULong(const QString &s, bool *ok) const
-{
- return toIntegral_helper<ulong>(d, s, ok);
-}
-
-/*!
- Returns the long long int represented by the localized string \a s.
-
- If the conversion fails the function returns 0.
-
- If \a ok is not \nullptr, failure is reported by setting *\a{ok}
- to \c false, and success by setting *\a{ok} to \c true.
-
- This function ignores leading and trailing whitespace.
-
- \sa toInt(), toULongLong(), toDouble(), toString()
-*/
-
-
-qlonglong QLocale::toLongLong(const QString &s, bool *ok) const
-{
- return toIntegral_helper<qlonglong>(d, s, ok);
-}
-
-/*!
- Returns the unsigned long long int represented by the localized
- string \a s.
-
- If the conversion fails the function returns 0.
-
- If \a ok is not \nullptr, failure is reported by setting *\a{ok}
- to \c false, and success by setting *\a{ok} to \c true.
-
- This function ignores leading and trailing whitespace.
-
- \sa toLongLong(), toInt(), toDouble(), toString()
-*/
-
-qulonglong QLocale::toULongLong(const QString &s, bool *ok) const
-{
- return toIntegral_helper<qulonglong>(d, s, ok);
-}
-
-/*!
- Returns the float represented by the localized string \a s.
-
- Returns an infinity if the conversion overflows or 0.0 if the
- conversion fails for any other reason (e.g. underflow).
-
- If \a ok is not \nullptr, failure is reported by setting *\a{ok}
- to \c false, and success by setting *\a{ok} to \c true.
-
- This function does not fall back to the 'C' locale if the string
- cannot be interpreted in this locale.
-
- This function ignores leading and trailing whitespace.
-
- \sa toDouble(), toInt(), toString()
-*/
-
-float QLocale::toFloat(const QString &s, bool *ok) const
-{
- return QLocaleData::convertDoubleToFloat(toDouble(s, ok), ok);
-}
-
-/*!
- Returns the double represented by the localized string \a s.
-
- Returns an infinity if the conversion overflows or 0.0 if the
- conversion fails for any other reason (e.g. underflow).
-
- If \a ok is not \nullptr, failure is reported by setting *\a{ok}
- to \c false, and success by setting *\a{ok} to \c true.
-
- This function does not fall back to the 'C' locale if the string
- cannot be interpreted in this locale.
-
- \snippet code/src_corelib_tools_qlocale.cpp 3
-
- Notice that the last conversion returns 1234.0, because '.' is the
- thousands group separator in the German locale.
-
- This function ignores leading and trailing whitespace.
-
- \sa toFloat(), toInt(), toString()
-*/
-
-double QLocale::toDouble(const QString &s, bool *ok) const
-{
- return d->m_data->stringToDouble(s, ok, d->m_numberOptions);
-}
-
-/*!
- Returns the short int represented by the localized string \a s.
-
- If the conversion fails the function returns 0.
-
- If \a ok is not \nullptr, failure is reported by setting *\a{ok}
- to \c false, and success by setting *\a{ok} to \c true.
-
- This function ignores leading and trailing whitespace.
-
- \sa toUShort(), toString()
-
- \since 5.1
-*/
-
-short QLocale::toShort(const QStringRef &s, bool *ok) const
-{
- return toIntegral_helper<short>(d, s, ok);
-}
-
-/*!
- Returns the unsigned short int represented by the localized string \a s.
-
- If the conversion fails the function returns 0.
-
- If \a ok is not \nullptr, failure is reported by setting *\a{ok}
- to \c false, and success by setting *\a{ok} to \c true.
-
- This function ignores leading and trailing whitespace.
-
- \sa toShort(), toString()
-
- \since 5.1
-*/
-
-ushort QLocale::toUShort(const QStringRef &s, bool *ok) const
-{
- return toIntegral_helper<ushort>(d, s, ok);
-}
-
-/*!
- Returns the int represented by the localized string \a s.
-
- If the conversion fails the function returns 0.
-
- If \a ok is not \nullptr, failure is reported by setting *\a{ok}
- to \c false, and success by setting *\a{ok} to \c true.
-
- This function ignores leading and trailing whitespace.
-
- \sa toUInt(), toString()
-
- \since 5.1
-*/
-
-int QLocale::toInt(const QStringRef &s, bool *ok) const
-{
- return toIntegral_helper<int>(d, s, ok);
-}
-
-/*!
- Returns the unsigned int represented by the localized string \a s.
-
- If the conversion fails the function returns 0.
-
- If \a ok is not \nullptr, failure is reported by setting *\a{ok}
- to \c false, and success by setting *\a{ok} to \c true.
-
- This function ignores leading and trailing whitespace.
-
- \sa toInt(), toString()
-
- \since 5.1
-*/
-
-uint QLocale::toUInt(const QStringRef &s, bool *ok) const
-{
- return toIntegral_helper<uint>(d, s, ok);
-}
-
-/*!
- Returns the long int represented by the localized string \a s.
-
- If the conversion fails the function returns 0.
-
- If \a ok is not \nullptr, failure is reported by setting *\a{ok}
- to \c false, and success by setting *\a{ok} to \c true.
-
- This function ignores leading and trailing whitespace.
-
- \sa toInt(), toULong(), toDouble(), toString()
-
- \since 5.13
- */
-
-
-long QLocale::toLong(const QStringRef &s, bool *ok) const
-{
- return toIntegral_helper<long>(d, s, ok);
-}
-
-/*!
- Returns the unsigned long int represented by the localized
- string \a s.
-
- If the conversion fails the function returns 0.
-
- If \a ok is not \nullptr, failure is reported by setting *\a{ok}
- to \c false, and success by setting *\a{ok} to \c true.
-
- This function ignores leading and trailing whitespace.
-
- \sa toLong(), toInt(), toDouble(), toString()
-
- \since 5.13
- */
-
-ulong QLocale::toULong(const QStringRef &s, bool *ok) const
-{
- return toIntegral_helper<ulong>(d, s, ok);
-}
-
-/*!
- Returns the long long int represented by the localized string \a s.
-
- If the conversion fails the function returns 0.
-
- If \a ok is not \nullptr, failure is reported by setting *\a{ok}
- to \c false, and success by setting *\a{ok} to \c true.
-
- This function ignores leading and trailing whitespace.
-
- \sa toInt(), toULongLong(), toDouble(), toString()
-
- \since 5.1
-*/
-
-
-qlonglong QLocale::toLongLong(const QStringRef &s, bool *ok) const
-{
- return toIntegral_helper<qlonglong>(d, s, ok);
-}
-
-/*!
- Returns the unsigned long long int represented by the localized
- string \a s.
-
- If the conversion fails the function returns 0.
-
- If \a ok is not \nullptr, failure is reported by setting *\a{ok}
- to \c false, and success by setting *\a{ok} to \c true.
-
- This function ignores leading and trailing whitespace.
-
- \sa toLongLong(), toInt(), toDouble(), toString()
-
- \since 5.1
-*/
-
-qulonglong QLocale::toULongLong(const QStringRef &s, bool *ok) const
-{
- return toIntegral_helper<qulonglong>(d, s, ok);
-}
-
-/*!
- Returns the float represented by the localized string \a s.
-
- Returns an infinity if the conversion overflows or 0.0 if the
- conversion fails for any other reason (e.g. underflow).
-
- If \a ok is not \nullptr, failure is reported by setting *\a{ok}
- to \c false, and success by setting *\a{ok} to \c true.
-
- This function does not fall back to the 'C' locale if the string
- cannot be interpreted in this locale.
-
- This function ignores leading and trailing whitespace.
-
- \sa toDouble(), toInt(), toString()
-
- \since 5.1
-*/
-
-float QLocale::toFloat(const QStringRef &s, bool *ok) const
-{
- return QLocaleData::convertDoubleToFloat(toDouble(s, ok), ok);
-}
-
-/*!
- Returns the double represented by the localized string \a s.
-
- Returns an infinity if the conversion overflows or 0.0 if the
- conversion fails for any other reason (e.g. underflow).
-
- If \a ok is not \nullptr, failure is reported by setting *\a{ok}
- to \c false, and success by setting *\a{ok} to \c true.
-
- This function does not fall back to the 'C' locale if the string
- cannot be interpreted in this locale.
-
- \snippet code/src_corelib_tools_qlocale.cpp 3
-
- Notice that the last conversion returns 1234.0, because '.' is the
- thousands group separator in the German locale.
-
- This function ignores leading and trailing whitespace.
-
- \sa toFloat(), toInt(), toString()
-
- \since 5.1
-*/
-
-double QLocale::toDouble(const QStringRef &s, bool *ok) const
-{
- return d->m_data->stringToDouble(s, ok, d->m_numberOptions);
-}
-#endif // QT_STRINGVIEW_LEVEL < 2
-
-/*!
- Returns the short int represented by the localized string \a s.
-
- If the conversion fails, the function returns 0.
-
- If \a ok is not \nullptr, failure is reported by setting *\a{ok}
- to \c false, and success by setting *\a{ok} to \c true.
-
- This function ignores leading and trailing whitespace.
-
- \sa toUShort(), toString()
-
- \since 5.10
-*/
-
-short QLocale::toShort(QStringView s, bool *ok) const
-{
- return toIntegral_helper<short>(d, s, ok);
-}
-
-/*!
- Returns the unsigned short int represented by the localized string \a s.
-
- If the conversion fails, the function returns 0.
-
- If \a ok is not \nullptr, failure is reported by setting *\a{ok}
- to \c false, and success by setting *\a{ok} to \c true.
-
- This function ignores leading and trailing whitespace.
-
- \sa toShort(), toString()
-
- \since 5.10
-*/
-
-ushort QLocale::toUShort(QStringView s, bool *ok) const
-{
- return toIntegral_helper<ushort>(d, s, ok);
-}
-
-/*!
- Returns the int represented by the localized string \a s.
-
- If the conversion fails, the function returns 0.
-
- If \a ok is not \nullptr, failure is reported by setting *\a{ok}
- to \c false, and success by setting *\a{ok} to \c true.
-
- This function ignores leading and trailing whitespace.
-
- \sa toUInt(), toString()
-
- \since 5.10
-*/
-
-int QLocale::toInt(QStringView s, bool *ok) const
-{
- return toIntegral_helper<int>(d, s, ok);
-}
-
-/*!
- Returns the unsigned int represented by the localized string \a s.
-
- If the conversion fails, the function returns 0.
-
- If \a ok is not \nullptr, failure is reported by setting *\a{ok}
- to \c false, and success by setting *\a{ok} to \c true.
-
- This function ignores leading and trailing whitespace.
-
- \sa toInt(), toString()
-
- \since 5.10
-*/
-
-uint QLocale::toUInt(QStringView s, bool *ok) const
-{
- return toIntegral_helper<uint>(d, s, ok);
-}
-
-/*!
- Returns the long int represented by the localized string \a s.
-
- If the conversion fails the function returns 0.
-
- If \a ok is not \nullptr, failure is reported by setting *\a{ok}
- to \c false, and success by setting *\a{ok} to \c true.
-
- This function ignores leading and trailing whitespace.
-
- \sa toInt(), toULong(), toDouble(), toString()
-
- \since 5.13
- */
-
-
-long QLocale::toLong(QStringView s, bool *ok) const
-{
- return toIntegral_helper<long>(d, s, ok);
-}
-
-/*!
- Returns the unsigned long int represented by the localized
- string \a s.
-
- If the conversion fails the function returns 0.
-
- If \a ok is not \nullptr, failure is reported by setting *\a{ok}
- to \c false, and success by setting *\a{ok} to \c true.
-
- This function ignores leading and trailing whitespace.
-
- \sa toLong(), toInt(), toDouble(), toString()
-
- \since 5.13
- */
-
-ulong QLocale::toULong(QStringView s, bool *ok) const
-{
- return toIntegral_helper<ulong>(d, s, ok);
-}
-
-/*!
- Returns the long long int represented by the localized string \a s.
-
- If the conversion fails, the function returns 0.
-
- If \a ok is not \nullptr, failure is reported by setting *\a{ok}
- to \c false, and success by setting *\a{ok} to \c true.
-
- This function ignores leading and trailing whitespace.
-
- \sa toInt(), toULongLong(), toDouble(), toString()
-
- \since 5.10
-*/
-
-
-qlonglong QLocale::toLongLong(QStringView s, bool *ok) const
-{
- return toIntegral_helper<qlonglong>(d, s, ok);
-}
-
-/*!
- Returns the unsigned long long int represented by the localized
- string \a s.
-
- If the conversion fails, the function returns 0.
-
- If \a ok is not \nullptr, failure is reported by setting *\a{ok}
- to \c false, and success by setting *\a{ok} to \c true.
-
- This function ignores leading and trailing whitespace.
-
- \sa toLongLong(), toInt(), toDouble(), toString()
-
- \since 5.10
-*/
-
-qulonglong QLocale::toULongLong(QStringView s, bool *ok) const
-{
- return toIntegral_helper<qulonglong>(d, s, ok);
-}
-
-/*!
- Returns the float represented by the localized string \a s.
-
- Returns an infinity if the conversion overflows or 0.0 if the
- conversion fails for any other reason (e.g. underflow).
-
- If \a ok is not \nullptr, failure is reported by setting *\a{ok}
- to \c false, and success by setting *\a{ok} to \c true.
-
- This function ignores leading and trailing whitespace.
-
- \sa toDouble(), toInt(), toString()
-
- \since 5.10
-*/
-
-float QLocale::toFloat(QStringView s, bool *ok) const
-{
- return QLocaleData::convertDoubleToFloat(toDouble(s, ok), ok);
-}
-
-/*!
- Returns the double represented by the localized string \a s.
-
- Returns an infinity if the conversion overflows or 0.0 if the
- conversion fails for any other reason (e.g. underflow).
-
- If \a ok is not \nullptr, failure is reported by setting *\a{ok}
- to \c false, and success by setting *\a{ok} to \c true.
-
- Unlike QString::toDouble(), this function does not fall back to
- the "C" locale if the string cannot be interpreted in this
- locale.
-
- \snippet code/src_corelib_tools_qlocale.cpp 3-qstringview
-
- Notice that the last conversion returns 1234.0, because '.' is the
- thousands group separator in the German locale.
-
- This function ignores leading and trailing whitespace.
-
- \sa toFloat(), toInt(), toString()
-
- \since 5.10
-*/
-
-double QLocale::toDouble(QStringView s, bool *ok) const
-{
- return d->m_data->stringToDouble(s, ok, d->m_numberOptions);
-}
-
-/*!
- Returns a localized string representation of \a i.
-
- \sa toLongLong()
-*/
-
-QString QLocale::toString(qlonglong i) const
-{
- int flags = d->m_numberOptions & OmitGroupSeparator
- ? 0
- : QLocaleData::ThousandsGroup;
-
- return d->m_data->longLongToString(i, -1, 10, -1, flags);
-}
-
-/*!
- \overload
-
- \sa toULongLong()
-*/
-
-QString QLocale::toString(qulonglong i) const
-{
- int flags = d->m_numberOptions & OmitGroupSeparator
- ? 0
- : QLocaleData::ThousandsGroup;
-
- return d->m_data->unsLongLongToString(i, -1, 10, -1, flags);
-}
-
-#if QT_STRINGVIEW_LEVEL < 2
-/*!
- Returns a localized string representation of the given \a date in the
- specified \a format.
- If \a format is an empty string, an empty string is returned.
-
- \sa QDate::toString()
-*/
-
-QString QLocale::toString(const QDate &date, const QString &format) const
-{
- return d->dateTimeToString(format, QDateTime(), date, QTime(), this);
-}
-#endif
-
-/*!
- \since 5.10
-
- Returns a localized string representation of the given \a date in the
- specified \a format.
- If \a format is an empty string, an empty string is returned.
-
- \sa QDate::toString()
-*/
-QString QLocale::toString(const QDate &date, QStringView format) const
-{
- return d->dateTimeToString(format, QDateTime(), date, QTime(), this);
-}
-
-/*!
- Returns a localized string representation of the given \a date according
- to the specified \a format.
-*/
-
-QString QLocale::toString(const QDate &date, FormatType format) const
-{
- if (!date.isValid())
- return QString();
-
-#ifndef QT_NO_SYSTEMLOCALE
- if (d->m_data == systemData()) {
- QVariant res = systemLocale()->query(format == LongFormat
- ? QSystemLocale::DateToStringLong : QSystemLocale::DateToStringShort,
- date);
- if (!res.isNull())
- return res.toString();
- }
-#endif
-
- QString format_str = dateFormat(format);
- return toString(date, format_str);
-}
-
-static bool timeFormatContainsAP(QStringView format)
-{
- int i = 0;
- while (i < format.size()) {
- if (format.at(i).unicode() == '\'') {
- qt_readEscapedFormatString(format, &i);
- continue;
- }
-
- if (format.at(i).toLower().unicode() == 'a')
- return true;
-
- ++i;
- }
- return false;
-}
-
-#if QT_STRINGVIEW_LEVEL < 2
-/*!
- Returns a localized string representation of the given \a time according
- to the specified \a format.
- If \a format is an empty string, an empty string is returned.
-
- \sa QTime::toString()
-*/
-QString QLocale::toString(const QTime &time, const QString &format) const
-{
- return d->dateTimeToString(format, QDateTime(), QDate(), time, this);
-}
-#endif
-
-/*!
- \since 5.10
-
- Returns a localized string representation of the given \a time according
- to the specified \a format.
- If \a format is an empty string, an empty string is returned.
-
- \sa QTime::toString()
-*/
-QString QLocale::toString(const QTime &time, QStringView format) const
-{
- return d->dateTimeToString(format, QDateTime(), QDate(), time, this);
-}
-
-#if QT_STRINGVIEW_LEVEL < 2
-/*!
- \since 4.4
-
- Returns a localized string representation of the given \a dateTime according
- to the specified \a format.
- If \a format is an empty string, an empty string is returned.
-
- \sa QDateTime::toString(), QDate::toString(), QTime::toString()
-*/
-
-QString QLocale::toString(const QDateTime &dateTime, const QString &format) const
-{
- return d->dateTimeToString(format, dateTime, QDate(), QTime(), this);
-}
-#endif
-
-/*!
- \since 5.10
-
- Returns a localized string representation of the given \a dateTime according
- to the specified \a format.
- If \a format is an empty string, an empty string is returned.
-
- \sa QDateTime::toString(), QDate::toString(), QTime::toString()
-*/
-QString QLocale::toString(const QDateTime &dateTime, QStringView format) const
-{
- return d->dateTimeToString(format, dateTime, QDate(), QTime(), this);
-}
-
-/*!
- \since 4.4
-
- Returns a localized string representation of the given \a dateTime according
- to the specified \a format.
-*/
-
-QString QLocale::toString(const QDateTime &dateTime, FormatType format) const
-{
- if (!dateTime.isValid())
- return QString();
-
-#ifndef QT_NO_SYSTEMLOCALE
- if (d->m_data == systemData()) {
- QVariant res = systemLocale()->query(format == LongFormat
- ? QSystemLocale::DateTimeToStringLong
- : QSystemLocale::DateTimeToStringShort,
- dateTime);
- if (!res.isNull())
- return res.toString();
- }
-#endif
-
- const QString format_str = dateTimeFormat(format);
- return toString(dateTime, format_str);
-}
-
-
-/*!
- Returns a localized string representation of the given \a time in the
- specified \a format.
-*/
-
-QString QLocale::toString(const QTime &time, FormatType format) const
-{
- if (!time.isValid())
- return QString();
-
-#ifndef QT_NO_SYSTEMLOCALE
- if (d->m_data == systemData()) {
- QVariant res = systemLocale()->query(format == LongFormat
- ? QSystemLocale::TimeToStringLong : QSystemLocale::TimeToStringShort,
- time);
- if (!res.isNull())
- return res.toString();
- }
-#endif
-
- QString format_str = timeFormat(format);
- return toString(time, format_str);
-}
-
-/*!
- \since 4.1
-
- Returns the date format used for the current locale.
-
- If \a format is LongFormat the format will be a long version.
- Otherwise it uses a shorter version.
-
- \sa QDate::toString(), QDate::fromString()
-*/
-
-QString QLocale::dateFormat(FormatType format) const
-{
-#ifndef QT_NO_SYSTEMLOCALE
- if (d->m_data == systemData()) {
- QVariant res = systemLocale()->query(format == LongFormat
- ? QSystemLocale::DateFormatLong : QSystemLocale::DateFormatShort,
- QVariant());
- if (!res.isNull())
- return res.toString();
- }
-#endif
-
- quint32 idx, size;
- switch (format) {
- case LongFormat:
- idx = d->m_data->m_long_date_format_idx;
- size = d->m_data->m_long_date_format_size;
- break;
- default:
- idx = d->m_data->m_short_date_format_idx;
- size = d->m_data->m_short_date_format_size;
- break;
- }
- return getLocaleData(date_format_data + idx, size);
-}
-
-/*!
- \since 4.1
-
- Returns the time format used for the current locale.
-
- If \a format is LongFormat the format will be a long version.
- Otherwise it uses a shorter version.
-
- \sa QTime::toString(), QTime::fromString()
-*/
-
-QString QLocale::timeFormat(FormatType format) const
-{
-#ifndef QT_NO_SYSTEMLOCALE
- if (d->m_data == systemData()) {
- QVariant res = systemLocale()->query(format == LongFormat
- ? QSystemLocale::TimeFormatLong : QSystemLocale::TimeFormatShort,
- QVariant());
- if (!res.isNull())
- return res.toString();
- }
-#endif
-
- quint32 idx, size;
- switch (format) {
- case LongFormat:
- idx = d->m_data->m_long_time_format_idx;
- size = d->m_data->m_long_time_format_size;
- break;
- default:
- idx = d->m_data->m_short_time_format_idx;
- size = d->m_data->m_short_time_format_size;
- break;
- }
- return getLocaleData(time_format_data + idx, size);
-}
-
-/*!
- \since 4.4
-
- Returns the date time format used for the current locale.
-
- If \a format is ShortFormat the format will be a short version.
- Otherwise it uses a longer version.
-
- \sa QDateTime::toString(), QDateTime::fromString()
-*/
-
-QString QLocale::dateTimeFormat(FormatType format) const
-{
-#ifndef QT_NO_SYSTEMLOCALE
- if (d->m_data == systemData()) {
- QVariant res = systemLocale()->query(format == LongFormat
- ? QSystemLocale::DateTimeFormatLong
- : QSystemLocale::DateTimeFormatShort,
- QVariant());
- if (!res.isNull()) {
- return res.toString();
- }
- }
-#endif
- return dateFormat(format) + QLatin1Char(' ') + timeFormat(format);
-}
-
-/*!
- \since 4.4
-
- Parses the time string given in \a string and returns the
- time. The format of the time string is chosen according to the
- \a format parameter (see timeFormat()).
-
- If the time could not be parsed, returns an invalid time.
-
- \sa timeFormat(), toDate(), toDateTime(), QTime::fromString()
-*/
-#if QT_CONFIG(datestring)
-QTime QLocale::toTime(const QString &string, FormatType format) const
-{
- return toTime(string, timeFormat(format));
-}
-#endif
-
-/*!
- \since 4.4
-
- Parses the date string given in \a string and returns the
- date. The format of the date string is chosen according to the
- \a format parameter (see dateFormat()).
-
- If the date could not be parsed, returns an invalid date.
-
- \sa dateFormat(), toTime(), toDateTime(), QDate::fromString()
-*/
-#if QT_CONFIG(datestring)
-QDate QLocale::toDate(const QString &string, FormatType format) const
-{
- return toDate(string, dateFormat(format));
-}
-#endif
-
-/*!
- \since 4.4
-
- Parses the date/time string given in \a string and returns the
- time. The format of the date/time string is chosen according to the
- \a format parameter (see dateTimeFormat()).
-
- If the string could not be parsed, returns an invalid QDateTime.
-
- \sa dateTimeFormat(), toTime(), toDate(), QDateTime::fromString()
-*/
-
-#if QT_CONFIG(datestring)
-QDateTime QLocale::toDateTime(const QString &string, FormatType format) const
-{
- return toDateTime(string, dateTimeFormat(format));
-}
-#endif
-
-/*!
- \since 4.4
-
- Parses the time string given in \a string and returns the
- time. See QTime::fromString() for information on what is a valid
- format string.
-
- If the time could not be parsed, returns an invalid time.
-
- \sa timeFormat(), toDate(), toDateTime(), QTime::fromString()
-*/
-#if QT_CONFIG(datestring)
-QTime QLocale::toTime(const QString &string, const QString &format) const
-{
- QTime time;
-#if QT_CONFIG(datetimeparser)
- QDateTimeParser dt(QVariant::Time, QDateTimeParser::FromString);
- dt.setDefaultLocale(*this);
- if (dt.parseFormat(format))
- dt.fromString(string, 0, &time);
-#else
- Q_UNUSED(string);
- Q_UNUSED(format);
-#endif
- return time;
-}
-#endif
-
-/*!
- \since 4.4
-
- Parses the date string given in \a string and returns the
- date. See QDate::fromString() for information on the expressions
- that can be used with this function.
-
- This function searches month names and the names of the days of
- the week in the current locale.
-
- If the date could not be parsed, returns an invalid date.
-
- \sa dateFormat(), toTime(), toDateTime(), QDate::fromString()
-*/
-#if QT_CONFIG(datestring)
-QDate QLocale::toDate(const QString &string, const QString &format) const
-{
- QDate date;
-#if QT_CONFIG(datetimeparser)
- QDateTimeParser dt(QVariant::Date, QDateTimeParser::FromString);
- dt.setDefaultLocale(*this);
- if (dt.parseFormat(format))
- dt.fromString(string, &date, 0);
-#else
- Q_UNUSED(string);
- Q_UNUSED(format);
-#endif
- return date;
-}
-#endif
-
-/*!
- \since 4.4
-
- Parses the date/time string given in \a string and returns the
- time. See QDateTime::fromString() for information on the expressions
- that can be used with this function.
-
- \note The month and day names used must be given in the user's local
- language.
-
- If the string could not be parsed, returns an invalid QDateTime.
-
- \sa dateTimeFormat(), toTime(), toDate(), QDateTime::fromString()
-*/
-#if QT_CONFIG(datestring)
-QDateTime QLocale::toDateTime(const QString &string, const QString &format) const
-{
-#if QT_CONFIG(datetimeparser)
- QTime time;
- QDate date;
-
- QDateTimeParser dt(QVariant::DateTime, QDateTimeParser::FromString);
- dt.setDefaultLocale(*this);
- if (dt.parseFormat(format) && dt.fromString(string, &date, &time))
- return QDateTime(date, time);
-#else
- Q_UNUSED(string);
- Q_UNUSED(format);
-#endif
- return QDateTime(QDate(), QTime(-1, -1, -1));
-}
-#endif
-
-
-/*!
- \since 4.1
-
- Returns the decimal point character of this locale.
-*/
-QChar QLocale::decimalPoint() const
-{
- return d->decimal();
-}
-
-/*!
- \since 4.1
-
- Returns the group separator character of this locale.
-*/
-QChar QLocale::groupSeparator() const
-{
- return d->group();
-}
-
-/*!
- \since 4.1
-
- Returns the percent character of this locale.
-*/
-QChar QLocale::percent() const
-{
- return d->percent();
-}
-
-/*!
- \since 4.1
-
- Returns the zero digit character of this locale.
-*/
-QChar QLocale::zeroDigit() const
-{
- return d->zero();
-}
-
-/*!
- \since 4.1
-
- Returns the negative sign character of this locale.
-*/
-QChar QLocale::negativeSign() const
-{
- return d->minus();
-}
-
-/*!
- \since 4.5
-
- Returns the positive sign character of this locale.
-*/
-QChar QLocale::positiveSign() const
-{
- return d->plus();
-}
-
-/*!
- \since 4.1
-
- Returns the exponential character of this locale.
-*/
-QChar QLocale::exponential() const
-{
- return d->exponential();
-}
-
-static bool qIsUpper(char c)
-{
- return c >= 'A' && c <= 'Z';
-}
-
-static char qToLower(char c)
-{
- if (c >= 'A' && c <= 'Z')
- return c - 'A' + 'a';
- else
- return c;
-}
-
-/*!
- \overload
-
- \a f and \a prec have the same meaning as in QString::number(double, char, int).
-
- \sa toDouble()
-*/
-
-QString QLocale::toString(double i, char f, int prec) const
-{
- QLocaleData::DoubleForm form = QLocaleData::DFDecimal;
- uint flags = 0;
-
- if (qIsUpper(f))
- flags = QLocaleData::CapitalEorX;
- f = qToLower(f);
-
- switch (f) {
- case 'f':
- form = QLocaleData::DFDecimal;
- break;
- case 'e':
- form = QLocaleData::DFExponent;
- break;
- case 'g':
- form = QLocaleData::DFSignificantDigits;
- break;
- default:
- break;
- }
-
- if (!(d->m_numberOptions & OmitGroupSeparator))
- flags |= QLocaleData::ThousandsGroup;
- if (!(d->m_numberOptions & OmitLeadingZeroInExponent))
- flags |= QLocaleData::ZeroPadExponent;
- if (d->m_numberOptions & IncludeTrailingZeroesAfterDot)
- flags |= QLocaleData::AddTrailingZeroes;
- return d->m_data->doubleToString(i, prec, form, -1, flags);
-}
-
-/*!
- \fn QLocale QLocale::c()
-
- Returns a QLocale object initialized to the "C" locale.
-
- This locale is based on en_US but with various quirks of its own, such as
- simplified number formatting and its own date formatting. It implements the
- POSIX standards that describe the behavior of standard library functions of
- the "C" programming language.
-
- Among other things, this means its collation order is based on the ASCII
- values of letters, so that (for case-sensitive sorting) all upper-case
- letters sort before any lower-case one (rather than each letter's upper- and
- lower-case forms sorting adjacent to one another, before the next letter's
- two forms).
-
- \sa system()
-*/
-
-/*!
- Returns a QLocale object initialized to the system locale.
-
- On Windows and Mac, this locale will use the decimal/grouping characters and date/time
- formats specified in the system configuration panel.
-
- \sa c()
-*/
-
-QLocale QLocale::system()
-{
- QT_PREPEND_NAMESPACE(systemData)(); // trigger updating of the system data if necessary
- if (systemLocalePrivate.isDestroyed())
- return QLocale(QLocale::C);
- return QLocale(*systemLocalePrivate->data());
-}
-
-
-/*!
- \since 4.8
-
- Returns a list of valid locale objects that match the given \a language, \a
- script and \a country.
-
- Getting a list of all locales:
- QList<QLocale> allLocales = QLocale::matchingLocales(QLocale::AnyLanguage, QLocale::AnyScript, QLocale::AnyCountry);
-
- Getting a list of locales suitable for Russia:
- QList<QLocale> locales = QLocale::matchingLocales(QLocale::AnyLanguage, QLocale::AnyScript, QLocale::Russia);
-*/
-QList<QLocale> QLocale::matchingLocales(QLocale::Language language,
- QLocale::Script script,
- QLocale::Country country)
-{
- if (uint(language) > QLocale::LastLanguage || uint(script) > QLocale::LastScript ||
- uint(country) > QLocale::LastCountry)
- return QList<QLocale>();
-
- if (language == QLocale::C)
- return QList<QLocale>() << QLocale(QLocale::C);
-
- QList<QLocale> result;
- if (language == QLocale::AnyLanguage && script == QLocale::AnyScript && country == QLocale::AnyCountry)
- result.reserve(locale_data_size);
- const QLocaleData *data = locale_data + locale_index[language];
- while ( (data != locale_data + locale_data_size)
- && (language == QLocale::AnyLanguage || data->m_language_id == uint(language))) {
- if ((script == QLocale::AnyScript || data->m_script_id == uint(script))
- && (country == QLocale::AnyCountry || data->m_country_id == uint(country))) {
- result.append(QLocale(*(data->m_language_id == C ? c_private()
- : QLocalePrivate::create(data))));
- }
- ++data;
- }
- return result;
-}
-
-/*!
- \obsolete
- \since 4.3
-
- Returns the list of countries that have entries for \a language in Qt's locale
- database. If the result is an empty list, then \a language is not represented in
- Qt's locale database.
-
- \sa matchingLocales()
-*/
-QList<QLocale::Country> QLocale::countriesForLanguage(Language language)
-{
- QList<Country> result;
- if (language == C) {
- result << AnyCountry;
- return result;
- }
-
- unsigned language_id = language;
- const QLocaleData *data = locale_data + locale_index[language_id];
- while (data->m_language_id == language_id) {
- const QLocale::Country country = static_cast<Country>(data->m_country_id);
- if (!result.contains(country))
- result.append(country);
- ++data;
- }
-
- return result;
-}
-
-/*!
- \since 4.2
-
- Returns the localized name of \a month, in the format specified
- by \a type.
-
- \sa dayName(), standaloneMonthName()
-*/
-QString QLocale::monthName(int month, FormatType type) const
-{
- if (month < 1 || month > 12)
- return QString();
-
-#ifndef QT_NO_SYSTEMLOCALE
- if (d->m_data == systemData()) {
- QVariant res = systemLocale()->query(type == LongFormat
- ? QSystemLocale::MonthNameLong : QSystemLocale::MonthNameShort,
- month);
- if (!res.isNull())
- return res.toString();
- }
-#endif
-
- quint32 idx, size;
- switch (type) {
- case QLocale::LongFormat:
- idx = d->m_data->m_long_month_names_idx;
- size = d->m_data->m_long_month_names_size;
- break;
- case QLocale::ShortFormat:
- idx = d->m_data->m_short_month_names_idx;
- size = d->m_data->m_short_month_names_size;
- break;
- case QLocale::NarrowFormat:
- idx = d->m_data->m_narrow_month_names_idx;
- size = d->m_data->m_narrow_month_names_size;
- break;
- default:
- return QString();
- }
- return getLocaleListData(months_data + idx, size, month - 1);
-}
-
-/*!
- \since 4.5
-
- Returns the localized name of \a month that is used as a
- standalone text, in the format specified by \a type.
-
- If the locale information doesn't specify the standalone month
- name then return value is the same as in monthName().
-
- \sa monthName(), standaloneDayName()
-*/
-QString QLocale::standaloneMonthName(int month, FormatType type) const
-{
- if (month < 1 || month > 12)
- return QString();
-
-#ifndef QT_NO_SYSTEMLOCALE
- if (d->m_data == systemData()) {
- QVariant res = systemLocale()->query(type == LongFormat
- ? QSystemLocale::StandaloneMonthNameLong : QSystemLocale::StandaloneMonthNameShort,
- month);
- if (!res.isNull())
- return res.toString();
- }
-#endif
-
- quint32 idx, size;
- switch (type) {
- case QLocale::LongFormat:
- idx = d->m_data->m_standalone_long_month_names_idx;
- size = d->m_data->m_standalone_long_month_names_size;
- break;
- case QLocale::ShortFormat:
- idx = d->m_data->m_standalone_short_month_names_idx;
- size = d->m_data->m_standalone_short_month_names_size;
- break;
- case QLocale::NarrowFormat:
- idx = d->m_data->m_standalone_narrow_month_names_idx;
- size = d->m_data->m_standalone_narrow_month_names_size;
- break;
- default:
- return QString();
- }
- QString name = getLocaleListData(months_data + idx, size, month - 1);
- if (name.isEmpty())
- return monthName(month, type);
- return name;
-}
-
-/*!
- \since 4.2
-
- Returns the localized name of the \a day (where 1 represents
- Monday, 2 represents Tuesday and so on), in the format specified
- by \a type.
-
- \sa monthName(), standaloneDayName()
-*/
-QString QLocale::dayName(int day, FormatType type) const
-{
- if (day < 1 || day > 7)
- return QString();
-
-#ifndef QT_NO_SYSTEMLOCALE
- if (d->m_data == systemData()) {
- QVariant res = systemLocale()->query(type == LongFormat
- ? QSystemLocale::DayNameLong : QSystemLocale::DayNameShort,
- day);
- if (!res.isNull())
- return res.toString();
- }
-#endif
- if (day == 7)
- day = 0;
-
- quint32 idx, size;
- switch (type) {
- case QLocale::LongFormat:
- idx = d->m_data->m_long_day_names_idx;
- size = d->m_data->m_long_day_names_size;
- break;
- case QLocale::ShortFormat:
- idx = d->m_data->m_short_day_names_idx;
- size = d->m_data->m_short_day_names_size;
- break;
- case QLocale::NarrowFormat:
- idx = d->m_data->m_narrow_day_names_idx;
- size = d->m_data->m_narrow_day_names_size;
- break;
- default:
- return QString();
- }
- return getLocaleListData(days_data + idx, size, day);
-}
-
-/*!
- \since 4.5
-
- Returns the localized name of the \a day (where 1 represents
- Monday, 2 represents Tuesday and so on) that is used as a
- standalone text, in the format specified by \a type.
-
- If the locale information does not specify the standalone day
- name then return value is the same as in dayName().
-
- \sa dayName(), standaloneMonthName()
-*/
-QString QLocale::standaloneDayName(int day, FormatType type) const
-{
- if (day < 1 || day > 7)
- return QString();
-
-#ifndef QT_NO_SYSTEMLOCALE
- if (d->m_data == systemData()) {
- QVariant res = systemLocale()->query(type == LongFormat
- ? QSystemLocale::DayNameLong : QSystemLocale::DayNameShort,
- day);
- if (!res.isNull())
- return res.toString();
- }
-#endif
- if (day == 7)
- day = 0;
-
- quint32 idx, size;
- switch (type) {
- case QLocale::LongFormat:
- idx = d->m_data->m_standalone_long_day_names_idx;
- size = d->m_data->m_standalone_long_day_names_size;
- break;
- case QLocale::ShortFormat:
- idx = d->m_data->m_standalone_short_day_names_idx;
- size = d->m_data->m_standalone_short_day_names_size;
- break;
- case QLocale::NarrowFormat:
- idx = d->m_data->m_standalone_narrow_day_names_idx;
- size = d->m_data->m_standalone_narrow_day_names_size;
- break;
- default:
- return QString();
- }
- QString name = getLocaleListData(days_data + idx, size, day);
- if (name.isEmpty())
- return dayName(day == 0 ? 7 : day, type);
- return name;
-}
-
-/*!
- \since 4.8
-
- Returns the first day of the week according to the current locale.
-*/
-Qt::DayOfWeek QLocale::firstDayOfWeek() const
-{
-#ifndef QT_NO_SYSTEMLOCALE
- if (d->m_data == systemData()) {
- QVariant res = systemLocale()->query(QSystemLocale::FirstDayOfWeek, QVariant());
- if (!res.isNull())
- return static_cast<Qt::DayOfWeek>(res.toUInt());
- }
-#endif
- return static_cast<Qt::DayOfWeek>(d->m_data->m_first_day_of_week);
-}
-
-QLocale::MeasurementSystem QLocalePrivate::measurementSystem() const
-{
- for (int i = 0; i < ImperialMeasurementSystemsCount; ++i) {
- if (ImperialMeasurementSystems[i].languageId == m_data->m_language_id
- && ImperialMeasurementSystems[i].countryId == m_data->m_country_id) {
- return ImperialMeasurementSystems[i].system;
- }
- }
- return QLocale::MetricSystem;
-}
-
-/*!
- \since 4.8
-
- Returns a list of days that are considered weekdays according to the current locale.
-*/
-QList<Qt::DayOfWeek> QLocale::weekdays() const
-{
-#ifndef QT_NO_SYSTEMLOCALE
- if (d->m_data == systemData()) {
- QVariant res = systemLocale()->query(QSystemLocale::Weekdays, QVariant());
- if (!res.isNull())
- return static_cast<QList<Qt::DayOfWeek> >(res.value<QList<Qt::DayOfWeek> >());
- }
-#endif
- QList<Qt::DayOfWeek> weekdays;
- quint16 weekendStart = d->m_data->m_weekend_start;
- quint16 weekendEnd = d->m_data->m_weekend_end;
- for (int day = Qt::Monday; day <= Qt::Sunday; day++) {
- if ((weekendEnd >= weekendStart && (day < weekendStart || day > weekendEnd)) ||
- (weekendEnd < weekendStart && (day > weekendEnd && day < weekendStart)))
- weekdays << static_cast<Qt::DayOfWeek>(day);
- }
- return weekdays;
-}
-
-/*!
- \since 4.4
-
- Returns the measurement system for the locale.
-*/
-QLocale::MeasurementSystem QLocale::measurementSystem() const
-{
-#ifndef QT_NO_SYSTEMLOCALE
- if (d->m_data == systemData()) {
- QVariant res = systemLocale()->query(QSystemLocale::MeasurementSystem, QVariant());
- if (!res.isNull())
- return MeasurementSystem(res.toInt());
- }
-#endif
-
- return d->measurementSystem();
-}
-
-/*!
- \since 4.7
-
- Returns the text direction of the language.
-*/
-Qt::LayoutDirection QLocale::textDirection() const
-{
- switch (script()) {
- case QLocale::AdlamScript:
- case QLocale::ArabicScript:
- case QLocale::AvestanScript:
- case QLocale::CypriotScript:
- case QLocale::HatranScript:
- case QLocale::HebrewScript:
- case QLocale::ImperialAramaicScript:
- case QLocale::InscriptionalPahlaviScript:
- case QLocale::InscriptionalParthianScript:
- case QLocale::KharoshthiScript:
- case QLocale::LydianScript:
- case QLocale::MandaeanScript:
- case QLocale::ManichaeanScript:
- case QLocale::MendeKikakuiScript:
- case QLocale::MeroiticCursiveScript:
- case QLocale::MeroiticScript:
- case QLocale::NabataeanScript:
- case QLocale::NkoScript:
- case QLocale::OldHungarianScript:
- case QLocale::OldNorthArabianScript:
- case QLocale::OldSouthArabianScript:
- case QLocale::OrkhonScript:
- case QLocale::PalmyreneScript:
- case QLocale::PhoenicianScript:
- case QLocale::PsalterPahlaviScript:
- case QLocale::SamaritanScript:
- case QLocale::SyriacScript:
- case QLocale::ThaanaScript:
- return Qt::RightToLeft;
- default:
- break;
- }
- return Qt::LeftToRight;
-}
-
-/*!
- \since 4.8
-
- Returns an uppercase copy of \a str.
-
- If Qt Core is using the ICU libraries, they will be used to perform
- the transformation according to the rules of the current locale.
- Otherwise the conversion may be done in a platform-dependent manner,
- with QString::toUpper() as a generic fallback.
-
- \sa QString::toUpper()
-*/
-QString QLocale::toUpper(const QString &str) const
-{
-#if QT_CONFIG(icu)
- bool ok = true;
- QString result = QIcu::toUpper(d->bcp47Name('_'), str, &ok);
- if (ok)
- return result;
- // else fall through and use Qt's toUpper
-#endif
- return str.toUpper();
-}
-
-/*!
- \since 4.8
-
- Returns a lowercase copy of \a str.
-
- If Qt Core is using the ICU libraries, they will be used to perform
- the transformation according to the rules of the current locale.
- Otherwise the conversion may be done in a platform-dependent manner,
- with QString::toLower() as a generic fallback.
-
- \sa QString::toLower()
-*/
-QString QLocale::toLower(const QString &str) const
-{
-#if QT_CONFIG(icu)
- bool ok = true;
- const QString result = QIcu::toLower(d->bcp47Name('_'), str, &ok);
- if (ok)
- return result;
- // else fall through and use Qt's toUpper
-#endif
- return str.toLower();
-}
-
-
-/*!
- \since 4.5
-
- Returns the localized name of the "AM" suffix for times specified using
- the conventions of the 12-hour clock.
-
- \sa pmText()
-*/
-QString QLocale::amText() const
-{
-#ifndef QT_NO_SYSTEMLOCALE
- if (d->m_data == systemData()) {
- QVariant res = systemLocale()->query(QSystemLocale::AMText, QVariant());
- if (!res.isNull())
- return res.toString();
- }
-#endif
- return getLocaleData(am_data + d->m_data->m_am_idx, d->m_data->m_am_size);
-}
-
-/*!
- \since 4.5
-
- Returns the localized name of the "PM" suffix for times specified using
- the conventions of the 12-hour clock.
-
- \sa amText()
-*/
-QString QLocale::pmText() const
-{
-#ifndef QT_NO_SYSTEMLOCALE
- if (d->m_data == systemData()) {
- QVariant res = systemLocale()->query(QSystemLocale::PMText, QVariant());
- if (!res.isNull())
- return res.toString();
- }
-#endif
- return getLocaleData(pm_data + d->m_data->m_pm_idx, d->m_data->m_pm_size);
-}
-
-
-QString QLocalePrivate::dateTimeToString(QStringView format, const QDateTime &datetime,
- const QDate &dateOnly, const QTime &timeOnly,
- const QLocale *q) const
-{
- QDate date;
- QTime time;
- bool formatDate = false;
- bool formatTime = false;
- if (datetime.isValid()) {
- date = datetime.date();
- time = datetime.time();
- formatDate = true;
- formatTime = true;
- } else if (dateOnly.isValid()) {
- date = dateOnly;
- formatDate = true;
- } else if (timeOnly.isValid()) {
- time = timeOnly;
- formatTime = true;
- } else {
- return QString();
- }
-
- QString result;
-
- int i = 0;
- while (i < format.size()) {
- if (format.at(i).unicode() == '\'') {
- result.append(qt_readEscapedFormatString(format, &i));
- continue;
- }
-
- const QChar c = format.at(i);
- int repeat = qt_repeatCount(format.mid(i));
- bool used = false;
- if (formatDate) {
- switch (c.unicode()) {
- case 'y':
- used = true;
- if (repeat >= 4)
- repeat = 4;
- else if (repeat >= 2)
- repeat = 2;
-
- switch (repeat) {
- case 4: {
- const int yr = date.year();
- const int len = (yr < 0) ? 5 : 4;
- result.append(m_data->longLongToString(yr, -1, 10, len, QLocaleData::ZeroPadded));
- break;
- }
- case 2:
- result.append(m_data->longLongToString(date.year() % 100, -1, 10, 2,
- QLocaleData::ZeroPadded));
- break;
- default:
- repeat = 1;
- result.append(c);
- break;
- }
- break;
-
- case 'M':
- used = true;
- repeat = qMin(repeat, 4);
- switch (repeat) {
- case 1:
- result.append(m_data->longLongToString(date.month()));
- break;
- case 2:
- result.append(m_data->longLongToString(date.month(), -1, 10, 2, QLocaleData::ZeroPadded));
- break;
- case 3:
- result.append(q->monthName(date.month(), QLocale::ShortFormat));
- break;
- case 4:
- result.append(q->monthName(date.month(), QLocale::LongFormat));
- break;
- }
- break;
-
- case 'd':
- used = true;
- repeat = qMin(repeat, 4);
- switch (repeat) {
- case 1:
- result.append(m_data->longLongToString(date.day()));
- break;
- case 2:
- result.append(m_data->longLongToString(date.day(), -1, 10, 2, QLocaleData::ZeroPadded));
- break;
- case 3:
- result.append(q->dayName(date.dayOfWeek(), QLocale::ShortFormat));
- break;
- case 4:
- result.append(q->dayName(date.dayOfWeek(), QLocale::LongFormat));
- break;
- }
- break;
-
- default:
- break;
- }
- }
- if (!used && formatTime) {
- switch (c.unicode()) {
- case 'h': {
- used = true;
- repeat = qMin(repeat, 2);
- int hour = time.hour();
- if (timeFormatContainsAP(format)) {
- if (hour > 12)
- hour -= 12;
- else if (hour == 0)
- hour = 12;
- }
-
- switch (repeat) {
- case 1:
- result.append(m_data->longLongToString(hour));
- break;
- case 2:
- result.append(m_data->longLongToString(hour, -1, 10, 2, QLocaleData::ZeroPadded));
- break;
- }
- break;
- }
- case 'H':
- used = true;
- repeat = qMin(repeat, 2);
- switch (repeat) {
- case 1:
- result.append(m_data->longLongToString(time.hour()));
- break;
- case 2:
- result.append(m_data->longLongToString(time.hour(), -1, 10, 2, QLocaleData::ZeroPadded));
- break;
- }
- break;
-
- case 'm':
- used = true;
- repeat = qMin(repeat, 2);
- switch (repeat) {
- case 1:
- result.append(m_data->longLongToString(time.minute()));
- break;
- case 2:
- result.append(m_data->longLongToString(time.minute(), -1, 10, 2, QLocaleData::ZeroPadded));
- break;
- }
- break;
-
- case 's':
- used = true;
- repeat = qMin(repeat, 2);
- switch (repeat) {
- case 1:
- result.append(m_data->longLongToString(time.second()));
- break;
- case 2:
- result.append(m_data->longLongToString(time.second(), -1, 10, 2, QLocaleData::ZeroPadded));
- break;
- }
- break;
-
- case 'a':
- used = true;
- if (i + 1 < format.size() && format.at(i + 1).unicode() == 'p') {
- repeat = 2;
- } else {
- repeat = 1;
- }
- result.append(time.hour() < 12 ? q->amText().toLower() : q->pmText().toLower());
- break;
-
- case 'A':
- used = true;
- if (i + 1 < format.size() && format.at(i + 1).unicode() == 'P') {
- repeat = 2;
- } else {
- repeat = 1;
- }
- result.append(time.hour() < 12 ? q->amText().toUpper() : q->pmText().toUpper());
- break;
-
- case 'z':
- used = true;
- if (repeat >= 3) {
- repeat = 3;
- } else {
- repeat = 1;
- }
-
- // note: the millisecond component is treated like the decimal part of the seconds
- // so ms == 2 is always printed as "002", but ms == 200 can be either "2" or "200"
- result.append(m_data->longLongToString(time.msec(), -1, 10, 3, QLocaleData::ZeroPadded));
- if (repeat == 1) {
- if (result.endsWith(zero()))
- result.chop(1);
- if (result.endsWith(zero()))
- result.chop(1);
- }
-
- break;
-
- case 't':
- used = true;
- repeat = 1;
- // If we have a QDateTime use the time spec otherwise use the current system tzname
- if (formatDate) {
- result.append(datetime.timeZoneAbbreviation());
- } else {
- result.append(QDateTime::currentDateTime().timeZoneAbbreviation());
- }
- break;
-
- default:
- break;
- }
- }
- if (!used) {
- result.append(QString(repeat, c));
- }
- i += repeat;
- }
-
- return result;
-}
-
-QString QLocaleData::doubleToString(double d, int precision, DoubleForm form,
- int width, unsigned flags) const
-{
- return doubleToString(m_zero, m_plus, m_minus, m_exponential, m_group, m_decimal,
- d, precision, form, width, flags);
-}
-
-QString QLocaleData::doubleToString(const QChar _zero, const QChar plus, const QChar minus,
- const QChar exponential, const QChar group, const QChar decimal,
- double d, int precision, DoubleForm form, int width, unsigned flags)
-{
- if (precision != QLocale::FloatingPointShortest && precision < 0)
- precision = 6;
- if (width < 0)
- width = 0;
-
- bool negative = false;
- QString num_str;
-
- int decpt;
- int bufSize = 1;
- if (precision == QLocale::FloatingPointShortest)
- bufSize += DoubleMaxSignificant;
- else if (form == DFDecimal) // optimize for numbers between -512k and 512k
- bufSize += ((d > (1 << 19) || d < -(1 << 19)) ? DoubleMaxDigitsBeforeDecimal : 6) +
- precision;
- else // Add extra digit due to different interpretations of precision. Also, "nan" has to fit.
- bufSize += qMax(2, precision) + 1;
-
- QVarLengthArray<char> buf(bufSize);
- int length;
-
- qt_doubleToAscii(d, form, precision, buf.data(), bufSize, negative, length, decpt);
-
- if (qstrncmp(buf.data(), "inf", 3) == 0 || qstrncmp(buf.data(), "nan", 3) == 0) {
- num_str = QString::fromLatin1(buf.data(), length);
- } else { // Handle normal numbers
- QString digits = QString::fromLatin1(buf.data(), length);
-
- if (_zero.unicode() != '0') {
- ushort z = _zero.unicode() - '0';
- for (int i = 0; i < digits.length(); ++i)
- reinterpret_cast<ushort *>(digits.data())[i] += z;
- }
-
- bool always_show_decpt = (flags & ForcePoint);
- switch (form) {
- case DFExponent: {
- num_str = exponentForm(_zero, decimal, exponential, group, plus, minus,
- digits, decpt, precision, PMDecimalDigits,
- always_show_decpt, flags & ZeroPadExponent);
- break;
- }
- case DFDecimal: {
- num_str = decimalForm(_zero, decimal, group,
- digits, decpt, precision, PMDecimalDigits,
- always_show_decpt, flags & ThousandsGroup);
- break;
- }
- case DFSignificantDigits: {
- PrecisionMode mode = (flags & AddTrailingZeroes) ?
- PMSignificantDigits : PMChopTrailingZeros;
-
- int cutoff = precision < 0 ? 6 : precision;
- // Find out which representation is shorter
- if (precision == QLocale::FloatingPointShortest && decpt > 0) {
- cutoff = digits.length() + 4; // 'e', '+'/'-', one digit exponent
- if (decpt <= 10) {
- ++cutoff;
- } else {
- cutoff += decpt > 100 ? 2 : 1;
- }
- if (!always_show_decpt && digits.length() > decpt)
- ++cutoff; // decpt shown in exponent form, but not in decimal form
- }
-
- if (decpt != digits.length() && (decpt <= -4 || decpt > cutoff))
- num_str = exponentForm(_zero, decimal, exponential, group, plus, minus,
- digits, decpt, precision, mode,
- always_show_decpt, flags & ZeroPadExponent);
- else
- num_str = decimalForm(_zero, decimal, group,
- digits, decpt, precision, mode,
- always_show_decpt, flags & ThousandsGroup);
- break;
- }
- }
-
- if (isZero(d))
- negative = false;
-
- // pad with zeros. LeftAdjusted overrides this flag). Also, we don't
- // pad special numbers
- if (flags & QLocaleData::ZeroPadded && !(flags & QLocaleData::LeftAdjusted)) {
- int num_pad_chars = width - num_str.length();
- // leave space for the sign
- if (negative
- || flags & QLocaleData::AlwaysShowSign
- || flags & QLocaleData::BlankBeforePositive)
- --num_pad_chars;
-
- for (int i = 0; i < num_pad_chars; ++i)
- num_str.prepend(_zero);
- }
- }
-
- // add sign
- if (negative)
- num_str.prepend(minus);
- else if (flags & QLocaleData::AlwaysShowSign)
- num_str.prepend(plus);
- else if (flags & QLocaleData::BlankBeforePositive)
- num_str.prepend(QLatin1Char(' '));
-
- if (flags & QLocaleData::CapitalEorX)
- num_str = std::move(num_str).toUpper();
-
- return num_str;
-}
-
-QString QLocaleData::longLongToString(qlonglong l, int precision,
- int base, int width,
- unsigned flags) const
-{
- return longLongToString(m_zero, m_group, m_plus, m_minus,
- l, precision, base, width, flags);
-}
-
-QString QLocaleData::longLongToString(const QChar zero, const QChar group,
- const QChar plus, const QChar minus,
- qlonglong l, int precision,
- int base, int width,
- unsigned flags)
-{
- bool precision_not_specified = false;
- if (precision == -1) {
- precision_not_specified = true;
- precision = 1;
- }
-
- bool negative = l < 0;
- if (base != 10) {
- // these are not supported by sprintf for octal and hex
- flags &= ~AlwaysShowSign;
- flags &= ~BlankBeforePositive;
- negative = false; // neither are negative numbers
- }
-
-QT_WARNING_PUSH
- /* "unary minus operator applied to unsigned type, result still unsigned" */
-QT_WARNING_DISABLE_MSVC(4146)
- /*
- Negating std::numeric_limits<qlonglong>::min() hits undefined behavior, so
- taking an absolute value has to cast to unsigned to change sign.
- */
- QString num_str = qulltoa(negative ? -qulonglong(l) : qulonglong(l), base, zero);
-QT_WARNING_POP
-
- uint cnt_thousand_sep = 0;
- if (flags & ThousandsGroup && base == 10) {
- for (int i = num_str.length() - 3; i > 0; i -= 3) {
- num_str.insert(i, group);
- ++cnt_thousand_sep;
- }
- }
-
- for (int i = num_str.length()/* - cnt_thousand_sep*/; i < precision; ++i)
- num_str.prepend(base == 10 ? zero : QChar::fromLatin1('0'));
-
- if ((flags & ShowBase)
- && base == 8
- && (num_str.isEmpty() || num_str[0].unicode() != QLatin1Char('0')))
- num_str.prepend(QLatin1Char('0'));
-
- // LeftAdjusted overrides this flag ZeroPadded. sprintf only padds
- // when precision is not specified in the format string
- bool zero_padded = flags & ZeroPadded
- && !(flags & LeftAdjusted)
- && precision_not_specified;
-
- if (zero_padded) {
- int num_pad_chars = width - num_str.length();
-
- // leave space for the sign
- if (negative
- || flags & AlwaysShowSign
- || flags & BlankBeforePositive)
- --num_pad_chars;
-
- // leave space for optional '0x' in hex form
- if (base == 16 && (flags & ShowBase))
- num_pad_chars -= 2;
- // leave space for optional '0b' in binary form
- else if (base == 2 && (flags & ShowBase))
- num_pad_chars -= 2;
-
- for (int i = 0; i < num_pad_chars; ++i)
- num_str.prepend(base == 10 ? zero : QChar::fromLatin1('0'));
- }
-
- if (flags & CapitalEorX)
- num_str = std::move(num_str).toUpper();
-
- if (base == 16 && (flags & ShowBase))
- num_str.prepend(QLatin1String(flags & UppercaseBase ? "0X" : "0x"));
- if (base == 2 && (flags & ShowBase))
- num_str.prepend(QLatin1String(flags & UppercaseBase ? "0B" : "0b"));
-
- // add sign
- if (negative)
- num_str.prepend(minus);
- else if (flags & AlwaysShowSign)
- num_str.prepend(plus);
- else if (flags & BlankBeforePositive)
- num_str.prepend(QLatin1Char(' '));
-
- return num_str;
-}
-
-QString QLocaleData::unsLongLongToString(qulonglong l, int precision,
- int base, int width,
- unsigned flags) const
-{
- return unsLongLongToString(m_zero, m_group, m_plus,
- l, precision, base, width, flags);
-}
-
-QString QLocaleData::unsLongLongToString(const QChar zero, const QChar group,
- const QChar plus,
- qulonglong l, int precision,
- int base, int width,
- unsigned flags)
-{
- const QChar resultZero = base == 10 ? zero : QChar(QLatin1Char('0'));
- QString num_str = l ? qulltoa(l, base, zero) : QString(resultZero);
-
- bool precision_not_specified = false;
- if (precision == -1) {
- if (flags == NoFlags)
- return num_str; // fast-path: nothing below applies, so we're done.
-
- precision_not_specified = true;
- precision = 1;
- }
-
- uint cnt_thousand_sep = 0;
- if (flags & ThousandsGroup && base == 10) {
- for (int i = num_str.length() - 3; i > 0; i -=3) {
- num_str.insert(i, group);
- ++cnt_thousand_sep;
- }
- }
-
- const int zeroPadding = precision - num_str.length()/* + cnt_thousand_sep*/;
- if (zeroPadding > 0)
- num_str.prepend(QString(zeroPadding, resultZero));
-
- if ((flags & ShowBase)
- && base == 8
- && (num_str.isEmpty() || num_str.at(0).unicode() != QLatin1Char('0')))
- num_str.prepend(QLatin1Char('0'));
-
- // LeftAdjusted overrides this flag ZeroPadded. sprintf only padds
- // when precision is not specified in the format string
- bool zero_padded = flags & ZeroPadded
- && !(flags & LeftAdjusted)
- && precision_not_specified;
-
- if (zero_padded) {
- int num_pad_chars = width - num_str.length();
-
- // leave space for optional '0x' in hex form
- if (base == 16 && flags & ShowBase)
- num_pad_chars -= 2;
- // leave space for optional '0b' in binary form
- else if (base == 2 && flags & ShowBase)
- num_pad_chars -= 2;
-
- if (num_pad_chars > 0)
- num_str.prepend(QString(num_pad_chars, resultZero));
- }
-
- if (flags & CapitalEorX)
- num_str = std::move(num_str).toUpper();
-
- if (base == 16 && flags & ShowBase)
- num_str.prepend(QLatin1String(flags & UppercaseBase ? "0X" : "0x"));
- else if (base == 2 && flags & ShowBase)
- num_str.prepend(QLatin1String(flags & UppercaseBase ? "0B" : "0b"));
-
- // add sign
- if (flags & AlwaysShowSign)
- num_str.prepend(plus);
- else if (flags & BlankBeforePositive)
- num_str.prepend(QLatin1Char(' '));
-
- return num_str;
-}
-
-/*
- Converts a number in locale to its representation in the C locale.
- Only has to guarantee that a string that is a correct representation of
- a number will be converted. If junk is passed in, junk will be passed
- out and the error will be detected during the actual conversion to a
- number. We can't detect junk here, since we don't even know the base
- of the number.
-*/
-bool QLocaleData::numberToCLocale(QStringView s, QLocale::NumberOptions number_options,
- CharBuff *result) const
-{
- const QChar *uc = s.data();
- auto l = s.size();
- decltype(l) idx = 0;
-
- // Skip whitespace
- while (idx < l && uc[idx].isSpace())
- ++idx;
- if (idx == l)
- return false;
-
- // Check trailing whitespace
- for (; idx < l; --l) {
- if (!uc[l - 1].isSpace())
- break;
- }
-
- int group_cnt = 0; // counts number of group chars
- int decpt_idx = -1;
- int last_separator_idx = -1;
- int start_of_digits_idx = -1;
- int exponent_idx = -1;
-
- while (idx < l) {
- const QChar in = uc[idx];
-
- char out = digitToCLocale(in);
- if (out == 0) {
- if (in == m_list)
- out = ';';
- else if (in == m_percent)
- out = '%';
- // for handling base-x numbers
- else if (in.unicode() >= 'A' && in.unicode() <= 'Z')
- out = in.toLower().toLatin1();
- else if (in.unicode() >= 'a' && in.unicode() <= 'z')
- out = in.toLatin1();
- else
- break;
- } else if (out == '.') {
- // Fail if more than one decimal point or point after e
- if (decpt_idx != -1 || exponent_idx != -1)
- return false;
- decpt_idx = idx;
- } else if (out == 'e' || out == 'E') {
- exponent_idx = idx;
- }
-
- if (number_options & QLocale::RejectLeadingZeroInExponent) {
- if (exponent_idx != -1 && out == '0' && idx < l - 1) {
- // After the exponent there can only be '+', '-' or digits.
- // If we find a '0' directly after some non-digit, then that is a leading zero.
- if (result->last() < '0' || result->last() > '9')
- return false;
- }
- }
-
- if (number_options & QLocale::RejectTrailingZeroesAfterDot) {
- // If we've seen a decimal point and the last character after the exponent is 0, then
- // that is a trailing zero.
- if (decpt_idx >= 0 && idx == exponent_idx && result->last() == '0')
- return false;
- }
-
- if (!(number_options & QLocale::RejectGroupSeparator)) {
- if (start_of_digits_idx == -1 && out >= '0' && out <= '9') {
- start_of_digits_idx = idx;
- } else if (out == ',') {
- // Don't allow group chars after the decimal point or exponent
- if (decpt_idx != -1 || exponent_idx != -1)
- return false;
-
- // check distance from the last separator or from the beginning of the digits
- // ### FIXME: Some locales allow other groupings! See https://en.wikipedia.org/wiki/Thousands_separator
- if (last_separator_idx != -1 && idx - last_separator_idx != 4)
- return false;
- if (last_separator_idx == -1 && (start_of_digits_idx == -1 || idx - start_of_digits_idx > 3))
- return false;
-
- last_separator_idx = idx;
- ++group_cnt;
-
- // don't add the group separator
- ++idx;
- continue;
- } else if (out == '.' || out == 'e' || out == 'E') {
- // check distance from the last separator
- // ### FIXME: Some locales allow other groupings! See https://en.wikipedia.org/wiki/Thousands_separator
- if (last_separator_idx != -1 && idx - last_separator_idx != 4)
- return false;
-
- // stop processing separators
- last_separator_idx = -1;
- }
- }
-
- result->append(out);
-
- ++idx;
- }
-
- if (!(number_options & QLocale::RejectGroupSeparator)) {
- // group separator post-processing
- // did we end in a separator?
- if (last_separator_idx + 1 == idx)
- return false;
- // were there enough digits since the last separator?
- if (last_separator_idx != -1 && idx - last_separator_idx != 4)
- return false;
- }
-
- if (number_options & QLocale::RejectTrailingZeroesAfterDot) {
- // In decimal form, the last character can be a trailing zero if we've seen a decpt.
- if (decpt_idx != -1 && exponent_idx == -1 && result->last() == '0')
- return false;
- }
-
- result->append('\0');
- return idx == l;
-}
-
-bool QLocaleData::validateChars(QStringView str, NumberMode numMode, QByteArray *buff,
- int decDigits, QLocale::NumberOptions number_options) const
-{
- buff->clear();
- buff->reserve(str.length());
-
- const bool scientific = numMode == DoubleScientificMode;
- bool lastWasE = false;
- bool lastWasDigit = false;
- int eCnt = 0;
- int decPointCnt = 0;
- bool dec = false;
- int decDigitCnt = 0;
-
- for (qsizetype i = 0; i < str.size(); ++i) {
- char c = digitToCLocale(str.at(i));
-
- if (c >= '0' && c <= '9') {
- if (numMode != IntegerMode) {
- // If a double has too many digits after decpt, it shall be Invalid.
- if (dec && decDigits != -1 && decDigits < ++decDigitCnt)
- return false;
- }
-
- // The only non-digit character after the 'e' can be '+' or '-'.
- // If a zero is directly after that, then the exponent is zero-padded.
- if ((number_options & QLocale::RejectLeadingZeroInExponent) && c == '0' && eCnt > 0 &&
- !lastWasDigit)
- return false;
-
- lastWasDigit = true;
- } else {
- switch (c) {
- case '.':
- if (numMode == IntegerMode) {
- // If an integer has a decimal point, it shall be Invalid.
- return false;
- } else {
- // If a double has more than one decimal point, it shall be Invalid.
- if (++decPointCnt > 1)
- return false;
-#if 0
- // If a double with no decimal digits has a decimal point, it shall be
- // Invalid.
- if (decDigits == 0)
- return false;
-#endif // On second thoughts, it shall be Valid.
-
- dec = true;
- }
- break;
-
- case '+':
- case '-':
- if (scientific) {
- // If a scientific has a sign that's not at the beginning or after
- // an 'e', it shall be Invalid.
- if (i != 0 && !lastWasE)
- return false;
- } else {
- // If a non-scientific has a sign that's not at the beginning,
- // it shall be Invalid.
- if (i != 0)
- return false;
- }
- break;
-
- case ',':
- //it can only be placed after a digit which is before the decimal point
- if ((number_options & QLocale::RejectGroupSeparator) || !lastWasDigit ||
- decPointCnt > 0)
- return false;
- break;
-
- case 'e':
- if (scientific) {
- // If a scientific has more than one 'e', it shall be Invalid.
- if (++eCnt > 1)
- return false;
- dec = false;
- } else {
- // If a non-scientific has an 'e', it shall be Invalid.
- return false;
- }
- break;
-
- default:
- // If it's not a valid digit, it shall be Invalid.
- return false;
- }
- lastWasDigit = false;
- }
-
- lastWasE = c == 'e';
- if (c != ',')
- buff->append(c);
- }
-
- return true;
-}
-
-double QLocaleData::stringToDouble(QStringView str, bool *ok,
- QLocale::NumberOptions number_options) const
-{
- CharBuff buff;
- if (!numberToCLocale(str, number_options, &buff)) {
- if (ok != nullptr)
- *ok = false;
- return 0.0;
- }
- int processed = 0;
- bool nonNullOk = false;
- double d = qt_asciiToDouble(buff.constData(), buff.length() - 1, nonNullOk, processed);
- if (ok != nullptr)
- *ok = nonNullOk;
- return d;
-}
-
-qlonglong QLocaleData::stringToLongLong(QStringView str, int base, bool *ok,
- QLocale::NumberOptions number_options) const
-{
- CharBuff buff;
- if (!numberToCLocale(str, number_options, &buff)) {
- if (ok != nullptr)
- *ok = false;
- return 0;
- }
-
- return bytearrayToLongLong(buff.constData(), base, ok);
-}
-
-qulonglong QLocaleData::stringToUnsLongLong(QStringView str, int base, bool *ok,
- QLocale::NumberOptions number_options) const
-{
- CharBuff buff;
- if (!numberToCLocale(str, number_options, &buff)) {
- if (ok != nullptr)
- *ok = false;
- return 0;
- }
-
- return bytearrayToUnsLongLong(buff.constData(), base, ok);
-}
-
-double QLocaleData::bytearrayToDouble(const char *num, bool *ok)
-{
- bool nonNullOk = false;
- int len = static_cast<int>(strlen(num));
- Q_ASSERT(len >= 0);
- int processed = 0;
- double d = qt_asciiToDouble(num, len, nonNullOk, processed);
- if (ok != nullptr)
- *ok = nonNullOk;
- return d;
-}
-
-qlonglong QLocaleData::bytearrayToLongLong(const char *num, int base, bool *ok)
-{
- bool _ok;
- const char *endptr;
-
- if (*num == '\0') {
- if (ok != nullptr)
- *ok = false;
- return 0;
- }
-
- qlonglong l = qstrtoll(num, &endptr, base, &_ok);
-
- if (!_ok) {
- if (ok != nullptr)
- *ok = false;
- return 0;
- }
-
- if (*endptr != '\0') {
- while (ascii_isspace(*endptr))
- ++endptr;
- }
-
- if (*endptr != '\0') {
- // we stopped at a non-digit character after converting some digits
- if (ok != nullptr)
- *ok = false;
- return 0;
- }
-
- if (ok != nullptr)
- *ok = true;
- return l;
-}
-
-qulonglong QLocaleData::bytearrayToUnsLongLong(const char *num, int base, bool *ok)
-{
- bool _ok;
- const char *endptr;
- qulonglong l = qstrtoull(num, &endptr, base, &_ok);
-
- if (!_ok) {
- if (ok != nullptr)
- *ok = false;
- return 0;
- }
-
- if (*endptr != '\0') {
- while (ascii_isspace(*endptr))
- ++endptr;
- }
-
- if (*endptr != '\0') {
- if (ok != nullptr)
- *ok = false;
- return 0;
- }
-
- if (ok != nullptr)
- *ok = true;
- return l;
-}
-
-/*!
- \since 4.8
-
- \enum QLocale::CurrencySymbolFormat
-
- Specifies the format of the currency symbol.
-
- \value CurrencyIsoCode a ISO-4217 code of the currency.
- \value CurrencySymbol a currency symbol.
- \value CurrencyDisplayName a user readable name of the currency.
-*/
-
-/*!
- \since 4.8
- Returns a currency symbol according to the \a format.
-*/
-QString QLocale::currencySymbol(QLocale::CurrencySymbolFormat format) const
-{
-#ifndef QT_NO_SYSTEMLOCALE
- if (d->m_data == systemData()) {
- QVariant res = systemLocale()->query(QSystemLocale::CurrencySymbol, format);
- if (!res.isNull())
- return res.toString();
- }
-#endif
- quint32 idx, size;
- switch (format) {
- case CurrencySymbol:
- idx = d->m_data->m_currency_symbol_idx;
- size = d->m_data->m_currency_symbol_size;
- return getLocaleData(currency_symbol_data + idx, size);
- case CurrencyDisplayName:
- idx = d->m_data->m_currency_display_name_idx;
- size = d->m_data->m_currency_display_name_size;
- return getLocaleListData(currency_display_name_data + idx, size, 0);
- case CurrencyIsoCode: {
- int len = 0;
- const QLocaleData *data = this->d->m_data;
- for (; len < 3; ++len)
- if (!data->m_currency_iso_code[len])
- break;
- return len ? QString::fromLatin1(data->m_currency_iso_code, len) : QString();
- }
- }
- return QString();
-}
-
-/*!
- \since 4.8
-
- Returns a localized string representation of \a value as a currency.
- If the \a symbol is provided it is used instead of the default currency symbol.
-
- \sa currencySymbol()
-*/
-QString QLocale::toCurrencyString(qlonglong value, const QString &symbol) const
-{
-#ifndef QT_NO_SYSTEMLOCALE
- if (d->m_data == systemData()) {
- QSystemLocale::CurrencyToStringArgument arg(value, symbol);
- QVariant res = systemLocale()->query(QSystemLocale::CurrencyToString, QVariant::fromValue(arg));
- if (!res.isNull())
- return res.toString();
- }
-#endif
- const QLocalePrivate *d = this->d;
- quint8 idx = d->m_data->m_currency_format_idx;
- quint8 size = d->m_data->m_currency_format_size;
- if (d->m_data->m_currency_negative_format_size && value < 0) {
- idx = d->m_data->m_currency_negative_format_idx;
- size = d->m_data->m_currency_negative_format_size;
- value = -value;
- }
- QString str = toString(value);
- QString sym = symbol.isNull() ? currencySymbol() : symbol;
- if (sym.isEmpty())
- sym = currencySymbol(QLocale::CurrencyIsoCode);
- QString format = getLocaleData(currency_format_data + idx, size);
- return format.arg(str, sym);
-}
-
-/*!
- \since 4.8
- \overload
-*/
-QString QLocale::toCurrencyString(qulonglong value, const QString &symbol) const
-{
-#ifndef QT_NO_SYSTEMLOCALE
- if (d->m_data == systemData()) {
- QSystemLocale::CurrencyToStringArgument arg(value, symbol);
- QVariant res = systemLocale()->query(QSystemLocale::CurrencyToString, QVariant::fromValue(arg));
- if (!res.isNull())
- return res.toString();
- }
-#endif
- const QLocaleData *data = this->d->m_data;
- quint8 idx = data->m_currency_format_idx;
- quint8 size = data->m_currency_format_size;
- QString str = toString(value);
- QString sym = symbol.isNull() ? currencySymbol() : symbol;
- if (sym.isEmpty())
- sym = currencySymbol(QLocale::CurrencyIsoCode);
- QString format = getLocaleData(currency_format_data + idx, size);
- return format.arg(str, sym);
-}
-
-#if QT_VERSION < QT_VERSION_CHECK(6,0,0)
-/*!
- \since 4.8
- \overload
-*/
-QString QLocale::toCurrencyString(double value, const QString &symbol) const
-{
- return toCurrencyString(value, symbol, d->m_data->m_currency_digits);
-}
-#endif
-
-/*!
- \since 5.7
- \overload toCurrencyString()
-
- Returns a localized string representation of \a value as a currency.
- If the \a symbol is provided it is used instead of the default currency symbol.
- If the \a precision is provided it is used to set the precision of the currency value.
-
- \sa currencySymbol()
- */
-QString QLocale::toCurrencyString(double value, const QString &symbol, int precision) const
-{
-#ifndef QT_NO_SYSTEMLOCALE
- if (d->m_data == systemData()) {
- QSystemLocale::CurrencyToStringArgument arg(value, symbol);
- QVariant res = systemLocale()->query(QSystemLocale::CurrencyToString, QVariant::fromValue(arg));
- if (!res.isNull())
- return res.toString();
- }
-#endif
- const QLocaleData *data = this->d->m_data;
- quint8 idx = data->m_currency_format_idx;
- quint8 size = data->m_currency_format_size;
- if (data->m_currency_negative_format_size && value < 0) {
- idx = data->m_currency_negative_format_idx;
- size = data->m_currency_negative_format_size;
- value = -value;
- }
- QString str = toString(value, 'f', precision == -1 ? d->m_data->m_currency_digits : precision);
- QString sym = symbol.isNull() ? currencySymbol() : symbol;
- if (sym.isEmpty())
- sym = currencySymbol(QLocale::CurrencyIsoCode);
- QString format = getLocaleData(currency_format_data + idx, size);
- return format.arg(str, sym);
-}
-
-/*!
- \fn QString QLocale::toCurrencyString(float i, const QString &symbol) const
- \fn QString QLocale::toCurrencyString(float i, const QString &symbol, int precision) const
- \overload toCurrencyString()
-*/
-
-/*!
- \since 5.10
-
- \enum QLocale::DataSizeFormat
-
- Specifies the format for representation of data quantities.
-
- \omitvalue DataSizeBase1000
- \omitvalue DataSizeSIQuantifiers
- \value DataSizeIecFormat format using base 1024 and IEC prefixes: KiB, MiB, GiB, ...
- \value DataSizeTraditionalFormat format using base 1024 and SI prefixes: kB, MB, GB, ...
- \value DataSizeSIFormat format using base 1000 and SI prefixes: kB, MB, GB, ...
-
- \sa formattedDataSize()
-*/
-
-#if QT_VERSION < QT_VERSION_CHECK(6, 0, 0)
-/*!
- \obsolete
-
- Use the const version instead.
-*/
-QString QLocale::formattedDataSize(qint64 bytes, int precision, DataSizeFormats format)
-{
- const auto *that = this;
- return that->formattedDataSize(bytes, precision, format);
-}
-#endif
-
-/*!
- \since 5.10
-
- Converts a size in bytes to a human-readable localized string, comprising a
- number and a quantified unit. The quantifier is chosen such that the number
- is at least one, and as small as possible. For example if \a bytes is
- 16384, \a precision is 2, and \a format is \l DataSizeIecFormat (the
- default), this function returns "16.00 KiB"; for 1330409069609 bytes it
- returns "1.21 GiB"; and so on. If \a format is \l DataSizeIecFormat or
- \l DataSizeTraditionalFormat, the given number of bytes is divided by a
- power of 1024, with result less than 1024; for \l DataSizeSIFormat, it is
- divided by a power of 1000, with result less than 1000.
- \c DataSizeIecFormat uses the new IEC standard quantifiers Ki, Mi and so on,
- whereas \c DataSizeSIFormat uses the older SI quantifiers k, M, etc., and
- \c DataSizeTraditionalFormat abuses them.
-*/
-QString QLocale::formattedDataSize(qint64 bytes, int precision, DataSizeFormats format) const
-{
- int power, base = 1000;
- if (!bytes) {
- power = 0;
- } else if (format & DataSizeBase1000) {
- power = int(std::log10(qAbs(bytes)) / 3);
- } else { // Compute log2(bytes) / 10:
- power = int((63 - qCountLeadingZeroBits(quint64(qAbs(bytes)))) / 10);
- base = 1024;
- }
- // Only go to doubles if we'll be using a quantifier:
- const QString number = power
- ? toString(bytes / std::pow(double(base), power), 'f', qMin(precision, 3 * power))
- : toString(bytes);
-
- // We don't support sizes in units larger than exbibytes because
- // the number of bytes would not fit into qint64.
- Q_ASSERT(power <= 6 && power >= 0);
- QString unit;
- if (power > 0) {
- quint16 index, size;
- if (format & DataSizeSIQuantifiers) {
- index = d->m_data->m_byte_si_quantified_idx;
- size = d->m_data->m_byte_si_quantified_size;
- } else {
- index = d->m_data->m_byte_iec_quantified_idx;
- size = d->m_data->m_byte_iec_quantified_size;
- }
- unit = getLocaleListData(byte_unit_data + index, size, power - 1);
- } else {
- unit = getLocaleData(byte_unit_data + d->m_data->m_byte_idx, d->m_data->m_byte_size);
- }
-
- return number + QLatin1Char(' ') + unit;
-}
-
-/*!
- \since 4.8
-
- Returns an ordered list of locale names for translation purposes in
- preference order (like "en-Latn-US", "en-US", "en").
-
- The return value represents locale names that the user expects to see the
- UI translation in.
-
- Most like you do not need to use this function directly, but just pass the
- QLocale object to the QTranslator::load() function.
-
- The first item in the list is the most preferred one.
-
- \sa QTranslator, bcp47Name()
-*/
-QStringList QLocale::uiLanguages() const
-{
-#ifndef QT_NO_SYSTEMLOCALE
- if (d->m_data == systemData()) {
- QVariant res = systemLocale()->query(QSystemLocale::UILanguages, QVariant());
- if (!res.isNull()) {
- QStringList result = res.toStringList();
- if (!result.isEmpty())
- return result;
- }
- }
-#endif
- QLocaleId id = QLocaleId::fromIds(d->m_data->m_language_id, d->m_data->m_script_id, d->m_data->m_country_id);
- const QLocaleId max = id.withLikelySubtagsAdded();
- const QLocaleId min = max.withLikelySubtagsRemoved();
-
- QStringList uiLanguages;
- uiLanguages.append(QString::fromLatin1(min.name()));
- if (id.script_id) {
- id.script_id = 0;
- if (id != min && id.withLikelySubtagsAdded() == max)
- uiLanguages.append(QString::fromLatin1(id.name()));
- }
- if (max != min && max != id)
- uiLanguages.append(QString::fromLatin1(max.name()));
- return uiLanguages;
-}
-
-/*!
- \since 4.8
-
- Returns a native name of the language for the locale. For example
- "Schwiizertüütsch" for Swiss-German locale.
-
- \sa nativeCountryName(), languageToString()
-*/
-QString QLocale::nativeLanguageName() const
-{
-#ifndef QT_NO_SYSTEMLOCALE
- if (d->m_data == systemData()) {
- QVariant res = systemLocale()->query(QSystemLocale::NativeLanguageName, QVariant());
- if (!res.isNull())
- return res.toString();
- }
-#endif
- return getLocaleData(endonyms_data + d->m_data->m_language_endonym_idx, d->m_data->m_language_endonym_size);
-}
-
-/*!
- \since 4.8
-
- Returns a native name of the country for the locale. For example
- "España" for Spanish/Spain locale.
-
- \sa nativeLanguageName(), countryToString()
-*/
-QString QLocale::nativeCountryName() const
-{
-#ifndef QT_NO_SYSTEMLOCALE
- if (d->m_data == systemData()) {
- QVariant res = systemLocale()->query(QSystemLocale::NativeCountryName, QVariant());
- if (!res.isNull())
- return res.toString();
- }
-#endif
- return getLocaleData(endonyms_data + d->m_data->m_country_endonym_idx, d->m_data->m_country_endonym_size);
-}
-
-#ifndef QT_NO_DEBUG_STREAM
-QDebug operator<<(QDebug dbg, const QLocale &l)
-{
- QDebugStateSaver saver(dbg);
- dbg.nospace().noquote()
- << "QLocale(" << QLocale::languageToString(l.language())
- << ", " << QLocale::scriptToString(l.script())
- << ", " << QLocale::countryToString(l.country()) << ')';
- return dbg;
-}
-#endif
-QT_END_NAMESPACE
-
-#ifndef QT_NO_QOBJECT
-#include "moc_qlocale.cpp"
-#endif
diff --git a/src/corelib/tools/qlocale.h b/src/corelib/tools/qlocale.h
deleted file mode 100644
index 2b4f131552..0000000000
--- a/src/corelib/tools/qlocale.h
+++ /dev/null
@@ -1,1153 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#ifndef QLOCALE_H
-#define QLOCALE_H
-
-#include <QtCore/qvariant.h>
-#include <QtCore/qstring.h>
-#include <QtCore/qobjectdefs.h>
-#include <QtCore/qshareddata.h>
-
-QT_BEGIN_NAMESPACE
-
-
-class QDataStream;
-class QDate;
-class QDateTime;
-class QLocale;
-class QTime;
-class QVariant;
-class QTextStream;
-class QTextStreamPrivate;
-
-class QLocalePrivate;
-
-Q_CORE_EXPORT uint qHash(const QLocale &key, uint seed = 0) Q_DECL_NOTHROW;
-
-class Q_CORE_EXPORT QLocale
-{
- Q_GADGET
- friend class QString;
- friend class QStringRef;
- friend class QByteArray;
- friend class QIntValidator;
- friend class QDoubleValidatorPrivate;
- friend class QTextStream;
- friend class QTextStreamPrivate;
-
-public:
-// GENERATED PART STARTS HERE
-// see qlocale_data_p.h for more info on generated data
- enum Language {
- AnyLanguage = 0,
- C = 1,
- Abkhazian = 2,
- Oromo = 3,
- Afar = 4,
- Afrikaans = 5,
- Albanian = 6,
- Amharic = 7,
- Arabic = 8,
- Armenian = 9,
- Assamese = 10,
- Aymara = 11,
- Azerbaijani = 12,
- Bashkir = 13,
- Basque = 14,
- Bengali = 15,
- Dzongkha = 16,
- Bihari = 17,
- Bislama = 18,
- Breton = 19,
- Bulgarian = 20,
- Burmese = 21,
- Belarusian = 22,
- Khmer = 23,
- Catalan = 24,
- Chinese = 25,
- Corsican = 26,
- Croatian = 27,
- Czech = 28,
- Danish = 29,
- Dutch = 30,
- English = 31,
- Esperanto = 32,
- Estonian = 33,
- Faroese = 34,
- Fijian = 35,
- Finnish = 36,
- French = 37,
- WesternFrisian = 38,
- Gaelic = 39,
- Galician = 40,
- Georgian = 41,
- German = 42,
- Greek = 43,
- Greenlandic = 44,
- Guarani = 45,
- Gujarati = 46,
- Hausa = 47,
- Hebrew = 48,
- Hindi = 49,
- Hungarian = 50,
- Icelandic = 51,
- Indonesian = 52,
- Interlingua = 53,
- Interlingue = 54,
- Inuktitut = 55,
- Inupiak = 56,
- Irish = 57,
- Italian = 58,
- Japanese = 59,
- Javanese = 60,
- Kannada = 61,
- Kashmiri = 62,
- Kazakh = 63,
- Kinyarwanda = 64,
- Kirghiz = 65,
- Korean = 66,
- Kurdish = 67,
- Rundi = 68,
- Lao = 69,
- Latin = 70,
- Latvian = 71,
- Lingala = 72,
- Lithuanian = 73,
- Macedonian = 74,
- Malagasy = 75,
- Malay = 76,
- Malayalam = 77,
- Maltese = 78,
- Maori = 79,
- Marathi = 80,
- Marshallese = 81,
- Mongolian = 82,
- NauruLanguage = 83,
- Nepali = 84,
- NorwegianBokmal = 85,
- Occitan = 86,
- Oriya = 87,
- Pashto = 88,
- Persian = 89,
- Polish = 90,
- Portuguese = 91,
- Punjabi = 92,
- Quechua = 93,
- Romansh = 94,
- Romanian = 95,
- Russian = 96,
- Samoan = 97,
- Sango = 98,
- Sanskrit = 99,
- Serbian = 100,
- Ossetic = 101,
- SouthernSotho = 102,
- Tswana = 103,
- Shona = 104,
- Sindhi = 105,
- Sinhala = 106,
- Swati = 107,
- Slovak = 108,
- Slovenian = 109,
- Somali = 110,
- Spanish = 111,
- Sundanese = 112,
- Swahili = 113,
- Swedish = 114,
- Sardinian = 115,
- Tajik = 116,
- Tamil = 117,
- Tatar = 118,
- Telugu = 119,
- Thai = 120,
- Tibetan = 121,
- Tigrinya = 122,
- Tongan = 123,
- Tsonga = 124,
- Turkish = 125,
- Turkmen = 126,
- Tahitian = 127,
- Uighur = 128,
- Ukrainian = 129,
- Urdu = 130,
- Uzbek = 131,
- Vietnamese = 132,
- Volapuk = 133,
- Welsh = 134,
- Wolof = 135,
- Xhosa = 136,
- Yiddish = 137,
- Yoruba = 138,
- Zhuang = 139,
- Zulu = 140,
- NorwegianNynorsk = 141,
- Bosnian = 142,
- Divehi = 143,
- Manx = 144,
- Cornish = 145,
- Akan = 146,
- Konkani = 147,
- Ga = 148,
- Igbo = 149,
- Kamba = 150,
- Syriac = 151,
- Blin = 152,
- Geez = 153,
- Koro = 154,
- Sidamo = 155,
- Atsam = 156,
- Tigre = 157,
- Jju = 158,
- Friulian = 159,
- Venda = 160,
- Ewe = 161,
- Walamo = 162,
- Hawaiian = 163,
- Tyap = 164,
- Nyanja = 165,
- Filipino = 166,
- SwissGerman = 167,
- SichuanYi = 168,
- Kpelle = 169,
- LowGerman = 170,
- SouthNdebele = 171,
- NorthernSotho = 172,
- NorthernSami = 173,
- Taroko = 174,
- Gusii = 175,
- Taita = 176,
- Fulah = 177,
- Kikuyu = 178,
- Samburu = 179,
- Sena = 180,
- NorthNdebele = 181,
- Rombo = 182,
- Tachelhit = 183,
- Kabyle = 184,
- Nyankole = 185,
- Bena = 186,
- Vunjo = 187,
- Bambara = 188,
- Embu = 189,
- Cherokee = 190,
- Morisyen = 191,
- Makonde = 192,
- Langi = 193,
- Ganda = 194,
- Bemba = 195,
- Kabuverdianu = 196,
- Meru = 197,
- Kalenjin = 198,
- Nama = 199,
- Machame = 200,
- Colognian = 201,
- Masai = 202,
- Soga = 203,
- Luyia = 204,
- Asu = 205,
- Teso = 206,
- Saho = 207,
- KoyraChiini = 208,
- Rwa = 209,
- Luo = 210,
- Chiga = 211,
- CentralMoroccoTamazight = 212,
- KoyraboroSenni = 213,
- Shambala = 214,
- Bodo = 215,
- Avaric = 216,
- Chamorro = 217,
- Chechen = 218,
- Church = 219,
- Chuvash = 220,
- Cree = 221,
- Haitian = 222,
- Herero = 223,
- HiriMotu = 224,
- Kanuri = 225,
- Komi = 226,
- Kongo = 227,
- Kwanyama = 228,
- Limburgish = 229,
- LubaKatanga = 230,
- Luxembourgish = 231,
- Navaho = 232,
- Ndonga = 233,
- Ojibwa = 234,
- Pali = 235,
- Walloon = 236,
- Aghem = 237,
- Basaa = 238,
- Zarma = 239,
- Duala = 240,
- JolaFonyi = 241,
- Ewondo = 242,
- Bafia = 243,
- MakhuwaMeetto = 244,
- Mundang = 245,
- Kwasio = 246,
- Nuer = 247,
- Sakha = 248,
- Sangu = 249,
- CongoSwahili = 250,
- Tasawaq = 251,
- Vai = 252,
- Walser = 253,
- Yangben = 254,
- Avestan = 255,
- Asturian = 256,
- Ngomba = 257,
- Kako = 258,
- Meta = 259,
- Ngiemboon = 260,
- Aragonese = 261,
- Akkadian = 262,
- AncientEgyptian = 263,
- AncientGreek = 264,
- Aramaic = 265,
- Balinese = 266,
- Bamun = 267,
- BatakToba = 268,
- Buginese = 269,
- Buhid = 270,
- Carian = 271,
- Chakma = 272,
- ClassicalMandaic = 273,
- Coptic = 274,
- Dogri = 275,
- EasternCham = 276,
- EasternKayah = 277,
- Etruscan = 278,
- Gothic = 279,
- Hanunoo = 280,
- Ingush = 281,
- LargeFloweryMiao = 282,
- Lepcha = 283,
- Limbu = 284,
- Lisu = 285,
- Lu = 286,
- Lycian = 287,
- Lydian = 288,
- Mandingo = 289,
- Manipuri = 290,
- Meroitic = 291,
- NorthernThai = 292,
- OldIrish = 293,
- OldNorse = 294,
- OldPersian = 295,
- OldTurkish = 296,
- Pahlavi = 297,
- Parthian = 298,
- Phoenician = 299,
- PrakritLanguage = 300,
- Rejang = 301,
- Sabaean = 302,
- Samaritan = 303,
- Santali = 304,
- Saurashtra = 305,
- Sora = 306,
- Sylheti = 307,
- Tagbanwa = 308,
- TaiDam = 309,
- TaiNua = 310,
- Ugaritic = 311,
- Akoose = 312,
- Lakota = 313,
- StandardMoroccanTamazight = 314,
- Mapuche = 315,
- CentralKurdish = 316,
- LowerSorbian = 317,
- UpperSorbian = 318,
- Kenyang = 319,
- Mohawk = 320,
- Nko = 321,
- Prussian = 322,
- Kiche = 323,
- SouthernSami = 324,
- LuleSami = 325,
- InariSami = 326,
- SkoltSami = 327,
- Warlpiri = 328,
- ManichaeanMiddlePersian = 329,
- Mende = 330,
- AncientNorthArabian = 331,
- LinearA = 332,
- HmongNjua = 333,
- Ho = 334,
- Lezghian = 335,
- Bassa = 336,
- Mono = 337,
- TedimChin = 338,
- Maithili = 339,
- Ahom = 340,
- AmericanSignLanguage = 341,
- ArdhamagadhiPrakrit = 342,
- Bhojpuri = 343,
- HieroglyphicLuwian = 344,
- LiteraryChinese = 345,
- Mazanderani = 346,
- Mru = 347,
- Newari = 348,
- NorthernLuri = 349,
- Palauan = 350,
- Papiamento = 351,
- Saraiki = 352,
- TokelauLanguage = 353,
- TokPisin = 354,
- TuvaluLanguage = 355,
- UncodedLanguages = 356,
- Cantonese = 357,
- Osage = 358,
- Tangut = 359,
- Ido = 360,
- Lojban = 361,
- Sicilian = 362,
- SouthernKurdish = 363,
- WesternBalochi = 364,
-
- Afan = Oromo,
- Bhutani = Dzongkha,
- Byelorussian = Belarusian,
- Cambodian = Khmer,
- Chewa = Nyanja,
- Frisian = WesternFrisian,
- Kurundi = Rundi,
- Moldavian = Romanian,
- Norwegian = NorwegianBokmal,
- RhaetoRomance = Romansh,
- SerboCroatian = Serbian,
- Tagalog = Filipino,
- Twi = Akan,
- Uigur = Uighur,
-
- LastLanguage = WesternBalochi
- };
-
- enum Script {
- AnyScript = 0,
- ArabicScript = 1,
- CyrillicScript = 2,
- DeseretScript = 3,
- GurmukhiScript = 4,
- SimplifiedHanScript = 5,
- TraditionalHanScript = 6,
- LatinScript = 7,
- MongolianScript = 8,
- TifinaghScript = 9,
- ArmenianScript = 10,
- BengaliScript = 11,
- CherokeeScript = 12,
- DevanagariScript = 13,
- EthiopicScript = 14,
- GeorgianScript = 15,
- GreekScript = 16,
- GujaratiScript = 17,
- HebrewScript = 18,
- JapaneseScript = 19,
- KhmerScript = 20,
- KannadaScript = 21,
- KoreanScript = 22,
- LaoScript = 23,
- MalayalamScript = 24,
- MyanmarScript = 25,
- OriyaScript = 26,
- TamilScript = 27,
- TeluguScript = 28,
- ThaanaScript = 29,
- ThaiScript = 30,
- TibetanScript = 31,
- SinhalaScript = 32,
- SyriacScript = 33,
- YiScript = 34,
- VaiScript = 35,
- AvestanScript = 36,
- BalineseScript = 37,
- BamumScript = 38,
- BatakScript = 39,
- BopomofoScript = 40,
- BrahmiScript = 41,
- BugineseScript = 42,
- BuhidScript = 43,
- CanadianAboriginalScript = 44,
- CarianScript = 45,
- ChakmaScript = 46,
- ChamScript = 47,
- CopticScript = 48,
- CypriotScript = 49,
- EgyptianHieroglyphsScript = 50,
- FraserScript = 51,
- GlagoliticScript = 52,
- GothicScript = 53,
- HanScript = 54,
- HangulScript = 55,
- HanunooScript = 56,
- ImperialAramaicScript = 57,
- InscriptionalPahlaviScript = 58,
- InscriptionalParthianScript = 59,
- JavaneseScript = 60,
- KaithiScript = 61,
- KatakanaScript = 62,
- KayahLiScript = 63,
- KharoshthiScript = 64,
- LannaScript = 65,
- LepchaScript = 66,
- LimbuScript = 67,
- LinearBScript = 68,
- LycianScript = 69,
- LydianScript = 70,
- MandaeanScript = 71,
- MeiteiMayekScript = 72,
- MeroiticScript = 73,
- MeroiticCursiveScript = 74,
- NkoScript = 75,
- NewTaiLueScript = 76,
- OghamScript = 77,
- OlChikiScript = 78,
- OldItalicScript = 79,
- OldPersianScript = 80,
- OldSouthArabianScript = 81,
- OrkhonScript = 82,
- OsmanyaScript = 83,
- PhagsPaScript = 84,
- PhoenicianScript = 85,
- PollardPhoneticScript = 86,
- RejangScript = 87,
- RunicScript = 88,
- SamaritanScript = 89,
- SaurashtraScript = 90,
- SharadaScript = 91,
- ShavianScript = 92,
- SoraSompengScript = 93,
- CuneiformScript = 94,
- SundaneseScript = 95,
- SylotiNagriScript = 96,
- TagalogScript = 97,
- TagbanwaScript = 98,
- TaiLeScript = 99,
- TaiVietScript = 100,
- TakriScript = 101,
- UgariticScript = 102,
- BrailleScript = 103,
- HiraganaScript = 104,
- CaucasianAlbanianScript = 105,
- BassaVahScript = 106,
- DuployanScript = 107,
- ElbasanScript = 108,
- GranthaScript = 109,
- PahawhHmongScript = 110,
- KhojkiScript = 111,
- LinearAScript = 112,
- MahajaniScript = 113,
- ManichaeanScript = 114,
- MendeKikakuiScript = 115,
- ModiScript = 116,
- MroScript = 117,
- OldNorthArabianScript = 118,
- NabataeanScript = 119,
- PalmyreneScript = 120,
- PauCinHauScript = 121,
- OldPermicScript = 122,
- PsalterPahlaviScript = 123,
- SiddhamScript = 124,
- KhudawadiScript = 125,
- TirhutaScript = 126,
- VarangKshitiScript = 127,
- AhomScript = 128,
- AnatolianHieroglyphsScript = 129,
- HatranScript = 130,
- MultaniScript = 131,
- OldHungarianScript = 132,
- SignWritingScript = 133,
- AdlamScript = 134,
- BhaiksukiScript = 135,
- MarchenScript = 136,
- NewaScript = 137,
- OsageScript = 138,
- TangutScript = 139,
- HanWithBopomofoScript = 140,
- JamoScript = 141,
-
- SimplifiedChineseScript = SimplifiedHanScript,
- TraditionalChineseScript = TraditionalHanScript,
-
- LastScript = JamoScript
- };
- enum Country {
- AnyCountry = 0,
- Afghanistan = 1,
- Albania = 2,
- Algeria = 3,
- AmericanSamoa = 4,
- Andorra = 5,
- Angola = 6,
- Anguilla = 7,
- Antarctica = 8,
- AntiguaAndBarbuda = 9,
- Argentina = 10,
- Armenia = 11,
- Aruba = 12,
- Australia = 13,
- Austria = 14,
- Azerbaijan = 15,
- Bahamas = 16,
- Bahrain = 17,
- Bangladesh = 18,
- Barbados = 19,
- Belarus = 20,
- Belgium = 21,
- Belize = 22,
- Benin = 23,
- Bermuda = 24,
- Bhutan = 25,
- Bolivia = 26,
- BosniaAndHerzegowina = 27,
- Botswana = 28,
- BouvetIsland = 29,
- Brazil = 30,
- BritishIndianOceanTerritory = 31,
- Brunei = 32,
- Bulgaria = 33,
- BurkinaFaso = 34,
- Burundi = 35,
- Cambodia = 36,
- Cameroon = 37,
- Canada = 38,
- CapeVerde = 39,
- CaymanIslands = 40,
- CentralAfricanRepublic = 41,
- Chad = 42,
- Chile = 43,
- China = 44,
- ChristmasIsland = 45,
- CocosIslands = 46,
- Colombia = 47,
- Comoros = 48,
- CongoKinshasa = 49,
- CongoBrazzaville = 50,
- CookIslands = 51,
- CostaRica = 52,
- IvoryCoast = 53,
- Croatia = 54,
- Cuba = 55,
- Cyprus = 56,
- CzechRepublic = 57,
- Denmark = 58,
- Djibouti = 59,
- Dominica = 60,
- DominicanRepublic = 61,
- EastTimor = 62,
- Ecuador = 63,
- Egypt = 64,
- ElSalvador = 65,
- EquatorialGuinea = 66,
- Eritrea = 67,
- Estonia = 68,
- Ethiopia = 69,
- FalklandIslands = 70,
- FaroeIslands = 71,
- Fiji = 72,
- Finland = 73,
- France = 74,
- Guernsey = 75,
- FrenchGuiana = 76,
- FrenchPolynesia = 77,
- FrenchSouthernTerritories = 78,
- Gabon = 79,
- Gambia = 80,
- Georgia = 81,
- Germany = 82,
- Ghana = 83,
- Gibraltar = 84,
- Greece = 85,
- Greenland = 86,
- Grenada = 87,
- Guadeloupe = 88,
- Guam = 89,
- Guatemala = 90,
- Guinea = 91,
- GuineaBissau = 92,
- Guyana = 93,
- Haiti = 94,
- HeardAndMcDonaldIslands = 95,
- Honduras = 96,
- HongKong = 97,
- Hungary = 98,
- Iceland = 99,
- India = 100,
- Indonesia = 101,
- Iran = 102,
- Iraq = 103,
- Ireland = 104,
- Israel = 105,
- Italy = 106,
- Jamaica = 107,
- Japan = 108,
- Jordan = 109,
- Kazakhstan = 110,
- Kenya = 111,
- Kiribati = 112,
- NorthKorea = 113,
- SouthKorea = 114,
- Kuwait = 115,
- Kyrgyzstan = 116,
- Laos = 117,
- Latvia = 118,
- Lebanon = 119,
- Lesotho = 120,
- Liberia = 121,
- Libya = 122,
- Liechtenstein = 123,
- Lithuania = 124,
- Luxembourg = 125,
- Macau = 126,
- Macedonia = 127,
- Madagascar = 128,
- Malawi = 129,
- Malaysia = 130,
- Maldives = 131,
- Mali = 132,
- Malta = 133,
- MarshallIslands = 134,
- Martinique = 135,
- Mauritania = 136,
- Mauritius = 137,
- Mayotte = 138,
- Mexico = 139,
- Micronesia = 140,
- Moldova = 141,
- Monaco = 142,
- Mongolia = 143,
- Montserrat = 144,
- Morocco = 145,
- Mozambique = 146,
- Myanmar = 147,
- Namibia = 148,
- NauruCountry = 149,
- Nepal = 150,
- Netherlands = 151,
- CuraSao = 152,
- NewCaledonia = 153,
- NewZealand = 154,
- Nicaragua = 155,
- Niger = 156,
- Nigeria = 157,
- Niue = 158,
- NorfolkIsland = 159,
- NorthernMarianaIslands = 160,
- Norway = 161,
- Oman = 162,
- Pakistan = 163,
- Palau = 164,
- PalestinianTerritories = 165,
- Panama = 166,
- PapuaNewGuinea = 167,
- Paraguay = 168,
- Peru = 169,
- Philippines = 170,
- Pitcairn = 171,
- Poland = 172,
- Portugal = 173,
- PuertoRico = 174,
- Qatar = 175,
- Reunion = 176,
- Romania = 177,
- Russia = 178,
- Rwanda = 179,
- SaintKittsAndNevis = 180,
- SaintLucia = 181,
- SaintVincentAndTheGrenadines = 182,
- Samoa = 183,
- SanMarino = 184,
- SaoTomeAndPrincipe = 185,
- SaudiArabia = 186,
- Senegal = 187,
- Seychelles = 188,
- SierraLeone = 189,
- Singapore = 190,
- Slovakia = 191,
- Slovenia = 192,
- SolomonIslands = 193,
- Somalia = 194,
- SouthAfrica = 195,
- SouthGeorgiaAndTheSouthSandwichIslands = 196,
- Spain = 197,
- SriLanka = 198,
- SaintHelena = 199,
- SaintPierreAndMiquelon = 200,
- Sudan = 201,
- Suriname = 202,
- SvalbardAndJanMayenIslands = 203,
- Swaziland = 204,
- Sweden = 205,
- Switzerland = 206,
- Syria = 207,
- Taiwan = 208,
- Tajikistan = 209,
- Tanzania = 210,
- Thailand = 211,
- Togo = 212,
- TokelauCountry = 213,
- Tonga = 214,
- TrinidadAndTobago = 215,
- Tunisia = 216,
- Turkey = 217,
- Turkmenistan = 218,
- TurksAndCaicosIslands = 219,
- TuvaluCountry = 220,
- Uganda = 221,
- Ukraine = 222,
- UnitedArabEmirates = 223,
- UnitedKingdom = 224,
- UnitedStates = 225,
- UnitedStatesMinorOutlyingIslands = 226,
- Uruguay = 227,
- Uzbekistan = 228,
- Vanuatu = 229,
- VaticanCityState = 230,
- Venezuela = 231,
- Vietnam = 232,
- BritishVirginIslands = 233,
- UnitedStatesVirginIslands = 234,
- WallisAndFutunaIslands = 235,
- WesternSahara = 236,
- Yemen = 237,
- CanaryIslands = 238,
- Zambia = 239,
- Zimbabwe = 240,
- ClippertonIsland = 241,
- Montenegro = 242,
- Serbia = 243,
- SaintBarthelemy = 244,
- SaintMartin = 245,
- LatinAmerica = 246,
- AscensionIsland = 247,
- AlandIslands = 248,
- DiegoGarcia = 249,
- CeutaAndMelilla = 250,
- IsleOfMan = 251,
- Jersey = 252,
- TristanDaCunha = 253,
- SouthSudan = 254,
- Bonaire = 255,
- SintMaarten = 256,
- Kosovo = 257,
- EuropeanUnion = 258,
- OutlyingOceania = 259,
- World = 260,
- Europe = 261,
-
- DemocraticRepublicOfCongo = CongoKinshasa,
- DemocraticRepublicOfKorea = NorthKorea,
- LatinAmericaAndTheCaribbean = LatinAmerica,
- PeoplesRepublicOfCongo = CongoBrazzaville,
- RepublicOfKorea = SouthKorea,
- RussianFederation = Russia,
- SyrianArabRepublic = Syria,
- Tokelau = TokelauCountry,
- Tuvalu = TuvaluCountry,
-
- LastCountry = Europe
- };
-// GENERATED PART ENDS HERE
-
- Q_ENUM(Language)
- Q_ENUM(Country)
- Q_ENUM(Script)
-
- enum MeasurementSystem {
- MetricSystem,
- ImperialUSSystem,
- ImperialUKSystem,
- ImperialSystem = ImperialUSSystem // Qt 4 compatibility
- };
- Q_ENUM(MeasurementSystem)
-
- enum FormatType { LongFormat, ShortFormat, NarrowFormat };
- enum NumberOption {
- DefaultNumberOptions = 0x0,
- OmitGroupSeparator = 0x01,
- RejectGroupSeparator = 0x02,
- OmitLeadingZeroInExponent = 0x04,
- RejectLeadingZeroInExponent = 0x08,
- IncludeTrailingZeroesAfterDot = 0x10,
- RejectTrailingZeroesAfterDot = 0x20
- };
- Q_DECLARE_FLAGS(NumberOptions, NumberOption)
-
- enum FloatingPointPrecisionOption {
- FloatingPointShortest = -128
- };
-
- enum CurrencySymbolFormat {
- CurrencyIsoCode,
- CurrencySymbol,
- CurrencyDisplayName
- };
-
- enum DataSizeFormat {
- // Single-bit values, for internal use.
- DataSizeBase1000 = 1, // use factors of 1000 instead of IEC's 1024;
- DataSizeSIQuantifiers = 2, // use SI quantifiers instead of IEC ones.
-
- // Flags values for use in API:
- DataSizeIecFormat = 0, // base 1024, KiB, MiB, GiB, ...
- DataSizeTraditionalFormat = DataSizeSIQuantifiers, // base 1024, kB, MB, GB, ...
- DataSizeSIFormat = DataSizeBase1000 | DataSizeSIQuantifiers // base 1000, kB, MB, GB, ...
- };
- Q_DECLARE_FLAGS(DataSizeFormats, DataSizeFormat)
- Q_FLAG(DataSizeFormats)
-
- QLocale();
- QLocale(const QString &name);
- QLocale(Language language, Country country = AnyCountry);
- QLocale(Language language, Script script, Country country);
- QLocale(const QLocale &other);
-#ifdef Q_COMPILER_RVALUE_REFS
- QLocale &operator=(QLocale &&other) Q_DECL_NOTHROW { swap(other); return *this; }
-#endif
- QLocale &operator=(const QLocale &other);
- ~QLocale();
-
- void swap(QLocale &other) Q_DECL_NOTHROW { qSwap(d, other.d); }
-
- Language language() const;
- Script script() const;
- Country country() const;
- QString name() const;
-
- QString bcp47Name() const;
- QString nativeLanguageName() const;
- QString nativeCountryName() const;
-
-#if QT_STRINGVIEW_LEVEL < 2
- short toShort(const QString &s, bool *ok = nullptr) const;
- ushort toUShort(const QString &s, bool *ok = nullptr) const;
- int toInt(const QString &s, bool *ok = nullptr) const;
- uint toUInt(const QString &s, bool *ok = nullptr) const;
- long toLong(const QString &s, bool *ok = nullptr) const;
- ulong toULong(const QString &s, bool *ok = nullptr) const;
- qlonglong toLongLong(const QString &s, bool *ok = nullptr) const;
- qulonglong toULongLong(const QString &s, bool *ok = nullptr) const;
- float toFloat(const QString &s, bool *ok = nullptr) const;
- double toDouble(const QString &s, bool *ok = nullptr) const;
-
- short toShort(const QStringRef &s, bool *ok = nullptr) const;
- ushort toUShort(const QStringRef &s, bool *ok = nullptr) const;
- int toInt(const QStringRef &s, bool *ok = nullptr) const;
- uint toUInt(const QStringRef &s, bool *ok = nullptr) const;
- long toLong(const QStringRef &s, bool *ok = nullptr) const;
- ulong toULong(const QStringRef &s, bool *ok = nullptr) const;
- qlonglong toLongLong(const QStringRef &s, bool *ok = nullptr) const;
- qulonglong toULongLong(const QStringRef &s, bool *ok = nullptr) const;
- float toFloat(const QStringRef &s, bool *ok = nullptr) const;
- double toDouble(const QStringRef &s, bool *ok = nullptr) const;
-#endif
-
- short toShort(QStringView s, bool *ok = nullptr) const;
- ushort toUShort(QStringView s, bool *ok = nullptr) const;
- int toInt(QStringView s, bool *ok = nullptr) const;
- uint toUInt(QStringView s, bool *ok = nullptr) const;
- long toLong(QStringView s, bool *ok = nullptr) const;
- ulong toULong(QStringView s, bool *ok = nullptr) const;
- qlonglong toLongLong(QStringView s, bool *ok = nullptr) const;
- qulonglong toULongLong(QStringView s, bool *ok = nullptr) const;
- float toFloat(QStringView s, bool *ok = nullptr) const;
- double toDouble(QStringView s, bool *ok = nullptr) const;
-
- QString toString(qlonglong i) const;
- QString toString(qulonglong i) const;
- inline QString toString(long i) const;
- inline QString toString(ulong i) const;
- inline QString toString(short i) const;
- inline QString toString(ushort i) const;
- inline QString toString(int i) const;
- inline QString toString(uint i) const;
- QString toString(double i, char f = 'g', int prec = 6) const;
- inline QString toString(float i, char f = 'g', int prec = 6) const;
-
-#if QT_STRINGVIEW_LEVEL < 2
- QString toString(const QDate &date, const QString &formatStr) const;
- QString toString(const QTime &time, const QString &formatStr) const;
- QString toString(const QDateTime &dateTime, const QString &format) const;
-#endif
- QString toString(const QDate &date, QStringView formatStr) const;
- QString toString(const QTime &time, QStringView formatStr) const;
- QString toString(const QDateTime &dateTime, QStringView format) const;
- QString toString(const QDate &date, FormatType format = LongFormat) const;
- QString toString(const QTime &time, FormatType format = LongFormat) const;
- QString toString(const QDateTime &dateTime, FormatType format = LongFormat) const;
-
- QString dateFormat(FormatType format = LongFormat) const;
- QString timeFormat(FormatType format = LongFormat) const;
- QString dateTimeFormat(FormatType format = LongFormat) const;
-#if QT_CONFIG(datestring)
- QDate toDate(const QString &string, FormatType = LongFormat) const;
- QTime toTime(const QString &string, FormatType = LongFormat) const;
- QDateTime toDateTime(const QString &string, FormatType format = LongFormat) const;
- QDate toDate(const QString &string, const QString &format) const;
- QTime toTime(const QString &string, const QString &format) const;
- QDateTime toDateTime(const QString &string, const QString &format) const;
-#endif
-
- // ### Qt 5: We need to return QString from these function since
- // unicode data contains several characters for these fields.
- QChar decimalPoint() const;
- QChar groupSeparator() const;
- QChar percent() const;
- QChar zeroDigit() const;
- QChar negativeSign() const;
- QChar positiveSign() const;
- QChar exponential() const;
-
- QString monthName(int, FormatType format = LongFormat) const;
- QString standaloneMonthName(int, FormatType format = LongFormat) const;
- QString dayName(int, FormatType format = LongFormat) const;
- QString standaloneDayName(int, FormatType format = LongFormat) const;
-
- Qt::DayOfWeek firstDayOfWeek() const;
- QList<Qt::DayOfWeek> weekdays() const;
-
- QString amText() const;
- QString pmText() const;
-
- MeasurementSystem measurementSystem() const;
-
- Qt::LayoutDirection textDirection() const;
-
- QString toUpper(const QString &str) const;
- QString toLower(const QString &str) const;
-
- QString currencySymbol(CurrencySymbolFormat = CurrencySymbol) const;
- QString toCurrencyString(qlonglong, const QString &symbol = QString()) const;
- QString toCurrencyString(qulonglong, const QString &symbol = QString()) const;
- inline QString toCurrencyString(short, const QString &symbol = QString()) const;
- inline QString toCurrencyString(ushort, const QString &symbol = QString()) const;
- inline QString toCurrencyString(int, const QString &symbol = QString()) const;
- inline QString toCurrencyString(uint, const QString &symbol = QString()) const;
-#if QT_VERSION >= QT_VERSION_CHECK(6,0,0)
- QString toCurrencyString(double, const QString &symbol = QString(), int precision = -1) const;
- inline QString toCurrencyString(float i, const QString &symbol = QString(), int precision = -1) const
- { return toCurrencyString(double(i), symbol, precision); }
-#else
- QString toCurrencyString(double, const QString &symbol = QString()) const;
- QString toCurrencyString(double, const QString &symbol, int precision) const;
- inline QString toCurrencyString(float i, const QString &symbol = QString()) const
- { return toCurrencyString(double(i), symbol); }
- inline QString toCurrencyString(float i, const QString &symbol, int precision) const
- { return toCurrencyString(double(i), symbol, precision); }
-#endif
-
-#if QT_VERSION < QT_VERSION_CHECK(6, 0, 0)
- QString formattedDataSize(qint64 bytes, int precision = 2, DataSizeFormats format = DataSizeIecFormat);
-#endif
- QString formattedDataSize(qint64 bytes, int precision = 2, DataSizeFormats format = DataSizeIecFormat) const;
-
- QStringList uiLanguages() const;
-
- bool operator==(const QLocale &other) const;
- bool operator!=(const QLocale &other) const;
-
- static QString languageToString(Language language);
- static QString countryToString(Country country);
- static QString scriptToString(Script script);
- static void setDefault(const QLocale &locale);
-
- static QLocale c() { return QLocale(C); }
- static QLocale system();
-
- static QList<QLocale> matchingLocales(QLocale::Language language, QLocale::Script script, QLocale::Country country);
- static QList<Country> countriesForLanguage(Language lang);
-
- void setNumberOptions(NumberOptions options);
- NumberOptions numberOptions() const;
-
- enum QuotationStyle { StandardQuotation, AlternateQuotation };
- QString quoteString(const QString &str, QuotationStyle style = StandardQuotation) const;
- QString quoteString(const QStringRef &str, QuotationStyle style = StandardQuotation) const;
-
- QString createSeparatedList(const QStringList &strl) const;
-
-private:
- QLocale(QLocalePrivate &dd);
- friend class QLocalePrivate;
- friend class QSystemLocale;
- friend Q_CORE_EXPORT uint qHash(const QLocale &key, uint seed) Q_DECL_NOTHROW;
-
- QSharedDataPointer<QLocalePrivate> d;
-};
-Q_DECLARE_SHARED(QLocale)
-Q_DECLARE_OPERATORS_FOR_FLAGS(QLocale::NumberOptions)
-
-inline QString QLocale::toString(long i) const
- { return toString(qlonglong(i)); }
-inline QString QLocale::toString(ulong i) const
- { return toString(qulonglong(i)); }
-inline QString QLocale::toString(short i) const
- { return toString(qlonglong(i)); }
-inline QString QLocale::toString(ushort i) const
- { return toString(qulonglong(i)); }
-inline QString QLocale::toString(int i) const
- { return toString(qlonglong(i)); }
-inline QString QLocale::toString(uint i) const
- { return toString(qulonglong(i)); }
-inline QString QLocale::toString(float i, char f, int prec) const
- { return toString(double(i), f, prec); }
-
-inline QString QLocale::toCurrencyString(short i, const QString &symbol) const
- { return toCurrencyString(qlonglong(i), symbol); }
-inline QString QLocale::toCurrencyString(ushort i, const QString &symbol) const
- { return toCurrencyString(qulonglong(i), symbol); }
-inline QString QLocale::toCurrencyString(int i, const QString &symbol) const
-{ return toCurrencyString(qlonglong(i), symbol); }
-inline QString QLocale::toCurrencyString(uint i, const QString &symbol) const
-{ return toCurrencyString(qulonglong(i), symbol); }
-
-#ifndef QT_NO_DATASTREAM
-Q_CORE_EXPORT QDataStream &operator<<(QDataStream &, const QLocale &);
-Q_CORE_EXPORT QDataStream &operator>>(QDataStream &, QLocale &);
-#endif
-
-#ifndef QT_NO_DEBUG_STREAM
-Q_CORE_EXPORT QDebug operator<<(QDebug, const QLocale &);
-#endif
-
-QT_END_NAMESPACE
-
-#endif // QLOCALE_H
diff --git a/src/corelib/tools/qlocale.qdoc b/src/corelib/tools/qlocale.qdoc
deleted file mode 100644
index 484987c40b..0000000000
--- a/src/corelib/tools/qlocale.qdoc
+++ /dev/null
@@ -1,1276 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the documentation of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:FDL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Free Documentation License Usage
-** Alternatively, this file may be used under the terms of the GNU Free
-** Documentation License version 1.3 as published by the Free Software
-** Foundation and appearing in the file included in the packaging of
-** this file. Please review the following information to ensure
-** the GNU Free Documentation License version 1.3 requirements
-** will be met: https://www.gnu.org/licenses/fdl-1.3.html.
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-/*!
- \class QLocale
- \inmodule QtCore
- \brief The QLocale class converts between numbers and their
- string representations in various languages.
-
- \reentrant
- \ingroup i18n
- \ingroup string-processing
- \ingroup shared
-
-
- QLocale is initialized with a language/country pair in its
- constructor and offers number-to-string and string-to-number
- conversion functions similar to those in QString.
-
- Example:
-
- \snippet code/src_corelib_tools_qlocale.cpp 0
-
- QLocale supports the concept of a default locale, which is
- determined from the system's locale settings at application
- startup. The default locale can be changed by calling the
- static member setDefault(). Setting the default locale has the
- following effects:
-
- \list
- \li If a QLocale object is constructed with the default constructor,
- it will use the default locale's settings.
- \li QString::toInt(), QString::toDouble(), etc., interpret the
- string according to the default locale. If this fails, it
- falls back on the "C" locale.
- \li QString::arg() uses the default locale to format a number when
- its position specifier in the format string contains an 'L',
- e.g. "%L1".
- \endlist
-
- The following example illustrates how to use QLocale directly:
-
- \snippet code/src_corelib_tools_qlocale.cpp 1
-
- When a language/country pair is specified in the constructor, one
- of three things can happen:
-
- \list
- \li If the language/country pair is found in the database, it is used.
- \li If the language is found but the country is not, or if the country
- is \c AnyCountry, the language is used with the most
- appropriate available country (for example, Germany for German),
- \li If neither the language nor the country are found, QLocale
- defaults to the default locale (see setDefault()).
- \endlist
-
- Use language() and country() to determine the actual language and
- country values used.
-
- An alternative method for constructing a QLocale object is by
- specifying the locale name.
-
- \snippet code/src_corelib_tools_qlocale.cpp 2
-
- This constructor converts the locale name to a language/country
- pair; it does not use the system locale database.
-
- \note For the current keyboard input locale take a look at
- QInputMethod::locale().
-
- QLocale's data is based on Common Locale Data Repository v35.1.
-
- \sa QString::arg(), QString::toInt(), QString::toDouble(),
- QInputMethod::locale()
-*/
-
-/*!
- \enum QLocale::Language
-
- This enumerated type is used to specify a language.
-
- \value AnyLanguage
- \value C A simplified English locale; see QLocale::c()
-
- \value Abkhazian
- \value Afan Obsolete, please use Oromo
- \value Afar
- \value Afrikaans
- \value Aghem
- \value Ahom Since Qt 5.7
- \value Akan
- \value Akkadian Since Qt 5.1
- \value Akoose Since Qt 5.3
- \value Albanian
- \value AmericanSignLanguage Since Qt 5.7
- \value Amharic
- \value AncientEgyptian Since Qt 5.1
- \value AncientGreek Since Qt 5.1
- \value AncientNorthArabian Since Qt 5.5
- \value Arabic
- \value Aragonese Since Qt 5.1
- \value Aramaic Since Qt 5.1
- \value ArdhamagadhiPrakrit Since Qt 5.7
- \value Armenian
- \value Assamese
- \value Asturian
- \value Asu
- \value Atsam
- \value Avaric
- \value Avestan
- \value Aymara
- \value Azerbaijani
- \value Bafia
- \value Balinese Since Qt 5.1
- \value Bambara
- \value Bamun Since Qt 5.1
- \value Basaa
- \value Bashkir
- \value Basque
- \value Bassa Since Qt 5.5
- \value BatakToba Since Qt 5.1
- \value Belarusian
- \value Bemba
- \value Bena
- \value Bengali
- \value Bhojpuri Since Qt 5.7
- \value Bhutani Obsolete, please use Dzongkha
- \value Bihari
- \value Bislama
- \value Blin
- \value Bodo
- \value Bosnian
- \value Breton
- \value Buginese Since Qt 5.1
- \value Buhid Since Qt 5.1
- \value Bulgarian
- \value Burmese
- \value Byelorussian Obsolete, please use Belarusian
- \value Cambodian Obsolete, please use Khmer
- \value Cantonese Since Qt 5.7
- \value Carian Since Qt 5.1
- \value Catalan
- \value CentralKurdish Since Qt 5.5
- \value CentralMoroccoTamazight
- \value Chakma Since Qt 5.1
- \value Chamorro
- \value Chechen
- \value Cherokee
- \value Chewa Obsolete, please use Nyanja
- \value Chiga
- \value Chinese
- \value Church
- \value Chuvash
- \value ClassicalMandaic Since Qt 5.1
- \value Colognian
- \value CongoSwahili
- \value Coptic Since Qt 5.1
- \value Cornish
- \value Corsican
- \value Cree
- \value Croatian
- \value Czech
- \value Danish
- \value Divehi
- \value Dogri Since Qt 5.1
- \value Duala
- \value Dutch
- \value Dzongkha
- \value EasternCham Since Qt 5.1
- \value EasternKayah Since Qt 5.1
- \value Embu
- \value English
- \value Esperanto
- \value Estonian
- \value Etruscan Since Qt 5.1
- \value Ewe
- \value Ewondo
- \value Faroese
- \value Fijian
- \value Filipino
- \value Finnish
- \value French
- \value Frisian same as WesternFrisian
- \value Friulian
- \value Fulah
- \value Ga
- \value Gaelic
- \value Galician
- \value Ganda
- \value Geez
- \value Georgian
- \value German
- \value Gothic Since Qt 5.1
- \value Greek
- \value Greenlandic
- \value Guarani
- \value Gujarati
- \value Gusii
- \value Haitian
- \value Hanunoo Since Qt 5.1
- \value Hausa
- \value Hawaiian
- \value Hebrew
- \value Herero
- \value HieroglyphicLuwian Since Qt 5.7
- \value Hindi
- \value HiriMotu
- \value HmongNjua Since Qt 5.5
- \value Ho Since Qt 5.5
- \value Hungarian
- \value Icelandic
- \value Ido Since Qt 5.12
- \value Igbo
- \value InariSami Since Qt 5.5
- \value Indonesian
- \value Ingush Since Qt 5.1
- \value Interlingua
- \value Interlingue
- \value Inuktitut
- \value Inupiak
- \value Irish
- \value Italian
- \value Japanese
- \value Javanese
- \value Jju
- \value JolaFonyi
- \value Kabuverdianu
- \value Kabyle
- \value Kako
- \value Kalenjin
- \value Kamba
- \value Kannada
- \value Kanuri
- \value Kashmiri
- \value Kazakh
- \value Kenyang Since Qt 5.5
- \value Khmer
- \value Kiche Since Qt 5.5
- \value Kikuyu
- \value Kinyarwanda
- \value Kirghiz
- \value Komi
- \value Kongo
- \value Konkani
- \value Korean
- \value Koro
- \value KoyraboroSenni
- \value KoyraChiini
- \value Kpelle
- \value Kurdish
- \value Kurundi Obsolete, please use Rundi
- \value Kwanyama
- \value Kwasio
- \value Lakota Since Qt 5.3
- \value Langi
- \value Lao
- \value LargeFloweryMiao Since Qt 5.1
- \value Latin
- \value Latvian
- \value Lepcha Since Qt 5.1
- \value Lezghian Since Qt 5.5
- \value Limburgish
- \value Limbu Since Qt 5.1
- \value LinearA Since Qt 5.5
- \value Lingala
- \value Lisu Since Qt 5.1
- \value LiteraryChinese Since Qt 5.7
- \value Lithuanian
- \value Lojban Since Qt 5.12
- \value LowerSorbian Since Qt 5.5
- \value LowGerman
- \value LubaKatanga
- \value LuleSami Since Qt 5.5
- \value Luo
- \value Lu Since Qt 5.1
- \value Luxembourgish
- \value Luyia
- \value Lycian Since Qt 5.1
- \value Lydian Since Qt 5.1
- \value Macedonian
- \value Machame
- \value Maithili Since Qt 5.5
- \value MakhuwaMeetto
- \value Makonde
- \value Malagasy
- \value Malay
- \value Malayalam
- \value Maltese
- \value Mandingo Since Qt 5.1
- \value ManichaeanMiddlePersian Since Qt 5.5
- \value Manipuri Since Qt 5.1
- \value Manx
- \value Maori
- \value Mapuche Since Qt 5.5
- \value Marathi
- \value Marshallese
- \value Masai
- \value Mazanderani Since Qt 5.7
- \value Mende Since Qt 5.5
- \value Meroitic Since Qt 5.1
- \value Meru
- \value Meta
- \value Mohawk Since Qt 5.5
- \value Moldavian Obsolete, please use Romanian
- \value Mongolian
- \value Mono Since Qt 5.5
- \value Morisyen
- \value Mru Since Qt 5.7
- \value Mundang
- \value Nama
- \value NauruLanguage
- \value Navaho
- \value Ndonga
- \value Nepali
- \value Newari Since Qt 5.7
- \value Ngiemboon
- \value Ngomba
- \value Nko Since Qt 5.5
- \value NorthernLuri Since Qt 5.7
- \value NorthernSami
- \value NorthernSotho
- \value NorthernThai Since Qt 5.1
- \value NorthNdebele
- \value NorwegianBokmal same as Norwegian
- \value NorwegianNynorsk
- \value Norwegian same as NorwegianBokmal
- \value Nuer
- \value Nyanja
- \value Nyankole
- \value Occitan
- \value Ojibwa
- \value OldIrish Since Qt 5.1
- \value OldNorse Since Qt 5.1
- \value OldPersian Since Qt 5.1
- \value OldTurkish Since Qt 5.1
- \value Oriya
- \value Oromo
- \value Osage Since Qt 5.7
- \value Ossetic
- \value Pahlavi Since Qt 5.1
- \value Palauan Since Qt 5.7
- \value Pali
- \value Papiamento Since Qt 5.7
- \value Parthian Since Qt 5.1
- \value Pashto
- \value Persian
- \value Phoenician Since Qt 5.1
- \value Polish
- \value Portuguese
- \value PrakritLanguage Since Qt 5.1
- \value Prussian Since Qt 5.5
- \value Punjabi
- \value Quechua
- \value Rejang Since Qt 5.1
- \value RhaetoRomance Obsolete, please use Romansh
- \value Romanian
- \value Romansh
- \value Rombo
- \value Rundi
- \value Russian
- \value Rwa
- \value Sabaean Since Qt 5.1
- \value Saho
- \value Sakha
- \value Samaritan Since Qt 5.1
- \value Samburu
- \value Samoan
- \value Sango
- \value Sangu
- \value Sanskrit
- \value Santali Since Qt 5.1
- \value Saraiki Since Qt 5.7
- \value Sardinian
- \value Saurashtra Since Qt 5.1
- \value Sena
- \value Serbian
- \value SerboCroatian Obsolete, please use Serbian
- \value Shambala
- \value Shona
- \value SichuanYi
- \value Sicilian Since Qt 5.12
- \value Sidamo
- \value Sindhi
- \value Sinhala
- \value SkoltSami Since Qt 5.5
- \value Slovak
- \value Slovenian
- \value Soga
- \value Somali
- \value Sora Since Qt 5.1
- \value SouthernKurdish Since Qt 5.12
- \value SouthernSami Since Qt 5.5
- \value SouthernSotho
- \value SouthNdebele
- \value Spanish
- \value StandardMoroccanTamazight Since Qt 5.3
- \value Sundanese
- \value Swahili
- \value Swati
- \value Swedish
- \value SwissGerman
- \value Sylheti Since Qt 5.1
- \value Syriac
- \value Tachelhit
- \value Tagalog Obsolete, please use Filipino
- \value Tagbanwa Since Qt 5.1
- \value Tahitian
- \value TaiDam Since Qt 5.1
- \value TaiNua Since Qt 5.1
- \value Taita
- \value Tajik
- \value Tamil
- \value Tangut Since Qt 5.7
- \value Taroko
- \value Tasawaq
- \value Tatar
- \value TedimChin Since Qt 5.5
- \value Telugu
- \value Teso
- \value Thai
- \value Tibetan
- \value Tigre
- \value Tigrinya
- \value TokelauLanguage Since Qt 5.7
- \value TokPisin Since Qt 5.7
- \value Tongan
- \value Tsonga
- \value Tswana
- \value Turkish
- \value Turkmen
- \value TuvaluLanguage Since Qt 5.7
- \value Twi Obsolete, please use Akan
- \value Tyap
- \value Ugaritic Since Qt 5.1
- \value Uighur
- \value Uigur Obsolete, please use Uighur
- \value Ukrainian
- \value UncodedLanguages Since Qt 5.7
- \value UpperSorbian Since Qt 5.5
- \value Urdu
- \value Uzbek
- \value Vai
- \value Venda
- \value Vietnamese
- \value Volapuk
- \value Vunjo
- \value Walamo
- \value Walloon
- \value Walser
- \value Warlpiri Since Qt 5.5
- \value Welsh
- \value WesternBalochi Since Qt 5.12
- \value WesternFrisian same as Frisian
- \value Wolof
- \value Xhosa
- \value Yangben
- \value Yiddish
- \value Yoruba
- \value Zarma
- \value Zhuang
- \value Zulu
-
- \omitvalue LastLanguage
-
- \sa language(), languageToString()
-*/
-
-/*!
- \enum QLocale::Country
-
- This enumerated type is used to specify a country.
-
- \value AnyCountry
-
- \value Afghanistan
- \value AlandIslands
- \value Albania
- \value Algeria
- \value AmericanSamoa
- \value Andorra
- \value Angola
- \value Anguilla
- \value Antarctica
- \value AntiguaAndBarbuda
- \value Argentina
- \value Armenia
- \value Aruba
- \value AscensionIsland
- \value Australia
- \value Austria
- \value Azerbaijan
- \value Bahamas
- \value Bahrain
- \value Bangladesh
- \value Barbados
- \value Belarus
- \value Belgium
- \value Belize
- \value Benin
- \value Bermuda
- \value Bhutan
- \value Bolivia
- \value Bonaire
- \value BosniaAndHerzegowina
- \value Botswana
- \value BouvetIsland
- \value Brazil
- \value BritishIndianOceanTerritory
- \value BritishVirginIslands
- \value Brunei
- \value Bulgaria
- \value BurkinaFaso
- \value Burundi
- \value Cambodia
- \value Cameroon
- \value Canada
- \value CanaryIslands
- \value CapeVerde
- \value CaymanIslands
- \value CentralAfricanRepublic
- \value CeutaAndMelilla
- \value Chad
- \value Chile
- \value China
- \value ChristmasIsland
- \value ClippertonIsland
- \value CocosIslands
- \value Colombia
- \value Comoros
- \value CongoBrazzaville
- \value CongoKinshasa
- \value CookIslands
- \value CostaRica
- \value Croatia
- \value Cuba
- \value CuraSao
- \value Cyprus
- \value CzechRepublic
- \value DemocraticRepublicOfCongo Obsolete, please use CongoKinshasa
- \value DemocraticRepublicOfKorea Obsolete, please use NorthKorea
- \value Denmark
- \value DiegoGarcia
- \value Djibouti
- \value Dominica
- \value DominicanRepublic
- \value EastTimor
- \value Ecuador
- \value Egypt
- \value ElSalvador
- \value EquatorialGuinea
- \value Eritrea
- \value Estonia
- \value Ethiopia
- \value EuropeanUnion Since Qt 5.7
- \value Europe Since Qt 5.12
- \value FalklandIslands
- \value FaroeIslands
- \value Fiji
- \value Finland
- \value France
- \value FrenchGuiana
- \value FrenchPolynesia
- \value FrenchSouthernTerritories
- \value Gabon
- \value Gambia
- \value Georgia
- \value Germany
- \value Ghana
- \value Gibraltar
- \value Greece
- \value Greenland
- \value Grenada
- \value Guadeloupe
- \value Guam
- \value Guatemala
- \value Guernsey
- \value Guinea
- \value GuineaBissau
- \value Guyana
- \value Haiti
- \value HeardAndMcDonaldIslands
- \value Honduras
- \value HongKong
- \value Hungary
- \value Iceland
- \value India
- \value Indonesia
- \value Iran
- \value Iraq
- \value Ireland
- \value IsleOfMan
- \value Israel
- \value Italy
- \value IvoryCoast
- \value Jamaica
- \value Japan
- \value Jersey
- \value Jordan
- \value Kazakhstan
- \value Kenya
- \value Kiribati
- \value Kosovo Since Qt 5.2
- \value Kuwait
- \value Kyrgyzstan
- \value Laos
- \value LatinAmerica
- \value LatinAmericaAndTheCaribbean Obsolete, please use LatinAmerica
- \value Latvia
- \value Lebanon
- \value Lesotho
- \value Liberia
- \value Libya
- \value Liechtenstein
- \value Lithuania
- \value Luxembourg
- \value Macau
- \value Macedonia
- \value Madagascar
- \value Malawi
- \value Malaysia
- \value Maldives
- \value Mali
- \value Malta
- \value MarshallIslands
- \value Martinique
- \value Mauritania
- \value Mauritius
- \value Mayotte
- \value Mexico
- \value Micronesia
- \value Moldova
- \value Monaco
- \value Mongolia
- \value Montenegro
- \value Montserrat
- \value Morocco
- \value Mozambique
- \value Myanmar
- \value Namibia
- \value NauruCountry
- \value Nepal
- \value Netherlands
- \value NewCaledonia
- \value NewZealand
- \value Nicaragua
- \value Niger
- \value Nigeria
- \value Niue
- \value NorfolkIsland
- \value NorthernMarianaIslands
- \value NorthKorea
- \value Norway
- \value Oman
- \value OutlyingOceania Since Qt 5.7
- \value Pakistan
- \value Palau
- \value PalestinianTerritories
- \value Panama
- \value PapuaNewGuinea
- \value Paraguay
- \value PeoplesRepublicOfCongo Obsolete, please use CongoBrazzaville
- \value Peru
- \value Philippines
- \value Pitcairn
- \value Poland
- \value Portugal
- \value PuertoRico
- \value Qatar
- \value RepublicOfKorea Obsolete, please use SouthKorea
- \value Reunion
- \value Romania
- \value RussianFederation same as Russia
- \value Russia same as RussianFederation
- \value Rwanda
- \value SaintBarthelemy
- \value SaintHelena
- \value SaintKittsAndNevis
- \value SaintLucia
- \value SaintMartin
- \value SaintPierreAndMiquelon
- \value SaintVincentAndTheGrenadines
- \value Samoa
- \value SanMarino
- \value SaoTomeAndPrincipe
- \value SaudiArabia
- \value Senegal
- \value Serbia
- \value Seychelles
- \value SierraLeone
- \value Singapore
- \value SintMaarten
- \value Slovakia
- \value Slovenia
- \value SolomonIslands
- \value Somalia
- \value SouthAfrica
- \value SouthGeorgiaAndTheSouthSandwichIslands
- \value SouthKorea
- \value SouthSudan
- \value Spain
- \value SriLanka
- \value Sudan
- \value Suriname
- \value SvalbardAndJanMayenIslands
- \value Swaziland
- \value Sweden
- \value Switzerland
- \value Syria
- \value SyrianArabRepublic Obsolete, please use Syria
- \value Taiwan
- \value Tajikistan
- \value Tanzania
- \value Thailand
- \value Togo
- \value TokelauCountry
- \value Tokelau Obsolete, please use TokelauCountry
- \value Tonga
- \value TrinidadAndTobago
- \value TristanDaCunha
- \value Tunisia
- \value Turkey
- \value Turkmenistan
- \value TurksAndCaicosIslands
- \value TuvaluCountry
- \value Tuvalu Obsolete, please use TuvaluCountry
- \value Uganda
- \value Ukraine
- \value UnitedArabEmirates
- \value UnitedKingdom
- \value UnitedStates
- \value UnitedStatesMinorOutlyingIslands
- \value UnitedStatesVirginIslands
- \value Uruguay
- \value Uzbekistan
- \value Vanuatu
- \value VaticanCityState
- \value Venezuela
- \value Vietnam
- \value WallisAndFutunaIslands
- \value WesternSahara
- \value World Since Qt 5.12
- \value Yemen
- \value Zambia
- \value Zimbabwe
-
- \omitvalue LastCountry
-
- \sa country(), countryToString()
-*/
-
-/*!
- \enum QLocale::Script
-
- This enumerated type is used to specify a script.
-
- \value AnyScript
-
- \value AdlamScript Since Qt 5.7
- \value AhomScript Since Qt 5.7
- \value AnatolianHieroglyphsScript Since Qt 5.7
- \value ArabicScript
- \value ArmenianScript
- \value AvestanScript Since Qt 5.1
- \value BalineseScript Since Qt 5.1
- \value BamumScript Since Qt 5.1
- \value BassaVahScript Since Qt 5.5
- \value BatakScript Since Qt 5.1
- \value BengaliScript
- \value BhaiksukiScript Since Qt 5.7
- \value BopomofoScript Since Qt 5.1
- \value BrahmiScript Since Qt 5.1
- \value BrailleScript Since Qt 5.1
- \value BugineseScript Since Qt 5.1
- \value BuhidScript Since Qt 5.1
- \value CanadianAboriginalScript Since Qt 5.1
- \value CarianScript Since Qt 5.1
- \value CaucasianAlbanianScript Since Qt 5.5
- \value ChakmaScript Since Qt 5.1
- \value ChamScript Since Qt 5.1
- \value CherokeeScript
- \value CopticScript Since Qt 5.1
- \value CuneiformScript Since Qt 5.1
- \value CypriotScript Since Qt 5.1
- \value CyrillicScript
- \value DeseretScript Since Qt 5.1
- \value DevanagariScript
- \value DuployanScript Since Qt 5.5
- \value EgyptianHieroglyphsScript Since Qt 5.1
- \value ElbasanScript Since Qt 5.5
- \value EthiopicScript
- \value FraserScript Since Qt 5.1
- \value GeorgianScript
- \value GlagoliticScript Since Qt 5.1
- \value GothicScript Since Qt 5.1
- \value GranthaScript Since Qt 5.5
- \value GreekScript
- \value GujaratiScript
- \value GurmukhiScript
- \value HangulScript Since Qt 5.1
- \value HanScript Since Qt 5.1
- \value HanunooScript Since Qt 5.1
- \value HanWithBopomofoScript Since Qt 5.7
- \value HatranScript Since Qt 5.7
- \value HebrewScript
- \value HiraganaScript Since Qt 5.1
- \value ImperialAramaicScript Since Qt 5.1
- \value InscriptionalPahlaviScript Since Qt 5.1
- \value InscriptionalParthianScript Since Qt 5.1
- \value JamoScript Since Qt 5.7
- \value JapaneseScript
- \value JavaneseScript Since Qt 5.1
- \value KaithiScript Since Qt 5.1
- \value KannadaScript
- \value KatakanaScript Since Qt 5.1
- \value KayahLiScript Since Qt 5.1
- \value KharoshthiScript Since Qt 5.1
- \value KhmerScript Since Qt 5.1
- \value KhojkiScript Since Qt 5.5
- \value KhudawadiScript Since Qt 5.5
- \value KoreanScript
- \value LannaScript Since Qt 5.1
- \value LaoScript
- \value LatinScript
- \value LepchaScript Since Qt 5.1
- \value LimbuScript Since Qt 5.1
- \value LinearAScript Since Qt 5.5
- \value LinearBScript Since Qt 5.1
- \value LycianScript Since Qt 5.1
- \value LydianScript Since Qt 5.1
- \value MahajaniScript Since Qt 5.5
- \value MalayalamScript
- \value MandaeanScript Since Qt 5.1
- \value ManichaeanScript Since Qt 5.5
- \value MarchenScript Since Qt 5.7
- \value MeiteiMayekScript Since Qt 5.1
- \value MendeKikakuiScript Since Qt 5.5
- \value MeroiticCursiveScript Since Qt 5.1
- \value MeroiticScript Since Qt 5.1
- \value ModiScript Since Qt 5.5
- \value MongolianScript
- \value MroScript Since Qt 5.5
- \value MultaniScript Since Qt 5.7
- \value MyanmarScript
- \value NabataeanScript Since Qt 5.5
- \value NewaScript Since Qt 5.7
- \value NewTaiLueScript Since Qt 5.1
- \value NkoScript Since Qt 5.1
- \value OghamScript Since Qt 5.1
- \value OlChikiScript Since Qt 5.1
- \value OldHungarianScript Since Qt 5.7
- \value OldItalicScript Since Qt 5.1
- \value OldNorthArabianScript Since Qt 5.5
- \value OldPermicScript Since Qt 5.5
- \value OldPersianScript Since Qt 5.1
- \value OldSouthArabianScript Since Qt 5.1
- \value OriyaScript
- \value OrkhonScript Since Qt 5.1
- \value OsageScript Since Qt 5.7
- \value OsmanyaScript Since Qt 5.1
- \value PahawhHmongScript Since Qt 5.5
- \value PalmyreneScript Since Qt 5.5
- \value PauCinHauScript Since Qt 5.5
- \value PhagsPaScript Since Qt 5.1
- \value PhoenicianScript Since Qt 5.1
- \value PollardPhoneticScript Since Qt 5.1
- \value PsalterPahlaviScript Since Qt 5.5
- \value RejangScript Since Qt 5.1
- \value RunicScript Since Qt 5.1
- \value SamaritanScript Since Qt 5.1
- \value SaurashtraScript Since Qt 5.1
- \value SharadaScript Since Qt 5.1
- \value ShavianScript Since Qt 5.1
- \value SiddhamScript Since Qt 5.5
- \value SignWritingScript Since Qt 5.7
- \value SimplifiedChineseScript same as SimplifiedHanScript
- \value SimplifiedHanScript same as SimplifiedChineseScript
- \value SinhalaScript
- \value SoraSompengScript Since Qt 5.1
- \value SundaneseScript Since Qt 5.1
- \value SylotiNagriScript Since Qt 5.1
- \value SyriacScript
- \value TagalogScript Since Qt 5.1
- \value TagbanwaScript Since Qt 5.1
- \value TaiLeScript Since Qt 5.1
- \value TaiVietScript Since Qt 5.1
- \value TakriScript Since Qt 5.1
- \value TamilScript
- \value TangutScript Since Qt 5.7
- \value TeluguScript
- \value ThaanaScript
- \value ThaiScript
- \value TibetanScript
- \value TifinaghScript
- \value TirhutaScript Since Qt 5.5
- \value TraditionalChineseScript same as TraditionalHanScript
- \value TraditionalHanScript same as TraditionalChineseScript
- \value UgariticScript Since Qt 5.1
- \value VaiScript
- \value VarangKshitiScript Since Qt 5.5
- \value YiScript
-
- \omitvalue LastScript
-
- \sa script(), scriptToString(), languageToString()
-*/
-
-/*!
- \enum QLocale::FormatType
-
- This enum describes the types of format that can be used when
- converting QDate and QTime objects to strings.
-
- \value LongFormat The long version of day and month names; for
- example, returning "January" as a month name.
-
- \value ShortFormat The short version of day and month names; for
- example, returning "Jan" as a month name.
-
- \value NarrowFormat A special version of day and month names for
- use when space is limited; for example, returning "J" as a month
- name. Note that the narrow format might contain the same text for
- different months and days or it can even be an empty string if the
- locale doesn't support narrow names, so you should avoid using it
- for date formatting. Also, for the system locale this format is
- the same as ShortFormat.
-
- \sa QDateTime::toString(), QDate::toString(), QTime::toString()
-*/
-
-/*!
- \enum QLocale::NumberOption
-
- This enum defines a set of options for number-to-string and string-to-number
- conversions. They can be retrieved with numberOptions() and set with
- setNumberOptions().
-
- \value DefaultNumberOptions This option represents the default behavior, with
- group separators, with one leading zero in single digit exponents, and
- without trailing zeroes after the decimal dot.
- \value OmitGroupSeparator If this option is set, the number-to-string functions
- will not insert group separators in their return values. The default
- is to insert group separators.
- \value RejectGroupSeparator If this option is set, the string-to-number functions
- will fail if they encounter group separators in their input. The default
- is to accept numbers containing correctly placed group separators.
- \value OmitLeadingZeroInExponent If this option is set, the number-to-string
- functions will not pad exponents with zeroes when printing floating point
- numbers in scientific notation. The default is to add one leading zero to
- single digit exponents.
- \value RejectLeadingZeroInExponent If this option is set, the string-to-number
- functions will fail if they encounter an exponent padded with zeroes when
- parsing a floating point number in scientific notation. The default is to
- accept such padding.
- \value IncludeTrailingZeroesAfterDot If this option is set, the number-to-string
- functions will pad numbers with zeroes to the requested precision in "g"
- or "most concise" mode, even if the number of significant digits is lower
- than the requested precision. The default is to omit trailing zeroes.
- \value RejectTrailingZeroesAfterDot If this option is set, the string-to-number
- functions will fail if they encounter trailing zeroes after the decimal
- dot when parsing a number in scientific or decimal representation. The
- default is to accept trailing zeroes.
-
- \sa setNumberOptions(), numberOptions()
-*/
-
-/*!
- \enum QLocale::FloatingPointPrecisionOption
-
- This enum defines constants that can be given as precision to QString::number(),
- QByteArray::number(), and QLocale::toString() when converting floats or doubles,
- in order to express a variable number of digits as precision.
-
- \value FloatingPointShortest The conversion algorithm will try to find the
- shortest accurate representation for the given number. "Accurate" means
- that you get the exact same number back from an inverse conversion on
- the generated string representation.
-
- \sa toString(), QString, QByteArray
-
- \since 5.7
-*/
-
-/*!
- \enum QLocale::MeasurementSystem
-
- This enum defines which units are used for measurement.
-
- \value MetricSystem This value indicates metric units, such as meters,
- centimeters and millimeters.
- \value ImperialUSSystem This value indicates imperial units, such as inches and
- miles as they are used in the United States.
- \value ImperialUKSystem This value indicates imperial units, such as inches and
- miles as they are used in the United Kingdom.
- \value ImperialSystem Provided for compatibility. Same as ImperialUSSystem
-
- \since 4.4
-*/
-
-
-/*!
- \fn bool QLocale::operator==(const QLocale &other) const
-
- Returns \c true if the QLocale object is the same as the \a other
- locale specified; otherwise returns \c false.
-*/
-
-/*!
- \fn bool QLocale::operator!=(const QLocale &other) const
-
- Returns \c true if the QLocale object is not the same as the \a other
- locale specified; otherwise returns \c false.
-*/
-
-/*!
- \enum QLocale::QuotationStyle
-
- This enum defines a set of possible styles for locale specific quotation.
-
- \value StandardQuotation If this option is set, the standard quotation marks
- will be used to quote strings.
- \value AlternateQuotation If this option is set, the alternate quotation marks
- will be used to quote strings.
-
- \since 4.8
-
- \sa quoteString()
-*/
-
-/*!
- \internal
- \class QSystemLocale
- \inmodule QtCore
- \brief The QSystemLocale class can be used to finetune the system locale
- of the user.
- \since 4.2
-
- \ingroup i18n
-
- \warning This class is only useful in very rare cases. Usually QLocale offers
- all the functionality required for application development.
-
- QSystemLocale allows to override the values provided by the system
- locale (QLocale::system()).
-
- \sa QLocale
-*/
-
-/*!
- \enum QSystemLocale::QueryType
-
- Specifies the type of information queried by query(). For each value
- the type of information to return from the query() method is listed.
-
- \value LanguageId a uint specifying the language.
- \value ScriptId a uint specifying the script.
- \value CountryId a uint specifying the country.
- \value DecimalPoint a QString specifying the decimal point.
- \value GroupSeparator a QString specifying the group separator.
- \value ZeroDigit a QString specifying the zero digit.
- \value NegativeSign a QString specifying the minus sign.
- \value PositiveSign a QString specifying the plus sign.
- \value DateFormatLong a QString specifying the long date format
- \value DateFormatShort a QString specifying the short date format
- \value TimeFormatLong a QString specifying the long time format
- \value TimeFormatShort a QString specifying the short time format
- \value DayNameLong a QString specifying the name of a weekday. the in variant contains an integer between 1 and 7 (Monday - Sunday)
- \value DayNameShort a QString specifying the short name of a weekday. the in variant contains an integer between 1 and 7 (Monday - Sunday)
- \value MonthNameLong a QString specifying the name of a month. the in variant contains an integer between 1 and 12
- \value MonthNameShort a QString specifying the short name of a month. the in variant contains an integer between 1 and 12
- \value DateToStringLong converts the QDate stored in the in variant to a QString using the long date format
- \value DateToStringShort converts the QDate stored in the in variant to a QString using the short date format
- \value TimeToStringLong converts the QTime stored in the in variant to a QString using the long time format
- \value TimeToStringShort converts the QTime stored in the in variant to a QString using the short time format
- \value DateTimeFormatLong a QString specifying the long date time format
- \value DateTimeFormatShort a QString specifying the short date time format
- \value DateTimeToStringLong converts the QDateTime in the in variant to a QString using the long datetime format
- \value DateTimeToStringShort converts the QDateTime in the in variant to a QString using the short datetime format
- \value MeasurementSystem a QLocale::MeasurementSystem enum specifying the measurement system
- \value AMText a string that represents the system AM designator associated with a 12-hour clock.
- \value PMText a string that represents the system PM designator associated with a 12-hour clock.
- \value FirstDayOfWeek a Qt::DayOfWeek enum specifiying the first day of the week
- \value CurrencySymbol a string that represents a currency in a format QLocale::CurrencyFormat.
- \value CurrencyToString a localized string representation of a number with a currency symbol. Converts a QSystemLocale::CurrencyToStringArgument stored in the in variant to a QString.
- \value UILanguages a list of strings representing locale names that could be used for UI translation.
- \value StringToStandardQuotation a QString containing a quoted version of the string ref stored in the in variant using standard quotes.
- \value StringToAlternateQuotation a QString containing a quoted version of the string ref stored in the in variant using alternate quotes.
- \value Weekdays a QList<Qt::DayOfWeek> specifying the regular weekdays
- \value LocaleChanged this type is queried whenever the system locale is changed.
- \value ListToSeparatedString a string that represents a join of a given QStringList with a locale-defined separator.
- \value NativeLanguageName a string that represents the name of the native language.
- \value NativeCountryName a string that represents the name of the native country.
-
- \sa FormatType
-*/
-
-/*!
- \fn QLocale QSystemLocale::fallbackUiLocale() const
-
- \since 4.6
- Returns the fallback locale obtained from the system.
-*/
-
-/*!
- \fn QVariant QSystemLocale::query(QueryType type, QVariant in = QVariant()) const
-
- Generic query method for locale data. Provides indirection.
- Denotes the \a type of the query
- with \a in as input data depending on the query.
-
- \sa QSystemLocale::QueryType
-*/
-
-/*!
- \class QSystemLocale::CurrencyToStringArgument
- \inmodule QtCore
-
- A helper class that provides arguments for the QSystemLocale::query()
- function with query type QSystemLocale::CurrencyToString.
-
- \sa QSystemLocale::QueryType
- \since 4.8
-*/
-
-/*!
- \fn QSystemLocale::CurrencyToStringArgument::CurrencyToStringArgument()
- \internal
-*/
-/*!
- \variable QSystemLocale::CurrencyToStringArgument::value
-
- An input value that should be converted to its string representation.
- Contains one of QVariant::LongLong, QVariant::ULongLong or QVariant::Double
- types.
-*/
-/*!
- \variable QSystemLocale::CurrencyToStringArgument::symbol
-
- An optional argument containing a currency symbol to be used in the
- currency string.
-*/
-
-/*!
-\fn QString QLocale::toString(long i) const
-
-\overload
-
-\sa toLong()
-*/
-
-/*!
-\fn QString QLocale::toString(ulong i) const
-
-\overload
-
-\sa toULong()
-*/
-
-/*!
-\fn QString QLocale::toString(ushort i) const
-
-\overload
-
-\sa toUShort()
-*/
-
-
-/*!
-\fn QString QLocale::toString(short i) const
-
-\overload
-
-\sa toShort()
-*/
-
-/*!
-\fn QString QLocale::toString(ushort i) const
-
-\overload
-
-\sa toUShort()
-*/
-
-/*!
-\fn QString QLocale::toString(int i) const
-
-\overload
-
-\sa toInt()
-*/
-
-/*!
-\fn QString QLocale::toString(uint i) const
-
-\overload
-
-\sa toUInt()
-*/
-
-/*
-\fn QString QLocale::toString(long i) const
-
-\overload
-
-\sa toLong()
-*/
-
-/*
-\fn QString QLocale::toString(ulong i) const
-
-\overload
-
-\sa toULong()
-*/
-
-/*!
-\fn QString QLocale::toString(float i, char f = 'g', int prec = 6) const
-
-\overload
-
-\a f and \a prec have the same meaning as in QString::number(double, char, int).
-
-\sa toDouble()
-*/
-
-/*!
- \fn QString QLocale::toCurrencyString(short value, const QString &symbol) const
- \since 4.8
- \overload
-*/
-
-/*!
- \fn QString QLocale::toCurrencyString(ushort value, const QString &symbol) const
- \since 4.8
- \overload
-*/
-
-/*!
- \fn QString QLocale::toCurrencyString(int value, const QString &symbol) const
- \since 4.8
- \overload
-*/
-
-/*!
- \fn QString QLocale::toCurrencyString(uint value, const QString &symbol) const
- \since 4.8
- \overload
-*/
-/*!
- \fn QString QLocale::toCurrencyString(float value, const QString &symbol) const
- \since 4.8
- \overload
-*/
diff --git a/src/corelib/tools/qlocale_data_p.h b/src/corelib/tools/qlocale_data_p.h
deleted file mode 100644
index cc9f99ae20..0000000000
--- a/src/corelib/tools/qlocale_data_p.h
+++ /dev/null
@@ -1,8789 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#ifndef QLOCALE_DATA_P_H
-#define QLOCALE_DATA_P_H
-
-//
-// W A R N I N G
-// -------------
-//
-// This file is not part of the Qt API. It exists for the convenience
-// of qapplication_*.cpp, qwidget*.cpp and qfiledialog.cpp. This header
-// file may change from version to version without notice, or even be removed.
-//
-// We mean it.
-//
-
-#include <QtCore/private/qglobal_p.h>
-
-QT_BEGIN_NAMESPACE
-
-/* This part of the file isn't generated, but written by hand since
- * Unicode CLDR doesn't contain measurement system information.
- */
-struct CountryLanguage
-{
- quint16 languageId;
- quint16 countryId;
- QLocale::MeasurementSystem system;
-};
-static const CountryLanguage ImperialMeasurementSystems[] = {
- { QLocale::English, QLocale::UnitedStates, QLocale::ImperialUSSystem },
- { QLocale::English, QLocale::UnitedStatesMinorOutlyingIslands, QLocale::ImperialUSSystem },
- { QLocale::Spanish, QLocale::UnitedStates, QLocale::ImperialUSSystem },
- { QLocale::Hawaiian, QLocale::UnitedStates, QLocale::ImperialUSSystem },
- { QLocale::English, QLocale::UnitedKingdom, QLocale::ImperialUKSystem }
-};
-static const int ImperialMeasurementSystemsCount =
- sizeof(ImperialMeasurementSystems)/sizeof(ImperialMeasurementSystems[0]);
-
-// GENERATED PART STARTS HERE
-
-/*
- This part of the file was generated on 2019-05-09 from the
- Common Locale Data Repository v35.1
-
- http://www.unicode.org/cldr/
-
- Do not edit this section: instead regenerate it using
- cldr2qlocalexml.py and qlocalexml2cpp.py on updated (or
- edited) CLDR data; see qtbase/util/local_database/.
-*/
-
-static const QLocaleId likely_subtags[] = {
- { 4, 0, 0 }, { 4, 7, 69 }, // aa -> aa_Latn_ET
- { 2, 0, 0 }, { 2, 2, 81 }, // ab -> ab_Cyrl_GE
- { 255, 0, 0 }, { 255, 36, 102 }, // ae -> ae_Avst_IR
- { 5, 0, 0 }, { 5, 7, 195 }, // af -> af_Latn_ZA
- { 237, 0, 0 }, { 237, 7, 37 }, // agq -> agq_Latn_CM
- { 340, 0, 0 }, { 340, 128, 100 }, // aho -> aho_Ahom_IN
- { 146, 0, 0 }, { 146, 7, 83 }, // ak -> ak_Latn_GH
- { 262, 0, 0 }, { 262, 94, 103 }, // akk -> akk_Xsux_IQ
- { 7, 0, 0 }, { 7, 14, 69 }, // am -> am_Ethi_ET
- { 8, 0, 0 }, { 8, 1, 64 }, // ar -> ar_Arab_EG
- { 265, 0, 0 }, { 265, 57, 102 }, // arc -> arc_Armi_IR
- { 265, 119, 0 }, { 265, 119, 109 }, // arc_Nbat -> arc_Nbat_JO
- { 265, 120, 0 }, { 265, 120, 207 }, // arc_Palm -> arc_Palm_SY
- { 315, 0, 0 }, { 315, 7, 43 }, // arn -> arn_Latn_CL
- { 10, 0, 0 }, { 10, 11, 100 }, // as -> as_Beng_IN
- { 205, 0, 0 }, { 205, 7, 210 }, // asa -> asa_Latn_TZ
- { 341, 0, 0 }, { 341, 133, 225 }, // ase -> ase_Sgnw_US
- { 256, 0, 0 }, { 256, 7, 197 }, // ast -> ast_Latn_ES
- { 216, 0, 0 }, { 216, 2, 178 }, // av -> av_Cyrl_RU
- { 11, 0, 0 }, { 11, 7, 26 }, // ay -> ay_Latn_BO
- { 12, 0, 0 }, { 12, 7, 15 }, // az -> az_Latn_AZ
- { 12, 0, 103 }, { 12, 1, 103 }, // az_IQ -> az_Arab_IQ
- { 12, 0, 102 }, { 12, 1, 102 }, // az_IR -> az_Arab_IR
- { 12, 0, 178 }, { 12, 2, 178 }, // az_RU -> az_Cyrl_RU
- { 12, 1, 0 }, { 12, 1, 102 }, // az_Arab -> az_Arab_IR
- { 13, 0, 0 }, { 13, 2, 178 }, // ba -> ba_Cyrl_RU
- { 266, 0, 0 }, { 266, 7, 101 }, // ban -> ban_Latn_ID
- { 238, 0, 0 }, { 238, 7, 37 }, // bas -> bas_Latn_CM
- { 267, 0, 0 }, { 267, 38, 37 }, // bax -> bax_Bamu_CM
- { 268, 0, 0 }, { 268, 7, 101 }, // bbc -> bbc_Latn_ID
- { 22, 0, 0 }, { 22, 2, 20 }, // be -> be_Cyrl_BY
- { 195, 0, 0 }, { 195, 7, 239 }, // bem -> bem_Latn_ZM
- { 186, 0, 0 }, { 186, 7, 210 }, // bez -> bez_Latn_TZ
- { 20, 0, 0 }, { 20, 2, 33 }, // bg -> bg_Cyrl_BG
- { 364, 0, 0 }, { 364, 1, 163 }, // bgn -> bgn_Arab_PK
- { 343, 0, 0 }, { 343, 13, 100 }, // bho -> bho_Deva_IN
- { 18, 0, 0 }, { 18, 7, 229 }, // bi -> bi_Latn_VU
- { 270, 0, 0 }, { 270, 7, 170 }, // bku -> bku_Latn_PH
- { 309, 0, 0 }, { 309, 100, 232 }, // blt -> blt_Tavt_VN
- { 188, 0, 0 }, { 188, 7, 132 }, // bm -> bm_Latn_ML
- { 15, 0, 0 }, { 15, 11, 18 }, // bn -> bn_Beng_BD
- { 121, 0, 0 }, { 121, 31, 44 }, // bo -> bo_Tibt_CN
- { 19, 0, 0 }, { 19, 7, 74 }, // br -> br_Latn_FR
- { 215, 0, 0 }, { 215, 13, 100 }, // brx -> brx_Deva_IN
- { 142, 0, 0 }, { 142, 7, 27 }, // bs -> bs_Latn_BA
- { 336, 0, 0 }, { 336, 106, 121 }, // bsq -> bsq_Bass_LR
- { 312, 0, 0 }, { 312, 7, 37 }, // bss -> bss_Latn_CM
- { 269, 0, 0 }, { 269, 7, 101 }, // bug -> bug_Latn_ID
- { 152, 0, 0 }, { 152, 14, 67 }, // byn -> byn_Ethi_ER
- { 24, 0, 0 }, { 24, 7, 197 }, // ca -> ca_Latn_ES
- { 156, 0, 0 }, { 156, 7, 157 }, // cch -> cch_Latn_NG
- { 272, 0, 0 }, { 272, 46, 18 }, // ccp -> ccp_Cakm_BD
- { 218, 0, 0 }, { 218, 2, 178 }, // ce -> ce_Cyrl_RU
- { 211, 0, 0 }, { 211, 7, 221 }, // cgg -> cgg_Latn_UG
- { 217, 0, 0 }, { 217, 7, 89 }, // ch -> ch_Latn_GU
- { 190, 0, 0 }, { 190, 12, 225 }, // chr -> chr_Cher_US
- { 276, 0, 0 }, { 276, 47, 232 }, // cjm -> cjm_Cham_VN
- { 316, 0, 0 }, { 316, 1, 103 }, // ckb -> ckb_Arab_IQ
- { 26, 0, 0 }, { 26, 7, 74 }, // co -> co_Latn_FR
- { 274, 0, 0 }, { 274, 48, 64 }, // cop -> cop_Copt_EG
- { 221, 0, 0 }, { 221, 44, 38 }, // cr -> cr_Cans_CA
- { 28, 0, 0 }, { 28, 7, 57 }, // cs -> cs_Latn_CZ
- { 338, 0, 0 }, { 338, 121, 147 }, // ctd -> ctd_Pauc_MM
- { 219, 0, 0 }, { 219, 2, 178 }, // cu -> cu_Cyrl_RU
- { 219, 52, 0 }, { 219, 52, 33 }, // cu_Glag -> cu_Glag_BG
- { 220, 0, 0 }, { 220, 2, 178 }, // cv -> cv_Cyrl_RU
- { 134, 0, 0 }, { 134, 7, 224 }, // cy -> cy_Latn_GB
- { 29, 0, 0 }, { 29, 7, 58 }, // da -> da_Latn_DK
- { 176, 0, 0 }, { 176, 7, 111 }, // dav -> dav_Latn_KE
- { 42, 0, 0 }, { 42, 7, 82 }, // de -> de_Latn_DE
- { 239, 0, 0 }, { 239, 7, 156 }, // dje -> dje_Latn_NE
- { 275, 0, 0 }, { 275, 1, 100 }, // doi -> doi_Arab_IN
- { 317, 0, 0 }, { 317, 7, 82 }, // dsb -> dsb_Latn_DE
- { 240, 0, 0 }, { 240, 7, 37 }, // dua -> dua_Latn_CM
- { 143, 0, 0 }, { 143, 29, 131 }, // dv -> dv_Thaa_MV
- { 241, 0, 0 }, { 241, 7, 187 }, // dyo -> dyo_Latn_SN
- { 16, 0, 0 }, { 16, 31, 25 }, // dz -> dz_Tibt_BT
- { 189, 0, 0 }, { 189, 7, 111 }, // ebu -> ebu_Latn_KE
- { 161, 0, 0 }, { 161, 7, 83 }, // ee -> ee_Latn_GH
- { 263, 0, 0 }, { 263, 50, 64 }, // egy -> egy_Egyp_EG
- { 277, 0, 0 }, { 277, 63, 147 }, // eky -> eky_Kali_MM
- { 43, 0, 0 }, { 43, 16, 85 }, // el -> el_Grek_GR
- { 31, 0, 0 }, { 31, 7, 225 }, // en -> en_Latn_US
- { 31, 92, 0 }, { 31, 92, 224 }, // en_Shaw -> en_Shaw_GB
- { 32, 0, 0 }, { 32, 7, 260 }, // eo -> eo_Latn_001
- { 111, 0, 0 }, { 111, 7, 197 }, // es -> es_Latn_ES
- { 33, 0, 0 }, { 33, 7, 68 }, // et -> et_Latn_EE
- { 278, 0, 0 }, { 278, 79, 106 }, // ett -> ett_Ital_IT
- { 14, 0, 0 }, { 14, 7, 197 }, // eu -> eu_Latn_ES
- { 242, 0, 0 }, { 242, 7, 37 }, // ewo -> ewo_Latn_CM
- { 89, 0, 0 }, { 89, 1, 102 }, // fa -> fa_Arab_IR
- { 177, 0, 0 }, { 177, 7, 187 }, // ff -> ff_Latn_SN
- { 177, 134, 0 }, { 177, 134, 91 }, // ff_Adlm -> ff_Adlm_GN
- { 36, 0, 0 }, { 36, 7, 73 }, // fi -> fi_Latn_FI
- { 166, 0, 0 }, { 166, 7, 170 }, // fil -> fil_Latn_PH
- { 35, 0, 0 }, { 35, 7, 72 }, // fj -> fj_Latn_FJ
- { 34, 0, 0 }, { 34, 7, 71 }, // fo -> fo_Latn_FO
- { 37, 0, 0 }, { 37, 7, 74 }, // fr -> fr_Latn_FR
- { 159, 0, 0 }, { 159, 7, 106 }, // fur -> fur_Latn_IT
- { 38, 0, 0 }, { 38, 7, 151 }, // fy -> fy_Latn_NL
- { 57, 0, 0 }, { 57, 7, 104 }, // ga -> ga_Latn_IE
- { 148, 0, 0 }, { 148, 7, 83 }, // gaa -> gaa_Latn_GH
- { 39, 0, 0 }, { 39, 7, 224 }, // gd -> gd_Latn_GB
- { 153, 0, 0 }, { 153, 14, 69 }, // gez -> gez_Ethi_ET
- { 40, 0, 0 }, { 40, 7, 197 }, // gl -> gl_Latn_ES
- { 45, 0, 0 }, { 45, 7, 168 }, // gn -> gn_Latn_PY
- { 279, 0, 0 }, { 279, 53, 222 }, // got -> got_Goth_UA
- { 264, 0, 0 }, { 264, 49, 56 }, // grc -> grc_Cprt_CY
- { 264, 68, 0 }, { 264, 68, 85 }, // grc_Linb -> grc_Linb_GR
- { 167, 0, 0 }, { 167, 7, 206 }, // gsw -> gsw_Latn_CH
- { 46, 0, 0 }, { 46, 17, 100 }, // gu -> gu_Gujr_IN
- { 175, 0, 0 }, { 175, 7, 111 }, // guz -> guz_Latn_KE
- { 144, 0, 0 }, { 144, 7, 251 }, // gv -> gv_Latn_IM
- { 47, 0, 0 }, { 47, 7, 157 }, // ha -> ha_Latn_NG
- { 47, 0, 37 }, { 47, 1, 37 }, // ha_CM -> ha_Arab_CM
- { 47, 0, 201 }, { 47, 1, 201 }, // ha_SD -> ha_Arab_SD
- { 163, 0, 0 }, { 163, 7, 225 }, // haw -> haw_Latn_US
- { 48, 0, 0 }, { 48, 18, 105 }, // he -> he_Hebr_IL
- { 49, 0, 0 }, { 49, 13, 100 }, // hi -> hi_Deva_IN
- { 344, 0, 0 }, { 344, 129, 217 }, // hlu -> hlu_Hluw_TR
- { 282, 0, 0 }, { 282, 86, 44 }, // hmd -> hmd_Plrd_CN
- { 333, 0, 0 }, { 333, 110, 117 }, // hnj -> hnj_Hmng_LA
- { 280, 0, 0 }, { 280, 7, 170 }, // hnn -> hnn_Latn_PH
- { 224, 0, 0 }, { 224, 7, 167 }, // ho -> ho_Latn_PG
- { 334, 0, 0 }, { 334, 13, 100 }, // hoc -> hoc_Deva_IN
- { 27, 0, 0 }, { 27, 7, 54 }, // hr -> hr_Latn_HR
- { 318, 0, 0 }, { 318, 7, 82 }, // hsb -> hsb_Latn_DE
- { 222, 0, 0 }, { 222, 7, 94 }, // ht -> ht_Latn_HT
- { 50, 0, 0 }, { 50, 7, 98 }, // hu -> hu_Latn_HU
- { 9, 0, 0 }, { 9, 10, 11 }, // hy -> hy_Armn_AM
- { 223, 0, 0 }, { 223, 7, 148 }, // hz -> hz_Latn_NA
- { 53, 0, 0 }, { 53, 7, 260 }, // ia -> ia_Latn_001
- { 52, 0, 0 }, { 52, 7, 101 }, // id -> id_Latn_ID
- { 149, 0, 0 }, { 149, 7, 157 }, // ig -> ig_Latn_NG
- { 168, 0, 0 }, { 168, 34, 44 }, // ii -> ii_Yiii_CN
- { 56, 0, 0 }, { 56, 7, 225 }, // ik -> ik_Latn_US
- { 281, 0, 0 }, { 281, 2, 178 }, // inh -> inh_Cyrl_RU
- { 360, 0, 0 }, { 360, 7, 260 }, // io -> io_Latn_001
- { 51, 0, 0 }, { 51, 7, 99 }, // is -> is_Latn_IS
- { 58, 0, 0 }, { 58, 7, 106 }, // it -> it_Latn_IT
- { 55, 0, 0 }, { 55, 44, 38 }, // iu -> iu_Cans_CA
- { 59, 0, 0 }, { 59, 19, 108 }, // ja -> ja_Jpan_JP
- { 361, 0, 0 }, { 361, 7, 260 }, // jbo -> jbo_Latn_001
- { 257, 0, 0 }, { 257, 7, 37 }, // jgo -> jgo_Latn_CM
- { 200, 0, 0 }, { 200, 7, 210 }, // jmc -> jmc_Latn_TZ
- { 60, 0, 0 }, { 60, 7, 101 }, // jv -> jv_Latn_ID
- { 41, 0, 0 }, { 41, 15, 81 }, // ka -> ka_Geor_GE
- { 184, 0, 0 }, { 184, 7, 3 }, // kab -> kab_Latn_DZ
- { 158, 0, 0 }, { 158, 7, 157 }, // kaj -> kaj_Latn_NG
- { 150, 0, 0 }, { 150, 7, 111 }, // kam -> kam_Latn_KE
- { 164, 0, 0 }, { 164, 7, 157 }, // kcg -> kcg_Latn_NG
- { 192, 0, 0 }, { 192, 7, 210 }, // kde -> kde_Latn_TZ
- { 196, 0, 0 }, { 196, 7, 39 }, // kea -> kea_Latn_CV
- { 319, 0, 0 }, { 319, 7, 37 }, // ken -> ken_Latn_CM
- { 154, 0, 0 }, { 154, 7, 53 }, // kfo -> kfo_Latn_CI
- { 227, 0, 0 }, { 227, 7, 49 }, // kg -> kg_Latn_CD
- { 286, 0, 0 }, { 286, 76, 44 }, // khb -> khb_Talu_CN
- { 208, 0, 0 }, { 208, 7, 132 }, // khq -> khq_Latn_ML
- { 178, 0, 0 }, { 178, 7, 111 }, // ki -> ki_Latn_KE
- { 228, 0, 0 }, { 228, 7, 148 }, // kj -> kj_Latn_NA
- { 63, 0, 0 }, { 63, 2, 110 }, // kk -> kk_Cyrl_KZ
- { 63, 0, 1 }, { 63, 1, 1 }, // kk_AF -> kk_Arab_AF
- { 63, 0, 44 }, { 63, 1, 44 }, // kk_CN -> kk_Arab_CN
- { 63, 0, 102 }, { 63, 1, 102 }, // kk_IR -> kk_Arab_IR
- { 63, 0, 143 }, { 63, 1, 143 }, // kk_MN -> kk_Arab_MN
- { 63, 1, 0 }, { 63, 1, 44 }, // kk_Arab -> kk_Arab_CN
- { 258, 0, 0 }, { 258, 7, 37 }, // kkj -> kkj_Latn_CM
- { 44, 0, 0 }, { 44, 7, 86 }, // kl -> kl_Latn_GL
- { 198, 0, 0 }, { 198, 7, 111 }, // kln -> kln_Latn_KE
- { 23, 0, 0 }, { 23, 20, 36 }, // km -> km_Khmr_KH
- { 61, 0, 0 }, { 61, 21, 100 }, // kn -> kn_Knda_IN
- { 66, 0, 0 }, { 66, 22, 114 }, // ko -> ko_Kore_KR
- { 147, 0, 0 }, { 147, 13, 100 }, // kok -> kok_Deva_IN
- { 169, 0, 0 }, { 169, 7, 121 }, // kpe -> kpe_Latn_LR
- { 225, 0, 0 }, { 225, 7, 0 }, // kr -> kr_Latn
- { 62, 0, 0 }, { 62, 1, 100 }, // ks -> ks_Arab_IN
- { 214, 0, 0 }, { 214, 7, 210 }, // ksb -> ksb_Latn_TZ
- { 243, 0, 0 }, { 243, 7, 37 }, // ksf -> ksf_Latn_CM
- { 201, 0, 0 }, { 201, 7, 82 }, // ksh -> ksh_Latn_DE
- { 67, 0, 0 }, { 67, 7, 217 }, // ku -> ku_Latn_TR
- { 67, 0, 119 }, { 67, 1, 119 }, // ku_LB -> ku_Arab_LB
- { 67, 1, 0 }, { 67, 1, 103 }, // ku_Arab -> ku_Arab_IQ
- { 226, 0, 0 }, { 226, 2, 178 }, // kv -> kv_Cyrl_RU
- { 145, 0, 0 }, { 145, 7, 224 }, // kw -> kw_Latn_GB
- { 65, 0, 0 }, { 65, 2, 116 }, // ky -> ky_Cyrl_KG
- { 65, 0, 44 }, { 65, 1, 44 }, // ky_CN -> ky_Arab_CN
- { 65, 0, 217 }, { 65, 7, 217 }, // ky_TR -> ky_Latn_TR
- { 65, 1, 0 }, { 65, 1, 44 }, // ky_Arab -> ky_Arab_CN
- { 65, 7, 0 }, { 65, 7, 217 }, // ky_Latn -> ky_Latn_TR
- { 70, 0, 0 }, { 70, 7, 230 }, // la -> la_Latn_VA
- { 332, 0, 0 }, { 332, 112, 85 }, // lab -> lab_Lina_GR
- { 193, 0, 0 }, { 193, 7, 210 }, // lag -> lag_Latn_TZ
- { 231, 0, 0 }, { 231, 7, 125 }, // lb -> lb_Latn_LU
- { 283, 0, 0 }, { 283, 66, 100 }, // lep -> lep_Lepc_IN
- { 335, 0, 0 }, { 335, 2, 178 }, // lez -> lez_Cyrl_RU
- { 194, 0, 0 }, { 194, 7, 221 }, // lg -> lg_Latn_UG
- { 229, 0, 0 }, { 229, 7, 151 }, // li -> li_Latn_NL
- { 284, 0, 0 }, { 284, 13, 150 }, // lif -> lif_Deva_NP
- { 284, 67, 0 }, { 284, 67, 100 }, // lif_Limb -> lif_Limb_IN
- { 285, 0, 0 }, { 285, 51, 44 }, // lis -> lis_Lisu_CN
- { 313, 0, 0 }, { 313, 7, 225 }, // lkt -> lkt_Latn_US
- { 72, 0, 0 }, { 72, 7, 49 }, // ln -> ln_Latn_CD
- { 69, 0, 0 }, { 69, 23, 117 }, // lo -> lo_Laoo_LA
- { 349, 0, 0 }, { 349, 1, 102 }, // lrc -> lrc_Arab_IR
- { 73, 0, 0 }, { 73, 7, 124 }, // lt -> lt_Latn_LT
- { 230, 0, 0 }, { 230, 7, 49 }, // lu -> lu_Latn_CD
- { 210, 0, 0 }, { 210, 7, 111 }, // luo -> luo_Latn_KE
- { 204, 0, 0 }, { 204, 7, 111 }, // luy -> luy_Latn_KE
- { 71, 0, 0 }, { 71, 7, 118 }, // lv -> lv_Latn_LV
- { 345, 0, 0 }, { 345, 5, 44 }, // lzh -> lzh_Hans_CN
- { 339, 0, 0 }, { 339, 13, 100 }, // mai -> mai_Deva_IN
- { 289, 0, 0 }, { 289, 7, 80 }, // man -> man_Latn_GM
- { 289, 0, 91 }, { 289, 75, 91 }, // man_GN -> man_Nkoo_GN
- { 289, 75, 0 }, { 289, 75, 91 }, // man_Nkoo -> man_Nkoo_GN
- { 202, 0, 0 }, { 202, 7, 111 }, // mas -> mas_Latn_KE
- { 330, 0, 0 }, { 330, 7, 189 }, // men -> men_Latn_SL
- { 197, 0, 0 }, { 197, 7, 111 }, // mer -> mer_Latn_KE
- { 191, 0, 0 }, { 191, 7, 137 }, // mfe -> mfe_Latn_MU
- { 75, 0, 0 }, { 75, 7, 128 }, // mg -> mg_Latn_MG
- { 244, 0, 0 }, { 244, 7, 146 }, // mgh -> mgh_Latn_MZ
- { 259, 0, 0 }, { 259, 7, 37 }, // mgo -> mgo_Latn_CM
- { 81, 0, 0 }, { 81, 7, 134 }, // mh -> mh_Latn_MH
- { 79, 0, 0 }, { 79, 7, 154 }, // mi -> mi_Latn_NZ
- { 356, 0, 0 }, { 356, 130, 103 }, // mis -> mis_Hatr_IQ
- { 74, 0, 0 }, { 74, 2, 127 }, // mk -> mk_Cyrl_MK
- { 77, 0, 0 }, { 77, 24, 100 }, // ml -> ml_Mlym_IN
- { 82, 0, 0 }, { 82, 2, 143 }, // mn -> mn_Cyrl_MN
- { 82, 0, 44 }, { 82, 8, 44 }, // mn_CN -> mn_Mong_CN
- { 82, 8, 0 }, { 82, 8, 44 }, // mn_Mong -> mn_Mong_CN
- { 290, 0, 0 }, { 290, 11, 100 }, // mni -> mni_Beng_IN
- { 320, 0, 0 }, { 320, 7, 38 }, // moh -> moh_Latn_CA
- { 80, 0, 0 }, { 80, 13, 100 }, // mr -> mr_Deva_IN
- { 347, 0, 0 }, { 347, 117, 18 }, // mro -> mro_Mroo_BD
- { 76, 0, 0 }, { 76, 7, 130 }, // ms -> ms_Latn_MY
- { 76, 0, 46 }, { 76, 1, 46 }, // ms_CC -> ms_Arab_CC
- { 76, 0, 101 }, { 76, 1, 101 }, // ms_ID -> ms_Arab_ID
- { 78, 0, 0 }, { 78, 7, 133 }, // mt -> mt_Latn_MT
- { 245, 0, 0 }, { 245, 7, 37 }, // mua -> mua_Latn_CM
- { 21, 0, 0 }, { 21, 25, 147 }, // my -> my_Mymr_MM
- { 273, 0, 0 }, { 273, 71, 102 }, // myz -> myz_Mand_IR
- { 346, 0, 0 }, { 346, 1, 102 }, // mzn -> mzn_Arab_IR
- { 83, 0, 0 }, { 83, 7, 149 }, // na -> na_Latn_NR
- { 199, 0, 0 }, { 199, 7, 148 }, // naq -> naq_Latn_NA
- { 85, 0, 0 }, { 85, 7, 161 }, // nb -> nb_Latn_NO
- { 181, 0, 0 }, { 181, 7, 240 }, // nd -> nd_Latn_ZW
- { 170, 0, 0 }, { 170, 7, 82 }, // nds -> nds_Latn_DE
- { 84, 0, 0 }, { 84, 13, 150 }, // ne -> ne_Deva_NP
- { 348, 0, 0 }, { 348, 13, 150 }, // new -> new_Deva_NP
- { 233, 0, 0 }, { 233, 7, 148 }, // ng -> ng_Latn_NA
- { 30, 0, 0 }, { 30, 7, 151 }, // nl -> nl_Latn_NL
- { 246, 0, 0 }, { 246, 7, 37 }, // nmg -> nmg_Latn_CM
- { 141, 0, 0 }, { 141, 7, 161 }, // nn -> nn_Latn_NO
- { 260, 0, 0 }, { 260, 7, 37 }, // nnh -> nnh_Latn_CM
- { 292, 0, 0 }, { 292, 65, 211 }, // nod -> nod_Lana_TH
- { 294, 0, 0 }, { 294, 88, 205 }, // non -> non_Runr_SE
- { 321, 0, 0 }, { 321, 75, 91 }, // nqo -> nqo_Nkoo_GN
- { 171, 0, 0 }, { 171, 7, 195 }, // nr -> nr_Latn_ZA
- { 172, 0, 0 }, { 172, 7, 195 }, // nso -> nso_Latn_ZA
- { 247, 0, 0 }, { 247, 7, 254 }, // nus -> nus_Latn_SS
- { 232, 0, 0 }, { 232, 7, 225 }, // nv -> nv_Latn_US
- { 165, 0, 0 }, { 165, 7, 129 }, // ny -> ny_Latn_MW
- { 185, 0, 0 }, { 185, 7, 221 }, // nyn -> nyn_Latn_UG
- { 86, 0, 0 }, { 86, 7, 74 }, // oc -> oc_Latn_FR
- { 3, 0, 0 }, { 3, 7, 69 }, // om -> om_Latn_ET
- { 87, 0, 0 }, { 87, 26, 100 }, // or -> or_Orya_IN
- { 101, 0, 0 }, { 101, 2, 81 }, // os -> os_Cyrl_GE
- { 358, 0, 0 }, { 358, 138, 225 }, // osa -> osa_Osge_US
- { 296, 0, 0 }, { 296, 82, 143 }, // otk -> otk_Orkh_MN
- { 92, 0, 0 }, { 92, 4, 100 }, // pa -> pa_Guru_IN
- { 92, 0, 163 }, { 92, 1, 163 }, // pa_PK -> pa_Arab_PK
- { 92, 1, 0 }, { 92, 1, 163 }, // pa_Arab -> pa_Arab_PK
- { 297, 0, 0 }, { 297, 58, 102 }, // pal -> pal_Phli_IR
- { 297, 123, 0 }, { 297, 123, 44 }, // pal_Phlp -> pal_Phlp_CN
- { 351, 0, 0 }, { 351, 7, 12 }, // pap -> pap_Latn_AW
- { 350, 0, 0 }, { 350, 7, 164 }, // pau -> pau_Latn_PW
- { 295, 0, 0 }, { 295, 80, 102 }, // peo -> peo_Xpeo_IR
- { 299, 0, 0 }, { 299, 85, 119 }, // phn -> phn_Phnx_LB
- { 342, 0, 0 }, { 342, 41, 100 }, // pka -> pka_Brah_IN
- { 90, 0, 0 }, { 90, 7, 172 }, // pl -> pl_Latn_PL
- { 300, 0, 0 }, { 300, 64, 163 }, // pra -> pra_Khar_PK
- { 322, 0, 0 }, { 322, 7, 260 }, // prg -> prg_Latn_001
- { 88, 0, 0 }, { 88, 1, 1 }, // ps -> ps_Arab_AF
- { 91, 0, 0 }, { 91, 7, 30 }, // pt -> pt_Latn_BR
- { 93, 0, 0 }, { 93, 7, 169 }, // qu -> qu_Latn_PE
- { 323, 0, 0 }, { 323, 7, 90 }, // quc -> quc_Latn_GT
- { 301, 0, 0 }, { 301, 7, 101 }, // rej -> rej_Latn_ID
- { 94, 0, 0 }, { 94, 7, 206 }, // rm -> rm_Latn_CH
- { 68, 0, 0 }, { 68, 7, 35 }, // rn -> rn_Latn_BI
- { 95, 0, 0 }, { 95, 7, 177 }, // ro -> ro_Latn_RO
- { 182, 0, 0 }, { 182, 7, 210 }, // rof -> rof_Latn_TZ
- { 96, 0, 0 }, { 96, 2, 178 }, // ru -> ru_Cyrl_RU
- { 64, 0, 0 }, { 64, 7, 179 }, // rw -> rw_Latn_RW
- { 209, 0, 0 }, { 209, 7, 210 }, // rwk -> rwk_Latn_TZ
- { 99, 0, 0 }, { 99, 13, 100 }, // sa -> sa_Deva_IN
- { 248, 0, 0 }, { 248, 2, 178 }, // sah -> sah_Cyrl_RU
- { 179, 0, 0 }, { 179, 7, 111 }, // saq -> saq_Latn_KE
- { 304, 0, 0 }, { 304, 7, 100 }, // sat -> sat_Latn_IN
- { 305, 0, 0 }, { 305, 90, 100 }, // saz -> saz_Saur_IN
- { 249, 0, 0 }, { 249, 7, 210 }, // sbp -> sbp_Latn_TZ
- { 115, 0, 0 }, { 115, 7, 106 }, // sc -> sc_Latn_IT
- { 362, 0, 0 }, { 362, 7, 106 }, // scn -> scn_Latn_IT
- { 105, 0, 0 }, { 105, 1, 163 }, // sd -> sd_Arab_PK
- { 105, 13, 0 }, { 105, 13, 100 }, // sd_Deva -> sd_Deva_IN
- { 105, 111, 0 }, { 105, 111, 100 }, // sd_Khoj -> sd_Khoj_IN
- { 105, 125, 0 }, { 105, 125, 100 }, // sd_Sind -> sd_Sind_IN
- { 363, 0, 0 }, { 363, 1, 102 }, // sdh -> sdh_Arab_IR
- { 173, 0, 0 }, { 173, 7, 161 }, // se -> se_Latn_NO
- { 180, 0, 0 }, { 180, 7, 146 }, // seh -> seh_Latn_MZ
- { 213, 0, 0 }, { 213, 7, 132 }, // ses -> ses_Latn_ML
- { 98, 0, 0 }, { 98, 7, 41 }, // sg -> sg_Latn_CF
- { 293, 0, 0 }, { 293, 77, 104 }, // sga -> sga_Ogam_IE
- { 183, 0, 0 }, { 183, 9, 145 }, // shi -> shi_Tfng_MA
- { 106, 0, 0 }, { 106, 32, 198 }, // si -> si_Sinh_LK
- { 155, 0, 0 }, { 155, 7, 69 }, // sid -> sid_Latn_ET
- { 108, 0, 0 }, { 108, 7, 191 }, // sk -> sk_Latn_SK
- { 352, 0, 0 }, { 352, 1, 163 }, // skr -> skr_Arab_PK
- { 109, 0, 0 }, { 109, 7, 192 }, // sl -> sl_Latn_SI
- { 97, 0, 0 }, { 97, 7, 183 }, // sm -> sm_Latn_WS
- { 324, 0, 0 }, { 324, 7, 205 }, // sma -> sma_Latn_SE
- { 325, 0, 0 }, { 325, 7, 205 }, // smj -> smj_Latn_SE
- { 326, 0, 0 }, { 326, 7, 73 }, // smn -> smn_Latn_FI
- { 303, 0, 0 }, { 303, 89, 105 }, // smp -> smp_Samr_IL
- { 327, 0, 0 }, { 327, 7, 73 }, // sms -> sms_Latn_FI
- { 104, 0, 0 }, { 104, 7, 240 }, // sn -> sn_Latn_ZW
- { 110, 0, 0 }, { 110, 7, 194 }, // so -> so_Latn_SO
- { 6, 0, 0 }, { 6, 7, 2 }, // sq -> sq_Latn_AL
- { 100, 0, 0 }, { 100, 2, 243 }, // sr -> sr_Cyrl_RS
- { 100, 0, 242 }, { 100, 7, 242 }, // sr_ME -> sr_Latn_ME
- { 100, 0, 177 }, { 100, 7, 177 }, // sr_RO -> sr_Latn_RO
- { 100, 0, 178 }, { 100, 7, 178 }, // sr_RU -> sr_Latn_RU
- { 100, 0, 217 }, { 100, 7, 217 }, // sr_TR -> sr_Latn_TR
- { 306, 0, 0 }, { 306, 93, 100 }, // srb -> srb_Sora_IN
- { 107, 0, 0 }, { 107, 7, 195 }, // ss -> ss_Latn_ZA
- { 207, 0, 0 }, { 207, 7, 67 }, // ssy -> ssy_Latn_ER
- { 102, 0, 0 }, { 102, 7, 195 }, // st -> st_Latn_ZA
- { 112, 0, 0 }, { 112, 7, 101 }, // su -> su_Latn_ID
- { 114, 0, 0 }, { 114, 7, 205 }, // sv -> sv_Latn_SE
- { 113, 0, 0 }, { 113, 7, 210 }, // sw -> sw_Latn_TZ
- { 250, 0, 0 }, { 250, 7, 49 }, // swc -> swc_Latn_CD
- { 307, 0, 0 }, { 307, 11, 18 }, // syl -> syl_Beng_BD
- { 151, 0, 0 }, { 151, 33, 103 }, // syr -> syr_Syrc_IQ
- { 117, 0, 0 }, { 117, 27, 100 }, // ta -> ta_Taml_IN
- { 308, 0, 0 }, { 308, 7, 170 }, // tbw -> tbw_Latn_PH
- { 310, 0, 0 }, { 310, 99, 44 }, // tdd -> tdd_Tale_CN
- { 119, 0, 0 }, { 119, 28, 100 }, // te -> te_Telu_IN
- { 206, 0, 0 }, { 206, 7, 221 }, // teo -> teo_Latn_UG
- { 116, 0, 0 }, { 116, 2, 209 }, // tg -> tg_Cyrl_TJ
- { 116, 0, 163 }, { 116, 1, 163 }, // tg_PK -> tg_Arab_PK
- { 116, 1, 0 }, { 116, 1, 163 }, // tg_Arab -> tg_Arab_PK
- { 120, 0, 0 }, { 120, 30, 211 }, // th -> th_Thai_TH
- { 122, 0, 0 }, { 122, 14, 69 }, // ti -> ti_Ethi_ET
- { 157, 0, 0 }, { 157, 14, 67 }, // tig -> tig_Ethi_ER
- { 126, 0, 0 }, { 126, 7, 218 }, // tk -> tk_Latn_TM
- { 353, 0, 0 }, { 353, 7, 213 }, // tkl -> tkl_Latn_TK
- { 103, 0, 0 }, { 103, 7, 195 }, // tn -> tn_Latn_ZA
- { 123, 0, 0 }, { 123, 7, 214 }, // to -> to_Latn_TO
- { 354, 0, 0 }, { 354, 7, 167 }, // tpi -> tpi_Latn_PG
- { 125, 0, 0 }, { 125, 7, 217 }, // tr -> tr_Latn_TR
- { 174, 0, 0 }, { 174, 7, 208 }, // trv -> trv_Latn_TW
- { 124, 0, 0 }, { 124, 7, 195 }, // ts -> ts_Latn_ZA
- { 118, 0, 0 }, { 118, 2, 178 }, // tt -> tt_Cyrl_RU
- { 355, 0, 0 }, { 355, 7, 220 }, // tvl -> tvl_Latn_TV
- { 251, 0, 0 }, { 251, 7, 156 }, // twq -> twq_Latn_NE
- { 359, 0, 0 }, { 359, 139, 44 }, // txg -> txg_Tang_CN
- { 127, 0, 0 }, { 127, 7, 77 }, // ty -> ty_Latn_PF
- { 212, 0, 0 }, { 212, 7, 145 }, // tzm -> tzm_Latn_MA
- { 128, 0, 0 }, { 128, 1, 44 }, // ug -> ug_Arab_CN
- { 128, 0, 110 }, { 128, 2, 110 }, // ug_KZ -> ug_Cyrl_KZ
- { 128, 0, 143 }, { 128, 2, 143 }, // ug_MN -> ug_Cyrl_MN
- { 128, 2, 0 }, { 128, 2, 110 }, // ug_Cyrl -> ug_Cyrl_KZ
- { 311, 0, 0 }, { 311, 102, 207 }, // uga -> uga_Ugar_SY
- { 129, 0, 0 }, { 129, 2, 222 }, // uk -> uk_Cyrl_UA
- { 130, 0, 0 }, { 130, 1, 163 }, // ur -> ur_Arab_PK
- { 131, 0, 0 }, { 131, 7, 228 }, // uz -> uz_Latn_UZ
- { 131, 0, 1 }, { 131, 1, 1 }, // uz_AF -> uz_Arab_AF
- { 131, 0, 44 }, { 131, 2, 44 }, // uz_CN -> uz_Cyrl_CN
- { 131, 1, 0 }, { 131, 1, 1 }, // uz_Arab -> uz_Arab_AF
- { 252, 0, 0 }, { 252, 35, 121 }, // vai -> vai_Vaii_LR
- { 160, 0, 0 }, { 160, 7, 195 }, // ve -> ve_Latn_ZA
- { 132, 0, 0 }, { 132, 7, 232 }, // vi -> vi_Latn_VN
- { 133, 0, 0 }, { 133, 7, 260 }, // vo -> vo_Latn_001
- { 187, 0, 0 }, { 187, 7, 210 }, // vun -> vun_Latn_TZ
- { 236, 0, 0 }, { 236, 7, 21 }, // wa -> wa_Latn_BE
- { 253, 0, 0 }, { 253, 7, 206 }, // wae -> wae_Latn_CH
- { 162, 0, 0 }, { 162, 14, 69 }, // wal -> wal_Ethi_ET
- { 328, 0, 0 }, { 328, 7, 13 }, // wbp -> wbp_Latn_AU
- { 135, 0, 0 }, { 135, 7, 187 }, // wo -> wo_Latn_SN
- { 271, 0, 0 }, { 271, 45, 217 }, // xcr -> xcr_Cari_TR
- { 136, 0, 0 }, { 136, 7, 195 }, // xh -> xh_Latn_ZA
- { 287, 0, 0 }, { 287, 69, 217 }, // xlc -> xlc_Lyci_TR
- { 288, 0, 0 }, { 288, 70, 217 }, // xld -> xld_Lydi_TR
- { 329, 0, 0 }, { 329, 114, 44 }, // xmn -> xmn_Mani_CN
- { 291, 0, 0 }, { 291, 74, 201 }, // xmr -> xmr_Merc_SD
- { 331, 0, 0 }, { 331, 118, 186 }, // xna -> xna_Narb_SA
- { 203, 0, 0 }, { 203, 7, 221 }, // xog -> xog_Latn_UG
- { 298, 0, 0 }, { 298, 59, 102 }, // xpr -> xpr_Prti_IR
- { 302, 0, 0 }, { 302, 81, 237 }, // xsa -> xsa_Sarb_YE
- { 254, 0, 0 }, { 254, 7, 37 }, // yav -> yav_Latn_CM
- { 137, 0, 0 }, { 137, 18, 260 }, // yi -> yi_Hebr_001
- { 138, 0, 0 }, { 138, 7, 157 }, // yo -> yo_Latn_NG
- { 357, 0, 0 }, { 357, 6, 97 }, // yue -> yue_Hant_HK
- { 357, 0, 44 }, { 357, 5, 44 }, // yue_CN -> yue_Hans_CN
- { 357, 5, 0 }, { 357, 5, 44 }, // yue_Hans -> yue_Hans_CN
- { 139, 0, 0 }, { 139, 7, 44 }, // za -> za_Latn_CN
- { 314, 0, 0 }, { 314, 9, 145 }, // zgh -> zgh_Tfng_MA
- { 25, 0, 0 }, { 25, 5, 44 }, // zh -> zh_Hans_CN
- { 25, 0, 13 }, { 25, 6, 13 }, // zh_AU -> zh_Hant_AU
- { 25, 0, 32 }, { 25, 6, 32 }, // zh_BN -> zh_Hant_BN
- { 25, 0, 224 }, { 25, 6, 224 }, // zh_GB -> zh_Hant_GB
- { 25, 0, 76 }, { 25, 6, 76 }, // zh_GF -> zh_Hant_GF
- { 25, 0, 97 }, { 25, 6, 97 }, // zh_HK -> zh_Hant_HK
- { 25, 0, 101 }, { 25, 6, 101 }, // zh_ID -> zh_Hant_ID
- { 25, 0, 126 }, { 25, 6, 126 }, // zh_MO -> zh_Hant_MO
- { 25, 0, 130 }, { 25, 6, 130 }, // zh_MY -> zh_Hant_MY
- { 25, 0, 166 }, { 25, 6, 166 }, // zh_PA -> zh_Hant_PA
- { 25, 0, 77 }, { 25, 6, 77 }, // zh_PF -> zh_Hant_PF
- { 25, 0, 170 }, { 25, 6, 170 }, // zh_PH -> zh_Hant_PH
- { 25, 0, 202 }, { 25, 6, 202 }, // zh_SR -> zh_Hant_SR
- { 25, 0, 211 }, { 25, 6, 211 }, // zh_TH -> zh_Hant_TH
- { 25, 0, 208 }, { 25, 6, 208 }, // zh_TW -> zh_Hant_TW
- { 25, 0, 225 }, { 25, 6, 225 }, // zh_US -> zh_Hant_US
- { 25, 0, 232 }, { 25, 6, 232 }, // zh_VN -> zh_Hant_VN
- { 25, 40, 0 }, { 25, 40, 208 }, // zh_Bopo -> zh_Bopo_TW
- { 25, 140, 0 }, { 25, 140, 208 }, // zh_Hanb -> zh_Hanb_TW
- { 25, 6, 0 }, { 25, 6, 208 }, // zh_Hant -> zh_Hant_TW
- { 140, 0, 0 }, { 140, 7, 195 }, // zu -> zu_Latn_ZA
- { 0, 0, 261 }, { 96, 2, 178 }, // und_150 -> ru_Cyrl_RU
- { 0, 0, 246 }, { 111, 7, 246 }, // und_419 -> es_Latn_419
- { 0, 0, 5 }, { 24, 7, 5 }, // und_AD -> ca_Latn_AD
- { 0, 0, 223 }, { 8, 1, 223 }, // und_AE -> ar_Arab_AE
- { 0, 0, 1 }, { 89, 1, 1 }, // und_AF -> fa_Arab_AF
- { 0, 0, 2 }, { 6, 7, 2 }, // und_AL -> sq_Latn_AL
- { 0, 0, 11 }, { 9, 10, 11 }, // und_AM -> hy_Armn_AM
- { 0, 0, 6 }, { 91, 7, 6 }, // und_AO -> pt_Latn_AO
- { 0, 0, 8 }, { 0, 7, 8 }, // und_AQ -> und_Latn_AQ
- { 0, 0, 10 }, { 111, 7, 10 }, // und_AR -> es_Latn_AR
- { 0, 0, 4 }, { 97, 7, 4 }, // und_AS -> sm_Latn_AS
- { 0, 0, 14 }, { 42, 7, 14 }, // und_AT -> de_Latn_AT
- { 0, 0, 12 }, { 30, 7, 12 }, // und_AW -> nl_Latn_AW
- { 0, 0, 248 }, { 114, 7, 248 }, // und_AX -> sv_Latn_AX
- { 0, 0, 15 }, { 12, 7, 15 }, // und_AZ -> az_Latn_AZ
- { 0, 0, 27 }, { 142, 7, 27 }, // und_BA -> bs_Latn_BA
- { 0, 0, 18 }, { 15, 11, 18 }, // und_BD -> bn_Beng_BD
- { 0, 0, 21 }, { 30, 7, 21 }, // und_BE -> nl_Latn_BE
- { 0, 0, 34 }, { 37, 7, 34 }, // und_BF -> fr_Latn_BF
- { 0, 0, 33 }, { 20, 2, 33 }, // und_BG -> bg_Cyrl_BG
- { 0, 0, 17 }, { 8, 1, 17 }, // und_BH -> ar_Arab_BH
- { 0, 0, 35 }, { 68, 7, 35 }, // und_BI -> rn_Latn_BI
- { 0, 0, 23 }, { 37, 7, 23 }, // und_BJ -> fr_Latn_BJ
- { 0, 0, 244 }, { 37, 7, 244 }, // und_BL -> fr_Latn_BL
- { 0, 0, 32 }, { 76, 7, 32 }, // und_BN -> ms_Latn_BN
- { 0, 0, 26 }, { 111, 7, 26 }, // und_BO -> es_Latn_BO
- { 0, 0, 255 }, { 351, 7, 255 }, // und_BQ -> pap_Latn_BQ
- { 0, 0, 30 }, { 91, 7, 30 }, // und_BR -> pt_Latn_BR
- { 0, 0, 25 }, { 16, 31, 25 }, // und_BT -> dz_Tibt_BT
- { 0, 0, 29 }, { 0, 7, 29 }, // und_BV -> und_Latn_BV
- { 0, 0, 20 }, { 22, 2, 20 }, // und_BY -> be_Cyrl_BY
- { 0, 0, 49 }, { 113, 7, 49 }, // und_CD -> sw_Latn_CD
- { 0, 0, 41 }, { 37, 7, 41 }, // und_CF -> fr_Latn_CF
- { 0, 0, 50 }, { 37, 7, 50 }, // und_CG -> fr_Latn_CG
- { 0, 0, 206 }, { 42, 7, 206 }, // und_CH -> de_Latn_CH
- { 0, 0, 53 }, { 37, 7, 53 }, // und_CI -> fr_Latn_CI
- { 0, 0, 43 }, { 111, 7, 43 }, // und_CL -> es_Latn_CL
- { 0, 0, 37 }, { 37, 7, 37 }, // und_CM -> fr_Latn_CM
- { 0, 0, 44 }, { 25, 5, 44 }, // und_CN -> zh_Hans_CN
- { 0, 0, 47 }, { 111, 7, 47 }, // und_CO -> es_Latn_CO
- { 0, 0, 241 }, { 0, 7, 241 }, // und_CP -> und_Latn_CP
- { 0, 0, 52 }, { 111, 7, 52 }, // und_CR -> es_Latn_CR
- { 0, 0, 55 }, { 111, 7, 55 }, // und_CU -> es_Latn_CU
- { 0, 0, 39 }, { 91, 7, 39 }, // und_CV -> pt_Latn_CV
- { 0, 0, 152 }, { 351, 7, 152 }, // und_CW -> pap_Latn_CW
- { 0, 0, 56 }, { 43, 16, 56 }, // und_CY -> el_Grek_CY
- { 0, 0, 57 }, { 28, 7, 57 }, // und_CZ -> cs_Latn_CZ
- { 0, 0, 82 }, { 42, 7, 82 }, // und_DE -> de_Latn_DE
- { 0, 0, 59 }, { 4, 7, 59 }, // und_DJ -> aa_Latn_DJ
- { 0, 0, 58 }, { 29, 7, 58 }, // und_DK -> da_Latn_DK
- { 0, 0, 61 }, { 111, 7, 61 }, // und_DO -> es_Latn_DO
- { 0, 0, 3 }, { 8, 1, 3 }, // und_DZ -> ar_Arab_DZ
- { 0, 0, 250 }, { 111, 7, 250 }, // und_EA -> es_Latn_EA
- { 0, 0, 63 }, { 111, 7, 63 }, // und_EC -> es_Latn_EC
- { 0, 0, 68 }, { 33, 7, 68 }, // und_EE -> et_Latn_EE
- { 0, 0, 64 }, { 8, 1, 64 }, // und_EG -> ar_Arab_EG
- { 0, 0, 236 }, { 8, 1, 236 }, // und_EH -> ar_Arab_EH
- { 0, 0, 67 }, { 122, 14, 67 }, // und_ER -> ti_Ethi_ER
- { 0, 0, 197 }, { 111, 7, 197 }, // und_ES -> es_Latn_ES
- { 0, 0, 69 }, { 7, 14, 69 }, // und_ET -> am_Ethi_ET
- { 0, 0, 258 }, { 31, 7, 224 }, // und_EU -> en_Latn_GB
- { 0, 0, 73 }, { 36, 7, 73 }, // und_FI -> fi_Latn_FI
- { 0, 0, 71 }, { 34, 7, 71 }, // und_FO -> fo_Latn_FO
- { 0, 0, 74 }, { 37, 7, 74 }, // und_FR -> fr_Latn_FR
- { 0, 0, 79 }, { 37, 7, 79 }, // und_GA -> fr_Latn_GA
- { 0, 0, 81 }, { 41, 15, 81 }, // und_GE -> ka_Geor_GE
- { 0, 0, 76 }, { 37, 7, 76 }, // und_GF -> fr_Latn_GF
- { 0, 0, 83 }, { 146, 7, 83 }, // und_GH -> ak_Latn_GH
- { 0, 0, 86 }, { 44, 7, 86 }, // und_GL -> kl_Latn_GL
- { 0, 0, 91 }, { 37, 7, 91 }, // und_GN -> fr_Latn_GN
- { 0, 0, 88 }, { 37, 7, 88 }, // und_GP -> fr_Latn_GP
- { 0, 0, 66 }, { 111, 7, 66 }, // und_GQ -> es_Latn_GQ
- { 0, 0, 85 }, { 43, 16, 85 }, // und_GR -> el_Grek_GR
- { 0, 0, 196 }, { 0, 7, 196 }, // und_GS -> und_Latn_GS
- { 0, 0, 90 }, { 111, 7, 90 }, // und_GT -> es_Latn_GT
- { 0, 0, 92 }, { 91, 7, 92 }, // und_GW -> pt_Latn_GW
- { 0, 0, 97 }, { 25, 6, 97 }, // und_HK -> zh_Hant_HK
- { 0, 0, 95 }, { 0, 7, 95 }, // und_HM -> und_Latn_HM
- { 0, 0, 96 }, { 111, 7, 96 }, // und_HN -> es_Latn_HN
- { 0, 0, 54 }, { 27, 7, 54 }, // und_HR -> hr_Latn_HR
- { 0, 0, 94 }, { 222, 7, 94 }, // und_HT -> ht_Latn_HT
- { 0, 0, 98 }, { 50, 7, 98 }, // und_HU -> hu_Latn_HU
- { 0, 0, 238 }, { 111, 7, 238 }, // und_IC -> es_Latn_IC
- { 0, 0, 101 }, { 52, 7, 101 }, // und_ID -> id_Latn_ID
- { 0, 0, 105 }, { 48, 18, 105 }, // und_IL -> he_Hebr_IL
- { 0, 0, 100 }, { 49, 13, 100 }, // und_IN -> hi_Deva_IN
- { 0, 0, 103 }, { 8, 1, 103 }, // und_IQ -> ar_Arab_IQ
- { 0, 0, 102 }, { 89, 1, 102 }, // und_IR -> fa_Arab_IR
- { 0, 0, 99 }, { 51, 7, 99 }, // und_IS -> is_Latn_IS
- { 0, 0, 106 }, { 58, 7, 106 }, // und_IT -> it_Latn_IT
- { 0, 0, 109 }, { 8, 1, 109 }, // und_JO -> ar_Arab_JO
- { 0, 0, 108 }, { 59, 19, 108 }, // und_JP -> ja_Jpan_JP
- { 0, 0, 111 }, { 113, 7, 111 }, // und_KE -> sw_Latn_KE
- { 0, 0, 116 }, { 65, 2, 116 }, // und_KG -> ky_Cyrl_KG
- { 0, 0, 36 }, { 23, 20, 36 }, // und_KH -> km_Khmr_KH
- { 0, 0, 48 }, { 8, 1, 48 }, // und_KM -> ar_Arab_KM
- { 0, 0, 113 }, { 66, 22, 113 }, // und_KP -> ko_Kore_KP
- { 0, 0, 114 }, { 66, 22, 114 }, // und_KR -> ko_Kore_KR
- { 0, 0, 115 }, { 8, 1, 115 }, // und_KW -> ar_Arab_KW
- { 0, 0, 110 }, { 96, 2, 110 }, // und_KZ -> ru_Cyrl_KZ
- { 0, 0, 117 }, { 69, 23, 117 }, // und_LA -> lo_Laoo_LA
- { 0, 0, 119 }, { 8, 1, 119 }, // und_LB -> ar_Arab_LB
- { 0, 0, 123 }, { 42, 7, 123 }, // und_LI -> de_Latn_LI
- { 0, 0, 198 }, { 106, 32, 198 }, // und_LK -> si_Sinh_LK
- { 0, 0, 120 }, { 102, 7, 120 }, // und_LS -> st_Latn_LS
- { 0, 0, 124 }, { 73, 7, 124 }, // und_LT -> lt_Latn_LT
- { 0, 0, 125 }, { 37, 7, 125 }, // und_LU -> fr_Latn_LU
- { 0, 0, 118 }, { 71, 7, 118 }, // und_LV -> lv_Latn_LV
- { 0, 0, 122 }, { 8, 1, 122 }, // und_LY -> ar_Arab_LY
- { 0, 0, 145 }, { 8, 1, 145 }, // und_MA -> ar_Arab_MA
- { 0, 0, 142 }, { 37, 7, 142 }, // und_MC -> fr_Latn_MC
- { 0, 0, 141 }, { 95, 7, 141 }, // und_MD -> ro_Latn_MD
- { 0, 0, 242 }, { 100, 7, 242 }, // und_ME -> sr_Latn_ME
- { 0, 0, 245 }, { 37, 7, 245 }, // und_MF -> fr_Latn_MF
- { 0, 0, 128 }, { 75, 7, 128 }, // und_MG -> mg_Latn_MG
- { 0, 0, 127 }, { 74, 2, 127 }, // und_MK -> mk_Cyrl_MK
- { 0, 0, 132 }, { 188, 7, 132 }, // und_ML -> bm_Latn_ML
- { 0, 0, 147 }, { 21, 25, 147 }, // und_MM -> my_Mymr_MM
- { 0, 0, 143 }, { 82, 2, 143 }, // und_MN -> mn_Cyrl_MN
- { 0, 0, 126 }, { 25, 6, 126 }, // und_MO -> zh_Hant_MO
- { 0, 0, 135 }, { 37, 7, 135 }, // und_MQ -> fr_Latn_MQ
- { 0, 0, 136 }, { 8, 1, 136 }, // und_MR -> ar_Arab_MR
- { 0, 0, 133 }, { 78, 7, 133 }, // und_MT -> mt_Latn_MT
- { 0, 0, 137 }, { 191, 7, 137 }, // und_MU -> mfe_Latn_MU
- { 0, 0, 131 }, { 143, 29, 131 }, // und_MV -> dv_Thaa_MV
- { 0, 0, 139 }, { 111, 7, 139 }, // und_MX -> es_Latn_MX
- { 0, 0, 130 }, { 76, 7, 130 }, // und_MY -> ms_Latn_MY
- { 0, 0, 146 }, { 91, 7, 146 }, // und_MZ -> pt_Latn_MZ
- { 0, 0, 148 }, { 5, 7, 148 }, // und_NA -> af_Latn_NA
- { 0, 0, 153 }, { 37, 7, 153 }, // und_NC -> fr_Latn_NC
- { 0, 0, 156 }, { 47, 7, 156 }, // und_NE -> ha_Latn_NE
- { 0, 0, 155 }, { 111, 7, 155 }, // und_NI -> es_Latn_NI
- { 0, 0, 151 }, { 30, 7, 151 }, // und_NL -> nl_Latn_NL
- { 0, 0, 161 }, { 85, 7, 161 }, // und_NO -> nb_Latn_NO
- { 0, 0, 150 }, { 84, 13, 150 }, // und_NP -> ne_Deva_NP
- { 0, 0, 162 }, { 8, 1, 162 }, // und_OM -> ar_Arab_OM
- { 0, 0, 166 }, { 111, 7, 166 }, // und_PA -> es_Latn_PA
- { 0, 0, 169 }, { 111, 7, 169 }, // und_PE -> es_Latn_PE
- { 0, 0, 77 }, { 37, 7, 77 }, // und_PF -> fr_Latn_PF
- { 0, 0, 167 }, { 354, 7, 167 }, // und_PG -> tpi_Latn_PG
- { 0, 0, 170 }, { 166, 7, 170 }, // und_PH -> fil_Latn_PH
- { 0, 0, 163 }, { 130, 1, 163 }, // und_PK -> ur_Arab_PK
- { 0, 0, 172 }, { 90, 7, 172 }, // und_PL -> pl_Latn_PL
- { 0, 0, 200 }, { 37, 7, 200 }, // und_PM -> fr_Latn_PM
- { 0, 0, 174 }, { 111, 7, 174 }, // und_PR -> es_Latn_PR
- { 0, 0, 165 }, { 8, 1, 165 }, // und_PS -> ar_Arab_PS
- { 0, 0, 173 }, { 91, 7, 173 }, // und_PT -> pt_Latn_PT
- { 0, 0, 164 }, { 350, 7, 164 }, // und_PW -> pau_Latn_PW
- { 0, 0, 168 }, { 45, 7, 168 }, // und_PY -> gn_Latn_PY
- { 0, 0, 175 }, { 8, 1, 175 }, // und_QA -> ar_Arab_QA
- { 0, 0, 259 }, { 31, 7, 249 }, // und_QO -> en_Latn_DG
- { 0, 0, 176 }, { 37, 7, 176 }, // und_RE -> fr_Latn_RE
- { 0, 0, 177 }, { 95, 7, 177 }, // und_RO -> ro_Latn_RO
- { 0, 0, 243 }, { 100, 2, 243 }, // und_RS -> sr_Cyrl_RS
- { 0, 0, 178 }, { 96, 2, 178 }, // und_RU -> ru_Cyrl_RU
- { 0, 0, 179 }, { 64, 7, 179 }, // und_RW -> rw_Latn_RW
- { 0, 0, 186 }, { 8, 1, 186 }, // und_SA -> ar_Arab_SA
- { 0, 0, 188 }, { 37, 7, 188 }, // und_SC -> fr_Latn_SC
- { 0, 0, 201 }, { 8, 1, 201 }, // und_SD -> ar_Arab_SD
- { 0, 0, 205 }, { 114, 7, 205 }, // und_SE -> sv_Latn_SE
- { 0, 0, 192 }, { 109, 7, 192 }, // und_SI -> sl_Latn_SI
- { 0, 0, 203 }, { 85, 7, 203 }, // und_SJ -> nb_Latn_SJ
- { 0, 0, 191 }, { 108, 7, 191 }, // und_SK -> sk_Latn_SK
- { 0, 0, 184 }, { 58, 7, 184 }, // und_SM -> it_Latn_SM
- { 0, 0, 187 }, { 37, 7, 187 }, // und_SN -> fr_Latn_SN
- { 0, 0, 194 }, { 110, 7, 194 }, // und_SO -> so_Latn_SO
- { 0, 0, 202 }, { 30, 7, 202 }, // und_SR -> nl_Latn_SR
- { 0, 0, 185 }, { 91, 7, 185 }, // und_ST -> pt_Latn_ST
- { 0, 0, 65 }, { 111, 7, 65 }, // und_SV -> es_Latn_SV
- { 0, 0, 207 }, { 8, 1, 207 }, // und_SY -> ar_Arab_SY
- { 0, 0, 42 }, { 37, 7, 42 }, // und_TD -> fr_Latn_TD
- { 0, 0, 78 }, { 37, 7, 78 }, // und_TF -> fr_Latn_TF
- { 0, 0, 212 }, { 37, 7, 212 }, // und_TG -> fr_Latn_TG
- { 0, 0, 211 }, { 120, 30, 211 }, // und_TH -> th_Thai_TH
- { 0, 0, 209 }, { 116, 2, 209 }, // und_TJ -> tg_Cyrl_TJ
- { 0, 0, 213 }, { 353, 7, 213 }, // und_TK -> tkl_Latn_TK
- { 0, 0, 62 }, { 91, 7, 62 }, // und_TL -> pt_Latn_TL
- { 0, 0, 218 }, { 126, 7, 218 }, // und_TM -> tk_Latn_TM
- { 0, 0, 216 }, { 8, 1, 216 }, // und_TN -> ar_Arab_TN
- { 0, 0, 214 }, { 123, 7, 214 }, // und_TO -> to_Latn_TO
- { 0, 0, 217 }, { 125, 7, 217 }, // und_TR -> tr_Latn_TR
- { 0, 0, 220 }, { 355, 7, 220 }, // und_TV -> tvl_Latn_TV
- { 0, 0, 208 }, { 25, 6, 208 }, // und_TW -> zh_Hant_TW
- { 0, 0, 210 }, { 113, 7, 210 }, // und_TZ -> sw_Latn_TZ
- { 0, 0, 222 }, { 129, 2, 222 }, // und_UA -> uk_Cyrl_UA
- { 0, 0, 221 }, { 113, 7, 221 }, // und_UG -> sw_Latn_UG
- { 0, 0, 227 }, { 111, 7, 227 }, // und_UY -> es_Latn_UY
- { 0, 0, 228 }, { 131, 7, 228 }, // und_UZ -> uz_Latn_UZ
- { 0, 0, 230 }, { 58, 7, 230 }, // und_VA -> it_Latn_VA
- { 0, 0, 231 }, { 111, 7, 231 }, // und_VE -> es_Latn_VE
- { 0, 0, 232 }, { 132, 7, 232 }, // und_VN -> vi_Latn_VN
- { 0, 0, 229 }, { 18, 7, 229 }, // und_VU -> bi_Latn_VU
- { 0, 0, 235 }, { 37, 7, 235 }, // und_WF -> fr_Latn_WF
- { 0, 0, 183 }, { 97, 7, 183 }, // und_WS -> sm_Latn_WS
- { 0, 0, 257 }, { 6, 7, 257 }, // und_XK -> sq_Latn_XK
- { 0, 0, 237 }, { 8, 1, 237 }, // und_YE -> ar_Arab_YE
- { 0, 0, 138 }, { 37, 7, 138 }, // und_YT -> fr_Latn_YT
- { 0, 0, 240 }, { 104, 7, 240 }, // und_ZW -> sn_Latn_ZW
- { 0, 134, 0 }, { 177, 134, 91 }, // und_Adlm -> ff_Adlm_GN
- { 0, 105, 0 }, { 335, 105, 178 }, // und_Aghb -> lez_Aghb_RU
- { 0, 128, 0 }, { 340, 128, 100 }, // und_Ahom -> aho_Ahom_IN
- { 0, 1, 0 }, { 8, 1, 64 }, // und_Arab -> ar_Arab_EG
- { 0, 1, 46 }, { 76, 1, 46 }, // und_Arab_CC -> ms_Arab_CC
- { 0, 1, 44 }, { 128, 1, 44 }, // und_Arab_CN -> ug_Arab_CN
- { 0, 1, 224 }, { 62, 1, 224 }, // und_Arab_GB -> ks_Arab_GB
- { 0, 1, 101 }, { 76, 1, 101 }, // und_Arab_ID -> ms_Arab_ID
- { 0, 1, 100 }, { 130, 1, 100 }, // und_Arab_IN -> ur_Arab_IN
- { 0, 1, 143 }, { 63, 1, 143 }, // und_Arab_MN -> kk_Arab_MN
- { 0, 1, 137 }, { 130, 1, 137 }, // und_Arab_MU -> ur_Arab_MU
- { 0, 1, 157 }, { 47, 1, 157 }, // und_Arab_NG -> ha_Arab_NG
- { 0, 1, 163 }, { 130, 1, 163 }, // und_Arab_PK -> ur_Arab_PK
- { 0, 1, 209 }, { 89, 1, 209 }, // und_Arab_TJ -> fa_Arab_TJ
- { 0, 1, 217 }, { 12, 1, 217 }, // und_Arab_TR -> az_Arab_TR
- { 0, 57, 0 }, { 265, 57, 102 }, // und_Armi -> arc_Armi_IR
- { 0, 10, 0 }, { 9, 10, 11 }, // und_Armn -> hy_Armn_AM
- { 0, 36, 0 }, { 255, 36, 102 }, // und_Avst -> ae_Avst_IR
- { 0, 37, 0 }, { 266, 37, 101 }, // und_Bali -> ban_Bali_ID
- { 0, 38, 0 }, { 267, 38, 37 }, // und_Bamu -> bax_Bamu_CM
- { 0, 106, 0 }, { 336, 106, 121 }, // und_Bass -> bsq_Bass_LR
- { 0, 39, 0 }, { 268, 39, 101 }, // und_Batk -> bbc_Batk_ID
- { 0, 11, 0 }, { 15, 11, 18 }, // und_Beng -> bn_Beng_BD
- { 0, 135, 0 }, { 99, 135, 100 }, // und_Bhks -> sa_Bhks_IN
- { 0, 40, 0 }, { 25, 40, 208 }, // und_Bopo -> zh_Bopo_TW
- { 0, 41, 0 }, { 342, 41, 100 }, // und_Brah -> pka_Brah_IN
- { 0, 103, 0 }, { 37, 103, 74 }, // und_Brai -> fr_Brai_FR
- { 0, 42, 0 }, { 269, 42, 101 }, // und_Bugi -> bug_Bugi_ID
- { 0, 43, 0 }, { 270, 43, 170 }, // und_Buhd -> bku_Buhd_PH
- { 0, 46, 0 }, { 272, 46, 18 }, // und_Cakm -> ccp_Cakm_BD
- { 0, 44, 0 }, { 221, 44, 38 }, // und_Cans -> cr_Cans_CA
- { 0, 45, 0 }, { 271, 45, 217 }, // und_Cari -> xcr_Cari_TR
- { 0, 47, 0 }, { 276, 47, 232 }, // und_Cham -> cjm_Cham_VN
- { 0, 12, 0 }, { 190, 12, 225 }, // und_Cher -> chr_Cher_US
- { 0, 48, 0 }, { 274, 48, 64 }, // und_Copt -> cop_Copt_EG
- { 0, 49, 0 }, { 264, 49, 56 }, // und_Cprt -> grc_Cprt_CY
- { 0, 2, 0 }, { 96, 2, 178 }, // und_Cyrl -> ru_Cyrl_RU
- { 0, 2, 2 }, { 74, 2, 2 }, // und_Cyrl_AL -> mk_Cyrl_AL
- { 0, 2, 27 }, { 100, 2, 27 }, // und_Cyrl_BA -> sr_Cyrl_BA
- { 0, 2, 81 }, { 2, 2, 81 }, // und_Cyrl_GE -> ab_Cyrl_GE
- { 0, 2, 85 }, { 74, 2, 85 }, // und_Cyrl_GR -> mk_Cyrl_GR
- { 0, 2, 141 }, { 129, 2, 141 }, // und_Cyrl_MD -> uk_Cyrl_MD
- { 0, 2, 177 }, { 20, 2, 177 }, // und_Cyrl_RO -> bg_Cyrl_RO
- { 0, 2, 191 }, { 129, 2, 191 }, // und_Cyrl_SK -> uk_Cyrl_SK
- { 0, 2, 257 }, { 100, 2, 257 }, // und_Cyrl_XK -> sr_Cyrl_XK
- { 0, 13, 0 }, { 49, 13, 100 }, // und_Deva -> hi_Deva_IN
- { 0, 13, 25 }, { 84, 13, 25 }, // und_Deva_BT -> ne_Deva_BT
- { 0, 13, 137 }, { 343, 13, 137 }, // und_Deva_MU -> bho_Deva_MU
- { 0, 107, 0 }, { 37, 107, 74 }, // und_Dupl -> fr_Dupl_FR
- { 0, 50, 0 }, { 263, 50, 64 }, // und_Egyp -> egy_Egyp_EG
- { 0, 108, 0 }, { 6, 108, 2 }, // und_Elba -> sq_Elba_AL
- { 0, 14, 0 }, { 7, 14, 69 }, // und_Ethi -> am_Ethi_ET
- { 0, 15, 0 }, { 41, 15, 81 }, // und_Geor -> ka_Geor_GE
- { 0, 52, 0 }, { 219, 52, 33 }, // und_Glag -> cu_Glag_BG
- { 0, 53, 0 }, { 279, 53, 222 }, // und_Goth -> got_Goth_UA
- { 0, 109, 0 }, { 99, 109, 100 }, // und_Gran -> sa_Gran_IN
- { 0, 16, 0 }, { 43, 16, 85 }, // und_Grek -> el_Grek_GR
- { 0, 17, 0 }, { 46, 17, 100 }, // und_Gujr -> gu_Gujr_IN
- { 0, 4, 0 }, { 92, 4, 100 }, // und_Guru -> pa_Guru_IN
- { 0, 140, 0 }, { 25, 140, 208 }, // und_Hanb -> zh_Hanb_TW
- { 0, 55, 0 }, { 66, 55, 114 }, // und_Hang -> ko_Hang_KR
- { 0, 54, 0 }, { 25, 54, 44 }, // und_Hani -> zh_Hani_CN
- { 0, 56, 0 }, { 280, 56, 170 }, // und_Hano -> hnn_Hano_PH
- { 0, 5, 0 }, { 25, 5, 44 }, // und_Hans -> zh_Hans_CN
- { 0, 6, 0 }, { 25, 6, 208 }, // und_Hant -> zh_Hant_TW
- { 0, 130, 0 }, { 356, 130, 103 }, // und_Hatr -> mis_Hatr_IQ
- { 0, 18, 0 }, { 48, 18, 105 }, // und_Hebr -> he_Hebr_IL
- { 0, 18, 38 }, { 137, 18, 38 }, // und_Hebr_CA -> yi_Hebr_CA
- { 0, 18, 224 }, { 137, 18, 224 }, // und_Hebr_GB -> yi_Hebr_GB
- { 0, 18, 205 }, { 137, 18, 205 }, // und_Hebr_SE -> yi_Hebr_SE
- { 0, 18, 222 }, { 137, 18, 222 }, // und_Hebr_UA -> yi_Hebr_UA
- { 0, 18, 225 }, { 137, 18, 225 }, // und_Hebr_US -> yi_Hebr_US
- { 0, 104, 0 }, { 59, 104, 108 }, // und_Hira -> ja_Hira_JP
- { 0, 129, 0 }, { 344, 129, 217 }, // und_Hluw -> hlu_Hluw_TR
- { 0, 110, 0 }, { 333, 110, 117 }, // und_Hmng -> hnj_Hmng_LA
- { 0, 132, 0 }, { 50, 132, 98 }, // und_Hung -> hu_Hung_HU
- { 0, 79, 0 }, { 278, 79, 106 }, // und_Ital -> ett_Ital_IT
- { 0, 141, 0 }, { 66, 141, 114 }, // und_Jamo -> ko_Jamo_KR
- { 0, 60, 0 }, { 60, 60, 101 }, // und_Java -> jv_Java_ID
- { 0, 19, 0 }, { 59, 19, 108 }, // und_Jpan -> ja_Jpan_JP
- { 0, 63, 0 }, { 277, 63, 147 }, // und_Kali -> eky_Kali_MM
- { 0, 62, 0 }, { 59, 62, 108 }, // und_Kana -> ja_Kana_JP
- { 0, 64, 0 }, { 300, 64, 163 }, // und_Khar -> pra_Khar_PK
- { 0, 20, 0 }, { 23, 20, 36 }, // und_Khmr -> km_Khmr_KH
- { 0, 111, 0 }, { 105, 111, 100 }, // und_Khoj -> sd_Khoj_IN
- { 0, 21, 0 }, { 61, 21, 100 }, // und_Knda -> kn_Knda_IN
- { 0, 22, 0 }, { 66, 22, 114 }, // und_Kore -> ko_Kore_KR
- { 0, 61, 0 }, { 343, 61, 100 }, // und_Kthi -> bho_Kthi_IN
- { 0, 65, 0 }, { 292, 65, 211 }, // und_Lana -> nod_Lana_TH
- { 0, 23, 0 }, { 69, 23, 117 }, // und_Laoo -> lo_Laoo_LA
- { 0, 7, 1 }, { 126, 7, 1 }, // und_Latn_AF -> tk_Latn_AF
- { 0, 7, 11 }, { 67, 7, 11 }, // und_Latn_AM -> ku_Latn_AM
- { 0, 7, 44 }, { 139, 7, 44 }, // und_Latn_CN -> za_Latn_CN
- { 0, 7, 56 }, { 125, 7, 56 }, // und_Latn_CY -> tr_Latn_CY
- { 0, 7, 3 }, { 37, 7, 3 }, // und_Latn_DZ -> fr_Latn_DZ
- { 0, 7, 69 }, { 31, 7, 69 }, // und_Latn_ET -> en_Latn_ET
- { 0, 7, 81 }, { 67, 7, 81 }, // und_Latn_GE -> ku_Latn_GE
- { 0, 7, 102 }, { 126, 7, 102 }, // und_Latn_IR -> tk_Latn_IR
- { 0, 7, 48 }, { 37, 7, 48 }, // und_Latn_KM -> fr_Latn_KM
- { 0, 7, 145 }, { 37, 7, 145 }, // und_Latn_MA -> fr_Latn_MA
- { 0, 7, 127 }, { 6, 7, 127 }, // und_Latn_MK -> sq_Latn_MK
- { 0, 7, 126 }, { 91, 7, 126 }, // und_Latn_MO -> pt_Latn_MO
- { 0, 7, 136 }, { 37, 7, 136 }, // und_Latn_MR -> fr_Latn_MR
- { 0, 7, 207 }, { 37, 7, 207 }, // und_Latn_SY -> fr_Latn_SY
- { 0, 7, 216 }, { 37, 7, 216 }, // und_Latn_TN -> fr_Latn_TN
- { 0, 7, 208 }, { 174, 7, 208 }, // und_Latn_TW -> trv_Latn_TW
- { 0, 7, 222 }, { 90, 7, 222 }, // und_Latn_UA -> pl_Latn_UA
- { 0, 66, 0 }, { 283, 66, 100 }, // und_Lepc -> lep_Lepc_IN
- { 0, 67, 0 }, { 284, 67, 100 }, // und_Limb -> lif_Limb_IN
- { 0, 112, 0 }, { 332, 112, 85 }, // und_Lina -> lab_Lina_GR
- { 0, 68, 0 }, { 264, 68, 85 }, // und_Linb -> grc_Linb_GR
- { 0, 51, 0 }, { 285, 51, 44 }, // und_Lisu -> lis_Lisu_CN
- { 0, 69, 0 }, { 287, 69, 217 }, // und_Lyci -> xlc_Lyci_TR
- { 0, 70, 0 }, { 288, 70, 217 }, // und_Lydi -> xld_Lydi_TR
- { 0, 113, 0 }, { 49, 113, 100 }, // und_Mahj -> hi_Mahj_IN
- { 0, 71, 0 }, { 273, 71, 102 }, // und_Mand -> myz_Mand_IR
- { 0, 114, 0 }, { 329, 114, 44 }, // und_Mani -> xmn_Mani_CN
- { 0, 136, 0 }, { 121, 136, 44 }, // und_Marc -> bo_Marc_CN
- { 0, 115, 0 }, { 330, 115, 189 }, // und_Mend -> men_Mend_SL
- { 0, 74, 0 }, { 291, 74, 201 }, // und_Merc -> xmr_Merc_SD
- { 0, 73, 0 }, { 291, 73, 201 }, // und_Mero -> xmr_Mero_SD
- { 0, 24, 0 }, { 77, 24, 100 }, // und_Mlym -> ml_Mlym_IN
- { 0, 116, 0 }, { 80, 116, 100 }, // und_Modi -> mr_Modi_IN
- { 0, 8, 0 }, { 82, 8, 44 }, // und_Mong -> mn_Mong_CN
- { 0, 117, 0 }, { 347, 117, 18 }, // und_Mroo -> mro_Mroo_BD
- { 0, 72, 0 }, { 290, 72, 100 }, // und_Mtei -> mni_Mtei_IN
- { 0, 131, 0 }, { 352, 131, 163 }, // und_Mult -> skr_Mult_PK
- { 0, 25, 0 }, { 21, 25, 147 }, // und_Mymr -> my_Mymr_MM
- { 0, 118, 0 }, { 331, 118, 186 }, // und_Narb -> xna_Narb_SA
- { 0, 119, 0 }, { 265, 119, 109 }, // und_Nbat -> arc_Nbat_JO
- { 0, 137, 0 }, { 348, 137, 150 }, // und_Newa -> new_Newa_NP
- { 0, 75, 0 }, { 289, 75, 91 }, // und_Nkoo -> man_Nkoo_GN
- { 0, 77, 0 }, { 293, 77, 104 }, // und_Ogam -> sga_Ogam_IE
- { 0, 78, 0 }, { 304, 78, 100 }, // und_Olck -> sat_Olck_IN
- { 0, 82, 0 }, { 296, 82, 143 }, // und_Orkh -> otk_Orkh_MN
- { 0, 26, 0 }, { 87, 26, 100 }, // und_Orya -> or_Orya_IN
- { 0, 138, 0 }, { 358, 138, 225 }, // und_Osge -> osa_Osge_US
- { 0, 83, 0 }, { 110, 83, 194 }, // und_Osma -> so_Osma_SO
- { 0, 120, 0 }, { 265, 120, 207 }, // und_Palm -> arc_Palm_SY
- { 0, 121, 0 }, { 338, 121, 147 }, // und_Pauc -> ctd_Pauc_MM
- { 0, 122, 0 }, { 226, 122, 178 }, // und_Perm -> kv_Perm_RU
- { 0, 84, 0 }, { 345, 84, 44 }, // und_Phag -> lzh_Phag_CN
- { 0, 58, 0 }, { 297, 58, 102 }, // und_Phli -> pal_Phli_IR
- { 0, 123, 0 }, { 297, 123, 44 }, // und_Phlp -> pal_Phlp_CN
- { 0, 85, 0 }, { 299, 85, 119 }, // und_Phnx -> phn_Phnx_LB
- { 0, 86, 0 }, { 282, 86, 44 }, // und_Plrd -> hmd_Plrd_CN
- { 0, 59, 0 }, { 298, 59, 102 }, // und_Prti -> xpr_Prti_IR
- { 0, 87, 0 }, { 301, 87, 101 }, // und_Rjng -> rej_Rjng_ID
- { 0, 88, 0 }, { 294, 88, 205 }, // und_Runr -> non_Runr_SE
- { 0, 89, 0 }, { 303, 89, 105 }, // und_Samr -> smp_Samr_IL
- { 0, 81, 0 }, { 302, 81, 237 }, // und_Sarb -> xsa_Sarb_YE
- { 0, 90, 0 }, { 305, 90, 100 }, // und_Saur -> saz_Saur_IN
- { 0, 133, 0 }, { 341, 133, 225 }, // und_Sgnw -> ase_Sgnw_US
- { 0, 92, 0 }, { 31, 92, 224 }, // und_Shaw -> en_Shaw_GB
- { 0, 91, 0 }, { 99, 91, 100 }, // und_Shrd -> sa_Shrd_IN
- { 0, 124, 0 }, { 99, 124, 100 }, // und_Sidd -> sa_Sidd_IN
- { 0, 125, 0 }, { 105, 125, 100 }, // und_Sind -> sd_Sind_IN
- { 0, 32, 0 }, { 106, 32, 198 }, // und_Sinh -> si_Sinh_LK
- { 0, 93, 0 }, { 306, 93, 100 }, // und_Sora -> srb_Sora_IN
- { 0, 95, 0 }, { 112, 95, 101 }, // und_Sund -> su_Sund_ID
- { 0, 96, 0 }, { 307, 96, 18 }, // und_Sylo -> syl_Sylo_BD
- { 0, 33, 0 }, { 151, 33, 103 }, // und_Syrc -> syr_Syrc_IQ
- { 0, 98, 0 }, { 308, 98, 170 }, // und_Tagb -> tbw_Tagb_PH
- { 0, 101, 0 }, { 275, 101, 100 }, // und_Takr -> doi_Takr_IN
- { 0, 99, 0 }, { 310, 99, 44 }, // und_Tale -> tdd_Tale_CN
- { 0, 76, 0 }, { 286, 76, 44 }, // und_Talu -> khb_Talu_CN
- { 0, 27, 0 }, { 117, 27, 100 }, // und_Taml -> ta_Taml_IN
- { 0, 139, 0 }, { 359, 139, 44 }, // und_Tang -> txg_Tang_CN
- { 0, 100, 0 }, { 309, 100, 232 }, // und_Tavt -> blt_Tavt_VN
- { 0, 28, 0 }, { 119, 28, 100 }, // und_Telu -> te_Telu_IN
- { 0, 9, 0 }, { 314, 9, 145 }, // und_Tfng -> zgh_Tfng_MA
- { 0, 97, 0 }, { 166, 97, 170 }, // und_Tglg -> fil_Tglg_PH
- { 0, 29, 0 }, { 143, 29, 131 }, // und_Thaa -> dv_Thaa_MV
- { 0, 30, 0 }, { 120, 30, 211 }, // und_Thai -> th_Thai_TH
- { 0, 31, 0 }, { 121, 31, 44 }, // und_Tibt -> bo_Tibt_CN
- { 0, 126, 0 }, { 339, 126, 100 }, // und_Tirh -> mai_Tirh_IN
- { 0, 102, 0 }, { 311, 102, 207 }, // und_Ugar -> uga_Ugar_SY
- { 0, 35, 0 }, { 252, 35, 121 }, // und_Vaii -> vai_Vaii_LR
- { 0, 127, 0 }, { 334, 127, 100 }, // und_Wara -> hoc_Wara_IN
- { 0, 80, 0 }, { 295, 80, 102 }, // und_Xpeo -> peo_Xpeo_IR
- { 0, 94, 0 }, { 262, 94, 103 }, // und_Xsux -> akk_Xsux_IQ
- { 0, 34, 0 }, { 168, 34, 44 } // und_Yiii -> ii_Yiii_CN
-};
-
-static const quint16 locale_index[] = {
- 0, // AnyLanguage
- 0, // C
- 0, // Abkhazian
- 1, // Oromo
- 3, // Afar
- 4, // Afrikaans
- 6, // Albanian
- 9, // Amharic
- 10, // Arabic
- 38, // Armenian
- 39, // Assamese
- 0, // Aymara
- 40, // Azerbaijani
- 43, // Bashkir
- 44, // Basque
- 45, // Bengali
- 47, // Dzongkha
- 0, // Bihari
- 0, // Bislama
- 48, // Breton
- 49, // Bulgarian
- 50, // Burmese
- 51, // Belarusian
- 52, // Khmer
- 53, // Catalan
- 57, // Chinese
- 64, // Corsican
- 65, // Croatian
- 67, // Czech
- 68, // Danish
- 70, // Dutch
- 77, // English
- 183, // Esperanto
- 184, // Estonian
- 185, // Faroese
- 0, // Fijian
- 187, // Finnish
- 188, // French
- 234, // Western Frisian
- 235, // Gaelic
- 236, // Galician
- 237, // Georgian
- 238, // German
- 245, // Greek
- 247, // Greenlandic
- 248, // Guarani
- 249, // Gujarati
- 250, // Hausa
- 254, // Hebrew
- 255, // Hindi
- 256, // Hungarian
- 257, // Icelandic
- 258, // Indonesian
- 259, // Interlingua
- 0, // Interlingue
- 260, // Inuktitut
- 0, // Inupiak
- 262, // Irish
- 263, // Italian
- 267, // Japanese
- 268, // Javanese
- 269, // Kannada
- 270, // Kashmiri
- 271, // Kazakh
- 272, // Kinyarwanda
- 273, // Kirghiz
- 274, // Korean
- 276, // Kurdish
- 277, // Rundi
- 278, // Lao
- 0, // Latin
- 279, // Latvian
- 280, // Lingala
- 284, // Lithuanian
- 285, // Macedonian
- 286, // Malagasy
- 287, // Malay
- 291, // Malayalam
- 292, // Maltese
- 293, // Maori
- 294, // Marathi
- 0, // Marshallese
- 295, // Mongolian
- 0, // Nauru
- 297, // Nepali
- 299, // Norwegian Bokmal
- 301, // Occitan
- 302, // Oriya
- 303, // Pashto
- 305, // Persian
- 307, // Polish
- 308, // Portuguese
- 320, // Punjabi
- 322, // Quechua
- 325, // Romansh
- 326, // Romanian
- 328, // Russian
- 0, // Samoan
- 334, // Sango
- 335, // Sanskrit
- 336, // Serbian
- 344, // Ossetic
- 346, // Southern Sotho
- 347, // Tswana
- 348, // Shona
- 349, // Sindhi
- 350, // Sinhala
- 351, // Swati
- 352, // Slovak
- 353, // Slovenian
- 354, // Somali
- 358, // Spanish
- 0, // Sundanese
- 386, // Swahili
- 390, // Swedish
- 393, // Sardinian
- 394, // Tajik
- 395, // Tamil
- 399, // Tatar
- 400, // Telugu
- 401, // Thai
- 402, // Tibetan
- 404, // Tigrinya
- 406, // Tongan
- 407, // Tsonga
- 408, // Turkish
- 410, // Turkmen
- 0, // Tahitian
- 411, // Uighur
- 412, // Ukrainian
- 413, // Urdu
- 415, // Uzbek
- 418, // Vietnamese
- 419, // Volapuk
- 420, // Welsh
- 421, // Wolof
- 422, // Xhosa
- 423, // Yiddish
- 424, // Yoruba
- 0, // Zhuang
- 426, // Zulu
- 427, // Norwegian Nynorsk
- 428, // Bosnian
- 430, // Divehi
- 431, // Manx
- 432, // Cornish
- 433, // Akan
- 434, // Konkani
- 435, // Ga
- 436, // Igbo
- 437, // Kamba
- 438, // Syriac
- 439, // Blin
- 440, // Geez
- 0, // Koro
- 441, // Sidamo
- 442, // Atsam
- 443, // Tigre
- 444, // Jju
- 445, // Friulian
- 446, // Venda
- 447, // Ewe
- 449, // Walamo
- 450, // Hawaiian
- 451, // Tyap
- 452, // Nyanja
- 453, // Filipino
- 454, // Swiss German
- 457, // Sichuan Yi
- 458, // Kpelle
- 459, // Low German
- 461, // South Ndebele
- 462, // Northern Sotho
- 463, // Northern Sami
- 466, // Taroko
- 467, // Gusii
- 468, // Taita
- 469, // Fulah
- 482, // Kikuyu
- 483, // Samburu
- 484, // Sena
- 485, // North Ndebele
- 486, // Rombo
- 487, // Tachelhit
- 489, // Kabyle
- 490, // Nyankole
- 491, // Bena
- 492, // Vunjo
- 493, // Bambara
- 495, // Embu
- 496, // Cherokee
- 497, // Morisyen
- 498, // Makonde
- 499, // Langi
- 500, // Ganda
- 501, // Bemba
- 502, // Kabuverdianu
- 503, // Meru
- 504, // Kalenjin
- 505, // Nama
- 506, // Machame
- 507, // Colognian
- 508, // Masai
- 510, // Soga
- 511, // Luyia
- 512, // Asu
- 513, // Teso
- 515, // Saho
- 516, // Koyra Chiini
- 517, // Rwa
- 518, // Luo
- 519, // Chiga
- 520, // Central Morocco Tamazight
- 521, // Koyraboro Senni
- 522, // Shambala
- 523, // Bodo
- 0, // Avaric
- 0, // Chamorro
- 524, // Chechen
- 525, // Church
- 526, // Chuvash
- 0, // Cree
- 0, // Haitian
- 0, // Herero
- 0, // Hiri Motu
- 0, // Kanuri
- 0, // Komi
- 0, // Kongo
- 0, // Kwanyama
- 0, // Limburgish
- 527, // Luba Katanga
- 528, // Luxembourgish
- 0, // Navaho
- 0, // Ndonga
- 0, // Ojibwa
- 0, // Pali
- 529, // Walloon
- 530, // Aghem
- 531, // Basaa
- 532, // Zarma
- 533, // Duala
- 534, // Jola Fonyi
- 535, // Ewondo
- 536, // Bafia
- 537, // Makhuwa Meetto
- 538, // Mundang
- 539, // Kwasio
- 540, // Nuer
- 541, // Sakha
- 542, // Sangu
- 0, // Congo Swahili
- 543, // Tasawaq
- 544, // Vai
- 546, // Walser
- 547, // Yangben
- 0, // Avestan
- 548, // Asturian
- 549, // Ngomba
- 550, // Kako
- 551, // Meta
- 552, // Ngiemboon
- 0, // Aragonese
- 0, // Akkadian
- 0, // Ancient Egyptian
- 0, // Ancient Greek
- 0, // Aramaic
- 0, // Balinese
- 0, // Bamun
- 0, // Batak Toba
- 0, // Buginese
- 0, // Buhid
- 0, // Carian
- 0, // Chakma
- 0, // Classical Mandaic
- 0, // Coptic
- 0, // Dogri
- 0, // Eastern Cham
- 0, // Eastern Kayah
- 0, // Etruscan
- 0, // Gothic
- 0, // Hanunoo
- 0, // Ingush
- 0, // Large Flowery Miao
- 0, // Lepcha
- 0, // Limbu
- 0, // Lisu
- 0, // Lu
- 0, // Lycian
- 0, // Lydian
- 0, // Mandingo
- 553, // Manipuri
- 0, // Meroitic
- 0, // Northern Thai
- 0, // Old Irish
- 0, // Old Norse
- 0, // Old Persian
- 0, // Old Turkish
- 0, // Pahlavi
- 0, // Parthian
- 0, // Phoenician
- 0, // Prakrit Language
- 0, // Rejang
- 0, // Sabaean
- 0, // Samaritan
- 0, // Santali
- 0, // Saurashtra
- 0, // Sora
- 0, // Sylheti
- 0, // Tagbanwa
- 554, // Tai Dam
- 0, // Tai Nua
- 0, // Ugaritic
- 555, // Akoose
- 556, // Lakota
- 557, // Standard Moroccan Tamazight
- 558, // Mapuche
- 559, // Central Kurdish
- 561, // Lower Sorbian
- 562, // Upper Sorbian
- 563, // Kenyang
- 564, // Mohawk
- 565, // Nko
- 566, // Prussian
- 567, // Kiche
- 568, // Southern Sami
- 569, // Lule Sami
- 570, // Inari Sami
- 571, // Skolt Sami
- 572, // Warlpiri
- 0, // Manichaean Middle Persian
- 0, // Mende
- 0, // Ancient North Arabian
- 0, // Linear A
- 0, // Hmong Njua
- 0, // Ho
- 0, // Lezghian
- 0, // Bassa
- 0, // Mono
- 0, // Tedim Chin
- 0, // Maithili
- 0, // Ahom
- 0, // American Sign Language
- 0, // Ardhamagadhi Prakrit
- 0, // Bhojpuri
- 0, // Hieroglyphic Luwian
- 0, // Literary Chinese
- 573, // Mazanderani
- 0, // Mru
- 0, // Newari
- 574, // Northern Luri
- 0, // Palauan
- 0, // Papiamento
- 0, // Saraiki
- 0, // Tokelau
- 0, // Tok Pisin
- 0, // Tuvalu
- 0, // Uncoded Languages
- 576, // Cantonese
- 0, // Osage
- 0, // Tangut
- 578, // Ido
- 579, // Lojban
- 580, // Sicilian
- 581, // Southern Kurdish
- 582, // Western Balochi
- 0 // trailing 0
-};
-
-static const QLocaleData locale_data[] = {
- // lang script terr dec group list prcnt zero minus plus exp quotOpn quotEnd altQtOpn altQtEnd lpStart lpMid lpEnd lpTwo sDtFmt lDtFmt sTmFmt lTmFmt ssMonth slMonth snMonth sMonth lMonth nMonth ssDays slDays snDays sDays lDays nDays am pm byte siQuant iecQuant currISO currSym currDsply currFmt currFmtNeg endoLang endoCntry curDgt curRnd dow1st wknd+ wknd-
- { 1, 0, 0, 46, 44, 59, 37, 48, 45, 43, 101, 34, 34, 39, 39, 0,6 , 0,6 , 0,6 , 0,6 , 0,10 , 10,17 , 0,8 , 8,10 , 0,48 , 48,86 , 134,24 , 0,48 , 48,86 , 158,27 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 99,14 , 0,2 , 0,2 , 0,5 , 5,17 , 22,23 , {0,0,0}, 0,0 , 0,7 , 0,4 , 4,0 , 0,0 , 0,0 , 2, 1, 1, 6, 7 }, // C/AnyScript/AnyCountry
- { 3, 7, 69, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 27,8 , 35,18 , 18,7 , 25,12 , 185,48 , 233,111 , 134,24 , 185,48 , 233,111 , 134,24 , 113,28 , 141,55 , 85,14 , 113,28 , 141,55 , 85,14 , 2,2 , 2,2 , 45,4 , 5,17 , 22,23 , {69,84,66}, 0,2 , 7,24 , 4,4 , 4,0 , 0,6 , 6,10 , 2, 1, 7, 6, 7 }, // Oromo/Latin/Ethiopia
- { 3, 7, 111, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 27,8 , 35,18 , 37,5 , 8,10 , 185,48 , 233,111 , 344,24 , 185,48 , 233,111 , 134,24 , 113,28 , 141,55 , 196,14 , 113,28 , 141,55 , 196,14 , 2,2 , 2,2 , 45,4 , 5,17 , 22,23 , {75,69,83}, 2,3 , 0,7 , 4,4 , 4,0 , 0,6 , 16,8 , 2, 1, 7, 6, 7 }, // Oromo/Latin/Kenya
- { 4, 7, 69, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 53,10 , 63,17 , 37,5 , 8,10 , 368,48 , 368,48 , 158,27 , 368,48 , 368,48 , 158,27 , 0,28 , 0,28 , 85,14 , 0,28 , 0,28 , 85,14 , 0,2 , 0,2 , 45,4 , 5,17 , 22,23 , {69,84,66}, 0,0 , 0,7 , 8,5 , 4,0 , 0,0 , 0,0 , 2, 1, 7, 6, 7 }, // Afar/Latin/Ethiopia
- { 5, 7, 195, 44, 160, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 6,8 , 6,8 , 53,10 , 80,17 , 37,5 , 8,10 , 416,59 , 475,92 , 134,24 , 416,59 , 475,92 , 134,24 , 210,28 , 238,58 , 296,14 , 210,28 , 238,58 , 296,14 , 4,3 , 4,3 , 49,5 , 5,17 , 22,23 , {90,65,82}, 5,1 , 31,67 , 4,4 , 4,0 , 24,9 , 33,11 , 2, 1, 7, 6, 7 }, // Afrikaans/Latin/South Africa
- { 5, 7, 148, 44, 160, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 6,8 , 6,8 , 53,10 , 97,16 , 18,7 , 25,12 , 416,59 , 475,92 , 134,24 , 416,59 , 475,92 , 134,24 , 210,28 , 238,58 , 296,14 , 210,28 , 238,58 , 296,14 , 4,3 , 4,3 , 49,5 , 5,17 , 22,23 , {78,65,68}, 6,1 , 98,55 , 4,4 , 4,0 , 24,9 , 44,7 , 2, 1, 1, 6, 7 }, // Afrikaans/Latin/Namibia
- { 6, 7, 2, 44, 160, 59, 37, 48, 45, 43, 101, 171, 187, 8220, 8221, 0,6 , 0,6 , 14,9 , 14,9 , 113,6 , 10,17 , 18,7 , 42,13 , 567,50 , 617,78 , 695,27 , 567,50 , 617,78 , 695,27 , 310,28 , 338,58 , 396,15 , 411,28 , 338,58 , 396,15 , 7,11 , 7,10 , 54,4 , 5,17 , 22,23 , {65,76,76}, 7,4 , 153,45 , 13,5 , 4,0 , 51,5 , 56,8 , 0, 0, 1, 6, 7 }, // Albanian/Latin/Albania
- { 6, 7, 127, 44, 160, 59, 37, 48, 45, 43, 101, 171, 187, 8220, 8221, 0,6 , 0,6 , 14,9 , 14,9 , 113,6 , 10,17 , 37,5 , 8,10 , 567,50 , 617,78 , 695,27 , 567,50 , 617,78 , 695,27 , 310,28 , 338,58 , 396,15 , 411,28 , 338,58 , 396,15 , 7,11 , 7,10 , 54,4 , 5,17 , 22,23 , {77,75,68}, 11,3 , 198,54 , 13,5 , 4,0 , 51,5 , 64,18 , 2, 1, 1, 6, 7 }, // Albanian/Latin/Macedonia
- { 6, 7, 257, 44, 160, 59, 37, 48, 45, 43, 101, 171, 187, 8220, 8221, 0,6 , 0,6 , 14,9 , 14,9 , 113,6 , 10,17 , 37,5 , 8,10 , 567,50 , 617,78 , 695,27 , 567,50 , 617,78 , 695,27 , 310,28 , 338,58 , 396,15 , 411,28 , 338,58 , 396,15 , 7,11 , 7,10 , 54,4 , 5,17 , 22,23 , {69,85,82}, 14,1 , 252,21 , 13,5 , 4,0 , 51,5 , 82,6 , 2, 1, 1, 6, 7 }, // Albanian/Latin/Kosovo
- { 7, 14, 69, 46, 44, 59, 37, 48, 45, 43, 101, 171, 187, 8249, 8250, 23,6 , 23,6 , 29,9 , 38,8 , 119,10 , 63,17 , 18,7 , 25,12 , 722,46 , 768,61 , 829,24 , 722,46 , 768,61 , 829,24 , 439,27 , 466,28 , 494,14 , 439,27 , 466,28 , 494,14 , 18,3 , 17,4 , 58,3 , 61,23 , 22,23 , {69,84,66}, 15,2 , 273,34 , 4,4 , 4,0 , 88,4 , 92,5 , 2, 1, 7, 6, 7 }, // Amharic/Ethiopic/Ethiopia
- { 8, 1, 64, 1643, 1644, 1563, 37, 1632, 45, 43, 101, 8221, 8220, 8217, 8216, 46,6 , 46,6 , 52,7 , 59,6 , 129,10 , 139,17 , 18,7 , 25,12 , 853,75 , 853,75 , 928,24 , 853,75 , 853,75 , 928,24 , 508,52 , 508,52 , 560,14 , 508,52 , 508,52 , 560,14 , 21,1 , 21,1 , 84,4 , 88,47 , 22,23 , {69,71,80}, 17,5 , 307,81 , 13,5 , 4,0 , 97,7 , 104,3 , 2, 1, 6, 5, 6 }, // Arabic/Arabic/Egypt
- { 8, 1, 3, 44, 46, 59, 37, 48, 45, 43, 101, 8221, 8220, 8217, 8216, 46,6 , 46,6 , 52,7 , 59,6 , 129,10 , 139,17 , 18,7 , 25,12 , 952,71 , 952,71 , 1023,24 , 952,71 , 952,71 , 1023,24 , 508,52 , 508,52 , 560,14 , 508,52 , 508,52 , 560,14 , 21,1 , 21,1 , 84,4 , 88,47 , 22,23 , {68,90,68}, 22,5 , 388,102 , 13,5 , 4,0 , 97,7 , 107,7 , 2, 1, 6, 5, 6 }, // Arabic/Arabic/Algeria
- { 8, 1, 17, 1643, 1644, 1563, 37, 1632, 45, 43, 101, 8221, 8220, 8217, 8216, 46,6 , 46,6 , 52,7 , 59,6 , 129,10 , 139,17 , 18,7 , 25,12 , 853,75 , 853,75 , 928,24 , 853,75 , 853,75 , 928,24 , 508,52 , 508,52 , 560,14 , 508,52 , 508,52 , 560,14 , 21,1 , 21,1 , 84,4 , 88,47 , 22,23 , {66,72,68}, 27,5 , 490,91 , 13,5 , 4,0 , 97,7 , 114,7 , 3, 0, 6, 5, 6 }, // Arabic/Arabic/Bahrain
- { 8, 1, 42, 1643, 1644, 1563, 37, 1632, 45, 43, 101, 8221, 8220, 8217, 8216, 46,6 , 46,6 , 52,7 , 59,6 , 129,10 , 139,17 , 18,7 , 25,12 , 853,75 , 853,75 , 928,24 , 853,75 , 853,75 , 928,24 , 508,52 , 508,52 , 560,14 , 508,52 , 508,52 , 560,14 , 21,1 , 21,1 , 84,4 , 88,47 , 22,23 , {88,65,70}, 32,4 , 581,112 , 13,5 , 4,0 , 97,7 , 121,4 , 0, 0, 1, 6, 7 }, // Arabic/Arabic/Chad
- { 8, 1, 48, 1643, 1644, 1563, 37, 1632, 45, 43, 101, 8221, 8220, 8217, 8216, 46,6 , 46,6 , 52,7 , 59,6 , 129,10 , 139,17 , 37,5 , 8,10 , 853,75 , 853,75 , 928,24 , 853,75 , 853,75 , 928,24 , 508,52 , 508,52 , 560,14 , 508,52 , 508,52 , 560,14 , 21,1 , 21,1 , 84,4 , 88,47 , 22,23 , {75,77,70}, 36,2 , 693,105 , 13,5 , 4,0 , 97,7 , 125,9 , 0, 0, 1, 6, 7 }, // Arabic/Arabic/Comoros
- { 8, 1, 59, 1643, 1644, 1563, 37, 1632, 45, 43, 101, 8221, 8220, 8217, 8216, 46,6 , 46,6 , 52,7 , 59,6 , 129,10 , 139,17 , 18,7 , 25,12 , 853,75 , 853,75 , 928,24 , 853,75 , 853,75 , 928,24 , 508,52 , 508,52 , 560,14 , 508,52 , 508,52 , 560,14 , 21,1 , 21,1 , 84,4 , 88,47 , 22,23 , {68,74,70}, 38,3 , 798,84 , 13,5 , 4,0 , 97,7 , 134,6 , 0, 0, 6, 6, 7 }, // Arabic/Arabic/Djibouti
- { 8, 1, 67, 1643, 1644, 1563, 37, 1632, 45, 43, 101, 8221, 8220, 8217, 8216, 46,6 , 46,6 , 52,7 , 59,6 , 129,10 , 139,17 , 18,7 , 25,12 , 853,75 , 853,75 , 928,24 , 853,75 , 853,75 , 928,24 , 508,52 , 508,52 , 560,14 , 508,52 , 508,52 , 560,14 , 21,1 , 21,1 , 84,4 , 88,47 , 22,23 , {69,82,78}, 41,3 , 882,91 , 13,5 , 4,0 , 97,7 , 140,7 , 2, 1, 1, 6, 7 }, // Arabic/Arabic/Eritrea
- { 8, 1, 103, 1643, 1644, 1563, 37, 1632, 45, 43, 101, 8221, 8220, 8217, 8216, 46,6 , 46,6 , 52,7 , 59,6 , 129,10 , 139,17 , 18,7 , 25,12 , 1047,92 , 1047,92 , 1139,24 , 1163,92 , 1047,92 , 1139,24 , 508,52 , 508,52 , 560,14 , 508,52 , 508,52 , 560,14 , 21,1 , 21,1 , 84,4 , 88,47 , 22,23 , {73,81,68}, 44,5 , 973,84 , 13,5 , 4,0 , 97,7 , 147,6 , 0, 0, 6, 5, 6 }, // Arabic/Arabic/Iraq
- { 8, 1, 105, 1643, 1644, 1563, 37, 1632, 45, 43, 101, 8221, 8220, 8217, 8216, 46,6 , 46,6 , 52,7 , 59,6 , 129,10 , 139,17 , 55,4 , 59,9 , 853,75 , 853,75 , 928,24 , 853,75 , 853,75 , 928,24 , 508,52 , 508,52 , 560,14 , 508,52 , 508,52 , 560,14 , 21,1 , 21,1 , 84,4 , 88,47 , 22,23 , {73,76,83}, 49,1 , 1057,133 , 13,5 , 4,0 , 97,7 , 153,7 , 2, 1, 7, 5, 6 }, // Arabic/Arabic/Israel
- { 8, 1, 109, 1643, 1644, 1563, 37, 1632, 45, 43, 101, 8221, 8220, 8217, 8216, 46,6 , 46,6 , 52,7 , 59,6 , 129,10 , 139,17 , 18,7 , 25,12 , 1047,92 , 1047,92 , 1139,24 , 1047,92 , 1047,92 , 1139,24 , 508,52 , 508,52 , 560,14 , 508,52 , 508,52 , 560,14 , 21,1 , 21,1 , 84,4 , 88,47 , 22,23 , {74,79,68}, 50,5 , 1190,84 , 13,5 , 4,0 , 97,7 , 160,6 , 3, 0, 6, 5, 6 }, // Arabic/Arabic/Jordan
- { 8, 1, 115, 1643, 1644, 1563, 37, 1632, 45, 43, 101, 8221, 8220, 8217, 8216, 46,6 , 46,6 , 52,7 , 59,6 , 129,10 , 139,17 , 18,7 , 25,12 , 853,75 , 853,75 , 928,24 , 853,75 , 853,75 , 928,24 , 508,52 , 508,52 , 560,14 , 508,52 , 508,52 , 560,14 , 21,1 , 21,1 , 84,4 , 88,47 , 22,23 , {75,87,68}, 55,5 , 1274,84 , 13,5 , 4,0 , 97,7 , 166,6 , 3, 0, 6, 5, 6 }, // Arabic/Arabic/Kuwait
- { 8, 1, 119, 1643, 1644, 1563, 37, 1632, 45, 43, 101, 8221, 8220, 8217, 8216, 46,6 , 46,6 , 52,7 , 59,6 , 129,10 , 139,17 , 18,7 , 25,12 , 1047,92 , 1047,92 , 1139,24 , 1047,92 , 1047,92 , 1139,24 , 508,52 , 508,52 , 560,14 , 508,52 , 508,52 , 560,14 , 21,1 , 21,1 , 84,4 , 88,47 , 22,23 , {76,66,80}, 60,5 , 1358,84 , 13,5 , 4,0 , 97,7 , 172,5 , 0, 0, 1, 6, 7 }, // Arabic/Arabic/Lebanon
- { 8, 1, 122, 44, 46, 59, 37, 48, 45, 43, 101, 8221, 8220, 8217, 8216, 46,6 , 46,6 , 52,7 , 59,6 , 129,10 , 139,17 , 18,7 , 25,12 , 853,75 , 853,75 , 928,24 , 853,75 , 853,75 , 928,24 , 508,52 , 508,52 , 560,14 , 508,52 , 508,52 , 560,14 , 21,1 , 21,1 , 84,4 , 88,47 , 22,23 , {76,89,68}, 65,5 , 1442,88 , 13,5 , 4,0 , 97,7 , 177,5 , 3, 0, 6, 5, 6 }, // Arabic/Arabic/Libya
- { 8, 1, 136, 1643, 1644, 1563, 37, 1632, 45, 43, 101, 8221, 8220, 8217, 8216, 46,6 , 46,6 , 52,7 , 59,6 , 129,10 , 139,17 , 18,7 , 25,12 , 1255,72 , 1255,72 , 1327,24 , 1255,72 , 1255,72 , 1327,24 , 508,52 , 508,52 , 560,14 , 508,52 , 508,52 , 560,14 , 21,1 , 21,1 , 84,4 , 88,47 , 22,23 , {77,82,85}, 70,4 , 1530,112 , 13,5 , 4,0 , 97,7 , 182,9 , 2, 1, 1, 6, 7 }, // Arabic/Arabic/Mauritania
- { 8, 1, 145, 44, 46, 59, 37, 48, 45, 43, 101, 8221, 8220, 8217, 8216, 46,6 , 46,6 , 52,7 , 59,6 , 129,10 , 139,17 , 37,5 , 8,10 , 1351,70 , 1351,70 , 1421,24 , 1351,70 , 1351,70 , 1421,24 , 508,52 , 508,52 , 560,14 , 508,52 , 508,52 , 560,14 , 21,1 , 21,1 , 84,4 , 88,47 , 22,23 , {77,65,68}, 74,5 , 1642,87 , 13,5 , 4,0 , 97,7 , 191,6 , 2, 1, 1, 6, 7 }, // Arabic/Arabic/Morocco
- { 8, 1, 162, 1643, 1644, 1563, 37, 1632, 45, 43, 101, 8221, 8220, 8217, 8216, 46,6 , 46,6 , 52,7 , 59,6 , 129,10 , 139,17 , 18,7 , 25,12 , 853,75 , 853,75 , 928,24 , 853,75 , 853,75 , 928,24 , 508,52 , 508,52 , 560,14 , 508,52 , 508,52 , 560,14 , 21,1 , 21,1 , 84,4 , 88,47 , 22,23 , {79,77,82}, 79,5 , 1729,77 , 13,5 , 4,0 , 97,7 , 197,5 , 3, 0, 6, 5, 6 }, // Arabic/Arabic/Oman
- { 8, 1, 165, 1643, 1644, 1563, 37, 1632, 45, 43, 101, 8221, 8220, 8217, 8216, 46,6 , 46,6 , 52,7 , 59,6 , 129,10 , 139,17 , 18,7 , 25,12 , 1047,92 , 1047,92 , 1139,24 , 1047,92 , 1047,92 , 1139,24 , 508,52 , 508,52 , 560,14 , 508,52 , 508,52 , 560,14 , 21,1 , 21,1 , 84,4 , 88,47 , 22,23 , {73,76,83}, 49,1 , 1057,133 , 13,5 , 4,0 , 97,7 , 202,18 , 2, 1, 1, 6, 7 }, // Arabic/Arabic/Palestinian Territories
- { 8, 1, 175, 1643, 1644, 1563, 37, 1632, 45, 43, 101, 8221, 8220, 8217, 8216, 46,6 , 46,6 , 52,7 , 59,6 , 129,10 , 139,17 , 18,7 , 25,12 , 853,75 , 853,75 , 928,24 , 853,75 , 853,75 , 928,24 , 508,52 , 508,52 , 560,14 , 508,52 , 508,52 , 560,14 , 21,1 , 21,1 , 84,4 , 88,47 , 22,23 , {81,65,82}, 84,5 , 1806,70 , 13,5 , 4,0 , 97,7 , 220,3 , 2, 1, 6, 5, 6 }, // Arabic/Arabic/Qatar
- { 8, 1, 186, 1643, 1644, 1563, 37, 1632, 45, 43, 101, 8221, 8220, 8217, 8216, 46,6 , 46,6 , 52,7 , 59,6 , 129,10 , 139,17 , 18,7 , 25,12 , 853,75 , 853,75 , 928,24 , 853,75 , 853,75 , 928,24 , 508,52 , 508,52 , 560,14 , 508,52 , 508,52 , 560,14 , 21,1 , 21,1 , 84,4 , 88,47 , 22,23 , {83,65,82}, 89,5 , 1876,77 , 13,5 , 4,0 , 97,7 , 223,24 , 2, 1, 7, 5, 6 }, // Arabic/Arabic/Saudi Arabia
- { 8, 1, 194, 1643, 1644, 1563, 37, 1632, 45, 43, 101, 8221, 8220, 8217, 8216, 46,6 , 46,6 , 52,7 , 59,6 , 129,10 , 139,17 , 18,7 , 25,12 , 853,75 , 853,75 , 928,24 , 853,75 , 853,75 , 928,24 , 508,52 , 508,52 , 560,14 , 508,52 , 508,52 , 560,14 , 21,1 , 21,1 , 84,4 , 88,47 , 22,23 , {83,79,83}, 94,1 , 1953,77 , 13,5 , 4,0 , 97,7 , 247,7 , 0, 0, 1, 6, 7 }, // Arabic/Arabic/Somalia
- { 8, 1, 201, 1643, 1644, 1563, 37, 1632, 45, 43, 101, 8221, 8220, 8217, 8216, 46,6 , 46,6 , 52,7 , 59,6 , 129,10 , 139,17 , 18,7 , 25,12 , 853,75 , 853,75 , 928,24 , 853,75 , 853,75 , 928,24 , 508,52 , 508,52 , 560,14 , 508,52 , 508,52 , 560,14 , 21,1 , 21,1 , 84,4 , 88,47 , 22,23 , {83,68,71}, 95,4 , 2030,91 , 13,5 , 4,0 , 97,7 , 254,7 , 2, 1, 6, 5, 6 }, // Arabic/Arabic/Sudan
- { 8, 1, 207, 1643, 1644, 1563, 37, 1632, 45, 43, 101, 8221, 8220, 8217, 8216, 46,6 , 46,6 , 52,7 , 59,6 , 129,10 , 139,17 , 18,7 , 25,12 , 1047,92 , 1047,92 , 1139,24 , 1047,92 , 1047,92 , 1139,24 , 508,52 , 508,52 , 560,14 , 508,52 , 508,52 , 560,14 , 21,1 , 21,1 , 84,4 , 88,47 , 22,23 , {83,89,80}, 99,5 , 2121,77 , 13,5 , 4,0 , 97,7 , 261,5 , 0, 0, 6, 5, 6 }, // Arabic/Arabic/Syria
- { 8, 1, 216, 44, 46, 59, 37, 48, 45, 43, 101, 8221, 8220, 8217, 8216, 46,6 , 46,6 , 52,7 , 59,6 , 129,10 , 139,17 , 18,7 , 25,12 , 952,71 , 952,71 , 1023,24 , 952,71 , 952,71 , 1023,24 , 508,52 , 508,52 , 560,14 , 508,52 , 508,52 , 560,14 , 21,1 , 21,1 , 84,4 , 88,47 , 22,23 , {84,78,68}, 104,5 , 2198,95 , 13,5 , 4,0 , 97,7 , 266,4 , 3, 0, 1, 6, 7 }, // Arabic/Arabic/Tunisia
- { 8, 1, 223, 1643, 1644, 1563, 37, 1632, 45, 43, 101, 8221, 8220, 8217, 8216, 46,6 , 46,6 , 52,7 , 59,6 , 129,10 , 139,17 , 18,7 , 25,12 , 853,75 , 853,75 , 928,24 , 853,75 , 853,75 , 928,24 , 508,52 , 508,52 , 560,14 , 508,52 , 508,52 , 560,14 , 21,1 , 21,1 , 84,4 , 88,47 , 22,23 , {65,69,68}, 109,5 , 2293,91 , 13,5 , 4,0 , 97,7 , 270,24 , 2, 1, 6, 5, 6 }, // Arabic/Arabic/United Arab Emirates
- { 8, 1, 236, 46, 44, 59, 37, 48, 45, 43, 101, 8221, 8220, 8217, 8216, 46,6 , 46,6 , 52,7 , 59,6 , 129,10 , 139,17 , 18,7 , 25,12 , 853,75 , 853,75 , 928,24 , 853,75 , 853,75 , 928,24 , 508,52 , 508,52 , 560,14 , 508,52 , 508,52 , 560,14 , 21,1 , 21,1 , 84,4 , 88,47 , 22,23 , {77,65,68}, 74,5 , 1642,87 , 13,5 , 4,0 , 97,7 , 294,15 , 2, 1, 1, 6, 7 }, // Arabic/Arabic/Western Sahara
- { 8, 1, 237, 1643, 1644, 1563, 37, 1632, 45, 43, 101, 8221, 8220, 8217, 8216, 46,6 , 46,6 , 52,7 , 59,6 , 129,10 , 139,17 , 18,7 , 25,12 , 853,75 , 853,75 , 928,24 , 853,75 , 853,75 , 928,24 , 508,52 , 508,52 , 560,14 , 508,52 , 508,52 , 560,14 , 21,1 , 21,1 , 84,4 , 88,47 , 22,23 , {89,69,82}, 114,5 , 2384,70 , 13,5 , 4,0 , 97,7 , 309,5 , 0, 0, 7, 5, 6 }, // Arabic/Arabic/Yemen
- { 8, 1, 254, 1643, 1644, 1563, 37, 1632, 45, 43, 101, 8221, 8220, 8217, 8216, 46,6 , 46,6 , 52,7 , 59,6 , 129,10 , 139,17 , 18,7 , 25,12 , 853,75 , 853,75 , 928,24 , 853,75 , 853,75 , 928,24 , 508,52 , 508,52 , 560,14 , 508,52 , 508,52 , 560,14 , 21,1 , 21,1 , 84,4 , 88,47 , 22,23 , {83,83,80}, 119,1 , 2454,132 , 13,5 , 4,0 , 97,7 , 314,12 , 2, 1, 1, 6, 7 }, // Arabic/Arabic/South Sudan
- { 8, 1, 260, 1643, 1644, 1563, 37, 1632, 45, 43, 101, 8221, 8220, 8217, 8216, 46,6 , 46,6 , 52,7 , 59,6 , 129,10 , 139,17 , 18,7 , 25,12 , 853,75 , 853,75 , 928,24 , 853,75 , 853,75 , 928,24 , 508,52 , 508,52 , 560,14 , 508,52 , 508,52 , 560,14 , 21,1 , 21,1 , 84,4 , 88,47 , 22,23 , {0,0,0}, 0,0 , 2586,0 , 13,5 , 4,0 , 326,23 , 349,6 , 2, 1, 1, 6, 7 }, // Arabic/Arabic/World
- { 9, 10, 11, 44, 160, 59, 37, 48, 45, 43, 101, 171, 187, 171, 187, 0,6 , 0,6 , 65,7 , 65,7 , 156,8 , 164,20 , 37,5 , 8,10 , 1445,48 , 1493,94 , 1587,24 , 1445,48 , 1611,106 , 1587,24 , 574,28 , 602,62 , 664,14 , 574,28 , 602,62 , 664,14 , 0,2 , 0,2 , 135,6 , 141,17 , 22,23 , {65,77,68}, 120,1 , 2586,46 , 13,5 , 4,0 , 355,7 , 362,8 , 2, 0, 1, 6, 7 }, // Armenian/Armenian/Armenia
- { 10, 11, 100, 46, 44, 59, 37, 2534, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 72,9 , 72,9 , 184,8 , 192,18 , 68,7 , 75,12 , 1717,64 , 1781,89 , 1870,24 , 1717,64 , 1781,89 , 1870,24 , 678,32 , 710,58 , 768,14 , 678,32 , 710,58 , 768,14 , 22,9 , 22,7 , 158,4 , 162,37 , 22,23 , {73,78,82}, 121,1 , 2632,43 , 8,5 , 4,0 , 370,7 , 377,4 , 2, 1, 7, 7, 7 }, // Assamese/Bengali/India
- { 12, 7, 15, 44, 46, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 81,8 , 81,8 , 156,8 , 210,17 , 37,5 , 8,10 , 1894,48 , 1942,77 , 158,27 , 1894,48 , 2019,77 , 158,27 , 782,27 , 809,67 , 99,14 , 782,27 , 809,67 , 99,14 , 0,2 , 0,2 , 199,4 , 5,17 , 22,23 , {65,90,78}, 122,1 , 2675,58 , 13,5 , 4,0 , 381,10 , 391,10 , 2, 1, 1, 6, 7 }, // Azerbaijani/Latin/Azerbaijan
- { 12, 1, 102, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 53,10 , 63,17 , 37,5 , 8,10 , 368,48 , 368,48 , 158,27 , 368,48 , 368,48 , 158,27 , 0,28 , 0,28 , 85,14 , 0,28 , 0,28 , 85,14 , 0,2 , 0,2 , 45,4 , 5,17 , 22,23 , {73,82,82}, 0,0 , 0,7 , 8,5 , 4,0 , 0,0 , 0,0 , 0, 0, 6, 5, 5 }, // Azerbaijani/Arabic/Iran
- { 12, 2, 15, 44, 46, 59, 37, 48, 45, 43, 101, 171, 187, 8249, 8250, 0,6 , 0,6 , 0,6 , 0,6 , 156,8 , 210,17 , 37,5 , 8,10 , 2096,48 , 2144,77 , 158,27 , 2096,48 , 2221,77 , 158,27 , 876,27 , 903,67 , 99,14 , 876,27 , 903,67 , 99,14 , 31,2 , 29,2 , 45,4 , 5,17 , 22,23 , {65,90,78}, 122,1 , 2733,12 , 13,5 , 4,0 , 401,10 , 411,10 , 2, 1, 1, 6, 7 }, // Azerbaijani/Cyrillic/Azerbaijan
- { 13, 2, 178, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 53,10 , 63,17 , 37,5 , 8,10 , 368,48 , 368,48 , 158,27 , 368,48 , 368,48 , 158,27 , 0,28 , 0,28 , 85,14 , 0,28 , 0,28 , 85,14 , 0,2 , 0,2 , 45,4 , 5,17 , 22,23 , {82,85,66}, 123,1 , 0,7 , 8,5 , 4,0 , 0,0 , 0,0 , 2, 1, 1, 6, 7 }, // Bashkir/Cyrillic/Russia
- { 14, 7, 197, 44, 46, 59, 37, 48, 8722, 43, 101, 8220, 8221, 8220, 8221, 0,6 , 0,6 , 89,9 , 89,9 , 227,6 , 233,36 , 37,5 , 87,12 , 2298,60 , 2358,93 , 2451,24 , 2298,60 , 2358,93 , 2451,24 , 970,28 , 998,68 , 1066,14 , 970,28 , 998,68 , 1066,14 , 0,2 , 0,2 , 203,7 , 5,17 , 22,23 , {69,85,82}, 14,1 , 2745,20 , 13,5 , 4,0 , 421,7 , 428,8 , 2, 1, 1, 6, 7 }, // Basque/Latin/Spain
- { 15, 11, 18, 46, 44, 59, 37, 2534, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 98,9 , 98,9 , 269,6 , 192,18 , 18,7 , 25,12 , 2475,90 , 2475,90 , 2565,33 , 2598,77 , 2475,90 , 2565,33 , 1080,37 , 1117,58 , 1175,18 , 1080,37 , 1117,58 , 1175,18 , 0,2 , 0,2 , 158,4 , 5,17 , 22,23 , {66,68,84}, 124,1 , 2765,49 , 0,4 , 4,0 , 436,5 , 441,8 , 2, 1, 7, 6, 7 }, // Bengali/Bengali/Bangladesh
- { 15, 11, 100, 46, 44, 59, 37, 2534, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 98,9 , 98,9 , 269,6 , 192,18 , 18,7 , 25,12 , 2475,90 , 2475,90 , 2565,33 , 2598,77 , 2475,90 , 2565,33 , 1080,37 , 1117,58 , 1175,18 , 1080,37 , 1117,58 , 1175,18 , 0,2 , 0,2 , 158,4 , 5,17 , 22,23 , {73,78,82}, 121,1 , 2814,43 , 0,4 , 4,0 , 436,5 , 449,4 , 2, 1, 7, 7, 7 }, // Bengali/Bengali/India
- { 16, 31, 25, 46, 44, 59, 37, 3872, 45, 43, 101, 8220, 8221, 8216, 8217, 107,9 , 107,9 , 107,9 , 107,9 , 53,10 , 275,30 , 99,22 , 121,27 , 2675,63 , 2738,191 , 2929,27 , 2956,27 , 2983,132 , 3115,27 , 1193,34 , 1227,79 , 1306,27 , 1193,34 , 1227,79 , 1306,27 , 33,5 , 31,6 , 45,4 , 5,17 , 22,23 , {66,84,78}, 125,3 , 2857,15 , 4,4 , 4,0 , 453,6 , 459,5 , 2, 1, 7, 6, 7 }, // Dzongkha/Tibetan/Bhutan
- { 19, 7, 74, 44, 160, 59, 37, 48, 45, 43, 101, 8220, 8221, 171, 187, 0,6 , 0,6 , 0,6 , 0,6 , 119,10 , 97,16 , 37,5 , 8,10 , 3142,63 , 3205,78 , 3283,36 , 3142,63 , 3205,78 , 3283,36 , 1333,33 , 1366,43 , 1409,18 , 1333,33 , 1366,43 , 1409,18 , 38,4 , 37,4 , 210,7 , 217,17 , 22,23 , {69,85,82}, 14,1 , 2872,36 , 13,5 , 4,0 , 464,9 , 473,5 , 2, 1, 1, 6, 7 }, // Breton/Latin/France
- { 20, 2, 33, 44, 160, 59, 37, 48, 45, 43, 101, 8222, 8220, 8222, 8220, 0,6 , 0,6 , 116,7 , 116,7 , 305,12 , 317,22 , 148,9 , 157,14 , 3319,49 , 3368,82 , 3450,24 , 3319,49 , 3368,82 , 3450,24 , 1427,21 , 1448,55 , 1503,14 , 1427,21 , 1448,55 , 1503,14 , 42,6 , 41,6 , 234,7 , 5,17 , 22,23 , {66,71,78}, 128,3 , 2908,47 , 13,5 , 4,0 , 478,9 , 487,8 , 2, 1, 1, 6, 7 }, // Bulgarian/Cyrillic/Bulgaria
- { 21, 25, 147, 46, 44, 4170, 37, 4160, 45, 43, 101, 8220, 8221, 8216, 8217, 123,5 , 123,5 , 128,10 , 128,10 , 339,8 , 347,18 , 171,6 , 177,10 , 3474,43 , 3517,88 , 3605,24 , 3474,43 , 3517,88 , 3605,24 , 1517,54 , 1517,54 , 1571,14 , 1517,54 , 1517,54 , 1571,14 , 48,5 , 47,3 , 241,5 , 5,17 , 22,23 , {77,77,75}, 131,1 , 2955,29 , 13,5 , 4,0 , 495,6 , 495,6 , 0, 0, 7, 6, 7 }, // Burmese/Myanmar/Myanmar
- { 22, 2, 20, 44, 160, 59, 37, 48, 45, 43, 101, 171, 187, 8222, 8220, 0,6 , 0,6 , 138,7 , 138,7 , 365,7 , 317,22 , 37,5 , 187,11 , 3629,48 , 3677,95 , 3772,24 , 3796,48 , 3844,98 , 3772,24 , 1585,21 , 1606,56 , 1662,14 , 1585,21 , 1606,56 , 1662,14 , 0,2 , 0,2 , 246,5 , 251,17 , 22,23 , {66,89,78}, 0,2 , 2984,89 , 13,5 , 4,0 , 501,10 , 511,8 , 2, 0, 1, 6, 7 }, // Belarusian/Cyrillic/Belarus
- { 23, 20, 36, 44, 46, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 145,9 , 154,9 , 269,6 , 97,16 , 18,7 , 25,12 , 3942,71 , 3942,71 , 4013,24 , 3942,71 , 3942,71 , 4013,24 , 1676,40 , 1716,46 , 1762,14 , 1676,40 , 1776,47 , 1762,14 , 0,2 , 0,2 , 268,2 , 5,17 , 22,23 , {75,72,82}, 132,1 , 3073,29 , 0,4 , 4,0 , 519,5 , 524,7 , 2, 1, 7, 6, 7 }, // Khmer/Khmer/Cambodia
- { 24, 7, 197, 44, 46, 59, 37, 48, 45, 43, 101, 171, 187, 8220, 8221, 0,6 , 0,6 , 163,7 , 163,7 , 269,6 , 372,22 , 55,4 , 59,9 , 4037,60 , 4097,82 , 4179,36 , 4215,93 , 4308,115 , 4179,36 , 1823,28 , 1851,60 , 1911,21 , 1823,28 , 1851,60 , 1911,21 , 53,5 , 50,5 , 0,5 , 5,17 , 22,23 , {69,85,82}, 14,1 , 3102,20 , 13,5 , 4,0 , 531,6 , 537,7 , 2, 1, 1, 6, 7 }, // Catalan/Latin/Spain
- { 24, 7, 5, 44, 46, 59, 37, 48, 45, 43, 101, 171, 187, 8220, 8221, 0,6 , 0,6 , 163,7 , 163,7 , 269,6 , 372,22 , 55,4 , 59,9 , 4037,60 , 4097,82 , 4179,36 , 4215,93 , 4308,115 , 4179,36 , 1823,28 , 1851,60 , 1911,21 , 1823,28 , 1851,60 , 1911,21 , 53,5 , 50,5 , 0,5 , 5,17 , 22,23 , {69,85,82}, 14,1 , 3102,20 , 13,5 , 4,0 , 531,6 , 544,7 , 2, 1, 1, 6, 7 }, // Catalan/Latin/Andorra
- { 24, 7, 74, 44, 46, 59, 37, 48, 45, 43, 101, 171, 187, 8220, 8221, 0,6 , 0,6 , 163,7 , 163,7 , 269,6 , 372,22 , 55,4 , 59,9 , 4037,60 , 4097,82 , 4179,36 , 4215,93 , 4308,115 , 4179,36 , 1823,28 , 1851,60 , 1911,21 , 1823,28 , 1851,60 , 1911,21 , 53,5 , 50,5 , 0,5 , 5,17 , 22,23 , {69,85,82}, 14,1 , 3102,20 , 13,5 , 4,0 , 531,6 , 551,6 , 2, 1, 1, 6, 7 }, // Catalan/Latin/France
- { 24, 7, 106, 44, 46, 59, 37, 48, 45, 43, 101, 171, 187, 8220, 8221, 0,6 , 0,6 , 163,7 , 163,7 , 269,6 , 372,22 , 55,4 , 59,9 , 4037,60 , 4097,82 , 4179,36 , 4215,93 , 4308,115 , 4179,36 , 1823,28 , 1851,60 , 1911,21 , 1823,28 , 1851,60 , 1911,21 , 53,5 , 50,5 , 0,5 , 5,17 , 22,23 , {69,85,82}, 14,1 , 3102,20 , 13,5 , 4,0 , 531,6 , 557,6 , 2, 1, 1, 6, 7 }, // Catalan/Latin/Italy
- { 25, 5, 44, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 170,5 , 170,5 , 175,5 , 175,5 , 394,8 , 402,13 , 198,6 , 204,11 , 4423,39 , 4462,38 , 158,27 , 4423,39 , 4462,38 , 158,27 , 1932,21 , 1953,28 , 1981,14 , 1932,21 , 1953,28 , 1981,14 , 58,2 , 55,2 , 270,2 , 272,21 , 22,23 , {67,78,89}, 133,1 , 3122,13 , 4,4 , 4,0 , 563,4 , 567,2 , 2, 1, 7, 6, 7 }, // Chinese/Simplified Han/China
- { 25, 5, 97, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 170,5 , 170,5 , 175,5 , 175,5 , 269,6 , 402,13 , 198,6 , 204,11 , 4423,39 , 4462,38 , 158,27 , 4423,39 , 4462,38 , 158,27 , 1932,21 , 1953,28 , 1981,14 , 1932,21 , 1953,28 , 1981,14 , 58,2 , 55,2 , 270,2 , 272,21 , 22,23 , {72,75,68}, 6,1 , 3135,11 , 4,4 , 4,0 , 563,4 , 569,9 , 2, 1, 7, 6, 7 }, // Chinese/Simplified Han/Hong Kong
- { 25, 5, 126, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 170,5 , 170,5 , 175,5 , 175,5 , 269,6 , 402,13 , 198,6 , 204,11 , 4423,39 , 4462,38 , 158,27 , 4423,39 , 4462,38 , 158,27 , 1932,21 , 1953,28 , 1981,14 , 1932,21 , 1953,28 , 1981,14 , 58,2 , 55,2 , 270,2 , 272,21 , 22,23 , {77,79,80}, 134,4 , 3146,13 , 4,4 , 4,0 , 563,4 , 578,9 , 2, 1, 7, 6, 7 }, // Chinese/Simplified Han/Macau
- { 25, 5, 190, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 170,5 , 170,5 , 175,5 , 175,5 , 27,8 , 402,13 , 198,6 , 204,11 , 4423,39 , 4462,38 , 158,27 , 4423,39 , 4462,38 , 158,27 , 1932,21 , 1953,28 , 1981,14 , 1932,21 , 1953,28 , 1981,14 , 58,2 , 55,2 , 270,2 , 272,21 , 22,23 , {83,71,68}, 6,1 , 3159,15 , 4,4 , 4,0 , 563,4 , 587,3 , 2, 1, 7, 6, 7 }, // Chinese/Simplified Han/Singapore
- { 25, 6, 97, 46, 44, 59, 37, 48, 45, 43, 101, 12300, 12301, 12302, 12303, 170,5 , 170,5 , 180,5 , 180,5 , 415,8 , 402,13 , 198,6 , 215,13 , 4423,39 , 4423,39 , 158,27 , 4423,39 , 4423,39 , 158,27 , 1995,21 , 1953,28 , 1981,14 , 1995,21 , 1953,28 , 1981,14 , 58,2 , 55,2 , 293,3 , 5,17 , 22,23 , {72,75,68}, 6,1 , 3135,11 , 18,5 , 4,0 , 590,4 , 594,9 , 2, 1, 7, 6, 7 }, // Chinese/Traditional Han/Hong Kong
- { 25, 6, 126, 46, 44, 59, 37, 48, 45, 43, 101, 12300, 12301, 12302, 12303, 170,5 , 170,5 , 180,5 , 180,5 , 415,8 , 402,13 , 198,6 , 215,13 , 4423,39 , 4423,39 , 158,27 , 4423,39 , 4423,39 , 158,27 , 1995,21 , 1953,28 , 1981,14 , 1995,21 , 1953,28 , 1981,14 , 58,2 , 55,2 , 293,3 , 5,17 , 22,23 , {77,79,80}, 134,4 , 3174,13 , 18,5 , 4,0 , 590,4 , 603,9 , 2, 1, 7, 6, 7 }, // Chinese/Traditional Han/Macau
- { 25, 6, 208, 46, 44, 59, 37, 48, 45, 43, 101, 12300, 12301, 12302, 12303, 170,5 , 170,5 , 175,5 , 175,5 , 394,8 , 423,14 , 198,6 , 215,13 , 4423,39 , 4423,39 , 158,27 , 4423,39 , 4423,39 , 158,27 , 1995,21 , 1953,28 , 1981,14 , 1995,21 , 1953,28 , 1981,14 , 58,2 , 55,2 , 45,4 , 5,17 , 22,23 , {84,87,68}, 6,1 , 3187,13 , 13,5 , 4,0 , 590,4 , 612,2 , 2, 0, 7, 6, 7 }, // Chinese/Traditional Han/Taiwan
- { 26, 7, 74, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 53,10 , 63,17 , 37,5 , 8,10 , 368,48 , 368,48 , 158,27 , 368,48 , 368,48 , 158,27 , 0,28 , 0,28 , 85,14 , 0,28 , 0,28 , 85,14 , 0,2 , 0,2 , 45,4 , 5,17 , 22,23 , {69,85,82}, 14,1 , 0,7 , 8,5 , 4,0 , 0,0 , 0,0 , 2, 1, 1, 6, 7 }, // Corsican/Latin/France
- { 27, 7, 54, 44, 46, 59, 37, 48, 45, 43, 101, 8222, 8220, 8218, 8216, 0,6 , 0,6 , 163,7 , 163,7 , 437,13 , 450,19 , 37,5 , 87,12 , 4500,49 , 4549,94 , 4643,39 , 4500,49 , 4682,98 , 4643,39 , 2016,28 , 2044,58 , 2102,14 , 2016,28 , 2044,58 , 2116,14 , 0,2 , 0,2 , 296,7 , 5,17 , 22,23 , {72,82,75}, 138,2 , 3200,60 , 13,5 , 4,0 , 614,8 , 622,8 , 2, 1, 1, 6, 7 }, // Croatian/Latin/Croatia
- { 27, 7, 27, 44, 46, 59, 37, 48, 45, 43, 101, 8222, 8220, 8218, 8216, 0,6 , 0,6 , 163,7 , 163,7 , 469,9 , 450,19 , 37,5 , 87,12 , 4500,49 , 4549,94 , 4643,39 , 4500,49 , 4682,98 , 4643,39 , 2016,28 , 2044,58 , 2116,14 , 2016,28 , 2044,58 , 2116,14 , 0,2 , 0,2 , 296,7 , 5,17 , 22,23 , {66,65,77}, 140,2 , 3260,85 , 13,5 , 4,0 , 614,8 , 630,19 , 2, 1, 1, 6, 7 }, // Croatian/Latin/Bosnia And Herzegowina
- { 28, 7, 57, 44, 160, 59, 37, 48, 45, 43, 101, 8222, 8220, 8218, 8216, 0,6 , 0,6 , 185,7 , 185,7 , 156,8 , 478,17 , 55,4 , 59,9 , 4780,48 , 4828,82 , 158,27 , 4780,48 , 4910,84 , 158,27 , 2130,21 , 2151,49 , 2200,14 , 2130,21 , 2151,49 , 2200,14 , 60,4 , 57,4 , 303,5 , 5,17 , 22,23 , {67,90,75}, 142,2 , 3345,68 , 13,5 , 4,0 , 649,7 , 656,5 , 2, 0, 1, 6, 7 }, // Czech/Latin/Czech Republic
- { 29, 7, 58, 44, 46, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 192,8 , 192,8 , 495,10 , 505,23 , 228,5 , 233,10 , 4994,59 , 5053,84 , 134,24 , 4994,59 , 5053,84 , 134,24 , 2214,28 , 2242,51 , 2293,14 , 2307,35 , 2242,51 , 2293,14 , 0,2 , 0,2 , 0,5 , 5,17 , 22,23 , {68,75,75}, 144,3 , 3413,42 , 13,5 , 4,0 , 661,5 , 666,7 , 2, 0, 1, 6, 7 }, // Danish/Latin/Denmark
- { 29, 7, 86, 44, 46, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 192,8 , 192,8 , 495,10 , 505,23 , 228,5 , 233,10 , 4994,59 , 5053,84 , 134,24 , 4994,59 , 5053,84 , 134,24 , 2214,28 , 2242,51 , 2293,14 , 2307,35 , 2242,51 , 2293,14 , 0,2 , 0,2 , 0,5 , 5,17 , 22,23 , {68,75,75}, 144,3 , 3413,42 , 13,5 , 4,0 , 661,5 , 673,8 , 2, 0, 1, 6, 7 }, // Danish/Latin/Greenland
- { 30, 7, 151, 44, 46, 59, 37, 48, 45, 43, 101, 8216, 8217, 8220, 8221, 0,6 , 0,6 , 6,8 , 6,8 , 528,10 , 97,16 , 37,5 , 8,10 , 5137,59 , 5196,88 , 134,24 , 5137,59 , 5196,88 , 134,24 , 2342,21 , 2363,59 , 2422,14 , 2342,21 , 2363,59 , 2422,14 , 64,4 , 61,4 , 45,4 , 5,17 , 22,23 , {69,85,82}, 14,1 , 3455,19 , 8,5 , 23,6 , 681,10 , 691,9 , 2, 1, 1, 6, 7 }, // Dutch/Latin/Netherlands
- { 30, 7, 12, 44, 46, 59, 37, 48, 45, 43, 101, 8216, 8217, 8220, 8221, 0,6 , 0,6 , 6,8 , 6,8 , 528,10 , 97,16 , 37,5 , 8,10 , 5137,59 , 5196,88 , 134,24 , 5137,59 , 5196,88 , 134,24 , 2342,21 , 2363,59 , 2422,14 , 2342,21 , 2363,59 , 2422,14 , 64,4 , 61,4 , 45,4 , 5,17 , 22,23 , {65,87,71}, 147,4 , 3474,55 , 8,5 , 23,6 , 681,10 , 700,5 , 2, 1, 1, 6, 7 }, // Dutch/Latin/Aruba
- { 30, 7, 21, 44, 46, 59, 37, 48, 45, 43, 101, 8216, 8217, 8220, 8221, 0,6 , 0,6 , 6,8 , 6,8 , 538,9 , 97,16 , 37,5 , 8,10 , 5137,59 , 5196,88 , 134,24 , 5137,59 , 5196,88 , 134,24 , 2342,21 , 2363,59 , 2422,14 , 2342,21 , 2363,59 , 2422,14 , 64,4 , 61,4 , 45,4 , 5,17 , 22,23 , {69,85,82}, 14,1 , 3455,19 , 8,5 , 23,6 , 681,10 , 705,6 , 2, 1, 1, 6, 7 }, // Dutch/Latin/Belgium
- { 30, 7, 152, 44, 46, 59, 37, 48, 45, 43, 101, 8216, 8217, 8220, 8221, 0,6 , 0,6 , 6,8 , 6,8 , 528,10 , 97,16 , 37,5 , 8,10 , 5137,59 , 5196,88 , 134,24 , 5137,59 , 5196,88 , 134,24 , 2342,21 , 2363,59 , 2422,14 , 2342,21 , 2363,59 , 2422,14 , 64,4 , 61,4 , 45,4 , 5,17 , 22,23 , {65,78,71}, 151,4 , 3529,97 , 8,5 , 23,6 , 681,10 , 711,7 , 2, 1, 1, 6, 7 }, // Dutch/Latin/Cura Sao
- { 30, 7, 202, 44, 46, 59, 37, 48, 45, 43, 101, 8216, 8217, 8220, 8221, 0,6 , 0,6 , 6,8 , 6,8 , 528,10 , 97,16 , 37,5 , 8,10 , 5137,59 , 5196,88 , 134,24 , 5137,59 , 5196,88 , 134,24 , 2342,21 , 2363,59 , 2422,14 , 2342,21 , 2363,59 , 2422,14 , 64,4 , 61,4 , 45,4 , 5,17 , 22,23 , {83,82,68}, 6,1 , 3626,58 , 8,5 , 23,6 , 681,10 , 718,8 , 2, 1, 1, 6, 7 }, // Dutch/Latin/Suriname
- { 30, 7, 255, 44, 46, 59, 37, 48, 45, 43, 101, 8216, 8217, 8220, 8221, 0,6 , 0,6 , 6,8 , 6,8 , 528,10 , 97,16 , 37,5 , 8,10 , 5137,59 , 5196,88 , 134,24 , 5137,59 , 5196,88 , 134,24 , 2342,21 , 2363,59 , 2422,14 , 2342,21 , 2363,59 , 2422,14 , 64,4 , 61,4 , 45,4 , 5,17 , 22,23 , {85,83,68}, 6,1 , 3684,61 , 8,5 , 23,6 , 681,10 , 726,19 , 2, 1, 1, 6, 7 }, // Dutch/Latin/Bonaire
- { 30, 7, 256, 44, 46, 59, 37, 48, 45, 43, 101, 8216, 8217, 8220, 8221, 0,6 , 0,6 , 6,8 , 6,8 , 528,10 , 97,16 , 37,5 , 8,10 , 5137,59 , 5196,88 , 134,24 , 5137,59 , 5196,88 , 134,24 , 2342,21 , 2363,59 , 2422,14 , 2342,21 , 2363,59 , 2422,14 , 64,4 , 61,4 , 45,4 , 5,17 , 22,23 , {65,78,71}, 151,4 , 3529,97 , 8,5 , 23,6 , 681,10 , 745,12 , 2, 1, 1, 6, 7 }, // Dutch/Latin/Sint Maarten
- { 31, 7, 225, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 200,10 , 210,9 , 547,6 , 35,18 , 18,7 , 25,12 , 0,48 , 48,86 , 134,24 , 0,48 , 48,86 , 134,24 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 0,2 , 0,2 , 0,5 , 5,17 , 22,23 , {85,83,68}, 6,1 , 3745,35 , 4,4 , 4,0 , 757,16 , 773,13 , 2, 1, 7, 6, 7 }, // English/Latin/United States
- { 31, 3, 225, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 53,10 , 63,17 , 37,5 , 8,10 , 368,48 , 368,48 , 158,27 , 368,48 , 368,48 , 158,27 , 0,28 , 0,28 , 85,14 , 0,28 , 0,28 , 85,14 , 0,2 , 0,2 , 45,4 , 5,17 , 22,23 , {85,83,68}, 155,3 , 0,7 , 8,5 , 4,0 , 0,0 , 0,0 , 2, 1, 7, 6, 7 }, // English/Deseret/United States
- { 31, 7, 4, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 200,10 , 210,9 , 547,6 , 35,18 , 18,7 , 25,12 , 0,48 , 48,86 , 134,24 , 0,48 , 48,86 , 134,24 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 0,2 , 0,2 , 0,5 , 5,17 , 22,23 , {85,83,68}, 6,1 , 3745,35 , 4,4 , 4,0 , 786,7 , 793,14 , 2, 1, 7, 6, 7 }, // English/Latin/American Samoa
- { 31, 7, 7, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 200,10 , 210,9 , 119,10 , 10,17 , 37,5 , 8,10 , 0,48 , 48,86 , 134,24 , 0,48 , 48,86 , 134,24 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 68,2 , 65,2 , 0,5 , 5,17 , 22,23 , {88,67,68}, 6,1 , 3780,71 , 4,4 , 4,0 , 786,7 , 807,8 , 2, 1, 1, 6, 7 }, // English/Latin/Anguilla
- { 31, 7, 9, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 200,10 , 210,9 , 119,10 , 10,17 , 18,7 , 25,12 , 0,48 , 48,86 , 134,24 , 0,48 , 48,86 , 134,24 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 68,2 , 65,2 , 0,5 , 5,17 , 22,23 , {88,67,68}, 6,1 , 3780,71 , 4,4 , 4,0 , 786,7 , 815,17 , 2, 1, 7, 6, 7 }, // English/Latin/Antigua And Barbuda
- { 31, 7, 13, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 210,9 , 210,9 , 269,6 , 10,17 , 18,7 , 25,12 , 0,48 , 48,86 , 134,24 , 0,48 , 48,86 , 134,24 , 0,28 , 28,57 , 2436,25 , 0,28 , 28,57 , 2436,25 , 68,2 , 65,2 , 0,5 , 5,17 , 22,23 , {65,85,68}, 6,1 , 3851,59 , 4,4 , 4,0 , 832,18 , 850,9 , 2, 1, 7, 6, 7 }, // English/Latin/Australia
- { 31, 7, 14, 44, 46, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 200,10 , 210,9 , 119,10 , 10,17 , 37,5 , 8,10 , 0,48 , 48,86 , 134,24 , 0,48 , 48,86 , 134,24 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 68,2 , 65,2 , 0,5 , 5,17 , 22,23 , {69,85,82}, 14,1 , 3910,20 , 8,5 , 4,0 , 786,7 , 859,7 , 2, 1, 1, 6, 7 }, // English/Latin/Austria
- { 31, 7, 16, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 200,10 , 210,9 , 119,10 , 10,17 , 18,7 , 25,12 , 0,48 , 48,86 , 134,24 , 0,48 , 48,86 , 134,24 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 68,2 , 65,2 , 0,5 , 5,17 , 22,23 , {66,83,68}, 6,1 , 3930,53 , 4,4 , 4,0 , 786,7 , 866,7 , 2, 1, 7, 6, 7 }, // English/Latin/Bahamas
- { 31, 7, 19, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 200,10 , 210,9 , 119,10 , 10,17 , 18,7 , 25,12 , 0,48 , 48,86 , 134,24 , 0,48 , 48,86 , 134,24 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 68,2 , 65,2 , 0,5 , 5,17 , 22,23 , {66,66,68}, 6,1 , 3983,56 , 4,4 , 4,0 , 786,7 , 873,8 , 2, 1, 1, 6, 7 }, // English/Latin/Barbados
- { 31, 7, 21, 44, 46, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 200,10 , 210,9 , 27,8 , 10,17 , 37,5 , 8,10 , 0,48 , 48,86 , 134,24 , 0,48 , 48,86 , 134,24 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 68,2 , 65,2 , 0,5 , 5,17 , 22,23 , {69,85,82}, 14,1 , 3910,20 , 13,5 , 4,0 , 786,7 , 881,7 , 2, 1, 1, 6, 7 }, // English/Latin/Belgium
- { 31, 7, 22, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 200,10 , 210,9 , 27,8 , 553,18 , 37,5 , 8,10 , 0,48 , 48,86 , 134,24 , 0,48 , 48,86 , 134,24 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 68,2 , 65,2 , 0,5 , 5,17 , 22,23 , {66,90,68}, 6,1 , 4039,47 , 4,4 , 4,0 , 786,7 , 888,6 , 2, 1, 7, 6, 7 }, // English/Latin/Belize
- { 31, 7, 24, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 200,10 , 210,9 , 119,10 , 10,17 , 18,7 , 25,12 , 0,48 , 48,86 , 134,24 , 0,48 , 48,86 , 134,24 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 68,2 , 65,2 , 0,5 , 5,17 , 22,23 , {66,77,68}, 6,1 , 4086,53 , 4,4 , 4,0 , 786,7 , 894,7 , 2, 1, 1, 6, 7 }, // English/Latin/Bermuda
- { 31, 7, 28, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 200,10 , 210,9 , 27,8 , 553,18 , 37,5 , 8,10 , 0,48 , 48,86 , 134,24 , 0,48 , 48,86 , 134,24 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 68,2 , 65,2 , 0,5 , 5,17 , 22,23 , {66,87,80}, 158,1 , 4139,50 , 4,4 , 4,0 , 786,7 , 901,8 , 2, 1, 7, 6, 7 }, // English/Latin/Botswana
- { 31, 7, 31, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 200,10 , 210,9 , 119,10 , 10,17 , 37,5 , 8,10 , 0,48 , 48,86 , 134,24 , 0,48 , 48,86 , 134,24 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 68,2 , 65,2 , 0,5 , 5,17 , 22,23 , {85,83,68}, 155,3 , 3745,35 , 4,4 , 4,0 , 786,7 , 909,30 , 2, 1, 1, 6, 7 }, // English/Latin/British Indian Ocean Territory
- { 31, 7, 35, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 200,10 , 210,9 , 547,6 , 35,18 , 37,5 , 8,10 , 0,48 , 48,86 , 134,24 , 0,48 , 48,86 , 134,24 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 0,2 , 0,2 , 0,5 , 5,17 , 22,23 , {66,73,70}, 159,3 , 4189,53 , 4,4 , 4,0 , 786,7 , 939,7 , 0, 0, 1, 6, 7 }, // English/Latin/Burundi
- { 31, 7, 37, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 200,10 , 210,9 , 119,10 , 10,17 , 37,5 , 8,10 , 0,48 , 48,86 , 134,24 , 0,48 , 48,86 , 134,24 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 68,2 , 65,2 , 0,5 , 5,17 , 22,23 , {88,65,70}, 32,4 , 4242,83 , 4,4 , 4,0 , 786,7 , 946,8 , 0, 0, 1, 6, 7 }, // English/Latin/Cameroon
- { 31, 7, 38, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 200,10 , 210,9 , 53,10 , 35,18 , 18,7 , 25,12 , 5284,59 , 48,86 , 134,24 , 5284,59 , 48,86 , 134,24 , 2461,35 , 28,57 , 85,14 , 2461,35 , 28,57 , 85,14 , 64,4 , 61,4 , 0,5 , 5,17 , 22,23 , {67,65,68}, 6,1 , 4325,53 , 4,4 , 4,0 , 954,16 , 970,6 , 2, 0, 7, 6, 7 }, // English/Latin/Canada
- { 31, 7, 40, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 200,10 , 210,9 , 119,10 , 10,17 , 18,7 , 25,12 , 0,48 , 48,86 , 134,24 , 0,48 , 48,86 , 134,24 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 68,2 , 65,2 , 0,5 , 5,17 , 22,23 , {75,89,68}, 6,1 , 4378,71 , 4,4 , 4,0 , 786,7 , 976,14 , 2, 1, 1, 6, 7 }, // English/Latin/Cayman Islands
- { 31, 7, 45, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 200,10 , 210,9 , 119,10 , 10,17 , 37,5 , 8,10 , 0,48 , 48,86 , 134,24 , 0,48 , 48,86 , 134,24 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 68,2 , 65,2 , 0,5 , 5,17 , 22,23 , {65,85,68}, 6,1 , 3851,59 , 4,4 , 4,0 , 786,7 , 990,16 , 2, 1, 1, 6, 7 }, // English/Latin/Christmas Island
- { 31, 7, 46, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 200,10 , 210,9 , 119,10 , 10,17 , 37,5 , 8,10 , 0,48 , 48,86 , 134,24 , 0,48 , 48,86 , 134,24 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 68,2 , 65,2 , 0,5 , 5,17 , 22,23 , {65,85,68}, 6,1 , 3851,59 , 4,4 , 4,0 , 786,7 , 1006,23 , 2, 1, 1, 6, 7 }, // English/Latin/Cocos Islands
- { 31, 7, 51, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 200,10 , 210,9 , 119,10 , 10,17 , 37,5 , 8,10 , 0,48 , 48,86 , 134,24 , 0,48 , 48,86 , 134,24 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 68,2 , 65,2 , 0,5 , 5,17 , 22,23 , {78,90,68}, 6,1 , 4449,62 , 4,4 , 4,0 , 786,7 , 1029,12 , 2, 1, 1, 6, 7 }, // English/Latin/Cook Islands
- { 31, 7, 56, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 200,10 , 210,9 , 119,10 , 10,17 , 18,7 , 25,12 , 0,48 , 48,86 , 134,24 , 0,48 , 48,86 , 134,24 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 68,2 , 65,2 , 0,5 , 5,17 , 22,23 , {69,85,82}, 14,1 , 3910,20 , 4,4 , 4,0 , 786,7 , 1041,6 , 2, 1, 1, 6, 7 }, // English/Latin/Cyprus
- { 31, 7, 58, 44, 46, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 200,10 , 210,9 , 119,10 , 10,17 , 228,5 , 233,10 , 0,48 , 48,86 , 134,24 , 0,48 , 48,86 , 134,24 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 68,2 , 65,2 , 0,5 , 5,17 , 22,23 , {68,75,75}, 144,3 , 4511,44 , 13,5 , 4,0 , 786,7 , 1047,7 , 2, 0, 1, 6, 7 }, // English/Latin/Denmark
- { 31, 7, 60, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 200,10 , 210,9 , 119,10 , 10,17 , 18,7 , 25,12 , 0,48 , 48,86 , 134,24 , 0,48 , 48,86 , 134,24 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 68,2 , 65,2 , 0,5 , 5,17 , 22,23 , {88,67,68}, 6,1 , 3780,71 , 4,4 , 4,0 , 786,7 , 1054,8 , 2, 1, 7, 6, 7 }, // English/Latin/Dominica
- { 31, 7, 67, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 200,10 , 210,9 , 119,10 , 10,17 , 18,7 , 25,12 , 0,48 , 48,86 , 134,24 , 0,48 , 48,86 , 134,24 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 68,2 , 65,2 , 0,5 , 5,17 , 22,23 , {69,82,78}, 41,3 , 4555,50 , 4,4 , 4,0 , 786,7 , 1062,7 , 2, 1, 1, 6, 7 }, // English/Latin/Eritrea
- { 31, 7, 70, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 200,10 , 210,9 , 119,10 , 10,17 , 37,5 , 8,10 , 0,48 , 48,86 , 134,24 , 0,48 , 48,86 , 134,24 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 68,2 , 65,2 , 0,5 , 5,17 , 22,23 , {70,75,80}, 119,1 , 4605,74 , 4,4 , 4,0 , 786,7 , 1069,16 , 2, 1, 1, 6, 7 }, // English/Latin/Falkland Islands
- { 31, 7, 72, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 200,10 , 210,9 , 119,10 , 10,17 , 18,7 , 25,12 , 0,48 , 48,86 , 134,24 , 0,48 , 48,86 , 134,24 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 68,2 , 65,2 , 0,5 , 5,17 , 22,23 , {70,74,68}, 6,1 , 4679,47 , 4,4 , 4,0 , 786,7 , 1085,4 , 2, 1, 1, 6, 7 }, // English/Latin/Fiji
- { 31, 7, 73, 44, 160, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 200,10 , 210,9 , 119,10 , 10,17 , 243,4 , 247,9 , 0,48 , 48,86 , 134,24 , 0,48 , 48,86 , 134,24 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 68,2 , 65,2 , 0,5 , 5,17 , 22,23 , {69,85,82}, 14,1 , 3910,20 , 13,5 , 4,0 , 786,7 , 1089,7 , 2, 1, 1, 6, 7 }, // English/Latin/Finland
- { 31, 7, 75, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 200,10 , 210,9 , 119,10 , 10,17 , 37,5 , 8,10 , 0,48 , 48,86 , 134,24 , 0,48 , 48,86 , 134,24 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 68,2 , 65,2 , 0,5 , 5,17 , 22,23 , {71,66,80}, 119,1 , 4726,32 , 4,4 , 4,0 , 786,7 , 1096,8 , 2, 1, 1, 6, 7 }, // English/Latin/Guernsey
- { 31, 7, 80, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 200,10 , 210,9 , 119,10 , 10,17 , 18,7 , 25,12 , 0,48 , 48,86 , 134,24 , 0,48 , 48,86 , 134,24 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 68,2 , 65,2 , 0,5 , 5,17 , 22,23 , {71,77,68}, 162,1 , 4758,50 , 4,4 , 4,0 , 786,7 , 1104,6 , 2, 1, 1, 6, 7 }, // English/Latin/Gambia
- { 31, 7, 82, 44, 46, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 200,10 , 210,9 , 119,10 , 10,17 , 37,5 , 8,10 , 0,48 , 48,86 , 134,24 , 0,48 , 48,86 , 134,24 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 68,2 , 65,2 , 0,5 , 5,17 , 22,23 , {69,85,82}, 14,1 , 3910,20 , 13,5 , 4,0 , 786,7 , 1110,7 , 2, 1, 1, 6, 7 }, // English/Latin/Germany
- { 31, 7, 83, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 200,10 , 210,9 , 119,10 , 10,17 , 18,7 , 25,12 , 0,48 , 48,86 , 134,24 , 0,48 , 48,86 , 134,24 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 68,2 , 65,2 , 0,5 , 5,17 , 22,23 , {71,72,83}, 163,3 , 4808,47 , 4,4 , 4,0 , 786,7 , 1117,5 , 2, 1, 1, 6, 7 }, // English/Latin/Ghana
- { 31, 7, 84, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 200,10 , 210,9 , 119,10 , 10,17 , 37,5 , 8,10 , 0,48 , 48,86 , 134,24 , 0,48 , 48,86 , 134,24 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 68,2 , 65,2 , 0,5 , 5,17 , 22,23 , {71,73,80}, 119,1 , 4855,53 , 4,4 , 4,0 , 786,7 , 1122,9 , 2, 1, 1, 6, 7 }, // English/Latin/Gibraltar
- { 31, 7, 87, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 200,10 , 210,9 , 119,10 , 10,17 , 18,7 , 25,12 , 0,48 , 48,86 , 134,24 , 0,48 , 48,86 , 134,24 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 68,2 , 65,2 , 0,5 , 5,17 , 22,23 , {88,67,68}, 6,1 , 3780,71 , 4,4 , 4,0 , 786,7 , 1131,7 , 2, 1, 1, 6, 7 }, // English/Latin/Grenada
- { 31, 7, 89, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 200,10 , 210,9 , 547,6 , 35,18 , 18,7 , 25,12 , 0,48 , 48,86 , 134,24 , 0,48 , 48,86 , 134,24 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 0,2 , 0,2 , 0,5 , 5,17 , 22,23 , {85,83,68}, 6,1 , 3745,35 , 4,4 , 4,0 , 786,7 , 1138,4 , 2, 1, 7, 6, 7 }, // English/Latin/Guam
- { 31, 7, 93, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 200,10 , 210,9 , 119,10 , 10,17 , 18,7 , 25,12 , 0,48 , 48,86 , 134,24 , 0,48 , 48,86 , 134,24 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 68,2 , 65,2 , 0,5 , 5,17 , 22,23 , {71,89,68}, 6,1 , 4908,56 , 4,4 , 4,0 , 786,7 , 1142,6 , 2, 0, 1, 6, 7 }, // English/Latin/Guyana
- { 31, 7, 97, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 200,10 , 210,9 , 415,8 , 10,17 , 18,7 , 25,12 , 0,48 , 48,86 , 134,24 , 0,48 , 48,86 , 134,24 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 68,2 , 65,2 , 0,5 , 5,17 , 22,23 , {72,75,68}, 166,3 , 4964,56 , 4,4 , 4,0 , 786,7 , 1148,19 , 2, 1, 7, 6, 7 }, // English/Latin/Hong Kong
- { 31, 7, 100, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 200,10 , 210,9 , 27,8 , 192,18 , 18,7 , 25,12 , 0,48 , 48,86 , 134,24 , 0,48 , 48,86 , 134,24 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 68,2 , 65,2 , 0,5 , 5,17 , 22,23 , {73,78,82}, 121,1 , 5020,44 , 8,5 , 4,0 , 786,7 , 1167,5 , 2, 1, 7, 7, 7 }, // English/Latin/India
- { 31, 7, 104, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 200,10 , 210,9 , 119,10 , 97,16 , 37,5 , 8,10 , 0,48 , 48,86 , 134,24 , 0,48 , 48,86 , 134,24 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 64,4 , 61,4 , 0,5 , 5,17 , 22,23 , {69,85,82}, 14,1 , 3910,20 , 4,4 , 4,0 , 786,7 , 1172,7 , 2, 1, 1, 6, 7 }, // English/Latin/Ireland
- { 31, 7, 105, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 200,10 , 210,9 , 119,10 , 10,17 , 55,4 , 59,9 , 0,48 , 48,86 , 134,24 , 0,48 , 48,86 , 134,24 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 68,2 , 65,2 , 0,5 , 5,17 , 22,23 , {73,76,83}, 49,1 , 5064,62 , 4,4 , 4,0 , 786,7 , 1179,6 , 2, 1, 7, 5, 6 }, // English/Latin/Israel
- { 31, 7, 107, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 200,10 , 210,9 , 269,6 , 10,17 , 18,7 , 25,12 , 0,48 , 48,86 , 134,24 , 0,48 , 48,86 , 134,24 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 68,2 , 65,2 , 0,5 , 5,17 , 22,23 , {74,77,68}, 6,1 , 5126,53 , 4,4 , 4,0 , 786,7 , 1185,7 , 2, 1, 7, 6, 7 }, // English/Latin/Jamaica
- { 31, 7, 111, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 200,10 , 210,9 , 119,10 , 10,17 , 37,5 , 8,10 , 0,48 , 48,86 , 134,24 , 0,48 , 48,86 , 134,24 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 68,2 , 65,2 , 0,5 , 5,17 , 22,23 , {75,69,83}, 2,3 , 5179,53 , 4,4 , 4,0 , 786,7 , 1192,5 , 2, 1, 7, 6, 7 }, // English/Latin/Kenya
- { 31, 7, 112, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 200,10 , 210,9 , 119,10 , 10,17 , 18,7 , 25,12 , 0,48 , 48,86 , 134,24 , 0,48 , 48,86 , 134,24 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 68,2 , 65,2 , 0,5 , 5,17 , 22,23 , {65,85,68}, 6,1 , 3851,59 , 4,4 , 4,0 , 786,7 , 1197,8 , 2, 1, 1, 6, 7 }, // English/Latin/Kiribati
- { 31, 7, 120, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 200,10 , 210,9 , 119,10 , 10,17 , 18,7 , 25,12 , 0,48 , 48,86 , 134,24 , 0,48 , 48,86 , 134,24 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 68,2 , 65,2 , 0,5 , 5,17 , 22,23 , {90,65,82}, 5,1 , 5232,61 , 4,4 , 4,0 , 786,7 , 1205,7 , 2, 1, 1, 6, 7 }, // English/Latin/Lesotho
- { 31, 7, 121, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 200,10 , 210,9 , 119,10 , 10,17 , 18,7 , 25,12 , 0,48 , 48,86 , 134,24 , 0,48 , 48,86 , 134,24 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 68,2 , 65,2 , 0,5 , 5,17 , 22,23 , {76,82,68}, 6,1 , 5293,53 , 4,4 , 4,0 , 786,7 , 1212,7 , 2, 1, 1, 6, 7 }, // English/Latin/Liberia
- { 31, 7, 126, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 200,10 , 210,9 , 119,10 , 10,17 , 18,7 , 25,12 , 0,48 , 48,86 , 134,24 , 0,48 , 48,86 , 134,24 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 68,2 , 65,2 , 0,5 , 5,17 , 22,23 , {77,79,80}, 134,4 , 5346,53 , 4,4 , 4,0 , 786,7 , 1219,15 , 2, 1, 7, 6, 7 }, // English/Latin/Macau
- { 31, 7, 128, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 200,10 , 210,9 , 119,10 , 10,17 , 37,5 , 8,10 , 0,48 , 48,86 , 134,24 , 0,48 , 48,86 , 134,24 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 68,2 , 65,2 , 0,5 , 5,17 , 22,23 , {77,71,65}, 169,2 , 5399,54 , 4,4 , 4,0 , 786,7 , 1234,10 , 0, 0, 1, 6, 7 }, // English/Latin/Madagascar
- { 31, 7, 129, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 200,10 , 210,9 , 119,10 , 10,17 , 18,7 , 25,12 , 0,48 , 48,86 , 134,24 , 0,48 , 48,86 , 134,24 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 68,2 , 65,2 , 0,5 , 5,17 , 22,23 , {77,87,75}, 171,2 , 5453,53 , 4,4 , 4,0 , 786,7 , 1244,6 , 2, 1, 1, 6, 7 }, // English/Latin/Malawi
- { 31, 7, 130, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 200,10 , 210,9 , 119,10 , 10,17 , 18,7 , 25,12 , 0,48 , 48,86 , 134,24 , 0,48 , 48,86 , 134,24 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 68,2 , 65,2 , 0,5 , 5,17 , 22,23 , {77,89,82}, 173,2 , 5506,59 , 4,4 , 4,0 , 786,7 , 1250,8 , 2, 1, 1, 6, 7 }, // English/Latin/Malaysia
- { 31, 7, 133, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 200,10 , 210,9 , 119,10 , 10,17 , 37,5 , 8,10 , 0,48 , 48,86 , 134,24 , 0,48 , 48,86 , 134,24 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 68,2 , 65,2 , 0,5 , 5,17 , 22,23 , {69,85,82}, 14,1 , 3910,20 , 4,4 , 4,0 , 786,7 , 1258,5 , 2, 1, 7, 6, 7 }, // English/Latin/Malta
- { 31, 7, 134, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 200,10 , 210,9 , 547,6 , 35,18 , 18,7 , 25,12 , 0,48 , 48,86 , 134,24 , 0,48 , 48,86 , 134,24 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 0,2 , 0,2 , 0,5 , 5,17 , 22,23 , {85,83,68}, 6,1 , 3745,35 , 4,4 , 4,0 , 786,7 , 1263,16 , 2, 1, 7, 6, 7 }, // English/Latin/Marshall Islands
- { 31, 7, 137, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 200,10 , 210,9 , 119,10 , 10,17 , 37,5 , 8,10 , 0,48 , 48,86 , 134,24 , 0,48 , 48,86 , 134,24 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 68,2 , 65,2 , 0,5 , 5,17 , 22,23 , {77,85,82}, 175,2 , 5565,53 , 4,4 , 4,0 , 786,7 , 1279,9 , 2, 0, 1, 6, 7 }, // English/Latin/Mauritius
- { 31, 7, 140, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 200,10 , 210,9 , 119,10 , 10,17 , 18,7 , 25,12 , 0,48 , 48,86 , 134,24 , 0,48 , 48,86 , 134,24 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 68,2 , 65,2 , 0,5 , 5,17 , 22,23 , {85,83,68}, 155,3 , 3745,35 , 4,4 , 4,0 , 786,7 , 1288,10 , 2, 1, 1, 6, 7 }, // English/Latin/Micronesia
- { 31, 7, 144, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 200,10 , 210,9 , 119,10 , 10,17 , 37,5 , 8,10 , 0,48 , 48,86 , 134,24 , 0,48 , 48,86 , 134,24 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 68,2 , 65,2 , 0,5 , 5,17 , 22,23 , {88,67,68}, 6,1 , 3780,71 , 4,4 , 4,0 , 786,7 , 1298,10 , 2, 1, 1, 6, 7 }, // English/Latin/Montserrat
- { 31, 7, 148, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 200,10 , 210,9 , 119,10 , 10,17 , 18,7 , 25,12 , 0,48 , 48,86 , 134,24 , 0,48 , 48,86 , 134,24 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 68,2 , 65,2 , 0,5 , 5,17 , 22,23 , {78,65,68}, 6,1 , 5618,53 , 4,4 , 4,0 , 786,7 , 1308,7 , 2, 1, 1, 6, 7 }, // English/Latin/Namibia
- { 31, 7, 149, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 200,10 , 210,9 , 119,10 , 10,17 , 37,5 , 8,10 , 0,48 , 48,86 , 134,24 , 0,48 , 48,86 , 134,24 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 68,2 , 65,2 , 0,5 , 5,17 , 22,23 , {65,85,68}, 6,1 , 3851,59 , 4,4 , 4,0 , 786,7 , 1315,5 , 2, 1, 1, 6, 7 }, // English/Latin/Nauru
- { 31, 7, 151, 44, 46, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 200,10 , 210,9 , 119,10 , 10,17 , 37,5 , 8,10 , 0,48 , 48,86 , 134,24 , 0,48 , 48,86 , 134,24 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 68,2 , 65,2 , 0,5 , 5,17 , 22,23 , {69,85,82}, 14,1 , 3910,20 , 8,5 , 23,6 , 786,7 , 1320,11 , 2, 1, 1, 6, 7 }, // English/Latin/Netherlands
- { 31, 7, 154, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 200,10 , 210,9 , 571,7 , 10,17 , 18,7 , 25,12 , 0,48 , 48,86 , 134,24 , 0,48 , 48,86 , 134,24 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 68,2 , 65,2 , 0,5 , 5,17 , 22,23 , {78,90,68}, 6,1 , 4449,62 , 4,4 , 4,0 , 786,7 , 1331,11 , 2, 1, 1, 6, 7 }, // English/Latin/New Zealand
- { 31, 7, 157, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 200,10 , 210,9 , 119,10 , 10,17 , 37,5 , 8,10 , 0,48 , 48,86 , 134,24 , 0,48 , 48,86 , 134,24 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 68,2 , 65,2 , 0,5 , 5,17 , 22,23 , {78,71,78}, 177,1 , 5671,50 , 4,4 , 4,0 , 786,7 , 1342,7 , 2, 1, 1, 6, 7 }, // English/Latin/Nigeria
- { 31, 7, 158, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 200,10 , 210,9 , 119,10 , 10,17 , 37,5 , 8,10 , 0,48 , 48,86 , 134,24 , 0,48 , 48,86 , 134,24 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 68,2 , 65,2 , 0,5 , 5,17 , 22,23 , {78,90,68}, 6,1 , 4449,62 , 4,4 , 4,0 , 786,7 , 1349,4 , 2, 1, 1, 6, 7 }, // English/Latin/Niue
- { 31, 7, 159, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 200,10 , 210,9 , 119,10 , 10,17 , 37,5 , 8,10 , 0,48 , 48,86 , 134,24 , 0,48 , 48,86 , 134,24 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 68,2 , 65,2 , 0,5 , 5,17 , 22,23 , {65,85,68}, 6,1 , 3851,59 , 4,4 , 4,0 , 786,7 , 1353,14 , 2, 1, 1, 6, 7 }, // English/Latin/Norfolk Island
- { 31, 7, 160, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 200,10 , 210,9 , 547,6 , 35,18 , 18,7 , 25,12 , 0,48 , 48,86 , 134,24 , 0,48 , 48,86 , 134,24 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 0,2 , 0,2 , 0,5 , 5,17 , 22,23 , {85,83,68}, 6,1 , 3745,35 , 4,4 , 4,0 , 786,7 , 1367,24 , 2, 1, 1, 6, 7 }, // English/Latin/Northern Mariana Islands
- { 31, 7, 163, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 200,10 , 210,9 , 119,10 , 10,17 , 18,7 , 25,12 , 0,48 , 48,86 , 134,24 , 0,48 , 48,86 , 134,24 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 68,2 , 65,2 , 0,5 , 5,17 , 22,23 , {80,75,82}, 175,2 , 5721,53 , 4,4 , 4,0 , 786,7 , 1391,8 , 2, 0, 7, 6, 7 }, // English/Latin/Pakistan
- { 31, 7, 164, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 200,10 , 210,9 , 119,10 , 10,17 , 18,7 , 25,12 , 0,48 , 48,86 , 134,24 , 0,48 , 48,86 , 134,24 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 68,2 , 65,2 , 0,5 , 5,17 , 22,23 , {85,83,68}, 155,3 , 3745,35 , 4,4 , 4,0 , 786,7 , 1399,5 , 2, 1, 1, 6, 7 }, // English/Latin/Palau
- { 31, 7, 167, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 200,10 , 210,9 , 119,10 , 10,17 , 18,7 , 25,12 , 0,48 , 48,86 , 134,24 , 0,48 , 48,86 , 134,24 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 68,2 , 65,2 , 0,5 , 5,17 , 22,23 , {80,71,75}, 131,1 , 5774,73 , 4,4 , 4,0 , 786,7 , 1404,16 , 2, 1, 1, 6, 7 }, // English/Latin/Papua New Guinea
- { 31, 7, 170, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 200,10 , 210,9 , 119,10 , 10,17 , 18,7 , 25,12 , 0,48 , 48,86 , 134,24 , 0,48 , 48,86 , 134,24 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 68,2 , 65,2 , 0,5 , 5,17 , 22,23 , {80,72,80}, 178,1 , 5847,53 , 4,4 , 4,0 , 786,7 , 1420,11 , 2, 1, 7, 6, 7 }, // English/Latin/Philippines
- { 31, 7, 171, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 200,10 , 210,9 , 119,10 , 10,17 , 37,5 , 8,10 , 0,48 , 48,86 , 134,24 , 0,48 , 48,86 , 134,24 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 68,2 , 65,2 , 0,5 , 5,17 , 22,23 , {78,90,68}, 6,1 , 4449,62 , 4,4 , 4,0 , 786,7 , 1431,16 , 2, 1, 1, 6, 7 }, // English/Latin/Pitcairn
- { 31, 7, 174, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 200,10 , 210,9 , 547,6 , 35,18 , 18,7 , 25,12 , 0,48 , 48,86 , 134,24 , 0,48 , 48,86 , 134,24 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 0,2 , 0,2 , 0,5 , 5,17 , 22,23 , {85,83,68}, 6,1 , 3745,35 , 4,4 , 4,0 , 786,7 , 1447,11 , 2, 1, 7, 6, 7 }, // English/Latin/Puerto Rico
- { 31, 7, 179, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 200,10 , 210,9 , 119,10 , 10,17 , 37,5 , 8,10 , 0,48 , 48,86 , 134,24 , 0,48 , 48,86 , 134,24 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 68,2 , 65,2 , 0,5 , 5,17 , 22,23 , {82,87,70}, 179,2 , 5900,47 , 4,4 , 4,0 , 786,7 , 1458,6 , 0, 0, 1, 6, 7 }, // English/Latin/Rwanda
- { 31, 7, 180, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 200,10 , 210,9 , 119,10 , 10,17 , 18,7 , 25,12 , 0,48 , 48,86 , 134,24 , 0,48 , 48,86 , 134,24 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 68,2 , 65,2 , 0,5 , 5,17 , 22,23 , {88,67,68}, 6,1 , 3780,71 , 4,4 , 4,0 , 786,7 , 1464,17 , 2, 1, 1, 6, 7 }, // English/Latin/Saint Kitts And Nevis
- { 31, 7, 181, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 200,10 , 210,9 , 119,10 , 10,17 , 18,7 , 25,12 , 0,48 , 48,86 , 134,24 , 0,48 , 48,86 , 134,24 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 68,2 , 65,2 , 0,5 , 5,17 , 22,23 , {88,67,68}, 6,1 , 3780,71 , 4,4 , 4,0 , 786,7 , 1481,9 , 2, 1, 1, 6, 7 }, // English/Latin/Saint Lucia
- { 31, 7, 182, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 200,10 , 210,9 , 119,10 , 10,17 , 18,7 , 25,12 , 0,48 , 48,86 , 134,24 , 0,48 , 48,86 , 134,24 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 68,2 , 65,2 , 0,5 , 5,17 , 22,23 , {88,67,68}, 6,1 , 3780,71 , 4,4 , 4,0 , 786,7 , 1490,24 , 2, 1, 1, 6, 7 }, // English/Latin/Saint Vincent And The Grenadines
- { 31, 7, 183, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 200,10 , 210,9 , 119,10 , 10,17 , 18,7 , 25,12 , 0,48 , 48,86 , 134,24 , 0,48 , 48,86 , 134,24 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 68,2 , 65,2 , 0,5 , 5,17 , 22,23 , {87,83,84}, 181,3 , 5947,40 , 4,4 , 4,0 , 786,7 , 1514,5 , 2, 1, 7, 6, 7 }, // English/Latin/Samoa
- { 31, 7, 188, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 200,10 , 210,9 , 119,10 , 10,17 , 37,5 , 8,10 , 0,48 , 48,86 , 134,24 , 0,48 , 48,86 , 134,24 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 68,2 , 65,2 , 0,5 , 5,17 , 22,23 , {83,67,82}, 184,2 , 5987,59 , 4,4 , 4,0 , 786,7 , 1519,10 , 2, 1, 1, 6, 7 }, // English/Latin/Seychelles
- { 31, 7, 189, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 200,10 , 210,9 , 119,10 , 10,17 , 18,7 , 25,12 , 0,48 , 48,86 , 134,24 , 0,48 , 48,86 , 134,24 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 68,2 , 65,2 , 0,5 , 5,17 , 22,23 , {83,76,76}, 186,2 , 6046,68 , 4,4 , 4,0 , 786,7 , 1529,12 , 0, 0, 1, 6, 7 }, // English/Latin/Sierra Leone
- { 31, 7, 190, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 200,10 , 210,9 , 269,6 , 10,17 , 18,7 , 25,12 , 0,48 , 48,86 , 134,24 , 0,48 , 48,86 , 134,24 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 68,2 , 65,2 , 0,5 , 5,17 , 22,23 , {83,71,68}, 6,1 , 6114,56 , 4,4 , 4,0 , 786,7 , 1541,9 , 2, 1, 7, 6, 7 }, // English/Latin/Singapore
- { 31, 7, 192, 44, 46, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 200,10 , 210,9 , 119,10 , 10,17 , 37,5 , 8,10 , 0,48 , 48,86 , 134,24 , 0,48 , 48,86 , 134,24 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 68,2 , 65,2 , 0,5 , 5,17 , 22,23 , {69,85,82}, 14,1 , 3910,20 , 13,5 , 29,7 , 786,7 , 1550,8 , 2, 1, 1, 6, 7 }, // English/Latin/Slovenia
- { 31, 7, 193, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 200,10 , 210,9 , 119,10 , 10,17 , 18,7 , 25,12 , 0,48 , 48,86 , 134,24 , 0,48 , 48,86 , 134,24 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 68,2 , 65,2 , 0,5 , 5,17 , 22,23 , {83,66,68}, 6,1 , 6170,74 , 4,4 , 4,0 , 786,7 , 1558,15 , 2, 1, 1, 6, 7 }, // English/Latin/Solomon Islands
- { 31, 7, 195, 44, 160, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 200,10 , 210,9 , 578,10 , 553,18 , 37,5 , 8,10 , 0,48 , 48,86 , 134,24 , 0,48 , 48,86 , 134,24 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 68,2 , 65,2 , 0,5 , 5,17 , 22,23 , {90,65,82}, 5,1 , 5232,61 , 4,4 , 4,0 , 786,7 , 1573,12 , 2, 1, 7, 6, 7 }, // English/Latin/South Africa
- { 31, 7, 199, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 200,10 , 210,9 , 119,10 , 10,17 , 37,5 , 8,10 , 0,48 , 48,86 , 134,24 , 0,48 , 48,86 , 134,24 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 68,2 , 65,2 , 0,5 , 5,17 , 22,23 , {83,72,80}, 119,1 , 6244,56 , 4,4 , 4,0 , 786,7 , 1585,10 , 2, 1, 1, 6, 7 }, // English/Latin/Saint Helena
- { 31, 7, 201, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 200,10 , 210,9 , 119,10 , 10,17 , 18,7 , 25,12 , 0,48 , 48,86 , 134,24 , 0,48 , 48,86 , 134,24 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 68,2 , 65,2 , 0,5 , 5,17 , 22,23 , {83,68,71}, 0,0 , 6300,50 , 4,4 , 4,0 , 786,7 , 1595,5 , 2, 1, 6, 5, 6 }, // English/Latin/Sudan
- { 31, 7, 204, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 200,10 , 210,9 , 119,10 , 10,17 , 18,7 , 25,12 , 0,48 , 48,86 , 134,24 , 0,48 , 48,86 , 134,24 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 68,2 , 65,2 , 0,5 , 5,17 , 22,23 , {83,90,76}, 188,1 , 6350,53 , 4,4 , 4,0 , 786,7 , 1600,8 , 2, 1, 1, 6, 7 }, // English/Latin/Swaziland
- { 31, 7, 205, 44, 160, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 200,10 , 210,9 , 53,10 , 10,17 , 37,5 , 8,10 , 0,48 , 48,86 , 134,24 , 0,48 , 48,86 , 134,24 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 68,2 , 65,2 , 0,5 , 5,17 , 22,23 , {83,69,75}, 189,2 , 6403,47 , 13,5 , 4,0 , 786,7 , 1608,6 , 2, 0, 1, 6, 7 }, // English/Latin/Sweden
- { 31, 7, 206, 46, 8217, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 200,10 , 210,9 , 119,10 , 10,17 , 37,5 , 8,10 , 0,48 , 48,86 , 134,24 , 0,48 , 48,86 , 134,24 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 68,2 , 65,2 , 0,5 , 5,17 , 22,23 , {67,72,70}, 0,0 , 6450,41 , 8,5 , 36,5 , 786,7 , 1614,11 , 2, 0, 1, 6, 7 }, // English/Latin/Switzerland
- { 31, 7, 210, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 200,10 , 210,9 , 119,10 , 10,17 , 37,5 , 8,10 , 0,48 , 48,86 , 134,24 , 0,48 , 48,86 , 134,24 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 68,2 , 65,2 , 0,5 , 5,17 , 22,23 , {84,90,83}, 191,3 , 6491,62 , 4,4 , 4,0 , 786,7 , 1625,8 , 2, 0, 1, 6, 7 }, // English/Latin/Tanzania
- { 31, 7, 213, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 200,10 , 210,9 , 119,10 , 10,17 , 37,5 , 8,10 , 0,48 , 48,86 , 134,24 , 0,48 , 48,86 , 134,24 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 68,2 , 65,2 , 0,5 , 5,17 , 22,23 , {78,90,68}, 6,1 , 4449,62 , 4,4 , 4,0 , 786,7 , 1633,7 , 2, 1, 1, 6, 7 }, // English/Latin/Tokelau
- { 31, 7, 214, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 200,10 , 210,9 , 119,10 , 10,17 , 18,7 , 25,12 , 0,48 , 48,86 , 134,24 , 0,48 , 48,86 , 134,24 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 68,2 , 65,2 , 0,5 , 5,17 , 22,23 , {84,79,80}, 194,2 , 6553,49 , 4,4 , 4,0 , 786,7 , 1640,5 , 2, 1, 1, 6, 7 }, // English/Latin/Tonga
- { 31, 7, 215, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 200,10 , 210,9 , 119,10 , 10,17 , 18,7 , 25,12 , 0,48 , 48,86 , 134,24 , 0,48 , 48,86 , 134,24 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 68,2 , 65,2 , 0,5 , 5,17 , 22,23 , {84,84,68}, 6,1 , 6602,80 , 4,4 , 4,0 , 786,7 , 1645,17 , 2, 1, 7, 6, 7 }, // English/Latin/Trinidad And Tobago
- { 31, 7, 219, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 200,10 , 210,9 , 119,10 , 10,17 , 18,7 , 25,12 , 0,48 , 48,86 , 134,24 , 0,48 , 48,86 , 134,24 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 68,2 , 65,2 , 0,5 , 5,17 , 22,23 , {85,83,68}, 155,3 , 3745,35 , 4,4 , 4,0 , 786,7 , 1662,22 , 2, 1, 1, 6, 7 }, // English/Latin/Turks And Caicos Islands
- { 31, 7, 220, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 200,10 , 210,9 , 119,10 , 10,17 , 37,5 , 8,10 , 0,48 , 48,86 , 134,24 , 0,48 , 48,86 , 134,24 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 68,2 , 65,2 , 0,5 , 5,17 , 22,23 , {65,85,68}, 6,1 , 3851,59 , 4,4 , 4,0 , 786,7 , 1684,6 , 2, 1, 1, 6, 7 }, // English/Latin/Tuvalu
- { 31, 7, 221, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 200,10 , 210,9 , 119,10 , 10,17 , 37,5 , 8,10 , 0,48 , 48,86 , 134,24 , 0,48 , 48,86 , 134,24 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 68,2 , 65,2 , 0,5 , 5,17 , 22,23 , {85,71,88}, 196,3 , 6682,56 , 4,4 , 4,0 , 786,7 , 1690,6 , 0, 0, 1, 6, 7 }, // English/Latin/Uganda
- { 31, 7, 223, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 200,10 , 210,9 , 119,10 , 10,17 , 18,7 , 25,12 , 0,48 , 48,86 , 134,24 , 0,48 , 48,86 , 134,24 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 0,2 , 0,2 , 0,5 , 5,17 , 22,23 , {65,69,68}, 199,3 , 6738,55 , 4,4 , 4,0 , 786,7 , 1696,20 , 2, 1, 6, 5, 6 }, // English/Latin/United Arab Emirates
- { 31, 7, 224, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 210,9 , 210,9 , 119,10 , 10,17 , 37,5 , 8,10 , 0,48 , 48,86 , 134,24 , 0,48 , 48,86 , 134,24 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 68,2 , 65,2 , 0,5 , 5,17 , 22,23 , {71,66,80}, 119,1 , 6793,47 , 4,4 , 4,0 , 1716,15 , 1731,14 , 2, 1, 1, 6, 7 }, // English/Latin/United Kingdom
- { 31, 7, 226, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 200,10 , 210,9 , 547,6 , 35,18 , 18,7 , 25,12 , 0,48 , 48,86 , 134,24 , 0,48 , 48,86 , 134,24 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 0,2 , 0,2 , 0,5 , 5,17 , 22,23 , {85,83,68}, 6,1 , 3745,35 , 4,4 , 4,0 , 786,7 , 1745,21 , 2, 1, 7, 6, 7 }, // English/Latin/United States Minor Outlying Islands
- { 31, 7, 229, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 200,10 , 210,9 , 119,10 , 10,17 , 18,7 , 25,12 , 0,48 , 48,86 , 134,24 , 0,48 , 48,86 , 134,24 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 68,2 , 65,2 , 0,5 , 5,17 , 22,23 , {86,85,86}, 202,2 , 6840,44 , 4,4 , 4,0 , 786,7 , 1766,7 , 0, 0, 1, 6, 7 }, // English/Latin/Vanuatu
- { 31, 7, 233, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 200,10 , 210,9 , 119,10 , 10,17 , 18,7 , 25,12 , 0,48 , 48,86 , 134,24 , 0,48 , 48,86 , 134,24 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 68,2 , 65,2 , 0,5 , 5,17 , 22,23 , {85,83,68}, 155,3 , 3745,35 , 4,4 , 4,0 , 786,7 , 1773,22 , 2, 1, 1, 6, 7 }, // English/Latin/British Virgin Islands
- { 31, 7, 234, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 200,10 , 210,9 , 547,6 , 35,18 , 18,7 , 25,12 , 0,48 , 48,86 , 134,24 , 0,48 , 48,86 , 134,24 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 0,2 , 0,2 , 0,5 , 5,17 , 22,23 , {85,83,68}, 6,1 , 3745,35 , 4,4 , 4,0 , 786,7 , 1795,19 , 2, 1, 7, 6, 7 }, // English/Latin/United States Virgin Islands
- { 31, 7, 239, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 200,10 , 210,9 , 119,10 , 10,17 , 18,7 , 25,12 , 0,48 , 48,86 , 134,24 , 0,48 , 48,86 , 134,24 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 68,2 , 65,2 , 0,5 , 5,17 , 22,23 , {90,77,87}, 131,1 , 6884,50 , 4,4 , 4,0 , 786,7 , 1814,6 , 2, 1, 1, 6, 7 }, // English/Latin/Zambia
- { 31, 7, 240, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 200,10 , 210,9 , 415,8 , 553,18 , 37,5 , 8,10 , 0,48 , 48,86 , 134,24 , 0,48 , 48,86 , 134,24 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 68,2 , 65,2 , 0,5 , 5,17 , 22,23 , {85,83,68}, 155,3 , 3745,35 , 4,4 , 4,0 , 786,7 , 1820,8 , 2, 1, 7, 6, 7 }, // English/Latin/Zimbabwe
- { 31, 7, 249, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 200,10 , 210,9 , 119,10 , 10,17 , 37,5 , 8,10 , 0,48 , 48,86 , 134,24 , 0,48 , 48,86 , 134,24 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 68,2 , 65,2 , 0,5 , 5,17 , 22,23 , {85,83,68}, 155,3 , 3745,35 , 4,4 , 4,0 , 786,7 , 1828,12 , 2, 1, 1, 6, 7 }, // English/Latin/Diego Garcia
- { 31, 7, 251, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 200,10 , 210,9 , 119,10 , 10,17 , 37,5 , 8,10 , 0,48 , 48,86 , 134,24 , 0,48 , 48,86 , 134,24 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 68,2 , 65,2 , 0,5 , 5,17 , 22,23 , {71,66,80}, 119,1 , 4726,32 , 4,4 , 4,0 , 786,7 , 1840,11 , 2, 1, 1, 6, 7 }, // English/Latin/Isle Of Man
- { 31, 7, 252, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 200,10 , 210,9 , 119,10 , 10,17 , 37,5 , 8,10 , 0,48 , 48,86 , 134,24 , 0,48 , 48,86 , 134,24 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 68,2 , 65,2 , 0,5 , 5,17 , 22,23 , {71,66,80}, 119,1 , 4726,32 , 4,4 , 4,0 , 786,7 , 1851,6 , 2, 1, 1, 6, 7 }, // English/Latin/Jersey
- { 31, 7, 254, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 200,10 , 210,9 , 119,10 , 10,17 , 18,7 , 25,12 , 0,48 , 48,86 , 134,24 , 0,48 , 48,86 , 134,24 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 68,2 , 65,2 , 0,5 , 5,17 , 22,23 , {83,83,80}, 119,1 , 6934,68 , 4,4 , 4,0 , 786,7 , 1857,11 , 2, 1, 1, 6, 7 }, // English/Latin/South Sudan
- { 31, 7, 256, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 200,10 , 210,9 , 119,10 , 10,17 , 37,5 , 8,10 , 0,48 , 48,86 , 134,24 , 0,48 , 48,86 , 134,24 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 68,2 , 65,2 , 0,5 , 5,17 , 22,23 , {65,78,71}, 151,4 , 7002,95 , 4,4 , 4,0 , 786,7 , 1868,12 , 2, 1, 1, 6, 7 }, // English/Latin/Sint Maarten
- { 31, 7, 260, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 200,10 , 210,9 , 119,10 , 10,17 , 18,7 , 25,12 , 0,48 , 48,86 , 134,24 , 0,48 , 48,86 , 134,24 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 68,2 , 65,2 , 0,5 , 5,17 , 22,23 , {0,0,0}, 0,0 , 2586,0 , 4,4 , 4,0 , 786,7 , 1880,5 , 2, 1, 1, 6, 7 }, // English/Latin/World
- { 31, 7, 261, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 200,10 , 210,9 , 119,10 , 10,17 , 37,5 , 8,10 , 0,48 , 48,86 , 134,24 , 0,48 , 48,86 , 134,24 , 0,28 , 28,57 , 85,14 , 0,28 , 28,57 , 85,14 , 68,2 , 65,2 , 0,5 , 5,17 , 22,23 , {0,0,0}, 0,0 , 2586,0 , 13,5 , 4,0 , 786,7 , 1885,6 , 2, 1, 1, 6, 7 }, // English/Latin/Europe
- { 32, 7, 260, 44, 160, 59, 37, 48, 8722, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 219,9 , 219,9 , 588,8 , 596,26 , 37,5 , 256,25 , 5343,48 , 5391,91 , 134,24 , 5343,48 , 5391,91 , 134,24 , 2496,21 , 2517,51 , 2568,14 , 2496,21 , 2517,51 , 2568,14 , 70,3 , 67,3 , 308,6 , 5,17 , 22,23 , {0,0,0}, 0,0 , 2586,0 , 41,6 , 4,0 , 1891,9 , 1900,5 , 2, 1, 1, 6, 7 }, // Esperanto/Latin/World
- { 33, 7, 68, 44, 160, 59, 37, 48, 8722, 43, 101, 8222, 8220, 8218, 8216, 0,6 , 0,6 , 228,8 , 228,8 , 156,8 , 622,18 , 37,5 , 8,10 , 5482,59 , 5541,91 , 5632,24 , 5482,59 , 5541,91 , 5632,24 , 2582,14 , 2596,63 , 2582,14 , 2582,14 , 2596,63 , 2582,14 , 0,2 , 0,2 , 314,6 , 5,17 , 22,23 , {69,85,82}, 14,1 , 7097,20 , 13,5 , 4,0 , 1905,5 , 1910,5 , 2, 1, 1, 6, 7 }, // Estonian/Latin/Estonia
- { 34, 7, 71, 44, 46, 59, 37, 48, 8722, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 192,8 , 192,8 , 156,8 , 622,18 , 37,5 , 8,10 , 5656,48 , 5704,83 , 134,24 , 5787,59 , 5704,83 , 134,24 , 2659,28 , 2687,74 , 2761,14 , 2775,35 , 2687,74 , 2761,14 , 0,2 , 0,2 , 320,3 , 5,17 , 22,23 , {68,75,75}, 189,2 , 7117,43 , 13,5 , 4,0 , 1915,8 , 1923,7 , 2, 0, 1, 6, 7 }, // Faroese/Latin/Faroe Islands
- { 34, 7, 58, 44, 46, 59, 37, 48, 8722, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 192,8 , 192,8 , 156,8 , 622,18 , 37,5 , 8,10 , 5656,48 , 5704,83 , 134,24 , 5787,59 , 5704,83 , 134,24 , 2659,28 , 2687,74 , 2761,14 , 2775,35 , 2687,74 , 2761,14 , 0,2 , 0,2 , 320,3 , 5,17 , 22,23 , {68,75,75}, 144,3 , 7117,43 , 13,5 , 4,0 , 1915,8 , 666,7 , 2, 0, 1, 6, 7 }, // Faroese/Latin/Denmark
- { 36, 7, 73, 44, 160, 59, 37, 48, 8722, 43, 101, 8221, 8221, 8217, 8217, 0,6 , 0,6 , 228,8 , 228,8 , 640,8 , 478,17 , 243,4 , 247,9 , 5846,69 , 5915,105 , 6020,24 , 6044,93 , 6137,129 , 6020,24 , 2810,21 , 2831,67 , 2898,14 , 2810,21 , 2912,81 , 2898,14 , 73,3 , 70,3 , 323,5 , 328,17 , 345,23 , {69,85,82}, 14,1 , 7160,20 , 13,5 , 4,0 , 1930,5 , 1935,5 , 2, 1, 1, 6, 7 }, // Finnish/Latin/Finland
- { 37, 7, 74, 44, 8239, 59, 37, 48, 45, 43, 101, 171, 187, 171, 187, 0,6 , 0,6 , 236,8 , 236,8 , 119,10 , 97,16 , 37,5 , 8,10 , 6266,63 , 6329,85 , 134,24 , 6266,63 , 6329,85 , 134,24 , 2993,35 , 3028,52 , 3080,14 , 2993,35 , 3028,52 , 3080,14 , 0,2 , 0,2 , 368,6 , 374,17 , 391,23 , {69,85,82}, 14,1 , 3102,20 , 13,5 , 4,0 , 1940,8 , 1948,6 , 2, 1, 1, 6, 7 }, // French/Latin/France
- { 37, 7, 3, 44, 8239, 59, 37, 48, 45, 43, 101, 171, 187, 171, 187, 0,6 , 0,6 , 236,8 , 236,8 , 119,10 , 97,16 , 18,7 , 25,12 , 6266,63 , 6329,85 , 134,24 , 6266,63 , 6329,85 , 134,24 , 2993,35 , 3028,52 , 3080,14 , 2993,35 , 3028,52 , 3080,14 , 0,2 , 0,2 , 368,6 , 374,17 , 391,23 , {68,90,68}, 204,2 , 7180,51 , 13,5 , 4,0 , 1940,8 , 1954,7 , 2, 1, 6, 5, 6 }, // French/Latin/Algeria
- { 37, 7, 21, 44, 8239, 59, 37, 48, 45, 43, 101, 171, 187, 171, 187, 0,6 , 0,6 , 236,8 , 236,8 , 571,7 , 97,16 , 37,5 , 281,23 , 6266,63 , 6329,85 , 134,24 , 6266,63 , 6329,85 , 134,24 , 2993,35 , 3028,52 , 3080,14 , 2993,35 , 3028,52 , 3080,14 , 0,2 , 0,2 , 368,6 , 374,17 , 391,23 , {69,85,82}, 14,1 , 3102,20 , 13,5 , 4,0 , 1940,8 , 1961,8 , 2, 1, 1, 6, 7 }, // French/Latin/Belgium
- { 37, 7, 23, 44, 8239, 59, 37, 48, 45, 43, 101, 171, 187, 171, 187, 0,6 , 0,6 , 236,8 , 236,8 , 119,10 , 97,16 , 37,5 , 8,10 , 6266,63 , 6329,85 , 134,24 , 6266,63 , 6329,85 , 134,24 , 2993,35 , 3028,52 , 3080,14 , 2993,35 , 3028,52 , 3080,14 , 0,2 , 0,2 , 368,6 , 374,17 , 391,23 , {88,79,70}, 206,3 , 7231,59 , 13,5 , 4,0 , 1940,8 , 1969,5 , 0, 0, 1, 6, 7 }, // French/Latin/Benin
- { 37, 7, 34, 44, 8239, 59, 37, 48, 45, 43, 101, 171, 187, 171, 187, 0,6 , 0,6 , 236,8 , 236,8 , 119,10 , 97,16 , 37,5 , 8,10 , 6266,63 , 6329,85 , 134,24 , 6266,63 , 6329,85 , 134,24 , 2993,35 , 3028,52 , 3080,14 , 2993,35 , 3028,52 , 3080,14 , 0,2 , 0,2 , 368,6 , 374,17 , 391,23 , {88,79,70}, 206,3 , 7231,59 , 13,5 , 4,0 , 1940,8 , 1974,12 , 0, 0, 1, 6, 7 }, // French/Latin/Burkina Faso
- { 37, 7, 35, 44, 8239, 59, 37, 48, 45, 43, 101, 171, 187, 171, 187, 0,6 , 0,6 , 236,8 , 236,8 , 119,10 , 97,16 , 37,5 , 8,10 , 6266,63 , 6329,85 , 134,24 , 6266,63 , 6329,85 , 134,24 , 2993,35 , 3028,52 , 3080,14 , 2993,35 , 3028,52 , 3080,14 , 0,2 , 0,2 , 368,6 , 374,17 , 391,23 , {66,73,70}, 159,3 , 7290,53 , 13,5 , 4,0 , 1940,8 , 939,7 , 0, 0, 1, 6, 7 }, // French/Latin/Burundi
- { 37, 7, 37, 44, 8239, 59, 37, 48, 45, 43, 101, 171, 187, 171, 187, 0,6 , 0,6 , 236,8 , 236,8 , 119,10 , 97,16 , 37,5 , 8,10 , 6266,63 , 6329,85 , 134,24 , 6266,63 , 6329,85 , 134,24 , 2993,35 , 3028,52 , 3080,14 , 2993,35 , 3028,52 , 3080,14 , 76,5 , 73,4 , 368,6 , 374,17 , 391,23 , {88,65,70}, 32,4 , 7343,56 , 13,5 , 4,0 , 1940,8 , 1986,8 , 0, 0, 1, 6, 7 }, // French/Latin/Cameroon
- { 37, 7, 38, 44, 160, 59, 37, 48, 45, 43, 101, 171, 187, 8221, 8220, 0,6 , 0,6 , 236,8 , 236,8 , 588,8 , 97,16 , 304,9 , 313,24 , 6414,64 , 6329,85 , 134,24 , 6414,64 , 6329,85 , 134,24 , 2993,35 , 3028,52 , 3080,14 , 2993,35 , 3028,52 , 3080,14 , 64,4 , 61,4 , 368,6 , 374,17 , 391,23 , {67,65,68}, 6,1 , 7399,54 , 47,6 , 4,0 , 1994,17 , 970,6 , 2, 0, 7, 6, 7 }, // French/Latin/Canada
- { 37, 7, 41, 44, 8239, 59, 37, 48, 45, 43, 101, 171, 187, 171, 187, 0,6 , 0,6 , 236,8 , 236,8 , 119,10 , 97,16 , 37,5 , 8,10 , 6266,63 , 6329,85 , 134,24 , 6266,63 , 6329,85 , 134,24 , 2993,35 , 3028,52 , 3080,14 , 2993,35 , 3028,52 , 3080,14 , 0,2 , 0,2 , 368,6 , 374,17 , 391,23 , {88,65,70}, 32,4 , 7343,56 , 13,5 , 4,0 , 1940,8 , 2011,25 , 0, 0, 1, 6, 7 }, // French/Latin/Central African Republic
- { 37, 7, 42, 44, 8239, 59, 37, 48, 45, 43, 101, 171, 187, 171, 187, 0,6 , 0,6 , 236,8 , 236,8 , 119,10 , 97,16 , 18,7 , 25,12 , 6266,63 , 6329,85 , 134,24 , 6266,63 , 6329,85 , 134,24 , 2993,35 , 3028,52 , 3080,14 , 2993,35 , 3028,52 , 3080,14 , 0,2 , 0,2 , 368,6 , 374,17 , 391,23 , {88,65,70}, 32,4 , 7343,56 , 13,5 , 4,0 , 1940,8 , 2036,5 , 0, 0, 1, 6, 7 }, // French/Latin/Chad
- { 37, 7, 48, 44, 8239, 59, 37, 48, 45, 43, 101, 171, 187, 171, 187, 0,6 , 0,6 , 236,8 , 236,8 , 119,10 , 97,16 , 37,5 , 8,10 , 6266,63 , 6329,85 , 134,24 , 6266,63 , 6329,85 , 134,24 , 2993,35 , 3028,52 , 3080,14 , 2993,35 , 3028,52 , 3080,14 , 0,2 , 0,2 , 368,6 , 374,17 , 391,23 , {75,77,70}, 36,2 , 7453,51 , 13,5 , 4,0 , 1940,8 , 2041,7 , 0, 0, 1, 6, 7 }, // French/Latin/Comoros
- { 37, 7, 49, 44, 8239, 59, 37, 48, 45, 43, 101, 171, 187, 171, 187, 0,6 , 0,6 , 236,8 , 236,8 , 119,10 , 97,16 , 37,5 , 8,10 , 6266,63 , 6329,85 , 134,24 , 6266,63 , 6329,85 , 134,24 , 2993,35 , 3028,52 , 3080,14 , 2993,35 , 3028,52 , 3080,14 , 0,2 , 0,2 , 368,6 , 374,17 , 391,23 , {67,68,70}, 209,2 , 7504,53 , 13,5 , 4,0 , 1940,8 , 2048,14 , 2, 1, 1, 6, 7 }, // French/Latin/Congo Kinshasa
- { 37, 7, 50, 44, 8239, 59, 37, 48, 45, 43, 101, 171, 187, 171, 187, 0,6 , 0,6 , 236,8 , 236,8 , 119,10 , 97,16 , 37,5 , 8,10 , 6266,63 , 6329,85 , 134,24 , 6266,63 , 6329,85 , 134,24 , 2993,35 , 3028,52 , 3080,14 , 2993,35 , 3028,52 , 3080,14 , 0,2 , 0,2 , 368,6 , 374,17 , 391,23 , {88,65,70}, 32,4 , 7343,56 , 13,5 , 4,0 , 1940,8 , 2062,17 , 0, 0, 1, 6, 7 }, // French/Latin/Congo Brazzaville
- { 37, 7, 53, 44, 8239, 59, 37, 48, 45, 43, 101, 171, 187, 171, 187, 0,6 , 0,6 , 236,8 , 236,8 , 119,10 , 97,16 , 37,5 , 8,10 , 6266,63 , 6329,85 , 134,24 , 6266,63 , 6329,85 , 134,24 , 2993,35 , 3028,52 , 3080,14 , 2993,35 , 3028,52 , 3080,14 , 0,2 , 0,2 , 368,6 , 374,17 , 391,23 , {88,79,70}, 206,3 , 7231,59 , 13,5 , 4,0 , 1940,8 , 2079,13 , 0, 0, 1, 6, 7 }, // French/Latin/Ivory Coast
- { 37, 7, 59, 44, 8239, 59, 37, 48, 45, 43, 101, 171, 187, 171, 187, 0,6 , 0,6 , 236,8 , 236,8 , 119,10 , 97,16 , 18,7 , 25,12 , 6266,63 , 6329,85 , 134,24 , 6266,63 , 6329,85 , 134,24 , 2993,35 , 3028,52 , 3080,14 , 2993,35 , 3028,52 , 3080,14 , 0,2 , 0,2 , 368,6 , 374,17 , 391,23 , {68,74,70}, 38,3 , 7557,57 , 13,5 , 4,0 , 1940,8 , 2092,8 , 0, 0, 6, 6, 7 }, // French/Latin/Djibouti
- { 37, 7, 66, 44, 8239, 59, 37, 48, 45, 43, 101, 171, 187, 171, 187, 0,6 , 0,6 , 236,8 , 236,8 , 119,10 , 97,16 , 37,5 , 8,10 , 6266,63 , 6329,85 , 134,24 , 6266,63 , 6329,85 , 134,24 , 2993,35 , 3028,52 , 3080,14 , 2993,35 , 3028,52 , 3080,14 , 0,2 , 0,2 , 368,6 , 374,17 , 391,23 , {88,65,70}, 32,4 , 7343,56 , 13,5 , 4,0 , 1940,8 , 2100,18 , 0, 0, 1, 6, 7 }, // French/Latin/Equatorial Guinea
- { 37, 7, 76, 44, 8239, 59, 37, 48, 45, 43, 101, 171, 187, 171, 187, 0,6 , 0,6 , 236,8 , 236,8 , 119,10 , 97,16 , 37,5 , 8,10 , 6266,63 , 6329,85 , 134,24 , 6266,63 , 6329,85 , 134,24 , 2993,35 , 3028,52 , 3080,14 , 2993,35 , 3028,52 , 3080,14 , 0,2 , 0,2 , 368,6 , 374,17 , 391,23 , {69,85,82}, 14,1 , 3102,20 , 13,5 , 4,0 , 1940,8 , 2118,16 , 2, 1, 1, 6, 7 }, // French/Latin/French Guiana
- { 37, 7, 77, 44, 8239, 59, 37, 48, 45, 43, 101, 171, 187, 171, 187, 0,6 , 0,6 , 236,8 , 236,8 , 119,10 , 97,16 , 37,5 , 8,10 , 6266,63 , 6329,85 , 134,24 , 6266,63 , 6329,85 , 134,24 , 2993,35 , 3028,52 , 3080,14 , 2993,35 , 3028,52 , 3080,14 , 0,2 , 0,2 , 368,6 , 374,17 , 391,23 , {88,80,70}, 211,4 , 7614,35 , 13,5 , 4,0 , 1940,8 , 2134,19 , 0, 0, 1, 6, 7 }, // French/Latin/French Polynesia
- { 37, 7, 79, 44, 8239, 59, 37, 48, 45, 43, 101, 171, 187, 171, 187, 0,6 , 0,6 , 236,8 , 236,8 , 119,10 , 97,16 , 37,5 , 8,10 , 6266,63 , 6329,85 , 134,24 , 6266,63 , 6329,85 , 134,24 , 2993,35 , 3028,52 , 3080,14 , 2993,35 , 3028,52 , 3080,14 , 0,2 , 0,2 , 368,6 , 374,17 , 391,23 , {88,65,70}, 32,4 , 7343,56 , 13,5 , 4,0 , 1940,8 , 2153,5 , 0, 0, 1, 6, 7 }, // French/Latin/Gabon
- { 37, 7, 88, 44, 8239, 59, 37, 48, 45, 43, 101, 171, 187, 171, 187, 0,6 , 0,6 , 236,8 , 236,8 , 119,10 , 97,16 , 37,5 , 8,10 , 6266,63 , 6329,85 , 134,24 , 6266,63 , 6329,85 , 134,24 , 2993,35 , 3028,52 , 3080,14 , 2993,35 , 3028,52 , 3080,14 , 0,2 , 0,2 , 368,6 , 374,17 , 391,23 , {69,85,82}, 14,1 , 3102,20 , 13,5 , 4,0 , 1940,8 , 2158,10 , 2, 1, 1, 6, 7 }, // French/Latin/Guadeloupe
- { 37, 7, 91, 44, 8239, 59, 37, 48, 45, 43, 101, 171, 187, 171, 187, 0,6 , 0,6 , 236,8 , 236,8 , 119,10 , 97,16 , 37,5 , 8,10 , 6266,63 , 6329,85 , 134,24 , 6266,63 , 6329,85 , 134,24 , 2993,35 , 3028,52 , 3080,14 , 2993,35 , 3028,52 , 3080,14 , 0,2 , 0,2 , 368,6 , 374,17 , 391,23 , {71,78,70}, 215,2 , 7649,48 , 13,5 , 4,0 , 1940,8 , 2168,6 , 0, 0, 1, 6, 7 }, // French/Latin/Guinea
- { 37, 7, 94, 44, 8239, 59, 37, 48, 45, 43, 101, 171, 187, 171, 187, 0,6 , 0,6 , 236,8 , 236,8 , 119,10 , 97,16 , 37,5 , 8,10 , 6266,63 , 6329,85 , 134,24 , 6266,63 , 6329,85 , 134,24 , 2993,35 , 3028,52 , 3080,14 , 2993,35 , 3028,52 , 3080,14 , 0,2 , 0,2 , 368,6 , 374,17 , 391,23 , {72,84,71}, 217,1 , 7697,57 , 13,5 , 4,0 , 1940,8 , 2174,5 , 2, 1, 1, 6, 7 }, // French/Latin/Haiti
- { 37, 7, 125, 44, 46, 59, 37, 48, 45, 43, 101, 171, 187, 171, 187, 0,6 , 0,6 , 236,8 , 236,8 , 119,10 , 97,16 , 37,5 , 8,10 , 6266,63 , 6329,85 , 134,24 , 6266,63 , 6329,85 , 134,24 , 2993,35 , 3028,52 , 3080,14 , 2993,35 , 3028,52 , 3080,14 , 0,2 , 0,2 , 368,6 , 374,17 , 391,23 , {69,85,82}, 14,1 , 3102,20 , 13,5 , 4,0 , 1940,8 , 2179,10 , 2, 1, 1, 6, 7 }, // French/Latin/Luxembourg
- { 37, 7, 128, 44, 8239, 59, 37, 48, 45, 43, 101, 171, 187, 171, 187, 0,6 , 0,6 , 236,8 , 236,8 , 119,10 , 97,16 , 37,5 , 8,10 , 6266,63 , 6329,85 , 134,24 , 6266,63 , 6329,85 , 134,24 , 2993,35 , 3028,52 , 3080,14 , 2993,35 , 3028,52 , 3080,14 , 0,2 , 0,2 , 368,6 , 374,17 , 391,23 , {77,71,65}, 169,2 , 7754,54 , 13,5 , 4,0 , 1940,8 , 1234,10 , 0, 0, 1, 6, 7 }, // French/Latin/Madagascar
- { 37, 7, 132, 44, 8239, 59, 37, 48, 45, 43, 101, 171, 187, 171, 187, 0,6 , 0,6 , 236,8 , 236,8 , 119,10 , 97,16 , 37,5 , 8,10 , 6266,63 , 6329,85 , 134,24 , 6266,63 , 6329,85 , 134,24 , 2993,35 , 3028,52 , 3080,14 , 2993,35 , 3028,52 , 3080,14 , 0,2 , 0,2 , 368,6 , 374,17 , 391,23 , {88,79,70}, 206,3 , 7231,59 , 13,5 , 4,0 , 1940,8 , 2189,4 , 0, 0, 1, 6, 7 }, // French/Latin/Mali
- { 37, 7, 135, 44, 8239, 59, 37, 48, 45, 43, 101, 171, 187, 171, 187, 0,6 , 0,6 , 236,8 , 236,8 , 119,10 , 97,16 , 37,5 , 8,10 , 6266,63 , 6329,85 , 134,24 , 6266,63 , 6329,85 , 134,24 , 2993,35 , 3028,52 , 3080,14 , 2993,35 , 3028,52 , 3080,14 , 0,2 , 0,2 , 368,6 , 374,17 , 391,23 , {69,85,82}, 14,1 , 3102,20 , 13,5 , 4,0 , 1940,8 , 2193,10 , 2, 1, 1, 6, 7 }, // French/Latin/Martinique
- { 37, 7, 136, 44, 8239, 59, 37, 48, 45, 43, 101, 171, 187, 171, 187, 0,6 , 0,6 , 236,8 , 236,8 , 119,10 , 97,16 , 18,7 , 25,12 , 6266,63 , 6329,85 , 134,24 , 6266,63 , 6329,85 , 134,24 , 2993,35 , 3028,52 , 3080,14 , 2993,35 , 3028,52 , 3080,14 , 0,2 , 0,2 , 368,6 , 374,17 , 391,23 , {77,82,85}, 218,2 , 7808,66 , 13,5 , 4,0 , 1940,8 , 2203,10 , 2, 1, 1, 6, 7 }, // French/Latin/Mauritania
- { 37, 7, 137, 44, 8239, 59, 37, 48, 45, 43, 101, 171, 187, 171, 187, 0,6 , 0,6 , 236,8 , 236,8 , 119,10 , 97,16 , 37,5 , 8,10 , 6266,63 , 6329,85 , 134,24 , 6266,63 , 6329,85 , 134,24 , 2993,35 , 3028,52 , 3080,14 , 2993,35 , 3028,52 , 3080,14 , 0,2 , 0,2 , 368,6 , 374,17 , 391,23 , {77,85,82}, 175,2 , 7874,63 , 13,5 , 4,0 , 1940,8 , 2213,7 , 2, 0, 1, 6, 7 }, // French/Latin/Mauritius
- { 37, 7, 138, 44, 8239, 59, 37, 48, 45, 43, 101, 171, 187, 171, 187, 0,6 , 0,6 , 236,8 , 236,8 , 119,10 , 97,16 , 37,5 , 8,10 , 6266,63 , 6329,85 , 134,24 , 6266,63 , 6329,85 , 134,24 , 2993,35 , 3028,52 , 3080,14 , 2993,35 , 3028,52 , 3080,14 , 0,2 , 0,2 , 368,6 , 374,17 , 391,23 , {69,85,82}, 14,1 , 3102,20 , 13,5 , 4,0 , 1940,8 , 2220,7 , 2, 1, 1, 6, 7 }, // French/Latin/Mayotte
- { 37, 7, 142, 44, 8239, 59, 37, 48, 45, 43, 101, 171, 187, 171, 187, 0,6 , 0,6 , 236,8 , 236,8 , 119,10 , 97,16 , 37,5 , 8,10 , 6266,63 , 6329,85 , 134,24 , 6266,63 , 6329,85 , 134,24 , 2993,35 , 3028,52 , 3080,14 , 2993,35 , 3028,52 , 3080,14 , 0,2 , 0,2 , 368,6 , 374,17 , 391,23 , {69,85,82}, 14,1 , 3102,20 , 13,5 , 4,0 , 1940,8 , 2227,6 , 2, 1, 1, 6, 7 }, // French/Latin/Monaco
- { 37, 7, 145, 44, 46, 59, 37, 48, 45, 43, 101, 171, 187, 171, 187, 0,6 , 0,6 , 236,8 , 236,8 , 119,10 , 97,16 , 37,5 , 8,10 , 6478,61 , 6329,85 , 134,24 , 6478,61 , 6329,85 , 134,24 , 2993,35 , 3028,52 , 3080,14 , 2993,35 , 3028,52 , 3080,14 , 64,4 , 61,4 , 368,6 , 374,17 , 391,23 , {77,65,68}, 0,0 , 7937,54 , 13,5 , 4,0 , 1940,8 , 2233,5 , 2, 1, 1, 6, 7 }, // French/Latin/Morocco
- { 37, 7, 153, 44, 8239, 59, 37, 48, 45, 43, 101, 171, 187, 171, 187, 0,6 , 0,6 , 236,8 , 236,8 , 119,10 , 97,16 , 37,5 , 8,10 , 6266,63 , 6329,85 , 134,24 , 6266,63 , 6329,85 , 134,24 , 2993,35 , 3028,52 , 3080,14 , 2993,35 , 3028,52 , 3080,14 , 0,2 , 0,2 , 368,6 , 374,17 , 391,23 , {88,80,70}, 211,4 , 7614,35 , 13,5 , 4,0 , 1940,8 , 2238,18 , 0, 0, 1, 6, 7 }, // French/Latin/New Caledonia
- { 37, 7, 156, 44, 8239, 59, 37, 48, 45, 43, 101, 171, 187, 171, 187, 0,6 , 0,6 , 236,8 , 236,8 , 119,10 , 97,16 , 37,5 , 8,10 , 6266,63 , 6329,85 , 134,24 , 6266,63 , 6329,85 , 134,24 , 2993,35 , 3028,52 , 3080,14 , 2993,35 , 3028,52 , 3080,14 , 0,2 , 0,2 , 368,6 , 374,17 , 391,23 , {88,79,70}, 206,3 , 7231,59 , 13,5 , 4,0 , 1940,8 , 2256,5 , 0, 0, 1, 6, 7 }, // French/Latin/Niger
- { 37, 7, 176, 44, 8239, 59, 37, 48, 45, 43, 101, 171, 187, 171, 187, 0,6 , 0,6 , 236,8 , 236,8 , 119,10 , 97,16 , 37,5 , 8,10 , 6266,63 , 6329,85 , 134,24 , 6266,63 , 6329,85 , 134,24 , 2993,35 , 3028,52 , 3080,14 , 2993,35 , 3028,52 , 3080,14 , 0,2 , 0,2 , 368,6 , 374,17 , 391,23 , {69,85,82}, 14,1 , 3102,20 , 13,5 , 4,0 , 1940,8 , 2261,10 , 2, 1, 1, 6, 7 }, // French/Latin/Reunion
- { 37, 7, 179, 44, 8239, 59, 37, 48, 45, 43, 101, 171, 187, 171, 187, 0,6 , 0,6 , 236,8 , 236,8 , 119,10 , 97,16 , 37,5 , 8,10 , 6266,63 , 6329,85 , 134,24 , 6266,63 , 6329,85 , 134,24 , 2993,35 , 3028,52 , 3080,14 , 2993,35 , 3028,52 , 3080,14 , 0,2 , 0,2 , 368,6 , 374,17 , 391,23 , {82,87,70}, 179,2 , 7991,50 , 13,5 , 4,0 , 1940,8 , 1458,6 , 0, 0, 1, 6, 7 }, // French/Latin/Rwanda
- { 37, 7, 187, 44, 8239, 59, 37, 48, 45, 43, 101, 171, 187, 171, 187, 0,6 , 0,6 , 236,8 , 236,8 , 119,10 , 97,16 , 37,5 , 8,10 , 6266,63 , 6329,85 , 134,24 , 6266,63 , 6329,85 , 134,24 , 2993,35 , 3028,52 , 3080,14 , 2993,35 , 3028,52 , 3080,14 , 0,2 , 0,2 , 368,6 , 374,17 , 391,23 , {88,79,70}, 206,3 , 7231,59 , 13,5 , 4,0 , 1940,8 , 2271,7 , 0, 0, 1, 6, 7 }, // French/Latin/Senegal
- { 37, 7, 188, 44, 8239, 59, 37, 48, 45, 43, 101, 171, 187, 171, 187, 0,6 , 0,6 , 236,8 , 236,8 , 119,10 , 97,16 , 37,5 , 8,10 , 6266,63 , 6329,85 , 134,24 , 6266,63 , 6329,85 , 134,24 , 2993,35 , 3028,52 , 3080,14 , 2993,35 , 3028,52 , 3080,14 , 0,2 , 0,2 , 368,6 , 374,17 , 391,23 , {83,67,82}, 184,2 , 8041,71 , 13,5 , 4,0 , 1940,8 , 1519,10 , 2, 1, 1, 6, 7 }, // French/Latin/Seychelles
- { 37, 7, 200, 44, 8239, 59, 37, 48, 45, 43, 101, 171, 187, 171, 187, 0,6 , 0,6 , 236,8 , 236,8 , 119,10 , 97,16 , 37,5 , 8,10 , 6266,63 , 6329,85 , 134,24 , 6266,63 , 6329,85 , 134,24 , 2993,35 , 3028,52 , 3080,14 , 2993,35 , 3028,52 , 3080,14 , 0,2 , 0,2 , 368,6 , 374,17 , 391,23 , {69,85,82}, 14,1 , 3102,20 , 13,5 , 4,0 , 1940,8 , 2278,24 , 2, 1, 1, 6, 7 }, // French/Latin/Saint Pierre And Miquelon
- { 37, 7, 206, 44, 8239, 59, 37, 48, 45, 43, 101, 171, 187, 8249, 8250, 0,6 , 0,6 , 236,8 , 236,8 , 156,8 , 10,17 , 37,5 , 337,14 , 6266,63 , 6329,85 , 134,24 , 6266,63 , 6329,85 , 134,24 , 2993,35 , 3028,52 , 3080,14 , 2993,35 , 3028,52 , 3080,14 , 0,2 , 0,2 , 368,6 , 374,17 , 391,23 , {67,72,70}, 0,0 , 8112,45 , 13,5 , 4,0 , 2302,15 , 2317,6 , 2, 0, 1, 6, 7 }, // French/Latin/Switzerland
- { 37, 7, 207, 44, 8239, 59, 37, 48, 45, 43, 101, 171, 187, 171, 187, 0,6 , 0,6 , 236,8 , 236,8 , 119,10 , 97,16 , 18,7 , 25,12 , 6266,63 , 6329,85 , 134,24 , 6266,63 , 6329,85 , 134,24 , 2993,35 , 3028,52 , 3080,14 , 2993,35 , 3028,52 , 3080,14 , 0,2 , 0,2 , 368,6 , 374,17 , 391,23 , {83,89,80}, 220,2 , 8157,51 , 13,5 , 4,0 , 1940,8 , 2323,5 , 0, 0, 6, 5, 6 }, // French/Latin/Syria
- { 37, 7, 212, 44, 8239, 59, 37, 48, 45, 43, 101, 171, 187, 171, 187, 0,6 , 0,6 , 236,8 , 236,8 , 119,10 , 97,16 , 37,5 , 8,10 , 6266,63 , 6329,85 , 134,24 , 6266,63 , 6329,85 , 134,24 , 2993,35 , 3028,52 , 3080,14 , 2993,35 , 3028,52 , 3080,14 , 0,2 , 0,2 , 368,6 , 374,17 , 391,23 , {88,79,70}, 206,3 , 7231,59 , 13,5 , 4,0 , 1940,8 , 2328,4 , 0, 0, 1, 6, 7 }, // French/Latin/Togo
- { 37, 7, 216, 44, 8239, 59, 37, 48, 45, 43, 101, 171, 187, 171, 187, 0,6 , 0,6 , 236,8 , 236,8 , 119,10 , 97,16 , 18,7 , 25,12 , 6266,63 , 6329,85 , 134,24 , 6266,63 , 6329,85 , 134,24 , 2993,35 , 3028,52 , 3080,14 , 2993,35 , 3028,52 , 3080,14 , 0,2 , 0,2 , 368,6 , 374,17 , 391,23 , {84,78,68}, 222,2 , 8208,51 , 13,5 , 4,0 , 1940,8 , 2332,7 , 3, 0, 1, 6, 7 }, // French/Latin/Tunisia
- { 37, 7, 229, 44, 8239, 59, 37, 48, 45, 43, 101, 171, 187, 171, 187, 0,6 , 0,6 , 236,8 , 236,8 , 119,10 , 97,16 , 18,7 , 25,12 , 6266,63 , 6329,85 , 134,24 , 6266,63 , 6329,85 , 134,24 , 2993,35 , 3028,52 , 3080,14 , 2993,35 , 3028,52 , 3080,14 , 0,2 , 0,2 , 368,6 , 374,17 , 391,23 , {86,85,86}, 202,2 , 8259,51 , 13,5 , 4,0 , 1940,8 , 1766,7 , 0, 0, 1, 6, 7 }, // French/Latin/Vanuatu
- { 37, 7, 235, 44, 8239, 59, 37, 48, 45, 43, 101, 171, 187, 171, 187, 0,6 , 0,6 , 236,8 , 236,8 , 119,10 , 97,16 , 37,5 , 8,10 , 6266,63 , 6329,85 , 134,24 , 6266,63 , 6329,85 , 134,24 , 2993,35 , 3028,52 , 3080,14 , 2993,35 , 3028,52 , 3080,14 , 0,2 , 0,2 , 368,6 , 374,17 , 391,23 , {88,80,70}, 211,4 , 7614,35 , 13,5 , 4,0 , 1940,8 , 2339,16 , 0, 0, 1, 6, 7 }, // French/Latin/Wallis And Futuna Islands
- { 37, 7, 244, 44, 8239, 59, 37, 48, 45, 43, 101, 171, 187, 171, 187, 0,6 , 0,6 , 236,8 , 236,8 , 119,10 , 97,16 , 37,5 , 8,10 , 6266,63 , 6329,85 , 134,24 , 6266,63 , 6329,85 , 134,24 , 2993,35 , 3028,52 , 3080,14 , 2993,35 , 3028,52 , 3080,14 , 0,2 , 0,2 , 368,6 , 374,17 , 391,23 , {69,85,82}, 14,1 , 3102,20 , 13,5 , 4,0 , 1940,8 , 2355,16 , 2, 1, 1, 6, 7 }, // French/Latin/Saint Barthelemy
- { 37, 7, 245, 44, 8239, 59, 37, 48, 45, 43, 101, 171, 187, 171, 187, 0,6 , 0,6 , 236,8 , 236,8 , 119,10 , 97,16 , 37,5 , 8,10 , 6266,63 , 6329,85 , 134,24 , 6266,63 , 6329,85 , 134,24 , 2993,35 , 3028,52 , 3080,14 , 2993,35 , 3028,52 , 3080,14 , 0,2 , 0,2 , 368,6 , 374,17 , 391,23 , {69,85,82}, 14,1 , 3102,20 , 13,5 , 4,0 , 1940,8 , 2371,12 , 2, 1, 1, 6, 7 }, // French/Latin/Saint Martin
- { 38, 7, 151, 44, 46, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 6,8 , 6,8 , 339,8 , 97,16 , 37,5 , 8,10 , 6539,48 , 6587,95 , 134,24 , 6539,48 , 6587,95 , 134,24 , 3094,21 , 3115,54 , 85,14 , 3094,21 , 3115,54 , 85,14 , 0,2 , 0,2 , 45,4 , 5,17 , 22,23 , {69,85,82}, 14,1 , 3455,19 , 8,5 , 53,6 , 2383,5 , 2388,8 , 2, 1, 1, 6, 7 }, // Western Frisian/Latin/Netherlands
- { 39, 7, 224, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 244,10 , 244,10 , 119,10 , 648,21 , 37,5 , 8,10 , 6682,61 , 6743,142 , 6885,24 , 6682,61 , 6909,167 , 6885,24 , 3169,28 , 3197,69 , 3266,14 , 3169,28 , 3197,69 , 3266,14 , 81,1 , 77,1 , 414,6 , 5,17 , 22,23 , {71,66,80}, 119,1 , 8310,86 , 4,4 , 4,0 , 2396,8 , 2404,22 , 2, 1, 1, 6, 7 }, // Gaelic/Latin/United Kingdom
- { 40, 7, 197, 44, 46, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 254,7 , 254,7 , 27,8 , 669,27 , 37,5 , 8,10 , 7076,60 , 7136,87 , 7223,24 , 7247,60 , 7307,87 , 7394,36 , 3280,35 , 3315,49 , 3364,14 , 3378,35 , 3413,49 , 3462,21 , 64,4 , 61,4 , 0,5 , 5,17 , 22,23 , {69,85,82}, 14,1 , 3910,20 , 13,5 , 4,0 , 2426,6 , 2432,6 , 2, 1, 1, 6, 7 }, // Galician/Latin/Spain
- { 41, 15, 81, 44, 160, 59, 37, 48, 45, 43, 101, 8222, 8220, 171, 187, 0,6 , 0,6 , 261,8 , 261,8 , 156,8 , 696,19 , 37,5 , 8,10 , 7430,48 , 7478,99 , 7577,24 , 7430,48 , 7478,99 , 7577,24 , 3483,28 , 3511,62 , 3573,14 , 3483,28 , 3511,62 , 3573,14 , 0,2 , 0,2 , 420,5 , 425,37 , 22,23 , {71,69,76}, 224,1 , 8396,43 , 13,5 , 4,0 , 2438,7 , 2445,10 , 2, 1, 1, 6, 7 }, // Georgian/Georgian/Georgia
- { 42, 7, 82, 44, 46, 59, 37, 48, 45, 43, 101, 8222, 8220, 8218, 8216, 0,6 , 0,6 , 269,9 , 269,9 , 156,8 , 622,18 , 37,5 , 8,10 , 7601,48 , 7649,83 , 134,24 , 7732,60 , 7649,83 , 134,24 , 3587,21 , 3608,60 , 3668,14 , 3682,28 , 3608,60 , 3668,14 , 0,2 , 0,2 , 462,5 , 5,17 , 22,23 , {69,85,82}, 14,1 , 8439,19 , 13,5 , 4,0 , 2455,7 , 2462,11 , 2, 1, 1, 6, 7 }, // German/Latin/Germany
- { 42, 7, 14, 44, 160, 59, 37, 48, 45, 43, 101, 8222, 8220, 8218, 8216, 0,6 , 0,6 , 269,9 , 269,9 , 156,8 , 622,18 , 37,5 , 8,10 , 7792,48 , 7840,83 , 134,24 , 7923,59 , 7840,83 , 134,24 , 3587,21 , 3608,60 , 3668,14 , 3682,28 , 3608,60 , 3668,14 , 0,2 , 0,2 , 462,5 , 5,17 , 22,23 , {69,85,82}, 14,1 , 8439,19 , 8,5 , 4,0 , 2473,24 , 2497,10 , 2, 1, 1, 6, 7 }, // German/Latin/Austria
- { 42, 7, 21, 44, 46, 59, 37, 48, 45, 43, 101, 8222, 8220, 8218, 8216, 0,6 , 0,6 , 269,9 , 269,9 , 156,8 , 622,18 , 37,5 , 8,10 , 7601,48 , 7649,83 , 134,24 , 7732,60 , 7649,83 , 134,24 , 3587,21 , 3608,60 , 3668,14 , 3682,28 , 3608,60 , 3668,14 , 0,2 , 0,2 , 462,5 , 5,17 , 22,23 , {69,85,82}, 14,1 , 8439,19 , 13,5 , 4,0 , 2455,7 , 2507,7 , 2, 1, 1, 6, 7 }, // German/Latin/Belgium
- { 42, 7, 106, 44, 46, 59, 37, 48, 45, 43, 101, 8222, 8220, 8218, 8216, 0,6 , 0,6 , 269,9 , 269,9 , 156,8 , 622,18 , 37,5 , 8,10 , 7792,48 , 7840,83 , 134,24 , 7923,59 , 7840,83 , 134,24 , 3587,21 , 3608,60 , 3668,14 , 3682,28 , 3608,60 , 3668,14 , 0,2 , 0,2 , 462,5 , 5,17 , 22,23 , {69,85,82}, 14,1 , 8439,19 , 13,5 , 4,0 , 2455,7 , 2514,7 , 2, 1, 1, 6, 7 }, // German/Latin/Italy
- { 42, 7, 123, 46, 8217, 59, 37, 48, 45, 43, 101, 8222, 8220, 8218, 8216, 0,6 , 0,6 , 269,9 , 269,9 , 156,8 , 622,18 , 37,5 , 8,10 , 7601,48 , 7649,83 , 134,24 , 7732,60 , 7649,83 , 134,24 , 3587,21 , 3608,60 , 3668,14 , 3682,28 , 3608,60 , 3668,14 , 0,2 , 0,2 , 462,5 , 5,17 , 22,23 , {67,72,70}, 0,0 , 8458,58 , 8,5 , 4,0 , 2455,7 , 2521,13 , 2, 0, 1, 6, 7 }, // German/Latin/Liechtenstein
- { 42, 7, 125, 44, 46, 59, 37, 48, 45, 43, 101, 8222, 8220, 8218, 8216, 0,6 , 0,6 , 269,9 , 269,9 , 156,8 , 622,18 , 37,5 , 8,10 , 7601,48 , 7649,83 , 134,24 , 7732,60 , 7649,83 , 134,24 , 3587,21 , 3608,60 , 3668,14 , 3682,28 , 3608,60 , 3668,14 , 0,2 , 0,2 , 462,5 , 5,17 , 22,23 , {69,85,82}, 14,1 , 8439,19 , 13,5 , 4,0 , 2455,7 , 2534,9 , 2, 1, 1, 6, 7 }, // German/Latin/Luxembourg
- { 42, 7, 206, 46, 8217, 59, 37, 48, 45, 43, 101, 8222, 8220, 8218, 8216, 0,6 , 0,6 , 269,9 , 269,9 , 156,8 , 622,18 , 37,5 , 8,10 , 7601,48 , 7649,83 , 134,24 , 7732,60 , 7649,83 , 134,24 , 3587,21 , 3608,60 , 3668,14 , 3682,28 , 3608,60 , 3668,14 , 0,2 , 0,2 , 462,5 , 5,17 , 22,23 , {67,72,70}, 225,3 , 8458,58 , 8,5 , 36,5 , 2543,21 , 2564,7 , 2, 0, 1, 6, 7 }, // German/Latin/Switzerland
- { 43, 16, 85, 44, 46, 59, 37, 48, 45, 43, 101, 171, 187, 8220, 8221, 0,6 , 0,6 , 278,9 , 278,9 , 269,6 , 10,17 , 18,7 , 25,12 , 7982,50 , 8032,115 , 8147,24 , 8171,50 , 8221,115 , 8147,24 , 3710,28 , 3738,55 , 3793,14 , 3710,28 , 3738,55 , 3793,14 , 82,4 , 78,4 , 45,4 , 5,17 , 22,23 , {69,85,82}, 14,1 , 8516,19 , 13,5 , 4,0 , 2571,8 , 2579,6 , 2, 1, 1, 6, 7 }, // Greek/Greek/Greece
- { 43, 16, 56, 44, 46, 59, 37, 48, 45, 43, 101, 171, 187, 8220, 8221, 0,6 , 0,6 , 278,9 , 278,9 , 269,6 , 10,17 , 18,7 , 25,12 , 7982,50 , 8032,115 , 8147,24 , 8171,50 , 8221,115 , 8147,24 , 3710,28 , 3738,55 , 3793,14 , 3710,28 , 3738,55 , 3793,14 , 82,4 , 78,4 , 45,4 , 5,17 , 22,23 , {69,85,82}, 14,1 , 8516,19 , 13,5 , 4,0 , 2571,8 , 2585,6 , 2, 1, 1, 6, 7 }, // Greek/Greek/Cyprus
- { 44, 7, 86, 44, 46, 59, 37, 48, 8722, 43, 101, 187, 171, 8250, 8249, 0,6 , 0,6 , 287,11 , 287,11 , 53,10 , 80,17 , 228,5 , 233,10 , 8336,48 , 8384,96 , 134,24 , 8336,48 , 8384,96 , 134,24 , 3807,28 , 3835,98 , 3933,14 , 3807,28 , 3835,98 , 3933,14 , 0,2 , 0,2 , 45,4 , 5,17 , 22,23 , {68,75,75}, 144,3 , 8535,62 , 4,4 , 59,5 , 2591,11 , 2602,16 , 2, 0, 1, 6, 7 }, // Greenlandic/Latin/Greenland
- { 45, 7, 168, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 53,10 , 63,17 , 37,5 , 8,10 , 368,48 , 368,48 , 158,27 , 368,48 , 368,48 , 158,27 , 0,28 , 0,28 , 85,14 , 0,28 , 0,28 , 85,14 , 0,2 , 0,2 , 45,4 , 5,17 , 22,23 , {80,89,71}, 228,1 , 0,7 , 8,5 , 4,0 , 0,0 , 0,0 , 0, 0, 7, 6, 7 }, // Guarani/Latin/Paraguay
- { 46, 17, 100, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 298,9 , 298,9 , 269,6 , 192,18 , 351,8 , 359,13 , 8480,67 , 8547,87 , 8634,31 , 8480,67 , 8547,87 , 8634,31 , 3947,32 , 3979,53 , 4032,19 , 3947,32 , 3979,53 , 4032,19 , 0,2 , 0,2 , 467,4 , 471,19 , 22,23 , {73,78,82}, 121,1 , 8597,46 , 4,4 , 4,0 , 2618,7 , 2625,4 , 2, 1, 7, 7, 7 }, // Gujarati/Gujarati/India
- { 47, 7, 157, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 307,8 , 307,8 , 269,6 , 715,17 , 37,5 , 8,10 , 8665,48 , 8713,85 , 8798,24 , 8665,48 , 8713,85 , 8798,24 , 4051,28 , 4079,52 , 4131,14 , 4051,28 , 4079,52 , 4131,14 , 86,6 , 82,5 , 45,4 , 5,17 , 22,23 , {78,71,78}, 177,1 , 8643,12 , 8,5 , 4,0 , 2629,5 , 2634,8 , 2, 1, 1, 6, 7 }, // Hausa/Latin/Nigeria
- { 47, 1, 157, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 53,10 , 63,17 , 37,5 , 8,10 , 368,48 , 368,48 , 158,27 , 368,48 , 368,48 , 158,27 , 0,28 , 0,28 , 85,14 , 0,28 , 0,28 , 85,14 , 0,2 , 0,2 , 45,4 , 5,17 , 22,23 , {78,71,78}, 177,1 , 0,7 , 8,5 , 4,0 , 0,0 , 0,0 , 2, 1, 1, 6, 7 }, // Hausa/Arabic/Nigeria
- { 47, 7, 83, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 307,8 , 307,8 , 269,6 , 715,17 , 18,7 , 25,12 , 8665,48 , 8713,85 , 8798,24 , 8665,48 , 8713,85 , 8798,24 , 4051,28 , 4079,52 , 4131,14 , 4051,28 , 4079,52 , 4131,14 , 86,6 , 82,5 , 45,4 , 5,17 , 22,23 , {71,72,83}, 163,3 , 0,7 , 8,5 , 4,0 , 2629,5 , 2642,4 , 2, 1, 1, 6, 7 }, // Hausa/Latin/Ghana
- { 47, 7, 156, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 307,8 , 307,8 , 269,6 , 715,17 , 37,5 , 8,10 , 8665,48 , 8713,85 , 8798,24 , 8665,48 , 8713,85 , 8798,24 , 4051,28 , 4079,52 , 4131,14 , 4051,28 , 4079,52 , 4131,14 , 86,6 , 82,5 , 45,4 , 5,17 , 22,23 , {88,79,70}, 206,3 , 8655,36 , 8,5 , 4,0 , 2629,5 , 2646,5 , 0, 0, 1, 6, 7 }, // Hausa/Latin/Niger
- { 48, 18, 105, 46, 44, 59, 37, 48, 45, 43, 101, 8221, 8221, 8217, 8217, 0,6 , 0,6 , 315,6 , 315,6 , 640,8 , 732,18 , 55,4 , 59,9 , 8822,58 , 8880,72 , 158,27 , 8822,58 , 8880,72 , 158,27 , 4145,46 , 4191,65 , 4256,21 , 4145,46 , 4191,65 , 4256,21 , 92,6 , 87,5 , 490,4 , 5,17 , 22,23 , {73,76,83}, 49,1 , 8691,54 , 64,6 , 70,8 , 2651,5 , 2656,5 , 2, 1, 7, 5, 6 }, // Hebrew/Hebrew/Israel
- { 49, 13, 100, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 321,9 , 330,8 , 269,6 , 10,17 , 18,7 , 25,12 , 8952,59 , 9011,73 , 9084,30 , 8952,59 , 9011,73 , 9084,30 , 4277,32 , 4309,53 , 4362,19 , 4277,32 , 4309,53 , 4362,19 , 68,2 , 65,2 , 494,4 , 5,17 , 22,23 , {73,78,82}, 121,1 , 8745,42 , 4,4 , 4,0 , 2661,6 , 2667,4 , 2, 1, 7, 7, 7 }, // Hindi/Devanagari/India
- { 50, 7, 98, 44, 160, 59, 37, 48, 45, 43, 101, 8222, 8221, 187, 171, 0,6 , 0,6 , 338,8 , 338,8 , 750,13 , 763,19 , 55,4 , 59,9 , 9114,64 , 9178,98 , 9276,25 , 9114,64 , 9178,98 , 9276,25 , 4381,19 , 4400,52 , 4452,17 , 4381,19 , 4400,52 , 4452,17 , 98,3 , 92,3 , 498,4 , 5,17 , 22,23 , {72,85,70}, 229,2 , 8787,46 , 13,5 , 4,0 , 2671,6 , 2677,12 , 2, 0, 1, 6, 7 }, // Hungarian/Latin/Hungary
- { 51, 7, 99, 44, 46, 59, 37, 48, 45, 43, 101, 8222, 8220, 8218, 8216, 0,6 , 0,6 , 192,8 , 192,8 , 640,8 , 622,18 , 37,5 , 8,10 , 9301,59 , 9360,82 , 9442,24 , 9301,59 , 9360,82 , 9442,24 , 4469,35 , 4504,81 , 4585,14 , 4469,35 , 4504,81 , 4585,14 , 101,4 , 95,4 , 502,4 , 5,17 , 22,23 , {73,83,75}, 189,2 , 8833,49 , 13,5 , 4,0 , 2689,8 , 2697,6 , 0, 0, 1, 6, 7 }, // Icelandic/Latin/Iceland
- { 52, 7, 101, 44, 46, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 346,10 , 356,9 , 27,8 , 553,18 , 228,5 , 233,10 , 9466,48 , 9514,87 , 134,24 , 9466,48 , 9514,87 , 134,24 , 4599,28 , 4627,43 , 4670,14 , 4599,28 , 4627,43 , 4670,14 , 0,2 , 0,2 , 45,4 , 5,17 , 22,23 , {73,68,82}, 231,2 , 8882,39 , 4,4 , 4,0 , 2703,9 , 2703,9 , 2, 0, 7, 6, 7 }, // Indonesian/Latin/Indonesia
- { 53, 7, 260, 44, 46, 59, 37, 48, 45, 43, 101, 8216, 8217, 8220, 8221, 0,6 , 0,6 , 254,7 , 254,7 , 528,10 , 782,26 , 37,5 , 8,10 , 9601,48 , 9649,93 , 158,27 , 9601,48 , 9649,93 , 9742,24 , 4684,28 , 4712,57 , 4769,14 , 4684,28 , 4712,57 , 4769,14 , 0,2 , 0,2 , 0,5 , 5,17 , 22,23 , {0,0,0}, 0,0 , 2586,0 , 8,5 , 4,0 , 2712,11 , 2723,5 , 2, 1, 1, 6, 7 }, // Interlingua/Latin/World
- { 55, 44, 38, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 53,10 , 63,17 , 37,5 , 8,10 , 368,48 , 368,48 , 158,27 , 368,48 , 368,48 , 158,27 , 0,28 , 0,28 , 85,14 , 0,28 , 0,28 , 85,14 , 0,2 , 0,2 , 45,4 , 5,17 , 22,23 , {67,65,68}, 233,3 , 0,7 , 8,5 , 4,0 , 0,0 , 0,0 , 2, 0, 7, 6, 7 }, // Inuktitut/Canadian Aboriginal/Canada
- { 55, 7, 38, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 53,10 , 63,17 , 37,5 , 8,10 , 368,48 , 368,48 , 158,27 , 368,48 , 368,48 , 158,27 , 0,28 , 0,28 , 85,14 , 0,28 , 0,28 , 85,14 , 0,2 , 0,2 , 45,4 , 5,17 , 22,23 , {67,65,68}, 233,3 , 0,7 , 8,5 , 4,0 , 0,0 , 0,0 , 2, 0, 7, 6, 7 }, // Inuktitut/Latin/Canada
- { 57, 7, 104, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 365,11 , 244,10 , 119,10 , 97,16 , 37,5 , 8,10 , 9766,62 , 9828,107 , 9935,24 , 9766,62 , 9828,107 , 9935,24 , 4783,37 , 4820,75 , 4895,14 , 4783,37 , 4820,75 , 4895,14 , 105,4 , 99,4 , 506,6 , 5,17 , 22,23 , {69,85,82}, 14,1 , 8921,31 , 4,4 , 4,0 , 2728,7 , 2735,4 , 2, 1, 1, 6, 7 }, // Irish/Latin/Ireland
- { 58, 7, 106, 44, 46, 59, 37, 48, 45, 43, 101, 171, 187, 8220, 8221, 0,6 , 0,6 , 254,7 , 254,7 , 27,8 , 97,16 , 37,5 , 8,10 , 9959,48 , 10007,94 , 10101,24 , 9959,48 , 10007,94 , 10101,24 , 4909,28 , 4937,57 , 4994,14 , 4909,28 , 4937,57 , 4994,14 , 0,2 , 0,2 , 45,4 , 5,17 , 22,23 , {69,85,82}, 14,1 , 8952,19 , 13,5 , 4,0 , 2739,8 , 2747,6 , 2, 1, 1, 6, 7 }, // Italian/Latin/Italy
- { 58, 7, 184, 44, 46, 59, 37, 48, 45, 43, 101, 171, 187, 8220, 8221, 0,6 , 0,6 , 254,7 , 254,7 , 27,8 , 97,16 , 37,5 , 8,10 , 9959,48 , 10007,94 , 10101,24 , 9959,48 , 10007,94 , 10101,24 , 4909,28 , 4937,57 , 4994,14 , 4909,28 , 4937,57 , 4994,14 , 0,2 , 0,2 , 45,4 , 5,17 , 22,23 , {69,85,82}, 14,1 , 8952,19 , 13,5 , 4,0 , 2739,8 , 2753,10 , 2, 1, 1, 6, 7 }, // Italian/Latin/San Marino
- { 58, 7, 206, 46, 8217, 59, 37, 48, 45, 43, 101, 171, 187, 8249, 8250, 0,6 , 0,6 , 254,7 , 254,7 , 156,8 , 10,17 , 37,5 , 8,10 , 9959,48 , 10007,94 , 10101,24 , 9959,48 , 10007,94 , 10101,24 , 4909,28 , 4937,57 , 4994,14 , 4909,28 , 4937,57 , 4994,14 , 0,2 , 0,2 , 45,4 , 5,17 , 22,23 , {67,72,70}, 0,0 , 8971,53 , 8,5 , 36,5 , 2739,8 , 2763,8 , 2, 0, 1, 6, 7 }, // Italian/Latin/Switzerland
- { 58, 7, 230, 44, 46, 59, 37, 48, 45, 43, 101, 171, 187, 8220, 8221, 0,6 , 0,6 , 254,7 , 254,7 , 27,8 , 97,16 , 37,5 , 8,10 , 9959,48 , 10007,94 , 10101,24 , 9959,48 , 10007,94 , 10101,24 , 4909,28 , 4937,57 , 4994,14 , 4909,28 , 4937,57 , 4994,14 , 0,2 , 0,2 , 45,4 , 5,17 , 22,23 , {69,85,82}, 14,1 , 8952,19 , 13,5 , 4,0 , 2739,8 , 2771,18 , 2, 1, 1, 6, 7 }, // Italian/Latin/Vatican City State
- { 59, 19, 108, 46, 44, 59, 37, 48, 45, 43, 101, 12300, 12301, 12302, 12303, 170,5 , 170,5 , 170,5 , 170,5 , 578,10 , 402,13 , 55,4 , 372,10 , 4423,39 , 4423,39 , 158,27 , 4423,39 , 4423,39 , 158,27 , 5008,14 , 5022,28 , 5008,14 , 5008,14 , 5022,28 , 5008,14 , 109,2 , 103,2 , 512,3 , 5,17 , 22,23 , {74,80,89}, 133,1 , 9024,11 , 4,4 , 4,0 , 2789,3 , 2792,2 , 0, 0, 7, 6, 7 }, // Japanese/Japanese/Japan
- { 60, 7, 101, 44, 46, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 376,10 , 386,9 , 528,10 , 10,17 , 37,5 , 8,10 , 10125,48 , 9514,87 , 134,24 , 10125,48 , 9514,87 , 134,24 , 5050,28 , 5078,41 , 5119,14 , 5050,28 , 5078,41 , 5119,14 , 111,4 , 105,5 , 515,4 , 5,17 , 22,23 , {73,68,82}, 231,2 , 8882,39 , 8,5 , 4,0 , 2794,4 , 2798,9 , 2, 0, 7, 6, 7 }, // Javanese/Latin/Indonesia
- { 61, 21, 100, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 395,12 , 407,11 , 269,6 , 35,18 , 351,8 , 359,13 , 10173,63 , 10236,87 , 10323,31 , 10354,69 , 10236,87 , 10323,31 , 5133,33 , 5166,54 , 5220,20 , 5133,33 , 5166,54 , 5220,20 , 115,9 , 110,7 , 519,8 , 527,35 , 22,23 , {73,78,82}, 121,1 , 9035,49 , 4,4 , 4,0 , 2807,5 , 2812,4 , 2, 1, 7, 7, 7 }, // Kannada/Kannada/India
- { 62, 1, 100, 1643, 1644, 1563, 1642, 1776, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 547,6 , 35,18 , 18,7 , 25,12 , 10423,72 , 10423,72 , 10495,24 , 10423,72 , 10423,72 , 10495,24 , 5240,50 , 5290,52 , 5342,14 , 5240,50 , 5290,52 , 5342,14 , 0,2 , 0,2 , 45,4 , 5,17 , 22,23 , {73,78,82}, 121,1 , 9084,23 , 8,5 , 4,0 , 2816,5 , 2821,9 , 2, 1, 7, 7, 7 }, // Kashmiri/Arabic/India
- { 63, 2, 110, 44, 160, 59, 37, 48, 45, 43, 101, 171, 187, 8220, 8221, 0,6 , 0,6 , 0,6 , 418,10 , 156,8 , 808,22 , 37,5 , 8,10 , 10519,60 , 10579,83 , 10662,24 , 10519,60 , 10686,83 , 10662,24 , 5356,21 , 5377,56 , 5433,14 , 5356,21 , 5377,56 , 5433,14 , 0,2 , 0,2 , 562,4 , 566,17 , 583,23 , {75,90,84}, 236,1 , 9107,58 , 13,5 , 4,0 , 2830,10 , 2840,9 , 2, 1, 1, 6, 7 }, // Kazakh/Cyrillic/Kazakhstan
- { 64, 7, 179, 44, 46, 59, 37, 48, 45, 43, 101, 171, 187, 8216, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 53,10 , 63,17 , 37,5 , 8,10 , 10769,60 , 10829,101 , 158,27 , 10769,60 , 10829,101 , 158,27 , 5447,35 , 5482,84 , 85,14 , 5447,35 , 5482,84 , 85,14 , 0,2 , 0,2 , 45,4 , 5,17 , 22,23 , {82,87,70}, 179,2 , 0,7 , 8,5 , 4,0 , 2849,11 , 2860,8 , 0, 0, 1, 6, 7 }, // Kinyarwanda/Latin/Rwanda
- { 65, 2, 116, 44, 160, 59, 37, 48, 45, 43, 101, 171, 187, 8222, 8220, 0,6 , 0,6 , 428,10 , 428,10 , 269,6 , 830,23 , 37,5 , 8,10 , 10930,48 , 10978,80 , 11058,24 , 11082,59 , 11141,80 , 11058,24 , 5566,38 , 5604,57 , 5661,14 , 5566,38 , 5604,57 , 5661,14 , 124,5 , 117,14 , 562,4 , 606,18 , 22,23 , {75,71,83}, 237,3 , 9165,52 , 13,5 , 4,0 , 2868,8 , 2876,10 , 2, 1, 1, 6, 7 }, // Kirghiz/Cyrillic/Kyrgyzstan
- { 66, 22, 114, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 438,7 , 438,7 , 853,9 , 862,16 , 382,7 , 389,13 , 11221,39 , 11221,39 , 11221,39 , 11221,39 , 11221,39 , 11221,39 , 5675,14 , 5689,28 , 5675,14 , 5675,14 , 5689,28 , 5675,14 , 129,2 , 131,2 , 624,3 , 5,17 , 22,23 , {75,82,87}, 240,1 , 9217,19 , 4,4 , 4,0 , 2886,3 , 2889,4 , 0, 0, 7, 6, 7 }, // Korean/Korean/South Korea
- { 66, 22, 113, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 438,7 , 438,7 , 853,9 , 862,16 , 382,7 , 389,13 , 11221,39 , 11221,39 , 11221,39 , 11221,39 , 11221,39 , 11221,39 , 5675,14 , 5689,28 , 5675,14 , 5675,14 , 5689,28 , 5675,14 , 129,2 , 131,2 , 624,3 , 5,17 , 22,23 , {75,80,87}, 240,1 , 9236,39 , 4,4 , 4,0 , 2886,3 , 2893,11 , 0, 0, 1, 6, 7 }, // Korean/Korean/North Korea
- { 67, 7, 217, 44, 46, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 445,7 , 445,7 , 53,10 , 63,17 , 37,5 , 8,10 , 11260,48 , 11308,88 , 11396,24 , 11260,48 , 11420,101 , 11396,24 , 5717,20 , 5737,42 , 5779,14 , 5717,20 , 5737,42 , 5779,14 , 0,2 , 0,2 , 45,4 , 5,17 , 22,23 , {84,82,89}, 241,1 , 0,7 , 13,5 , 4,0 , 2904,5 , 2909,7 , 2, 1, 1, 6, 7 }, // Kurdish/Latin/Turkey
- { 68, 7, 35, 44, 46, 59, 37, 48, 45, 43, 101, 8221, 8221, 8217, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 415,8 , 97,16 , 37,5 , 8,10 , 11521,60 , 11581,106 , 158,27 , 11521,60 , 11581,106 , 158,27 , 5793,34 , 5827,89 , 85,14 , 5793,34 , 5827,89 , 85,14 , 131,5 , 133,5 , 45,4 , 5,17 , 22,23 , {66,73,70}, 159,3 , 9275,27 , 0,4 , 4,0 , 2916,8 , 2924,8 , 0, 0, 1, 6, 7 }, // Rundi/Latin/Burundi
- { 69, 23, 117, 44, 46, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 0,6 , 452,9 , 415,8 , 878,19 , 55,4 , 402,24 , 11687,61 , 11748,75 , 158,27 , 11687,61 , 11748,75 , 158,27 , 5916,36 , 5952,57 , 6009,17 , 5916,36 , 5952,57 , 6009,17 , 136,8 , 138,8 , 45,4 , 5,17 , 22,23 , {76,65,75}, 242,1 , 9302,21 , 4,4 , 36,5 , 2932,3 , 2932,3 , 0, 0, 7, 6, 7 }, // Lao/Lao/Laos
- { 71, 7, 118, 44, 160, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 461,8 , 461,8 , 156,8 , 897,26 , 37,5 , 8,10 , 11823,65 , 11888,101 , 134,24 , 11823,65 , 11888,101 , 134,24 , 6026,51 , 6077,72 , 6149,14 , 6163,51 , 6214,72 , 6149,14 , 144,14 , 146,11 , 627,5 , 5,17 , 22,23 , {69,85,82}, 14,1 , 9323,23 , 13,5 , 4,0 , 2935,8 , 2943,7 , 2, 1, 1, 6, 7 }, // Latvian/Latin/Latvia
- { 72, 7, 49, 44, 46, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 469,9 , 469,9 , 415,8 , 97,16 , 37,5 , 8,10 , 11989,48 , 12037,203 , 12240,24 , 11989,48 , 12037,203 , 12240,24 , 6286,28 , 6314,100 , 6414,14 , 6286,28 , 6314,100 , 6414,14 , 158,8 , 157,6 , 45,4 , 5,17 , 22,23 , {67,68,70}, 209,2 , 9346,23 , 13,5 , 4,0 , 2950,7 , 2957,30 , 2, 1, 1, 6, 7 }, // Lingala/Latin/Congo Kinshasa
- { 72, 7, 6, 44, 46, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 469,9 , 469,9 , 415,8 , 97,16 , 37,5 , 8,10 , 11989,48 , 12037,203 , 12240,24 , 11989,48 , 12037,203 , 12240,24 , 6286,28 , 6314,100 , 6414,14 , 6286,28 , 6314,100 , 6414,14 , 158,8 , 157,6 , 45,4 , 5,17 , 22,23 , {65,79,65}, 243,2 , 9369,23 , 13,5 , 4,0 , 2950,7 , 2987,6 , 2, 1, 1, 6, 7 }, // Lingala/Latin/Angola
- { 72, 7, 41, 44, 46, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 469,9 , 469,9 , 415,8 , 97,16 , 37,5 , 8,10 , 11989,48 , 12037,203 , 12240,24 , 11989,48 , 12037,203 , 12240,24 , 6286,28 , 6314,100 , 6414,14 , 6286,28 , 6314,100 , 6414,14 , 158,8 , 157,6 , 45,4 , 5,17 , 22,23 , {88,65,70}, 32,4 , 9392,23 , 13,5 , 4,0 , 2950,7 , 2993,26 , 0, 0, 1, 6, 7 }, // Lingala/Latin/Central African Republic
- { 72, 7, 50, 44, 46, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 469,9 , 469,9 , 415,8 , 97,16 , 37,5 , 8,10 , 11989,48 , 12037,203 , 12240,24 , 11989,48 , 12037,203 , 12240,24 , 6286,28 , 6314,100 , 6414,14 , 6286,28 , 6314,100 , 6414,14 , 158,8 , 157,6 , 45,4 , 5,17 , 22,23 , {88,65,70}, 32,4 , 9392,23 , 13,5 , 4,0 , 2950,7 , 3019,5 , 0, 0, 1, 6, 7 }, // Lingala/Latin/Congo Brazzaville
- { 73, 7, 124, 44, 160, 59, 37, 48, 8722, 43, 101, 8222, 8220, 8222, 8220, 0,6 , 0,6 , 478,8 , 478,8 , 53,10 , 923,27 , 37,5 , 8,10 , 12264,70 , 12334,96 , 12430,24 , 12264,70 , 12454,98 , 12430,24 , 6428,21 , 6449,89 , 6538,14 , 6428,21 , 6449,89 , 6538,14 , 166,9 , 163,6 , 632,6 , 5,17 , 22,23 , {69,85,82}, 14,1 , 9415,30 , 13,5 , 4,0 , 3024,8 , 3032,7 , 2, 1, 1, 6, 7 }, // Lithuanian/Latin/Lithuania
- { 74, 2, 127, 44, 46, 59, 37, 48, 45, 43, 101, 8222, 8220, 8218, 8216, 0,6 , 0,6 , 116,7 , 116,7 , 950,7 , 553,18 , 37,5 , 8,10 , 12552,61 , 12613,85 , 12698,24 , 12552,61 , 12613,85 , 12698,24 , 6552,35 , 6587,54 , 1503,14 , 6641,34 , 6587,54 , 1503,14 , 175,10 , 169,8 , 638,5 , 5,17 , 22,23 , {77,75,68}, 245,3 , 9445,56 , 13,5 , 4,0 , 3039,10 , 3049,18 , 2, 1, 1, 6, 7 }, // Macedonian/Cyrillic/Macedonia
- { 75, 7, 128, 46, 44, 59, 37, 48, 45, 43, 101, 171, 187, 8220, 8221, 0,6 , 0,6 , 0,6 , 0,6 , 53,10 , 97,16 , 37,5 , 8,10 , 12722,48 , 12770,92 , 134,24 , 12722,48 , 12770,92 , 134,24 , 6675,34 , 6709,60 , 6769,14 , 6675,34 , 6709,60 , 6769,14 , 0,2 , 0,2 , 45,4 , 5,17 , 22,23 , {77,71,65}, 169,2 , 9501,13 , 8,5 , 4,0 , 3067,8 , 3075,12 , 0, 0, 1, 6, 7 }, // Malagasy/Latin/Madagascar
- { 76, 7, 130, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 356,9 , 356,9 , 571,7 , 10,17 , 18,7 , 25,12 , 12862,48 , 12910,82 , 12992,24 , 12862,48 , 12910,82 , 12992,24 , 6783,28 , 6811,43 , 6854,14 , 6783,28 , 6811,43 , 6854,14 , 185,2 , 177,3 , 643,4 , 5,17 , 22,23 , {77,89,82}, 173,2 , 9514,39 , 4,4 , 4,0 , 3087,6 , 1250,8 , 2, 1, 1, 6, 7 }, // Malay/Latin/Malaysia
- { 76, 1, 130, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 53,10 , 63,17 , 37,5 , 8,10 , 368,48 , 368,48 , 158,27 , 368,48 , 368,48 , 158,27 , 0,28 , 0,28 , 85,14 , 0,28 , 0,28 , 85,14 , 0,2 , 0,2 , 45,4 , 5,17 , 22,23 , {77,89,82}, 173,2 , 0,7 , 8,5 , 4,0 , 0,0 , 0,0 , 2, 1, 1, 6, 7 }, // Malay/Arabic/Malaysia
- { 76, 7, 32, 44, 46, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 356,9 , 356,9 , 571,7 , 957,12 , 18,7 , 25,12 , 12862,48 , 12910,82 , 12992,24 , 12862,48 , 12910,82 , 12992,24 , 6783,28 , 6811,43 , 6854,14 , 6783,28 , 6811,43 , 6854,14 , 185,2 , 177,3 , 643,4 , 5,17 , 22,23 , {66,78,68}, 6,1 , 9553,31 , 8,5 , 4,0 , 3087,6 , 3093,6 , 2, 1, 1, 6, 7 }, // Malay/Latin/Brunei
- { 76, 7, 190, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 356,9 , 356,9 , 571,7 , 10,17 , 18,7 , 25,12 , 12862,48 , 12910,82 , 12992,24 , 12862,48 , 12910,82 , 12992,24 , 6783,28 , 6811,43 , 6854,14 , 6783,28 , 6811,43 , 6854,14 , 185,2 , 177,3 , 643,4 , 5,17 , 22,23 , {83,71,68}, 6,1 , 9584,37 , 4,4 , 4,0 , 3087,6 , 3099,9 , 2, 1, 7, 6, 7 }, // Malay/Latin/Singapore
- { 77, 24, 100, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 486,13 , 499,12 , 269,6 , 969,18 , 18,7 , 25,12 , 13016,62 , 13078,88 , 13166,32 , 13016,62 , 13078,88 , 13166,32 , 6868,41 , 6909,77 , 6986,22 , 6868,41 , 7008,76 , 7084,21 , 0,2 , 0,2 , 647,6 , 653,27 , 22,23 , {73,78,82}, 121,1 , 9621,40 , 4,4 , 4,0 , 3108,6 , 3114,6 , 2, 1, 7, 7, 7 }, // Malayalam/Malayalam/India
- { 78, 7, 133, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 511,8 , 519,7 , 119,10 , 987,23 , 37,5 , 8,10 , 13198,48 , 13246,86 , 13332,36 , 13198,48 , 13246,86 , 13368,24 , 7105,28 , 7133,63 , 7196,21 , 7105,28 , 7133,63 , 7217,20 , 0,2 , 0,2 , 45,4 , 5,17 , 22,23 , {69,85,82}, 14,1 , 9661,27 , 4,4 , 4,0 , 3120,5 , 1258,5 , 2, 1, 7, 6, 7 }, // Maltese/Latin/Malta
- { 79, 7, 154, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 53,10 , 63,17 , 426,4 , 25,12 , 13392,59 , 13451,133 , 13584,24 , 13392,59 , 13451,133 , 13584,24 , 7237,27 , 7264,47 , 7311,14 , 7237,27 , 7264,47 , 7311,14 , 0,2 , 0,2 , 45,4 , 5,17 , 22,23 , {78,90,68}, 6,1 , 9688,41 , 8,5 , 4,0 , 3125,5 , 3130,8 , 2, 1, 1, 6, 7 }, // Maori/Latin/New Zealand
- { 80, 13, 100, 46, 44, 59, 37, 2406, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 526,9 , 526,9 , 269,6 , 192,18 , 18,7 , 25,12 , 13608,66 , 13674,86 , 13760,32 , 13608,66 , 13674,86 , 13760,32 , 7325,32 , 7357,53 , 4362,19 , 7325,32 , 7357,53 , 4362,19 , 187,5 , 180,4 , 494,4 , 5,17 , 22,23 , {73,78,82}, 121,1 , 9729,43 , 4,4 , 4,0 , 3138,5 , 2667,4 , 2, 1, 7, 7, 7 }, // Marathi/Devanagari/India
- { 82, 2, 143, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 1010,10 , 1020,16 , 37,5 , 87,12 , 13792,99 , 13891,192 , 14083,38 , 13792,99 , 14121,192 , 14083,38 , 7410,21 , 7431,43 , 7410,21 , 7410,21 , 7474,43 , 7410,21 , 192,4 , 184,4 , 562,4 , 680,17 , 22,23 , {77,78,84}, 248,1 , 9772,25 , 8,5 , 4,0 , 3143,6 , 3149,6 , 2, 0, 1, 6, 7 }, // Mongolian/Cyrillic/Mongolia
- { 82, 8, 44, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 53,10 , 63,17 , 37,5 , 8,10 , 368,48 , 368,48 , 158,27 , 368,48 , 368,48 , 158,27 , 0,28 , 0,28 , 85,14 , 0,28 , 0,28 , 85,14 , 0,2 , 0,2 , 45,4 , 5,17 , 22,23 , {67,78,89}, 249,3 , 0,7 , 8,5 , 4,0 , 0,0 , 0,0 , 2, 1, 7, 6, 7 }, // Mongolian/Mongolian/China
- { 84, 13, 150, 46, 44, 59, 37, 2406, 45, 43, 101, 8220, 8221, 8216, 8217, 535,5 , 0,6 , 540,7 , 540,7 , 227,6 , 63,17 , 37,5 , 8,10 , 14313,85 , 14313,85 , 14398,53 , 14313,85 , 14313,85 , 14451,52 , 7517,33 , 7550,54 , 7604,18 , 7517,33 , 7550,54 , 7604,18 , 196,9 , 188,7 , 494,4 , 697,19 , 22,23 , {78,80,82}, 252,4 , 9797,49 , 8,5 , 4,0 , 3155,6 , 3161,5 , 2, 1, 7, 6, 7 }, // Nepali/Devanagari/Nepal
- { 84, 13, 100, 46, 44, 59, 37, 2406, 45, 43, 101, 8220, 8221, 8216, 8217, 535,5 , 0,6 , 540,7 , 540,7 , 227,6 , 63,17 , 18,7 , 25,12 , 14313,85 , 14313,85 , 14398,53 , 14313,85 , 14313,85 , 14451,52 , 7517,33 , 7550,54 , 7604,18 , 7517,33 , 7550,54 , 7604,18 , 196,9 , 188,7 , 494,4 , 697,19 , 22,23 , {73,78,82}, 121,1 , 9846,49 , 8,5 , 4,0 , 3155,6 , 2667,4 , 2, 1, 7, 7, 7 }, // Nepali/Devanagari/India
- { 85, 7, 161, 44, 160, 59, 37, 48, 8722, 43, 101, 171, 187, 8216, 8217, 0,6 , 0,6 , 192,8 , 192,8 , 495,10 , 478,17 , 228,5 , 233,10 , 5656,48 , 14503,83 , 134,24 , 5787,59 , 14503,83 , 134,24 , 2307,35 , 2242,51 , 2293,14 , 2307,35 , 2242,51 , 2293,14 , 64,4 , 61,4 , 45,4 , 5,17 , 22,23 , {78,79,75}, 189,2 , 9895,44 , 8,5 , 4,0 , 3166,12 , 3178,5 , 2, 0, 1, 6, 7 }, // Norwegian Bokmal/Latin/Norway
- { 85, 7, 203, 44, 160, 59, 37, 48, 8722, 43, 101, 171, 187, 8216, 8217, 0,6 , 0,6 , 192,8 , 192,8 , 495,10 , 478,17 , 228,5 , 233,10 , 5656,48 , 14503,83 , 134,24 , 5787,59 , 14503,83 , 134,24 , 2307,35 , 2242,51 , 2293,14 , 2307,35 , 2242,51 , 2293,14 , 64,4 , 61,4 , 45,4 , 5,17 , 22,23 , {78,79,75}, 189,2 , 9895,44 , 8,5 , 4,0 , 3166,12 , 3183,21 , 2, 0, 1, 6, 7 }, // Norwegian Bokmal/Latin/Svalbard And Jan Mayen Islands
- { 86, 7, 74, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 53,10 , 63,17 , 37,5 , 8,10 , 368,48 , 368,48 , 158,27 , 368,48 , 368,48 , 158,27 , 0,28 , 0,28 , 85,14 , 0,28 , 0,28 , 85,14 , 0,2 , 0,2 , 45,4 , 5,17 , 22,23 , {69,85,82}, 14,1 , 0,7 , 8,5 , 4,0 , 0,0 , 0,0 , 2, 1, 1, 6, 7 }, // Occitan/Latin/France
- { 87, 26, 100, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 547,8 , 555,7 , 547,6 , 35,18 , 18,7 , 25,12 , 14586,86 , 14586,86 , 14672,32 , 14586,86 , 14586,86 , 14672,32 , 7622,33 , 7655,54 , 7709,18 , 7622,33 , 7655,54 , 7709,18 , 0,2 , 0,2 , 716,5 , 5,17 , 22,23 , {73,78,82}, 121,1 , 9939,43 , 4,4 , 4,0 , 3204,5 , 3209,4 , 2, 1, 7, 7, 7 }, // Oriya/Oriya/India
- { 88, 1, 1, 1643, 1644, 1563, 1642, 1776, 45, 43, 101, 8220, 8221, 8216, 8217, 46,6 , 46,6 , 562,9 , 571,8 , 394,8 , 1036,20 , 55,4 , 430,11 , 14704,68 , 14772,69 , 158,27 , 14841,69 , 14841,69 , 14910,24 , 7727,39 , 7727,39 , 85,14 , 7727,39 , 7727,39 , 85,14 , 205,4 , 195,4 , 721,5 , 5,17 , 22,23 , {65,70,78}, 256,1 , 9982,25 , 13,5 , 4,0 , 3213,4 , 3217,9 , 0, 0, 6, 4, 5 }, // Pashto/Arabic/Afghanistan
- { 88, 1, 163, 1643, 1644, 1563, 1642, 1776, 45, 43, 101, 8220, 8221, 8216, 8217, 46,6 , 46,6 , 562,9 , 571,8 , 394,8 , 1036,20 , 18,7 , 25,12 , 14704,68 , 14772,69 , 158,27 , 14841,69 , 14841,69 , 14910,24 , 7727,39 , 7727,39 , 85,14 , 7727,39 , 7727,39 , 85,14 , 205,4 , 195,4 , 721,5 , 5,17 , 22,23 , {80,75,82}, 175,2 , 10007,52 , 13,5 , 4,0 , 3213,4 , 3226,7 , 2, 0, 7, 6, 7 }, // Pashto/Arabic/Pakistan
- { 89, 1, 102, 1643, 1644, 1563, 1642, 1776, 45, 43, 101, 171, 187, 8249, 8250, 579,7 , 579,7 , 586,8 , 594,7 , 394,8 , 97,16 , 55,4 , 430,11 , 14934,70 , 14934,70 , 15004,24 , 15028,74 , 15028,74 , 15004,24 , 7766,49 , 7766,49 , 7815,14 , 7766,49 , 7766,49 , 7815,14 , 209,9 , 199,8 , 726,4 , 730,44 , 22,23 , {73,82,82}, 257,4 , 10059,37 , 78,5 , 4,0 , 3233,5 , 3238,5 , 0, 0, 6, 5, 5 }, // Persian/Arabic/Iran
- { 89, 1, 1, 1643, 1644, 1563, 1642, 1776, 45, 43, 101, 171, 187, 8249, 8250, 579,7 , 579,7 , 586,8 , 594,7 , 394,8 , 97,16 , 55,4 , 430,11 , 15102,68 , 15102,68 , 14910,24 , 15170,62 , 15102,68 , 14910,24 , 7766,49 , 7766,49 , 7815,14 , 7766,49 , 7766,49 , 7815,14 , 209,9 , 199,8 , 726,4 , 730,44 , 22,23 , {65,70,78}, 256,1 , 10096,55 , 8,5 , 4,0 , 3243,3 , 3217,9 , 0, 0, 6, 4, 5 }, // Persian/Arabic/Afghanistan
- { 90, 7, 172, 44, 160, 59, 37, 48, 45, 43, 101, 8222, 8221, 171, 187, 0,6 , 0,6 , 163,7 , 163,7 , 495,10 , 10,17 , 37,5 , 8,10 , 15232,48 , 15280,97 , 15377,24 , 15232,48 , 15401,99 , 15500,24 , 7829,34 , 7863,59 , 7922,14 , 7829,34 , 7863,59 , 7936,14 , 0,2 , 0,2 , 303,5 , 5,17 , 22,23 , {80,76,78}, 261,2 , 10151,77 , 13,5 , 4,0 , 3246,6 , 3252,6 , 2, 1, 1, 6, 7 }, // Polish/Latin/Poland
- { 91, 7, 30, 44, 46, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 254,7 , 254,7 , 119,10 , 669,27 , 37,5 , 8,10 , 15524,48 , 15572,89 , 134,24 , 15524,48 , 15572,89 , 134,24 , 7950,28 , 7978,79 , 8057,14 , 7950,28 , 7978,79 , 8057,14 , 0,2 , 0,2 , 0,5 , 5,17 , 22,23 , {66,82,76}, 263,2 , 10228,54 , 8,5 , 4,0 , 3258,9 , 3267,6 , 2, 1, 7, 6, 7 }, // Portuguese/Latin/Brazil
- { 91, 7, 6, 44, 160, 59, 37, 48, 45, 43, 101, 171, 187, 8220, 8221, 0,6 , 0,6 , 254,7 , 254,7 , 27,8 , 669,27 , 37,5 , 8,10 , 15524,48 , 15572,89 , 134,24 , 15524,48 , 15572,89 , 134,24 , 8071,49 , 7978,79 , 8057,14 , 8071,49 , 7978,79 , 8057,14 , 218,8 , 207,8 , 0,5 , 5,17 , 22,23 , {65,79,65}, 243,2 , 10282,54 , 13,5 , 4,0 , 3258,9 , 3273,6 , 2, 1, 1, 6, 7 }, // Portuguese/Latin/Angola
- { 91, 7, 39, 44, 160, 59, 37, 48, 45, 43, 101, 171, 187, 8220, 8221, 0,6 , 0,6 , 254,7 , 254,7 , 27,8 , 669,27 , 37,5 , 8,10 , 15524,48 , 15572,89 , 134,24 , 15524,48 , 15572,89 , 134,24 , 8071,49 , 7978,79 , 8057,14 , 8071,49 , 7978,79 , 8057,14 , 218,8 , 207,8 , 0,5 , 5,17 , 22,23 , {67,86,69}, 265,1 , 10336,69 , 13,5 , 4,0 , 3258,9 , 3279,10 , 2, 1, 1, 6, 7 }, // Portuguese/Latin/Cape Verde
- { 91, 7, 62, 44, 160, 59, 37, 48, 45, 43, 101, 171, 187, 8220, 8221, 0,6 , 0,6 , 254,7 , 254,7 , 27,8 , 669,27 , 37,5 , 8,10 , 15524,48 , 15572,89 , 134,24 , 15524,48 , 15572,89 , 134,24 , 8071,49 , 7978,79 , 8057,14 , 8071,49 , 7978,79 , 8057,14 , 218,8 , 207,8 , 0,5 , 5,17 , 22,23 , {85,83,68}, 155,3 , 10405,81 , 13,5 , 4,0 , 3258,9 , 3289,11 , 2, 1, 1, 6, 7 }, // Portuguese/Latin/East Timor
- { 91, 7, 66, 44, 160, 59, 37, 48, 45, 43, 101, 171, 187, 8220, 8221, 0,6 , 0,6 , 254,7 , 254,7 , 27,8 , 669,27 , 37,5 , 8,10 , 15524,48 , 15572,89 , 134,24 , 15524,48 , 15572,89 , 134,24 , 8071,49 , 7978,79 , 8057,14 , 8071,49 , 7978,79 , 8057,14 , 218,8 , 207,8 , 0,5 , 5,17 , 22,23 , {88,65,70}, 32,4 , 10486,59 , 13,5 , 4,0 , 3258,9 , 3300,16 , 0, 0, 1, 6, 7 }, // Portuguese/Latin/Equatorial Guinea
- { 91, 7, 92, 44, 160, 59, 37, 48, 45, 43, 101, 171, 187, 8220, 8221, 0,6 , 0,6 , 254,7 , 254,7 , 27,8 , 669,27 , 37,5 , 8,10 , 15524,48 , 15572,89 , 134,24 , 15524,48 , 15572,89 , 134,24 , 8071,49 , 7978,79 , 8057,14 , 8071,49 , 7978,79 , 8057,14 , 218,8 , 207,8 , 0,5 , 5,17 , 22,23 , {88,79,70}, 206,3 , 10545,62 , 13,5 , 4,0 , 3258,9 , 3316,12 , 0, 0, 1, 6, 7 }, // Portuguese/Latin/Guinea Bissau
- { 91, 7, 125, 44, 160, 59, 37, 48, 45, 43, 101, 171, 187, 8220, 8221, 0,6 , 0,6 , 254,7 , 254,7 , 27,8 , 669,27 , 37,5 , 8,10 , 15524,48 , 15572,89 , 134,24 , 15524,48 , 15572,89 , 134,24 , 8071,49 , 7978,79 , 8057,14 , 8071,49 , 7978,79 , 8057,14 , 218,8 , 207,8 , 0,5 , 5,17 , 22,23 , {69,85,82}, 14,1 , 3102,20 , 13,5 , 4,0 , 3258,9 , 3328,10 , 2, 1, 1, 6, 7 }, // Portuguese/Latin/Luxembourg
- { 91, 7, 126, 44, 160, 59, 37, 48, 45, 43, 101, 171, 187, 8220, 8221, 0,6 , 0,6 , 254,7 , 254,7 , 27,8 , 669,27 , 18,7 , 25,12 , 15524,48 , 15572,89 , 134,24 , 15524,48 , 15572,89 , 134,24 , 8071,49 , 7978,79 , 8057,14 , 8071,49 , 7978,79 , 8057,14 , 218,8 , 207,8 , 0,5 , 5,17 , 22,23 , {77,79,80}, 134,4 , 10607,53 , 13,5 , 4,0 , 3258,9 , 3338,19 , 2, 1, 7, 6, 7 }, // Portuguese/Latin/Macau
- { 91, 7, 146, 44, 160, 59, 37, 48, 45, 43, 101, 171, 187, 8220, 8221, 0,6 , 0,6 , 254,7 , 254,7 , 27,8 , 669,27 , 37,5 , 8,10 , 15524,48 , 15572,89 , 134,24 , 15524,48 , 15572,89 , 134,24 , 8071,49 , 7978,79 , 8057,14 , 8071,49 , 7978,79 , 8057,14 , 218,8 , 207,8 , 0,5 , 5,17 , 22,23 , {77,90,78}, 266,3 , 10660,66 , 13,5 , 4,0 , 3258,9 , 3357,10 , 2, 1, 7, 6, 7 }, // Portuguese/Latin/Mozambique
- { 91, 7, 173, 44, 160, 59, 37, 48, 45, 43, 101, 171, 187, 8220, 8221, 0,6 , 0,6 , 254,7 , 254,7 , 27,8 , 669,27 , 37,5 , 8,10 , 15524,48 , 15572,89 , 134,24 , 15524,48 , 15572,89 , 134,24 , 8071,49 , 7978,79 , 8057,14 , 8071,49 , 7978,79 , 8057,14 , 218,8 , 207,8 , 0,5 , 5,17 , 22,23 , {69,85,82}, 14,1 , 3102,20 , 13,5 , 4,0 , 3367,17 , 3384,8 , 2, 1, 7, 6, 7 }, // Portuguese/Latin/Portugal
- { 91, 7, 185, 44, 160, 59, 37, 48, 45, 43, 101, 171, 187, 8220, 8221, 0,6 , 0,6 , 254,7 , 254,7 , 27,8 , 669,27 , 37,5 , 8,10 , 15524,48 , 15572,89 , 134,24 , 15524,48 , 15572,89 , 134,24 , 8071,49 , 7978,79 , 8057,14 , 8071,49 , 7978,79 , 8057,14 , 218,8 , 207,8 , 0,5 , 5,17 , 22,23 , {83,84,78}, 269,2 , 10726,92 , 13,5 , 4,0 , 3258,9 , 3392,19 , 2, 1, 1, 6, 7 }, // Portuguese/Latin/Sao Tome And Principe
- { 91, 7, 206, 44, 160, 59, 37, 48, 45, 43, 101, 171, 187, 8220, 8221, 0,6 , 0,6 , 254,7 , 254,7 , 27,8 , 669,27 , 37,5 , 8,10 , 15524,48 , 15572,89 , 134,24 , 15524,48 , 15572,89 , 134,24 , 8071,49 , 7978,79 , 8057,14 , 8071,49 , 7978,79 , 8057,14 , 218,8 , 207,8 , 0,5 , 5,17 , 22,23 , {67,72,70}, 225,3 , 10818,45 , 13,5 , 4,0 , 3258,9 , 3411,5 , 2, 0, 1, 6, 7 }, // Portuguese/Latin/Switzerland
- { 92, 4, 100, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 601,9 , 601,9 , 269,6 , 10,17 , 18,7 , 25,12 , 15661,50 , 15711,68 , 15779,28 , 15661,50 , 15711,68 , 15779,28 , 8120,36 , 8156,57 , 8213,23 , 8120,36 , 8156,57 , 8213,23 , 226,6 , 215,6 , 774,4 , 5,17 , 22,23 , {73,78,82}, 121,1 , 10863,39 , 4,4 , 4,0 , 3416,6 , 3422,4 , 2, 1, 7, 7, 7 }, // Punjabi/Gurmukhi/India
- { 92, 1, 163, 1643, 1644, 1563, 1642, 1776, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 119,10 , 553,18 , 18,7 , 25,12 , 15807,67 , 15807,67 , 158,27 , 15807,67 , 15807,67 , 158,27 , 8236,37 , 8236,37 , 85,14 , 8236,37 , 8236,37 , 85,14 , 0,2 , 0,2 , 45,4 , 5,17 , 22,23 , {80,75,82}, 271,1 , 10902,13 , 41,6 , 4,0 , 3426,6 , 3226,7 , 2, 0, 7, 6, 7 }, // Punjabi/Arabic/Pakistan
- { 93, 7, 169, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 119,10 , 192,18 , 37,5 , 8,10 , 15874,48 , 15922,88 , 158,27 , 15874,48 , 15922,88 , 158,27 , 8273,28 , 8301,53 , 8354,14 , 8273,28 , 8301,53 , 8354,14 , 64,4 , 61,4 , 45,4 , 5,17 , 22,23 , {80,69,78}, 272,2 , 0,7 , 8,5 , 4,0 , 3432,8 , 3440,4 , 2, 1, 7, 6, 7 }, // Quechua/Latin/Peru
- { 93, 7, 26, 44, 46, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 119,10 , 192,18 , 37,5 , 8,10 , 15874,48 , 15922,88 , 158,27 , 15874,48 , 15922,88 , 158,27 , 8273,28 , 8301,53 , 8354,14 , 8273,28 , 8301,53 , 8354,14 , 64,4 , 61,4 , 45,4 , 5,17 , 22,23 , {66,79,66}, 274,2 , 0,7 , 8,5 , 4,0 , 3432,8 , 3444,7 , 2, 1, 1, 6, 7 }, // Quechua/Latin/Bolivia
- { 93, 7, 63, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 119,10 , 192,18 , 37,5 , 8,10 , 15874,48 , 15922,88 , 158,27 , 15874,48 , 15922,88 , 158,27 , 8273,28 , 8301,53 , 8354,14 , 8273,28 , 8301,53 , 8354,14 , 64,4 , 61,4 , 45,4 , 5,17 , 22,23 , {85,83,68}, 6,1 , 0,7 , 8,5 , 4,0 , 3432,8 , 3451,7 , 2, 1, 1, 6, 7 }, // Quechua/Latin/Ecuador
- { 94, 7, 206, 46, 8217, 59, 37, 48, 8722, 43, 101, 171, 187, 8249, 8250, 0,6 , 0,6 , 0,6 , 0,6 , 339,8 , 1056,28 , 37,5 , 8,10 , 16010,67 , 16077,92 , 16169,24 , 16010,67 , 16077,92 , 16169,24 , 8368,23 , 8391,56 , 8447,14 , 8368,23 , 8391,56 , 8447,14 , 0,2 , 0,2 , 45,4 , 5,17 , 22,23 , {67,72,70}, 225,3 , 10915,46 , 13,5 , 4,0 , 3458,9 , 3467,6 , 2, 0, 1, 6, 7 }, // Romansh/Latin/Switzerland
- { 95, 7, 177, 44, 46, 59, 37, 48, 45, 43, 101, 8222, 8221, 171, 187, 0,6 , 0,6 , 610,8 , 610,8 , 495,10 , 10,17 , 37,5 , 8,10 , 16193,60 , 16253,98 , 16351,24 , 16193,60 , 16253,98 , 16351,24 , 8461,34 , 8495,48 , 3080,14 , 8461,34 , 8495,48 , 3080,14 , 64,4 , 61,4 , 778,4 , 5,17 , 22,23 , {82,79,78}, 276,3 , 10961,57 , 13,5 , 4,0 , 3473,6 , 3479,7 , 2, 1, 1, 6, 7 }, // Romanian/Latin/Romania
- { 95, 7, 141, 44, 46, 59, 37, 48, 45, 43, 101, 8222, 8221, 171, 187, 0,6 , 0,6 , 610,8 , 610,8 , 495,10 , 10,17 , 37,5 , 8,10 , 16193,60 , 16253,98 , 16351,24 , 16193,60 , 16253,98 , 16351,24 , 8543,28 , 8495,48 , 8571,16 , 8543,28 , 8495,48 , 8571,16 , 64,4 , 61,4 , 778,4 , 5,17 , 22,23 , {77,68,76}, 279,1 , 11018,69 , 13,5 , 4,0 , 3473,6 , 3486,17 , 2, 1, 1, 6, 7 }, // Romanian/Latin/Moldova
- { 96, 2, 178, 44, 160, 59, 37, 48, 45, 43, 101, 171, 187, 8222, 8220, 0,6 , 0,6 , 116,7 , 116,7 , 495,10 , 317,22 , 37,5 , 8,10 , 16375,62 , 11141,80 , 11058,24 , 16437,62 , 16499,82 , 11058,24 , 8587,21 , 8608,62 , 8670,14 , 8587,21 , 8608,62 , 8587,21 , 0,2 , 0,2 , 246,5 , 680,17 , 22,23 , {82,85,66}, 123,1 , 11087,89 , 13,5 , 4,0 , 3503,7 , 3510,6 , 2, 1, 1, 6, 7 }, // Russian/Cyrillic/Russia
- { 96, 2, 20, 44, 160, 59, 37, 48, 45, 43, 101, 171, 187, 8222, 8220, 0,6 , 0,6 , 116,7 , 116,7 , 495,10 , 317,22 , 37,5 , 8,10 , 16375,62 , 11141,80 , 11058,24 , 16437,62 , 16499,82 , 11058,24 , 8587,21 , 8608,62 , 8670,14 , 8587,21 , 8608,62 , 8587,21 , 0,2 , 0,2 , 246,5 , 680,17 , 22,23 , {66,89,78}, 0,2 , 11176,94 , 13,5 , 4,0 , 3503,7 , 511,8 , 2, 0, 1, 6, 7 }, // Russian/Cyrillic/Belarus
- { 96, 2, 110, 44, 160, 59, 37, 48, 45, 43, 101, 171, 187, 8222, 8220, 0,6 , 0,6 , 116,7 , 116,7 , 495,10 , 317,22 , 37,5 , 8,10 , 16375,62 , 11141,80 , 11058,24 , 16437,62 , 16499,82 , 11058,24 , 8587,21 , 8608,62 , 8670,14 , 8587,21 , 8608,62 , 8587,21 , 0,2 , 0,2 , 246,5 , 680,17 , 22,23 , {75,90,84}, 236,1 , 11270,83 , 13,5 , 4,0 , 3503,7 , 3516,9 , 2, 1, 1, 6, 7 }, // Russian/Cyrillic/Kazakhstan
- { 96, 2, 116, 44, 160, 59, 37, 48, 45, 43, 101, 171, 187, 8222, 8220, 0,6 , 0,6 , 116,7 , 116,7 , 495,10 , 317,22 , 37,5 , 8,10 , 16375,62 , 11141,80 , 11058,24 , 16437,62 , 16499,82 , 11058,24 , 8587,21 , 8608,62 , 8670,14 , 8587,21 , 8608,62 , 8587,21 , 0,2 , 0,2 , 246,5 , 680,17 , 22,23 , {75,71,83}, 237,3 , 11353,82 , 13,5 , 4,0 , 3503,7 , 3525,8 , 2, 1, 1, 6, 7 }, // Russian/Cyrillic/Kyrgyzstan
- { 96, 2, 141, 44, 160, 59, 37, 48, 45, 43, 101, 171, 187, 8222, 8220, 0,6 , 0,6 , 116,7 , 116,7 , 495,10 , 317,22 , 37,5 , 8,10 , 16375,62 , 11141,80 , 11058,24 , 16437,62 , 16499,82 , 11058,24 , 8587,21 , 8608,62 , 8670,14 , 8587,21 , 8608,62 , 8587,21 , 0,2 , 0,2 , 246,5 , 680,17 , 22,23 , {77,68,76}, 279,1 , 11435,79 , 13,5 , 4,0 , 3503,7 , 3533,7 , 2, 1, 1, 6, 7 }, // Russian/Cyrillic/Moldova
- { 96, 2, 222, 44, 160, 59, 37, 48, 45, 43, 101, 171, 187, 8222, 8220, 0,6 , 0,6 , 116,7 , 116,7 , 495,10 , 317,22 , 37,5 , 8,10 , 16375,62 , 11141,80 , 11058,24 , 16437,62 , 16499,82 , 11058,24 , 8587,21 , 8608,62 , 8670,14 , 8587,21 , 8608,62 , 8587,21 , 0,2 , 0,2 , 246,5 , 680,17 , 22,23 , {85,65,72}, 280,1 , 11514,92 , 13,5 , 4,0 , 3503,7 , 3540,7 , 2, 1, 1, 6, 7 }, // Russian/Cyrillic/Ukraine
- { 98, 7, 41, 44, 46, 59, 37, 48, 45, 43, 101, 171, 187, 8220, 8221, 0,6 , 0,6 , 0,6 , 0,6 , 415,8 , 97,16 , 37,5 , 8,10 , 16581,48 , 16629,91 , 16720,24 , 16581,48 , 16629,91 , 16720,24 , 8684,28 , 8712,66 , 8778,14 , 8684,28 , 8712,66 , 8778,14 , 232,2 , 221,2 , 45,4 , 5,17 , 22,23 , {88,65,70}, 32,4 , 11606,25 , 4,4 , 36,5 , 3547,5 , 3552,22 , 0, 0, 1, 6, 7 }, // Sango/Latin/Central African Republic
- { 99, 13, 100, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 53,10 , 63,17 , 37,5 , 8,10 , 368,48 , 368,48 , 158,27 , 368,48 , 368,48 , 158,27 , 0,28 , 0,28 , 85,14 , 0,28 , 0,28 , 85,14 , 0,2 , 0,2 , 45,4 , 5,17 , 22,23 , {73,78,82}, 121,1 , 0,7 , 8,5 , 4,0 , 0,0 , 0,0 , 2, 1, 7, 7, 7 }, // Sanskrit/Devanagari/India
- { 100, 2, 243, 44, 46, 59, 37, 48, 45, 43, 101, 8222, 8220, 8216, 8216, 0,6 , 0,6 , 116,7 , 116,7 , 1084,7 , 1091,20 , 37,5 , 8,10 , 16744,48 , 16792,81 , 12698,24 , 16744,48 , 16792,81 , 12698,24 , 8792,28 , 8820,52 , 8872,14 , 8792,28 , 8820,52 , 8872,14 , 234,9 , 223,8 , 782,7 , 5,17 , 22,23 , {82,83,68}, 0,0 , 11631,58 , 13,5 , 4,0 , 3574,6 , 3580,6 , 0, 0, 1, 6, 7 }, // Serbian/Cyrillic/Serbia
- { 100, 7, 27, 44, 46, 59, 37, 48, 45, 43, 101, 8222, 8220, 8216, 8216, 0,6 , 0,6 , 163,7 , 163,7 , 1084,7 , 1091,20 , 37,5 , 8,10 , 16873,50 , 16923,81 , 9742,24 , 17004,48 , 16923,81 , 9742,24 , 8886,26 , 8912,57 , 2102,14 , 8886,26 , 8912,57 , 2102,14 , 243,11 , 231,8 , 296,7 , 5,17 , 22,23 , {66,65,77}, 140,2 , 11689,174 , 13,5 , 4,0 , 3586,6 , 630,19 , 2, 1, 1, 6, 7 }, // Serbian/Latin/Bosnia And Herzegowina
- { 100, 7, 242, 44, 46, 59, 37, 48, 45, 43, 101, 8222, 8220, 8216, 8216, 0,6 , 0,6 , 163,7 , 163,7 , 1084,7 , 1091,20 , 37,5 , 8,10 , 17052,58 , 16923,81 , 9742,24 , 17052,58 , 16923,81 , 9742,24 , 8969,33 , 8912,57 , 2102,14 , 8969,33 , 8912,57 , 2102,14 , 243,11 , 231,8 , 296,7 , 5,17 , 22,23 , {69,85,82}, 14,1 , 11863,23 , 13,5 , 4,0 , 3586,6 , 3592,9 , 2, 1, 1, 6, 7 }, // Serbian/Latin/Montenegro
- { 100, 7, 243, 44, 46, 59, 37, 48, 45, 43, 101, 8222, 8220, 8216, 8216, 0,6 , 0,6 , 163,7 , 163,7 , 1084,7 , 1091,20 , 37,5 , 8,10 , 17004,48 , 16923,81 , 9742,24 , 17004,48 , 16923,81 , 9742,24 , 9002,28 , 9030,54 , 2102,14 , 9002,28 , 9030,54 , 2102,14 , 254,9 , 231,8 , 296,7 , 5,17 , 22,23 , {82,83,68}, 0,0 , 11886,58 , 13,5 , 4,0 , 3586,6 , 3601,6 , 0, 0, 1, 6, 7 }, // Serbian/Latin/Serbia
- { 100, 2, 27, 44, 46, 59, 37, 48, 45, 43, 101, 8222, 8220, 8216, 8216, 0,6 , 0,6 , 116,7 , 116,7 , 1084,7 , 1091,20 , 37,5 , 8,10 , 17110,50 , 16792,81 , 12698,24 , 16744,48 , 16792,81 , 12698,24 , 9084,26 , 9110,55 , 8872,14 , 9084,26 , 9110,55 , 8872,14 , 263,11 , 223,8 , 782,7 , 5,17 , 22,23 , {66,65,77}, 281,2 , 11944,174 , 13,5 , 4,0 , 3574,6 , 3607,19 , 2, 1, 1, 6, 7 }, // Serbian/Cyrillic/Bosnia And Herzegowina
- { 100, 2, 242, 44, 46, 59, 37, 48, 45, 43, 101, 8222, 8220, 8216, 8216, 0,6 , 0,6 , 116,7 , 116,7 , 1084,7 , 1091,20 , 37,5 , 8,10 , 17110,50 , 16792,81 , 12698,24 , 17110,50 , 16792,81 , 12698,24 , 8792,28 , 9110,55 , 8872,14 , 8792,28 , 9110,55 , 8872,14 , 263,11 , 223,8 , 782,7 , 5,17 , 22,23 , {69,85,82}, 14,1 , 12118,23 , 13,5 , 4,0 , 3574,6 , 3626,9 , 2, 1, 1, 6, 7 }, // Serbian/Cyrillic/Montenegro
- { 100, 2, 257, 44, 46, 59, 37, 48, 45, 43, 101, 8222, 8220, 8216, 8216, 0,6 , 0,6 , 116,7 , 116,7 , 1084,7 , 1091,20 , 37,5 , 8,10 , 17110,50 , 16792,81 , 12698,24 , 17110,50 , 16792,81 , 12698,24 , 8792,28 , 8820,52 , 8872,14 , 8792,28 , 8820,52 , 8872,14 , 234,9 , 223,8 , 782,7 , 5,17 , 22,23 , {69,85,82}, 14,1 , 12118,23 , 13,5 , 4,0 , 3574,6 , 3635,6 , 2, 1, 1, 6, 7 }, // Serbian/Cyrillic/Kosovo
- { 100, 7, 257, 44, 46, 59, 37, 48, 45, 43, 101, 8222, 8220, 8216, 8216, 0,6 , 0,6 , 163,7 , 163,7 , 1084,7 , 1091,20 , 37,5 , 8,10 , 17052,58 , 16923,81 , 9742,24 , 17052,58 , 16923,81 , 9742,24 , 8969,33 , 9030,54 , 2102,14 , 8969,33 , 9030,54 , 2102,14 , 254,9 , 231,8 , 296,7 , 5,17 , 22,23 , {69,85,82}, 14,1 , 11863,23 , 13,5 , 4,0 , 3586,6 , 3641,6 , 2, 1, 1, 6, 7 }, // Serbian/Latin/Kosovo
- { 101, 2, 81, 44, 160, 59, 37, 48, 45, 43, 101, 171, 187, 8222, 8220, 0,6 , 0,6 , 618,9 , 618,9 , 156,8 , 1111,23 , 37,5 , 8,10 , 17160,63 , 17223,82 , 11058,24 , 17305,60 , 17365,86 , 11058,24 , 9165,28 , 9193,61 , 9254,14 , 9268,28 , 9296,61 , 9254,14 , 274,15 , 239,15 , 45,4 , 5,17 , 22,23 , {71,69,76}, 224,1 , 12141,17 , 8,5 , 4,0 , 3647,4 , 3651,11 , 2, 1, 1, 6, 7 }, // Ossetic/Cyrillic/Georgia
- { 101, 2, 178, 44, 160, 59, 37, 48, 45, 43, 101, 171, 187, 8222, 8220, 0,6 , 0,6 , 618,9 , 618,9 , 156,8 , 1111,23 , 37,5 , 8,10 , 17160,63 , 17223,82 , 11058,24 , 17305,60 , 17365,86 , 11058,24 , 9165,28 , 9193,61 , 9254,14 , 9268,28 , 9296,61 , 9254,14 , 274,15 , 239,15 , 45,4 , 5,17 , 22,23 , {82,85,66}, 123,1 , 12158,17 , 8,5 , 4,0 , 3647,4 , 3662,6 , 2, 1, 1, 6, 7 }, // Ossetic/Cyrillic/Russia
- { 102, 7, 195, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 53,10 , 63,17 , 37,5 , 8,10 , 368,48 , 368,48 , 158,27 , 368,48 , 368,48 , 158,27 , 0,28 , 0,28 , 85,14 , 0,28 , 0,28 , 85,14 , 0,2 , 0,2 , 45,4 , 5,17 , 22,23 , {90,65,82}, 5,1 , 0,7 , 8,5 , 4,0 , 0,0 , 0,0 , 2, 1, 7, 6, 7 }, // Southern Sotho/Latin/South Africa
- { 103, 7, 195, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 53,10 , 63,17 , 37,5 , 8,10 , 368,48 , 368,48 , 158,27 , 368,48 , 368,48 , 158,27 , 0,28 , 0,28 , 85,14 , 0,28 , 0,28 , 85,14 , 0,2 , 0,2 , 45,4 , 5,17 , 22,23 , {90,65,82}, 5,1 , 0,7 , 8,5 , 4,0 , 0,0 , 0,0 , 2, 1, 7, 6, 7 }, // Tswana/Latin/South Africa
- { 104, 7, 240, 46, 44, 59, 37, 48, 45, 43, 101, 8221, 8221, 8217, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 53,10 , 63,17 , 37,5 , 8,10 , 17451,48 , 17499,100 , 17599,24 , 17451,48 , 17499,100 , 17599,24 , 9357,28 , 9385,55 , 9440,14 , 9357,28 , 9385,55 , 9440,14 , 0,2 , 0,2 , 45,4 , 5,17 , 22,23 , {85,83,68}, 155,3 , 12175,22 , 4,4 , 4,0 , 3668,8 , 1820,8 , 2, 1, 7, 6, 7 }, // Shona/Latin/Zimbabwe
- { 105, 1, 163, 1643, 1644, 1563, 37, 1632, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 627,8 , 635,7 , 53,10 , 63,17 , 18,7 , 25,12 , 17623,72 , 17623,72 , 134,24 , 17623,72 , 17623,72 , 134,24 , 9454,35 , 9454,35 , 9489,31 , 9454,35 , 9454,35 , 9489,31 , 289,11 , 254,11 , 789,6 , 795,61 , 22,23 , {80,75,82}, 175,2 , 12197,43 , 8,5 , 4,0 , 3676,4 , 3680,7 , 2, 0, 7, 6, 7 }, // Sindhi/Arabic/Pakistan
- { 106, 32, 198, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 642,9 , 651,8 , 53,10 , 63,17 , 228,5 , 233,10 , 17695,59 , 17754,96 , 17850,32 , 17882,61 , 17754,96 , 17850,32 , 9520,39 , 9559,62 , 9621,19 , 9520,39 , 9559,62 , 9621,19 , 300,5 , 265,4 , 856,5 , 861,42 , 22,23 , {76,75,82}, 283,3 , 12240,58 , 4,4 , 4,0 , 3687,5 , 3692,11 , 2, 1, 1, 6, 7 }, // Sinhala/Sinhala/Sri Lanka
- { 107, 7, 195, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 53,10 , 63,17 , 37,5 , 8,10 , 368,48 , 368,48 , 158,27 , 368,48 , 368,48 , 158,27 , 0,28 , 0,28 , 85,14 , 0,28 , 0,28 , 85,14 , 0,2 , 0,2 , 45,4 , 5,17 , 22,23 , {90,65,82}, 5,1 , 0,7 , 8,5 , 4,0 , 0,0 , 0,0 , 2, 1, 7, 6, 7 }, // Swati/Latin/South Africa
- { 108, 7, 191, 44, 160, 59, 37, 48, 45, 43, 101, 8222, 8220, 8218, 8216, 0,6 , 0,6 , 185,7 , 659,7 , 1134,10 , 478,17 , 55,4 , 59,9 , 17943,48 , 17991,82 , 9742,24 , 17943,48 , 18073,89 , 9742,24 , 9640,21 , 9661,52 , 9713,14 , 9640,21 , 9661,52 , 9713,14 , 0,2 , 0,2 , 303,5 , 5,17 , 22,23 , {69,85,82}, 14,1 , 12298,26 , 13,5 , 4,0 , 3703,10 , 3713,9 , 2, 1, 1, 6, 7 }, // Slovak/Latin/Slovakia
- { 109, 7, 192, 44, 46, 59, 37, 48, 8722, 43, 101, 8222, 8220, 8218, 8216, 0,6 , 0,6 , 666,8 , 666,8 , 1144,9 , 1153,19 , 37,5 , 8,10 , 18162,59 , 18221,86 , 9742,24 , 18162,59 , 18221,86 , 9742,24 , 9727,35 , 9762,52 , 9814,14 , 9727,35 , 9762,52 , 9814,14 , 60,4 , 269,4 , 54,4 , 5,17 , 22,23 , {69,85,82}, 14,1 , 12324,28 , 13,5 , 4,0 , 3722,11 , 3733,9 , 2, 1, 1, 6, 7 }, // Slovenian/Latin/Slovenia
- { 110, 7, 194, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 674,9 , 674,9 , 27,8 , 1172,19 , 18,7 , 25,12 , 18307,48 , 18355,92 , 18447,24 , 18307,48 , 18471,189 , 18447,24 , 9828,32 , 9860,47 , 9907,15 , 9828,32 , 9860,47 , 9907,15 , 305,2 , 273,2 , 903,6 , 909,17 , 22,23 , {83,79,83}, 94,1 , 12352,27 , 4,4 , 4,0 , 3742,8 , 3750,10 , 0, 0, 1, 6, 7 }, // Somali/Latin/Somalia
- { 110, 7, 59, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 674,9 , 674,9 , 27,8 , 1172,19 , 18,7 , 25,12 , 18307,48 , 18355,92 , 18447,24 , 18307,48 , 18471,189 , 18447,24 , 9828,32 , 9860,47 , 9907,15 , 9828,32 , 9860,47 , 9907,15 , 305,2 , 273,2 , 903,6 , 909,17 , 22,23 , {68,74,70}, 38,3 , 12379,50 , 4,4 , 4,0 , 3742,8 , 3760,7 , 0, 0, 6, 6, 7 }, // Somali/Latin/Djibouti
- { 110, 7, 69, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 674,9 , 674,9 , 27,8 , 1172,19 , 18,7 , 25,12 , 18307,48 , 18355,92 , 18447,24 , 18307,48 , 18471,189 , 18447,24 , 9828,32 , 9860,47 , 9907,15 , 9828,32 , 9860,47 , 9907,15 , 305,2 , 273,2 , 903,6 , 909,17 , 22,23 , {69,84,66}, 0,2 , 12429,52 , 4,4 , 4,0 , 3742,8 , 3767,8 , 2, 1, 7, 6, 7 }, // Somali/Latin/Ethiopia
- { 110, 7, 111, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 674,9 , 674,9 , 27,8 , 1172,19 , 37,5 , 8,10 , 18307,48 , 18355,92 , 18447,24 , 18307,48 , 18471,189 , 18447,24 , 9828,32 , 9860,47 , 9907,15 , 9828,32 , 9860,47 , 9907,15 , 305,2 , 273,2 , 903,6 , 909,17 , 22,23 , {75,69,83}, 2,3 , 12481,52 , 4,4 , 4,0 , 3742,8 , 1192,5 , 2, 1, 7, 6, 7 }, // Somali/Latin/Kenya
- { 111, 7, 197, 44, 46, 59, 37, 48, 45, 43, 101, 171, 187, 8220, 8221, 0,6 , 0,6 , 683,7 , 683,7 , 269,6 , 669,27 , 55,4 , 430,11 , 18660,61 , 18721,89 , 18810,24 , 18660,61 , 18721,89 , 18810,24 , 9922,35 , 9957,53 , 8354,14 , 9922,35 , 9957,53 , 8354,14 , 53,5 , 50,5 , 0,5 , 5,17 , 22,23 , {69,85,82}, 14,1 , 3102,20 , 13,5 , 4,0 , 3775,17 , 2432,6 , 2, 1, 1, 6, 7 }, // Spanish/Latin/Spain
- { 111, 7, 10, 44, 46, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 683,7 , 683,7 , 269,6 , 669,27 , 37,5 , 8,10 , 18834,60 , 18721,89 , 18810,24 , 18834,60 , 18721,89 , 18810,24 , 9922,35 , 9957,53 , 3080,14 , 9922,35 , 9957,53 , 3080,14 , 53,5 , 50,5 , 0,5 , 5,17 , 22,23 , {65,82,83}, 6,1 , 12533,51 , 8,5 , 4,0 , 3792,7 , 3799,9 , 2, 1, 7, 6, 7 }, // Spanish/Latin/Argentina
- { 111, 7, 22, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 683,7 , 683,7 , 269,6 , 669,27 , 37,5 , 8,10 , 18834,60 , 18721,89 , 18810,24 , 18834,60 , 18721,89 , 18810,24 , 9922,35 , 9957,53 , 3080,14 , 9922,35 , 9957,53 , 4769,14 , 64,4 , 61,4 , 0,5 , 5,17 , 22,23 , {66,90,68}, 6,1 , 12584,52 , 4,4 , 4,0 , 3792,7 , 3808,6 , 2, 1, 7, 6, 7 }, // Spanish/Latin/Belize
- { 111, 7, 26, 44, 46, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 683,7 , 683,7 , 269,6 , 669,27 , 37,5 , 8,10 , 18834,60 , 18721,89 , 18810,24 , 18834,60 , 18721,89 , 18810,24 , 9922,35 , 9957,53 , 3080,14 , 9922,35 , 9957,53 , 4769,14 , 53,5 , 50,5 , 0,5 , 5,17 , 22,23 , {66,79,66}, 274,2 , 12636,35 , 4,4 , 4,0 , 3792,7 , 3444,7 , 2, 1, 1, 6, 7 }, // Spanish/Latin/Bolivia
- { 111, 7, 30, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 683,7 , 683,7 , 269,6 , 669,27 , 37,5 , 8,10 , 18834,60 , 18721,89 , 18810,24 , 18834,60 , 18721,89 , 18810,24 , 9922,35 , 9957,53 , 3080,14 , 9922,35 , 9957,53 , 4769,14 , 64,4 , 61,4 , 0,5 , 5,17 , 22,23 , {66,82,76}, 263,2 , 12671,52 , 4,4 , 4,0 , 3792,7 , 3267,6 , 2, 1, 7, 6, 7 }, // Spanish/Latin/Brazil
- { 111, 7, 43, 44, 46, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 683,7 , 683,7 , 339,8 , 669,27 , 37,5 , 8,10 , 18660,61 , 18721,89 , 18810,24 , 18834,60 , 18721,89 , 18810,24 , 9922,35 , 9957,53 , 3080,14 , 9922,35 , 9957,53 , 4769,14 , 53,5 , 50,5 , 0,5 , 5,17 , 22,23 , {67,76,80}, 6,1 , 12723,45 , 4,4 , 36,5 , 3792,7 , 3814,5 , 0, 0, 1, 6, 7 }, // Spanish/Latin/Chile
- { 111, 7, 47, 44, 46, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 683,7 , 683,7 , 571,7 , 669,27 , 18,7 , 25,12 , 18660,61 , 18721,89 , 18810,24 , 18834,60 , 18721,89 , 18810,24 , 9922,35 , 9957,53 , 4769,14 , 9922,35 , 9957,53 , 3080,14 , 53,5 , 50,5 , 0,5 , 5,17 , 22,23 , {67,79,80}, 6,1 , 12768,54 , 8,5 , 4,0 , 3792,7 , 3819,8 , 2, 0, 7, 6, 7 }, // Spanish/Latin/Colombia
- { 111, 7, 52, 44, 160, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 683,7 , 683,7 , 269,6 , 669,27 , 37,5 , 8,10 , 18834,60 , 18721,89 , 18810,24 , 18834,60 , 18721,89 , 18810,24 , 9922,35 , 9957,53 , 3080,14 , 9922,35 , 9957,53 , 4769,14 , 53,5 , 50,5 , 0,5 , 5,17 , 22,23 , {67,82,67}, 286,1 , 12822,67 , 4,4 , 4,0 , 3792,7 , 3827,10 , 2, 0, 1, 6, 7 }, // Spanish/Latin/Costa Rica
- { 111, 7, 55, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 683,7 , 683,7 , 269,6 , 669,27 , 37,5 , 8,10 , 18834,60 , 18721,89 , 18810,24 , 18834,60 , 18721,89 , 18810,24 , 9922,35 , 9957,53 , 3080,14 , 9922,35 , 9957,53 , 4769,14 , 64,4 , 61,4 , 0,5 , 5,17 , 22,23 , {67,85,80}, 6,1 , 12889,42 , 4,4 , 4,0 , 3792,7 , 3837,4 , 2, 1, 1, 6, 7 }, // Spanish/Latin/Cuba
- { 111, 7, 61, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 683,7 , 683,7 , 269,6 , 669,27 , 18,7 , 25,12 , 18834,60 , 18721,89 , 18810,24 , 18834,60 , 18721,89 , 18810,24 , 9922,35 , 9957,53 , 3080,14 , 9922,35 , 9957,53 , 3080,14 , 53,5 , 50,5 , 0,5 , 5,17 , 22,23 , {68,79,80}, 287,3 , 12931,54 , 4,4 , 83,6 , 3792,7 , 3841,20 , 2, 1, 7, 6, 7 }, // Spanish/Latin/Dominican Republic
- { 111, 7, 63, 44, 46, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 683,7 , 683,7 , 269,6 , 669,27 , 37,5 , 8,10 , 18834,60 , 18721,89 , 18810,24 , 18834,60 , 18721,89 , 18810,24 , 9922,35 , 9957,53 , 3080,14 , 9922,35 , 9957,53 , 4769,14 , 53,5 , 50,5 , 0,5 , 5,17 , 22,23 , {85,83,68}, 6,1 , 12985,70 , 4,4 , 36,5 , 3792,7 , 3451,7 , 2, 1, 1, 6, 7 }, // Spanish/Latin/Ecuador
- { 111, 7, 65, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 683,7 , 683,7 , 269,6 , 669,27 , 37,5 , 8,10 , 18834,60 , 18721,89 , 18810,24 , 18834,60 , 18721,89 , 18810,24 , 9922,35 , 9957,53 , 3080,14 , 9922,35 , 9957,53 , 4769,14 , 53,5 , 50,5 , 0,5 , 5,17 , 22,23 , {85,83,68}, 6,1 , 12985,70 , 4,4 , 4,0 , 3792,7 , 3861,11 , 2, 1, 7, 6, 7 }, // Spanish/Latin/El Salvador
- { 111, 7, 66, 44, 46, 59, 37, 48, 45, 43, 101, 171, 187, 8220, 8221, 0,6 , 0,6 , 683,7 , 683,7 , 269,6 , 669,27 , 55,4 , 430,11 , 18660,61 , 18721,89 , 18810,24 , 18660,61 , 18721,89 , 18810,24 , 9922,35 , 9957,53 , 8354,14 , 9922,35 , 9957,53 , 8354,14 , 53,5 , 50,5 , 0,5 , 5,17 , 22,23 , {88,65,70}, 32,4 , 13055,92 , 4,4 , 4,0 , 3792,7 , 3872,17 , 0, 0, 1, 6, 7 }, // Spanish/Latin/Equatorial Guinea
- { 111, 7, 90, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 683,7 , 683,7 , 571,7 , 669,27 , 37,5 , 8,10 , 18834,60 , 18721,89 , 18810,24 , 18834,60 , 18721,89 , 18810,24 , 9922,35 , 9957,53 , 3080,14 , 9922,35 , 9957,53 , 4769,14 , 53,5 , 50,5 , 0,5 , 5,17 , 22,23 , {71,84,81}, 290,1 , 13147,30 , 18,5 , 4,0 , 3792,7 , 3889,9 , 2, 1, 7, 6, 7 }, // Spanish/Latin/Guatemala
- { 111, 7, 96, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 683,7 , 683,7 , 269,6 , 1191,27 , 37,5 , 8,10 , 18834,60 , 18721,89 , 18810,24 , 18834,60 , 18721,89 , 18810,24 , 9922,35 , 9957,53 , 3080,14 , 9922,35 , 9957,53 , 4769,14 , 53,5 , 50,5 , 0,5 , 5,17 , 22,23 , {72,78,76}, 279,1 , 13177,60 , 4,4 , 4,0 , 3792,7 , 3898,8 , 2, 1, 7, 6, 7 }, // Spanish/Latin/Honduras
- { 111, 7, 139, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 683,7 , 683,7 , 27,8 , 669,27 , 55,4 , 59,9 , 18834,60 , 18721,89 , 18810,24 , 18834,60 , 18721,89 , 18810,24 , 9922,35 , 9957,53 , 3080,14 , 9922,35 , 9957,53 , 3080,14 , 53,5 , 50,5 , 0,5 , 5,17 , 22,23 , {77,88,78}, 6,1 , 13237,48 , 47,6 , 4,0 , 3906,17 , 3923,6 , 2, 1, 7, 6, 7 }, // Spanish/Latin/Mexico
- { 111, 7, 155, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 683,7 , 683,7 , 269,6 , 669,27 , 37,5 , 8,10 , 18834,60 , 18721,89 , 18810,24 , 18834,60 , 18721,89 , 18810,24 , 9922,35 , 9957,53 , 3080,14 , 9922,35 , 9957,53 , 4769,14 , 53,5 , 50,5 , 0,5 , 5,17 , 22,23 , {78,73,79}, 291,2 , 13285,69 , 4,4 , 4,0 , 3792,7 , 3929,9 , 2, 1, 7, 6, 7 }, // Spanish/Latin/Nicaragua
- { 111, 7, 166, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 683,7 , 683,7 , 1218,8 , 669,27 , 18,7 , 25,12 , 18834,60 , 18721,89 , 18810,24 , 18834,60 , 18721,89 , 18810,24 , 9922,35 , 9957,53 , 3080,14 , 9922,35 , 9957,53 , 4769,14 , 53,5 , 50,5 , 0,5 , 5,17 , 22,23 , {80,65,66}, 293,3 , 13354,54 , 4,4 , 4,0 , 3792,7 , 3938,6 , 2, 1, 7, 6, 7 }, // Spanish/Latin/Panama
- { 111, 7, 168, 44, 46, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 683,7 , 683,7 , 269,6 , 669,27 , 37,5 , 8,10 , 18660,61 , 18721,89 , 18810,24 , 18660,61 , 18721,89 , 18810,24 , 9922,35 , 9957,53 , 3080,14 , 9922,35 , 9957,53 , 4769,14 , 53,5 , 50,5 , 0,5 , 5,17 , 22,23 , {80,89,71}, 296,3 , 13408,61 , 8,5 , 23,6 , 3792,7 , 3944,8 , 0, 0, 7, 6, 7 }, // Spanish/Latin/Paraguay
- { 111, 7, 169, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 683,7 , 683,7 , 571,7 , 669,27 , 37,5 , 8,10 , 18894,60 , 15922,88 , 18810,24 , 18954,60 , 19014,88 , 18810,24 , 9922,35 , 9957,53 , 3080,14 , 9922,35 , 9957,53 , 4769,14 , 53,5 , 50,5 , 0,5 , 5,17 , 22,23 , {80,69,78}, 272,2 , 13469,43 , 8,5 , 4,0 , 3792,7 , 3440,4 , 2, 1, 7, 6, 7 }, // Spanish/Latin/Peru
- { 111, 7, 170, 44, 46, 59, 37, 48, 45, 43, 101, 171, 187, 8220, 8221, 0,6 , 0,6 , 683,7 , 683,7 , 269,6 , 669,27 , 18,7 , 25,12 , 18660,61 , 18721,89 , 18810,24 , 18660,61 , 18721,89 , 18810,24 , 9922,35 , 9957,53 , 8354,14 , 9922,35 , 9957,53 , 8354,14 , 53,5 , 50,5 , 0,5 , 5,17 , 22,23 , {80,72,80}, 178,1 , 13512,48 , 13,5 , 4,0 , 3792,7 , 3952,9 , 2, 1, 7, 6, 7 }, // Spanish/Latin/Philippines
- { 111, 7, 174, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 683,7 , 683,7 , 1218,8 , 669,27 , 18,7 , 25,12 , 18834,60 , 18721,89 , 18810,24 , 18834,60 , 18721,89 , 18810,24 , 9922,35 , 9957,53 , 3080,14 , 9922,35 , 9957,53 , 4769,14 , 53,5 , 50,5 , 0,5 , 5,17 , 22,23 , {85,83,68}, 6,1 , 12985,70 , 4,4 , 4,0 , 3792,7 , 1447,11 , 2, 1, 7, 6, 7 }, // Spanish/Latin/Puerto Rico
- { 111, 7, 225, 46, 44, 59, 37, 48, 45, 43, 101, 171, 187, 8220, 8221, 0,6 , 0,6 , 683,7 , 683,7 , 415,8 , 669,27 , 18,7 , 25,12 , 18834,60 , 18721,89 , 18810,24 , 18834,60 , 18721,89 , 18810,24 , 9922,35 , 9957,53 , 3080,14 , 9922,35 , 9957,53 , 3080,14 , 53,5 , 50,5 , 0,5 , 5,17 , 22,23 , {85,83,68}, 6,1 , 12985,70 , 89,7 , 4,0 , 3792,7 , 3961,14 , 2, 1, 7, 6, 7 }, // Spanish/Latin/United States
- { 111, 7, 227, 44, 46, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 683,7 , 683,7 , 269,6 , 669,27 , 37,5 , 8,10 , 18894,60 , 15922,88 , 18810,24 , 18954,60 , 19014,88 , 18810,24 , 9922,35 , 9957,53 , 3080,14 , 9922,35 , 9957,53 , 4769,14 , 53,5 , 50,5 , 0,5 , 5,17 , 22,23 , {85,89,85}, 6,1 , 13560,48 , 8,5 , 4,0 , 3792,7 , 3975,7 , 2, 1, 1, 6, 7 }, // Spanish/Latin/Uruguay
- { 111, 7, 231, 44, 46, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 683,7 , 683,7 , 269,6 , 669,27 , 18,7 , 25,12 , 18660,61 , 18721,89 , 18810,24 , 18660,61 , 18721,89 , 18810,24 , 9922,35 , 9957,53 , 3080,14 , 9922,35 , 9957,53 , 4769,14 , 53,5 , 50,5 , 0,5 , 5,17 , 22,23 , {86,69,83}, 299,4 , 13608,58 , 4,4 , 36,5 , 3792,7 , 3982,9 , 2, 1, 7, 6, 7 }, // Spanish/Latin/Venezuela
- { 111, 7, 238, 44, 46, 59, 37, 48, 45, 43, 101, 171, 187, 8220, 8221, 0,6 , 0,6 , 683,7 , 683,7 , 269,6 , 669,27 , 55,4 , 430,11 , 18660,61 , 18721,89 , 18810,24 , 18660,61 , 18721,89 , 18810,24 , 9922,35 , 9957,53 , 8354,14 , 9922,35 , 9957,53 , 8354,14 , 53,5 , 50,5 , 0,5 , 5,17 , 22,23 , {69,85,82}, 14,1 , 3102,20 , 13,5 , 4,0 , 3792,7 , 3991,8 , 2, 1, 1, 6, 7 }, // Spanish/Latin/Canary Islands
- { 111, 7, 246, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 683,7 , 683,7 , 269,6 , 669,27 , 37,5 , 8,10 , 18834,60 , 18721,89 , 18810,24 , 18834,60 , 18721,89 , 18810,24 , 9922,35 , 9957,53 , 3080,14 , 9922,35 , 9957,53 , 4769,14 , 64,4 , 61,4 , 0,5 , 5,17 , 22,23 , {0,0,0}, 0,0 , 2586,0 , 4,4 , 4,0 , 3999,23 , 4022,13 , 2, 1, 1, 6, 7 }, // Spanish/Latin/Latin America
- { 111, 7, 250, 44, 46, 59, 37, 48, 45, 43, 101, 171, 187, 8220, 8221, 0,6 , 0,6 , 683,7 , 683,7 , 269,6 , 669,27 , 55,4 , 430,11 , 18660,61 , 18721,89 , 18810,24 , 18660,61 , 18721,89 , 18810,24 , 9922,35 , 9957,53 , 8354,14 , 9922,35 , 9957,53 , 8354,14 , 53,5 , 50,5 , 0,5 , 5,17 , 22,23 , {69,85,82}, 14,1 , 3102,20 , 13,5 , 4,0 , 3792,7 , 4035,15 , 2, 1, 1, 6, 7 }, // Spanish/Latin/Ceuta And Melilla
- { 113, 7, 210, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 690,8 , 690,8 , 119,10 , 10,17 , 37,5 , 8,10 , 19102,48 , 19150,84 , 134,24 , 19102,48 , 19150,84 , 134,24 , 10010,60 , 10010,60 , 85,14 , 10010,60 , 10010,60 , 85,14 , 0,2 , 0,2 , 627,5 , 926,51 , 22,23 , {84,90,83}, 191,3 , 13666,67 , 8,5 , 4,0 , 4050,9 , 1625,8 , 2, 0, 1, 6, 7 }, // Swahili/Latin/Tanzania
- { 113, 7, 49, 44, 46, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 690,8 , 690,8 , 119,10 , 10,17 , 37,5 , 8,10 , 19102,48 , 19150,84 , 134,24 , 19102,48 , 19150,84 , 134,24 , 10010,60 , 10010,60 , 85,14 , 10010,60 , 10010,60 , 85,14 , 0,2 , 0,2 , 627,5 , 926,51 , 22,23 , {67,68,70}, 209,2 , 13733,55 , 8,5 , 4,0 , 4050,9 , 4059,32 , 2, 1, 1, 6, 7 }, // Swahili/Latin/Congo Kinshasa
- { 113, 7, 111, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 690,8 , 690,8 , 119,10 , 10,17 , 37,5 , 8,10 , 19102,48 , 19150,84 , 134,24 , 19102,48 , 19150,84 , 134,24 , 10010,60 , 10010,60 , 85,14 , 10010,60 , 10010,60 , 85,14 , 0,2 , 0,2 , 627,5 , 926,51 , 22,23 , {75,69,83}, 2,3 , 13788,58 , 8,5 , 4,0 , 4050,9 , 1192,5 , 2, 1, 7, 6, 7 }, // Swahili/Latin/Kenya
- { 113, 7, 221, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 690,8 , 690,8 , 119,10 , 10,17 , 37,5 , 8,10 , 19102,48 , 19150,84 , 134,24 , 19102,48 , 19150,84 , 134,24 , 10010,60 , 10010,60 , 85,14 , 10010,60 , 10010,60 , 85,14 , 0,2 , 0,2 , 627,5 , 926,51 , 22,23 , {85,71,88}, 196,3 , 13846,61 , 8,5 , 4,0 , 4050,9 , 1690,6 , 0, 0, 1, 6, 7 }, // Swahili/Latin/Uganda
- { 114, 7, 205, 44, 160, 59, 37, 48, 8722, 43, 101, 8221, 8221, 8217, 8217, 0,6 , 0,6 , 698,9 , 698,9 , 53,10 , 97,16 , 228,5 , 441,16 , 19234,59 , 19293,86 , 134,24 , 19234,59 , 19293,86 , 134,24 , 10070,29 , 10099,50 , 2293,14 , 10070,29 , 10099,50 , 2293,14 , 307,2 , 275,2 , 45,4 , 5,17 , 22,23 , {83,69,75}, 189,2 , 13907,45 , 13,5 , 4,0 , 4091,7 , 4098,7 , 2, 0, 1, 6, 7 }, // Swedish/Latin/Sweden
- { 114, 7, 73, 44, 160, 59, 37, 48, 8722, 43, 101, 8221, 8221, 8217, 8217, 0,6 , 0,6 , 698,9 , 698,9 , 528,10 , 97,16 , 228,5 , 441,16 , 19234,59 , 19293,86 , 134,24 , 19234,59 , 19293,86 , 134,24 , 10070,29 , 10099,50 , 2293,14 , 10070,29 , 10099,50 , 2293,14 , 307,2 , 275,2 , 45,4 , 5,17 , 22,23 , {69,85,82}, 14,1 , 8952,19 , 13,5 , 4,0 , 4091,7 , 1089,7 , 2, 1, 1, 6, 7 }, // Swedish/Latin/Finland
- { 114, 7, 248, 44, 160, 59, 37, 48, 8722, 43, 101, 8221, 8221, 8217, 8217, 0,6 , 0,6 , 698,9 , 698,9 , 53,10 , 97,16 , 228,5 , 441,16 , 19234,59 , 19293,86 , 134,24 , 19234,59 , 19293,86 , 134,24 , 10070,29 , 10099,50 , 2293,14 , 10070,29 , 10099,50 , 2293,14 , 307,2 , 275,2 , 45,4 , 5,17 , 22,23 , {69,85,82}, 14,1 , 8952,19 , 13,5 , 4,0 , 4091,7 , 4105,5 , 2, 1, 1, 6, 7 }, // Swedish/Latin/Aland Islands
- { 115, 7, 106, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 53,10 , 63,17 , 37,5 , 8,10 , 368,48 , 368,48 , 158,27 , 368,48 , 368,48 , 158,27 , 0,28 , 0,28 , 85,14 , 0,28 , 0,28 , 85,14 , 0,2 , 0,2 , 45,4 , 5,17 , 22,23 , {69,85,82}, 14,1 , 0,7 , 8,5 , 4,0 , 0,0 , 0,0 , 2, 1, 1, 6, 7 }, // Sardinian/Latin/Italy
- { 116, 2, 209, 44, 160, 59, 37, 48, 45, 43, 101, 171, 187, 171, 187, 0,6 , 0,6 , 0,6 , 0,6 , 27,8 , 553,18 , 37,5 , 8,10 , 10930,48 , 19379,71 , 11058,24 , 10930,48 , 19379,71 , 11058,24 , 10149,28 , 10177,55 , 10232,14 , 10149,28 , 10177,55 , 10232,14 , 309,7 , 277,7 , 45,4 , 5,17 , 22,23 , {84,74,83}, 303,4 , 13952,19 , 13,5 , 4,0 , 4110,6 , 4116,10 , 2, 1, 1, 6, 7 }, // Tajik/Cyrillic/Tajikistan
- { 117, 27, 100, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 707,13 , 707,13 , 269,6 , 192,18 , 382,7 , 457,12 , 19450,58 , 19508,86 , 19594,31 , 19450,58 , 19508,86 , 19594,31 , 10246,39 , 10285,49 , 10334,20 , 10246,39 , 10285,49 , 10334,20 , 316,8 , 284,8 , 977,7 , 5,17 , 22,23 , {73,78,82}, 121,1 , 13971,49 , 8,5 , 4,0 , 4126,5 , 4131,7 , 2, 1, 7, 7, 7 }, // Tamil/Tamil/India
- { 117, 27, 130, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 707,13 , 707,13 , 269,6 , 192,18 , 382,7 , 457,12 , 19450,58 , 19508,86 , 19594,31 , 19450,58 , 19508,86 , 19594,31 , 10246,39 , 10285,49 , 10334,20 , 10246,39 , 10285,49 , 10334,20 , 316,8 , 284,8 , 977,7 , 5,17 , 22,23 , {77,89,82}, 173,2 , 14020,61 , 8,5 , 4,0 , 4126,5 , 4138,7 , 2, 1, 1, 6, 7 }, // Tamil/Tamil/Malaysia
- { 117, 27, 190, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 707,13 , 707,13 , 269,6 , 192,18 , 382,7 , 457,12 , 19450,58 , 19508,86 , 19594,31 , 19450,58 , 19508,86 , 19594,31 , 10246,39 , 10285,49 , 10334,20 , 10246,39 , 10285,49 , 10334,20 , 316,8 , 284,8 , 977,7 , 5,17 , 22,23 , {83,71,68}, 6,1 , 14081,61 , 8,5 , 4,0 , 4126,5 , 4145,11 , 2, 1, 7, 6, 7 }, // Tamil/Tamil/Singapore
- { 117, 27, 198, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 707,13 , 707,13 , 269,6 , 192,18 , 37,5 , 8,10 , 19450,58 , 19508,86 , 19594,31 , 19450,58 , 19508,86 , 19594,31 , 10246,39 , 10285,49 , 10334,20 , 10246,39 , 10285,49 , 10334,20 , 316,8 , 284,8 , 977,7 , 5,17 , 22,23 , {76,75,82}, 307,3 , 14142,49 , 8,5 , 4,0 , 4126,5 , 4156,6 , 2, 1, 1, 6, 7 }, // Tamil/Tamil/Sri Lanka
- { 118, 2, 178, 44, 160, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 720,9 , 720,9 , 495,10 , 1226,23 , 55,4 , 59,9 , 19625,62 , 19687,81 , 158,27 , 19625,62 , 19687,81 , 158,27 , 10354,36 , 10390,56 , 10446,14 , 10354,36 , 10390,56 , 10446,14 , 0,2 , 0,2 , 45,4 , 5,17 , 22,23 , {82,85,66}, 123,1 , 14191,21 , 0,4 , 4,0 , 4162,5 , 3510,6 , 2, 1, 1, 6, 7 }, // Tatar/Cyrillic/Russia
- { 119, 28, 100, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 729,11 , 729,11 , 339,8 , 1249,18 , 18,7 , 25,12 , 19768,62 , 19830,86 , 19916,31 , 19768,62 , 19830,86 , 19916,31 , 10460,32 , 10492,60 , 10552,18 , 10460,32 , 10492,60 , 10552,18 , 0,2 , 0,2 , 984,7 , 991,29 , 22,23 , {73,78,82}, 121,1 , 14212,26 , 4,4 , 4,0 , 4167,6 , 4173,8 , 2, 1, 7, 7, 7 }, // Telugu/Telugu/India
- { 120, 30, 211, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 123,5 , 123,5 , 740,8 , 748,7 , 269,6 , 1267,19 , 37,5 , 469,28 , 19947,63 , 20010,98 , 19947,63 , 19947,63 , 20010,98 , 19947,63 , 10570,23 , 10593,68 , 10661,16 , 10570,23 , 10593,68 , 10661,16 , 324,10 , 292,10 , 1020,4 , 5,17 , 22,23 , {84,72,66}, 310,1 , 14238,16 , 4,4 , 4,0 , 4181,3 , 4181,3 , 2, 1, 7, 6, 7 }, // Thai/Thai/Thailand
- { 121, 31, 44, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 53,10 , 1286,23 , 18,7 , 25,12 , 2675,63 , 20108,159 , 158,27 , 2675,63 , 20267,147 , 158,27 , 10677,51 , 10728,79 , 10807,27 , 10677,51 , 10728,79 , 10807,27 , 334,7 , 302,8 , 45,4 , 5,17 , 22,23 , {67,78,89}, 311,1 , 14254,13 , 8,5 , 4,0 , 4184,8 , 4192,6 , 2, 1, 7, 6, 7 }, // Tibetan/Tibetan/China
- { 121, 31, 100, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 53,10 , 1286,23 , 18,7 , 25,12 , 2675,63 , 20108,159 , 158,27 , 2675,63 , 20267,147 , 158,27 , 10677,51 , 10728,79 , 10807,27 , 10677,51 , 10728,79 , 10807,27 , 334,7 , 302,8 , 45,4 , 5,17 , 22,23 , {73,78,82}, 121,1 , 14267,19 , 8,5 , 4,0 , 4184,8 , 4198,7 , 2, 1, 7, 7, 7 }, // Tibetan/Tibetan/India
- { 122, 14, 69, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 27,8 , 1309,23 , 18,7 , 25,12 , 20414,36 , 20450,54 , 20504,24 , 20414,36 , 20450,54 , 20504,24 , 10834,21 , 10855,29 , 10884,14 , 10834,21 , 10855,29 , 10898,14 , 341,7 , 310,7 , 45,4 , 5,17 , 22,23 , {69,84,66}, 0,2 , 14286,16 , 4,4 , 4,0 , 4205,4 , 92,5 , 2, 1, 7, 6, 7 }, // Tigrinya/Ethiopic/Ethiopia
- { 122, 14, 67, 46, 44, 59, 37, 48, 45, 43, 101, 8216, 8217, 8220, 8221, 0,6 , 0,6 , 0,6 , 0,6 , 27,8 , 1309,23 , 18,7 , 25,12 , 20414,36 , 20450,54 , 20504,24 , 20414,36 , 20450,54 , 20504,24 , 10834,21 , 10855,29 , 10898,14 , 10834,21 , 10855,29 , 10898,14 , 341,7 , 310,7 , 45,4 , 5,17 , 22,23 , {69,82,78}, 41,3 , 0,7 , 4,4 , 4,0 , 4205,4 , 4209,4 , 2, 1, 1, 6, 7 }, // Tigrinya/Ethiopic/Eritrea
- { 123, 7, 214, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 755,8 , 755,8 , 755,8 , 755,8 , 269,6 , 97,16 , 18,7 , 25,12 , 20528,51 , 20579,87 , 20666,24 , 20528,51 , 20579,87 , 20666,24 , 10912,29 , 10941,60 , 11001,14 , 10912,29 , 10941,60 , 11001,14 , 348,10 , 317,6 , 1024,5 , 1029,59 , 1088,65 , {84,79,80}, 194,2 , 14302,41 , 13,5 , 4,0 , 4213,13 , 1640,5 , 2, 1, 1, 6, 7 }, // Tongan/Latin/Tonga
- { 124, 7, 195, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 53,10 , 63,17 , 37,5 , 8,10 , 368,48 , 368,48 , 158,27 , 368,48 , 368,48 , 158,27 , 0,28 , 0,28 , 85,14 , 0,28 , 0,28 , 85,14 , 0,2 , 0,2 , 45,4 , 5,17 , 22,23 , {90,65,82}, 5,1 , 0,7 , 8,5 , 4,0 , 0,0 , 0,0 , 2, 1, 7, 6, 7 }, // Tsonga/Latin/South Africa
- { 125, 7, 217, 44, 46, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 763,8 , 763,8 , 1332,9 , 1341,16 , 37,5 , 8,10 , 20690,48 , 20738,75 , 20813,24 , 20690,48 , 20738,75 , 20813,24 , 11015,28 , 11043,54 , 11097,14 , 11015,28 , 11043,54 , 11097,14 , 358,2 , 323,2 , 199,4 , 5,17 , 22,23 , {84,82,89}, 241,1 , 14343,40 , 4,4 , 4,0 , 4226,6 , 4232,7 , 2, 1, 1, 6, 7 }, // Turkish/Latin/Turkey
- { 125, 7, 56, 44, 46, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 763,8 , 763,8 , 1332,9 , 1341,16 , 18,7 , 25,12 , 20690,48 , 20738,75 , 20813,24 , 20690,48 , 20738,75 , 20813,24 , 11015,28 , 11043,54 , 11097,14 , 11015,28 , 11043,54 , 11097,14 , 358,2 , 323,2 , 199,4 , 5,17 , 22,23 , {69,85,82}, 14,1 , 8439,19 , 4,4 , 4,0 , 4226,6 , 4239,6 , 2, 1, 1, 6, 7 }, // Turkish/Latin/Cyprus
- { 126, 7, 218, 44, 160, 59, 37, 48, 45, 43, 101, 8220, 8221, 8220, 8221, 0,6 , 0,6 , 771,8 , 771,8 , 495,10 , 1341,16 , 37,5 , 8,10 , 20837,50 , 20887,77 , 20964,24 , 20988,51 , 21039,77 , 20964,24 , 11111,28 , 11139,54 , 11193,14 , 11207,28 , 11235,54 , 11193,14 , 360,13 , 325,14 , 1153,4 , 5,17 , 22,23 , {84,77,84}, 312,3 , 14383,49 , 13,5 , 4,0 , 4245,12 , 4257,12 , 2, 1, 1, 6, 7 }, // Turkmen/Latin/Turkmenistan
- { 128, 1, 44, 46, 44, 59, 37, 48, 45, 43, 101, 187, 171, 8250, 8249, 0,6 , 0,6 , 200,10 , 210,9 , 53,10 , 1357,17 , 18,7 , 25,12 , 21116,84 , 21116,84 , 158,27 , 21116,84 , 21116,84 , 158,27 , 11289,21 , 11310,55 , 11365,14 , 11289,21 , 11310,55 , 11365,14 , 373,12 , 339,12 , 45,4 , 5,17 , 22,23 , {67,78,89}, 133,1 , 14432,40 , 4,4 , 4,0 , 4269,8 , 4277,5 , 2, 1, 7, 6, 7 }, // Uighur/Arabic/China
- { 129, 2, 222, 44, 160, 59, 37, 48, 45, 43, 1077, 171, 187, 8222, 8220, 0,6 , 0,6 , 138,7 , 138,7 , 156,8 , 1374,22 , 37,5 , 8,10 , 21200,48 , 21248,95 , 21343,24 , 21367,67 , 21434,87 , 21521,24 , 1427,21 , 11379,56 , 11435,14 , 1427,21 , 11379,56 , 11435,14 , 385,2 , 351,2 , 1157,5 , 680,17 , 22,23 , {85,65,72}, 280,1 , 14472,49 , 13,5 , 4,0 , 4282,10 , 4292,7 , 2, 1, 1, 6, 7 }, // Ukrainian/Cyrillic/Ukraine
- { 130, 1, 163, 46, 44, 59, 37, 48, 45, 43, 101, 8221, 8220, 8217, 8216, 46,6 , 46,6 , 779,10 , 789,9 , 269,6 , 1396,18 , 18,7 , 25,12 , 21545,68 , 21545,68 , 134,24 , 21545,68 , 21545,68 , 134,24 , 11449,36 , 11449,36 , 85,14 , 11449,36 , 11449,36 , 85,14 , 0,2 , 0,2 , 1162,4 , 1166,20 , 22,23 , {80,75,82}, 175,2 , 14521,49 , 4,4 , 4,0 , 4299,4 , 3226,7 , 2, 0, 7, 6, 7 }, // Urdu/Arabic/Pakistan
- { 130, 1, 100, 1643, 1644, 59, 37, 1776, 45, 43, 101, 8221, 8220, 8217, 8216, 46,6 , 46,6 , 798,6 , 798,6 , 269,6 , 1396,18 , 18,7 , 25,12 , 21545,68 , 21545,68 , 134,24 , 21545,68 , 21545,68 , 134,24 , 11449,36 , 11449,36 , 85,14 , 11449,36 , 11449,36 , 85,14 , 0,2 , 0,2 , 1162,4 , 1166,20 , 22,23 , {73,78,82}, 121,1 , 14570,42 , 8,5 , 4,0 , 4299,4 , 4303,5 , 2, 1, 7, 7, 7 }, // Urdu/Arabic/India
- { 131, 7, 228, 44, 160, 59, 37, 48, 45, 43, 101, 8220, 8221, 8217, 8216, 0,6 , 0,6 , 804,8 , 804,8 , 27,8 , 1414,18 , 37,5 , 430,11 , 21613,48 , 21661,75 , 21736,24 , 21760,48 , 21808,75 , 21736,24 , 11485,32 , 11517,61 , 11578,14 , 11485,32 , 11517,61 , 11578,14 , 387,2 , 353,2 , 199,4 , 5,17 , 22,23 , {85,90,83}, 315,4 , 14612,58 , 13,5 , 4,0 , 4308,6 , 4314,11 , 2, 0, 1, 6, 7 }, // Uzbek/Latin/Uzbekistan
- { 131, 1, 1, 1643, 1644, 1563, 1642, 1776, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 394,8 , 1432,33 , 55,4 , 430,11 , 21883,47 , 15102,68 , 158,27 , 21883,47 , 15102,68 , 158,27 , 11592,21 , 7766,49 , 85,14 , 11592,21 , 7766,49 , 85,14 , 0,2 , 0,2 , 45,4 , 5,17 , 22,23 , {65,70,78}, 256,1 , 14670,13 , 13,5 , 4,0 , 4325,6 , 3217,9 , 0, 0, 6, 4, 5 }, // Uzbek/Arabic/Afghanistan
- { 131, 2, 228, 44, 160, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 27,8 , 696,19 , 37,5 , 87,12 , 21930,48 , 21978,71 , 11058,24 , 21930,48 , 21978,71 , 11058,24 , 11613,28 , 11641,53 , 11694,14 , 11613,28 , 11641,53 , 11694,14 , 389,2 , 355,2 , 45,4 , 5,17 , 22,23 , {85,90,83}, 319,3 , 14683,49 , 13,5 , 4,0 , 4331,7 , 4338,10 , 2, 0, 1, 6, 7 }, // Uzbek/Cyrillic/Uzbekistan
- { 132, 7, 232, 44, 46, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 812,8 , 812,8 , 119,10 , 192,18 , 37,5 , 8,10 , 22049,75 , 22124,99 , 158,27 , 22223,75 , 22298,99 , 158,27 , 11708,33 , 11741,55 , 11796,21 , 11708,33 , 11741,55 , 11796,21 , 391,2 , 357,2 , 45,4 , 5,17 , 22,23 , {86,78,68}, 322,1 , 14732,33 , 13,5 , 4,0 , 4348,10 , 4358,8 , 0, 0, 1, 6, 7 }, // Vietnamese/Latin/Vietnam
- { 133, 7, 260, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 53,10 , 1465,23 , 37,5 , 8,10 , 22397,48 , 22445,74 , 22519,24 , 22543,48 , 22445,74 , 22519,24 , 11817,21 , 11838,43 , 11881,14 , 11895,28 , 11838,43 , 11881,14 , 0,2 , 0,2 , 45,4 , 5,17 , 22,23 , {0,0,0}, 0,0 , 2586,0 , 8,5 , 4,0 , 4366,7 , 0,0 , 2, 1, 1, 6, 7 }, // Volapuk/Latin/World
- { 134, 7, 224, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 820,11 , 831,10 , 27,8 , 10,17 , 37,5 , 8,10 , 22591,52 , 22643,87 , 22730,26 , 22756,59 , 22643,87 , 22730,26 , 11923,29 , 11952,77 , 12029,15 , 12044,30 , 11952,77 , 12029,15 , 393,2 , 359,2 , 1186,7 , 5,17 , 22,23 , {71,66,80}, 119,1 , 14765,92 , 4,4 , 4,0 , 4373,7 , 4380,16 , 2, 1, 1, 6, 7 }, // Welsh/Latin/United Kingdom
- { 135, 7, 187, 44, 46, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 528,10 , 1488,17 , 37,5 , 8,10 , 22815,47 , 22862,84 , 158,27 , 22815,47 , 22862,84 , 158,27 , 12074,28 , 12102,50 , 12074,28 , 12074,28 , 12102,50 , 12074,28 , 395,3 , 361,3 , 45,4 , 5,17 , 22,23 , {88,79,70}, 206,3 , 14857,65 , 8,5 , 4,0 , 4396,5 , 4401,8 , 0, 0, 1, 6, 7 }, // Wolof/Latin/Senegal
- { 136, 7, 195, 46, 160, 59, 37, 48, 45, 43, 101, 8216, 8217, 8220, 8221, 0,6 , 0,6 , 0,6 , 0,6 , 53,10 , 63,17 , 37,5 , 8,10 , 22946,48 , 22994,91 , 158,27 , 22946,48 , 22994,91 , 158,27 , 12152,28 , 12180,61 , 85,14 , 12152,28 , 12180,61 , 85,14 , 0,2 , 0,2 , 45,4 , 5,17 , 22,23 , {90,65,82}, 5,1 , 14922,79 , 4,4 , 4,0 , 4409,8 , 4417,15 , 2, 1, 7, 6, 7 }, // Xhosa/Latin/South Africa
- { 137, 18, 260, 46, 44, 59, 37, 48, 45, 43, 101, 8221, 8221, 8217, 8217, 0,6 , 0,6 , 841,9 , 841,9 , 27,8 , 1505,19 , 37,5 , 8,10 , 23085,58 , 23143,92 , 158,27 , 23143,92 , 23143,92 , 158,27 , 12241,54 , 12241,54 , 85,14 , 12241,54 , 12241,54 , 85,14 , 398,11 , 364,10 , 45,4 , 5,17 , 22,23 , {0,0,0}, 0,0 , 2586,0 , 41,6 , 4,0 , 4432,6 , 4438,5 , 2, 1, 1, 6, 7 }, // Yiddish/Hebrew/World
- { 138, 7, 157, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 415,8 , 1524,16 , 497,3 , 8,10 , 23235,40 , 23275,73 , 23348,27 , 23375,55 , 23430,121 , 23348,27 , 12295,33 , 12328,44 , 12372,14 , 12295,33 , 12386,69 , 12372,14 , 409,5 , 374,5 , 45,4 , 5,17 , 22,23 , {78,71,78}, 177,1 , 15001,35 , 4,4 , 4,0 , 4443,10 , 4453,19 , 2, 1, 1, 6, 7 }, // Yoruba/Latin/Nigeria
- { 138, 7, 23, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 415,8 , 1524,16 , 497,3 , 8,10 , 23551,41 , 23592,74 , 23666,27 , 23693,56 , 23749,134 , 23666,27 , 12455,33 , 12488,44 , 12532,14 , 12455,33 , 12546,69 , 12532,14 , 414,5 , 379,5 , 45,4 , 5,17 , 22,23 , {88,79,70}, 206,3 , 15036,34 , 4,4 , 4,0 , 4443,10 , 4472,16 , 0, 0, 1, 6, 7 }, // Yoruba/Latin/Benin
- { 140, 7, 195, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 850,9 , 859,8 , 547,6 , 35,18 , 37,5 , 8,10 , 23883,48 , 23931,91 , 134,24 , 23883,48 , 23931,91 , 24022,24 , 12615,28 , 12643,74 , 12717,14 , 12615,28 , 12643,74 , 12717,14 , 0,2 , 0,2 , 0,5 , 5,17 , 22,23 , {90,65,82}, 5,1 , 15070,67 , 4,4 , 4,0 , 4488,7 , 4495,17 , 2, 1, 7, 6, 7 }, // Zulu/Latin/South Africa
- { 141, 7, 161, 44, 160, 59, 37, 48, 8722, 43, 101, 171, 187, 8216, 8217, 0,6 , 0,6 , 192,8 , 192,8 , 495,10 , 478,17 , 37,5 , 441,16 , 5656,48 , 14503,83 , 134,24 , 24046,59 , 14503,83 , 134,24 , 12731,28 , 12759,51 , 2293,14 , 12810,28 , 12759,51 , 2293,14 , 419,9 , 384,11 , 45,4 , 5,17 , 22,23 , {78,79,75}, 189,2 , 9895,44 , 13,5 , 4,0 , 4512,7 , 4519,5 , 2, 0, 1, 6, 7 }, // Norwegian Nynorsk/Latin/Norway
- { 142, 7, 27, 44, 46, 59, 37, 48, 45, 43, 101, 8222, 8221, 8216, 8217, 0,6 , 0,6 , 163,7 , 163,7 , 1540,11 , 450,19 , 37,5 , 8,10 , 8336,48 , 24105,83 , 9742,24 , 8336,48 , 24105,83 , 9742,24 , 2016,28 , 2044,58 , 2102,14 , 2016,28 , 2044,58 , 2116,14 , 428,10 , 395,7 , 296,7 , 5,17 , 22,23 , {66,65,77}, 140,2 , 15137,170 , 13,5 , 4,0 , 4524,8 , 630,19 , 2, 1, 1, 6, 7 }, // Bosnian/Latin/Bosnia And Herzegowina
- { 142, 2, 27, 44, 46, 59, 37, 48, 45, 43, 101, 8222, 8220, 8218, 8216, 0,6 , 0,6 , 116,7 , 116,7 , 1084,7 , 1091,20 , 37,5 , 8,10 , 24188,48 , 24236,83 , 12698,24 , 24188,48 , 24236,83 , 12698,24 , 12838,28 , 12866,56 , 8872,14 , 12838,28 , 12866,56 , 8872,14 , 234,9 , 402,7 , 45,4 , 5,17 , 22,23 , {66,65,77}, 281,2 , 15307,151 , 13,5 , 4,0 , 4532,8 , 3607,19 , 2, 1, 1, 6, 7 }, // Bosnian/Cyrillic/Bosnia And Herzegowina
- { 143, 29, 131, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 53,10 , 63,17 , 37,5 , 8,10 , 368,48 , 368,48 , 158,27 , 368,48 , 368,48 , 158,27 , 0,28 , 0,28 , 85,14 , 0,28 , 0,28 , 85,14 , 0,2 , 0,2 , 45,4 , 5,17 , 22,23 , {77,86,82}, 0,0 , 0,7 , 8,5 , 4,0 , 0,0 , 0,0 , 2, 1, 5, 6, 7 }, // Divehi/Thaana/Maldives
- { 144, 7, 251, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 27,8 , 80,17 , 37,5 , 8,10 , 24319,102 , 24421,140 , 158,27 , 24319,102 , 24421,140 , 158,27 , 12922,30 , 12952,57 , 85,14 , 12922,30 , 12952,57 , 85,14 , 64,4 , 61,4 , 45,4 , 5,17 , 22,23 , {71,66,80}, 119,1 , 0,7 , 4,4 , 4,0 , 4540,5 , 4545,12 , 2, 1, 1, 6, 7 }, // Manx/Latin/Isle Of Man
- { 145, 7, 224, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 119,10 , 97,16 , 37,5 , 8,10 , 24561,46 , 24607,130 , 158,27 , 24561,46 , 24607,130 , 158,27 , 13009,28 , 13037,61 , 85,14 , 13009,28 , 13037,61 , 85,14 , 64,4 , 61,4 , 45,4 , 5,17 , 22,23 , {71,66,80}, 119,1 , 0,7 , 4,4 , 4,0 , 4557,8 , 4565,14 , 2, 1, 1, 6, 7 }, // Cornish/Latin/United Kingdom
- { 146, 7, 83, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 1551,8 , 1559,18 , 18,7 , 25,12 , 24737,48 , 24785,192 , 158,27 , 24737,48 , 24785,192 , 158,27 , 13098,28 , 13126,49 , 13175,14 , 13098,28 , 13126,49 , 13175,14 , 438,2 , 409,2 , 45,4 , 5,17 , 22,23 , {71,72,83}, 163,3 , 15458,17 , 4,4 , 4,0 , 4579,4 , 4583,5 , 2, 1, 1, 6, 7 }, // Akan/Latin/Ghana
- { 147, 13, 100, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 1577,6 , 97,16 , 18,7 , 25,12 , 24977,88 , 24977,88 , 158,27 , 24977,88 , 24977,88 , 158,27 , 13189,49 , 13189,49 , 13238,20 , 13189,49 , 13189,49 , 13238,20 , 187,5 , 411,5 , 45,4 , 5,17 , 22,23 , {73,78,82}, 121,1 , 15475,13 , 8,5 , 4,0 , 4588,6 , 2667,4 , 2, 1, 7, 7, 7 }, // Konkani/Devanagari/India
- { 148, 7, 83, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 53,10 , 63,17 , 37,5 , 8,10 , 368,48 , 368,48 , 158,27 , 368,48 , 368,48 , 158,27 , 0,28 , 0,28 , 85,14 , 0,28 , 0,28 , 85,14 , 0,2 , 0,2 , 45,4 , 5,17 , 22,23 , {71,72,83}, 0,0 , 0,7 , 8,5 , 4,0 , 0,0 , 0,0 , 2, 1, 1, 6, 7 }, // Ga/Latin/Ghana
- { 149, 7, 157, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 867,9 , 690,8 , 269,6 , 10,17 , 37,5 , 8,10 , 25065,48 , 25113,87 , 25200,24 , 25065,48 , 25113,87 , 25200,24 , 13258,33 , 13291,58 , 85,14 , 13258,33 , 13291,58 , 85,14 , 440,7 , 416,7 , 45,4 , 5,17 , 22,23 , {78,71,78}, 177,1 , 15488,12 , 4,4 , 4,0 , 4594,10 , 4604,8 , 2, 1, 1, 6, 7 }, // Igbo/Latin/Nigeria
- { 150, 7, 111, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 119,10 , 10,17 , 37,5 , 8,10 , 25224,48 , 25272,189 , 25461,24 , 25224,48 , 25272,189 , 25461,24 , 13349,28 , 13377,74 , 13451,14 , 13349,28 , 13377,74 , 13451,14 , 447,9 , 423,7 , 45,4 , 5,17 , 22,23 , {75,69,83}, 2,3 , 15500,23 , 4,4 , 4,0 , 4612,7 , 1192,5 , 2, 1, 7, 6, 7 }, // Kamba/Latin/Kenya
- { 151, 33, 103, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 53,10 , 63,17 , 37,5 , 8,10 , 368,48 , 368,48 , 158,27 , 368,48 , 368,48 , 158,27 , 0,28 , 0,28 , 85,14 , 0,28 , 0,28 , 85,14 , 0,2 , 0,2 , 45,4 , 5,17 , 22,23 , {73,81,68}, 0,0 , 0,7 , 8,5 , 4,0 , 0,0 , 0,0 , 0, 0, 6, 5, 6 }, // Syriac/Syriac/Iraq
- { 152, 14, 67, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 53,10 , 63,17 , 37,5 , 8,10 , 368,48 , 368,48 , 158,27 , 368,48 , 368,48 , 158,27 , 0,28 , 0,28 , 85,14 , 0,28 , 0,28 , 85,14 , 0,2 , 0,2 , 45,4 , 5,17 , 22,23 , {69,82,78}, 0,0 , 0,7 , 8,5 , 4,0 , 0,0 , 0,0 , 2, 1, 1, 6, 7 }, // Blin/Ethiopic/Eritrea
- { 153, 14, 69, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 53,10 , 63,17 , 37,5 , 8,10 , 368,48 , 368,48 , 158,27 , 368,48 , 368,48 , 158,27 , 0,28 , 0,28 , 85,14 , 0,28 , 0,28 , 85,14 , 0,2 , 0,2 , 45,4 , 5,17 , 22,23 , {69,84,66}, 0,0 , 0,7 , 8,5 , 4,0 , 0,0 , 0,0 , 2, 1, 7, 6, 7 }, // Geez/Ethiopic/Ethiopia
- { 155, 7, 69, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 53,10 , 63,17 , 37,5 , 8,10 , 368,48 , 368,48 , 158,27 , 368,48 , 368,48 , 158,27 , 0,28 , 0,28 , 85,14 , 0,28 , 0,28 , 85,14 , 0,2 , 0,2 , 45,4 , 5,17 , 22,23 , {69,84,66}, 0,0 , 0,7 , 8,5 , 4,0 , 0,0 , 0,0 , 2, 1, 7, 6, 7 }, // Sidamo/Latin/Ethiopia
- { 156, 7, 157, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 53,10 , 63,17 , 37,5 , 8,10 , 368,48 , 368,48 , 158,27 , 368,48 , 368,48 , 158,27 , 0,28 , 0,28 , 85,14 , 0,28 , 0,28 , 85,14 , 0,2 , 0,2 , 45,4 , 5,17 , 22,23 , {78,71,78}, 177,1 , 0,7 , 8,5 , 4,0 , 0,0 , 0,0 , 2, 1, 1, 6, 7 }, // Atsam/Latin/Nigeria
- { 157, 14, 67, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 53,10 , 63,17 , 37,5 , 8,10 , 368,48 , 368,48 , 158,27 , 368,48 , 368,48 , 158,27 , 0,28 , 0,28 , 85,14 , 0,28 , 0,28 , 85,14 , 0,2 , 0,2 , 45,4 , 5,17 , 22,23 , {69,82,78}, 0,0 , 0,7 , 8,5 , 4,0 , 0,0 , 0,0 , 2, 1, 1, 6, 7 }, // Tigre/Ethiopic/Eritrea
- { 158, 7, 157, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 53,10 , 63,17 , 37,5 , 8,10 , 368,48 , 368,48 , 158,27 , 368,48 , 368,48 , 158,27 , 0,28 , 0,28 , 85,14 , 0,28 , 0,28 , 85,14 , 0,2 , 0,2 , 45,4 , 5,17 , 22,23 , {78,71,78}, 177,1 , 0,7 , 8,5 , 4,0 , 0,0 , 0,0 , 2, 1, 1, 6, 7 }, // Jju/Latin/Nigeria
- { 159, 7, 106, 44, 46, 59, 37, 48, 45, 43, 101, 8216, 8217, 8220, 8221, 0,6 , 0,6 , 254,7 , 254,7 , 27,8 , 1583,27 , 37,5 , 8,10 , 25485,48 , 25533,77 , 25610,24 , 25485,48 , 25533,77 , 25610,24 , 13465,28 , 13493,50 , 3080,14 , 13465,28 , 13493,50 , 3080,14 , 456,2 , 430,2 , 45,4 , 5,17 , 22,23 , {69,85,82}, 14,1 , 3102,20 , 8,5 , 4,0 , 4619,6 , 4625,6 , 2, 1, 1, 6, 7 }, // Friulian/Latin/Italy
- { 160, 7, 195, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 53,10 , 63,17 , 37,5 , 8,10 , 368,48 , 368,48 , 158,27 , 368,48 , 368,48 , 158,27 , 0,28 , 0,28 , 85,14 , 0,28 , 0,28 , 85,14 , 0,2 , 0,2 , 45,4 , 5,17 , 22,23 , {90,65,82}, 5,1 , 0,7 , 8,5 , 4,0 , 0,0 , 0,0 , 2, 1, 7, 6, 7 }, // Venda/Latin/South Africa
- { 161, 7, 83, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 876,11 , 887,10 , 547,6 , 1610,23 , 500,12 , 512,17 , 25634,48 , 25682,87 , 25769,24 , 25634,48 , 25682,87 , 25769,24 , 13543,28 , 13571,44 , 13615,14 , 13543,28 , 13571,44 , 13615,14 , 458,3 , 432,5 , 45,4 , 5,17 , 22,23 , {71,72,83}, 163,3 , 15523,37 , 4,4 , 4,0 , 4631,6 , 4637,12 , 2, 1, 1, 6, 7 }, // Ewe/Latin/Ghana
- { 161, 7, 212, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 876,11 , 887,10 , 547,6 , 1610,23 , 37,5 , 8,10 , 25634,48 , 25682,87 , 25769,24 , 25634,48 , 25682,87 , 25769,24 , 13543,28 , 13571,44 , 13615,14 , 13543,28 , 13571,44 , 13615,14 , 458,3 , 432,5 , 45,4 , 5,17 , 22,23 , {88,79,70}, 206,3 , 15560,106 , 4,4 , 4,0 , 4631,6 , 4649,11 , 0, 0, 1, 6, 7 }, // Ewe/Latin/Togo
- { 162, 14, 69, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 53,10 , 63,17 , 37,5 , 8,10 , 368,48 , 368,48 , 158,27 , 368,48 , 368,48 , 158,27 , 0,28 , 0,28 , 85,14 , 0,28 , 0,28 , 85,14 , 0,2 , 0,2 , 45,4 , 5,17 , 22,23 , {69,84,66}, 0,0 , 0,7 , 8,5 , 4,0 , 0,0 , 0,0 , 2, 1, 7, 6, 7 }, // Walamo/Ethiopic/Ethiopia
- { 163, 7, 225, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 269,6 , 10,17 , 18,7 , 25,12 , 25793,59 , 25852,95 , 158,27 , 25793,59 , 25852,95 , 158,27 , 13629,21 , 13650,57 , 85,14 , 13629,21 , 13650,57 , 85,14 , 0,2 , 0,2 , 45,4 , 5,17 , 22,23 , {85,83,68}, 6,1 , 0,7 , 4,4 , 4,0 , 4660,14 , 4674,19 , 2, 1, 7, 6, 7 }, // Hawaiian/Latin/United States
- { 164, 7, 157, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 53,10 , 63,17 , 37,5 , 8,10 , 368,48 , 368,48 , 158,27 , 368,48 , 368,48 , 158,27 , 0,28 , 0,28 , 85,14 , 0,28 , 0,28 , 85,14 , 0,2 , 0,2 , 45,4 , 5,17 , 22,23 , {78,71,78}, 177,1 , 0,7 , 8,5 , 4,0 , 0,0 , 0,0 , 2, 1, 1, 6, 7 }, // Tyap/Latin/Nigeria
- { 165, 7, 129, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 53,10 , 63,17 , 37,5 , 8,10 , 368,48 , 368,48 , 158,27 , 368,48 , 368,48 , 158,27 , 0,28 , 0,28 , 85,14 , 0,28 , 0,28 , 85,14 , 0,2 , 0,2 , 45,4 , 5,17 , 22,23 , {77,87,75}, 0,0 , 0,7 , 8,5 , 4,0 , 0,0 , 0,0 , 2, 1, 1, 6, 7 }, // Nyanja/Latin/Malawi
- { 166, 7, 170, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 897,9 , 906,8 , 547,6 , 35,18 , 18,7 , 25,12 , 25947,48 , 25995,88 , 26083,38 , 25947,48 , 25995,88 , 25947,48 , 13707,28 , 13735,55 , 13707,28 , 13707,28 , 13735,55 , 13707,28 , 0,2 , 0,2 , 0,5 , 5,17 , 22,23 , {80,72,80}, 178,1 , 15666,58 , 4,4 , 4,0 , 4693,8 , 4701,9 , 2, 1, 7, 6, 7 }, // Filipino/Latin/Philippines
- { 167, 7, 206, 46, 8217, 59, 37, 48, 8722, 43, 101, 171, 187, 8249, 8250, 0,6 , 0,6 , 269,9 , 269,9 , 156,8 , 622,18 , 37,5 , 8,10 , 7601,48 , 26121,86 , 134,24 , 7601,48 , 26121,86 , 134,24 , 13790,28 , 13818,63 , 3668,14 , 13790,28 , 13818,63 , 3668,14 , 461,12 , 437,11 , 45,4 , 5,17 , 22,23 , {67,72,70}, 225,3 , 15724,55 , 13,5 , 4,0 , 4710,16 , 4726,7 , 2, 0, 1, 6, 7 }, // Swiss German/Latin/Switzerland
- { 167, 7, 74, 46, 8217, 59, 37, 48, 8722, 43, 101, 171, 187, 8249, 8250, 0,6 , 0,6 , 269,9 , 269,9 , 156,8 , 622,18 , 37,5 , 8,10 , 7601,48 , 26121,86 , 134,24 , 7601,48 , 26121,86 , 134,24 , 13790,28 , 13818,63 , 3668,14 , 13790,28 , 13818,63 , 3668,14 , 461,12 , 437,11 , 45,4 , 5,17 , 22,23 , {69,85,82}, 14,1 , 8439,19 , 13,5 , 4,0 , 4710,16 , 4733,10 , 2, 1, 1, 6, 7 }, // Swiss German/Latin/France
- { 167, 7, 123, 46, 8217, 59, 37, 48, 8722, 43, 101, 171, 187, 8249, 8250, 0,6 , 0,6 , 269,9 , 269,9 , 156,8 , 622,18 , 37,5 , 8,10 , 7601,48 , 26121,86 , 134,24 , 7601,48 , 26121,86 , 134,24 , 13790,28 , 13818,63 , 3668,14 , 13790,28 , 13818,63 , 3668,14 , 461,12 , 437,11 , 45,4 , 5,17 , 22,23 , {67,72,70}, 225,3 , 15724,55 , 13,5 , 4,0 , 4710,16 , 4743,13 , 2, 0, 1, 6, 7 }, // Swiss German/Latin/Liechtenstein
- { 168, 34, 44, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 53,10 , 63,17 , 18,7 , 25,12 , 26207,38 , 26207,38 , 158,27 , 26207,38 , 26207,38 , 158,27 , 13881,21 , 13902,28 , 13930,14 , 13881,21 , 13902,28 , 13930,14 , 473,2 , 448,2 , 45,4 , 5,17 , 22,23 , {67,78,89}, 311,1 , 0,7 , 8,5 , 4,0 , 4756,3 , 4759,2 , 2, 1, 7, 6, 7 }, // Sichuan Yi/Yi/China
- { 169, 7, 121, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 53,10 , 63,17 , 37,5 , 8,10 , 368,48 , 368,48 , 158,27 , 368,48 , 368,48 , 158,27 , 0,28 , 0,28 , 85,14 , 0,28 , 0,28 , 85,14 , 0,2 , 0,2 , 45,4 , 5,17 , 22,23 , {76,82,68}, 6,1 , 0,7 , 8,5 , 4,0 , 0,0 , 0,0 , 2, 1, 1, 6, 7 }, // Kpelle/Latin/Liberia
- { 170, 7, 82, 44, 46, 59, 37, 48, 45, 43, 101, 8222, 8220, 8218, 8216, 0,6 , 0,6 , 461,8 , 461,8 , 365,7 , 1633,23 , 529,10 , 539,19 , 26245,59 , 26304,85 , 134,24 , 26245,59 , 26304,85 , 134,24 , 13944,28 , 13972,65 , 3668,14 , 13944,28 , 13972,65 , 3668,14 , 0,2 , 0,2 , 45,4 , 5,17 , 22,23 , {69,85,82}, 14,1 , 15779,15 , 13,5 , 4,0 , 4761,14 , 4775,11 , 2, 1, 1, 6, 7 }, // Low German/Latin/Germany
- { 170, 7, 151, 44, 46, 59, 37, 48, 45, 43, 101, 8222, 8220, 8218, 8216, 0,6 , 0,6 , 461,8 , 461,8 , 365,7 , 1633,23 , 529,10 , 539,19 , 26245,59 , 26304,85 , 134,24 , 26245,59 , 26304,85 , 134,24 , 13944,28 , 13972,65 , 3668,14 , 13944,28 , 13972,65 , 3668,14 , 0,2 , 0,2 , 45,4 , 5,17 , 22,23 , {69,85,82}, 14,1 , 15779,15 , 13,5 , 4,0 , 4761,14 , 4786,12 , 2, 1, 1, 6, 7 }, // Low German/Latin/Netherlands
- { 171, 7, 195, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 53,10 , 63,17 , 37,5 , 8,10 , 368,48 , 368,48 , 158,27 , 368,48 , 368,48 , 158,27 , 0,28 , 0,28 , 85,14 , 0,28 , 0,28 , 85,14 , 0,2 , 0,2 , 45,4 , 5,17 , 22,23 , {90,65,82}, 5,1 , 0,7 , 8,5 , 4,0 , 0,0 , 0,0 , 2, 1, 7, 6, 7 }, // South Ndebele/Latin/South Africa
- { 172, 7, 195, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 53,10 , 63,17 , 37,5 , 8,10 , 368,48 , 368,48 , 158,27 , 368,48 , 368,48 , 158,27 , 0,28 , 0,28 , 85,14 , 0,28 , 0,28 , 85,14 , 0,2 , 0,2 , 45,4 , 5,17 , 22,23 , {90,65,82}, 5,1 , 0,7 , 8,5 , 4,0 , 0,0 , 0,0 , 2, 1, 7, 6, 7 }, // Northern Sotho/Latin/South Africa
- { 173, 7, 161, 44, 160, 59, 37, 48, 8722, 43, 101, 8221, 8221, 8217, 8217, 0,6 , 0,6 , 228,8 , 228,8 , 53,10 , 63,17 , 37,5 , 8,10 , 26389,59 , 26448,145 , 26593,24 , 26389,59 , 26448,145 , 26593,24 , 14037,33 , 14070,75 , 14145,14 , 14037,33 , 14070,75 , 14145,14 , 475,11 , 450,13 , 45,4 , 5,17 , 22,23 , {78,79,75}, 189,2 , 15794,63 , 13,5 , 4,0 , 4798,15 , 4813,5 , 2, 0, 1, 6, 7 }, // Northern Sami/Latin/Norway
- { 173, 7, 73, 44, 160, 59, 37, 48, 8722, 43, 101, 8221, 8221, 8217, 8217, 0,6 , 0,6 , 228,8 , 228,8 , 495,10 , 97,16 , 37,5 , 8,10 , 26617,60 , 26448,145 , 26593,24 , 26617,60 , 26448,145 , 26593,24 , 14159,21 , 14180,70 , 14250,14 , 14159,21 , 14180,70 , 14250,14 , 486,2 , 463,2 , 45,4 , 5,17 , 22,23 , {69,85,82}, 14,1 , 15857,23 , 13,5 , 4,0 , 4798,15 , 4818,6 , 2, 1, 1, 6, 7 }, // Northern Sami/Latin/Finland
- { 173, 7, 205, 44, 160, 59, 37, 48, 8722, 43, 101, 8221, 8221, 8217, 8217, 0,6 , 0,6 , 228,8 , 228,8 , 53,10 , 63,17 , 37,5 , 8,10 , 26389,59 , 26448,145 , 26593,24 , 26389,59 , 26448,145 , 26593,24 , 14037,33 , 14070,75 , 14145,14 , 14037,33 , 14070,75 , 14145,14 , 475,11 , 450,13 , 45,4 , 5,17 , 22,23 , {83,69,75}, 189,2 , 15880,63 , 13,5 , 4,0 , 4798,15 , 4824,6 , 2, 0, 1, 6, 7 }, // Northern Sami/Latin/Sweden
- { 174, 7, 208, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 53,10 , 63,17 , 37,5 , 8,10 , 368,48 , 368,48 , 158,27 , 368,48 , 368,48 , 158,27 , 0,28 , 0,28 , 85,14 , 0,28 , 0,28 , 85,14 , 0,2 , 0,2 , 45,4 , 5,17 , 22,23 , {84,87,68}, 323,3 , 0,7 , 8,5 , 4,0 , 0,0 , 0,0 , 2, 0, 7, 6, 7 }, // Taroko/Latin/Taiwan
- { 175, 7, 111, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 119,10 , 10,17 , 37,5 , 8,10 , 26677,48 , 26725,88 , 26813,24 , 26677,48 , 26725,88 , 26813,24 , 14264,28 , 14292,62 , 14354,14 , 14264,28 , 14292,62 , 14354,14 , 488,6 , 465,3 , 45,4 , 5,17 , 22,23 , {75,69,83}, 2,3 , 15943,24 , 4,4 , 4,0 , 4830,8 , 1192,5 , 2, 1, 7, 6, 7 }, // Gusii/Latin/Kenya
- { 176, 7, 111, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 119,10 , 10,17 , 37,5 , 8,10 , 26837,48 , 26885,221 , 27106,24 , 26837,48 , 26885,221 , 27106,24 , 14368,28 , 14396,105 , 14501,14 , 14368,28 , 14396,105 , 14501,14 , 494,10 , 468,10 , 45,4 , 5,17 , 22,23 , {75,69,83}, 2,3 , 15943,24 , 4,4 , 4,0 , 4838,7 , 1192,5 , 2, 1, 7, 6, 7 }, // Taita/Latin/Kenya
- { 177, 7, 187, 44, 160, 59, 37, 48, 45, 43, 101, 8222, 8221, 8218, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 415,8 , 97,16 , 37,5 , 8,10 , 27130,48 , 27178,77 , 27255,24 , 27130,48 , 27178,77 , 27255,24 , 14515,28 , 14543,59 , 14602,14 , 14515,28 , 14543,59 , 14602,14 , 504,6 , 478,7 , 45,4 , 5,17 , 22,23 , {88,79,70}, 206,3 , 15967,26 , 13,5 , 4,0 , 4845,6 , 4401,8 , 0, 0, 1, 6, 7 }, // Fulah/Latin/Senegal
- { 177, 7, 34, 44, 160, 59, 37, 48, 45, 43, 101, 8222, 8221, 8218, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 415,8 , 97,16 , 37,5 , 8,10 , 27130,48 , 27178,77 , 27255,24 , 27130,48 , 27178,77 , 27255,24 , 14515,28 , 14543,59 , 14602,14 , 14515,28 , 14543,59 , 14602,14 , 504,6 , 478,7 , 45,4 , 5,17 , 22,23 , {88,79,70}, 206,3 , 15967,26 , 13,5 , 4,0 , 4845,6 , 4851,14 , 0, 0, 1, 6, 7 }, // Fulah/Latin/Burkina Faso
- { 177, 7, 37, 44, 160, 59, 37, 48, 45, 43, 101, 8222, 8221, 8218, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 415,8 , 97,16 , 37,5 , 8,10 , 27130,48 , 27178,77 , 27255,24 , 27130,48 , 27178,77 , 27255,24 , 14515,28 , 14543,59 , 14602,14 , 14515,28 , 14543,59 , 14602,14 , 504,6 , 478,7 , 45,4 , 5,17 , 22,23 , {88,65,70}, 32,4 , 15993,25 , 13,5 , 4,0 , 4845,6 , 4865,8 , 0, 0, 1, 6, 7 }, // Fulah/Latin/Cameroon
- { 177, 7, 80, 44, 160, 59, 37, 48, 45, 43, 101, 8222, 8221, 8218, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 415,8 , 97,16 , 18,7 , 25,12 , 27130,48 , 27178,77 , 27255,24 , 27130,48 , 27178,77 , 27255,24 , 14515,28 , 14543,59 , 14602,14 , 14515,28 , 14543,59 , 14602,14 , 504,6 , 478,7 , 45,4 , 5,17 , 22,23 , {71,77,68}, 162,1 , 16018,20 , 13,5 , 4,0 , 4845,6 , 4873,6 , 2, 1, 1, 6, 7 }, // Fulah/Latin/Gambia
- { 177, 7, 83, 44, 160, 59, 37, 48, 45, 43, 101, 8222, 8221, 8218, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 415,8 , 97,16 , 18,7 , 25,12 , 27130,48 , 27178,77 , 27255,24 , 27130,48 , 27178,77 , 27255,24 , 14515,28 , 14543,59 , 14602,14 , 14515,28 , 14543,59 , 14602,14 , 504,6 , 478,7 , 45,4 , 5,17 , 22,23 , {71,72,83}, 163,3 , 0,7 , 13,5 , 4,0 , 4845,6 , 4879,5 , 2, 1, 1, 6, 7 }, // Fulah/Latin/Ghana
- { 177, 7, 91, 44, 160, 59, 37, 48, 45, 43, 101, 8222, 8221, 8218, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 415,8 , 97,16 , 37,5 , 8,10 , 27130,48 , 27178,77 , 27255,24 , 27130,48 , 27178,77 , 27255,24 , 14515,28 , 14543,59 , 14602,14 , 14515,28 , 14543,59 , 14602,14 , 504,6 , 478,7 , 45,4 , 5,17 , 22,23 , {71,78,70}, 215,2 , 0,7 , 13,5 , 4,0 , 4845,6 , 4884,4 , 0, 0, 1, 6, 7 }, // Fulah/Latin/Guinea
- { 177, 7, 92, 44, 160, 59, 37, 48, 45, 43, 101, 8222, 8221, 8218, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 415,8 , 97,16 , 37,5 , 8,10 , 27130,48 , 27178,77 , 27255,24 , 27130,48 , 27178,77 , 27255,24 , 14515,28 , 14543,59 , 14602,14 , 14515,28 , 14543,59 , 14602,14 , 504,6 , 478,7 , 45,4 , 5,17 , 22,23 , {88,79,70}, 206,3 , 15967,26 , 13,5 , 4,0 , 4845,6 , 4888,12 , 0, 0, 1, 6, 7 }, // Fulah/Latin/Guinea Bissau
- { 177, 7, 121, 44, 160, 59, 37, 48, 45, 43, 101, 8222, 8221, 8218, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 415,8 , 97,16 , 18,7 , 25,12 , 27130,48 , 27178,77 , 27255,24 , 27130,48 , 27178,77 , 27255,24 , 14515,28 , 14543,59 , 14602,14 , 14515,28 , 14543,59 , 14602,14 , 504,6 , 478,7 , 45,4 , 5,17 , 22,23 , {76,82,68}, 6,1 , 16038,23 , 13,5 , 4,0 , 4845,6 , 4900,9 , 2, 1, 1, 6, 7 }, // Fulah/Latin/Liberia
- { 177, 7, 136, 44, 160, 59, 37, 48, 45, 43, 101, 8222, 8221, 8218, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 415,8 , 97,16 , 18,7 , 25,12 , 27130,48 , 27178,77 , 27255,24 , 27130,48 , 27178,77 , 27255,24 , 14515,28 , 14543,59 , 14602,14 , 14515,28 , 14543,59 , 14602,14 , 504,6 , 478,7 , 45,4 , 5,17 , 22,23 , {77,82,85}, 218,2 , 16061,22 , 13,5 , 4,0 , 4845,6 , 4909,8 , 2, 1, 1, 6, 7 }, // Fulah/Latin/Mauritania
- { 177, 7, 156, 44, 160, 59, 37, 48, 45, 43, 101, 8222, 8221, 8218, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 415,8 , 97,16 , 37,5 , 8,10 , 27130,48 , 27178,77 , 27255,24 , 27130,48 , 27178,77 , 27255,24 , 14515,28 , 14543,59 , 14602,14 , 14515,28 , 14543,59 , 14602,14 , 504,6 , 478,7 , 45,4 , 5,17 , 22,23 , {88,79,70}, 206,3 , 15967,26 , 13,5 , 4,0 , 4845,6 , 4917,6 , 0, 0, 1, 6, 7 }, // Fulah/Latin/Niger
- { 177, 7, 157, 44, 160, 59, 37, 48, 45, 43, 101, 8222, 8221, 8218, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 415,8 , 97,16 , 37,5 , 8,10 , 27130,48 , 27178,77 , 27255,24 , 27130,48 , 27178,77 , 27255,24 , 14515,28 , 14543,59 , 14602,14 , 14515,28 , 14543,59 , 14602,14 , 504,6 , 478,7 , 45,4 , 5,17 , 22,23 , {78,71,78}, 177,1 , 16083,23 , 13,5 , 4,0 , 4845,6 , 4923,9 , 2, 1, 1, 6, 7 }, // Fulah/Latin/Nigeria
- { 177, 7, 189, 44, 160, 59, 37, 48, 45, 43, 101, 8222, 8221, 8218, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 415,8 , 97,16 , 18,7 , 25,12 , 27130,48 , 27178,77 , 27255,24 , 27130,48 , 27178,77 , 27255,24 , 14515,28 , 14543,59 , 14602,14 , 14515,28 , 14543,59 , 14602,14 , 504,6 , 478,7 , 45,4 , 5,17 , 22,23 , {83,76,76}, 186,2 , 16106,25 , 13,5 , 4,0 , 4845,6 , 4932,11 , 0, 0, 1, 6, 7 }, // Fulah/Latin/Sierra Leone
- { 177, 134, 91, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 53,10 , 63,17 , 37,5 , 8,10 , 368,48 , 368,48 , 158,27 , 368,48 , 368,48 , 158,27 , 0,28 , 0,28 , 85,14 , 0,28 , 0,28 , 85,14 , 0,2 , 0,2 , 45,4 , 5,17 , 22,23 , {71,78,70}, 215,2 , 0,7 , 8,5 , 4,0 , 0,0 , 0,0 , 0, 0, 1, 6, 7 }, // Fulah/Adlam/Guinea
- { 178, 7, 111, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 119,10 , 10,17 , 37,5 , 8,10 , 27279,48 , 27327,185 , 27512,24 , 27279,48 , 27327,185 , 27512,24 , 14616,28 , 14644,63 , 14707,14 , 14616,28 , 14644,63 , 14707,14 , 510,6 , 485,8 , 45,4 , 5,17 , 22,23 , {75,69,83}, 2,3 , 16131,23 , 4,4 , 4,0 , 4943,6 , 1192,5 , 2, 1, 7, 6, 7 }, // Kikuyu/Latin/Kenya
- { 179, 7, 111, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 119,10 , 10,17 , 37,5 , 8,10 , 27536,48 , 27584,173 , 27757,24 , 27536,48 , 27584,173 , 27757,24 , 14721,28 , 14749,105 , 14854,14 , 14721,28 , 14749,105 , 14854,14 , 516,7 , 493,5 , 45,4 , 5,17 , 22,23 , {75,69,83}, 2,3 , 16154,25 , 4,4 , 4,0 , 4949,8 , 1192,5 , 2, 1, 7, 6, 7 }, // Samburu/Latin/Kenya
- { 180, 7, 146, 44, 46, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 415,8 , 669,27 , 37,5 , 8,10 , 27781,48 , 27829,88 , 134,24 , 27781,48 , 27829,88 , 134,24 , 14868,28 , 14896,55 , 14951,14 , 14868,28 , 14896,55 , 14951,14 , 0,2 , 0,2 , 45,4 , 5,17 , 22,23 , {77,90,78}, 266,3 , 16179,28 , 0,4 , 4,0 , 4957,4 , 3357,10 , 2, 1, 7, 6, 7 }, // Sena/Latin/Mozambique
- { 181, 7, 240, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 119,10 , 10,17 , 37,5 , 8,10 , 27917,52 , 27969,112 , 28081,24 , 27917,52 , 27969,112 , 28081,24 , 14965,28 , 14993,50 , 15043,14 , 14965,28 , 14993,50 , 15043,14 , 0,2 , 0,2 , 45,4 , 5,17 , 22,23 , {85,83,68}, 155,3 , 16207,24 , 4,4 , 4,0 , 4961,10 , 1820,8 , 2, 1, 7, 6, 7 }, // North Ndebele/Latin/Zimbabwe
- { 182, 7, 210, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 119,10 , 10,17 , 37,5 , 8,10 , 28105,39 , 28144,194 , 28338,24 , 28105,39 , 28144,194 , 28338,24 , 15057,29 , 15086,65 , 15151,14 , 15057,29 , 15086,65 , 15151,14 , 523,8 , 498,7 , 45,4 , 5,17 , 22,23 , {84,90,83}, 191,3 , 16231,25 , 4,4 , 4,0 , 4971,9 , 1625,8 , 2, 0, 1, 6, 7 }, // Rombo/Latin/Tanzania
- { 183, 9, 145, 44, 160, 59, 37, 48, 45, 43, 101, 171, 187, 8222, 8221, 0,6 , 0,6 , 0,6 , 0,6 , 415,8 , 97,16 , 37,5 , 8,10 , 28362,48 , 28410,81 , 28491,24 , 28362,48 , 28410,81 , 28491,24 , 15165,30 , 15195,47 , 85,14 , 15165,30 , 15195,47 , 85,14 , 531,6 , 505,8 , 45,4 , 5,17 , 22,23 , {77,65,68}, 0,0 , 16256,21 , 0,4 , 4,0 , 4980,7 , 4987,6 , 2, 1, 1, 6, 7 }, // Tachelhit/Tifinagh/Morocco
- { 183, 7, 145, 44, 160, 59, 37, 48, 45, 43, 101, 171, 187, 8222, 8221, 0,6 , 0,6 , 0,6 , 0,6 , 415,8 , 97,16 , 37,5 , 8,10 , 28515,48 , 28563,81 , 28644,24 , 28515,48 , 28563,81 , 28644,24 , 15242,30 , 15272,48 , 85,14 , 15242,30 , 15272,48 , 85,14 , 537,6 , 513,8 , 45,4 , 5,17 , 22,23 , {77,65,68}, 0,0 , 16277,21 , 0,4 , 4,0 , 4993,10 , 5003,6 , 2, 1, 1, 6, 7 }, // Tachelhit/Latin/Morocco
- { 184, 7, 3, 44, 160, 59, 37, 48, 45, 43, 122, 171, 187, 8220, 8221, 0,6 , 0,6 , 914,12 , 926,11 , 415,8 , 97,16 , 18,7 , 25,12 , 28668,48 , 28716,82 , 28798,24 , 28822,48 , 28870,84 , 28954,24 , 15320,28 , 15348,34 , 15382,14 , 15396,30 , 15426,51 , 15477,14 , 543,7 , 521,9 , 1193,7 , 1200,21 , 22,23 , {68,90,68}, 204,2 , 16298,53 , 0,4 , 4,0 , 5009,9 , 5018,8 , 2, 1, 6, 5, 6 }, // Kabyle/Latin/Algeria
- { 185, 7, 221, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 119,10 , 10,17 , 37,5 , 8,10 , 28978,48 , 29026,152 , 134,24 , 28978,48 , 29026,152 , 134,24 , 15491,28 , 15519,74 , 15593,14 , 15491,28 , 15519,74 , 15593,14 , 0,2 , 0,2 , 45,4 , 5,17 , 22,23 , {85,71,88}, 196,3 , 16351,26 , 4,4 , 4,0 , 5026,10 , 1690,6 , 0, 0, 1, 6, 7 }, // Nyankole/Latin/Uganda
- { 186, 7, 210, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 119,10 , 10,17 , 37,5 , 8,10 , 29178,48 , 29226,254 , 29480,24 , 29178,48 , 29226,254 , 29480,24 , 15607,28 , 15635,82 , 15717,14 , 15607,28 , 15635,82 , 15717,14 , 550,7 , 530,7 , 45,4 , 5,17 , 22,23 , {84,90,83}, 191,3 , 16377,29 , 0,4 , 4,0 , 5036,6 , 5042,10 , 2, 0, 1, 6, 7 }, // Bena/Latin/Tanzania
- { 187, 7, 210, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 119,10 , 10,17 , 37,5 , 8,10 , 19102,48 , 29504,87 , 134,24 , 19102,48 , 29504,87 , 134,24 , 15731,28 , 15759,62 , 15821,14 , 15731,28 , 15759,62 , 15821,14 , 557,5 , 537,9 , 45,4 , 5,17 , 22,23 , {84,90,83}, 191,3 , 16406,27 , 4,4 , 4,0 , 5052,8 , 1625,8 , 2, 0, 1, 6, 7 }, // Vunjo/Latin/Tanzania
- { 188, 7, 132, 46, 44, 59, 37, 48, 45, 43, 101, 171, 187, 8220, 8221, 0,6 , 0,6 , 0,6 , 0,6 , 415,8 , 97,16 , 37,5 , 8,10 , 29591,47 , 29638,92 , 29730,24 , 29591,47 , 29638,92 , 29730,24 , 15835,28 , 15863,44 , 15907,14 , 15835,28 , 15863,44 , 15907,14 , 0,2 , 0,2 , 45,4 , 5,17 , 22,23 , {88,79,70}, 206,3 , 16433,24 , 4,4 , 4,0 , 5060,9 , 2189,4 , 0, 0, 1, 6, 7 }, // Bambara/Latin/Mali
- { 188, 75, 132, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 53,10 , 63,17 , 37,5 , 8,10 , 368,48 , 368,48 , 158,27 , 368,48 , 368,48 , 158,27 , 0,28 , 0,28 , 85,14 , 0,28 , 0,28 , 85,14 , 0,2 , 0,2 , 45,4 , 5,17 , 22,23 , {88,79,70}, 206,3 , 0,7 , 8,5 , 4,0 , 0,0 , 0,0 , 0, 0, 1, 6, 7 }, // Bambara/Nko/Mali
- { 189, 7, 111, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 119,10 , 10,17 , 37,5 , 8,10 , 29754,48 , 29802,207 , 30009,24 , 29754,48 , 29802,207 , 30009,24 , 15921,28 , 15949,64 , 16013,14 , 15921,28 , 15949,64 , 16013,14 , 562,2 , 546,2 , 45,4 , 5,17 , 22,23 , {75,69,83}, 2,3 , 15943,24 , 4,4 , 4,0 , 5069,6 , 1192,5 , 2, 1, 7, 6, 7 }, // Embu/Latin/Kenya
- { 190, 12, 225, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 937,9 , 946,8 , 547,6 , 35,18 , 18,7 , 25,12 , 30033,36 , 30069,58 , 30127,24 , 30033,36 , 30069,58 , 30127,24 , 16027,28 , 16055,49 , 16104,14 , 16027,28 , 16055,49 , 16104,14 , 564,3 , 548,6 , 1221,6 , 5,17 , 22,23 , {85,83,68}, 6,1 , 16457,25 , 4,4 , 4,0 , 5075,3 , 5078,15 , 2, 1, 7, 6, 7 }, // Cherokee/Cherokee/United States
- { 191, 7, 137, 46, 160, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 415,8 , 97,16 , 37,5 , 8,10 , 30151,47 , 30198,68 , 30266,24 , 30151,47 , 30198,68 , 30266,24 , 16118,27 , 16145,48 , 16193,14 , 16118,27 , 16145,48 , 16193,14 , 0,2 , 0,2 , 45,4 , 5,17 , 22,23 , {77,85,82}, 175,2 , 16482,21 , 41,6 , 4,0 , 5093,14 , 5107,5 , 2, 0, 1, 6, 7 }, // Morisyen/Latin/Mauritius
- { 192, 7, 210, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 119,10 , 10,17 , 37,5 , 8,10 , 19102,48 , 30290,264 , 134,24 , 19102,48 , 30290,264 , 134,24 , 16207,28 , 16235,133 , 15151,14 , 16207,28 , 16235,133 , 15151,14 , 567,4 , 554,5 , 45,4 , 5,17 , 22,23 , {84,90,83}, 191,3 , 16406,27 , 4,4 , 4,0 , 5112,10 , 1625,8 , 2, 0, 1, 6, 7 }, // Makonde/Latin/Tanzania
- { 193, 7, 210, 46, 44, 59, 37, 48, 45, 43, 101, 8221, 8221, 8217, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 119,10 , 10,17 , 37,5 , 8,10 , 30554,83 , 30637,111 , 30748,24 , 30554,83 , 30637,111 , 30748,24 , 16368,36 , 16404,63 , 16467,14 , 16368,36 , 16404,63 , 16467,14 , 571,3 , 559,3 , 45,4 , 5,17 , 22,23 , {84,90,83}, 191,3 , 16503,29 , 41,6 , 4,0 , 5122,8 , 5130,9 , 2, 0, 1, 6, 7 }, // Langi/Latin/Tanzania
- { 194, 7, 221, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 119,10 , 10,17 , 37,5 , 8,10 , 30772,48 , 30820,97 , 134,24 , 30772,48 , 30820,97 , 134,24 , 16481,28 , 16509,66 , 16575,14 , 16481,28 , 16509,66 , 16575,14 , 0,2 , 0,2 , 45,4 , 5,17 , 22,23 , {85,71,88}, 196,3 , 16532,26 , 0,4 , 4,0 , 5139,7 , 5146,7 , 0, 0, 1, 6, 7 }, // Ganda/Latin/Uganda
- { 195, 7, 239, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 119,10 , 10,17 , 18,7 , 25,12 , 30917,48 , 30965,83 , 31048,24 , 30917,48 , 30965,83 , 31048,24 , 16589,80 , 16589,80 , 85,14 , 16589,80 , 16589,80 , 85,14 , 574,8 , 562,7 , 45,4 , 5,17 , 22,23 , {90,77,87}, 131,1 , 0,7 , 4,4 , 4,0 , 5153,9 , 1814,6 , 2, 1, 1, 6, 7 }, // Bemba/Latin/Zambia
- { 196, 7, 39, 44, 160, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 163,7 , 163,7 , 415,8 , 1656,27 , 37,5 , 8,10 , 31072,48 , 31120,85 , 134,24 , 31072,48 , 31120,85 , 134,24 , 16669,28 , 16697,73 , 16770,14 , 16669,28 , 16784,73 , 16770,14 , 68,2 , 65,2 , 45,4 , 5,17 , 22,23 , {67,86,69}, 265,1 , 16558,43 , 13,5 , 4,0 , 5162,12 , 5174,10 , 2, 1, 1, 6, 7 }, // Kabuverdianu/Latin/Cape Verde
- { 197, 7, 111, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 119,10 , 10,17 , 37,5 , 8,10 , 31205,48 , 31253,86 , 31339,24 , 31205,48 , 31253,86 , 31339,24 , 16857,28 , 16885,51 , 16936,14 , 16857,28 , 16885,51 , 16936,14 , 582,2 , 569,2 , 45,4 , 5,17 , 22,23 , {75,69,83}, 2,3 , 15943,24 , 4,4 , 4,0 , 5184,6 , 1192,5 , 2, 1, 7, 6, 7 }, // Meru/Latin/Kenya
- { 198, 7, 111, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 119,10 , 10,17 , 37,5 , 8,10 , 31363,49 , 31412,121 , 31533,24 , 31363,49 , 31412,121 , 31533,24 , 16950,28 , 16978,53 , 17031,14 , 16950,28 , 16978,53 , 17031,14 , 584,6 , 571,10 , 45,4 , 5,17 , 22,23 , {75,69,83}, 2,3 , 16601,26 , 4,4 , 4,0 , 5190,8 , 5198,12 , 2, 1, 7, 6, 7 }, // Kalenjin/Latin/Kenya
- { 199, 7, 148, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 119,10 , 10,17 , 18,7 , 25,12 , 0,48 , 31557,136 , 134,24 , 0,48 , 31557,136 , 134,24 , 17045,23 , 17068,92 , 17160,14 , 17045,23 , 17068,92 , 17160,14 , 590,7 , 581,5 , 45,4 , 5,17 , 22,23 , {78,65,68}, 6,1 , 16627,22 , 4,4 , 4,0 , 5210,13 , 5223,8 , 2, 1, 1, 6, 7 }, // Nama/Latin/Namibia
- { 200, 7, 210, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 119,10 , 10,17 , 37,5 , 8,10 , 19102,48 , 29504,87 , 134,24 , 19102,48 , 29504,87 , 134,24 , 15731,28 , 15759,62 , 15821,14 , 15731,28 , 15759,62 , 15821,14 , 557,5 , 537,9 , 45,4 , 5,17 , 22,23 , {84,90,83}, 191,3 , 16406,27 , 4,4 , 4,0 , 5231,9 , 1625,8 , 2, 0, 1, 6, 7 }, // Machame/Latin/Tanzania
- { 201, 7, 82, 44, 160, 59, 37, 48, 8722, 43, 101, 8222, 8220, 8218, 8216, 0,6 , 0,6 , 461,8 , 461,8 , 1134,10 , 1683,23 , 37,5 , 8,10 , 31693,59 , 31752,87 , 12992,24 , 31839,48 , 31752,87 , 12992,24 , 17174,28 , 17202,72 , 3668,14 , 17174,28 , 17202,72 , 3668,14 , 597,16 , 586,16 , 45,4 , 5,17 , 22,23 , {69,85,82}, 14,1 , 16649,11 , 13,5 , 4,0 , 5240,6 , 5246,11 , 2, 1, 1, 6, 7 }, // Colognian/Latin/Germany
- { 202, 7, 111, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 119,10 , 10,17 , 37,5 , 8,10 , 31887,51 , 31938,132 , 158,27 , 31887,51 , 31938,132 , 158,27 , 15731,28 , 17274,58 , 15151,14 , 15731,28 , 17274,58 , 15151,14 , 613,9 , 602,6 , 45,4 , 5,17 , 22,23 , {75,69,83}, 2,3 , 16660,25 , 4,4 , 4,0 , 5257,3 , 1192,5 , 2, 1, 7, 6, 7 }, // Masai/Latin/Kenya
- { 202, 7, 210, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 119,10 , 10,17 , 37,5 , 8,10 , 31887,51 , 31938,132 , 158,27 , 31887,51 , 31938,132 , 158,27 , 15731,28 , 17274,58 , 15151,14 , 15731,28 , 17274,58 , 15151,14 , 613,9 , 602,6 , 45,4 , 5,17 , 22,23 , {84,90,83}, 191,3 , 16685,28 , 4,4 , 4,0 , 5257,3 , 5260,8 , 2, 0, 1, 6, 7 }, // Masai/Latin/Tanzania
- { 203, 7, 221, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 119,10 , 10,17 , 37,5 , 8,10 , 30772,48 , 30820,97 , 134,24 , 30772,48 , 30820,97 , 134,24 , 17332,35 , 17367,65 , 17432,14 , 17332,35 , 17367,65 , 17432,14 , 622,6 , 608,6 , 45,4 , 5,17 , 22,23 , {85,71,88}, 196,3 , 16532,26 , 13,5 , 4,0 , 5268,7 , 5146,7 , 0, 0, 1, 6, 7 }, // Soga/Latin/Uganda
- { 204, 7, 111, 46, 44, 59, 37, 48, 45, 43, 101, 8222, 8220, 8218, 8216, 0,6 , 0,6 , 0,6 , 0,6 , 119,10 , 10,17 , 37,5 , 8,10 , 32070,48 , 19150,84 , 134,24 , 32070,48 , 19150,84 , 134,24 , 17446,21 , 17467,75 , 85,14 , 17446,21 , 17467,75 , 85,14 , 64,4 , 61,4 , 45,4 , 5,17 , 22,23 , {75,69,83}, 2,3 , 16713,23 , 4,4 , 96,6 , 5275,7 , 1192,5 , 2, 1, 7, 6, 7 }, // Luyia/Latin/Kenya
- { 205, 7, 210, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 119,10 , 10,17 , 37,5 , 8,10 , 32118,48 , 19150,84 , 134,24 , 32118,48 , 19150,84 , 134,24 , 17542,28 , 10010,60 , 15821,14 , 17542,28 , 10010,60 , 15821,14 , 628,9 , 614,8 , 45,4 , 5,17 , 22,23 , {84,90,83}, 191,3 , 16736,28 , 13,5 , 4,0 , 5282,6 , 5288,8 , 2, 0, 1, 6, 7 }, // Asu/Latin/Tanzania
- { 206, 7, 221, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 119,10 , 10,17 , 37,5 , 8,10 , 32166,48 , 32214,94 , 32308,24 , 32166,48 , 32214,94 , 32308,24 , 17570,28 , 17598,69 , 17667,14 , 17570,28 , 17598,69 , 17667,14 , 637,9 , 622,6 , 45,4 , 5,17 , 22,23 , {85,71,88}, 196,3 , 16764,28 , 4,4 , 4,0 , 5296,6 , 1690,6 , 0, 0, 1, 6, 7 }, // Teso/Latin/Uganda
- { 206, 7, 111, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 119,10 , 10,17 , 37,5 , 8,10 , 32166,48 , 32214,94 , 32308,24 , 32166,48 , 32214,94 , 32308,24 , 17570,28 , 17598,69 , 17667,14 , 17570,28 , 17598,69 , 17667,14 , 637,9 , 622,6 , 45,4 , 5,17 , 22,23 , {75,69,83}, 2,3 , 16792,27 , 4,4 , 4,0 , 5296,6 , 5302,5 , 2, 1, 7, 6, 7 }, // Teso/Latin/Kenya
- { 207, 7, 67, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 53,10 , 63,17 , 37,5 , 8,10 , 368,48 , 368,48 , 158,27 , 368,48 , 368,48 , 158,27 , 0,28 , 0,28 , 85,14 , 0,28 , 0,28 , 85,14 , 0,2 , 0,2 , 45,4 , 5,17 , 22,23 , {69,82,78}, 0,0 , 0,7 , 8,5 , 4,0 , 0,0 , 0,0 , 2, 1, 1, 6, 7 }, // Saho/Latin/Eritrea
- { 208, 7, 132, 46, 160, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 415,8 , 97,16 , 37,5 , 8,10 , 32332,46 , 32378,88 , 32466,24 , 32332,46 , 32378,88 , 32466,24 , 17681,28 , 17709,53 , 17762,14 , 17681,28 , 17709,53 , 17762,14 , 646,6 , 628,6 , 45,4 , 5,17 , 22,23 , {88,79,70}, 206,3 , 16819,23 , 0,4 , 4,0 , 5307,11 , 5318,5 , 0, 0, 1, 6, 7 }, // Koyra Chiini/Latin/Mali
- { 209, 7, 210, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 119,10 , 10,17 , 37,5 , 8,10 , 19102,48 , 29504,87 , 134,24 , 19102,48 , 29504,87 , 134,24 , 15731,28 , 15759,62 , 15821,14 , 15731,28 , 15759,62 , 15821,14 , 557,5 , 537,9 , 45,4 , 5,17 , 22,23 , {84,90,83}, 191,3 , 16406,27 , 0,4 , 4,0 , 5323,6 , 1625,8 , 2, 0, 1, 6, 7 }, // Rwa/Latin/Tanzania
- { 210, 7, 111, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 119,10 , 10,17 , 37,5 , 8,10 , 32490,48 , 32538,186 , 32724,24 , 32490,48 , 32538,186 , 32724,24 , 17776,28 , 17804,69 , 17873,14 , 17776,28 , 17804,69 , 17873,14 , 652,2 , 634,2 , 45,4 , 5,17 , 22,23 , {75,69,83}, 2,3 , 16842,23 , 0,4 , 4,0 , 5329,6 , 1192,5 , 2, 1, 7, 6, 7 }, // Luo/Latin/Kenya
- { 211, 7, 221, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 119,10 , 10,17 , 37,5 , 8,10 , 28978,48 , 29026,152 , 134,24 , 28978,48 , 29026,152 , 134,24 , 15491,28 , 15519,74 , 15593,14 , 15491,28 , 15519,74 , 15593,14 , 0,2 , 0,2 , 45,4 , 5,17 , 22,23 , {85,71,88}, 196,3 , 16351,26 , 4,4 , 4,0 , 5335,6 , 1690,6 , 0, 0, 1, 6, 7 }, // Chiga/Latin/Uganda
- { 212, 7, 145, 44, 160, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 119,10 , 10,17 , 37,5 , 8,10 , 32748,48 , 32796,86 , 32882,24 , 32748,48 , 32796,86 , 32882,24 , 17887,28 , 17915,48 , 17963,14 , 17887,28 , 17915,48 , 17963,14 , 654,9 , 636,10 , 45,4 , 5,17 , 22,23 , {77,65,68}, 0,0 , 16865,22 , 13,5 , 4,0 , 5341,17 , 5358,6 , 2, 1, 1, 6, 7 }, // Central Morocco Tamazight/Latin/Morocco
- { 213, 7, 132, 46, 160, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 415,8 , 97,16 , 37,5 , 8,10 , 32332,46 , 32378,88 , 32466,24 , 32332,46 , 32378,88 , 32466,24 , 17977,28 , 18005,54 , 17762,14 , 17977,28 , 18005,54 , 17762,14 , 646,6 , 628,6 , 45,4 , 5,17 , 22,23 , {88,79,70}, 206,3 , 16819,23 , 0,4 , 4,0 , 5364,15 , 5318,5 , 0, 0, 1, 6, 7 }, // Koyraboro Senni/Latin/Mali
- { 214, 7, 210, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 119,10 , 10,17 , 37,5 , 8,10 , 19102,48 , 32906,84 , 134,24 , 19102,48 , 32906,84 , 134,24 , 18059,28 , 18087,63 , 18150,14 , 18059,28 , 18087,63 , 18150,14 , 663,5 , 646,8 , 45,4 , 5,17 , 22,23 , {84,90,83}, 191,3 , 16887,27 , 0,4 , 4,0 , 5379,9 , 1625,8 , 2, 0, 1, 6, 7 }, // Shambala/Latin/Tanzania
- { 215, 13, 100, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 547,6 , 35,18 , 18,7 , 25,12 , 32990,88 , 32990,88 , 33078,31 , 32990,88 , 32990,88 , 33078,31 , 18164,33 , 18197,54 , 18251,19 , 18164,33 , 18197,54 , 18251,19 , 668,3 , 654,6 , 45,4 , 5,17 , 22,23 , {73,78,82}, 121,1 , 16914,10 , 8,5 , 4,0 , 5388,4 , 2667,4 , 2, 1, 7, 7, 7 }, // Bodo/Devanagari/India
- { 218, 2, 178, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 53,10 , 63,17 , 37,5 , 8,10 , 21930,48 , 11141,80 , 11058,24 , 21930,48 , 11141,80 , 11058,24 , 18270,25 , 18295,45 , 18340,17 , 18270,25 , 18295,45 , 18270,25 , 0,2 , 0,2 , 45,4 , 5,17 , 22,23 , {82,85,66}, 123,1 , 16924,43 , 13,5 , 4,0 , 5392,7 , 5399,5 , 2, 1, 1, 6, 7 }, // Chechen/Cyrillic/Russia
- { 219, 2, 178, 44, 160, 59, 37, 48, 45, 43, 101, 171, 187, 8222, 8220, 0,6 , 0,6 , 954,8 , 954,8 , 1010,10 , 1706,23 , 37,5 , 8,10 , 33109,65 , 33174,117 , 33291,30 , 33109,65 , 33321,117 , 33291,30 , 18357,37 , 18394,68 , 11435,14 , 18357,37 , 18394,68 , 11435,14 , 0,2 , 0,2 , 45,4 , 5,17 , 22,23 , {82,85,66}, 123,1 , 16967,44 , 13,5 , 4,0 , 5404,19 , 5423,7 , 2, 1, 1, 6, 7 }, // Church/Cyrillic/Russia
- { 220, 2, 178, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 53,10 , 63,17 , 37,5 , 8,10 , 368,48 , 368,48 , 158,27 , 368,48 , 368,48 , 158,27 , 0,28 , 0,28 , 85,14 , 0,28 , 0,28 , 85,14 , 0,2 , 0,2 , 45,4 , 5,17 , 22,23 , {82,85,66}, 123,1 , 0,7 , 8,5 , 4,0 , 0,0 , 0,0 , 2, 1, 1, 6, 7 }, // Chuvash/Cyrillic/Russia
- { 230, 7, 49, 44, 46, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 415,8 , 97,16 , 37,5 , 8,10 , 33438,49 , 33487,99 , 33586,24 , 33438,49 , 33487,99 , 33586,24 , 18462,28 , 18490,50 , 18540,14 , 18462,28 , 18490,50 , 18540,14 , 671,5 , 660,6 , 45,4 , 5,17 , 22,23 , {67,68,70}, 209,2 , 17011,24 , 0,4 , 4,0 , 5430,8 , 5438,16 , 2, 1, 1, 6, 7 }, // Luba Katanga/Latin/Congo Kinshasa
- { 231, 7, 125, 44, 46, 59, 37, 48, 45, 43, 101, 8222, 8220, 8218, 8216, 0,6 , 0,6 , 962,10 , 962,10 , 156,8 , 622,18 , 37,5 , 8,10 , 33610,48 , 33658,85 , 134,24 , 33743,59 , 33658,85 , 134,24 , 18554,28 , 18582,65 , 3668,14 , 18647,35 , 18582,65 , 3668,14 , 676,5 , 666,8 , 462,5 , 5,17 , 22,23 , {69,85,82}, 14,1 , 8439,19 , 13,5 , 4,0 , 5454,14 , 5468,10 , 2, 1, 1, 6, 7 }, // Luxembourgish/Latin/Luxembourg
- { 236, 7, 21, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 53,10 , 63,17 , 37,5 , 8,10 , 368,48 , 368,48 , 158,27 , 368,48 , 368,48 , 158,27 , 0,28 , 0,28 , 85,14 , 0,28 , 0,28 , 85,14 , 0,2 , 0,2 , 45,4 , 5,17 , 22,23 , {69,85,82}, 14,1 , 0,7 , 8,5 , 4,0 , 0,0 , 0,0 , 2, 1, 1, 6, 7 }, // Walloon/Latin/Belgium
- { 237, 7, 37, 44, 160, 59, 37, 48, 45, 43, 101, 8222, 8221, 8218, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 415,8 , 97,16 , 37,5 , 8,10 , 33802,48 , 33850,195 , 34045,24 , 33802,48 , 33850,195 , 34045,24 , 18682,28 , 18710,72 , 18782,14 , 18682,28 , 18710,72 , 18782,14 , 681,3 , 674,3 , 45,4 , 5,17 , 22,23 , {88,65,70}, 32,4 , 17035,21 , 0,4 , 4,0 , 5478,5 , 5483,7 , 0, 0, 1, 6, 7 }, // Aghem/Latin/Cameroon
- { 238, 7, 37, 44, 160, 59, 37, 48, 45, 43, 101, 171, 187, 8222, 8220, 0,6 , 0,6 , 0,6 , 0,6 , 415,8 , 97,16 , 37,5 , 8,10 , 34069,48 , 34117,90 , 34207,24 , 34069,48 , 34117,90 , 34207,24 , 18796,28 , 18824,70 , 18894,14 , 18796,28 , 18824,70 , 18894,14 , 684,10 , 677,9 , 45,4 , 5,17 , 22,23 , {88,65,70}, 32,4 , 17056,22 , 13,5 , 4,0 , 5490,5 , 5495,8 , 0, 0, 1, 6, 7 }, // Basaa/Latin/Cameroon
- { 239, 7, 156, 46, 160, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 415,8 , 97,16 , 37,5 , 8,10 , 32332,46 , 32378,88 , 32466,24 , 32332,46 , 32378,88 , 32466,24 , 17977,28 , 18908,53 , 18961,14 , 17977,28 , 18908,53 , 18961,14 , 694,8 , 686,10 , 45,4 , 5,17 , 22,23 , {88,79,70}, 206,3 , 16819,23 , 0,4 , 4,0 , 5503,10 , 5513,5 , 0, 0, 1, 6, 7 }, // Zarma/Latin/Niger
- { 240, 7, 37, 44, 160, 59, 37, 48, 45, 43, 101, 171, 187, 8216, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 415,8 , 97,16 , 37,5 , 8,10 , 34231,49 , 34280,99 , 34379,24 , 34231,49 , 34280,99 , 34379,24 , 18975,28 , 19003,45 , 19048,14 , 18975,28 , 19003,45 , 19048,14 , 702,5 , 696,6 , 45,4 , 5,17 , 22,23 , {88,65,70}, 32,4 , 0,7 , 13,5 , 4,0 , 5518,5 , 1986,8 , 0, 0, 1, 6, 7 }, // Duala/Latin/Cameroon
- { 241, 7, 187, 44, 160, 59, 37, 48, 45, 43, 101, 171, 187, 8220, 8221, 0,6 , 0,6 , 0,6 , 0,6 , 415,8 , 97,16 , 37,5 , 8,10 , 34403,36 , 34439,82 , 34521,24 , 34403,36 , 34439,82 , 34521,24 , 19062,28 , 19090,50 , 19140,14 , 19062,28 , 19090,50 , 19140,14 , 0,2 , 0,2 , 45,4 , 5,17 , 22,23 , {88,79,70}, 206,3 , 17078,23 , 13,5 , 4,0 , 5523,5 , 5528,7 , 0, 0, 1, 6, 7 }, // Jola Fonyi/Latin/Senegal
- { 242, 7, 37, 44, 160, 59, 37, 48, 45, 43, 101, 171, 187, 8220, 8221, 0,6 , 0,6 , 0,6 , 0,6 , 415,8 , 97,16 , 37,5 , 8,10 , 34545,50 , 34595,141 , 34736,24 , 34545,50 , 34595,141 , 34736,24 , 19154,30 , 19184,85 , 19269,14 , 19154,30 , 19184,85 , 19269,14 , 707,7 , 702,9 , 45,4 , 5,17 , 22,23 , {88,65,70}, 32,4 , 17101,23 , 13,5 , 4,0 , 5535,6 , 5541,7 , 0, 0, 1, 6, 7 }, // Ewondo/Latin/Cameroon
- { 243, 7, 37, 44, 160, 59, 37, 48, 45, 43, 101, 171, 187, 8216, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 415,8 , 97,16 , 37,5 , 8,10 , 34760,39 , 34799,191 , 158,27 , 34760,39 , 34799,191 , 158,27 , 19283,29 , 19312,45 , 19357,14 , 19283,29 , 19312,45 , 19357,14 , 714,6 , 711,7 , 45,4 , 5,17 , 22,23 , {88,65,70}, 32,4 , 17124,11 , 13,5 , 4,0 , 5548,5 , 5553,7 , 0, 0, 1, 6, 7 }, // Bafia/Latin/Cameroon
- { 244, 7, 146, 44, 46, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 119,10 , 10,17 , 37,5 , 8,10 , 34990,48 , 35038,213 , 35251,24 , 34990,48 , 35038,213 , 35251,24 , 19371,28 , 19399,59 , 19458,14 , 19371,28 , 19399,59 , 19458,14 , 720,8 , 718,10 , 45,4 , 5,17 , 22,23 , {77,90,78}, 266,3 , 0,7 , 41,6 , 4,0 , 5560,5 , 5565,10 , 2, 1, 7, 6, 7 }, // Makhuwa Meetto/Latin/Mozambique
- { 245, 7, 37, 44, 46, 59, 37, 48, 45, 43, 101, 171, 187, 8220, 8221, 0,6 , 0,6 , 0,6 , 0,6 , 415,8 , 97,16 , 37,5 , 8,10 , 35275,48 , 35323,139 , 35462,24 , 35275,48 , 35323,139 , 35462,24 , 19472,28 , 19500,74 , 19574,14 , 19472,28 , 19500,74 , 19574,14 , 728,5 , 728,5 , 45,4 , 5,17 , 22,23 , {88,65,70}, 32,4 , 17135,17 , 4,4 , 4,0 , 5575,6 , 5581,7 , 0, 0, 1, 6, 7 }, // Mundang/Latin/Cameroon
- { 246, 7, 37, 44, 160, 59, 37, 48, 45, 43, 101, 8222, 8221, 171, 187, 0,6 , 0,6 , 0,6 , 0,6 , 415,8 , 97,16 , 37,5 , 8,10 , 35486,51 , 35537,143 , 158,27 , 35486,51 , 35537,143 , 158,27 , 19588,30 , 19618,89 , 19707,14 , 19588,30 , 19618,89 , 19707,14 , 733,4 , 733,4 , 45,4 , 5,17 , 22,23 , {88,65,70}, 32,4 , 17152,20 , 13,5 , 4,0 , 5588,6 , 5594,7 , 0, 0, 1, 6, 7 }, // Kwasio/Latin/Cameroon
- { 247, 7, 254, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 538,9 , 97,16 , 18,7 , 558,12 , 35680,54 , 35734,96 , 35830,24 , 35680,54 , 35734,96 , 35830,24 , 19721,38 , 19759,79 , 19838,14 , 19721,38 , 19759,79 , 19838,14 , 737,2 , 737,2 , 45,4 , 5,17 , 22,23 , {83,83,80}, 119,1 , 0,7 , 4,4 , 4,0 , 5601,9 , 0,0 , 2, 1, 1, 6, 7 }, // Nuer/Latin/South Sudan
- { 248, 2, 178, 44, 160, 59, 37, 48, 45, 43, 101, 171, 187, 8222, 8220, 0,6 , 0,6 , 972,11 , 972,11 , 227,6 , 1729,30 , 37,5 , 8,10 , 35854,50 , 35904,116 , 36020,24 , 35854,50 , 36044,121 , 36020,24 , 19852,21 , 19873,71 , 19944,14 , 19852,21 , 19873,71 , 19944,14 , 739,2 , 739,2 , 1227,5 , 1232,17 , 22,23 , {82,85,66}, 123,1 , 17172,47 , 13,5 , 4,0 , 5610,9 , 5619,9 , 2, 1, 1, 6, 7 }, // Sakha/Cyrillic/Russia
- { 249, 7, 210, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 119,10 , 10,17 , 37,5 , 8,10 , 36165,48 , 36213,117 , 158,27 , 36165,48 , 36213,117 , 158,27 , 19958,28 , 19986,60 , 20046,14 , 19958,28 , 19986,60 , 20046,14 , 741,9 , 741,9 , 45,4 , 5,17 , 22,23 , {84,90,83}, 191,3 , 17219,25 , 0,4 , 4,0 , 5628,9 , 5637,9 , 2, 0, 1, 6, 7 }, // Sangu/Latin/Tanzania
- { 251, 7, 156, 46, 160, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 415,8 , 97,16 , 37,5 , 8,10 , 32332,46 , 32378,88 , 32466,24 , 32332,46 , 32378,88 , 32466,24 , 17977,28 , 18005,54 , 17762,14 , 17977,28 , 18005,54 , 17762,14 , 694,8 , 686,10 , 45,4 , 5,17 , 22,23 , {88,79,70}, 206,3 , 16819,23 , 0,4 , 4,0 , 5646,13 , 5513,5 , 0, 0, 1, 6, 7 }, // Tasawaq/Latin/Niger
- { 252, 35, 121, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 119,10 , 10,17 , 18,7 , 25,12 , 36330,38 , 36368,61 , 158,27 , 36330,38 , 36368,61 , 158,27 , 20060,30 , 20060,30 , 85,14 , 20060,30 , 20060,30 , 85,14 , 0,2 , 0,2 , 45,4 , 5,17 , 22,23 , {76,82,68}, 6,1 , 17244,15 , 4,4 , 4,0 , 5659,2 , 5661,4 , 2, 1, 1, 6, 7 }, // Vai/Vai/Liberia
- { 252, 7, 121, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 119,10 , 10,17 , 18,7 , 25,12 , 36429,81 , 36429,81 , 158,27 , 36429,81 , 36429,81 , 158,27 , 20090,48 , 20090,48 , 85,14 , 20090,48 , 20090,48 , 85,14 , 0,2 , 0,2 , 45,4 , 5,17 , 22,23 , {76,82,68}, 6,1 , 17259,20 , 4,4 , 4,0 , 5665,3 , 5668,8 , 2, 1, 1, 6, 7 }, // Vai/Latin/Liberia
- { 253, 7, 206, 44, 8217, 59, 37, 48, 45, 43, 101, 171, 187, 8249, 8250, 0,6 , 0,6 , 269,9 , 269,9 , 53,10 , 622,18 , 37,5 , 8,10 , 36510,48 , 36558,99 , 36657,24 , 36510,48 , 36558,99 , 36657,24 , 20138,28 , 20166,53 , 20219,14 , 20138,28 , 20166,53 , 20219,14 , 0,2 , 0,2 , 45,4 , 5,17 , 22,23 , {67,72,70}, 0,0 , 0,7 , 41,6 , 4,0 , 5676,6 , 5682,6 , 2, 0, 1, 6, 7 }, // Walser/Latin/Switzerland
- { 254, 7, 37, 44, 160, 59, 37, 48, 45, 43, 101, 171, 187, 171, 187, 0,6 , 0,6 , 0,6 , 0,6 , 415,8 , 97,16 , 37,5 , 8,10 , 36681,51 , 36732,191 , 158,27 , 36681,51 , 36732,191 , 158,27 , 20233,21 , 20254,71 , 20325,14 , 20233,21 , 20254,71 , 20325,14 , 750,8 , 750,8 , 45,4 , 5,17 , 22,23 , {88,65,70}, 32,4 , 0,7 , 13,5 , 4,0 , 5688,6 , 5694,7 , 0, 0, 1, 6, 7 }, // Yangben/Latin/Cameroon
- { 256, 7, 197, 44, 46, 59, 37, 48, 45, 43, 101, 171, 187, 8220, 8221, 0,6 , 0,6 , 683,7 , 683,7 , 269,6 , 372,22 , 37,5 , 8,10 , 36923,48 , 36971,85 , 37056,24 , 37080,48 , 37128,117 , 37056,24 , 20339,28 , 20367,54 , 3364,14 , 20339,28 , 20367,54 , 3364,14 , 758,12 , 758,11 , 0,5 , 5,17 , 22,23 , {69,85,82}, 14,1 , 3102,20 , 13,5 , 4,0 , 5701,9 , 2432,6 , 2, 1, 1, 6, 7 }, // Asturian/Latin/Spain
- { 257, 7, 37, 44, 46, 59, 37, 48, 45, 43, 101, 171, 187, 8249, 8250, 983,11 , 983,11 , 994,16 , 1010,9 , 53,10 , 1559,18 , 37,5 , 8,10 , 37245,174 , 37245,174 , 158,27 , 37245,174 , 37245,174 , 158,27 , 20421,60 , 20421,60 , 20481,25 , 20421,60 , 20421,60 , 20481,25 , 770,8 , 769,13 , 45,4 , 5,17 , 22,23 , {88,65,70}, 32,4 , 17279,12 , 8,5 , 4,0 , 5710,5 , 5715,7 , 0, 0, 1, 6, 7 }, // Ngomba/Latin/Cameroon
- { 258, 7, 37, 44, 46, 59, 37, 48, 45, 43, 101, 171, 187, 8249, 8250, 0,6 , 0,6 , 0,6 , 0,6 , 1759,10 , 80,17 , 37,5 , 8,10 , 37419,102 , 37419,102 , 158,27 , 37419,102 , 37419,102 , 158,27 , 20506,54 , 20506,54 , 20560,21 , 20506,54 , 20506,54 , 20560,21 , 0,2 , 0,2 , 45,4 , 5,17 , 22,23 , {88,65,70}, 32,4 , 17291,16 , 41,6 , 4,0 , 5722,4 , 5726,7 , 0, 0, 1, 6, 7 }, // Kako/Latin/Cameroon
- { 259, 7, 37, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 53,10 , 1559,18 , 37,5 , 8,10 , 37521,137 , 37658,142 , 37800,36 , 37521,137 , 37658,142 , 37800,36 , 20581,49 , 20581,49 , 20630,21 , 20581,49 , 20581,49 , 20630,21 , 0,2 , 0,2 , 45,4 , 5,17 , 22,23 , {88,65,70}, 32,4 , 17307,12 , 8,5 , 4,0 , 5733,5 , 5738,7 , 0, 0, 1, 6, 7 }, // Meta/Latin/Cameroon
- { 260, 7, 37, 44, 46, 59, 37, 48, 45, 43, 101, 171, 187, 8220, 8221, 0,6 , 0,6 , 0,6 , 0,6 , 27,8 , 1769,32 , 37,5 , 8,10 , 37836,165 , 37836,165 , 158,27 , 37836,165 , 37836,165 , 158,27 , 20651,111 , 20651,111 , 85,14 , 20651,111 , 20651,111 , 85,14 , 778,9 , 782,8 , 45,4 , 5,17 , 22,23 , {88,65,70}, 32,4 , 17319,16 , 8,5 , 4,0 , 5745,16 , 5761,7 , 0, 0, 1, 6, 7 }, // Ngiemboon/Latin/Cameroon
- { 290, 11, 100, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 53,10 , 63,17 , 37,5 , 8,10 , 368,48 , 368,48 , 158,27 , 368,48 , 368,48 , 158,27 , 0,28 , 0,28 , 85,14 , 0,28 , 0,28 , 85,14 , 0,2 , 0,2 , 45,4 , 5,17 , 22,23 , {73,78,82}, 121,1 , 0,7 , 8,5 , 4,0 , 0,0 , 0,0 , 2, 1, 7, 7, 7 }, // Manipuri/Bengali/India
- { 309, 100, 232, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 53,10 , 63,17 , 37,5 , 8,10 , 368,48 , 368,48 , 158,27 , 368,48 , 368,48 , 158,27 , 0,28 , 0,28 , 85,14 , 0,28 , 0,28 , 85,14 , 0,2 , 0,2 , 45,4 , 5,17 , 22,23 , {86,78,68}, 322,1 , 0,7 , 8,5 , 4,0 , 0,0 , 0,0 , 0, 0, 1, 6, 7 }, // Tai Dam/Tai Viet/Vietnam
- { 312, 7, 37, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 53,10 , 63,17 , 37,5 , 8,10 , 368,48 , 368,48 , 158,27 , 368,48 , 368,48 , 158,27 , 0,28 , 0,28 , 85,14 , 0,28 , 0,28 , 85,14 , 0,2 , 0,2 , 45,4 , 5,17 , 22,23 , {88,65,70}, 32,4 , 0,7 , 8,5 , 4,0 , 0,0 , 0,0 , 0, 0, 1, 6, 7 }, // Akoose/Latin/Cameroon
- { 313, 7, 225, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 547,6 , 35,18 , 18,7 , 25,12 , 38001,180 , 38001,180 , 158,27 , 38001,180 , 38001,180 , 158,27 , 20762,87 , 20762,87 , 85,14 , 20762,87 , 20762,87 , 20849,14 , 0,2 , 0,2 , 45,4 , 5,17 , 22,23 , {85,83,68}, 6,1 , 0,7 , 41,6 , 4,0 , 5768,12 , 5780,22 , 2, 1, 7, 6, 7 }, // Lakota/Latin/United States
- { 314, 9, 145, 44, 160, 59, 37, 48, 45, 43, 101, 171, 187, 8222, 8221, 0,6 , 0,6 , 0,6 , 0,6 , 415,8 , 97,16 , 37,5 , 8,10 , 28362,48 , 28410,81 , 28491,24 , 28362,48 , 28410,81 , 28491,24 , 15165,30 , 20863,48 , 85,14 , 15165,30 , 20863,48 , 85,14 , 531,6 , 505,8 , 45,4 , 5,17 , 22,23 , {77,65,68}, 0,0 , 16256,21 , 0,4 , 4,0 , 5802,8 , 4987,6 , 2, 1, 1, 6, 7 }, // Standard Moroccan Tamazight/Tifinagh/Morocco
- { 315, 7, 43, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 53,10 , 63,17 , 37,5 , 8,10 , 368,48 , 368,48 , 158,27 , 368,48 , 368,48 , 158,27 , 0,28 , 0,28 , 85,14 , 0,28 , 0,28 , 85,14 , 0,2 , 0,2 , 45,4 , 5,17 , 22,23 , {67,76,80}, 6,1 , 0,7 , 8,5 , 4,0 , 0,0 , 0,0 , 0, 0, 1, 6, 7 }, // Mapuche/Latin/Chile
- { 316, 1, 103, 1643, 1644, 1563, 1642, 1632, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 53,10 , 63,17 , 18,7 , 25,12 , 38181,105 , 38181,105 , 38286,24 , 38181,105 , 38181,105 , 38286,24 , 20911,58 , 20911,58 , 20969,14 , 20911,58 , 20911,58 , 20969,14 , 787,3 , 790,3 , 45,4 , 5,17 , 22,23 , {73,81,68}, 44,5 , 17335,20 , 13,5 , 4,0 , 5810,14 , 5824,5 , 0, 0, 6, 5, 6 }, // Central Kurdish/Arabic/Iraq
- { 316, 1, 102, 1643, 1644, 1563, 1642, 1632, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 53,10 , 63,17 , 37,5 , 8,10 , 38181,105 , 38181,105 , 38286,24 , 38181,105 , 38181,105 , 38286,24 , 20911,58 , 20911,58 , 20969,14 , 20911,58 , 20911,58 , 20969,14 , 787,3 , 790,3 , 45,4 , 5,17 , 22,23 , {73,82,82}, 0,0 , 17355,19 , 13,5 , 4,0 , 5810,14 , 5829,5 , 0, 0, 6, 5, 5 }, // Central Kurdish/Arabic/Iran
- { 317, 7, 82, 44, 46, 59, 37, 48, 45, 43, 101, 8222, 8220, 8218, 8216, 0,6 , 0,6 , 185,7 , 185,7 , 113,6 , 622,18 , 55,4 , 59,9 , 38310,48 , 38358,85 , 9742,24 , 38443,60 , 38503,93 , 9742,24 , 20983,28 , 21011,53 , 21064,14 , 20983,28 , 21011,53 , 21064,14 , 790,9 , 793,10 , 45,4 , 5,17 , 22,23 , {69,85,82}, 14,1 , 17374,27 , 13,5 , 4,0 , 5834,14 , 5848,6 , 2, 1, 1, 6, 7 }, // Lower Sorbian/Latin/Germany
- { 318, 7, 82, 44, 46, 59, 37, 48, 45, 43, 101, 8222, 8220, 8218, 8216, 0,6 , 0,6 , 185,7 , 185,7 , 113,6 , 622,18 , 570,12 , 59,9 , 38596,48 , 38644,86 , 9742,24 , 38730,60 , 38790,93 , 9742,24 , 21078,28 , 21106,53 , 21159,14 , 21078,28 , 21106,53 , 21159,14 , 790,9 , 803,9 , 1249,5 , 5,17 , 22,23 , {69,85,82}, 14,1 , 17401,29 , 13,5 , 4,0 , 5854,15 , 5869,6 , 2, 1, 1, 6, 7 }, // Upper Sorbian/Latin/Germany
- { 319, 7, 37, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 53,10 , 63,17 , 37,5 , 8,10 , 368,48 , 368,48 , 158,27 , 368,48 , 368,48 , 158,27 , 0,28 , 0,28 , 85,14 , 0,28 , 0,28 , 85,14 , 0,2 , 0,2 , 45,4 , 5,17 , 22,23 , {88,65,70}, 32,4 , 0,7 , 8,5 , 4,0 , 0,0 , 0,0 , 0, 0, 1, 6, 7 }, // Kenyang/Latin/Cameroon
- { 320, 7, 38, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 53,10 , 63,17 , 37,5 , 8,10 , 368,48 , 368,48 , 158,27 , 368,48 , 368,48 , 158,27 , 0,28 , 0,28 , 85,14 , 0,28 , 0,28 , 85,14 , 0,2 , 0,2 , 45,4 , 5,17 , 22,23 , {67,65,68}, 233,3 , 0,7 , 8,5 , 4,0 , 0,0 , 0,0 , 2, 0, 7, 6, 7 }, // Mohawk/Latin/Canada
- { 321, 75, 91, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 53,10 , 63,17 , 37,5 , 8,10 , 368,48 , 368,48 , 158,27 , 368,48 , 368,48 , 158,27 , 0,28 , 0,28 , 85,14 , 0,28 , 0,28 , 85,14 , 0,2 , 0,2 , 45,4 , 5,17 , 22,23 , {71,78,70}, 215,2 , 0,7 , 8,5 , 4,0 , 0,0 , 0,0 , 0, 0, 1, 6, 7 }, // Nko/Nko/Guinea
- { 322, 7, 260, 44, 160, 59, 37, 48, 45, 43, 101, 8222, 8220, 8222, 8220, 0,6 , 0,6 , 1019,8 , 1019,8 , 156,8 , 1801,27 , 37,5 , 8,10 , 38883,48 , 38931,91 , 39022,24 , 38883,48 , 38931,91 , 39022,24 , 21173,28 , 21201,69 , 21270,14 , 21173,28 , 21201,69 , 21270,14 , 0,2 , 0,2 , 45,4 , 5,17 , 22,23 , {0,0,0}, 0,0 , 2586,0 , 13,5 , 4,0 , 5875,9 , 5884,6 , 2, 1, 1, 6, 7 }, // Prussian/Latin/World
- { 323, 7, 90, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 53,10 , 63,17 , 37,5 , 8,10 , 368,48 , 368,48 , 158,27 , 368,48 , 368,48 , 158,27 , 0,28 , 0,28 , 85,14 , 0,28 , 0,28 , 85,14 , 0,2 , 0,2 , 45,4 , 5,17 , 22,23 , {71,84,81}, 290,1 , 0,7 , 8,5 , 4,0 , 0,0 , 0,0 , 2, 1, 7, 6, 7 }, // Kiche/Latin/Guatemala
- { 324, 7, 205, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 53,10 , 63,17 , 37,5 , 8,10 , 368,48 , 368,48 , 158,27 , 368,48 , 368,48 , 158,27 , 0,28 , 0,28 , 85,14 , 0,28 , 0,28 , 85,14 , 0,2 , 0,2 , 45,4 , 5,17 , 22,23 , {83,69,75}, 189,2 , 0,7 , 8,5 , 4,0 , 0,0 , 0,0 , 2, 0, 1, 6, 7 }, // Southern Sami/Latin/Sweden
- { 325, 7, 205, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 53,10 , 63,17 , 37,5 , 8,10 , 368,48 , 368,48 , 158,27 , 368,48 , 368,48 , 158,27 , 0,28 , 0,28 , 85,14 , 0,28 , 0,28 , 85,14 , 0,2 , 0,2 , 45,4 , 5,17 , 22,23 , {83,69,75}, 189,2 , 0,7 , 8,5 , 4,0 , 0,0 , 0,0 , 2, 0, 1, 6, 7 }, // Lule Sami/Latin/Sweden
- { 326, 7, 73, 44, 160, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 640,8 , 1828,18 , 243,4 , 247,9 , 39046,77 , 39123,140 , 39263,25 , 39046,77 , 39123,140 , 39263,25 , 21284,28 , 21312,70 , 85,14 , 21284,28 , 21382,73 , 21455,14 , 799,3 , 812,3 , 45,4 , 5,17 , 22,23 , {69,85,82}, 14,1 , 17430,11 , 13,5 , 4,0 , 5890,11 , 5901,5 , 2, 1, 1, 6, 7 }, // Inari Sami/Latin/Finland
- { 327, 7, 73, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 53,10 , 63,17 , 37,5 , 8,10 , 368,48 , 368,48 , 158,27 , 368,48 , 368,48 , 158,27 , 0,28 , 0,28 , 85,14 , 0,28 , 0,28 , 85,14 , 0,2 , 0,2 , 45,4 , 5,17 , 22,23 , {69,85,82}, 14,1 , 0,7 , 8,5 , 4,0 , 0,0 , 0,0 , 2, 1, 1, 6, 7 }, // Skolt Sami/Latin/Finland
- { 328, 7, 13, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 53,10 , 63,17 , 37,5 , 8,10 , 368,48 , 368,48 , 158,27 , 368,48 , 368,48 , 158,27 , 0,28 , 0,28 , 85,14 , 0,28 , 0,28 , 85,14 , 0,2 , 0,2 , 45,4 , 5,17 , 22,23 , {65,85,68}, 326,2 , 0,7 , 8,5 , 4,0 , 0,0 , 0,0 , 2, 1, 7, 6, 7 }, // Warlpiri/Latin/Australia
- { 346, 1, 102, 1643, 1644, 1563, 1642, 1776, 45, 43, 101, 171, 187, 8249, 8250, 0,6 , 0,6 , 0,6 , 0,6 , 53,10 , 63,17 , 37,5 , 8,10 , 14934,70 , 14934,70 , 158,27 , 14934,70 , 14934,70 , 158,27 , 0,28 , 0,28 , 85,14 , 0,28 , 0,28 , 85,14 , 0,2 , 0,2 , 726,4 , 1254,39 , 22,23 , {73,82,82}, 328,3 , 17441,27 , 8,5 , 4,0 , 5906,7 , 3238,5 , 0, 0, 6, 5, 5 }, // Mazanderani/Arabic/Iran
- { 349, 1, 102, 1643, 1644, 1563, 1642, 1776, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 53,10 , 63,17 , 37,5 , 8,10 , 39288,77 , 39288,77 , 158,27 , 39288,77 , 39288,77 , 158,27 , 0,28 , 0,28 , 85,14 , 0,28 , 0,28 , 85,14 , 0,2 , 0,2 , 45,4 , 5,17 , 22,23 , {73,82,82}, 0,0 , 0,7 , 8,5 , 4,0 , 5913,11 , 0,0 , 0, 0, 6, 5, 5 }, // Northern Luri/Arabic/Iran
- { 349, 1, 103, 1643, 1644, 1563, 1642, 1776, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 53,10 , 63,17 , 18,7 , 25,12 , 39288,77 , 39288,77 , 158,27 , 39288,77 , 39288,77 , 158,27 , 0,28 , 0,28 , 85,14 , 0,28 , 0,28 , 85,14 , 0,2 , 0,2 , 45,4 , 5,17 , 22,23 , {73,81,68}, 44,5 , 0,7 , 8,5 , 4,0 , 5913,11 , 0,0 , 0, 0, 6, 5, 6 }, // Northern Luri/Arabic/Iraq
- { 357, 6, 97, 46, 44, 59, 37, 48, 45, 43, 101, 12300, 12301, 12302, 12303, 170,5 , 170,5 , 1027,5 , 1027,5 , 394,8 , 423,14 , 198,6 , 215,13 , 4423,39 , 4423,39 , 158,27 , 4423,39 , 4423,39 , 158,27 , 1953,28 , 1953,28 , 1981,14 , 1953,28 , 1953,28 , 1981,14 , 58,2 , 55,2 , 45,4 , 5,17 , 22,23 , {72,75,68}, 166,3 , 17468,11 , 4,4 , 4,0 , 5924,2 , 5926,14 , 2, 1, 7, 6, 7 }, // Cantonese/Traditional Han/Hong Kong
- { 357, 5, 44, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 170,5 , 170,5 , 1027,5 , 1027,5 , 394,8 , 402,13 , 198,6 , 204,11 , 4423,39 , 4462,38 , 158,27 , 4423,39 , 4462,38 , 158,27 , 1932,21 , 1953,28 , 1981,14 , 1932,21 , 1953,28 , 1981,14 , 58,2 , 55,2 , 45,4 , 5,17 , 22,23 , {67,78,89}, 133,1 , 3122,13 , 4,4 , 4,0 , 5940,2 , 5942,7 , 2, 1, 7, 6, 7 }, // Cantonese/Simplified Han/China
- { 360, 7, 260, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 53,10 , 63,17 , 37,5 , 8,10 , 368,48 , 368,48 , 158,27 , 368,48 , 368,48 , 158,27 , 0,28 , 0,28 , 85,14 , 0,28 , 0,28 , 85,14 , 0,2 , 0,2 , 45,4 , 5,17 , 22,23 , {0,0,0}, 0,0 , 2586,0 , 8,5 , 4,0 , 0,0 , 0,0 , 2, 1, 1, 6, 7 }, // Ido/Latin/World
- { 361, 7, 260, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 53,10 , 63,17 , 37,5 , 8,10 , 368,48 , 368,48 , 158,27 , 368,48 , 368,48 , 158,27 , 0,28 , 0,28 , 85,14 , 0,28 , 0,28 , 85,14 , 0,2 , 0,2 , 45,4 , 5,17 , 22,23 , {0,0,0}, 0,0 , 2586,0 , 8,5 , 4,0 , 0,0 , 0,0 , 2, 1, 1, 6, 7 }, // Lojban/Latin/World
- { 362, 7, 106, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 53,10 , 63,17 , 37,5 , 8,10 , 368,48 , 368,48 , 158,27 , 368,48 , 368,48 , 158,27 , 0,28 , 0,28 , 85,14 , 0,28 , 0,28 , 85,14 , 0,2 , 0,2 , 45,4 , 5,17 , 22,23 , {69,85,82}, 14,1 , 0,7 , 8,5 , 4,0 , 0,0 , 0,0 , 2, 1, 1, 6, 7 }, // Sicilian/Latin/Italy
- { 363, 1, 102, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 53,10 , 63,17 , 37,5 , 8,10 , 368,48 , 368,48 , 158,27 , 368,48 , 368,48 , 158,27 , 0,28 , 0,28 , 85,14 , 0,28 , 0,28 , 85,14 , 0,2 , 0,2 , 45,4 , 5,17 , 22,23 , {73,82,82}, 0,0 , 0,7 , 8,5 , 4,0 , 0,0 , 0,0 , 0, 0, 6, 5, 5 }, // Southern Kurdish/Arabic/Iran
- { 364, 1, 163, 46, 44, 59, 37, 48, 45, 43, 101, 8220, 8221, 8216, 8217, 0,6 , 0,6 , 0,6 , 0,6 , 53,10 , 63,17 , 37,5 , 8,10 , 368,48 , 368,48 , 158,27 , 368,48 , 368,48 , 158,27 , 0,28 , 0,28 , 85,14 , 0,28 , 0,28 , 85,14 , 0,2 , 0,2 , 45,4 , 5,17 , 22,23 , {80,75,82}, 175,2 , 0,7 , 8,5 , 4,0 , 0,0 , 0,0 , 2, 0, 7, 6, 7 }, // Western Balochi/Arabic/Pakistan
- { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,0, 0,0, 0,0, 0,0, 0,0, 0,0, 0,0, 0,0, 0,0, 0,0, 0,0, 0,0, 0,0, 0,0, 0,0, 0,0, 0,0, 0,0, 0,0, 0,0, 0,0, 0,0, 0,0, 0,0, 0,0, {0,0,0}, 0,0, 0,0, 0,0, 0,0, 0,0, 0,0, 0, 0, 0, 0, 0 } // trailing 0s
-};
-
-static const ushort list_pattern_part_data[] = {
-0x25, 0x31, 0x2c, 0x20, 0x25, 0x32, 0x25, 0x31, 0x20, 0x65, 0x6e, 0x20, 0x25, 0x32, 0x25, 0x31, 0x20, 0x64, 0x68, 0x65,
-0x20, 0x25, 0x32, 0x25, 0x31, 0x1363, 0x20, 0x25, 0x32, 0x25, 0x31, 0x2c, 0x20, 0x12a5, 0x1293, 0x20, 0x25, 0x32, 0x25, 0x31,
-0x20, 0x12a5, 0x1293, 0x20, 0x25, 0x32, 0x25, 0x31, 0x60c, 0x20, 0x25, 0x32, 0x25, 0x31, 0x60c, 0x20, 0x648, 0x25, 0x32, 0x25,
-0x31, 0x20, 0x648, 0x25, 0x32, 0x25, 0x31, 0x20, 0x587, 0x20, 0x25, 0x32, 0x25, 0x31, 0x20, 0x986, 0x9f0, 0x9c1, 0x20, 0x25,
-0x32, 0x25, 0x31, 0x20, 0x76, 0x259, 0x20, 0x25, 0x32, 0x25, 0x31, 0x20, 0x65, 0x74, 0x61, 0x20, 0x25, 0x32, 0x25, 0x31,
-0x20, 0x98f, 0x9ac, 0x982, 0x20, 0x25, 0x32, 0x25, 0x31, 0x20, 0xf51, 0xf44, 0xf0b, 0x20, 0x25, 0x32, 0x25, 0x31, 0x20, 0x438,
-0x20, 0x25, 0x32, 0x25, 0x31, 0x20, 0x25, 0x32, 0x25, 0x31, 0x1014, 0x103e, 0x1004, 0x1037, 0x103a, 0x20, 0x25, 0x32, 0x25, 0x31,
-0x20, 0x456, 0x20, 0x25, 0x32, 0x25, 0x31, 0x20, 0x1793, 0x17b7, 0x1784, 0x20, 0x25, 0x32, 0x25, 0x31, 0x20, 0x1793, 0x17b7, 0x1784,
-0x200b, 0x25, 0x32, 0x25, 0x31, 0x20, 0x69, 0x20, 0x25, 0x32, 0x25, 0x31, 0x3001, 0x25, 0x32, 0x25, 0x31, 0x548c, 0x25, 0x32,
-0x25, 0x31, 0x53ca, 0x25, 0x32, 0x25, 0x31, 0x20, 0x61, 0x20, 0x25, 0x32, 0x25, 0x31, 0x20, 0x6f, 0x67, 0x20, 0x25, 0x32,
-0x25, 0x31, 0x2c, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x25, 0x32, 0x25, 0x31, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x25, 0x32, 0x25,
-0x31, 0x20, 0x6b, 0x61, 0x6a, 0x20, 0x25, 0x32, 0x25, 0x31, 0x20, 0x6a, 0x61, 0x20, 0x25, 0x32, 0x25, 0x31, 0x20, 0x65,
-0x74, 0x20, 0x25, 0x32, 0x25, 0x31, 0x20, 0x61, 0x67, 0x75, 0x73, 0x20, 0x25, 0x32, 0x25, 0x31, 0x20, 0x65, 0x20, 0x25,
-0x32, 0x25, 0x31, 0x20, 0x10d3, 0x10d0, 0x20, 0x25, 0x32, 0x25, 0x31, 0x20, 0x75, 0x6e, 0x64, 0x20, 0x25, 0x32, 0x25, 0x31,
-0x20, 0x3ba, 0x3b1, 0x3b9, 0x20, 0x25, 0x32, 0x25, 0x31, 0x20, 0x61, 0x61, 0x6d, 0x6d, 0x61, 0x20, 0x25, 0x32, 0x25, 0x31,
-0x20, 0xa85, 0xaa8, 0xac7, 0x20, 0x25, 0x32, 0x25, 0x31, 0x20, 0x64, 0x61, 0x20, 0x25, 0x32, 0x25, 0x31, 0x20, 0x5d5, 0x25,
-0x32, 0x25, 0x31, 0x2c, 0x20, 0x914, 0x930, 0x20, 0x25, 0x32, 0x25, 0x31, 0x20, 0x914, 0x930, 0x20, 0x25, 0x32, 0x25, 0x31,
-0x20, 0xe9, 0x73, 0x20, 0x25, 0x32, 0x25, 0x31, 0x2c, 0x20, 0x64, 0x61, 0x6e, 0x20, 0x25, 0x32, 0x25, 0x31, 0x20, 0x64,
-0x61, 0x6e, 0x20, 0x25, 0x32, 0x25, 0x31, 0x2c, 0x20, 0x61, 0x67, 0x75, 0x73, 0x20, 0x25, 0x32, 0x25, 0x31, 0x2c, 0x20,
-0x6c, 0x61, 0x6e, 0x20, 0x25, 0x32, 0x25, 0x31, 0x20, 0x6c, 0x61, 0x6e, 0x20, 0x25, 0x32, 0x25, 0x31, 0x2c, 0x20, 0xcae,
-0xca4, 0xccd, 0xca4, 0xcc1, 0x20, 0x25, 0x32, 0x25, 0x31, 0x20, 0xcae, 0xca4, 0xccd, 0xca4, 0xcc1, 0x20, 0x25, 0x32, 0x25, 0x31,
-0x20, 0x436, 0x4d9, 0x43d, 0x435, 0x20, 0x25, 0x32, 0x25, 0x31, 0x20, 0x436, 0x430, 0x43d, 0x430, 0x20, 0x25, 0x32, 0x25, 0x31,
-0x20, 0xbc0f, 0x20, 0x25, 0x32, 0x25, 0x31, 0x20, 0xfb, 0x20, 0x25, 0x32, 0x25, 0x31, 0x20, 0xec1, 0xea5, 0xeb0, 0x20, 0x25,
-0x32, 0x25, 0x31, 0x20, 0x75, 0x6e, 0x20, 0x25, 0x32, 0x25, 0x31, 0x20, 0x6d, 0x70, 0xe9, 0x20, 0x25, 0x32, 0x25, 0x31,
-0x20, 0x69, 0x72, 0x20, 0x25, 0x32, 0x25, 0x31, 0x2c, 0x20, 0x25, 0x32, 0x20, 0xd0e, 0xd28, 0xd4d, 0xd28, 0xd3f, 0xd35, 0x25,
-0x31, 0x20, 0xd15, 0xd42, 0xd1f, 0xd3e, 0xd24, 0xd46, 0x20, 0x25, 0x32, 0x25, 0x31, 0x2c, 0x20, 0x75, 0x20, 0x25, 0x32, 0x25,
-0x31, 0x20, 0x75, 0x20, 0x25, 0x32, 0x25, 0x31, 0x20, 0x906, 0x923, 0x93f, 0x20, 0x25, 0x32, 0x25, 0x31, 0x2c, 0x25, 0x32,
-0x25, 0x31, 0x20, 0x930, 0x20, 0x25, 0x32, 0x25, 0x31, 0x2c, 0x20, 0xb13, 0x20, 0x25, 0x32, 0x25, 0x31, 0x20, 0xb13, 0x20,
-0x25, 0x32, 0x25, 0x31, 0x60c, 0x20, 0x627, 0x648, 0x20, 0x25, 0x32, 0x25, 0x31, 0x20, 0x627, 0x648, 0x20, 0x25, 0x32, 0x25,
-0x31, 0x60c, 0x200f, 0x20, 0x25, 0x32, 0x25, 0x31, 0x60c, 0x20, 0x648, 0x20, 0x25, 0x32, 0x25, 0x31, 0x20, 0x648, 0x20, 0x25,
-0x32, 0x25, 0x31, 0x20, 0xa05, 0xa24, 0xa47, 0x20, 0x25, 0x32, 0x25, 0x31, 0x20, 0x219, 0x69, 0x20, 0x25, 0x32, 0x25, 0x31,
-0x20, 0x4d5, 0x43c, 0x4d5, 0x20, 0x25, 0x32, 0x25, 0x31, 0x60c, 0x20, 0x6fd, 0x20, 0x25, 0x32, 0x25, 0x31, 0x20, 0x6fd, 0x20,
-0x25, 0x32, 0x25, 0x31, 0x2c, 0x20, 0xdc3, 0xdc4, 0x20, 0x25, 0x32, 0x25, 0x31, 0x20, 0xdc3, 0xdc4, 0x20, 0x25, 0x32, 0x25,
-0x31, 0x20, 0x61, 0xa0, 0x25, 0x32, 0x25, 0x31, 0x20, 0x69, 0x6e, 0x20, 0x25, 0x32, 0x25, 0x31, 0x20, 0x69, 0x79, 0x6f,
-0x20, 0x25, 0x32, 0x25, 0x31, 0x20, 0x79, 0x20, 0x25, 0x32, 0x25, 0x31, 0x20, 0x6e, 0x61, 0x20, 0x25, 0x32, 0x25, 0x31,
-0x20, 0x6f, 0x63, 0x68, 0x20, 0x25, 0x32, 0x25, 0x31, 0x20, 0xbae, 0xbb1, 0xbcd, 0xbb1, 0xbc1, 0xbae, 0xbcd, 0x20, 0x25, 0x32,
-0x25, 0x31, 0x20, 0x4bb, 0x4d9, 0x43c, 0x20, 0x25, 0x32, 0x25, 0x31, 0x20, 0xc2e, 0xc30, 0xc3f, 0xc2f, 0xc41, 0x20, 0x25, 0x32,
-0x25, 0x31, 0x20, 0xe41, 0xe25, 0xe30, 0x25, 0x32, 0x25, 0x31, 0xe41, 0xe25, 0xe30, 0x25, 0x32, 0x25, 0x31, 0x20, 0x6d, 0x6f,
-0x20, 0x25, 0x32, 0x25, 0x31, 0x20, 0x76, 0x65, 0x20, 0x25, 0x32, 0x25, 0x31, 0x20, 0x77, 0x65, 0x20, 0x25, 0x32, 0x25,
-0x31, 0x60c, 0x20, 0x627, 0x648, 0x631, 0x20, 0x25, 0x32, 0x25, 0x31, 0x20, 0x627, 0x648, 0x631, 0x20, 0x25, 0x32, 0x25, 0x32,
-0x60c, 0x20, 0x25, 0x31, 0x25, 0x31, 0x20, 0x76, 0x61, 0x20, 0x25, 0x32, 0x25, 0x31, 0x20, 0x76, 0xe0, 0x20, 0x25, 0x32,
-0x25, 0x31, 0x2c, 0x20, 0x61, 0x28, 0x63, 0x29, 0x20, 0x25, 0x32, 0x25, 0x31, 0x20, 0x61, 0x28, 0x63, 0x29, 0x20, 0x25,
-0x32, 0x25, 0x31, 0x20, 0x5d0, 0x5d5, 0x5df, 0x20, 0x25, 0x32, 0x25, 0x31, 0x2c, 0x20, 0x6e, 0x65, 0x2d, 0x25, 0x32, 0x25,
-0x31, 0x20, 0x6e, 0x65, 0x2d, 0x25, 0x32, 0x25, 0x31, 0x2c, 0x20, 0x6e, 0x61, 0x20, 0x25, 0x32, 0x25, 0x31, 0x2c, 0x20,
-0x6b, 0x70, 0x6c, 0x65, 0x20, 0x25, 0x32, 0x25, 0x31, 0x20, 0x6b, 0x70, 0x6c, 0x65, 0x20, 0x25, 0x32, 0x25, 0x31, 0x2c,
-0x20, 0x61, 0x74, 0x20, 0x25, 0x32, 0x25, 0x31, 0x20, 0x61, 0x74, 0x20, 0x25, 0x32, 0x25, 0x31, 0x2c, 0x20, 0x61, 0x6b,
-0x6b, 0x65, 0x64, 0x20, 0x25, 0x32, 0x25, 0x31, 0x20, 0x61, 0x6b, 0x6b, 0x65, 0x64, 0x20, 0x25, 0x32, 0x25, 0x31, 0x2c,
-0x20, 0x13a0, 0x13b4, 0x20, 0x25, 0x32, 0x25, 0x31, 0x20, 0x13a0, 0x13b4, 0x20, 0x25, 0x32, 0x25, 0x31, 0x20, 0x438, 0x486, 0x20,
-0x25, 0x32, 0x25, 0x31, 0x20, 0x61, 0x28, 0x6e, 0x29, 0x20, 0x25, 0x32, 0x25, 0x31, 0x20, 0x443, 0x43e, 0x43d, 0x43d, 0x430,
-0x20, 0x25, 0x32, 0x25, 0x31, 0x2c, 0x20, 0x14b, 0x301, 0x67, 0x25b, 0x20, 0x25, 0x32, 0x25, 0x31, 0x2c, 0x20, 0x1e3f, 0x62,
-0x25b, 0x6e, 0x20, 0x14b, 0x301, 0x67, 0x25b, 0x20, 0x25, 0x32, 0x25, 0x31, 0x20, 0x70, 0x254, 0x70, 0x20, 0x25, 0x32, 0x25,
-0x31, 0x20, 0x62, 0x65, 0x20, 0x25, 0x32, 0x25, 0x31, 0x540c, 0x25, 0x32
-};
-
-static const ushort date_format_data[] = {
-0x64, 0x20, 0x4d, 0x4d, 0x4d, 0x20, 0x79, 0x79, 0x79, 0x79, 0x64, 0x64, 0x64, 0x64, 0x2c, 0x20, 0x64, 0x20, 0x4d, 0x4d,
-0x4d, 0x4d, 0x20, 0x79, 0x79, 0x79, 0x79, 0x64, 0x64, 0x2f, 0x4d, 0x4d, 0x2f, 0x79, 0x79, 0x64, 0x64, 0x64, 0x64, 0x2c,
-0x20, 0x4d, 0x4d, 0x4d, 0x4d, 0x20, 0x64, 0x2c, 0x20, 0x79, 0x79, 0x79, 0x79, 0x79, 0x79, 0x79, 0x79, 0x2d, 0x4d, 0x4d,
-0x2d, 0x64, 0x64, 0x79, 0x79, 0x79, 0x79, 0x20, 0x4d, 0x4d, 0x4d, 0x4d, 0x20, 0x64, 0x2c, 0x20, 0x64, 0x64, 0x64, 0x64,
-0x64, 0x64, 0x64, 0x64, 0x20, 0x64, 0x64, 0x20, 0x4d, 0x4d, 0x4d, 0x4d, 0x20, 0x79, 0x79, 0x79, 0x79, 0x64, 0x64, 0x64,
-0x64, 0x20, 0x64, 0x20, 0x4d, 0x4d, 0x4d, 0x4d, 0x20, 0x79, 0x79, 0x79, 0x79, 0x64, 0x2e, 0x4d, 0x2e, 0x79, 0x79, 0x64,
-0x64, 0x2f, 0x4d, 0x4d, 0x2f, 0x79, 0x79, 0x79, 0x79, 0x64, 0x200f, 0x2f, 0x4d, 0x200f, 0x2f, 0x79, 0x79, 0x79, 0x79, 0x64,
-0x64, 0x64, 0x64, 0x60c, 0x20, 0x64, 0x20, 0x4d, 0x4d, 0x4d, 0x4d, 0x20, 0x79, 0x79, 0x79, 0x79, 0x64, 0x64, 0x2e, 0x4d,
-0x4d, 0x2e, 0x79, 0x79, 0x79, 0x79, 0x79, 0x79, 0x20, 0x569, 0x2e, 0x20, 0x4d, 0x4d, 0x4d, 0x4d, 0x20, 0x64, 0x2c, 0x20,
-0x64, 0x64, 0x64, 0x64, 0x64, 0x2d, 0x4d, 0x2d, 0x79, 0x79, 0x79, 0x79, 0x64, 0x64, 0x64, 0x64, 0x2c, 0x20, 0x64, 0x20,
-0x4d, 0x4d, 0x4d, 0x4d, 0x2c, 0x20, 0x79, 0x79, 0x79, 0x79, 0x64, 0x20, 0x4d, 0x4d, 0x4d, 0x4d, 0x20, 0x79, 0x79, 0x79,
-0x79, 0x2c, 0x20, 0x64, 0x64, 0x64, 0x64, 0x79, 0x79, 0x2f, 0x4d, 0x2f, 0x64, 0x79, 0x79, 0x79, 0x79, 0x28, 0x27, 0x65,
-0x27, 0x29, 0x27, 0x6b, 0x6f, 0x27, 0x20, 0x4d, 0x4d, 0x4d, 0x4d, 0x27, 0x72, 0x65, 0x6e, 0x27, 0x20, 0x64, 0x28, 0x27,
-0x61, 0x27, 0x29, 0x2c, 0x20, 0x64, 0x64, 0x64, 0x64, 0x64, 0x2f, 0x4d, 0x2f, 0x79, 0x79, 0x64, 0x64, 0x64, 0x64, 0x2c,
-0x20, 0xf66, 0xfa4, 0xfb1, 0xf72, 0xf0b, 0xf63, 0xf7c, 0xf0b, 0x79, 0x79, 0x79, 0x79, 0x20, 0x4d, 0x4d, 0x4d, 0x4d, 0x20, 0xf5a,
-0xf7a, 0xf66, 0xf0b, 0x64, 0x64, 0x64, 0x2e, 0x4d, 0x4d, 0x2e, 0x79, 0x79, 0x20, 0x27, 0x433, 0x27, 0x2e, 0x64, 0x64, 0x64,
-0x64, 0x2c, 0x20, 0x64, 0x20, 0x4d, 0x4d, 0x4d, 0x4d, 0x20, 0x79, 0x79, 0x79, 0x79, 0x20, 0x27, 0x433, 0x27, 0x2e, 0x64,
-0x64, 0x2d, 0x4d, 0x4d, 0x2d, 0x79, 0x79, 0x79, 0x79, 0x79, 0x79, 0x104a, 0x20, 0x4d, 0x4d, 0x4d, 0x4d, 0x20, 0x64, 0x104a,
-0x20, 0x64, 0x64, 0x64, 0x64, 0x64, 0x2e, 0x4d, 0x4d, 0x2e, 0x79, 0x79, 0x64, 0x64, 0x64, 0x64, 0x2c, 0x20, 0x64, 0x20,
-0x4d, 0x4d, 0x4d, 0x4d, 0x20, 0x27, 0x64, 0x65, 0x27, 0x20, 0x79, 0x79, 0x79, 0x79, 0x79, 0x79, 0x79, 0x79, 0x2f, 0x4d,
-0x2f, 0x64, 0x79, 0x79, 0x79, 0x79, 0x5e74, 0x4d, 0x6708, 0x64, 0x65e5, 0x64, 0x64, 0x64, 0x64, 0x64, 0x2f, 0x4d, 0x2f, 0x79,
-0x79, 0x79, 0x79, 0x79, 0x79, 0x79, 0x79, 0x5e74, 0x4d, 0x6708, 0x64, 0x65e5, 0x20, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x2e,
-0x20, 0x4d, 0x4d, 0x2e, 0x20, 0x79, 0x79, 0x79, 0x79, 0x2e, 0x64, 0x64, 0x64, 0x64, 0x2c, 0x20, 0x64, 0x2e, 0x20, 0x4d,
-0x4d, 0x4d, 0x4d, 0x20, 0x79, 0x79, 0x79, 0x79, 0x2e, 0x64, 0x2e, 0x20, 0x4d, 0x2e, 0x20, 0x79, 0x79, 0x2e, 0x64, 0x64,
-0x64, 0x64, 0x20, 0x64, 0x2e, 0x20, 0x4d, 0x4d, 0x4d, 0x4d, 0x20, 0x79, 0x79, 0x79, 0x79, 0x64, 0x64, 0x2e, 0x4d, 0x4d,
-0x2e, 0x79, 0x79, 0x79, 0x79, 0x64, 0x64, 0x64, 0x64, 0x20, 0x27, 0x64, 0x65, 0x6e, 0x27, 0x20, 0x64, 0x2e, 0x20, 0x4d,
-0x4d, 0x4d, 0x4d, 0x20, 0x79, 0x79, 0x79, 0x79, 0x64, 0x64, 0x2d, 0x4d, 0x4d, 0x2d, 0x79, 0x79, 0x79, 0x79, 0x64, 0x2f,
-0x4d, 0x4d, 0x2f, 0x79, 0x79, 0x79, 0x79, 0x4d, 0x2f, 0x64, 0x2f, 0x79, 0x79, 0x64, 0x64, 0x64, 0x64, 0x2c, 0x20, 0x64,
-0x64, 0x20, 0x4d, 0x4d, 0x4d, 0x4d, 0x20, 0x79, 0x79, 0x79, 0x79, 0x64, 0x2f, 0x4d, 0x4d, 0x2f, 0x79, 0x79, 0x79, 0x79,
-0x79, 0x79, 0x2f, 0x4d, 0x4d, 0x2f, 0x64, 0x64, 0x79, 0x79, 0x2d, 0x4d, 0x4d, 0x2d, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64,
-0x2c, 0x20, 0x64, 0x2d, 0x27, 0x61, 0x27, 0x20, 0x27, 0x64, 0x65, 0x27, 0x20, 0x4d, 0x4d, 0x4d, 0x4d, 0x20, 0x79, 0x79,
-0x79, 0x79, 0x64, 0x64, 0x64, 0x64, 0x2c, 0x20, 0x64, 0x2e, 0x20, 0x4d, 0x4d, 0x4d, 0x4d, 0x20, 0x79, 0x79, 0x79, 0x79,
-0x64, 0x2e, 0x4d, 0x2e, 0x79, 0x79, 0x79, 0x79, 0x64, 0x64, 0x64, 0x64, 0x2c, 0x20, 0x64, 0x27, 0x6d, 0x68, 0x27, 0x20,
-0x4d, 0x4d, 0x4d, 0x4d, 0x20, 0x79, 0x79, 0x79, 0x79, 0x64, 0x64, 0x64, 0x64, 0x2c, 0x20, 0x64, 0x20, 0x27, 0x64, 0x65,
-0x27, 0x20, 0x4d, 0x4d, 0x4d, 0x4d, 0x20, 0x27, 0x64, 0x65, 0x27, 0x20, 0x79, 0x79, 0x79, 0x79, 0x64, 0x64, 0x64, 0x64,
-0x2c, 0x20, 0x64, 0x64, 0x20, 0x4d, 0x4d, 0x4d, 0x4d, 0x2c, 0x20, 0x79, 0x79, 0x79, 0x79, 0x64, 0x64, 0x64, 0x64, 0x20,
-0x64, 0x20, 0x4d, 0x4d, 0x4d, 0x4d, 0x2c, 0x20, 0x79, 0x79, 0x79, 0x79, 0x64, 0x64, 0x64, 0x64, 0x2c, 0x20, 0x64, 0x20,
-0x5d1, 0x4d, 0x4d, 0x4d, 0x4d, 0x20, 0x79, 0x79, 0x79, 0x79, 0x79, 0x79, 0x79, 0x79, 0x2e, 0x20, 0x4d, 0x4d, 0x2e, 0x20,
-0x64, 0x64, 0x2e, 0x79, 0x79, 0x79, 0x79, 0x2e, 0x20, 0x4d, 0x4d, 0x4d, 0x4d, 0x20, 0x64, 0x2e, 0x2c, 0x20, 0x64, 0x64,
-0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x20, 0x27, 0x6c, 0x65, 0x27, 0x20, 0x64, 0x20, 0x27, 0x64, 0x65, 0x27, 0x20, 0x4d,
-0x4d, 0x4d, 0x4d, 0x20, 0x79, 0x79, 0x79, 0x79, 0x79, 0x79, 0x79, 0x79, 0x20, 0x27, 0x436, 0x27, 0x2e, 0x20, 0x64, 0x20,
-0x4d, 0x4d, 0x4d, 0x4d, 0x2c, 0x20, 0x64, 0x64, 0x64, 0x64, 0x79, 0x79, 0x79, 0x79, 0x2d, 0x27, 0x436, 0x27, 0x2e, 0x2c,
-0x20, 0x64, 0x2d, 0x4d, 0x4d, 0x4d, 0x4d, 0x2c, 0x20, 0x64, 0x64, 0x64, 0x64, 0x79, 0x79, 0x2e, 0x20, 0x4d, 0x2e, 0x20,
-0x64, 0x2e, 0x79, 0x79, 0x79, 0x79, 0xb144, 0x20, 0x4d, 0xc6d4, 0x20, 0x64, 0xc77c, 0x20, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64,
-0x64, 0x64, 0x20, 0xe97, 0xeb5, 0x20, 0x64, 0x20, 0x4d, 0x4d, 0x4d, 0x4d, 0x20, 0x79, 0x79, 0x79, 0x79, 0x64, 0x64, 0x64,
-0x64, 0x2c, 0x20, 0x79, 0x79, 0x79, 0x79, 0x2e, 0x20, 0x27, 0x67, 0x61, 0x64, 0x61, 0x27, 0x20, 0x64, 0x2e, 0x20, 0x4d,
-0x4d, 0x4d, 0x4d, 0x79, 0x79, 0x79, 0x79, 0x20, 0x27, 0x6d, 0x27, 0x2e, 0x20, 0x4d, 0x4d, 0x4d, 0x4d, 0x20, 0x64, 0x20,
-0x27, 0x64, 0x27, 0x2e, 0x2c, 0x20, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x2e, 0x4d, 0x2e, 0x79, 0x79, 0x64, 0x64, 0x20,
-0x4d, 0x4d, 0x4d, 0x4d, 0x20, 0x79, 0x79, 0x79, 0x79, 0x79, 0x79, 0x79, 0x79, 0x2c, 0x20, 0x4d, 0x4d, 0x4d, 0x4d, 0x20,
-0x64, 0x2c, 0x20, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x2c, 0x20, 0x64, 0x20, 0x27, 0x74, 0x61, 0x27, 0x2019,
-0x20, 0x4d, 0x4d, 0x4d, 0x4d, 0x20, 0x79, 0x79, 0x79, 0x79, 0x79, 0x79, 0x79, 0x79, 0x2e, 0x4d, 0x4d, 0x2e, 0x64, 0x64,
-0x79, 0x79, 0x79, 0x79, 0x2e, 0x4d, 0x4d, 0x2e, 0x64, 0x64, 0x2c, 0x20, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64,
-0x20, 0x62f, 0x20, 0x79, 0x79, 0x79, 0x79, 0x20, 0x62f, 0x20, 0x4d, 0x4d, 0x4d, 0x4d, 0x20, 0x64, 0x64, 0x64, 0x64, 0x64,
-0x2c, 0x20, 0x27, 0x69, 0x6c, 0x73, 0x27, 0x20, 0x64, 0x20, 0x27, 0x64, 0x61, 0x27, 0x20, 0x4d, 0x4d, 0x4d, 0x4d, 0x20,
-0x79, 0x79, 0x79, 0x79, 0x64, 0x2e, 0x4d, 0x2e, 0x79, 0x79, 0x2e, 0x64, 0x64, 0x64, 0x64, 0x2c, 0x20, 0x64, 0x64, 0x2e,
-0x20, 0x4d, 0x4d, 0x4d, 0x4d, 0x20, 0x79, 0x79, 0x79, 0x79, 0x2e, 0x64, 0x64, 0x64, 0x64, 0x2c, 0x20, 0x64, 0x20, 0x4d,
-0x4d, 0x4d, 0x4d, 0x2c, 0x20, 0x79, 0x79, 0x79, 0x79, 0x20, 0x27, 0x430, 0x437, 0x27, 0x64, 0x2e, 0x20, 0x4d, 0x2e, 0x20,
-0x79, 0x79, 0x79, 0x79, 0x64, 0x2e, 0x20, 0x4d, 0x4d, 0x2e, 0x20, 0x79, 0x79, 0x64, 0x64, 0x64, 0x64, 0x2c, 0x20, 0x64,
-0x64, 0x2e, 0x20, 0x4d, 0x4d, 0x4d, 0x4d, 0x20, 0x79, 0x79, 0x79, 0x79, 0x64, 0x64, 0x64, 0x64, 0x2c, 0x20, 0x4d, 0x4d,
-0x4d, 0x4d, 0x20, 0x64, 0x64, 0x2c, 0x20, 0x79, 0x79, 0x79, 0x79, 0x64, 0x64, 0x64, 0x64, 0x20, 0x64, 0x64, 0x20, 0x27,
-0x64, 0x65, 0x27, 0x20, 0x4d, 0x4d, 0x4d, 0x4d, 0x20, 0x27, 0x64, 0x65, 0x27, 0x20, 0x79, 0x79, 0x79, 0x79, 0x4d, 0x4d,
-0x2f, 0x64, 0x64, 0x2f, 0x79, 0x79, 0x64, 0x20, 0x4d, 0x4d, 0x4d, 0x4d, 0x2c, 0x20, 0x79, 0x79, 0x79, 0x79, 0x20, 0x27,
-0x435, 0x43b, 0x27, 0x2c, 0x20, 0x64, 0x64, 0x64, 0x64, 0x64, 0x2c, 0x20, 0x4d, 0x4d, 0x4d, 0x4d, 0x20, 0x79, 0x79, 0x79,
-0x79, 0x2c, 0x20, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0xe17, 0xe35, 0xe48, 0x20, 0x64, 0x20, 0x4d, 0x4d, 0x4d,
-0x4d, 0x20, 0x79, 0x79, 0x79, 0x79, 0x79, 0x79, 0x79, 0x79, 0x20, 0x4d, 0x4d, 0x4d, 0x4d, 0xf60, 0xf72, 0xf0b, 0xf5a, 0xf7a,
-0xf66, 0xf0b, 0x64, 0x2c, 0x20, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x1363, 0x20, 0x64, 0x64, 0x20, 0x4d, 0x4d,
-0x4d, 0x4d, 0x20, 0x1218, 0x12d3, 0x120d, 0x1272, 0x20, 0x79, 0x79, 0x79, 0x79, 0x64, 0x2e, 0x4d, 0x4d, 0x2e, 0x79, 0x79, 0x79,
-0x79, 0x64, 0x20, 0x4d, 0x4d, 0x4d, 0x4d, 0x20, 0x79, 0x79, 0x79, 0x79, 0x20, 0x64, 0x64, 0x64, 0x64, 0x79, 0x79, 0x79,
-0x79, 0x20, 0x64, 0x2d, 0x4d, 0x4d, 0x4d, 0x4d, 0x60c, 0x20, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x2c, 0x20,
-0x64, 0x20, 0x4d, 0x4d, 0x4d, 0x4d, 0x20, 0x79, 0x79, 0x79, 0x79, 0x20, 0x27, 0x440, 0x27, 0x2e, 0x64, 0x64, 0x64, 0x64,
-0x60c, 0x20, 0x64, 0x20, 0x4d, 0x4d, 0x4d, 0x4d, 0x60c, 0x20, 0x79, 0x79, 0x79, 0x79, 0x64, 0x64, 0x64, 0x64, 0x2c, 0x20,
-0x64, 0x2d, 0x4d, 0x4d, 0x4d, 0x4d, 0x2c, 0x20, 0x79, 0x79, 0x79, 0x79, 0x79, 0x79, 0x79, 0x79, 0x20, 0x646, 0x686, 0x6cc,
-0x20, 0x6cc, 0x6cc, 0x644, 0x20, 0x64, 0x20, 0x646, 0x686, 0x6cc, 0x20, 0x4d, 0x4d, 0x4d, 0x4d, 0x20, 0x64, 0x64, 0x64, 0x64,
-0x20, 0x6a9, 0x648, 0x646, 0x6cc, 0x79, 0x79, 0x79, 0x79, 0x20, 0x4d, 0x4d, 0x4d, 0x4d, 0x27, 0x61, 0x27, 0x20, 0x27, 0x64,
-0x27, 0x2e, 0x20, 0x64, 0x27, 0x69, 0x64, 0x27, 0x64, 0x64, 0x64, 0x64, 0x2c, 0x20, 0x64, 0x20, 0x4d, 0x4d, 0x4d, 0x2c,
-0x20, 0x79, 0x79, 0x79, 0x79, 0x64, 0x64, 0x64, 0x64, 0x2c, 0x20, 0x64, 0x5d8, 0x5df, 0x20, 0x4d, 0x4d, 0x4d, 0x4d, 0x20,
-0x79, 0x79, 0x79, 0x79, 0x64, 0x64, 0x64, 0x64, 0x2c, 0x20, 0x64, 0x20, 0x4d, 0x4d, 0x4d, 0x20, 0x79, 0x79, 0x79, 0x79,
-0x64, 0x2e, 0x20, 0x4d, 0x2e, 0x20, 0x79, 0x79, 0x79, 0x79, 0x2e, 0x79, 0x79, 0x2f, 0x4d, 0x4d, 0x2f, 0x64, 0x64, 0x64,
-0x64, 0x64, 0x64, 0x2c, 0x20, 0x79, 0x79, 0x79, 0x79, 0x20, 0x4d, 0x4d, 0x4d, 0x4d, 0x20, 0x64, 0x64, 0x64, 0x2d, 0x4d,
-0x2d, 0x79, 0x79, 0x64, 0x64, 0x64, 0x64, 0x20, 0x64, 0x20, 0x27, 0x64, 0x69, 0x27, 0x20, 0x4d, 0x4d, 0x4d, 0x4d, 0x20,
-0x27, 0x64, 0x61, 0x6c, 0x27, 0x20, 0x79, 0x79, 0x79, 0x79, 0x64, 0x64, 0x64, 0x64, 0x2c, 0x20, 0x4d, 0x4d, 0x4d, 0x4d,
-0x20, 0x64, 0x20, 0x27, 0x6c, 0x69, 0x61, 0x27, 0x20, 0x79, 0x79, 0x79, 0x79, 0x64, 0x64, 0x64, 0x64, 0x2c, 0x20, 0x27,
-0x64, 0x65, 0x27, 0x20, 0x64, 0x2e, 0x20, 0x4d, 0x4d, 0x4d, 0x4d, 0x20, 0x79, 0x79, 0x79, 0x79, 0x64, 0x64, 0x64, 0x64,
-0x2c, 0x20, 0x64, 0x20, 0x27, 0x64, 0x69, 0x27, 0x20, 0x4d, 0x4d, 0x4d, 0x4d, 0x20, 0x27, 0x64, 0x69, 0x27, 0x20, 0x79,
-0x79, 0x79, 0x79, 0x64, 0x64, 0x64, 0x64, 0x2c, 0x20, 0x27, 0x64, 0xe4, 0x27, 0x20, 0x64, 0x2e, 0x20, 0x4d, 0x4d, 0x4d,
-0x4d, 0x20, 0x79, 0x79, 0x79, 0x79, 0x64, 0x64, 0x64, 0x64, 0x2c, 0x20, 0x64, 0x20, 0x4d, 0x4d, 0x4d, 0x4d, 0x20, 0x27,
-0x43b, 0x27, 0x2e, 0x20, 0x79, 0x79, 0x79, 0x79, 0x2e, 0x79, 0x79, 0x79, 0x79, 0x20, 0x27, 0x441, 0x44b, 0x43b, 0x27, 0x20,
-0x4d, 0x4d, 0x4d, 0x4d, 0x20, 0x64, 0x20, 0x27, 0x43a, 0x4af, 0x43d, 0x44d, 0x27, 0x2c, 0x20, 0x64, 0x64, 0x64, 0x64, 0x64,
-0x64, 0x2f, 0x4d, 0x4d, 0x20, 0x79, 0x79, 0x79, 0x79, 0x64, 0x64, 0x64, 0x64, 0x20, 0x2c, 0x20, 0x27, 0x6c, 0x79, 0x25b,
-0x27, 0x30c, 0x2bc, 0x20, 0x64, 0x20, 0x27, 0x6e, 0x61, 0x27, 0x20, 0x4d, 0x4d, 0x4d, 0x4d, 0x2c, 0x20, 0x79, 0x79, 0x79,
-0x79, 0x64, 0x64, 0x64, 0x64, 0x2c, 0x20, 0x79, 0x79, 0x79, 0x79, 0x20, 0x27, 0x6d, 0x65, 0x74, 0x74, 0x61, 0x73, 0x27,
-0x20, 0x64, 0x2e, 0x20, 0x4d, 0x4d, 0x4d, 0x4d, 0x64, 0x64, 0x64, 0x64, 0x2c, 0x20, 0x4d, 0x4d, 0x4d, 0x4d, 0x20, 0x64,
-0x2e, 0x20, 0x79, 0x79, 0x79, 0x79
-};
-
-static const ushort time_format_data[] = {
-0x48, 0x48, 0x3a, 0x6d, 0x6d, 0x3a, 0x73, 0x73, 0x48, 0x48, 0x3a, 0x6d, 0x6d, 0x3a, 0x73, 0x73, 0x20, 0x74, 0x68, 0x3a,
-0x6d, 0x6d, 0x20, 0x41, 0x50, 0x68, 0x3a, 0x6d, 0x6d, 0x3a, 0x73, 0x73, 0x20, 0x41, 0x50, 0x20, 0x74, 0x48, 0x48, 0x3a,
-0x6d, 0x6d, 0x68, 0x3a, 0x6d, 0x6d, 0x3a, 0x73, 0x73, 0x20, 0x41, 0x50, 0x2c, 0x20, 0x74, 0x48, 0x3a, 0x6d, 0x6d, 0x48,
-0x3a, 0x6d, 0x6d, 0x3a, 0x73, 0x73, 0x20, 0x74, 0x41, 0x50, 0x20, 0x68, 0x2e, 0x6d, 0x6d, 0x41, 0x50, 0x20, 0x68, 0x2e,
-0x6d, 0x6d, 0x2e, 0x73, 0x73, 0x20, 0x74, 0x48, 0x48, 0x3a, 0x6d, 0x6d, 0x3a, 0x73, 0x73, 0x20, 0x28, 0x74, 0x29, 0xf46,
-0xf74, 0xf0b, 0xf5a, 0xf7c, 0xf51, 0xf0b, 0x20, 0x68, 0x20, 0xf66, 0xf90, 0xf62, 0xf0b, 0xf58, 0xf0b, 0x20, 0x6d, 0x6d, 0x20, 0x41,
-0x50, 0xf46, 0xf74, 0xf0b, 0xf5a, 0xf7c, 0xf51, 0xf0b, 0x20, 0x68, 0x20, 0xf66, 0xf90, 0xf62, 0xf0b, 0xf58, 0xf0b, 0x20, 0x6d, 0x6d,
-0x3a, 0x73, 0x73, 0x20, 0x41, 0x50, 0x20, 0x74, 0x48, 0x3a, 0x6d, 0x6d, 0x20, 0x27, 0x447, 0x27, 0x2e, 0x48, 0x3a, 0x6d,
-0x6d, 0x3a, 0x73, 0x73, 0x20, 0x27, 0x447, 0x27, 0x2e, 0x20, 0x74, 0x42, 0x20, 0x48, 0x3a, 0x6d, 0x6d, 0x74, 0x20, 0x48,
-0x48, 0x3a, 0x6d, 0x6d, 0x3a, 0x73, 0x73, 0x48, 0x48, 0x3a, 0x6d, 0x6d, 0x3a, 0x73, 0x73, 0x2c, 0x20, 0x74, 0x41, 0x50,
-0x68, 0x3a, 0x6d, 0x6d, 0x74, 0x20, 0x41, 0x50, 0x68, 0x3a, 0x6d, 0x6d, 0x3a, 0x73, 0x73, 0x41, 0x50, 0x68, 0x3a, 0x6d,
-0x6d, 0x3a, 0x73, 0x73, 0x20, 0x5b, 0x74, 0x5d, 0x48, 0x48, 0x2e, 0x6d, 0x6d, 0x48, 0x48, 0x2e, 0x6d, 0x6d, 0x2e, 0x73,
-0x73, 0x20, 0x74, 0x48, 0x2e, 0x6d, 0x6d, 0x48, 0x2e, 0x6d, 0x6d, 0x2e, 0x73, 0x73, 0x20, 0x74, 0x48, 0x2d, 0x27, 0x61,
-0x27, 0x20, 0x27, 0x68, 0x6f, 0x72, 0x6f, 0x27, 0x20, 0x27, 0x6b, 0x61, 0x6a, 0x27, 0x20, 0x6d, 0x3a, 0x73, 0x73, 0x20,
-0x74, 0x48, 0x20, 0x27, 0x68, 0x27, 0x20, 0x6d, 0x6d, 0x20, 0x27, 0x6d, 0x69, 0x6e, 0x27, 0x20, 0x73, 0x73, 0x20, 0x27,
-0x73, 0x27, 0x20, 0x74, 0x48, 0x48, 0x20, 0x27, 0x68, 0x27, 0x20, 0x6d, 0x6d, 0x48, 0x48, 0x20, 0x27, 0x68, 0x27, 0x20,
-0x6d, 0x6d, 0x20, 0x27, 0x6d, 0x69, 0x6e, 0x27, 0x20, 0x73, 0x73, 0x20, 0x27, 0x73, 0x27, 0x20, 0x74, 0x48, 0x48, 0x2e,
-0x6d, 0x6d, 0x3a, 0x73, 0x73, 0x20, 0x27, 0x68, 0x27, 0x20, 0x74, 0x68, 0x68, 0x3a, 0x6d, 0x6d, 0x20, 0x41, 0x50, 0x68,
-0x68, 0x3a, 0x6d, 0x6d, 0x3a, 0x73, 0x73, 0x20, 0x41, 0x50, 0x20, 0x74, 0x48, 0x6642, 0x6d, 0x6d, 0x5206, 0x73, 0x73, 0x79d2,
-0x20, 0x74, 0x41, 0x50, 0x20, 0x68, 0x3a, 0x6d, 0x6d, 0x41, 0x50, 0x20, 0x68, 0xc2dc, 0x20, 0x6d, 0xbd84, 0x20, 0x73, 0xcd08,
-0x20, 0x74, 0x48, 0x20, 0xec2, 0xea1, 0xe87, 0x20, 0x6d, 0x20, 0xe99, 0xeb2, 0xe97, 0xeb5, 0x20, 0x73, 0x73, 0x20, 0xea7, 0xeb4,
-0xe99, 0xeb2, 0xe97, 0xeb5, 0x20, 0x74, 0x68, 0x3a, 0x6d, 0x6d, 0x48, 0x3a, 0x6d, 0x6d, 0x3a, 0x73, 0x73, 0x20, 0x28, 0x74,
-0x29, 0x27, 0x6b, 0x6c, 0x27, 0x2e, 0x20, 0x48, 0x48, 0x3a, 0x6d, 0x6d, 0x3a, 0x73, 0x73, 0x20, 0x74, 0x41, 0x50, 0x20,
-0x68, 0x3a, 0x6d, 0x6d, 0x3a, 0x73, 0x73, 0x20, 0x74, 0x48, 0x20, 0xe19, 0xe32, 0xe2c, 0xe34, 0xe01, 0xe32, 0x20, 0x6d, 0x6d,
-0x20, 0xe19, 0xe32, 0xe17, 0xe35, 0x20, 0x73, 0x73, 0x20, 0xe27, 0xe34, 0xe19, 0xe32, 0xe17, 0xe35, 0x20, 0x74, 0x48, 0x3a, 0x6d,
-0x41, 0x50, 0x20, 0x27, 0x67, 0x61, 0x27, 0x20, 0x68, 0x3a, 0x6d, 0x6d, 0x41, 0x50, 0x20, 0x27, 0x67, 0x61, 0x27, 0x20,
-0x68, 0x3a, 0x6d, 0x6d, 0x3a, 0x73, 0x73, 0x20, 0x74, 0x27, 0x4b, 0x6c, 0x27, 0x2e, 0x20, 0x48, 0x2e, 0x6d, 0x6d, 0x27,
-0x4b, 0x6c, 0x6f, 0x63, 0x6b, 0x27, 0x20, 0x48, 0x2e, 0x6d, 0x6d, 0x3a, 0x73, 0x73, 0x20, 0x28, 0x74, 0x29, 0x74, 0x20,
-0x68, 0x3a, 0x6d, 0x6d, 0x3a, 0x73, 0x73, 0x20, 0x41, 0x50, 0x48, 0x3a, 0x6d, 0x6d, 0x20, 0x27, 0x68, 0x6f, 0x64, 0x17a,
-0x27, 0x2e
-};
-
-static const ushort months_data[] = {
-0x4a, 0x61, 0x6e, 0x3b, 0x46, 0x65, 0x62, 0x3b, 0x4d, 0x61, 0x72, 0x3b, 0x41, 0x70, 0x72, 0x3b, 0x4d, 0x61, 0x79, 0x3b,
-0x4a, 0x75, 0x6e, 0x3b, 0x4a, 0x75, 0x6c, 0x3b, 0x41, 0x75, 0x67, 0x3b, 0x53, 0x65, 0x70, 0x3b, 0x4f, 0x63, 0x74, 0x3b,
-0x4e, 0x6f, 0x76, 0x3b, 0x44, 0x65, 0x63, 0x3b, 0x4a, 0x61, 0x6e, 0x75, 0x61, 0x72, 0x79, 0x3b, 0x46, 0x65, 0x62, 0x72,
-0x75, 0x61, 0x72, 0x79, 0x3b, 0x4d, 0x61, 0x72, 0x63, 0x68, 0x3b, 0x41, 0x70, 0x72, 0x69, 0x6c, 0x3b, 0x4d, 0x61, 0x79,
-0x3b, 0x4a, 0x75, 0x6e, 0x65, 0x3b, 0x4a, 0x75, 0x6c, 0x79, 0x3b, 0x41, 0x75, 0x67, 0x75, 0x73, 0x74, 0x3b, 0x53, 0x65,
-0x70, 0x74, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x3b, 0x4f, 0x63, 0x74, 0x6f, 0x62, 0x65, 0x72, 0x3b, 0x4e, 0x6f, 0x76, 0x65,
-0x6d, 0x62, 0x65, 0x72, 0x3b, 0x44, 0x65, 0x63, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x3b, 0x4a, 0x3b, 0x46, 0x3b, 0x4d, 0x3b,
-0x41, 0x3b, 0x4d, 0x3b, 0x4a, 0x3b, 0x4a, 0x3b, 0x41, 0x3b, 0x53, 0x3b, 0x4f, 0x3b, 0x4e, 0x3b, 0x44, 0x3b, 0x31, 0x3b,
-0x32, 0x3b, 0x33, 0x3b, 0x34, 0x3b, 0x35, 0x3b, 0x36, 0x3b, 0x37, 0x3b, 0x38, 0x3b, 0x39, 0x3b, 0x31, 0x30, 0x3b, 0x31,
-0x31, 0x3b, 0x31, 0x32, 0x3b, 0x41, 0x6d, 0x61, 0x3b, 0x47, 0x75, 0x72, 0x3b, 0x42, 0x69, 0x74, 0x3b, 0x45, 0x6c, 0x62,
-0x3b, 0x43, 0x61, 0x6d, 0x3b, 0x57, 0x61, 0x78, 0x3b, 0x41, 0x64, 0x6f, 0x3b, 0x48, 0x61, 0x67, 0x3b, 0x46, 0x75, 0x6c,
-0x3b, 0x4f, 0x6e, 0x6b, 0x3b, 0x53, 0x61, 0x64, 0x3b, 0x4d, 0x75, 0x64, 0x3b, 0x41, 0x6d, 0x61, 0x6a, 0x6a, 0x69, 0x69,
-0x3b, 0x47, 0x75, 0x72, 0x61, 0x61, 0x6e, 0x64, 0x68, 0x61, 0x6c, 0x61, 0x3b, 0x42, 0x69, 0x74, 0x6f, 0x6f, 0x74, 0x65,
-0x65, 0x73, 0x73, 0x61, 0x3b, 0x45, 0x6c, 0x62, 0x61, 0x3b, 0x43, 0x61, 0x61, 0x6d, 0x73, 0x61, 0x3b, 0x57, 0x61, 0x78,
-0x61, 0x62, 0x61, 0x6a, 0x6a, 0x69, 0x69, 0x3b, 0x41, 0x64, 0x6f, 0x6f, 0x6c, 0x65, 0x65, 0x73, 0x73, 0x61, 0x3b, 0x48,
-0x61, 0x67, 0x61, 0x79, 0x79, 0x61, 0x3b, 0x46, 0x75, 0x75, 0x6c, 0x62, 0x61, 0x6e, 0x61, 0x3b, 0x4f, 0x6e, 0x6b, 0x6f,
-0x6c, 0x6f, 0x6c, 0x65, 0x65, 0x73, 0x73, 0x61, 0x3b, 0x53, 0x61, 0x64, 0x61, 0x61, 0x73, 0x61, 0x3b, 0x4d, 0x75, 0x64,
-0x64, 0x65, 0x65, 0x3b, 0x41, 0x3b, 0x47, 0x3b, 0x42, 0x3b, 0x45, 0x3b, 0x43, 0x3b, 0x57, 0x3b, 0x41, 0x3b, 0x48, 0x3b,
-0x46, 0x3b, 0x4f, 0x3b, 0x53, 0x3b, 0x4d, 0x3b, 0x4d, 0x30, 0x31, 0x3b, 0x4d, 0x30, 0x32, 0x3b, 0x4d, 0x30, 0x33, 0x3b,
-0x4d, 0x30, 0x34, 0x3b, 0x4d, 0x30, 0x35, 0x3b, 0x4d, 0x30, 0x36, 0x3b, 0x4d, 0x30, 0x37, 0x3b, 0x4d, 0x30, 0x38, 0x3b,
-0x4d, 0x30, 0x39, 0x3b, 0x4d, 0x31, 0x30, 0x3b, 0x4d, 0x31, 0x31, 0x3b, 0x4d, 0x31, 0x32, 0x3b, 0x4a, 0x61, 0x6e, 0x2e,
-0x3b, 0x46, 0x65, 0x62, 0x2e, 0x3b, 0x4d, 0x72, 0x74, 0x2e, 0x3b, 0x41, 0x70, 0x72, 0x2e, 0x3b, 0x4d, 0x65, 0x69, 0x3b,
-0x4a, 0x75, 0x6e, 0x2e, 0x3b, 0x4a, 0x75, 0x6c, 0x2e, 0x3b, 0x41, 0x75, 0x67, 0x2e, 0x3b, 0x53, 0x65, 0x70, 0x2e, 0x3b,
-0x4f, 0x6b, 0x74, 0x2e, 0x3b, 0x4e, 0x6f, 0x76, 0x2e, 0x3b, 0x44, 0x65, 0x73, 0x2e, 0x3b, 0x4a, 0x61, 0x6e, 0x75, 0x61,
-0x72, 0x69, 0x65, 0x3b, 0x46, 0x65, 0x62, 0x72, 0x75, 0x61, 0x72, 0x69, 0x65, 0x3b, 0x4d, 0x61, 0x61, 0x72, 0x74, 0x3b,
-0x41, 0x70, 0x72, 0x69, 0x6c, 0x3b, 0x4d, 0x65, 0x69, 0x3b, 0x4a, 0x75, 0x6e, 0x69, 0x65, 0x3b, 0x4a, 0x75, 0x6c, 0x69,
-0x65, 0x3b, 0x41, 0x75, 0x67, 0x75, 0x73, 0x74, 0x75, 0x73, 0x3b, 0x53, 0x65, 0x70, 0x74, 0x65, 0x6d, 0x62, 0x65, 0x72,
-0x3b, 0x4f, 0x6b, 0x74, 0x6f, 0x62, 0x65, 0x72, 0x3b, 0x4e, 0x6f, 0x76, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x3b, 0x44, 0x65,
-0x73, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x3b, 0x6a, 0x61, 0x6e, 0x3b, 0x73, 0x68, 0x6b, 0x3b, 0x6d, 0x61, 0x72, 0x3b, 0x70,
-0x72, 0x69, 0x3b, 0x6d, 0x61, 0x6a, 0x3b, 0x71, 0x65, 0x72, 0x3b, 0x6b, 0x6f, 0x72, 0x72, 0x3b, 0x67, 0x75, 0x73, 0x68,
-0x3b, 0x73, 0x68, 0x74, 0x3b, 0x74, 0x65, 0x74, 0x3b, 0x6e, 0xeb, 0x6e, 0x3b, 0x64, 0x68, 0x6a, 0x3b, 0x6a, 0x61, 0x6e,
-0x61, 0x72, 0x3b, 0x73, 0x68, 0x6b, 0x75, 0x72, 0x74, 0x3b, 0x6d, 0x61, 0x72, 0x73, 0x3b, 0x70, 0x72, 0x69, 0x6c, 0x6c,
-0x3b, 0x6d, 0x61, 0x6a, 0x3b, 0x71, 0x65, 0x72, 0x73, 0x68, 0x6f, 0x72, 0x3b, 0x6b, 0x6f, 0x72, 0x72, 0x69, 0x6b, 0x3b,
-0x67, 0x75, 0x73, 0x68, 0x74, 0x3b, 0x73, 0x68, 0x74, 0x61, 0x74, 0x6f, 0x72, 0x3b, 0x74, 0x65, 0x74, 0x6f, 0x72, 0x3b,
-0x6e, 0xeb, 0x6e, 0x74, 0x6f, 0x72, 0x3b, 0x64, 0x68, 0x6a, 0x65, 0x74, 0x6f, 0x72, 0x3b, 0x6a, 0x3b, 0x73, 0x68, 0x3b,
-0x6d, 0x3b, 0x70, 0x3b, 0x6d, 0x3b, 0x71, 0x3b, 0x6b, 0x3b, 0x67, 0x3b, 0x73, 0x68, 0x3b, 0x74, 0x3b, 0x6e, 0x3b, 0x64,
-0x68, 0x3b, 0x1303, 0x1295, 0x12e9, 0x3b, 0x134c, 0x1265, 0x1229, 0x3b, 0x121b, 0x122d, 0x127d, 0x3b, 0x12a4, 0x1355, 0x122a, 0x3b, 0x121c, 0x12ed,
-0x3b, 0x1301, 0x1295, 0x3b, 0x1301, 0x120b, 0x12ed, 0x3b, 0x12a6, 0x1308, 0x1235, 0x3b, 0x1234, 0x1355, 0x1274, 0x3b, 0x12a6, 0x12ad, 0x1276, 0x3b,
-0x1296, 0x126c, 0x121d, 0x3b, 0x12f2, 0x1234, 0x121d, 0x3b, 0x1303, 0x1295, 0x12e9, 0x12c8, 0x122a, 0x3b, 0x134c, 0x1265, 0x1229, 0x12c8, 0x122a, 0x3b,
-0x121b, 0x122d, 0x127d, 0x3b, 0x12a4, 0x1355, 0x122a, 0x120d, 0x3b, 0x121c, 0x12ed, 0x3b, 0x1301, 0x1295, 0x3b, 0x1301, 0x120b, 0x12ed, 0x3b, 0x12a6,
-0x1308, 0x1235, 0x1275, 0x3b, 0x1234, 0x1355, 0x1274, 0x121d, 0x1260, 0x122d, 0x3b, 0x12a6, 0x12ad, 0x1276, 0x1260, 0x122d, 0x3b, 0x1296, 0x126c, 0x121d,
-0x1260, 0x122d, 0x3b, 0x12f2, 0x1234, 0x121d, 0x1260, 0x122d, 0x3b, 0x1303, 0x3b, 0x134c, 0x3b, 0x121b, 0x3b, 0x12a4, 0x3b, 0x121c, 0x3b, 0x1301,
-0x3b, 0x1301, 0x3b, 0x12a6, 0x3b, 0x1234, 0x3b, 0x12a6, 0x3b, 0x1296, 0x3b, 0x12f2, 0x3b, 0x64a, 0x646, 0x627, 0x64a, 0x631, 0x3b, 0x641,
-0x628, 0x631, 0x627, 0x64a, 0x631, 0x3b, 0x645, 0x627, 0x631, 0x633, 0x3b, 0x623, 0x628, 0x631, 0x64a, 0x644, 0x3b, 0x645, 0x627, 0x64a,
-0x648, 0x3b, 0x64a, 0x648, 0x646, 0x64a, 0x648, 0x3b, 0x64a, 0x648, 0x644, 0x64a, 0x648, 0x3b, 0x623, 0x63a, 0x633, 0x637, 0x633, 0x3b,
-0x633, 0x628, 0x62a, 0x645, 0x628, 0x631, 0x3b, 0x623, 0x643, 0x62a, 0x648, 0x628, 0x631, 0x3b, 0x646, 0x648, 0x641, 0x645, 0x628, 0x631,
-0x3b, 0x62f, 0x64a, 0x633, 0x645, 0x628, 0x631, 0x3b, 0x64a, 0x3b, 0x641, 0x3b, 0x645, 0x3b, 0x623, 0x3b, 0x648, 0x3b, 0x646, 0x3b,
-0x644, 0x3b, 0x63a, 0x3b, 0x633, 0x3b, 0x643, 0x3b, 0x628, 0x3b, 0x62f, 0x3b, 0x62c, 0x627, 0x646, 0x641, 0x64a, 0x3b, 0x641, 0x64a,
-0x641, 0x631, 0x64a, 0x3b, 0x645, 0x627, 0x631, 0x633, 0x3b, 0x623, 0x641, 0x631, 0x64a, 0x644, 0x3b, 0x645, 0x627, 0x64a, 0x3b, 0x62c,
-0x648, 0x627, 0x646, 0x3b, 0x62c, 0x648, 0x64a, 0x644, 0x64a, 0x629, 0x3b, 0x623, 0x648, 0x62a, 0x3b, 0x633, 0x628, 0x62a, 0x645, 0x628,
-0x631, 0x3b, 0x623, 0x643, 0x62a, 0x648, 0x628, 0x631, 0x3b, 0x646, 0x648, 0x641, 0x645, 0x628, 0x631, 0x3b, 0x62f, 0x64a, 0x633, 0x645,
-0x628, 0x631, 0x3b, 0x62c, 0x3b, 0x641, 0x3b, 0x645, 0x3b, 0x623, 0x3b, 0x645, 0x3b, 0x62c, 0x3b, 0x62c, 0x3b, 0x623, 0x3b, 0x633,
-0x3b, 0x623, 0x3b, 0x646, 0x3b, 0x62f, 0x3b, 0x643, 0x627, 0x646, 0x648, 0x646, 0x20, 0x627, 0x644, 0x62b, 0x627, 0x646, 0x64a, 0x3b,
-0x634, 0x628, 0x627, 0x637, 0x3b, 0x622, 0x630, 0x627, 0x631, 0x3b, 0x646, 0x64a, 0x633, 0x627, 0x646, 0x3b, 0x623, 0x64a, 0x627, 0x631,
-0x3b, 0x62d, 0x632, 0x64a, 0x631, 0x627, 0x646, 0x3b, 0x62a, 0x645, 0x648, 0x632, 0x3b, 0x622, 0x628, 0x3b, 0x623, 0x64a, 0x644, 0x648,
-0x644, 0x3b, 0x62a, 0x634, 0x631, 0x64a, 0x646, 0x20, 0x627, 0x644, 0x623, 0x648, 0x644, 0x3b, 0x62a, 0x634, 0x631, 0x64a, 0x646, 0x20,
-0x627, 0x644, 0x62b, 0x627, 0x646, 0x64a, 0x3b, 0x643, 0x627, 0x646, 0x648, 0x646, 0x20, 0x627, 0x644, 0x623, 0x648, 0x644, 0x3b, 0x643,
-0x3b, 0x634, 0x3b, 0x622, 0x3b, 0x646, 0x3b, 0x623, 0x3b, 0x62d, 0x3b, 0x62a, 0x3b, 0x622, 0x3b, 0x623, 0x3b, 0x62a, 0x3b, 0x62a,
-0x3b, 0x643, 0x3b, 0x643, 0x627, 0x646, 0x648, 0x646, 0x20, 0x627, 0x644, 0x62b, 0x627, 0x646, 0x64a, 0x3b, 0x634, 0x628, 0x627, 0x637,
-0x3b, 0x622, 0x630, 0x627, 0x631, 0x3b, 0x646, 0x64a, 0x633, 0x627, 0x646, 0x3b, 0x623, 0x64a, 0x627, 0x631, 0x3b, 0x62d, 0x632, 0x64a,
-0x631, 0x627, 0x646, 0x3b, 0x62a, 0x645, 0x648, 0x632, 0x3b, 0x622, 0x628, 0x3b, 0x623, 0x64a, 0x644, 0x648, 0x644, 0x3b, 0x62a, 0x634,
-0x631, 0x64a, 0x646, 0xa0, 0x627, 0x644, 0x623, 0x648, 0x644, 0x3b, 0x62a, 0x634, 0x631, 0x64a, 0x646, 0x20, 0x627, 0x644, 0x62b, 0x627,
-0x646, 0x64a, 0x3b, 0x643, 0x627, 0x646, 0x648, 0x646, 0x20, 0x627, 0x644, 0x623, 0x648, 0x644, 0x3b, 0x64a, 0x646, 0x627, 0x64a, 0x631,
-0x3b, 0x641, 0x628, 0x631, 0x627, 0x64a, 0x631, 0x3b, 0x645, 0x627, 0x631, 0x633, 0x3b, 0x625, 0x628, 0x631, 0x64a, 0x644, 0x3b, 0x645,
-0x627, 0x64a, 0x648, 0x3b, 0x64a, 0x648, 0x646, 0x64a, 0x648, 0x3b, 0x64a, 0x648, 0x644, 0x64a, 0x648, 0x3b, 0x623, 0x63a, 0x634, 0x62a,
-0x3b, 0x634, 0x62a, 0x645, 0x628, 0x631, 0x3b, 0x623, 0x643, 0x62a, 0x648, 0x628, 0x631, 0x3b, 0x646, 0x648, 0x641, 0x645, 0x628, 0x631,
-0x3b, 0x62f, 0x62c, 0x645, 0x628, 0x631, 0x3b, 0x64a, 0x3b, 0x641, 0x3b, 0x645, 0x3b, 0x625, 0x3b, 0x648, 0x3b, 0x646, 0x3b, 0x644,
-0x3b, 0x63a, 0x3b, 0x634, 0x3b, 0x643, 0x3b, 0x628, 0x3b, 0x62f, 0x3b, 0x64a, 0x646, 0x627, 0x64a, 0x631, 0x3b, 0x641, 0x628, 0x631,
-0x627, 0x64a, 0x631, 0x3b, 0x645, 0x627, 0x631, 0x633, 0x3b, 0x623, 0x628, 0x631, 0x64a, 0x644, 0x3b, 0x645, 0x627, 0x64a, 0x3b, 0x64a,
-0x648, 0x646, 0x64a, 0x648, 0x3b, 0x64a, 0x648, 0x644, 0x64a, 0x648, 0x632, 0x3b, 0x63a, 0x634, 0x62a, 0x3b, 0x634, 0x62a, 0x646, 0x628,
-0x631, 0x3b, 0x623, 0x643, 0x62a, 0x648, 0x628, 0x631, 0x3b, 0x646, 0x648, 0x646, 0x628, 0x631, 0x3b, 0x62f, 0x62c, 0x646, 0x628, 0x631,
-0x3b, 0x64a, 0x3b, 0x641, 0x3b, 0x645, 0x3b, 0x623, 0x3b, 0x645, 0x3b, 0x646, 0x3b, 0x644, 0x3b, 0x63a, 0x3b, 0x634, 0x3b, 0x643,
-0x3b, 0x628, 0x3b, 0x62f, 0x3b, 0x570, 0x576, 0x57e, 0x3b, 0x583, 0x57f, 0x57e, 0x3b, 0x574, 0x580, 0x57f, 0x3b, 0x561, 0x57a, 0x580,
-0x3b, 0x574, 0x575, 0x57d, 0x3b, 0x570, 0x576, 0x57d, 0x3b, 0x570, 0x56c, 0x57d, 0x3b, 0x585, 0x563, 0x57d, 0x3b, 0x57d, 0x565, 0x57a,
-0x3b, 0x570, 0x578, 0x56f, 0x3b, 0x576, 0x578, 0x575, 0x3b, 0x564, 0x565, 0x56f, 0x3b, 0x570, 0x578, 0x582, 0x576, 0x57e, 0x561, 0x580,
-0x3b, 0x583, 0x565, 0x57f, 0x580, 0x57e, 0x561, 0x580, 0x3b, 0x574, 0x561, 0x580, 0x57f, 0x3b, 0x561, 0x57a, 0x580, 0x56b, 0x56c, 0x3b,
-0x574, 0x561, 0x575, 0x56b, 0x57d, 0x3b, 0x570, 0x578, 0x582, 0x576, 0x56b, 0x57d, 0x3b, 0x570, 0x578, 0x582, 0x56c, 0x56b, 0x57d, 0x3b,
-0x585, 0x563, 0x578, 0x57d, 0x57f, 0x578, 0x57d, 0x3b, 0x57d, 0x565, 0x57a, 0x57f, 0x565, 0x574, 0x562, 0x565, 0x580, 0x3b, 0x570, 0x578,
-0x56f, 0x57f, 0x565, 0x574, 0x562, 0x565, 0x580, 0x3b, 0x576, 0x578, 0x575, 0x565, 0x574, 0x562, 0x565, 0x580, 0x3b, 0x564, 0x565, 0x56f,
-0x57f, 0x565, 0x574, 0x562, 0x565, 0x580, 0x3b, 0x540, 0x3b, 0x553, 0x3b, 0x544, 0x3b, 0x531, 0x3b, 0x544, 0x3b, 0x540, 0x3b, 0x540,
-0x3b, 0x555, 0x3b, 0x54d, 0x3b, 0x540, 0x3b, 0x546, 0x3b, 0x534, 0x3b, 0x570, 0x578, 0x582, 0x576, 0x57e, 0x561, 0x580, 0x56b, 0x3b,
-0x583, 0x565, 0x57f, 0x580, 0x57e, 0x561, 0x580, 0x56b, 0x3b, 0x574, 0x561, 0x580, 0x57f, 0x56b, 0x3b, 0x561, 0x57a, 0x580, 0x56b, 0x56c,
-0x56b, 0x3b, 0x574, 0x561, 0x575, 0x56b, 0x57d, 0x56b, 0x3b, 0x570, 0x578, 0x582, 0x576, 0x56b, 0x57d, 0x56b, 0x3b, 0x570, 0x578, 0x582,
-0x56c, 0x56b, 0x57d, 0x56b, 0x3b, 0x585, 0x563, 0x578, 0x57d, 0x57f, 0x578, 0x57d, 0x56b, 0x3b, 0x57d, 0x565, 0x57a, 0x57f, 0x565, 0x574,
-0x562, 0x565, 0x580, 0x56b, 0x3b, 0x570, 0x578, 0x56f, 0x57f, 0x565, 0x574, 0x562, 0x565, 0x580, 0x56b, 0x3b, 0x576, 0x578, 0x575, 0x565,
-0x574, 0x562, 0x565, 0x580, 0x56b, 0x3b, 0x564, 0x565, 0x56f, 0x57f, 0x565, 0x574, 0x562, 0x565, 0x580, 0x56b, 0x3b, 0x99c, 0x9be, 0x9a8,
-0x9c1, 0x3b, 0x9ab, 0x9c7, 0x9ac, 0x9cd, 0x9f0, 0x9c1, 0x3b, 0x9ae, 0x9be, 0x9f0, 0x9cd, 0x99a, 0x3b, 0x98f, 0x9aa, 0x9cd, 0x9f0, 0x9bf,
-0x9b2, 0x3b, 0x9ae, 0x9c7, 0x2019, 0x3b, 0x99c, 0x9c1, 0x9a8, 0x3b, 0x99c, 0x9c1, 0x9b2, 0x9be, 0x987, 0x3b, 0x986, 0x997, 0x3b, 0x99b,
-0x9c7, 0x9aa, 0x9cd, 0x9a4, 0x9c7, 0x3b, 0x985, 0x995, 0x9cd, 0x99f, 0x9cb, 0x3b, 0x9a8, 0x9f1, 0x9c7, 0x3b, 0x9a1, 0x9bf, 0x99a, 0x9c7,
-0x3b, 0x99c, 0x9be, 0x9a8, 0x9c1, 0x9f1, 0x9be, 0x9f0, 0x9c0, 0x3b, 0x9ab, 0x9c7, 0x9ac, 0x9cd, 0x9f0, 0x9c1, 0x9f1, 0x9be, 0x9f0, 0x9c0,
-0x3b, 0x9ae, 0x9be, 0x9f0, 0x9cd, 0x99a, 0x3b, 0x98f, 0x9aa, 0x9cd, 0x9f0, 0x9bf, 0x9b2, 0x3b, 0x9ae, 0x9c7, 0x2019, 0x3b, 0x99c, 0x9c1,
-0x9a8, 0x3b, 0x99c, 0x9c1, 0x9b2, 0x9be, 0x987, 0x3b, 0x986, 0x997, 0x9b7, 0x9cd, 0x99f, 0x3b, 0x99b, 0x9c7, 0x9aa, 0x9cd, 0x9a4, 0x9c7,
-0x9ae, 0x9cd, 0x9ac, 0x9f0, 0x3b, 0x985, 0x995, 0x9cd, 0x99f, 0x9cb, 0x9ac, 0x9f0, 0x3b, 0x9a8, 0x9f1, 0x9c7, 0x9ae, 0x9cd, 0x9ac, 0x9f0,
-0x3b, 0x9a1, 0x9bf, 0x99a, 0x9c7, 0x9ae, 0x9cd, 0x9ac, 0x9f0, 0x3b, 0x99c, 0x3b, 0x9ab, 0x3b, 0x9ae, 0x3b, 0x98f, 0x3b, 0x9ae, 0x3b,
-0x99c, 0x3b, 0x99c, 0x3b, 0x986, 0x3b, 0x99b, 0x3b, 0x985, 0x3b, 0x9a8, 0x3b, 0x9a1, 0x3b, 0x79, 0x61, 0x6e, 0x3b, 0x66, 0x65,
-0x76, 0x3b, 0x6d, 0x61, 0x72, 0x3b, 0x61, 0x70, 0x72, 0x3b, 0x6d, 0x61, 0x79, 0x3b, 0x69, 0x79, 0x6e, 0x3b, 0x69, 0x79,
-0x6c, 0x3b, 0x61, 0x76, 0x71, 0x3b, 0x73, 0x65, 0x6e, 0x3b, 0x6f, 0x6b, 0x74, 0x3b, 0x6e, 0x6f, 0x79, 0x3b, 0x64, 0x65,
-0x6b, 0x3b, 0x59, 0x61, 0x6e, 0x76, 0x61, 0x72, 0x3b, 0x46, 0x65, 0x76, 0x72, 0x61, 0x6c, 0x3b, 0x4d, 0x61, 0x72, 0x74,
-0x3b, 0x41, 0x70, 0x72, 0x65, 0x6c, 0x3b, 0x4d, 0x61, 0x79, 0x3b, 0x130, 0x79, 0x75, 0x6e, 0x3b, 0x130, 0x79, 0x75, 0x6c,
-0x3b, 0x41, 0x76, 0x71, 0x75, 0x73, 0x74, 0x3b, 0x53, 0x65, 0x6e, 0x74, 0x79, 0x61, 0x62, 0x72, 0x3b, 0x4f, 0x6b, 0x74,
-0x79, 0x61, 0x62, 0x72, 0x3b, 0x4e, 0x6f, 0x79, 0x61, 0x62, 0x72, 0x3b, 0x44, 0x65, 0x6b, 0x61, 0x62, 0x72, 0x3b, 0x79,
-0x61, 0x6e, 0x76, 0x61, 0x72, 0x3b, 0x66, 0x65, 0x76, 0x72, 0x61, 0x6c, 0x3b, 0x6d, 0x61, 0x72, 0x74, 0x3b, 0x61, 0x70,
-0x72, 0x65, 0x6c, 0x3b, 0x6d, 0x61, 0x79, 0x3b, 0x69, 0x79, 0x75, 0x6e, 0x3b, 0x69, 0x79, 0x75, 0x6c, 0x3b, 0x61, 0x76,
-0x71, 0x75, 0x73, 0x74, 0x3b, 0x73, 0x65, 0x6e, 0x74, 0x79, 0x61, 0x62, 0x72, 0x3b, 0x6f, 0x6b, 0x74, 0x79, 0x61, 0x62,
-0x72, 0x3b, 0x6e, 0x6f, 0x79, 0x61, 0x62, 0x72, 0x3b, 0x64, 0x65, 0x6b, 0x61, 0x62, 0x72, 0x3b, 0x458, 0x430, 0x43d, 0x3b,
-0x444, 0x435, 0x432, 0x3b, 0x43c, 0x430, 0x440, 0x3b, 0x430, 0x43f, 0x440, 0x3b, 0x43c, 0x430, 0x439, 0x3b, 0x438, 0x458, 0x43d, 0x3b,
-0x438, 0x458, 0x43b, 0x3b, 0x430, 0x432, 0x433, 0x3b, 0x441, 0x435, 0x43d, 0x3b, 0x43e, 0x43a, 0x442, 0x3b, 0x43d, 0x43e, 0x458, 0x3b,
-0x434, 0x435, 0x43a, 0x3b, 0x408, 0x430, 0x43d, 0x432, 0x430, 0x440, 0x3b, 0x424, 0x435, 0x432, 0x440, 0x430, 0x43b, 0x3b, 0x41c, 0x430,
-0x440, 0x442, 0x3b, 0x410, 0x43f, 0x440, 0x435, 0x43b, 0x3b, 0x41c, 0x430, 0x439, 0x3b, 0x418, 0x458, 0x443, 0x43d, 0x3b, 0x418, 0x458,
-0x443, 0x43b, 0x3b, 0x410, 0x432, 0x433, 0x443, 0x441, 0x442, 0x3b, 0x421, 0x435, 0x43d, 0x442, 0x458, 0x430, 0x431, 0x440, 0x3b, 0x41e,
-0x43a, 0x442, 0x458, 0x430, 0x431, 0x440, 0x3b, 0x41d, 0x43e, 0x458, 0x430, 0x431, 0x440, 0x3b, 0x414, 0x435, 0x43a, 0x430, 0x431, 0x440,
-0x3b, 0x458, 0x430, 0x43d, 0x432, 0x430, 0x440, 0x3b, 0x444, 0x435, 0x432, 0x440, 0x430, 0x43b, 0x3b, 0x43c, 0x430, 0x440, 0x442, 0x3b,
-0x430, 0x43f, 0x440, 0x435, 0x43b, 0x3b, 0x43c, 0x430, 0x439, 0x3b, 0x438, 0x458, 0x443, 0x43d, 0x3b, 0x438, 0x458, 0x443, 0x43b, 0x3b,
-0x430, 0x432, 0x433, 0x443, 0x441, 0x442, 0x3b, 0x441, 0x435, 0x43d, 0x442, 0x458, 0x430, 0x431, 0x440, 0x3b, 0x43e, 0x43a, 0x442, 0x458,
-0x430, 0x431, 0x440, 0x3b, 0x43d, 0x43e, 0x458, 0x430, 0x431, 0x440, 0x3b, 0x434, 0x435, 0x43a, 0x430, 0x431, 0x440, 0x3b, 0x75, 0x72,
-0x74, 0x2e, 0x3b, 0x6f, 0x74, 0x73, 0x2e, 0x3b, 0x6d, 0x61, 0x72, 0x2e, 0x3b, 0x61, 0x70, 0x69, 0x2e, 0x3b, 0x6d, 0x61,
-0x69, 0x2e, 0x3b, 0x65, 0x6b, 0x61, 0x2e, 0x3b, 0x75, 0x7a, 0x74, 0x2e, 0x3b, 0x61, 0x62, 0x75, 0x2e, 0x3b, 0x69, 0x72,
-0x61, 0x2e, 0x3b, 0x75, 0x72, 0x72, 0x2e, 0x3b, 0x61, 0x7a, 0x61, 0x2e, 0x3b, 0x61, 0x62, 0x65, 0x2e, 0x3b, 0x75, 0x72,
-0x74, 0x61, 0x72, 0x72, 0x69, 0x6c, 0x61, 0x3b, 0x6f, 0x74, 0x73, 0x61, 0x69, 0x6c, 0x61, 0x3b, 0x6d, 0x61, 0x72, 0x74,
-0x78, 0x6f, 0x61, 0x3b, 0x61, 0x70, 0x69, 0x72, 0x69, 0x6c, 0x61, 0x3b, 0x6d, 0x61, 0x69, 0x61, 0x74, 0x7a, 0x61, 0x3b,
-0x65, 0x6b, 0x61, 0x69, 0x6e, 0x61, 0x3b, 0x75, 0x7a, 0x74, 0x61, 0x69, 0x6c, 0x61, 0x3b, 0x61, 0x62, 0x75, 0x7a, 0x74,
-0x75, 0x61, 0x3b, 0x69, 0x72, 0x61, 0x69, 0x6c, 0x61, 0x3b, 0x75, 0x72, 0x72, 0x69, 0x61, 0x3b, 0x61, 0x7a, 0x61, 0x72,
-0x6f, 0x61, 0x3b, 0x61, 0x62, 0x65, 0x6e, 0x64, 0x75, 0x61, 0x3b, 0x55, 0x3b, 0x4f, 0x3b, 0x4d, 0x3b, 0x41, 0x3b, 0x4d,
-0x3b, 0x45, 0x3b, 0x55, 0x3b, 0x41, 0x3b, 0x49, 0x3b, 0x55, 0x3b, 0x41, 0x3b, 0x41, 0x3b, 0x99c, 0x9be, 0x9a8, 0x9c1, 0x9af,
-0x9bc, 0x9be, 0x9b0, 0x9c0, 0x3b, 0x9ab, 0x9c7, 0x9ac, 0x9cd, 0x9b0, 0x9c1, 0x9af, 0x9bc, 0x9be, 0x9b0, 0x9c0, 0x3b, 0x9ae, 0x9be, 0x9b0,
-0x9cd, 0x99a, 0x3b, 0x98f, 0x9aa, 0x9cd, 0x9b0, 0x9bf, 0x9b2, 0x3b, 0x9ae, 0x9c7, 0x3b, 0x99c, 0x9c1, 0x9a8, 0x3b, 0x99c, 0x9c1, 0x9b2,
-0x9be, 0x987, 0x3b, 0x986, 0x997, 0x9b8, 0x9cd, 0x99f, 0x3b, 0x9b8, 0x9c7, 0x9aa, 0x9cd, 0x99f, 0x9c7, 0x9ae, 0x9cd, 0x9ac, 0x9b0, 0x3b,
-0x985, 0x995, 0x9cd, 0x99f, 0x9cb, 0x9ac, 0x9b0, 0x3b, 0x9a8, 0x9ad, 0x9c7, 0x9ae, 0x9cd, 0x9ac, 0x9b0, 0x3b, 0x9a1, 0x9bf, 0x9b8, 0x9c7,
-0x9ae, 0x9cd, 0x9ac, 0x9b0, 0x3b, 0x99c, 0x9be, 0x3b, 0x9ab, 0x9c7, 0x3b, 0x9ae, 0x9be, 0x3b, 0x98f, 0x3b, 0x9ae, 0x9c7, 0x3b, 0x99c,
-0x9c1, 0x9a8, 0x3b, 0x99c, 0x9c1, 0x3b, 0x986, 0x3b, 0x9b8, 0x9c7, 0x3b, 0x985, 0x3b, 0x9a8, 0x3b, 0x9a1, 0x9bf, 0x3b, 0x99c, 0x9be,
-0x9a8, 0x9c1, 0x3b, 0x9ab, 0x9c7, 0x9ac, 0x3b, 0x9ae, 0x9be, 0x9b0, 0x9cd, 0x99a, 0x3b, 0x98f, 0x9aa, 0x9cd, 0x9b0, 0x9bf, 0x9b2, 0x3b,
-0x9ae, 0x9c7, 0x3b, 0x99c, 0x9c1, 0x9a8, 0x3b, 0x99c, 0x9c1, 0x9b2, 0x9be, 0x987, 0x3b, 0x986, 0x997, 0x9b8, 0x9cd, 0x99f, 0x3b, 0x9b8,
-0x9c7, 0x9aa, 0x9cd, 0x99f, 0x9c7, 0x9ae, 0x9cd, 0x9ac, 0x9b0, 0x3b, 0x985, 0x995, 0x9cd, 0x99f, 0x9cb, 0x9ac, 0x9b0, 0x3b, 0x9a8, 0x9ad,
-0x9c7, 0x9ae, 0x9cd, 0x9ac, 0x9b0, 0x3b, 0x9a1, 0x9bf, 0x9b8, 0x9c7, 0x9ae, 0x9cd, 0x9ac, 0x9b0, 0x3b, 0xf5f, 0xfb3, 0xf0b, 0xf21, 0x3b,
-0xf5f, 0xfb3, 0xf0b, 0xf22, 0x3b, 0xf5f, 0xfb3, 0xf0b, 0xf23, 0x3b, 0xf5f, 0xfb3, 0xf0b, 0xf24, 0x3b, 0xf5f, 0xfb3, 0xf0b, 0xf25, 0x3b,
-0xf5f, 0xfb3, 0xf0b, 0xf26, 0x3b, 0xf5f, 0xfb3, 0xf0b, 0xf27, 0x3b, 0xf5f, 0xfb3, 0xf0b, 0xf28, 0x3b, 0xf5f, 0xfb3, 0xf0b, 0xf29, 0x3b,
-0xf5f, 0xfb3, 0xf0b, 0xf21, 0xf20, 0x3b, 0xf5f, 0xfb3, 0xf0b, 0xf21, 0xf21, 0x3b, 0xf5f, 0xfb3, 0xf0b, 0xf21, 0xf22, 0x3b, 0xf66, 0xfa4,
-0xfb1, 0xf72, 0xf0b, 0xf5f, 0xfb3, 0xf0b, 0xf51, 0xf44, 0xf54, 0xf0b, 0x3b, 0xf66, 0xfa4, 0xfb1, 0xf72, 0xf0b, 0xf5f, 0xfb3, 0xf0b, 0xf42,
-0xf49, 0xf72, 0xf66, 0xf0b, 0xf54, 0xf0b, 0x3b, 0xf66, 0xfa4, 0xfb1, 0xf72, 0xf0b, 0xf5f, 0xfb3, 0xf0b, 0xf42, 0xf66, 0xf74, 0xf58, 0xf0b,
-0xf54, 0xf0b, 0x3b, 0xf66, 0xfa4, 0xfb1, 0xf72, 0xf0b, 0xf5f, 0xfb3, 0xf0b, 0xf56, 0xf5e, 0xf72, 0xf0b, 0xf54, 0x3b, 0xf66, 0xfa4, 0xfb1,
-0xf72, 0xf0b, 0xf5f, 0xfb3, 0xf0b, 0xf63, 0xf94, 0xf0b, 0xf54, 0xf0b, 0x3b, 0xf66, 0xfa4, 0xfb1, 0xf72, 0xf0b, 0xf5f, 0xfb3, 0xf0b, 0xf51,
-0xfb2, 0xf74, 0xf42, 0xf0b, 0xf54, 0x3b, 0xf66, 0xfa4, 0xfb1, 0xf72, 0xf0b, 0xf5f, 0xfb3, 0xf0b, 0xf56, 0xf51, 0xf74, 0xf53, 0xf0b, 0xf54,
-0xf0b, 0x3b, 0xf66, 0xfa4, 0xfb1, 0xf72, 0xf0b, 0xf5f, 0xfb3, 0xf0b, 0xf56, 0xf62, 0xf92, 0xfb1, 0xf51, 0xf0b, 0xf54, 0xf0b, 0x3b, 0xf66,
-0xfa4, 0xfb1, 0xf72, 0xf0b, 0xf5f, 0xfb3, 0xf0b, 0xf51, 0xf42, 0xf74, 0xf0b, 0xf54, 0xf0b, 0x3b, 0xf66, 0xfa4, 0xfb1, 0xf72, 0xf0b, 0xf5f,
-0xfb3, 0xf0b, 0xf56, 0xf45, 0xf74, 0xf0b, 0xf54, 0xf0b, 0x3b, 0xf66, 0xfa4, 0xfb1, 0xf72, 0xf0b, 0xf5f, 0xfb3, 0xf0b, 0xf56, 0xf45, 0xf74,
-0xf0b, 0xf42, 0xf45, 0xf72, 0xf42, 0xf0b, 0xf54, 0xf0b, 0x3b, 0xf66, 0xfa4, 0xfb1, 0xf72, 0xf0b, 0xf5f, 0xfb3, 0xf0b, 0xf56, 0xf45, 0xf74,
-0xf0b, 0xf42, 0xf49, 0xf72, 0xf66, 0xf0b, 0xf54, 0xf0b, 0x3b, 0xf21, 0x3b, 0xf22, 0x3b, 0xf23, 0x3b, 0xf24, 0x3b, 0xf25, 0x3b, 0xf26,
-0x3b, 0xf27, 0x3b, 0xf28, 0x3b, 0xf29, 0x3b, 0xf21, 0xf20, 0x3b, 0xf21, 0xf21, 0x3b, 0xf21, 0xf22, 0x3b, 0xf21, 0x3b, 0xf22, 0x3b,
-0xf23, 0x3b, 0xf24, 0x3b, 0xf25, 0x3b, 0xf26, 0x3b, 0xf27, 0x3b, 0xf28, 0x3b, 0xf29, 0x3b, 0xf21, 0xf20, 0x3b, 0xf21, 0xf21, 0x3b,
-0x31, 0x32, 0x3b, 0xf5f, 0xfb3, 0xf0b, 0xf51, 0xf44, 0xf54, 0xf0b, 0x3b, 0xf5f, 0xfb3, 0xf0b, 0xf42, 0xf49, 0xf72, 0xf66, 0xf0b, 0xf54,
-0xf0b, 0x3b, 0xf5f, 0xfb3, 0xf0b, 0xf42, 0xf66, 0xf74, 0xf58, 0xf0b, 0xf54, 0xf0b, 0x3b, 0xf5f, 0xfb3, 0xf0b, 0xf56, 0xf5e, 0xf72, 0xf0b,
-0xf54, 0xf0b, 0x3b, 0xf5f, 0xfb3, 0xf0b, 0xf63, 0xf94, 0xf0b, 0xf54, 0xf0b, 0x3b, 0xf5f, 0xfb3, 0xf0b, 0xf51, 0xfb2, 0xf74, 0xf42, 0xf0b,
-0xf54, 0x3b, 0xf5f, 0xfb3, 0xf0b, 0xf56, 0xf51, 0xf74, 0xf53, 0xf0b, 0xf54, 0xf0b, 0x3b, 0xf5f, 0xfb3, 0xf0b, 0xf56, 0xf62, 0xf92, 0xfb1,
-0xf51, 0xf0b, 0xf54, 0xf0b, 0x3b, 0xf5f, 0xfb3, 0xf0b, 0xf51, 0xf42, 0xf74, 0xf0b, 0xf54, 0xf0b, 0x3b, 0xf5f, 0xfb3, 0xf0b, 0xf56, 0xf45,
-0xf74, 0xf0b, 0xf54, 0xf0b, 0x3b, 0xf5f, 0xfb3, 0xf0b, 0xf56, 0xf45, 0xf74, 0xf0b, 0xf42, 0xf45, 0xf72, 0xf42, 0xf0b, 0xf54, 0xf0b, 0x3b,
-0xf5f, 0xfb3, 0xf0b, 0xf56, 0xf45, 0xf74, 0xf0b, 0xf42, 0xf49, 0xf72, 0xf66, 0xf0b, 0xf54, 0xf0b, 0x3b, 0xf21, 0x3b, 0xf22, 0x3b, 0xf23,
-0x3b, 0x34, 0x3b, 0xf25, 0x3b, 0xf26, 0x3b, 0xf27, 0x3b, 0xf28, 0x3b, 0x39, 0x3b, 0xf21, 0xf20, 0x3b, 0xf21, 0xf21, 0x3b, 0xf21,
-0xf22, 0x3b, 0x47, 0x65, 0x6e, 0x2e, 0x3b, 0x43, 0x2bc, 0x68, 0x77, 0x65, 0x2e, 0x3b, 0x4d, 0x65, 0x75, 0x72, 0x2e, 0x3b,
-0x45, 0x62, 0x72, 0x2e, 0x3b, 0x4d, 0x61, 0x65, 0x3b, 0x4d, 0x65, 0x7a, 0x68, 0x2e, 0x3b, 0x47, 0x6f, 0x75, 0x65, 0x2e,
-0x3b, 0x45, 0x6f, 0x73, 0x74, 0x3b, 0x47, 0x77, 0x65, 0x6e, 0x2e, 0x3b, 0x48, 0x65, 0x72, 0x65, 0x3b, 0x44, 0x75, 0x3b,
-0x4b, 0x7a, 0x75, 0x2e, 0x3b, 0x47, 0x65, 0x6e, 0x76, 0x65, 0x72, 0x3b, 0x43, 0x2bc, 0x68, 0x77, 0x65, 0x76, 0x72, 0x65,
-0x72, 0x3b, 0x4d, 0x65, 0x75, 0x72, 0x7a, 0x68, 0x3b, 0x45, 0x62, 0x72, 0x65, 0x6c, 0x3b, 0x4d, 0x61, 0x65, 0x3b, 0x4d,
-0x65, 0x7a, 0x68, 0x65, 0x76, 0x65, 0x6e, 0x3b, 0x47, 0x6f, 0x75, 0x65, 0x72, 0x65, 0x3b, 0x45, 0x6f, 0x73, 0x74, 0x3b,
-0x47, 0x77, 0x65, 0x6e, 0x67, 0x6f, 0x6c, 0x6f, 0x3b, 0x48, 0x65, 0x72, 0x65, 0x3b, 0x44, 0x75, 0x3b, 0x4b, 0x65, 0x72,
-0x7a, 0x75, 0x3b, 0x30, 0x31, 0x3b, 0x30, 0x32, 0x3b, 0x30, 0x33, 0x3b, 0x30, 0x34, 0x3b, 0x30, 0x35, 0x3b, 0x30, 0x36,
-0x3b, 0x30, 0x37, 0x3b, 0x30, 0x38, 0x3b, 0x30, 0x39, 0x3b, 0x31, 0x30, 0x3b, 0x31, 0x31, 0x3b, 0x31, 0x32, 0x3b, 0x44f,
-0x43d, 0x443, 0x3b, 0x444, 0x435, 0x432, 0x3b, 0x43c, 0x430, 0x440, 0x442, 0x3b, 0x430, 0x43f, 0x440, 0x3b, 0x43c, 0x430, 0x439, 0x3b,
-0x44e, 0x43d, 0x438, 0x3b, 0x44e, 0x43b, 0x438, 0x3b, 0x430, 0x432, 0x433, 0x3b, 0x441, 0x435, 0x43f, 0x3b, 0x43e, 0x43a, 0x442, 0x3b,
-0x43d, 0x43e, 0x435, 0x3b, 0x434, 0x435, 0x43a, 0x3b, 0x44f, 0x43d, 0x443, 0x430, 0x440, 0x438, 0x3b, 0x444, 0x435, 0x432, 0x440, 0x443,
-0x430, 0x440, 0x438, 0x3b, 0x43c, 0x430, 0x440, 0x442, 0x3b, 0x430, 0x43f, 0x440, 0x438, 0x43b, 0x3b, 0x43c, 0x430, 0x439, 0x3b, 0x44e,
-0x43d, 0x438, 0x3b, 0x44e, 0x43b, 0x438, 0x3b, 0x430, 0x432, 0x433, 0x443, 0x441, 0x442, 0x3b, 0x441, 0x435, 0x43f, 0x442, 0x435, 0x43c,
-0x432, 0x440, 0x438, 0x3b, 0x43e, 0x43a, 0x442, 0x43e, 0x43c, 0x432, 0x440, 0x438, 0x3b, 0x43d, 0x43e, 0x435, 0x43c, 0x432, 0x440, 0x438,
-0x3b, 0x434, 0x435, 0x43a, 0x435, 0x43c, 0x432, 0x440, 0x438, 0x3b, 0x44f, 0x3b, 0x444, 0x3b, 0x43c, 0x3b, 0x430, 0x3b, 0x43c, 0x3b,
-0x44e, 0x3b, 0x44e, 0x3b, 0x430, 0x3b, 0x441, 0x3b, 0x43e, 0x3b, 0x43d, 0x3b, 0x434, 0x3b, 0x1007, 0x1014, 0x103a, 0x3b, 0x1016, 0x1031,
-0x3b, 0x1019, 0x1010, 0x103a, 0x3b, 0x1027, 0x3b, 0x1019, 0x1031, 0x3b, 0x1007, 0x103d, 0x1014, 0x103a, 0x3b, 0x1007, 0x1030, 0x3b, 0x1029, 0x3b,
-0x1005, 0x1000, 0x103a, 0x3b, 0x1021, 0x1031, 0x102c, 0x1000, 0x103a, 0x3b, 0x1014, 0x102d, 0x102f, 0x3b, 0x1012, 0x102e, 0x3b, 0x1007, 0x1014, 0x103a,
-0x1014, 0x101d, 0x102b, 0x101b, 0x102e, 0x3b, 0x1016, 0x1031, 0x1016, 0x1031, 0x102c, 0x103a, 0x101d, 0x102b, 0x101b, 0x102e, 0x3b, 0x1019, 0x1010, 0x103a,
-0x3b, 0x1027, 0x1015, 0x103c, 0x102e, 0x3b, 0x1019, 0x1031, 0x3b, 0x1007, 0x103d, 0x1014, 0x103a, 0x3b, 0x1007, 0x1030, 0x101c, 0x102d, 0x102f, 0x1004,
-0x103a, 0x3b, 0x1029, 0x1002, 0x102f, 0x1010, 0x103a, 0x3b, 0x1005, 0x1000, 0x103a, 0x1010, 0x1004, 0x103a, 0x1018, 0x102c, 0x3b, 0x1021, 0x1031, 0x102c,
-0x1000, 0x103a, 0x1010, 0x102d, 0x102f, 0x1018, 0x102c, 0x3b, 0x1014, 0x102d, 0x102f, 0x101d, 0x1004, 0x103a, 0x1018, 0x102c, 0x3b, 0x1012, 0x102e, 0x1007,
-0x1004, 0x103a, 0x1018, 0x102c, 0x3b, 0x1007, 0x3b, 0x1016, 0x3b, 0x1019, 0x3b, 0x1027, 0x3b, 0x1019, 0x3b, 0x1007, 0x3b, 0x1007, 0x3b, 0x1029,
-0x3b, 0x1005, 0x3b, 0x1021, 0x3b, 0x1014, 0x3b, 0x1012, 0x3b, 0x441, 0x442, 0x443, 0x3b, 0x43b, 0x44e, 0x442, 0x3b, 0x441, 0x430, 0x43a,
-0x3b, 0x43a, 0x440, 0x430, 0x3b, 0x43c, 0x430, 0x439, 0x3b, 0x447, 0x44d, 0x440, 0x3b, 0x43b, 0x456, 0x43f, 0x3b, 0x436, 0x43d, 0x456,
-0x3b, 0x432, 0x435, 0x440, 0x3b, 0x43a, 0x430, 0x441, 0x3b, 0x43b, 0x456, 0x441, 0x3b, 0x441, 0x43d, 0x435, 0x3b, 0x441, 0x442, 0x443,
-0x434, 0x437, 0x435, 0x43d, 0x44c, 0x3b, 0x43b, 0x44e, 0x442, 0x44b, 0x3b, 0x441, 0x430, 0x43a, 0x430, 0x432, 0x456, 0x43a, 0x3b, 0x43a,
-0x440, 0x430, 0x441, 0x430, 0x432, 0x456, 0x43a, 0x3b, 0x43c, 0x430, 0x439, 0x3b, 0x447, 0x44d, 0x440, 0x432, 0x435, 0x43d, 0x44c, 0x3b,
-0x43b, 0x456, 0x43f, 0x435, 0x43d, 0x44c, 0x3b, 0x436, 0x43d, 0x456, 0x432, 0x435, 0x43d, 0x44c, 0x3b, 0x432, 0x435, 0x440, 0x430, 0x441,
-0x435, 0x43d, 0x44c, 0x3b, 0x43a, 0x430, 0x441, 0x442, 0x440, 0x44b, 0x447, 0x43d, 0x456, 0x43a, 0x3b, 0x43b, 0x456, 0x441, 0x442, 0x430,
-0x43f, 0x430, 0x434, 0x3b, 0x441, 0x43d, 0x435, 0x436, 0x430, 0x43d, 0x44c, 0x3b, 0x441, 0x3b, 0x43b, 0x3b, 0x441, 0x3b, 0x43a, 0x3b,
-0x43c, 0x3b, 0x447, 0x3b, 0x43b, 0x3b, 0x436, 0x3b, 0x432, 0x3b, 0x43a, 0x3b, 0x43b, 0x3b, 0x441, 0x3b, 0x441, 0x442, 0x443, 0x3b,
-0x43b, 0x44e, 0x442, 0x3b, 0x441, 0x430, 0x43a, 0x3b, 0x43a, 0x440, 0x430, 0x3b, 0x43c, 0x430, 0x44f, 0x3b, 0x447, 0x44d, 0x440, 0x3b,
-0x43b, 0x456, 0x43f, 0x3b, 0x436, 0x43d, 0x456, 0x3b, 0x432, 0x435, 0x440, 0x3b, 0x43a, 0x430, 0x441, 0x3b, 0x43b, 0x456, 0x441, 0x3b,
-0x441, 0x43d, 0x435, 0x3b, 0x441, 0x442, 0x443, 0x434, 0x437, 0x435, 0x43d, 0x44f, 0x3b, 0x43b, 0x44e, 0x442, 0x430, 0x433, 0x430, 0x3b,
-0x441, 0x430, 0x43a, 0x430, 0x432, 0x456, 0x43a, 0x430, 0x3b, 0x43a, 0x440, 0x430, 0x441, 0x430, 0x432, 0x456, 0x43a, 0x430, 0x3b, 0x43c,
-0x430, 0x44f, 0x3b, 0x447, 0x44d, 0x440, 0x432, 0x435, 0x43d, 0x44f, 0x3b, 0x43b, 0x456, 0x43f, 0x435, 0x43d, 0x44f, 0x3b, 0x436, 0x43d,
-0x456, 0x45e, 0x43d, 0x44f, 0x3b, 0x432, 0x435, 0x440, 0x430, 0x441, 0x43d, 0x44f, 0x3b, 0x43a, 0x430, 0x441, 0x442, 0x440, 0x44b, 0x447,
-0x43d, 0x456, 0x43a, 0x430, 0x3b, 0x43b, 0x456, 0x441, 0x442, 0x430, 0x43f, 0x430, 0x434, 0x430, 0x3b, 0x441, 0x43d, 0x435, 0x436, 0x43d,
-0x44f, 0x3b, 0x1798, 0x1780, 0x179a, 0x17b6, 0x3b, 0x1780, 0x17bb, 0x1798, 0x17d2, 0x1797, 0x17c8, 0x3b, 0x1798, 0x17b8, 0x1793, 0x17b6, 0x3b, 0x1798,
-0x17c1, 0x179f, 0x17b6, 0x3b, 0x17a7, 0x179f, 0x1797, 0x17b6, 0x3b, 0x1798, 0x17b7, 0x1790, 0x17bb, 0x1793, 0x17b6, 0x3b, 0x1780, 0x1780, 0x17d2, 0x1780,
-0x178a, 0x17b6, 0x3b, 0x179f, 0x17b8, 0x17a0, 0x17b6, 0x3b, 0x1780, 0x1789, 0x17d2, 0x1789, 0x17b6, 0x3b, 0x178f, 0x17bb, 0x179b, 0x17b6, 0x3b, 0x179c,
-0x17b7, 0x1785, 0x17d2, 0x1786, 0x17b7, 0x1780, 0x17b6, 0x3b, 0x1792, 0x17d2, 0x1793, 0x17bc, 0x3b, 0x1798, 0x3b, 0x1780, 0x3b, 0x1798, 0x3b, 0x1798,
-0x3b, 0x17a7, 0x3b, 0x1798, 0x3b, 0x1780, 0x3b, 0x179f, 0x3b, 0x1780, 0x3b, 0x178f, 0x3b, 0x179c, 0x3b, 0x1792, 0x3b, 0x67, 0x65, 0x6e,
-0x2e, 0x3b, 0x66, 0x65, 0x62, 0x72, 0x2e, 0x3b, 0x6d, 0x61, 0x72, 0xe7, 0x3b, 0x61, 0x62, 0x72, 0x2e, 0x3b, 0x6d, 0x61,
-0x69, 0x67, 0x3b, 0x6a, 0x75, 0x6e, 0x79, 0x3b, 0x6a, 0x75, 0x6c, 0x2e, 0x3b, 0x61, 0x67, 0x2e, 0x3b, 0x73, 0x65, 0x74,
-0x2e, 0x3b, 0x6f, 0x63, 0x74, 0x2e, 0x3b, 0x6e, 0x6f, 0x76, 0x2e, 0x3b, 0x64, 0x65, 0x73, 0x2e, 0x3b, 0x67, 0x65, 0x6e,
-0x65, 0x72, 0x3b, 0x66, 0x65, 0x62, 0x72, 0x65, 0x72, 0x3b, 0x6d, 0x61, 0x72, 0xe7, 0x3b, 0x61, 0x62, 0x72, 0x69, 0x6c,
-0x3b, 0x6d, 0x61, 0x69, 0x67, 0x3b, 0x6a, 0x75, 0x6e, 0x79, 0x3b, 0x6a, 0x75, 0x6c, 0x69, 0x6f, 0x6c, 0x3b, 0x61, 0x67,
-0x6f, 0x73, 0x74, 0x3b, 0x73, 0x65, 0x74, 0x65, 0x6d, 0x62, 0x72, 0x65, 0x3b, 0x6f, 0x63, 0x74, 0x75, 0x62, 0x72, 0x65,
-0x3b, 0x6e, 0x6f, 0x76, 0x65, 0x6d, 0x62, 0x72, 0x65, 0x3b, 0x64, 0x65, 0x73, 0x65, 0x6d, 0x62, 0x72, 0x65, 0x3b, 0x47,
-0x4e, 0x3b, 0x46, 0x42, 0x3b, 0x4d, 0xc7, 0x3b, 0x41, 0x42, 0x3b, 0x4d, 0x47, 0x3b, 0x4a, 0x4e, 0x3b, 0x4a, 0x4c, 0x3b,
-0x41, 0x47, 0x3b, 0x53, 0x54, 0x3b, 0x4f, 0x43, 0x3b, 0x4e, 0x56, 0x3b, 0x44, 0x53, 0x3b, 0x64, 0x65, 0x20, 0x67, 0x65,
-0x6e, 0x2e, 0x3b, 0x64, 0x65, 0x20, 0x66, 0x65, 0x62, 0x72, 0x2e, 0x3b, 0x64, 0x65, 0x20, 0x6d, 0x61, 0x72, 0xe7, 0x3b,
-0x64, 0x2019, 0x61, 0x62, 0x72, 0x2e, 0x3b, 0x64, 0x65, 0x20, 0x6d, 0x61, 0x69, 0x67, 0x3b, 0x64, 0x65, 0x20, 0x6a, 0x75,
-0x6e, 0x79, 0x3b, 0x64, 0x65, 0x20, 0x6a, 0x75, 0x6c, 0x2e, 0x3b, 0x64, 0x2019, 0x61, 0x67, 0x2e, 0x3b, 0x64, 0x65, 0x20,
-0x73, 0x65, 0x74, 0x2e, 0x3b, 0x64, 0x2019, 0x6f, 0x63, 0x74, 0x2e, 0x3b, 0x64, 0x65, 0x20, 0x6e, 0x6f, 0x76, 0x2e, 0x3b,
-0x64, 0x65, 0x20, 0x64, 0x65, 0x73, 0x2e, 0x3b, 0x64, 0x65, 0x20, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x3b, 0x64, 0x65, 0x20,
-0x66, 0x65, 0x62, 0x72, 0x65, 0x72, 0x3b, 0x64, 0x65, 0x20, 0x6d, 0x61, 0x72, 0xe7, 0x3b, 0x64, 0x2019, 0x61, 0x62, 0x72,
-0x69, 0x6c, 0x3b, 0x64, 0x65, 0x20, 0x6d, 0x61, 0x69, 0x67, 0x3b, 0x64, 0x65, 0x20, 0x6a, 0x75, 0x6e, 0x79, 0x3b, 0x64,
-0x65, 0x20, 0x6a, 0x75, 0x6c, 0x69, 0x6f, 0x6c, 0x3b, 0x64, 0x2019, 0x61, 0x67, 0x6f, 0x73, 0x74, 0x3b, 0x64, 0x65, 0x20,
-0x73, 0x65, 0x74, 0x65, 0x6d, 0x62, 0x72, 0x65, 0x3b, 0x64, 0x2019, 0x6f, 0x63, 0x74, 0x75, 0x62, 0x72, 0x65, 0x3b, 0x64,
-0x65, 0x20, 0x6e, 0x6f, 0x76, 0x65, 0x6d, 0x62, 0x72, 0x65, 0x3b, 0x64, 0x65, 0x20, 0x64, 0x65, 0x73, 0x65, 0x6d, 0x62,
-0x72, 0x65, 0x3b, 0x31, 0x6708, 0x3b, 0x32, 0x6708, 0x3b, 0x33, 0x6708, 0x3b, 0x34, 0x6708, 0x3b, 0x35, 0x6708, 0x3b, 0x36, 0x6708,
-0x3b, 0x37, 0x6708, 0x3b, 0x38, 0x6708, 0x3b, 0x39, 0x6708, 0x3b, 0x31, 0x30, 0x6708, 0x3b, 0x31, 0x31, 0x6708, 0x3b, 0x31, 0x32,
-0x6708, 0x3b, 0x4e00, 0x6708, 0x3b, 0x4e8c, 0x6708, 0x3b, 0x4e09, 0x6708, 0x3b, 0x56db, 0x6708, 0x3b, 0x4e94, 0x6708, 0x3b, 0x516d, 0x6708, 0x3b,
-0x4e03, 0x6708, 0x3b, 0x516b, 0x6708, 0x3b, 0x4e5d, 0x6708, 0x3b, 0x5341, 0x6708, 0x3b, 0x5341, 0x4e00, 0x6708, 0x3b, 0x5341, 0x4e8c, 0x6708, 0x3b,
-0x73, 0x69, 0x6a, 0x3b, 0x76, 0x65, 0x6c, 0x6a, 0x3b, 0x6f, 0x17e, 0x75, 0x3b, 0x74, 0x72, 0x61, 0x3b, 0x73, 0x76, 0x69,
-0x3b, 0x6c, 0x69, 0x70, 0x3b, 0x73, 0x72, 0x70, 0x3b, 0x6b, 0x6f, 0x6c, 0x3b, 0x72, 0x75, 0x6a, 0x3b, 0x6c, 0x69, 0x73,
-0x3b, 0x73, 0x74, 0x75, 0x3b, 0x70, 0x72, 0x6f, 0x3b, 0x73, 0x69, 0x6a, 0x65, 0x10d, 0x61, 0x6e, 0x6a, 0x3b, 0x76, 0x65,
-0x6c, 0x6a, 0x61, 0x10d, 0x61, 0x3b, 0x6f, 0x17e, 0x75, 0x6a, 0x61, 0x6b, 0x3b, 0x74, 0x72, 0x61, 0x76, 0x61, 0x6e, 0x6a,
-0x3b, 0x73, 0x76, 0x69, 0x62, 0x61, 0x6e, 0x6a, 0x3b, 0x6c, 0x69, 0x70, 0x61, 0x6e, 0x6a, 0x3b, 0x73, 0x72, 0x70, 0x61,
-0x6e, 0x6a, 0x3b, 0x6b, 0x6f, 0x6c, 0x6f, 0x76, 0x6f, 0x7a, 0x3b, 0x72, 0x75, 0x6a, 0x61, 0x6e, 0x3b, 0x6c, 0x69, 0x73,
-0x74, 0x6f, 0x70, 0x61, 0x64, 0x3b, 0x73, 0x74, 0x75, 0x64, 0x65, 0x6e, 0x69, 0x3b, 0x70, 0x72, 0x6f, 0x73, 0x69, 0x6e,
-0x61, 0x63, 0x3b, 0x31, 0x2e, 0x3b, 0x32, 0x2e, 0x3b, 0x33, 0x2e, 0x3b, 0x34, 0x2e, 0x3b, 0x35, 0x2e, 0x3b, 0x36, 0x2e,
-0x3b, 0x37, 0x2e, 0x3b, 0x38, 0x2e, 0x3b, 0x39, 0x2e, 0x3b, 0x31, 0x30, 0x2e, 0x3b, 0x31, 0x31, 0x2e, 0x3b, 0x31, 0x32,
-0x2e, 0x3b, 0x73, 0x69, 0x6a, 0x65, 0x10d, 0x6e, 0x6a, 0x61, 0x3b, 0x76, 0x65, 0x6c, 0x6a, 0x61, 0x10d, 0x65, 0x3b, 0x6f,
-0x17e, 0x75, 0x6a, 0x6b, 0x61, 0x3b, 0x74, 0x72, 0x61, 0x76, 0x6e, 0x6a, 0x61, 0x3b, 0x73, 0x76, 0x69, 0x62, 0x6e, 0x6a,
-0x61, 0x3b, 0x6c, 0x69, 0x70, 0x6e, 0x6a, 0x61, 0x3b, 0x73, 0x72, 0x70, 0x6e, 0x6a, 0x61, 0x3b, 0x6b, 0x6f, 0x6c, 0x6f,
-0x76, 0x6f, 0x7a, 0x61, 0x3b, 0x72, 0x75, 0x6a, 0x6e, 0x61, 0x3b, 0x6c, 0x69, 0x73, 0x74, 0x6f, 0x70, 0x61, 0x64, 0x61,
-0x3b, 0x73, 0x74, 0x75, 0x64, 0x65, 0x6e, 0x6f, 0x67, 0x61, 0x3b, 0x70, 0x72, 0x6f, 0x73, 0x69, 0x6e, 0x63, 0x61, 0x3b,
-0x6c, 0x65, 0x64, 0x3b, 0xfa, 0x6e, 0x6f, 0x3b, 0x62, 0x159, 0x65, 0x3b, 0x64, 0x75, 0x62, 0x3b, 0x6b, 0x76, 0x11b, 0x3b,
-0x10d, 0x76, 0x6e, 0x3b, 0x10d, 0x76, 0x63, 0x3b, 0x73, 0x72, 0x70, 0x3b, 0x7a, 0xe1, 0x159, 0x3b, 0x159, 0xed, 0x6a, 0x3b,
-0x6c, 0x69, 0x73, 0x3b, 0x70, 0x72, 0x6f, 0x3b, 0x6c, 0x65, 0x64, 0x65, 0x6e, 0x3b, 0xfa, 0x6e, 0x6f, 0x72, 0x3b, 0x62,
-0x159, 0x65, 0x7a, 0x65, 0x6e, 0x3b, 0x64, 0x75, 0x62, 0x65, 0x6e, 0x3b, 0x6b, 0x76, 0x11b, 0x74, 0x65, 0x6e, 0x3b, 0x10d,
-0x65, 0x72, 0x76, 0x65, 0x6e, 0x3b, 0x10d, 0x65, 0x72, 0x76, 0x65, 0x6e, 0x65, 0x63, 0x3b, 0x73, 0x72, 0x70, 0x65, 0x6e,
-0x3b, 0x7a, 0xe1, 0x159, 0xed, 0x3b, 0x159, 0xed, 0x6a, 0x65, 0x6e, 0x3b, 0x6c, 0x69, 0x73, 0x74, 0x6f, 0x70, 0x61, 0x64,
-0x3b, 0x70, 0x72, 0x6f, 0x73, 0x69, 0x6e, 0x65, 0x63, 0x3b, 0x6c, 0x65, 0x64, 0x6e, 0x61, 0x3b, 0xfa, 0x6e, 0x6f, 0x72,
-0x61, 0x3b, 0x62, 0x159, 0x65, 0x7a, 0x6e, 0x61, 0x3b, 0x64, 0x75, 0x62, 0x6e, 0x61, 0x3b, 0x6b, 0x76, 0x11b, 0x74, 0x6e,
-0x61, 0x3b, 0x10d, 0x65, 0x72, 0x76, 0x6e, 0x61, 0x3b, 0x10d, 0x65, 0x72, 0x76, 0x65, 0x6e, 0x63, 0x65, 0x3b, 0x73, 0x72,
-0x70, 0x6e, 0x61, 0x3b, 0x7a, 0xe1, 0x159, 0xed, 0x3b, 0x159, 0xed, 0x6a, 0x6e, 0x61, 0x3b, 0x6c, 0x69, 0x73, 0x74, 0x6f,
-0x70, 0x61, 0x64, 0x75, 0x3b, 0x70, 0x72, 0x6f, 0x73, 0x69, 0x6e, 0x63, 0x65, 0x3b, 0x6a, 0x61, 0x6e, 0x2e, 0x3b, 0x66,
-0x65, 0x62, 0x2e, 0x3b, 0x6d, 0x61, 0x72, 0x2e, 0x3b, 0x61, 0x70, 0x72, 0x2e, 0x3b, 0x6d, 0x61, 0x6a, 0x3b, 0x6a, 0x75,
-0x6e, 0x2e, 0x3b, 0x6a, 0x75, 0x6c, 0x2e, 0x3b, 0x61, 0x75, 0x67, 0x2e, 0x3b, 0x73, 0x65, 0x70, 0x2e, 0x3b, 0x6f, 0x6b,
-0x74, 0x2e, 0x3b, 0x6e, 0x6f, 0x76, 0x2e, 0x3b, 0x64, 0x65, 0x63, 0x2e, 0x3b, 0x6a, 0x61, 0x6e, 0x75, 0x61, 0x72, 0x3b,
-0x66, 0x65, 0x62, 0x72, 0x75, 0x61, 0x72, 0x3b, 0x6d, 0x61, 0x72, 0x74, 0x73, 0x3b, 0x61, 0x70, 0x72, 0x69, 0x6c, 0x3b,
-0x6d, 0x61, 0x6a, 0x3b, 0x6a, 0x75, 0x6e, 0x69, 0x3b, 0x6a, 0x75, 0x6c, 0x69, 0x3b, 0x61, 0x75, 0x67, 0x75, 0x73, 0x74,
-0x3b, 0x73, 0x65, 0x70, 0x74, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x3b, 0x6f, 0x6b, 0x74, 0x6f, 0x62, 0x65, 0x72, 0x3b, 0x6e,
-0x6f, 0x76, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x3b, 0x64, 0x65, 0x63, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x3b, 0x6a, 0x61, 0x6e,
-0x2e, 0x3b, 0x66, 0x65, 0x62, 0x2e, 0x3b, 0x6d, 0x72, 0x74, 0x2e, 0x3b, 0x61, 0x70, 0x72, 0x2e, 0x3b, 0x6d, 0x65, 0x69,
-0x3b, 0x6a, 0x75, 0x6e, 0x2e, 0x3b, 0x6a, 0x75, 0x6c, 0x2e, 0x3b, 0x61, 0x75, 0x67, 0x2e, 0x3b, 0x73, 0x65, 0x70, 0x2e,
-0x3b, 0x6f, 0x6b, 0x74, 0x2e, 0x3b, 0x6e, 0x6f, 0x76, 0x2e, 0x3b, 0x64, 0x65, 0x63, 0x2e, 0x3b, 0x6a, 0x61, 0x6e, 0x75,
-0x61, 0x72, 0x69, 0x3b, 0x66, 0x65, 0x62, 0x72, 0x75, 0x61, 0x72, 0x69, 0x3b, 0x6d, 0x61, 0x61, 0x72, 0x74, 0x3b, 0x61,
-0x70, 0x72, 0x69, 0x6c, 0x3b, 0x6d, 0x65, 0x69, 0x3b, 0x6a, 0x75, 0x6e, 0x69, 0x3b, 0x6a, 0x75, 0x6c, 0x69, 0x3b, 0x61,
-0x75, 0x67, 0x75, 0x73, 0x74, 0x75, 0x73, 0x3b, 0x73, 0x65, 0x70, 0x74, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x3b, 0x6f, 0x6b,
-0x74, 0x6f, 0x62, 0x65, 0x72, 0x3b, 0x6e, 0x6f, 0x76, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x3b, 0x64, 0x65, 0x63, 0x65, 0x6d,
-0x62, 0x65, 0x72, 0x3b, 0x4a, 0x61, 0x6e, 0x2e, 0x3b, 0x46, 0x65, 0x62, 0x2e, 0x3b, 0x4d, 0x61, 0x72, 0x2e, 0x3b, 0x41,
-0x70, 0x72, 0x2e, 0x3b, 0x4d, 0x61, 0x79, 0x3b, 0x4a, 0x75, 0x6e, 0x2e, 0x3b, 0x4a, 0x75, 0x6c, 0x2e, 0x3b, 0x41, 0x75,
-0x67, 0x2e, 0x3b, 0x53, 0x65, 0x70, 0x2e, 0x3b, 0x4f, 0x63, 0x74, 0x2e, 0x3b, 0x4e, 0x6f, 0x76, 0x2e, 0x3b, 0x44, 0x65,
-0x63, 0x2e, 0x3b, 0x6a, 0x61, 0x6e, 0x3b, 0x66, 0x65, 0x62, 0x3b, 0x6d, 0x61, 0x72, 0x3b, 0x61, 0x70, 0x72, 0x3b, 0x6d,
-0x61, 0x6a, 0x3b, 0x6a, 0x75, 0x6e, 0x3b, 0x6a, 0x75, 0x6c, 0x3b, 0x61, 0x16d, 0x67, 0x3b, 0x73, 0x65, 0x70, 0x3b, 0x6f,
-0x6b, 0x74, 0x3b, 0x6e, 0x6f, 0x76, 0x3b, 0x64, 0x65, 0x63, 0x3b, 0x6a, 0x61, 0x6e, 0x75, 0x61, 0x72, 0x6f, 0x3b, 0x66,
-0x65, 0x62, 0x72, 0x75, 0x61, 0x72, 0x6f, 0x3b, 0x6d, 0x61, 0x72, 0x74, 0x6f, 0x3b, 0x61, 0x70, 0x72, 0x69, 0x6c, 0x6f,
-0x3b, 0x6d, 0x61, 0x6a, 0x6f, 0x3b, 0x6a, 0x75, 0x6e, 0x69, 0x6f, 0x3b, 0x6a, 0x75, 0x6c, 0x69, 0x6f, 0x3b, 0x61, 0x16d,
-0x67, 0x75, 0x73, 0x74, 0x6f, 0x3b, 0x73, 0x65, 0x70, 0x74, 0x65, 0x6d, 0x62, 0x72, 0x6f, 0x3b, 0x6f, 0x6b, 0x74, 0x6f,
-0x62, 0x72, 0x6f, 0x3b, 0x6e, 0x6f, 0x76, 0x65, 0x6d, 0x62, 0x72, 0x6f, 0x3b, 0x64, 0x65, 0x63, 0x65, 0x6d, 0x62, 0x72,
-0x6f, 0x3b, 0x6a, 0x61, 0x61, 0x6e, 0x3b, 0x76, 0x65, 0x65, 0x62, 0x72, 0x3b, 0x6d, 0xe4, 0x72, 0x74, 0x73, 0x3b, 0x61,
-0x70, 0x72, 0x3b, 0x6d, 0x61, 0x69, 0x3b, 0x6a, 0x75, 0x75, 0x6e, 0x69, 0x3b, 0x6a, 0x75, 0x75, 0x6c, 0x69, 0x3b, 0x61,
-0x75, 0x67, 0x3b, 0x73, 0x65, 0x70, 0x74, 0x3b, 0x6f, 0x6b, 0x74, 0x3b, 0x6e, 0x6f, 0x76, 0x3b, 0x64, 0x65, 0x74, 0x73,
-0x3b, 0x6a, 0x61, 0x61, 0x6e, 0x75, 0x61, 0x72, 0x3b, 0x76, 0x65, 0x65, 0x62, 0x72, 0x75, 0x61, 0x72, 0x3b, 0x6d, 0xe4,
-0x72, 0x74, 0x73, 0x3b, 0x61, 0x70, 0x72, 0x69, 0x6c, 0x6c, 0x3b, 0x6d, 0x61, 0x69, 0x3b, 0x6a, 0x75, 0x75, 0x6e, 0x69,
-0x3b, 0x6a, 0x75, 0x75, 0x6c, 0x69, 0x3b, 0x61, 0x75, 0x67, 0x75, 0x73, 0x74, 0x3b, 0x73, 0x65, 0x70, 0x74, 0x65, 0x6d,
-0x62, 0x65, 0x72, 0x3b, 0x6f, 0x6b, 0x74, 0x6f, 0x6f, 0x62, 0x65, 0x72, 0x3b, 0x6e, 0x6f, 0x76, 0x65, 0x6d, 0x62, 0x65,
-0x72, 0x3b, 0x64, 0x65, 0x74, 0x73, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x3b, 0x4a, 0x3b, 0x56, 0x3b, 0x4d, 0x3b, 0x41, 0x3b,
-0x4d, 0x3b, 0x4a, 0x3b, 0x4a, 0x3b, 0x41, 0x3b, 0x53, 0x3b, 0x4f, 0x3b, 0x4e, 0x3b, 0x44, 0x3b, 0x6a, 0x61, 0x6e, 0x3b,
-0x66, 0x65, 0x62, 0x3b, 0x6d, 0x61, 0x72, 0x3b, 0x61, 0x70, 0x72, 0x3b, 0x6d, 0x61, 0x69, 0x3b, 0x6a, 0x75, 0x6e, 0x3b,
-0x6a, 0x75, 0x6c, 0x3b, 0x61, 0x75, 0x67, 0x3b, 0x73, 0x65, 0x70, 0x3b, 0x6f, 0x6b, 0x74, 0x3b, 0x6e, 0x6f, 0x76, 0x3b,
-0x64, 0x65, 0x73, 0x3b, 0x6a, 0x61, 0x6e, 0x75, 0x61, 0x72, 0x3b, 0x66, 0x65, 0x62, 0x72, 0x75, 0x61, 0x72, 0x3b, 0x6d,
-0x61, 0x72, 0x73, 0x3b, 0x61, 0x70, 0x72, 0xed, 0x6c, 0x3b, 0x6d, 0x61, 0x69, 0x3b, 0x6a, 0x75, 0x6e, 0x69, 0x3b, 0x6a,
-0x75, 0x6c, 0x69, 0x3b, 0x61, 0x75, 0x67, 0x75, 0x73, 0x74, 0x3b, 0x73, 0x65, 0x70, 0x74, 0x65, 0x6d, 0x62, 0x65, 0x72,
-0x3b, 0x6f, 0x6b, 0x74, 0x6f, 0x62, 0x65, 0x72, 0x3b, 0x6e, 0x6f, 0x76, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x3b, 0x64, 0x65,
-0x73, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x3b, 0x6a, 0x61, 0x6e, 0x2e, 0x3b, 0x66, 0x65, 0x62, 0x2e, 0x3b, 0x6d, 0x61, 0x72,
-0x2e, 0x3b, 0x61, 0x70, 0x72, 0x2e, 0x3b, 0x6d, 0x61, 0x69, 0x3b, 0x6a, 0x75, 0x6e, 0x2e, 0x3b, 0x6a, 0x75, 0x6c, 0x2e,
-0x3b, 0x61, 0x75, 0x67, 0x2e, 0x3b, 0x73, 0x65, 0x70, 0x2e, 0x3b, 0x6f, 0x6b, 0x74, 0x2e, 0x3b, 0x6e, 0x6f, 0x76, 0x2e,
-0x3b, 0x64, 0x65, 0x73, 0x2e, 0x3b, 0x74, 0x61, 0x6d, 0x6d, 0x69, 0x3b, 0x68, 0x65, 0x6c, 0x6d, 0x69, 0x3b, 0x6d, 0x61,
-0x61, 0x6c, 0x69, 0x73, 0x3b, 0x68, 0x75, 0x68, 0x74, 0x69, 0x3b, 0x74, 0x6f, 0x75, 0x6b, 0x6f, 0x3b, 0x6b, 0x65, 0x73,
-0xe4, 0x3b, 0x68, 0x65, 0x69, 0x6e, 0xe4, 0x3b, 0x65, 0x6c, 0x6f, 0x3b, 0x73, 0x79, 0x79, 0x73, 0x3b, 0x6c, 0x6f, 0x6b,
-0x61, 0x3b, 0x6d, 0x61, 0x72, 0x72, 0x61, 0x73, 0x3b, 0x6a, 0x6f, 0x75, 0x6c, 0x75, 0x3b, 0x74, 0x61, 0x6d, 0x6d, 0x69,
-0x6b, 0x75, 0x75, 0x3b, 0x68, 0x65, 0x6c, 0x6d, 0x69, 0x6b, 0x75, 0x75, 0x3b, 0x6d, 0x61, 0x61, 0x6c, 0x69, 0x73, 0x6b,
-0x75, 0x75, 0x3b, 0x68, 0x75, 0x68, 0x74, 0x69, 0x6b, 0x75, 0x75, 0x3b, 0x74, 0x6f, 0x75, 0x6b, 0x6f, 0x6b, 0x75, 0x75,
-0x3b, 0x6b, 0x65, 0x73, 0xe4, 0x6b, 0x75, 0x75, 0x3b, 0x68, 0x65, 0x69, 0x6e, 0xe4, 0x6b, 0x75, 0x75, 0x3b, 0x65, 0x6c,
-0x6f, 0x6b, 0x75, 0x75, 0x3b, 0x73, 0x79, 0x79, 0x73, 0x6b, 0x75, 0x75, 0x3b, 0x6c, 0x6f, 0x6b, 0x61, 0x6b, 0x75, 0x75,
-0x3b, 0x6d, 0x61, 0x72, 0x72, 0x61, 0x73, 0x6b, 0x75, 0x75, 0x3b, 0x6a, 0x6f, 0x75, 0x6c, 0x75, 0x6b, 0x75, 0x75, 0x3b,
-0x54, 0x3b, 0x48, 0x3b, 0x4d, 0x3b, 0x48, 0x3b, 0x54, 0x3b, 0x4b, 0x3b, 0x48, 0x3b, 0x45, 0x3b, 0x53, 0x3b, 0x4c, 0x3b,
-0x4d, 0x3b, 0x4a, 0x3b, 0x74, 0x61, 0x6d, 0x6d, 0x69, 0x6b, 0x2e, 0x3b, 0x68, 0x65, 0x6c, 0x6d, 0x69, 0x6b, 0x2e, 0x3b,
-0x6d, 0x61, 0x61, 0x6c, 0x69, 0x73, 0x6b, 0x2e, 0x3b, 0x68, 0x75, 0x68, 0x74, 0x69, 0x6b, 0x2e, 0x3b, 0x74, 0x6f, 0x75,
-0x6b, 0x6f, 0x6b, 0x2e, 0x3b, 0x6b, 0x65, 0x73, 0xe4, 0x6b, 0x2e, 0x3b, 0x68, 0x65, 0x69, 0x6e, 0xe4, 0x6b, 0x2e, 0x3b,
-0x65, 0x6c, 0x6f, 0x6b, 0x2e, 0x3b, 0x73, 0x79, 0x79, 0x73, 0x6b, 0x2e, 0x3b, 0x6c, 0x6f, 0x6b, 0x61, 0x6b, 0x2e, 0x3b,
-0x6d, 0x61, 0x72, 0x72, 0x61, 0x73, 0x6b, 0x2e, 0x3b, 0x6a, 0x6f, 0x75, 0x6c, 0x75, 0x6b, 0x2e, 0x3b, 0x74, 0x61, 0x6d,
-0x6d, 0x69, 0x6b, 0x75, 0x75, 0x74, 0x61, 0x3b, 0x68, 0x65, 0x6c, 0x6d, 0x69, 0x6b, 0x75, 0x75, 0x74, 0x61, 0x3b, 0x6d,
-0x61, 0x61, 0x6c, 0x69, 0x73, 0x6b, 0x75, 0x75, 0x74, 0x61, 0x3b, 0x68, 0x75, 0x68, 0x74, 0x69, 0x6b, 0x75, 0x75, 0x74,
-0x61, 0x3b, 0x74, 0x6f, 0x75, 0x6b, 0x6f, 0x6b, 0x75, 0x75, 0x74, 0x61, 0x3b, 0x6b, 0x65, 0x73, 0xe4, 0x6b, 0x75, 0x75,
-0x74, 0x61, 0x3b, 0x68, 0x65, 0x69, 0x6e, 0xe4, 0x6b, 0x75, 0x75, 0x74, 0x61, 0x3b, 0x65, 0x6c, 0x6f, 0x6b, 0x75, 0x75,
-0x74, 0x61, 0x3b, 0x73, 0x79, 0x79, 0x73, 0x6b, 0x75, 0x75, 0x74, 0x61, 0x3b, 0x6c, 0x6f, 0x6b, 0x61, 0x6b, 0x75, 0x75,
-0x74, 0x61, 0x3b, 0x6d, 0x61, 0x72, 0x72, 0x61, 0x73, 0x6b, 0x75, 0x75, 0x74, 0x61, 0x3b, 0x6a, 0x6f, 0x75, 0x6c, 0x75,
-0x6b, 0x75, 0x75, 0x74, 0x61, 0x3b, 0x6a, 0x61, 0x6e, 0x76, 0x2e, 0x3b, 0x66, 0xe9, 0x76, 0x72, 0x2e, 0x3b, 0x6d, 0x61,
-0x72, 0x73, 0x3b, 0x61, 0x76, 0x72, 0x2e, 0x3b, 0x6d, 0x61, 0x69, 0x3b, 0x6a, 0x75, 0x69, 0x6e, 0x3b, 0x6a, 0x75, 0x69,
-0x6c, 0x2e, 0x3b, 0x61, 0x6f, 0xfb, 0x74, 0x3b, 0x73, 0x65, 0x70, 0x74, 0x2e, 0x3b, 0x6f, 0x63, 0x74, 0x2e, 0x3b, 0x6e,
-0x6f, 0x76, 0x2e, 0x3b, 0x64, 0xe9, 0x63, 0x2e, 0x3b, 0x6a, 0x61, 0x6e, 0x76, 0x69, 0x65, 0x72, 0x3b, 0x66, 0xe9, 0x76,
-0x72, 0x69, 0x65, 0x72, 0x3b, 0x6d, 0x61, 0x72, 0x73, 0x3b, 0x61, 0x76, 0x72, 0x69, 0x6c, 0x3b, 0x6d, 0x61, 0x69, 0x3b,
-0x6a, 0x75, 0x69, 0x6e, 0x3b, 0x6a, 0x75, 0x69, 0x6c, 0x6c, 0x65, 0x74, 0x3b, 0x61, 0x6f, 0xfb, 0x74, 0x3b, 0x73, 0x65,
-0x70, 0x74, 0x65, 0x6d, 0x62, 0x72, 0x65, 0x3b, 0x6f, 0x63, 0x74, 0x6f, 0x62, 0x72, 0x65, 0x3b, 0x6e, 0x6f, 0x76, 0x65,
-0x6d, 0x62, 0x72, 0x65, 0x3b, 0x64, 0xe9, 0x63, 0x65, 0x6d, 0x62, 0x72, 0x65, 0x3b, 0x6a, 0x61, 0x6e, 0x76, 0x2e, 0x3b,
-0x66, 0xe9, 0x76, 0x72, 0x2e, 0x3b, 0x6d, 0x61, 0x72, 0x73, 0x3b, 0x61, 0x76, 0x72, 0x2e, 0x3b, 0x6d, 0x61, 0x69, 0x3b,
-0x6a, 0x75, 0x69, 0x6e, 0x3b, 0x6a, 0x75, 0x69, 0x6c, 0x6c, 0x2e, 0x3b, 0x61, 0x6f, 0xfb, 0x74, 0x3b, 0x73, 0x65, 0x70,
-0x74, 0x2e, 0x3b, 0x6f, 0x63, 0x74, 0x2e, 0x3b, 0x6e, 0x6f, 0x76, 0x2e, 0x3b, 0x64, 0xe9, 0x63, 0x2e, 0x3b, 0x6a, 0x61,
-0x6e, 0x2e, 0x3b, 0x66, 0xe9, 0x76, 0x2e, 0x3b, 0x6d, 0x61, 0x72, 0x2e, 0x3b, 0x61, 0x76, 0x72, 0x2e, 0x3b, 0x6d, 0x61,
-0x69, 0x3b, 0x6a, 0x75, 0x69, 0x2e, 0x3b, 0x6a, 0x75, 0x69, 0x6c, 0x2e, 0x3b, 0x61, 0x6f, 0xfb, 0x74, 0x3b, 0x73, 0x65,
-0x70, 0x74, 0x2e, 0x3b, 0x6f, 0x63, 0x74, 0x2e, 0x3b, 0x6e, 0x6f, 0x76, 0x2e, 0x3b, 0x64, 0xe9, 0x63, 0x2e, 0x3b, 0x4a,
-0x61, 0x6e, 0x3b, 0x46, 0x65, 0x62, 0x3b, 0x4d, 0x72, 0x74, 0x3b, 0x41, 0x70, 0x72, 0x3b, 0x4d, 0x61, 0x69, 0x3b, 0x4a,
-0x75, 0x6e, 0x3b, 0x4a, 0x75, 0x6c, 0x3b, 0x41, 0x75, 0x67, 0x3b, 0x53, 0x65, 0x70, 0x3b, 0x4f, 0x6b, 0x74, 0x3b, 0x4e,
-0x6f, 0x76, 0x3b, 0x44, 0x65, 0x73, 0x3b, 0x4a, 0x61, 0x6e, 0x6e, 0x65, 0x77, 0x61, 0x72, 0x69, 0x73, 0x3b, 0x46, 0x65,
-0x62, 0x72, 0x65, 0x77, 0x61, 0x72, 0x69, 0x73, 0x3b, 0x4d, 0x61, 0x61, 0x72, 0x74, 0x3b, 0x41, 0x70, 0x72, 0x69, 0x6c,
-0x3b, 0x4d, 0x61, 0x61, 0x69, 0x65, 0x3b, 0x4a, 0x75, 0x6e, 0x79, 0x3b, 0x4a, 0x75, 0x6c, 0x79, 0x3b, 0x41, 0x75, 0x67,
-0x75, 0x73, 0x74, 0x75, 0x73, 0x3b, 0x53, 0x65, 0x70, 0x74, 0x69, 0x6d, 0x62, 0x65, 0x72, 0x3b, 0x4f, 0x6b, 0x74, 0x6f,
-0x62, 0x65, 0x72, 0x3b, 0x4e, 0x6f, 0x76, 0x69, 0x6d, 0x62, 0x65, 0x72, 0x3b, 0x44, 0x65, 0x73, 0x69, 0x6d, 0x62, 0x65,
-0x72, 0x3b, 0x46, 0x61, 0x6f, 0x69, 0x3b, 0x47, 0x65, 0x61, 0x72, 0x72, 0x3b, 0x4d, 0xe0, 0x72, 0x74, 0x3b, 0x47, 0x69,
-0x62, 0x6c, 0x3b, 0x43, 0xe8, 0x69, 0x74, 0x3b, 0xd2, 0x67, 0x6d, 0x68, 0x3b, 0x49, 0x75, 0x63, 0x68, 0x3b, 0x4c, 0xf9,
-0x6e, 0x61, 0x3b, 0x53, 0x75, 0x6c, 0x74, 0x3b, 0x44, 0xe0, 0x6d, 0x68, 0x3b, 0x53, 0x61, 0x6d, 0x68, 0x3b, 0x44, 0xf9,
-0x62, 0x68, 0x3b, 0x41, 0x6d, 0x20, 0x46, 0x61, 0x6f, 0x69, 0x6c, 0x6c, 0x65, 0x61, 0x63, 0x68, 0x3b, 0x41, 0x6e, 0x20,
-0x47, 0x65, 0x61, 0x72, 0x72, 0x61, 0x6e, 0x3b, 0x41, 0x6d, 0x20, 0x4d, 0xe0, 0x72, 0x74, 0x3b, 0x41, 0x6e, 0x20, 0x47,
-0x69, 0x62, 0x6c, 0x65, 0x61, 0x6e, 0x3b, 0x41, 0x6e, 0x20, 0x43, 0xe8, 0x69, 0x74, 0x65, 0x61, 0x6e, 0x3b, 0x41, 0x6e,
-0x20, 0x74, 0x2d, 0xd2, 0x67, 0x6d, 0x68, 0x69, 0x6f, 0x73, 0x3b, 0x41, 0x6e, 0x20, 0x74, 0x2d, 0x49, 0x75, 0x63, 0x68,
-0x61, 0x72, 0x3b, 0x41, 0x6e, 0x20, 0x4c, 0xf9, 0x6e, 0x61, 0x73, 0x74, 0x61, 0x6c, 0x3b, 0x41, 0x6e, 0x20, 0x74, 0x2d,
-0x53, 0x75, 0x6c, 0x74, 0x61, 0x69, 0x6e, 0x3b, 0x41, 0x6e, 0x20, 0x44, 0xe0, 0x6d, 0x68, 0x61, 0x69, 0x72, 0x3b, 0x41,
-0x6e, 0x20, 0x74, 0x2d, 0x53, 0x61, 0x6d, 0x68, 0x61, 0x69, 0x6e, 0x3b, 0x41, 0x6e, 0x20, 0x44, 0xf9, 0x62, 0x68, 0x6c,
-0x61, 0x63, 0x68, 0x64, 0x3b, 0x46, 0x3b, 0x47, 0x3b, 0x4d, 0x3b, 0x47, 0x3b, 0x43, 0x3b, 0xd2, 0x3b, 0x49, 0x3b, 0x4c,
-0x3b, 0x53, 0x3b, 0x44, 0x3b, 0x53, 0x3b, 0x44, 0x3b, 0x64, 0x68, 0x65, 0x6e, 0x20, 0x46, 0x68, 0x61, 0x6f, 0x69, 0x6c,
-0x6c, 0x65, 0x61, 0x63, 0x68, 0x3b, 0x64, 0x68, 0x65, 0x6e, 0x20, 0x47, 0x68, 0x65, 0x61, 0x72, 0x72, 0x61, 0x6e, 0x3b,
-0x64, 0x68, 0x65, 0x6e, 0x20, 0x4d, 0x68, 0xe0, 0x72, 0x74, 0x3b, 0x64, 0x68, 0x65, 0x6e, 0x20, 0x47, 0x68, 0x69, 0x62,
-0x6c, 0x65, 0x61, 0x6e, 0x3b, 0x64, 0x68, 0x65, 0x6e, 0x20, 0x43, 0x68, 0xe8, 0x69, 0x74, 0x65, 0x61, 0x6e, 0x3b, 0x64,
-0x68, 0x65, 0x6e, 0x20, 0xd2, 0x67, 0x6d, 0x68, 0x69, 0x6f, 0x73, 0x3b, 0x64, 0x68, 0x65, 0x6e, 0x20, 0x49, 0x75, 0x63,
-0x68, 0x61, 0x72, 0x3b, 0x64, 0x68, 0x65, 0x6e, 0x20, 0x4c, 0xf9, 0x6e, 0x61, 0x73, 0x74, 0x61, 0x6c, 0x3b, 0x64, 0x68,
-0x65, 0x6e, 0x20, 0x74, 0x2d, 0x53, 0x75, 0x6c, 0x74, 0x61, 0x69, 0x6e, 0x3b, 0x64, 0x68, 0x65, 0x6e, 0x20, 0x44, 0xe0,
-0x6d, 0x68, 0x61, 0x69, 0x72, 0x3b, 0x64, 0x68, 0x65, 0x6e, 0x20, 0x74, 0x2d, 0x53, 0x61, 0x6d, 0x68, 0x61, 0x69, 0x6e,
-0x3b, 0x64, 0x68, 0x65, 0x6e, 0x20, 0x44, 0xf9, 0x62, 0x68, 0x6c, 0x61, 0x63, 0x68, 0x64, 0x3b, 0x58, 0x61, 0x6e, 0x2e,
-0x3b, 0x46, 0x65, 0x62, 0x2e, 0x3b, 0x4d, 0x61, 0x72, 0x2e, 0x3b, 0x41, 0x62, 0x72, 0x2e, 0x3b, 0x4d, 0x61, 0x69, 0x6f,
-0x3b, 0x58, 0x75, 0xf1, 0x6f, 0x3b, 0x58, 0x75, 0x6c, 0x2e, 0x3b, 0x41, 0x67, 0x6f, 0x2e, 0x3b, 0x53, 0x65, 0x74, 0x2e,
-0x3b, 0x4f, 0x75, 0x74, 0x2e, 0x3b, 0x4e, 0x6f, 0x76, 0x2e, 0x3b, 0x44, 0x65, 0x63, 0x2e, 0x3b, 0x58, 0x61, 0x6e, 0x65,
-0x69, 0x72, 0x6f, 0x3b, 0x46, 0x65, 0x62, 0x72, 0x65, 0x69, 0x72, 0x6f, 0x3b, 0x4d, 0x61, 0x72, 0x7a, 0x6f, 0x3b, 0x41,
-0x62, 0x72, 0x69, 0x6c, 0x3b, 0x4d, 0x61, 0x69, 0x6f, 0x3b, 0x58, 0x75, 0xf1, 0x6f, 0x3b, 0x58, 0x75, 0x6c, 0x6c, 0x6f,
-0x3b, 0x41, 0x67, 0x6f, 0x73, 0x74, 0x6f, 0x3b, 0x53, 0x65, 0x74, 0x65, 0x6d, 0x62, 0x72, 0x6f, 0x3b, 0x4f, 0x75, 0x74,
-0x75, 0x62, 0x72, 0x6f, 0x3b, 0x4e, 0x6f, 0x76, 0x65, 0x6d, 0x62, 0x72, 0x6f, 0x3b, 0x44, 0x65, 0x63, 0x65, 0x6d, 0x62,
-0x72, 0x6f, 0x3b, 0x58, 0x3b, 0x46, 0x3b, 0x4d, 0x3b, 0x41, 0x3b, 0x4d, 0x3b, 0x58, 0x3b, 0x58, 0x3b, 0x41, 0x3b, 0x53,
-0x3b, 0x4f, 0x3b, 0x4e, 0x3b, 0x44, 0x3b, 0x78, 0x61, 0x6e, 0x2e, 0x3b, 0x66, 0x65, 0x62, 0x2e, 0x3b, 0x6d, 0x61, 0x72,
-0x2e, 0x3b, 0x61, 0x62, 0x72, 0x2e, 0x3b, 0x6d, 0x61, 0x69, 0x6f, 0x3b, 0x78, 0x75, 0xf1, 0x6f, 0x3b, 0x78, 0x75, 0x6c,
-0x2e, 0x3b, 0x61, 0x67, 0x6f, 0x2e, 0x3b, 0x73, 0x65, 0x74, 0x2e, 0x3b, 0x6f, 0x75, 0x74, 0x2e, 0x3b, 0x6e, 0x6f, 0x76,
-0x2e, 0x3b, 0x64, 0x65, 0x63, 0x2e, 0x3b, 0x78, 0x61, 0x6e, 0x65, 0x69, 0x72, 0x6f, 0x3b, 0x66, 0x65, 0x62, 0x72, 0x65,
-0x69, 0x72, 0x6f, 0x3b, 0x6d, 0x61, 0x72, 0x7a, 0x6f, 0x3b, 0x61, 0x62, 0x72, 0x69, 0x6c, 0x3b, 0x6d, 0x61, 0x69, 0x6f,
-0x3b, 0x78, 0x75, 0xf1, 0x6f, 0x3b, 0x78, 0x75, 0x6c, 0x6c, 0x6f, 0x3b, 0x61, 0x67, 0x6f, 0x73, 0x74, 0x6f, 0x3b, 0x73,
-0x65, 0x74, 0x65, 0x6d, 0x62, 0x72, 0x6f, 0x3b, 0x6f, 0x75, 0x74, 0x75, 0x62, 0x72, 0x6f, 0x3b, 0x6e, 0x6f, 0x76, 0x65,
-0x6d, 0x62, 0x72, 0x6f, 0x3b, 0x64, 0x65, 0x63, 0x65, 0x6d, 0x62, 0x72, 0x6f, 0x3b, 0x78, 0x2e, 0x3b, 0x66, 0x2e, 0x3b,
-0x6d, 0x2e, 0x3b, 0x61, 0x2e, 0x3b, 0x6d, 0x2e, 0x3b, 0x78, 0x2e, 0x3b, 0x78, 0x2e, 0x3b, 0x61, 0x2e, 0x3b, 0x73, 0x2e,
-0x3b, 0x6f, 0x2e, 0x3b, 0x6e, 0x2e, 0x3b, 0x64, 0x2e, 0x3b, 0x10d8, 0x10d0, 0x10dc, 0x3b, 0x10d7, 0x10d4, 0x10d1, 0x3b, 0x10db, 0x10d0,
-0x10e0, 0x3b, 0x10d0, 0x10de, 0x10e0, 0x3b, 0x10db, 0x10d0, 0x10d8, 0x3b, 0x10d8, 0x10d5, 0x10dc, 0x3b, 0x10d8, 0x10d5, 0x10da, 0x3b, 0x10d0, 0x10d2,
-0x10d5, 0x3b, 0x10e1, 0x10d4, 0x10e5, 0x3b, 0x10dd, 0x10e5, 0x10e2, 0x3b, 0x10dc, 0x10dd, 0x10d4, 0x3b, 0x10d3, 0x10d4, 0x10d9, 0x3b, 0x10d8, 0x10d0,
-0x10dc, 0x10d5, 0x10d0, 0x10e0, 0x10d8, 0x3b, 0x10d7, 0x10d4, 0x10d1, 0x10d4, 0x10e0, 0x10d5, 0x10d0, 0x10da, 0x10d8, 0x3b, 0x10db, 0x10d0, 0x10e0, 0x10e2,
-0x10d8, 0x3b, 0x10d0, 0x10de, 0x10e0, 0x10d8, 0x10da, 0x10d8, 0x3b, 0x10db, 0x10d0, 0x10d8, 0x10e1, 0x10d8, 0x3b, 0x10d8, 0x10d5, 0x10dc, 0x10d8, 0x10e1,
-0x10d8, 0x3b, 0x10d8, 0x10d5, 0x10da, 0x10d8, 0x10e1, 0x10d8, 0x3b, 0x10d0, 0x10d2, 0x10d5, 0x10d8, 0x10e1, 0x10e2, 0x10dd, 0x3b, 0x10e1, 0x10d4, 0x10e5,
-0x10e2, 0x10d4, 0x10db, 0x10d1, 0x10d4, 0x10e0, 0x10d8, 0x3b, 0x10dd, 0x10e5, 0x10e2, 0x10dd, 0x10db, 0x10d1, 0x10d4, 0x10e0, 0x10d8, 0x3b, 0x10dc, 0x10dd,
-0x10d4, 0x10db, 0x10d1, 0x10d4, 0x10e0, 0x10d8, 0x3b, 0x10d3, 0x10d4, 0x10d9, 0x10d4, 0x10db, 0x10d1, 0x10d4, 0x10e0, 0x10d8, 0x3b, 0x10d8, 0x3b, 0x10d7,
-0x3b, 0x10db, 0x3b, 0x10d0, 0x3b, 0x10db, 0x3b, 0x10d8, 0x3b, 0x10d8, 0x3b, 0x10d0, 0x3b, 0x10e1, 0x3b, 0x10dd, 0x3b, 0x10dc, 0x3b, 0x10d3,
-0x3b, 0x4a, 0x61, 0x6e, 0x3b, 0x46, 0x65, 0x62, 0x3b, 0x4d, 0xe4, 0x72, 0x3b, 0x41, 0x70, 0x72, 0x3b, 0x4d, 0x61, 0x69,
-0x3b, 0x4a, 0x75, 0x6e, 0x3b, 0x4a, 0x75, 0x6c, 0x3b, 0x41, 0x75, 0x67, 0x3b, 0x53, 0x65, 0x70, 0x3b, 0x4f, 0x6b, 0x74,
-0x3b, 0x4e, 0x6f, 0x76, 0x3b, 0x44, 0x65, 0x7a, 0x3b, 0x4a, 0x61, 0x6e, 0x75, 0x61, 0x72, 0x3b, 0x46, 0x65, 0x62, 0x72,
-0x75, 0x61, 0x72, 0x3b, 0x4d, 0xe4, 0x72, 0x7a, 0x3b, 0x41, 0x70, 0x72, 0x69, 0x6c, 0x3b, 0x4d, 0x61, 0x69, 0x3b, 0x4a,
-0x75, 0x6e, 0x69, 0x3b, 0x4a, 0x75, 0x6c, 0x69, 0x3b, 0x41, 0x75, 0x67, 0x75, 0x73, 0x74, 0x3b, 0x53, 0x65, 0x70, 0x74,
-0x65, 0x6d, 0x62, 0x65, 0x72, 0x3b, 0x4f, 0x6b, 0x74, 0x6f, 0x62, 0x65, 0x72, 0x3b, 0x4e, 0x6f, 0x76, 0x65, 0x6d, 0x62,
-0x65, 0x72, 0x3b, 0x44, 0x65, 0x7a, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x3b, 0x4a, 0x61, 0x6e, 0x2e, 0x3b, 0x46, 0x65, 0x62,
-0x2e, 0x3b, 0x4d, 0xe4, 0x72, 0x7a, 0x3b, 0x41, 0x70, 0x72, 0x2e, 0x3b, 0x4d, 0x61, 0x69, 0x3b, 0x4a, 0x75, 0x6e, 0x69,
-0x3b, 0x4a, 0x75, 0x6c, 0x69, 0x3b, 0x41, 0x75, 0x67, 0x2e, 0x3b, 0x53, 0x65, 0x70, 0x74, 0x2e, 0x3b, 0x4f, 0x6b, 0x74,
-0x2e, 0x3b, 0x4e, 0x6f, 0x76, 0x2e, 0x3b, 0x44, 0x65, 0x7a, 0x2e, 0x3b, 0x4a, 0xe4, 0x6e, 0x3b, 0x46, 0x65, 0x62, 0x3b,
-0x4d, 0xe4, 0x72, 0x3b, 0x41, 0x70, 0x72, 0x3b, 0x4d, 0x61, 0x69, 0x3b, 0x4a, 0x75, 0x6e, 0x3b, 0x4a, 0x75, 0x6c, 0x3b,
-0x41, 0x75, 0x67, 0x3b, 0x53, 0x65, 0x70, 0x3b, 0x4f, 0x6b, 0x74, 0x3b, 0x4e, 0x6f, 0x76, 0x3b, 0x44, 0x65, 0x7a, 0x3b,
-0x4a, 0xe4, 0x6e, 0x6e, 0x65, 0x72, 0x3b, 0x46, 0x65, 0x62, 0x72, 0x75, 0x61, 0x72, 0x3b, 0x4d, 0xe4, 0x72, 0x7a, 0x3b,
-0x41, 0x70, 0x72, 0x69, 0x6c, 0x3b, 0x4d, 0x61, 0x69, 0x3b, 0x4a, 0x75, 0x6e, 0x69, 0x3b, 0x4a, 0x75, 0x6c, 0x69, 0x3b,
-0x41, 0x75, 0x67, 0x75, 0x73, 0x74, 0x3b, 0x53, 0x65, 0x70, 0x74, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x3b, 0x4f, 0x6b, 0x74,
-0x6f, 0x62, 0x65, 0x72, 0x3b, 0x4e, 0x6f, 0x76, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x3b, 0x44, 0x65, 0x7a, 0x65, 0x6d, 0x62,
-0x65, 0x72, 0x3b, 0x4a, 0xe4, 0x6e, 0x2e, 0x3b, 0x46, 0x65, 0x62, 0x2e, 0x3b, 0x4d, 0xe4, 0x72, 0x7a, 0x3b, 0x41, 0x70,
-0x72, 0x2e, 0x3b, 0x4d, 0x61, 0x69, 0x3b, 0x4a, 0x75, 0x6e, 0x69, 0x3b, 0x4a, 0x75, 0x6c, 0x69, 0x3b, 0x41, 0x75, 0x67,
-0x2e, 0x3b, 0x53, 0x65, 0x70, 0x2e, 0x3b, 0x4f, 0x6b, 0x74, 0x2e, 0x3b, 0x4e, 0x6f, 0x76, 0x2e, 0x3b, 0x44, 0x65, 0x7a,
-0x2e, 0x3b, 0x399, 0x3b1, 0x3bd, 0x3b, 0x3a6, 0x3b5, 0x3b2, 0x3b, 0x39c, 0x3ac, 0x3c1, 0x3b, 0x391, 0x3c0, 0x3c1, 0x3b, 0x39c, 0x3ac,
-0x3b9, 0x3b, 0x399, 0x3bf, 0x3cd, 0x3bd, 0x3b, 0x399, 0x3bf, 0x3cd, 0x3bb, 0x3b, 0x391, 0x3cd, 0x3b3, 0x3b, 0x3a3, 0x3b5, 0x3c0, 0x3b,
-0x39f, 0x3ba, 0x3c4, 0x3b, 0x39d, 0x3bf, 0x3ad, 0x3b, 0x394, 0x3b5, 0x3ba, 0x3b, 0x399, 0x3b1, 0x3bd, 0x3bf, 0x3c5, 0x3ac, 0x3c1, 0x3b9,
-0x3bf, 0x3c2, 0x3b, 0x3a6, 0x3b5, 0x3b2, 0x3c1, 0x3bf, 0x3c5, 0x3ac, 0x3c1, 0x3b9, 0x3bf, 0x3c2, 0x3b, 0x39c, 0x3ac, 0x3c1, 0x3c4, 0x3b9,
-0x3bf, 0x3c2, 0x3b, 0x391, 0x3c0, 0x3c1, 0x3af, 0x3bb, 0x3b9, 0x3bf, 0x3c2, 0x3b, 0x39c, 0x3ac, 0x3b9, 0x3bf, 0x3c2, 0x3b, 0x399, 0x3bf,
-0x3cd, 0x3bd, 0x3b9, 0x3bf, 0x3c2, 0x3b, 0x399, 0x3bf, 0x3cd, 0x3bb, 0x3b9, 0x3bf, 0x3c2, 0x3b, 0x391, 0x3cd, 0x3b3, 0x3bf, 0x3c5, 0x3c3,
-0x3c4, 0x3bf, 0x3c2, 0x3b, 0x3a3, 0x3b5, 0x3c0, 0x3c4, 0x3ad, 0x3bc, 0x3b2, 0x3c1, 0x3b9, 0x3bf, 0x3c2, 0x3b, 0x39f, 0x3ba, 0x3c4, 0x3ce,
-0x3b2, 0x3c1, 0x3b9, 0x3bf, 0x3c2, 0x3b, 0x39d, 0x3bf, 0x3ad, 0x3bc, 0x3b2, 0x3c1, 0x3b9, 0x3bf, 0x3c2, 0x3b, 0x394, 0x3b5, 0x3ba, 0x3ad,
-0x3bc, 0x3b2, 0x3c1, 0x3b9, 0x3bf, 0x3c2, 0x3b, 0x399, 0x3b, 0x3a6, 0x3b, 0x39c, 0x3b, 0x391, 0x3b, 0x39c, 0x3b, 0x399, 0x3b, 0x399,
-0x3b, 0x391, 0x3b, 0x3a3, 0x3b, 0x39f, 0x3b, 0x39d, 0x3b, 0x394, 0x3b, 0x399, 0x3b1, 0x3bd, 0x3b, 0x3a6, 0x3b5, 0x3b2, 0x3b, 0x39c,
-0x3b1, 0x3c1, 0x3b, 0x391, 0x3c0, 0x3c1, 0x3b, 0x39c, 0x3b1, 0x390, 0x3b, 0x399, 0x3bf, 0x3c5, 0x3bd, 0x3b, 0x399, 0x3bf, 0x3c5, 0x3bb,
-0x3b, 0x391, 0x3c5, 0x3b3, 0x3b, 0x3a3, 0x3b5, 0x3c0, 0x3b, 0x39f, 0x3ba, 0x3c4, 0x3b, 0x39d, 0x3bf, 0x3b5, 0x3b, 0x394, 0x3b5, 0x3ba,
-0x3b, 0x399, 0x3b1, 0x3bd, 0x3bf, 0x3c5, 0x3b1, 0x3c1, 0x3af, 0x3bf, 0x3c5, 0x3b, 0x3a6, 0x3b5, 0x3b2, 0x3c1, 0x3bf, 0x3c5, 0x3b1, 0x3c1,
-0x3af, 0x3bf, 0x3c5, 0x3b, 0x39c, 0x3b1, 0x3c1, 0x3c4, 0x3af, 0x3bf, 0x3c5, 0x3b, 0x391, 0x3c0, 0x3c1, 0x3b9, 0x3bb, 0x3af, 0x3bf, 0x3c5,
-0x3b, 0x39c, 0x3b1, 0x390, 0x3bf, 0x3c5, 0x3b, 0x399, 0x3bf, 0x3c5, 0x3bd, 0x3af, 0x3bf, 0x3c5, 0x3b, 0x399, 0x3bf, 0x3c5, 0x3bb, 0x3af,
-0x3bf, 0x3c5, 0x3b, 0x391, 0x3c5, 0x3b3, 0x3bf, 0x3cd, 0x3c3, 0x3c4, 0x3bf, 0x3c5, 0x3b, 0x3a3, 0x3b5, 0x3c0, 0x3c4, 0x3b5, 0x3bc, 0x3b2,
-0x3c1, 0x3af, 0x3bf, 0x3c5, 0x3b, 0x39f, 0x3ba, 0x3c4, 0x3c9, 0x3b2, 0x3c1, 0x3af, 0x3bf, 0x3c5, 0x3b, 0x39d, 0x3bf, 0x3b5, 0x3bc, 0x3b2,
-0x3c1, 0x3af, 0x3bf, 0x3c5, 0x3b, 0x394, 0x3b5, 0x3ba, 0x3b5, 0x3bc, 0x3b2, 0x3c1, 0x3af, 0x3bf, 0x3c5, 0x3b, 0x6a, 0x61, 0x6e, 0x3b,
-0x66, 0x65, 0x62, 0x3b, 0x6d, 0x61, 0x72, 0x3b, 0x61, 0x70, 0x72, 0x3b, 0x6d, 0x61, 0x6a, 0x3b, 0x6a, 0x75, 0x6e, 0x3b,
-0x6a, 0x75, 0x6c, 0x3b, 0x61, 0x75, 0x67, 0x3b, 0x73, 0x65, 0x70, 0x3b, 0x6f, 0x6b, 0x74, 0x3b, 0x6e, 0x6f, 0x76, 0x3b,
-0x64, 0x65, 0x63, 0x3b, 0x6a, 0x61, 0x6e, 0x75, 0x61, 0x72, 0x69, 0x3b, 0x66, 0x65, 0x62, 0x72, 0x75, 0x61, 0x72, 0x69,
-0x3b, 0x6d, 0x61, 0x72, 0x74, 0x73, 0x69, 0x3b, 0x61, 0x70, 0x72, 0x69, 0x6c, 0x69, 0x3b, 0x6d, 0x61, 0x6a, 0x69, 0x3b,
-0x6a, 0x75, 0x6e, 0x69, 0x3b, 0x6a, 0x75, 0x6c, 0x69, 0x3b, 0x61, 0x75, 0x67, 0x75, 0x73, 0x74, 0x75, 0x73, 0x69, 0x3b,
-0x73, 0x65, 0x70, 0x74, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x69, 0x3b, 0x6f, 0x6b, 0x74, 0x6f, 0x62, 0x65, 0x72, 0x69, 0x3b,
-0x6e, 0x6f, 0x76, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x69, 0x3b, 0x64, 0x65, 0x63, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x69, 0x3b,
-0xa9c, 0xabe, 0xaa8, 0xacd, 0xaaf, 0xac1, 0x3b, 0xaab, 0xac7, 0xaac, 0xacd, 0xab0, 0xac1, 0x3b, 0xaae, 0xabe, 0xab0, 0xacd, 0xa9a, 0x3b,
-0xa8f, 0xaaa, 0xacd, 0xab0, 0xabf, 0xab2, 0x3b, 0xaae, 0xac7, 0x3b, 0xa9c, 0xac2, 0xaa8, 0x3b, 0xa9c, 0xac1, 0xab2, 0xabe, 0xa88, 0x3b,
-0xa91, 0xa97, 0xab8, 0xacd, 0xa9f, 0x3b, 0xab8, 0xaaa, 0xacd, 0xa9f, 0xac7, 0x3b, 0xa91, 0xa95, 0xacd, 0xa9f, 0xacb, 0x3b, 0xaa8, 0xab5,
-0xac7, 0x3b, 0xaa1, 0xabf, 0xab8, 0xac7, 0x3b, 0xa9c, 0xabe, 0xaa8, 0xacd, 0xaaf, 0xac1, 0xa86, 0xab0, 0xac0, 0x3b, 0xaab, 0xac7, 0xaac,
-0xacd, 0xab0, 0xac1, 0xa86, 0xab0, 0xac0, 0x3b, 0xaae, 0xabe, 0xab0, 0xacd, 0xa9a, 0x3b, 0xa8f, 0xaaa, 0xacd, 0xab0, 0xabf, 0xab2, 0x3b,
-0xaae, 0xac7, 0x3b, 0xa9c, 0xac2, 0xaa8, 0x3b, 0xa9c, 0xac1, 0xab2, 0xabe, 0xa88, 0x3b, 0xa91, 0xa97, 0xab8, 0xacd, 0xa9f, 0x3b, 0xab8,
-0xaaa, 0xacd, 0xa9f, 0xac7, 0xaae, 0xacd, 0xaac, 0xab0, 0x3b, 0xa91, 0xa95, 0xacd, 0xa9f, 0xacb, 0xaac, 0xab0, 0x3b, 0xaa8, 0xab5, 0xac7,
-0xaae, 0xacd, 0xaac, 0xab0, 0x3b, 0xaa1, 0xabf, 0xab8, 0xac7, 0xaae, 0xacd, 0xaac, 0xab0, 0x3b, 0xa9c, 0xabe, 0x3b, 0xaab, 0xac7, 0x3b,
-0xaae, 0xabe, 0x3b, 0xa8f, 0x3b, 0xaae, 0xac7, 0x3b, 0xa9c, 0xac2, 0x3b, 0xa9c, 0xac1, 0x3b, 0xa91, 0x3b, 0xab8, 0x3b, 0xa91, 0x3b,
-0xaa8, 0x3b, 0xaa1, 0xabf, 0x3b, 0x4a, 0x61, 0x6e, 0x3b, 0x46, 0x61, 0x62, 0x3b, 0x4d, 0x61, 0x72, 0x3b, 0x41, 0x66, 0x69,
-0x3b, 0x4d, 0x61, 0x79, 0x3b, 0x59, 0x75, 0x6e, 0x3b, 0x59, 0x75, 0x6c, 0x3b, 0x41, 0x67, 0x75, 0x3b, 0x53, 0x61, 0x74,
-0x3b, 0x4f, 0x6b, 0x74, 0x3b, 0x4e, 0x75, 0x77, 0x3b, 0x44, 0x69, 0x73, 0x3b, 0x4a, 0x61, 0x6e, 0x61, 0x69, 0x72, 0x75,
-0x3b, 0x46, 0x61, 0x62, 0x75, 0x72, 0x61, 0x69, 0x72, 0x75, 0x3b, 0x4d, 0x61, 0x72, 0x69, 0x73, 0x3b, 0x41, 0x66, 0x69,
-0x72, 0x69, 0x6c, 0x75, 0x3b, 0x4d, 0x61, 0x79, 0x75, 0x3b, 0x59, 0x75, 0x6e, 0x69, 0x3b, 0x59, 0x75, 0x6c, 0x69, 0x3b,
-0x41, 0x67, 0x75, 0x73, 0x74, 0x61, 0x3b, 0x53, 0x61, 0x74, 0x75, 0x6d, 0x62, 0x61, 0x3b, 0x4f, 0x6b, 0x74, 0x6f, 0x62,
-0x61, 0x3b, 0x4e, 0x75, 0x77, 0x61, 0x6d, 0x62, 0x61, 0x3b, 0x44, 0x69, 0x73, 0x61, 0x6d, 0x62, 0x61, 0x3b, 0x4a, 0x3b,
-0x46, 0x3b, 0x4d, 0x3b, 0x41, 0x3b, 0x4d, 0x3b, 0x59, 0x3b, 0x59, 0x3b, 0x41, 0x3b, 0x53, 0x3b, 0x4f, 0x3b, 0x4e, 0x3b,
-0x44, 0x3b, 0x5d9, 0x5e0, 0x5d5, 0x5f3, 0x3b, 0x5e4, 0x5d1, 0x5e8, 0x5f3, 0x3b, 0x5de, 0x5e8, 0x5e5, 0x3b, 0x5d0, 0x5e4, 0x5e8, 0x5f3,
-0x3b, 0x5de, 0x5d0, 0x5d9, 0x3b, 0x5d9, 0x5d5, 0x5e0, 0x5d9, 0x3b, 0x5d9, 0x5d5, 0x5dc, 0x5d9, 0x3b, 0x5d0, 0x5d5, 0x5d2, 0x5f3, 0x3b,
-0x5e1, 0x5e4, 0x5d8, 0x5f3, 0x3b, 0x5d0, 0x5d5, 0x5e7, 0x5f3, 0x3b, 0x5e0, 0x5d5, 0x5d1, 0x5f3, 0x3b, 0x5d3, 0x5e6, 0x5de, 0x5f3, 0x3b,
-0x5d9, 0x5e0, 0x5d5, 0x5d0, 0x5e8, 0x3b, 0x5e4, 0x5d1, 0x5e8, 0x5d5, 0x5d0, 0x5e8, 0x3b, 0x5de, 0x5e8, 0x5e5, 0x3b, 0x5d0, 0x5e4, 0x5e8,
-0x5d9, 0x5dc, 0x3b, 0x5de, 0x5d0, 0x5d9, 0x3b, 0x5d9, 0x5d5, 0x5e0, 0x5d9, 0x3b, 0x5d9, 0x5d5, 0x5dc, 0x5d9, 0x3b, 0x5d0, 0x5d5, 0x5d2,
-0x5d5, 0x5e1, 0x5d8, 0x3b, 0x5e1, 0x5e4, 0x5d8, 0x5de, 0x5d1, 0x5e8, 0x3b, 0x5d0, 0x5d5, 0x5e7, 0x5d8, 0x5d5, 0x5d1, 0x5e8, 0x3b, 0x5e0,
-0x5d5, 0x5d1, 0x5de, 0x5d1, 0x5e8, 0x3b, 0x5d3, 0x5e6, 0x5de, 0x5d1, 0x5e8, 0x3b, 0x91c, 0x928, 0x970, 0x3b, 0x92b, 0x93c, 0x930, 0x970,
-0x3b, 0x92e, 0x93e, 0x930, 0x94d, 0x91a, 0x3b, 0x905, 0x92a, 0x94d, 0x930, 0x948, 0x932, 0x3b, 0x92e, 0x908, 0x3b, 0x91c, 0x942, 0x928,
-0x3b, 0x91c, 0x941, 0x932, 0x970, 0x3b, 0x905, 0x917, 0x970, 0x3b, 0x938, 0x93f, 0x924, 0x970, 0x3b, 0x905, 0x915, 0x94d, 0x924, 0x942,
-0x970, 0x3b, 0x928, 0x935, 0x970, 0x3b, 0x926, 0x93f, 0x938, 0x970, 0x3b, 0x91c, 0x928, 0x935, 0x930, 0x940, 0x3b, 0x92b, 0x93c, 0x930,
-0x935, 0x930, 0x940, 0x3b, 0x92e, 0x93e, 0x930, 0x94d, 0x91a, 0x3b, 0x905, 0x92a, 0x94d, 0x930, 0x948, 0x932, 0x3b, 0x92e, 0x908, 0x3b,
-0x91c, 0x942, 0x928, 0x3b, 0x91c, 0x941, 0x932, 0x93e, 0x908, 0x3b, 0x905, 0x917, 0x938, 0x94d, 0x924, 0x3b, 0x938, 0x93f, 0x924, 0x902,
-0x92c, 0x930, 0x3b, 0x905, 0x915, 0x94d, 0x924, 0x942, 0x92c, 0x930, 0x3b, 0x928, 0x935, 0x902, 0x92c, 0x930, 0x3b, 0x926, 0x93f, 0x938,
-0x902, 0x92c, 0x930, 0x3b, 0x91c, 0x3b, 0x92b, 0x93c, 0x3b, 0x92e, 0x93e, 0x3b, 0x905, 0x3b, 0x92e, 0x3b, 0x91c, 0x942, 0x3b, 0x91c,
-0x941, 0x3b, 0x905, 0x3b, 0x938, 0x93f, 0x3b, 0x905, 0x3b, 0x928, 0x3b, 0x926, 0x93f, 0x3b, 0x6a, 0x61, 0x6e, 0x2e, 0x3b, 0x66,
-0x65, 0x62, 0x72, 0x2e, 0x3b, 0x6d, 0xe1, 0x72, 0x63, 0x2e, 0x3b, 0xe1, 0x70, 0x72, 0x2e, 0x3b, 0x6d, 0xe1, 0x6a, 0x2e,
-0x3b, 0x6a, 0xfa, 0x6e, 0x2e, 0x3b, 0x6a, 0xfa, 0x6c, 0x2e, 0x3b, 0x61, 0x75, 0x67, 0x2e, 0x3b, 0x73, 0x7a, 0x65, 0x70,
-0x74, 0x2e, 0x3b, 0x6f, 0x6b, 0x74, 0x2e, 0x3b, 0x6e, 0x6f, 0x76, 0x2e, 0x3b, 0x64, 0x65, 0x63, 0x2e, 0x3b, 0x6a, 0x61,
-0x6e, 0x75, 0xe1, 0x72, 0x3b, 0x66, 0x65, 0x62, 0x72, 0x75, 0xe1, 0x72, 0x3b, 0x6d, 0xe1, 0x72, 0x63, 0x69, 0x75, 0x73,
-0x3b, 0xe1, 0x70, 0x72, 0x69, 0x6c, 0x69, 0x73, 0x3b, 0x6d, 0xe1, 0x6a, 0x75, 0x73, 0x3b, 0x6a, 0xfa, 0x6e, 0x69, 0x75,
-0x73, 0x3b, 0x6a, 0xfa, 0x6c, 0x69, 0x75, 0x73, 0x3b, 0x61, 0x75, 0x67, 0x75, 0x73, 0x7a, 0x74, 0x75, 0x73, 0x3b, 0x73,
-0x7a, 0x65, 0x70, 0x74, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x3b, 0x6f, 0x6b, 0x74, 0xf3, 0x62, 0x65, 0x72, 0x3b, 0x6e, 0x6f,
-0x76, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x3b, 0x64, 0x65, 0x63, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x3b, 0x4a, 0x3b, 0x46, 0x3b,
-0x4d, 0x3b, 0xc1, 0x3b, 0x4d, 0x3b, 0x4a, 0x3b, 0x4a, 0x3b, 0x41, 0x3b, 0x53, 0x7a, 0x3b, 0x4f, 0x3b, 0x4e, 0x3b, 0x44,
-0x3b, 0x6a, 0x61, 0x6e, 0x2e, 0x3b, 0x66, 0x65, 0x62, 0x2e, 0x3b, 0x6d, 0x61, 0x72, 0x2e, 0x3b, 0x61, 0x70, 0x72, 0x2e,
-0x3b, 0x6d, 0x61, 0xed, 0x3b, 0x6a, 0xfa, 0x6e, 0x2e, 0x3b, 0x6a, 0xfa, 0x6c, 0x2e, 0x3b, 0xe1, 0x67, 0xfa, 0x2e, 0x3b,
-0x73, 0x65, 0x70, 0x2e, 0x3b, 0x6f, 0x6b, 0x74, 0x2e, 0x3b, 0x6e, 0xf3, 0x76, 0x2e, 0x3b, 0x64, 0x65, 0x73, 0x2e, 0x3b,
-0x6a, 0x61, 0x6e, 0xfa, 0x61, 0x72, 0x3b, 0x66, 0x65, 0x62, 0x72, 0xfa, 0x61, 0x72, 0x3b, 0x6d, 0x61, 0x72, 0x73, 0x3b,
-0x61, 0x70, 0x72, 0xed, 0x6c, 0x3b, 0x6d, 0x61, 0xed, 0x3b, 0x6a, 0xfa, 0x6e, 0xed, 0x3b, 0x6a, 0xfa, 0x6c, 0xed, 0x3b,
-0xe1, 0x67, 0xfa, 0x73, 0x74, 0x3b, 0x73, 0x65, 0x70, 0x74, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x3b, 0x6f, 0x6b, 0x74, 0xf3,
-0x62, 0x65, 0x72, 0x3b, 0x6e, 0xf3, 0x76, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x3b, 0x64, 0x65, 0x73, 0x65, 0x6d, 0x62, 0x65,
-0x72, 0x3b, 0x4a, 0x3b, 0x46, 0x3b, 0x4d, 0x3b, 0x41, 0x3b, 0x4d, 0x3b, 0x4a, 0x3b, 0x4a, 0x3b, 0xc1, 0x3b, 0x53, 0x3b,
-0x4f, 0x3b, 0x4e, 0x3b, 0x44, 0x3b, 0x4a, 0x61, 0x6e, 0x3b, 0x46, 0x65, 0x62, 0x3b, 0x4d, 0x61, 0x72, 0x3b, 0x41, 0x70,
-0x72, 0x3b, 0x4d, 0x65, 0x69, 0x3b, 0x4a, 0x75, 0x6e, 0x3b, 0x4a, 0x75, 0x6c, 0x3b, 0x41, 0x67, 0x75, 0x3b, 0x53, 0x65,
-0x70, 0x3b, 0x4f, 0x6b, 0x74, 0x3b, 0x4e, 0x6f, 0x76, 0x3b, 0x44, 0x65, 0x73, 0x3b, 0x4a, 0x61, 0x6e, 0x75, 0x61, 0x72,
-0x69, 0x3b, 0x46, 0x65, 0x62, 0x72, 0x75, 0x61, 0x72, 0x69, 0x3b, 0x4d, 0x61, 0x72, 0x65, 0x74, 0x3b, 0x41, 0x70, 0x72,
-0x69, 0x6c, 0x3b, 0x4d, 0x65, 0x69, 0x3b, 0x4a, 0x75, 0x6e, 0x69, 0x3b, 0x4a, 0x75, 0x6c, 0x69, 0x3b, 0x41, 0x67, 0x75,
-0x73, 0x74, 0x75, 0x73, 0x3b, 0x53, 0x65, 0x70, 0x74, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x3b, 0x4f, 0x6b, 0x74, 0x6f, 0x62,
-0x65, 0x72, 0x3b, 0x4e, 0x6f, 0x76, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x3b, 0x44, 0x65, 0x73, 0x65, 0x6d, 0x62, 0x65, 0x72,
-0x3b, 0x6a, 0x61, 0x6e, 0x3b, 0x66, 0x65, 0x62, 0x3b, 0x6d, 0x61, 0x72, 0x3b, 0x61, 0x70, 0x72, 0x3b, 0x6d, 0x61, 0x69,
-0x3b, 0x6a, 0x75, 0x6e, 0x3b, 0x6a, 0x75, 0x6c, 0x3b, 0x61, 0x75, 0x67, 0x3b, 0x73, 0x65, 0x70, 0x3b, 0x6f, 0x63, 0x74,
-0x3b, 0x6e, 0x6f, 0x76, 0x3b, 0x64, 0x65, 0x63, 0x3b, 0x6a, 0x61, 0x6e, 0x75, 0x61, 0x72, 0x69, 0x6f, 0x3b, 0x66, 0x65,
-0x62, 0x72, 0x75, 0x61, 0x72, 0x69, 0x6f, 0x3b, 0x6d, 0x61, 0x72, 0x74, 0x69, 0x6f, 0x3b, 0x61, 0x70, 0x72, 0x69, 0x6c,
-0x3b, 0x6d, 0x61, 0x69, 0x6f, 0x3b, 0x6a, 0x75, 0x6e, 0x69, 0x6f, 0x3b, 0x6a, 0x75, 0x6c, 0x69, 0x6f, 0x3b, 0x61, 0x75,
-0x67, 0x75, 0x73, 0x74, 0x6f, 0x3b, 0x73, 0x65, 0x70, 0x74, 0x65, 0x6d, 0x62, 0x72, 0x65, 0x3b, 0x6f, 0x63, 0x74, 0x6f,
-0x62, 0x72, 0x65, 0x3b, 0x6e, 0x6f, 0x76, 0x65, 0x6d, 0x62, 0x72, 0x65, 0x3b, 0x64, 0x65, 0x63, 0x65, 0x6d, 0x62, 0x72,
-0x65, 0x3b, 0x6a, 0x3b, 0x66, 0x3b, 0x6d, 0x3b, 0x61, 0x3b, 0x6d, 0x3b, 0x6a, 0x3b, 0x6a, 0x3b, 0x61, 0x3b, 0x73, 0x3b,
-0x6f, 0x3b, 0x6e, 0x3b, 0x64, 0x3b, 0x45, 0x61, 0x6e, 0x3b, 0x46, 0x65, 0x61, 0x62, 0x68, 0x3b, 0x4d, 0xe1, 0x72, 0x74,
-0x61, 0x3b, 0x41, 0x69, 0x62, 0x3b, 0x42, 0x65, 0x61, 0x6c, 0x3b, 0x4d, 0x65, 0x69, 0x74, 0x68, 0x3b, 0x49, 0xfa, 0x69,
-0x6c, 0x3b, 0x4c, 0xfa, 0x6e, 0x3b, 0x4d, 0x46, 0xf3, 0x6d, 0x68, 0x3b, 0x44, 0x46, 0xf3, 0x6d, 0x68, 0x3b, 0x53, 0x61,
-0x6d, 0x68, 0x3b, 0x4e, 0x6f, 0x6c, 0x6c, 0x3b, 0x45, 0x61, 0x6e, 0xe1, 0x69, 0x72, 0x3b, 0x46, 0x65, 0x61, 0x62, 0x68,
-0x72, 0x61, 0x3b, 0x4d, 0xe1, 0x72, 0x74, 0x61, 0x3b, 0x41, 0x69, 0x62, 0x72, 0x65, 0xe1, 0x6e, 0x3b, 0x42, 0x65, 0x61,
-0x6c, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x3b, 0x4d, 0x65, 0x69, 0x74, 0x68, 0x65, 0x61, 0x6d, 0x68, 0x3b, 0x49, 0xfa, 0x69,
-0x6c, 0x3b, 0x4c, 0xfa, 0x6e, 0x61, 0x73, 0x61, 0x3b, 0x4d, 0x65, 0xe1, 0x6e, 0x20, 0x46, 0xf3, 0x6d, 0x68, 0x61, 0x69,
-0x72, 0x3b, 0x44, 0x65, 0x69, 0x72, 0x65, 0x61, 0x64, 0x68, 0x20, 0x46, 0xf3, 0x6d, 0x68, 0x61, 0x69, 0x72, 0x3b, 0x53,
-0x61, 0x6d, 0x68, 0x61, 0x69, 0x6e, 0x3b, 0x4e, 0x6f, 0x6c, 0x6c, 0x61, 0x69, 0x67, 0x3b, 0x45, 0x3b, 0x46, 0x3b, 0x4d,
-0x3b, 0x41, 0x3b, 0x42, 0x3b, 0x4d, 0x3b, 0x49, 0x3b, 0x4c, 0x3b, 0x4d, 0x3b, 0x44, 0x3b, 0x53, 0x3b, 0x4e, 0x3b, 0x67,
-0x65, 0x6e, 0x3b, 0x66, 0x65, 0x62, 0x3b, 0x6d, 0x61, 0x72, 0x3b, 0x61, 0x70, 0x72, 0x3b, 0x6d, 0x61, 0x67, 0x3b, 0x67,
-0x69, 0x75, 0x3b, 0x6c, 0x75, 0x67, 0x3b, 0x61, 0x67, 0x6f, 0x3b, 0x73, 0x65, 0x74, 0x3b, 0x6f, 0x74, 0x74, 0x3b, 0x6e,
-0x6f, 0x76, 0x3b, 0x64, 0x69, 0x63, 0x3b, 0x67, 0x65, 0x6e, 0x6e, 0x61, 0x69, 0x6f, 0x3b, 0x66, 0x65, 0x62, 0x62, 0x72,
-0x61, 0x69, 0x6f, 0x3b, 0x6d, 0x61, 0x72, 0x7a, 0x6f, 0x3b, 0x61, 0x70, 0x72, 0x69, 0x6c, 0x65, 0x3b, 0x6d, 0x61, 0x67,
-0x67, 0x69, 0x6f, 0x3b, 0x67, 0x69, 0x75, 0x67, 0x6e, 0x6f, 0x3b, 0x6c, 0x75, 0x67, 0x6c, 0x69, 0x6f, 0x3b, 0x61, 0x67,
-0x6f, 0x73, 0x74, 0x6f, 0x3b, 0x73, 0x65, 0x74, 0x74, 0x65, 0x6d, 0x62, 0x72, 0x65, 0x3b, 0x6f, 0x74, 0x74, 0x6f, 0x62,
-0x72, 0x65, 0x3b, 0x6e, 0x6f, 0x76, 0x65, 0x6d, 0x62, 0x72, 0x65, 0x3b, 0x64, 0x69, 0x63, 0x65, 0x6d, 0x62, 0x72, 0x65,
-0x3b, 0x47, 0x3b, 0x46, 0x3b, 0x4d, 0x3b, 0x41, 0x3b, 0x4d, 0x3b, 0x47, 0x3b, 0x4c, 0x3b, 0x41, 0x3b, 0x53, 0x3b, 0x4f,
-0x3b, 0x4e, 0x3b, 0x44, 0x3b, 0x4a, 0x61, 0x6e, 0x3b, 0x46, 0x65, 0x62, 0x3b, 0x4d, 0x61, 0x72, 0x3b, 0x41, 0x70, 0x72,
-0x3b, 0x4d, 0x65, 0x69, 0x3b, 0x4a, 0x75, 0x6e, 0x3b, 0x4a, 0x75, 0x6c, 0x3b, 0x41, 0x67, 0x74, 0x3b, 0x53, 0x65, 0x70,
-0x3b, 0x4f, 0x6b, 0x74, 0x3b, 0x4e, 0x6f, 0x76, 0x3b, 0x44, 0x65, 0x73, 0x3b, 0xc9c, 0xca8, 0x3b, 0xcab, 0xcc6, 0xcac, 0xccd,
-0xcb0, 0x3b, 0xcae, 0xcbe, 0xcb0, 0xccd, 0xc9a, 0xccd, 0x3b, 0xc8f, 0xcaa, 0xccd, 0xcb0, 0xcbf, 0x3b, 0xcae, 0xcc7, 0x3b, 0xc9c, 0xcc2,
-0xca8, 0xccd, 0x3b, 0xc9c, 0xcc1, 0xcb2, 0xcc8, 0x3b, 0xc86, 0xc97, 0x3b, 0xcb8, 0xcc6, 0xcaa, 0xccd, 0xc9f, 0xcc6, 0xc82, 0x3b, 0xc85,
-0xc95, 0xccd, 0xc9f, 0xccb, 0x3b, 0xca8, 0xcb5, 0xcc6, 0xc82, 0x3b, 0xca1, 0xcbf, 0xcb8, 0xcc6, 0xc82, 0x3b, 0xc9c, 0xca8, 0xcb5, 0xcb0,
-0xcbf, 0x3b, 0xcab, 0xcc6, 0xcac, 0xccd, 0xcb0, 0xcb5, 0xcb0, 0xcbf, 0x3b, 0xcae, 0xcbe, 0xcb0, 0xccd, 0xc9a, 0xccd, 0x3b, 0xc8f, 0xcaa,
-0xccd, 0xcb0, 0xcbf, 0xcb2, 0xccd, 0x3b, 0xcae, 0xcc7, 0x3b, 0xc9c, 0xcc2, 0xca8, 0xccd, 0x3b, 0xc9c, 0xcc1, 0xcb2, 0xcc8, 0x3b, 0xc86,
-0xc97, 0xcb8, 0xccd, 0xc9f, 0xccd, 0x3b, 0xcb8, 0xcc6, 0xcaa, 0xccd, 0xc9f, 0xcc6, 0xc82, 0xcac, 0xcb0, 0xccd, 0x3b, 0xc85, 0xc95, 0xccd,
-0xc9f, 0xccb, 0xcac, 0xcb0, 0xccd, 0x3b, 0xca8, 0xcb5, 0xcc6, 0xc82, 0xcac, 0xcb0, 0xccd, 0x3b, 0xca1, 0xcbf, 0xcb8, 0xcc6, 0xc82, 0xcac,
-0xcb0, 0xccd, 0x3b, 0xc9c, 0x3b, 0xcab, 0xcc6, 0x3b, 0xcae, 0xcbe, 0x3b, 0xc8f, 0x3b, 0xcae, 0xcc7, 0x3b, 0xc9c, 0xcc2, 0x3b, 0xc9c,
-0xcc1, 0x3b, 0xc86, 0x3b, 0xcb8, 0xcc6, 0x3b, 0xc85, 0x3b, 0xca8, 0x3b, 0xca1, 0xcbf, 0x3b, 0xc9c, 0xca8, 0xcb5, 0xcb0, 0xcbf, 0x3b,
-0xcab, 0xcc6, 0xcac, 0xccd, 0xcb0, 0xcb5, 0xcb0, 0xcbf, 0x3b, 0xcae, 0xcbe, 0xcb0, 0xccd, 0xc9a, 0xccd, 0x3b, 0xc8f, 0xcaa, 0xccd, 0xcb0,
-0xcbf, 0x3b, 0xcae, 0xcc7, 0x3b, 0xc9c, 0xcc2, 0xca8, 0xccd, 0x3b, 0xc9c, 0xcc1, 0xcb2, 0xcc8, 0x3b, 0xc86, 0xc97, 0x3b, 0xcb8, 0xcc6,
-0xcaa, 0xccd, 0xc9f, 0xcc6, 0xc82, 0x3b, 0xc85, 0xc95, 0xccd, 0xc9f, 0xccb, 0x3b, 0xca8, 0xcb5, 0xcc6, 0xc82, 0x3b, 0xca1, 0xcbf, 0xcb8,
-0xcc6, 0xc82, 0x3b, 0x62c, 0x646, 0x624, 0x631, 0x6cc, 0x3b, 0x641, 0x631, 0x624, 0x631, 0x6cc, 0x3b, 0x645, 0x627, 0x631, 0x655, 0x686,
-0x3b, 0x627, 0x67e, 0x631, 0x6cc, 0x644, 0x3b, 0x645, 0x6cc, 0x654, 0x3b, 0x62c, 0x648, 0x657, 0x646, 0x3b, 0x62c, 0x648, 0x657, 0x644,
-0x627, 0x6cc, 0x6cc, 0x3b, 0x627, 0x6af, 0x633, 0x62a, 0x3b, 0x633, 0x62a, 0x645, 0x628, 0x631, 0x3b, 0x627, 0x6a9, 0x62a, 0x648, 0x657,
-0x628, 0x631, 0x3b, 0x646, 0x648, 0x645, 0x628, 0x631, 0x3b, 0x62f, 0x633, 0x645, 0x628, 0x631, 0x3b, 0x62c, 0x3b, 0x641, 0x3b, 0x645,
-0x3b, 0x627, 0x3b, 0x645, 0x3b, 0x62c, 0x3b, 0x62c, 0x3b, 0x627, 0x3b, 0x633, 0x3b, 0x633, 0x3b, 0x627, 0x3b, 0x646, 0x3b, 0x49b,
-0x430, 0x4a3, 0x2e, 0x3b, 0x430, 0x49b, 0x43f, 0x2e, 0x3b, 0x43d, 0x430, 0x443, 0x2e, 0x3b, 0x441, 0x4d9, 0x443, 0x2e, 0x3b, 0x43c,
-0x430, 0x43c, 0x2e, 0x3b, 0x43c, 0x430, 0x443, 0x2e, 0x3b, 0x448, 0x456, 0x43b, 0x2e, 0x3b, 0x442, 0x430, 0x43c, 0x2e, 0x3b, 0x49b,
-0x44b, 0x440, 0x2e, 0x3b, 0x49b, 0x430, 0x437, 0x2e, 0x3b, 0x49b, 0x430, 0x440, 0x2e, 0x3b, 0x436, 0x435, 0x43b, 0x2e, 0x3b, 0x49a,
-0x430, 0x4a3, 0x442, 0x430, 0x440, 0x3b, 0x410, 0x49b, 0x43f, 0x430, 0x43d, 0x3b, 0x41d, 0x430, 0x443, 0x440, 0x44b, 0x437, 0x3b, 0x421,
-0x4d9, 0x443, 0x456, 0x440, 0x3b, 0x41c, 0x430, 0x43c, 0x44b, 0x440, 0x3b, 0x41c, 0x430, 0x443, 0x441, 0x44b, 0x43c, 0x3b, 0x428, 0x456,
-0x43b, 0x434, 0x435, 0x3b, 0x422, 0x430, 0x43c, 0x44b, 0x437, 0x3b, 0x49a, 0x44b, 0x440, 0x43a, 0x4af, 0x439, 0x435, 0x43a, 0x3b, 0x49a,
-0x430, 0x437, 0x430, 0x43d, 0x3b, 0x49a, 0x430, 0x440, 0x430, 0x448, 0x430, 0x3b, 0x416, 0x435, 0x43b, 0x442, 0x43e, 0x49b, 0x441, 0x430,
-0x43d, 0x3b, 0x49a, 0x3b, 0x410, 0x3b, 0x41d, 0x3b, 0x421, 0x3b, 0x41c, 0x3b, 0x41c, 0x3b, 0x428, 0x3b, 0x422, 0x3b, 0x49a, 0x3b,
-0x49a, 0x3b, 0x49a, 0x3b, 0x416, 0x3b, 0x49b, 0x430, 0x4a3, 0x442, 0x430, 0x440, 0x3b, 0x430, 0x49b, 0x43f, 0x430, 0x43d, 0x3b, 0x43d,
-0x430, 0x443, 0x440, 0x44b, 0x437, 0x3b, 0x441, 0x4d9, 0x443, 0x456, 0x440, 0x3b, 0x43c, 0x430, 0x43c, 0x44b, 0x440, 0x3b, 0x43c, 0x430,
-0x443, 0x441, 0x44b, 0x43c, 0x3b, 0x448, 0x456, 0x43b, 0x434, 0x435, 0x3b, 0x442, 0x430, 0x43c, 0x44b, 0x437, 0x3b, 0x49b, 0x44b, 0x440,
-0x43a, 0x4af, 0x439, 0x435, 0x43a, 0x3b, 0x49b, 0x430, 0x437, 0x430, 0x43d, 0x3b, 0x49b, 0x430, 0x440, 0x430, 0x448, 0x430, 0x3b, 0x436,
-0x435, 0x43b, 0x442, 0x43e, 0x49b, 0x441, 0x430, 0x43d, 0x3b, 0x6d, 0x75, 0x74, 0x2e, 0x3b, 0x67, 0x61, 0x73, 0x2e, 0x3b, 0x77,
-0x65, 0x72, 0x2e, 0x3b, 0x6d, 0x61, 0x74, 0x2e, 0x3b, 0x67, 0x69, 0x63, 0x2e, 0x3b, 0x6b, 0x61, 0x6d, 0x2e, 0x3b, 0x6e,
-0x79, 0x61, 0x2e, 0x3b, 0x6b, 0x61, 0x6e, 0x2e, 0x3b, 0x6e, 0x7a, 0x65, 0x2e, 0x3b, 0x75, 0x6b, 0x77, 0x2e, 0x3b, 0x75,
-0x67, 0x75, 0x2e, 0x3b, 0x75, 0x6b, 0x75, 0x2e, 0x3b, 0x4d, 0x75, 0x74, 0x61, 0x72, 0x61, 0x6d, 0x61, 0x3b, 0x47, 0x61,
-0x73, 0x68, 0x79, 0x61, 0x6e, 0x74, 0x61, 0x72, 0x65, 0x3b, 0x57, 0x65, 0x72, 0x75, 0x72, 0x77, 0x65, 0x3b, 0x4d, 0x61,
-0x74, 0x61, 0x3b, 0x47, 0x69, 0x63, 0x75, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x3b, 0x4b, 0x61, 0x6d, 0x65, 0x6e, 0x61, 0x3b,
-0x4e, 0x79, 0x61, 0x6b, 0x61, 0x6e, 0x67, 0x61, 0x3b, 0x4b, 0x61, 0x6e, 0x61, 0x6d, 0x61, 0x3b, 0x4e, 0x7a, 0x65, 0x6c,
-0x69, 0x3b, 0x55, 0x6b, 0x77, 0x61, 0x6b, 0x69, 0x72, 0x61, 0x3b, 0x55, 0x67, 0x75, 0x73, 0x68, 0x79, 0x69, 0x6e, 0x67,
-0x6f, 0x3b, 0x55, 0x6b, 0x75, 0x62, 0x6f, 0x7a, 0x61, 0x3b, 0x42f, 0x43d, 0x432, 0x3b, 0x424, 0x435, 0x432, 0x3b, 0x41c, 0x430,
-0x440, 0x3b, 0x410, 0x43f, 0x440, 0x3b, 0x41c, 0x430, 0x439, 0x3b, 0x418, 0x44e, 0x43d, 0x3b, 0x418, 0x44e, 0x43b, 0x3b, 0x410, 0x432,
-0x433, 0x3b, 0x421, 0x435, 0x43d, 0x3b, 0x41e, 0x43a, 0x442, 0x3b, 0x41d, 0x43e, 0x44f, 0x3b, 0x414, 0x435, 0x43a, 0x3b, 0x42f, 0x43d,
-0x432, 0x430, 0x440, 0x44c, 0x3b, 0x424, 0x435, 0x432, 0x440, 0x430, 0x43b, 0x44c, 0x3b, 0x41c, 0x430, 0x440, 0x442, 0x3b, 0x410, 0x43f,
-0x440, 0x435, 0x43b, 0x44c, 0x3b, 0x41c, 0x430, 0x439, 0x3b, 0x418, 0x44e, 0x43d, 0x44c, 0x3b, 0x418, 0x44e, 0x43b, 0x44c, 0x3b, 0x410,
-0x432, 0x433, 0x443, 0x441, 0x442, 0x3b, 0x421, 0x435, 0x43d, 0x442, 0x44f, 0x431, 0x440, 0x44c, 0x3b, 0x41e, 0x43a, 0x442, 0x44f, 0x431,
-0x440, 0x44c, 0x3b, 0x41d, 0x43e, 0x44f, 0x431, 0x440, 0x44c, 0x3b, 0x414, 0x435, 0x43a, 0x430, 0x431, 0x440, 0x44c, 0x3b, 0x42f, 0x3b,
-0x424, 0x3b, 0x41c, 0x3b, 0x410, 0x3b, 0x41c, 0x3b, 0x418, 0x3b, 0x418, 0x3b, 0x410, 0x3b, 0x421, 0x3b, 0x41e, 0x3b, 0x41d, 0x3b,
-0x414, 0x3b, 0x44f, 0x43d, 0x432, 0x2e, 0x3b, 0x444, 0x435, 0x432, 0x2e, 0x3b, 0x43c, 0x430, 0x440, 0x2e, 0x3b, 0x430, 0x43f, 0x440,
-0x2e, 0x3b, 0x43c, 0x430, 0x439, 0x3b, 0x438, 0x44e, 0x43d, 0x2e, 0x3b, 0x438, 0x44e, 0x43b, 0x2e, 0x3b, 0x430, 0x432, 0x433, 0x2e,
-0x3b, 0x441, 0x435, 0x43d, 0x2e, 0x3b, 0x43e, 0x43a, 0x442, 0x2e, 0x3b, 0x43d, 0x43e, 0x44f, 0x2e, 0x3b, 0x434, 0x435, 0x43a, 0x2e,
-0x3b, 0x44f, 0x43d, 0x432, 0x430, 0x440, 0x44c, 0x3b, 0x444, 0x435, 0x432, 0x440, 0x430, 0x43b, 0x44c, 0x3b, 0x43c, 0x430, 0x440, 0x442,
-0x3b, 0x430, 0x43f, 0x440, 0x435, 0x43b, 0x44c, 0x3b, 0x43c, 0x430, 0x439, 0x3b, 0x438, 0x44e, 0x43d, 0x44c, 0x3b, 0x438, 0x44e, 0x43b,
-0x44c, 0x3b, 0x430, 0x432, 0x433, 0x443, 0x441, 0x442, 0x3b, 0x441, 0x435, 0x43d, 0x442, 0x44f, 0x431, 0x440, 0x44c, 0x3b, 0x43e, 0x43a,
-0x442, 0x44f, 0x431, 0x440, 0x44c, 0x3b, 0x43d, 0x43e, 0x44f, 0x431, 0x440, 0x44c, 0x3b, 0x434, 0x435, 0x43a, 0x430, 0x431, 0x440, 0x44c,
-0x3b, 0x31, 0xc6d4, 0x3b, 0x32, 0xc6d4, 0x3b, 0x33, 0xc6d4, 0x3b, 0x34, 0xc6d4, 0x3b, 0x35, 0xc6d4, 0x3b, 0x36, 0xc6d4, 0x3b, 0x37,
-0xc6d4, 0x3b, 0x38, 0xc6d4, 0x3b, 0x39, 0xc6d4, 0x3b, 0x31, 0x30, 0xc6d4, 0x3b, 0x31, 0x31, 0xc6d4, 0x3b, 0x31, 0x32, 0xc6d4, 0x3b,
-0x72, 0xea, 0x62, 0x3b, 0x72, 0x65, 0x15f, 0x3b, 0x61, 0x64, 0x61, 0x3b, 0x61, 0x76, 0x72, 0x3b, 0x67, 0x75, 0x6c, 0x3b,
-0x70, 0xfb, 0x15f, 0x3b, 0x74, 0xee, 0x72, 0x3b, 0x67, 0x65, 0x6c, 0x3b, 0x72, 0x65, 0x7a, 0x3b, 0x6b, 0x65, 0x77, 0x3b,
-0x73, 0x65, 0x72, 0x3b, 0x62, 0x65, 0x72, 0x3b, 0x72, 0xea, 0x62, 0x65, 0x6e, 0x64, 0x61, 0x6e, 0x3b, 0x72, 0x65, 0x15f,
-0x65, 0x6d, 0xee, 0x3b, 0x61, 0x64, 0x61, 0x72, 0x3b, 0x61, 0x76, 0x72, 0xea, 0x6c, 0x3b, 0x67, 0x75, 0x6c, 0x61, 0x6e,
-0x3b, 0x70, 0xfb, 0x15f, 0x70, 0x65, 0x72, 0x3b, 0x74, 0xee, 0x72, 0x6d, 0x65, 0x68, 0x3b, 0x67, 0x65, 0x6c, 0x61, 0x77,
-0xea, 0x6a, 0x3b, 0x72, 0x65, 0x7a, 0x62, 0x65, 0x72, 0x3b, 0x6b, 0x65, 0x77, 0xe7, 0xea, 0x72, 0x3b, 0x73, 0x65, 0x72,
-0x6d, 0x61, 0x77, 0x65, 0x7a, 0x3b, 0x62, 0x65, 0x72, 0x66, 0x61, 0x6e, 0x62, 0x61, 0x72, 0x3b, 0x52, 0x3b, 0x52, 0x3b,
-0x41, 0x3b, 0x41, 0x3b, 0x47, 0x3b, 0x50, 0x3b, 0x54, 0x3b, 0x47, 0x3b, 0x52, 0x3b, 0x4b, 0x3b, 0x53, 0x3b, 0x42, 0x3b,
-0x72, 0xea, 0x62, 0x65, 0x6e, 0x64, 0x61, 0x6e, 0xea, 0x3b, 0x72, 0x65, 0x15f, 0x65, 0x6d, 0x69, 0x79, 0xea, 0x3b, 0x61,
-0x64, 0x61, 0x72, 0xea, 0x3b, 0x61, 0x76, 0x72, 0xea, 0x6c, 0xea, 0x3b, 0x67, 0x75, 0x6c, 0x61, 0x6e, 0xea, 0x3b, 0x70,
-0xfb, 0x15f, 0x70, 0x65, 0x72, 0xea, 0x3b, 0x74, 0xee, 0x72, 0x6d, 0x65, 0x68, 0xea, 0x3b, 0x67, 0x65, 0x6c, 0x61, 0x77,
-0xea, 0x6a, 0xea, 0x3b, 0x72, 0x65, 0x7a, 0x62, 0x65, 0x72, 0xea, 0x3b, 0x6b, 0x65, 0x77, 0xe7, 0xea, 0x72, 0xea, 0x3b,
-0x73, 0x65, 0x72, 0x6d, 0x61, 0x77, 0x65, 0x7a, 0xea, 0x3b, 0x62, 0x65, 0x72, 0x66, 0x61, 0x6e, 0x62, 0x61, 0x72, 0xea,
-0x3b, 0x4d, 0x75, 0x74, 0x2e, 0x3b, 0x47, 0x61, 0x73, 0x2e, 0x3b, 0x57, 0x65, 0x72, 0x2e, 0x3b, 0x4d, 0x61, 0x74, 0x2e,
-0x3b, 0x47, 0x69, 0x63, 0x2e, 0x3b, 0x4b, 0x61, 0x6d, 0x2e, 0x3b, 0x4e, 0x79, 0x61, 0x2e, 0x3b, 0x4b, 0x61, 0x6e, 0x2e,
-0x3b, 0x4e, 0x7a, 0x65, 0x2e, 0x3b, 0x55, 0x6b, 0x77, 0x2e, 0x3b, 0x55, 0x67, 0x75, 0x2e, 0x3b, 0x55, 0x6b, 0x75, 0x2e,
-0x3b, 0x4e, 0x7a, 0x65, 0x72, 0x6f, 0x3b, 0x52, 0x75, 0x68, 0x75, 0x68, 0x75, 0x6d, 0x61, 0x3b, 0x4e, 0x74, 0x77, 0x61,
-0x72, 0x61, 0x6e, 0x74, 0x65, 0x3b, 0x4e, 0x64, 0x61, 0x6d, 0x75, 0x6b, 0x69, 0x7a, 0x61, 0x3b, 0x52, 0x75, 0x73, 0x61,
-0x6d, 0x61, 0x3b, 0x52, 0x75, 0x68, 0x65, 0x73, 0x68, 0x69, 0x3b, 0x4d, 0x75, 0x6b, 0x61, 0x6b, 0x61, 0x72, 0x6f, 0x3b,
-0x4e, 0x79, 0x61, 0x6e, 0x64, 0x61, 0x67, 0x61, 0x72, 0x6f, 0x3b, 0x4e, 0x79, 0x61, 0x6b, 0x61, 0x6e, 0x67, 0x61, 0x3b,
-0x47, 0x69, 0x74, 0x75, 0x67, 0x75, 0x74, 0x75, 0x3b, 0x4d, 0x75, 0x6e, 0x79, 0x6f, 0x6e, 0x79, 0x6f, 0x3b, 0x4b, 0x69,
-0x67, 0x61, 0x72, 0x61, 0x6d, 0x61, 0x3b, 0xea1, 0x2e, 0xe81, 0x2e, 0x3b, 0xe81, 0x2e, 0xe9e, 0x2e, 0x3b, 0xea1, 0x2e, 0xe99,
-0x2e, 0x3b, 0xea1, 0x2e, 0xeaa, 0x2e, 0x3b, 0xe9e, 0x2e, 0xe9e, 0x2e, 0x3b, 0xea1, 0xeb4, 0x2e, 0xe96, 0x2e, 0x3b, 0xe81, 0x2e,
-0xea5, 0x2e, 0x3b, 0xeaa, 0x2e, 0xeab, 0x2e, 0x3b, 0xe81, 0x2e, 0xe8d, 0x2e, 0x3b, 0xe95, 0x2e, 0xea5, 0x2e, 0x3b, 0xe9e, 0x2e,
-0xe88, 0x2e, 0x3b, 0xe97, 0x2e, 0xea7, 0x2e, 0x3b, 0xea1, 0xeb1, 0xe87, 0xe81, 0xead, 0xe99, 0x3b, 0xe81, 0xeb8, 0xea1, 0xe9e, 0xeb2,
-0x3b, 0xea1, 0xeb5, 0xe99, 0xeb2, 0x3b, 0xec0, 0xea1, 0xeaa, 0xeb2, 0x3b, 0xe9e, 0xeb6, 0xe94, 0xeaa, 0xeb0, 0xe9e, 0xeb2, 0x3b, 0xea1,
-0xeb4, 0xe96, 0xeb8, 0xe99, 0xeb2, 0x3b, 0xe81, 0xecd, 0xea5, 0xeb0, 0xe81, 0xebb, 0xe94, 0x3b, 0xeaa, 0xeb4, 0xe87, 0xeab, 0xeb2, 0x3b,
-0xe81, 0xeb1, 0xe99, 0xe8d, 0xeb2, 0x3b, 0xe95, 0xeb8, 0xea5, 0xeb2, 0x3b, 0xe9e, 0xeb0, 0xe88, 0xeb4, 0xe81, 0x3b, 0xe97, 0xeb1, 0xe99,
-0xea7, 0xeb2, 0x3b, 0x6a, 0x61, 0x6e, 0x76, 0x2e, 0x3b, 0x66, 0x65, 0x62, 0x72, 0x2e, 0x3b, 0x6d, 0x61, 0x72, 0x74, 0x73,
-0x3b, 0x61, 0x70, 0x72, 0x2e, 0x3b, 0x6d, 0x61, 0x69, 0x6a, 0x73, 0x3b, 0x6a, 0x16b, 0x6e, 0x2e, 0x3b, 0x6a, 0x16b, 0x6c,
-0x2e, 0x3b, 0x61, 0x75, 0x67, 0x2e, 0x3b, 0x73, 0x65, 0x70, 0x74, 0x2e, 0x3b, 0x6f, 0x6b, 0x74, 0x2e, 0x3b, 0x6e, 0x6f,
-0x76, 0x2e, 0x3b, 0x64, 0x65, 0x63, 0x2e, 0x3b, 0x6a, 0x61, 0x6e, 0x76, 0x101, 0x72, 0x69, 0x73, 0x3b, 0x66, 0x65, 0x62,
-0x72, 0x75, 0x101, 0x72, 0x69, 0x73, 0x3b, 0x6d, 0x61, 0x72, 0x74, 0x73, 0x3b, 0x61, 0x70, 0x72, 0x12b, 0x6c, 0x69, 0x73,
-0x3b, 0x6d, 0x61, 0x69, 0x6a, 0x73, 0x3b, 0x6a, 0x16b, 0x6e, 0x69, 0x6a, 0x73, 0x3b, 0x6a, 0x16b, 0x6c, 0x69, 0x6a, 0x73,
-0x3b, 0x61, 0x75, 0x67, 0x75, 0x73, 0x74, 0x73, 0x3b, 0x73, 0x65, 0x70, 0x74, 0x65, 0x6d, 0x62, 0x72, 0x69, 0x73, 0x3b,
-0x6f, 0x6b, 0x74, 0x6f, 0x62, 0x72, 0x69, 0x73, 0x3b, 0x6e, 0x6f, 0x76, 0x65, 0x6d, 0x62, 0x72, 0x69, 0x73, 0x3b, 0x64,
-0x65, 0x63, 0x65, 0x6d, 0x62, 0x72, 0x69, 0x73, 0x3b, 0x79, 0x61, 0x6e, 0x3b, 0x66, 0x62, 0x6c, 0x3b, 0x6d, 0x73, 0x69,
-0x3b, 0x61, 0x70, 0x6c, 0x3b, 0x6d, 0x61, 0x69, 0x3b, 0x79, 0x75, 0x6e, 0x3b, 0x79, 0x75, 0x6c, 0x3b, 0x61, 0x67, 0x74,
-0x3b, 0x73, 0x74, 0x62, 0x3b, 0x254, 0x74, 0x62, 0x3b, 0x6e, 0x76, 0x62, 0x3b, 0x64, 0x73, 0x62, 0x3b, 0x73, 0xe1, 0x6e,
-0x7a, 0xe1, 0x20, 0x79, 0x61, 0x20, 0x79, 0x61, 0x6d, 0x62, 0x6f, 0x3b, 0x73, 0xe1, 0x6e, 0x7a, 0xe1, 0x20, 0x79, 0x61,
-0x20, 0x6d, 0xed, 0x62, 0x61, 0x6c, 0xe9, 0x3b, 0x73, 0xe1, 0x6e, 0x7a, 0xe1, 0x20, 0x79, 0x61, 0x20, 0x6d, 0xed, 0x73,
-0xe1, 0x74, 0x6f, 0x3b, 0x73, 0xe1, 0x6e, 0x7a, 0xe1, 0x20, 0x79, 0x61, 0x20, 0x6d, 0xed, 0x6e, 0x65, 0x69, 0x3b, 0x73,
-0xe1, 0x6e, 0x7a, 0xe1, 0x20, 0x79, 0x61, 0x20, 0x6d, 0xed, 0x74, 0xe1, 0x6e, 0x6f, 0x3b, 0x73, 0xe1, 0x6e, 0x7a, 0xe1,
-0x20, 0x79, 0x61, 0x20, 0x6d, 0x6f, 0x74, 0xf3, 0x62, 0xe1, 0x3b, 0x73, 0xe1, 0x6e, 0x7a, 0xe1, 0x20, 0x79, 0x61, 0x20,
-0x6e, 0x73, 0x61, 0x6d, 0x62, 0x6f, 0x3b, 0x73, 0xe1, 0x6e, 0x7a, 0xe1, 0x20, 0x79, 0x61, 0x20, 0x6d, 0x77, 0x61, 0x6d,
-0x62, 0x65, 0x3b, 0x73, 0xe1, 0x6e, 0x7a, 0xe1, 0x20, 0x79, 0x61, 0x20, 0x6c, 0x69, 0x62, 0x77, 0x61, 0x3b, 0x73, 0xe1,
-0x6e, 0x7a, 0xe1, 0x20, 0x79, 0x61, 0x20, 0x7a, 0xf3, 0x6d, 0x69, 0x3b, 0x73, 0xe1, 0x6e, 0x7a, 0xe1, 0x20, 0x79, 0x61,
-0x20, 0x7a, 0xf3, 0x6d, 0x69, 0x20, 0x6e, 0x61, 0x20, 0x6d, 0x254, 0x30c, 0x6b, 0x254, 0x301, 0x3b, 0x73, 0xe1, 0x6e, 0x7a,
-0xe1, 0x20, 0x79, 0x61, 0x20, 0x7a, 0xf3, 0x6d, 0x69, 0x20, 0x6e, 0x61, 0x20, 0x6d, 0xed, 0x62, 0x61, 0x6c, 0xe9, 0x3b,
-0x79, 0x3b, 0x66, 0x3b, 0x6d, 0x3b, 0x61, 0x3b, 0x6d, 0x3b, 0x79, 0x3b, 0x79, 0x3b, 0x61, 0x3b, 0x73, 0x3b, 0x254, 0x3b,
-0x6e, 0x3b, 0x64, 0x3b, 0x73, 0x61, 0x75, 0x73, 0x2e, 0x3b, 0x76, 0x61, 0x73, 0x2e, 0x3b, 0x6b, 0x6f, 0x76, 0x2e, 0x3b,
-0x62, 0x61, 0x6c, 0x2e, 0x3b, 0x67, 0x65, 0x67, 0x2e, 0x3b, 0x62, 0x69, 0x72, 0x17e, 0x2e, 0x3b, 0x6c, 0x69, 0x65, 0x70,
-0x2e, 0x3b, 0x72, 0x75, 0x67, 0x70, 0x2e, 0x3b, 0x72, 0x75, 0x67, 0x73, 0x2e, 0x3b, 0x73, 0x70, 0x61, 0x6c, 0x2e, 0x3b,
-0x6c, 0x61, 0x70, 0x6b, 0x72, 0x2e, 0x3b, 0x67, 0x72, 0x75, 0x6f, 0x64, 0x2e, 0x3b, 0x73, 0x61, 0x75, 0x73, 0x69, 0x73,
-0x3b, 0x76, 0x61, 0x73, 0x61, 0x72, 0x69, 0x73, 0x3b, 0x6b, 0x6f, 0x76, 0x61, 0x73, 0x3b, 0x62, 0x61, 0x6c, 0x61, 0x6e,
-0x64, 0x69, 0x73, 0x3b, 0x67, 0x65, 0x67, 0x75, 0x17e, 0x117, 0x3b, 0x62, 0x69, 0x72, 0x17e, 0x65, 0x6c, 0x69, 0x73, 0x3b,
-0x6c, 0x69, 0x65, 0x70, 0x61, 0x3b, 0x72, 0x75, 0x67, 0x70, 0x6a, 0x16b, 0x74, 0x69, 0x73, 0x3b, 0x72, 0x75, 0x67, 0x73,
-0x117, 0x6a, 0x69, 0x73, 0x3b, 0x73, 0x70, 0x61, 0x6c, 0x69, 0x73, 0x3b, 0x6c, 0x61, 0x70, 0x6b, 0x72, 0x69, 0x74, 0x69,
-0x73, 0x3b, 0x67, 0x72, 0x75, 0x6f, 0x64, 0x69, 0x73, 0x3b, 0x53, 0x3b, 0x56, 0x3b, 0x4b, 0x3b, 0x42, 0x3b, 0x47, 0x3b,
-0x42, 0x3b, 0x4c, 0x3b, 0x52, 0x3b, 0x52, 0x3b, 0x53, 0x3b, 0x4c, 0x3b, 0x47, 0x3b, 0x73, 0x61, 0x75, 0x73, 0x69, 0x6f,
-0x3b, 0x76, 0x61, 0x73, 0x61, 0x72, 0x69, 0x6f, 0x3b, 0x6b, 0x6f, 0x76, 0x6f, 0x3b, 0x62, 0x61, 0x6c, 0x61, 0x6e, 0x64,
-0x17e, 0x69, 0x6f, 0x3b, 0x67, 0x65, 0x67, 0x75, 0x17e, 0x117, 0x73, 0x3b, 0x62, 0x69, 0x72, 0x17e, 0x65, 0x6c, 0x69, 0x6f,
-0x3b, 0x6c, 0x69, 0x65, 0x70, 0x6f, 0x73, 0x3b, 0x72, 0x75, 0x67, 0x70, 0x6a, 0x16b, 0x10d, 0x69, 0x6f, 0x3b, 0x72, 0x75,
-0x67, 0x73, 0x117, 0x6a, 0x6f, 0x3b, 0x73, 0x70, 0x61, 0x6c, 0x69, 0x6f, 0x3b, 0x6c, 0x61, 0x70, 0x6b, 0x72, 0x69, 0x10d,
-0x69, 0x6f, 0x3b, 0x67, 0x72, 0x75, 0x6f, 0x64, 0x17e, 0x69, 0x6f, 0x3b, 0x458, 0x430, 0x43d, 0x2e, 0x3b, 0x444, 0x435, 0x432,
-0x2e, 0x3b, 0x43c, 0x430, 0x440, 0x2e, 0x3b, 0x430, 0x43f, 0x440, 0x2e, 0x3b, 0x43c, 0x430, 0x458, 0x3b, 0x458, 0x443, 0x43d, 0x2e,
-0x3b, 0x458, 0x443, 0x43b, 0x2e, 0x3b, 0x430, 0x432, 0x433, 0x2e, 0x3b, 0x441, 0x435, 0x43f, 0x442, 0x2e, 0x3b, 0x43e, 0x43a, 0x442,
-0x2e, 0x3b, 0x43d, 0x43e, 0x435, 0x43c, 0x2e, 0x3b, 0x434, 0x435, 0x43a, 0x2e, 0x3b, 0x458, 0x430, 0x43d, 0x443, 0x430, 0x440, 0x438,
-0x3b, 0x444, 0x435, 0x432, 0x440, 0x443, 0x430, 0x440, 0x438, 0x3b, 0x43c, 0x430, 0x440, 0x442, 0x3b, 0x430, 0x43f, 0x440, 0x438, 0x43b,
-0x3b, 0x43c, 0x430, 0x458, 0x3b, 0x458, 0x443, 0x43d, 0x438, 0x3b, 0x458, 0x443, 0x43b, 0x438, 0x3b, 0x430, 0x432, 0x433, 0x443, 0x441,
-0x442, 0x3b, 0x441, 0x435, 0x43f, 0x442, 0x435, 0x43c, 0x432, 0x440, 0x438, 0x3b, 0x43e, 0x43a, 0x442, 0x43e, 0x43c, 0x432, 0x440, 0x438,
-0x3b, 0x43d, 0x43e, 0x435, 0x43c, 0x432, 0x440, 0x438, 0x3b, 0x434, 0x435, 0x43a, 0x435, 0x43c, 0x432, 0x440, 0x438, 0x3b, 0x458, 0x3b,
-0x444, 0x3b, 0x43c, 0x3b, 0x430, 0x3b, 0x43c, 0x3b, 0x458, 0x3b, 0x458, 0x3b, 0x430, 0x3b, 0x441, 0x3b, 0x43e, 0x3b, 0x43d, 0x3b,
-0x434, 0x3b, 0x4a, 0x61, 0x6e, 0x3b, 0x46, 0x65, 0x62, 0x3b, 0x4d, 0x61, 0x72, 0x3b, 0x41, 0x70, 0x72, 0x3b, 0x4d, 0x65,
-0x79, 0x3b, 0x4a, 0x6f, 0x6e, 0x3b, 0x4a, 0x6f, 0x6c, 0x3b, 0x41, 0x6f, 0x67, 0x3b, 0x53, 0x65, 0x70, 0x3b, 0x4f, 0x6b,
-0x74, 0x3b, 0x4e, 0x6f, 0x76, 0x3b, 0x44, 0x65, 0x73, 0x3b, 0x4a, 0x61, 0x6e, 0x6f, 0x61, 0x72, 0x79, 0x3b, 0x46, 0x65,
-0x62, 0x72, 0x6f, 0x61, 0x72, 0x79, 0x3b, 0x4d, 0x61, 0x72, 0x74, 0x73, 0x61, 0x3b, 0x41, 0x70, 0x72, 0x69, 0x6c, 0x79,
-0x3b, 0x4d, 0x65, 0x79, 0x3b, 0x4a, 0x6f, 0x6e, 0x61, 0x3b, 0x4a, 0x6f, 0x6c, 0x61, 0x79, 0x3b, 0x41, 0x6f, 0x67, 0x6f,
-0x73, 0x69, 0x74, 0x72, 0x61, 0x3b, 0x53, 0x65, 0x70, 0x74, 0x61, 0x6d, 0x62, 0x72, 0x61, 0x3b, 0x4f, 0x6b, 0x74, 0x6f,
-0x62, 0x72, 0x61, 0x3b, 0x4e, 0x6f, 0x76, 0x61, 0x6d, 0x62, 0x72, 0x61, 0x3b, 0x44, 0x65, 0x73, 0x61, 0x6d, 0x62, 0x72,
-0x61, 0x3b, 0x4a, 0x61, 0x6e, 0x3b, 0x46, 0x65, 0x62, 0x3b, 0x4d, 0x61, 0x63, 0x3b, 0x41, 0x70, 0x72, 0x3b, 0x4d, 0x65,
-0x69, 0x3b, 0x4a, 0x75, 0x6e, 0x3b, 0x4a, 0x75, 0x6c, 0x3b, 0x4f, 0x67, 0x6f, 0x3b, 0x53, 0x65, 0x70, 0x3b, 0x4f, 0x6b,
-0x74, 0x3b, 0x4e, 0x6f, 0x76, 0x3b, 0x44, 0x69, 0x73, 0x3b, 0x4a, 0x61, 0x6e, 0x75, 0x61, 0x72, 0x69, 0x3b, 0x46, 0x65,
-0x62, 0x72, 0x75, 0x61, 0x72, 0x69, 0x3b, 0x4d, 0x61, 0x63, 0x3b, 0x41, 0x70, 0x72, 0x69, 0x6c, 0x3b, 0x4d, 0x65, 0x69,
-0x3b, 0x4a, 0x75, 0x6e, 0x3b, 0x4a, 0x75, 0x6c, 0x61, 0x69, 0x3b, 0x4f, 0x67, 0x6f, 0x73, 0x3b, 0x53, 0x65, 0x70, 0x74,
-0x65, 0x6d, 0x62, 0x65, 0x72, 0x3b, 0x4f, 0x6b, 0x74, 0x6f, 0x62, 0x65, 0x72, 0x3b, 0x4e, 0x6f, 0x76, 0x65, 0x6d, 0x62,
-0x65, 0x72, 0x3b, 0x44, 0x69, 0x73, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x3b, 0x4a, 0x3b, 0x46, 0x3b, 0x4d, 0x3b, 0x41, 0x3b,
-0x4d, 0x3b, 0x4a, 0x3b, 0x4a, 0x3b, 0x4f, 0x3b, 0x53, 0x3b, 0x4f, 0x3b, 0x4e, 0x3b, 0x44, 0x3b, 0xd1c, 0xd28, 0xd41, 0x3b,
-0xd2b, 0xd46, 0xd2c, 0xd4d, 0xd30, 0xd41, 0x3b, 0xd2e, 0xd3e, 0xd7c, 0x3b, 0xd0f, 0xd2a, 0xd4d, 0xd30, 0xd3f, 0x3b, 0xd2e, 0xd47, 0xd2f,
-0xd4d, 0x3b, 0xd1c, 0xd42, 0xd7a, 0x3b, 0xd1c, 0xd42, 0xd32, 0xd48, 0x3b, 0xd13, 0xd17, 0x3b, 0xd38, 0xd46, 0xd2a, 0xd4d, 0xd31, 0xd4d,
-0xd31, 0xd02, 0x3b, 0xd12, 0xd15, 0xd4d, 0xd1f, 0xd4b, 0x3b, 0xd28, 0xd35, 0xd02, 0x3b, 0xd21, 0xd3f, 0xd38, 0xd02, 0x3b, 0xd1c, 0xd28,
-0xd41, 0xd35, 0xd30, 0xd3f, 0x3b, 0xd2b, 0xd46, 0xd2c, 0xd4d, 0xd30, 0xd41, 0xd35, 0xd30, 0xd3f, 0x3b, 0xd2e, 0xd3e, 0xd7c, 0xd1a, 0xd4d,
-0xd1a, 0xd4d, 0x3b, 0xd0f, 0xd2a, 0xd4d, 0xd30, 0xd3f, 0xd7d, 0x3b, 0xd2e, 0xd47, 0xd2f, 0xd4d, 0x3b, 0xd1c, 0xd42, 0xd7a, 0x3b, 0xd1c,
-0xd42, 0xd32, 0xd48, 0x3b, 0xd13, 0xd17, 0xd38, 0xd4d, 0xd31, 0xd4d, 0xd31, 0xd4d, 0x3b, 0xd38, 0xd46, 0xd2a, 0xd4d, 0xd31, 0xd4d, 0xd31,
-0xd02, 0xd2c, 0xd7c, 0x3b, 0xd12, 0xd15, 0xd4d, 0x200c, 0xd1f, 0xd4b, 0xd2c, 0xd7c, 0x3b, 0xd28, 0xd35, 0xd02, 0xd2c, 0xd7c, 0x3b, 0xd21,
-0xd3f, 0xd38, 0xd02, 0xd2c, 0xd7c, 0x3b, 0xd1c, 0x3b, 0xd2b, 0xd46, 0x3b, 0xd2e, 0xd3e, 0x3b, 0xd0f, 0x3b, 0xd2e, 0xd46, 0x3b, 0xd1c,
-0xd42, 0xd7a, 0x3b, 0xd1c, 0xd42, 0x3b, 0xd13, 0x3b, 0xd38, 0xd46, 0x3b, 0xd12, 0x3b, 0xd28, 0x3b, 0xd21, 0xd3f, 0x3b, 0x4a, 0x61,
-0x6e, 0x3b, 0x46, 0x72, 0x61, 0x3b, 0x4d, 0x61, 0x72, 0x3b, 0x41, 0x70, 0x72, 0x3b, 0x4d, 0x65, 0x6a, 0x3b, 0x120, 0x75,
-0x6e, 0x3b, 0x4c, 0x75, 0x6c, 0x3b, 0x41, 0x77, 0x77, 0x3b, 0x53, 0x65, 0x74, 0x3b, 0x4f, 0x74, 0x74, 0x3b, 0x4e, 0x6f,
-0x76, 0x3b, 0x44, 0x69, 0x10b, 0x3b, 0x4a, 0x61, 0x6e, 0x6e, 0x61, 0x72, 0x3b, 0x46, 0x72, 0x61, 0x72, 0x3b, 0x4d, 0x61,
-0x72, 0x7a, 0x75, 0x3b, 0x41, 0x70, 0x72, 0x69, 0x6c, 0x3b, 0x4d, 0x65, 0x6a, 0x6a, 0x75, 0x3b, 0x120, 0x75, 0x6e, 0x6a,
-0x75, 0x3b, 0x4c, 0x75, 0x6c, 0x6a, 0x75, 0x3b, 0x41, 0x77, 0x77, 0x69, 0x73, 0x73, 0x75, 0x3b, 0x53, 0x65, 0x74, 0x74,
-0x65, 0x6d, 0x62, 0x72, 0x75, 0x3b, 0x4f, 0x74, 0x74, 0x75, 0x62, 0x72, 0x75, 0x3b, 0x4e, 0x6f, 0x76, 0x65, 0x6d, 0x62,
-0x72, 0x75, 0x3b, 0x44, 0x69, 0x10b, 0x65, 0x6d, 0x62, 0x72, 0x75, 0x3b, 0x4a, 0x6e, 0x3b, 0x46, 0x72, 0x3b, 0x4d, 0x7a,
-0x3b, 0x41, 0x70, 0x3b, 0x4d, 0x6a, 0x3b, 0x120, 0x6e, 0x3b, 0x4c, 0x6a, 0x3b, 0x41, 0x77, 0x3b, 0x53, 0x74, 0x3b, 0x4f,
-0x62, 0x3b, 0x4e, 0x76, 0x3b, 0x44, 0x10b, 0x3b, 0x4a, 0x3b, 0x46, 0x3b, 0x4d, 0x3b, 0x41, 0x3b, 0x4d, 0x3b, 0x120, 0x3b,
-0x4c, 0x3b, 0x41, 0x3b, 0x53, 0x3b, 0x4f, 0x3b, 0x4e, 0x3b, 0x44, 0x3b, 0x4b, 0x6f, 0x68, 0x69, 0x3b, 0x48, 0x75, 0x69,
-0x3b, 0x50, 0x6f, 0x75, 0x3b, 0x50, 0x61, 0x65, 0x3b, 0x48, 0x61, 0x72, 0x61, 0x3b, 0x50, 0x69, 0x70, 0x69, 0x3b, 0x48,
-0x14d, 0x6e, 0x67, 0x6f, 0x3b, 0x48, 0x65, 0x72, 0x65, 0x3b, 0x4d, 0x61, 0x68, 0x75, 0x3b, 0x4e, 0x75, 0x6b, 0x75, 0x3b,
-0x52, 0x61, 0x6e, 0x67, 0x69, 0x3b, 0x48, 0x61, 0x6b, 0x69, 0x3b, 0x4b, 0x6f, 0x68, 0x69, 0x74, 0x101, 0x74, 0x65, 0x61,
-0x3b, 0x48, 0x75, 0x69, 0x74, 0x61, 0x6e, 0x67, 0x75, 0x72, 0x75, 0x3b, 0x50, 0x6f, 0x75, 0x74, 0x16b, 0x74, 0x65, 0x72,
-0x61, 0x6e, 0x67, 0x69, 0x3b, 0x50, 0x61, 0x65, 0x6e, 0x67, 0x61, 0x77, 0x68, 0x101, 0x77, 0x68, 0x101, 0x3b, 0x48, 0x61,
-0x72, 0x61, 0x74, 0x75, 0x61, 0x3b, 0x50, 0x69, 0x70, 0x69, 0x72, 0x69, 0x3b, 0x48, 0x14d, 0x6e, 0x67, 0x6f, 0x6e, 0x67,
-0x6f, 0x69, 0x3b, 0x48, 0x65, 0x72, 0x65, 0x74, 0x75, 0x72, 0x69, 0x6b, 0x14d, 0x6b, 0x101, 0x3b, 0x4d, 0x61, 0x68, 0x75,
-0x72, 0x75, 0x3b, 0x57, 0x68, 0x69, 0x72, 0x69, 0x6e, 0x67, 0x61, 0x2d, 0x101, 0x2d, 0x6e, 0x75, 0x6b, 0x75, 0x3b, 0x57,
-0x68, 0x69, 0x72, 0x69, 0x6e, 0x67, 0x61, 0x2d, 0x101, 0x2d, 0x72, 0x61, 0x6e, 0x67, 0x69, 0x3b, 0x48, 0x61, 0x6b, 0x69,
-0x68, 0x65, 0x61, 0x3b, 0x4b, 0x3b, 0x48, 0x3b, 0x50, 0x3b, 0x50, 0x3b, 0x48, 0x3b, 0x50, 0x3b, 0x48, 0x3b, 0x48, 0x3b,
-0x4d, 0x3b, 0x4e, 0x3b, 0x52, 0x3b, 0x48, 0x3b, 0x91c, 0x93e, 0x928, 0x947, 0x3b, 0x92b, 0x947, 0x92c, 0x94d, 0x930, 0x941, 0x3b,
-0x92e, 0x93e, 0x930, 0x94d, 0x91a, 0x3b, 0x90f, 0x92a, 0x94d, 0x930, 0x93f, 0x3b, 0x92e, 0x947, 0x3b, 0x91c, 0x942, 0x928, 0x3b, 0x91c,
-0x941, 0x932, 0x948, 0x3b, 0x911, 0x917, 0x3b, 0x938, 0x92a, 0x94d, 0x91f, 0x947, 0x902, 0x3b, 0x911, 0x915, 0x94d, 0x91f, 0x94b, 0x3b,
-0x928, 0x94b, 0x935, 0x94d, 0x939, 0x947, 0x902, 0x3b, 0x921, 0x93f, 0x938, 0x947, 0x902, 0x3b, 0x91c, 0x93e, 0x928, 0x947, 0x935, 0x93e,
-0x930, 0x940, 0x3b, 0x92b, 0x947, 0x92c, 0x94d, 0x930, 0x941, 0x935, 0x93e, 0x930, 0x940, 0x3b, 0x92e, 0x93e, 0x930, 0x94d, 0x91a, 0x3b,
-0x90f, 0x92a, 0x94d, 0x930, 0x93f, 0x932, 0x3b, 0x92e, 0x947, 0x3b, 0x91c, 0x942, 0x928, 0x3b, 0x91c, 0x941, 0x932, 0x948, 0x3b, 0x911,
-0x917, 0x938, 0x94d, 0x91f, 0x3b, 0x938, 0x92a, 0x94d, 0x91f, 0x947, 0x902, 0x92c, 0x930, 0x3b, 0x911, 0x915, 0x94d, 0x91f, 0x94b, 0x92c,
-0x930, 0x3b, 0x928, 0x94b, 0x935, 0x94d, 0x939, 0x947, 0x902, 0x92c, 0x930, 0x3b, 0x921, 0x93f, 0x938, 0x947, 0x902, 0x92c, 0x930, 0x3b,
-0x91c, 0x93e, 0x3b, 0x92b, 0x947, 0x3b, 0x92e, 0x93e, 0x3b, 0x90f, 0x3b, 0x92e, 0x947, 0x3b, 0x91c, 0x942, 0x3b, 0x91c, 0x941, 0x3b,
-0x911, 0x3b, 0x938, 0x3b, 0x911, 0x3b, 0x928, 0x94b, 0x3b, 0x921, 0x93f, 0x3b, 0x31, 0x2d, 0x440, 0x20, 0x441, 0x430, 0x440, 0x3b,
-0x32, 0x2d, 0x440, 0x20, 0x441, 0x430, 0x440, 0x3b, 0x33, 0x2d, 0x440, 0x20, 0x441, 0x430, 0x440, 0x3b, 0x34, 0x2d, 0x440, 0x20,
-0x441, 0x430, 0x440, 0x3b, 0x35, 0x2d, 0x440, 0x20, 0x441, 0x430, 0x440, 0x3b, 0x36, 0x2d, 0x440, 0x20, 0x441, 0x430, 0x440, 0x3b,
-0x37, 0x2d, 0x440, 0x20, 0x441, 0x430, 0x440, 0x3b, 0x38, 0x2d, 0x440, 0x20, 0x441, 0x430, 0x440, 0x3b, 0x39, 0x2d, 0x440, 0x20,
-0x441, 0x430, 0x440, 0x3b, 0x31, 0x30, 0x2d, 0x440, 0x20, 0x441, 0x430, 0x440, 0x3b, 0x31, 0x31, 0x2d, 0x440, 0x20, 0x441, 0x430,
-0x440, 0x3b, 0x31, 0x32, 0x2d, 0x440, 0x20, 0x441, 0x430, 0x440, 0x3b, 0x41d, 0x44d, 0x433, 0x434, 0x4af, 0x433, 0x44d, 0x44d, 0x440,
-0x20, 0x441, 0x430, 0x440, 0x3b, 0x425, 0x43e, 0x451, 0x440, 0x434, 0x443, 0x433, 0x430, 0x430, 0x440, 0x20, 0x441, 0x430, 0x440, 0x3b,
-0x413, 0x443, 0x440, 0x430, 0x432, 0x434, 0x443, 0x433, 0x430, 0x430, 0x440, 0x20, 0x441, 0x430, 0x440, 0x3b, 0x414, 0x4e9, 0x440, 0x4e9,
-0x432, 0x434, 0x4af, 0x433, 0x44d, 0x44d, 0x440, 0x20, 0x441, 0x430, 0x440, 0x3b, 0x422, 0x430, 0x432, 0x434, 0x443, 0x433, 0x430, 0x430,
-0x440, 0x20, 0x441, 0x430, 0x440, 0x3b, 0x417, 0x443, 0x440, 0x433, 0x430, 0x430, 0x434, 0x443, 0x433, 0x430, 0x430, 0x440, 0x20, 0x441,
-0x430, 0x440, 0x3b, 0x414, 0x43e, 0x43b, 0x43e, 0x43e, 0x434, 0x443, 0x433, 0x430, 0x430, 0x440, 0x20, 0x441, 0x430, 0x440, 0x3b, 0x41d,
-0x430, 0x439, 0x43c, 0x434, 0x443, 0x433, 0x430, 0x430, 0x440, 0x20, 0x441, 0x430, 0x440, 0x3b, 0x415, 0x441, 0x434, 0x4af, 0x433, 0x44d,
-0x44d, 0x440, 0x20, 0x441, 0x430, 0x440, 0x3b, 0x410, 0x440, 0x430, 0x432, 0x434, 0x443, 0x433, 0x430, 0x430, 0x440, 0x20, 0x441, 0x430,
-0x440, 0x3b, 0x410, 0x440, 0x432, 0x430, 0x43d, 0x20, 0x43d, 0x44d, 0x433, 0x434, 0x4af, 0x433, 0x44d, 0x44d, 0x440, 0x20, 0x441, 0x430,
-0x440, 0x3b, 0x410, 0x440, 0x432, 0x430, 0x43d, 0x20, 0x445, 0x43e, 0x451, 0x440, 0x434, 0x443, 0x433, 0x430, 0x430, 0x440, 0x20, 0x441,
-0x430, 0x440, 0x3b, 0x49, 0x3b, 0x49, 0x49, 0x3b, 0x49, 0x49, 0x49, 0x3b, 0x49, 0x56, 0x3b, 0x56, 0x3b, 0x56, 0x49, 0x3b,
-0x56, 0x49, 0x49, 0x3b, 0x56, 0x49, 0x49, 0x49, 0x3b, 0x49, 0x58, 0x3b, 0x58, 0x3b, 0x58, 0x49, 0x3b, 0x58, 0x49, 0x49,
-0x3b, 0x43d, 0x44d, 0x433, 0x434, 0x4af, 0x433, 0x44d, 0x44d, 0x440, 0x20, 0x441, 0x430, 0x440, 0x3b, 0x445, 0x43e, 0x451, 0x440, 0x434,
-0x443, 0x433, 0x430, 0x430, 0x440, 0x20, 0x441, 0x430, 0x440, 0x3b, 0x433, 0x443, 0x440, 0x430, 0x432, 0x434, 0x443, 0x433, 0x430, 0x430,
-0x440, 0x20, 0x441, 0x430, 0x440, 0x3b, 0x434, 0x4e9, 0x440, 0x4e9, 0x432, 0x434, 0x4af, 0x433, 0x44d, 0x44d, 0x440, 0x20, 0x441, 0x430,
-0x440, 0x3b, 0x442, 0x430, 0x432, 0x434, 0x443, 0x433, 0x430, 0x430, 0x440, 0x20, 0x441, 0x430, 0x440, 0x3b, 0x437, 0x443, 0x440, 0x433,
-0x430, 0x430, 0x434, 0x443, 0x433, 0x430, 0x430, 0x440, 0x20, 0x441, 0x430, 0x440, 0x3b, 0x434, 0x43e, 0x43b, 0x43e, 0x43e, 0x434, 0x443,
-0x433, 0x430, 0x430, 0x440, 0x20, 0x441, 0x430, 0x440, 0x3b, 0x43d, 0x430, 0x439, 0x43c, 0x434, 0x443, 0x433, 0x430, 0x430, 0x440, 0x20,
-0x441, 0x430, 0x440, 0x3b, 0x435, 0x441, 0x434, 0x4af, 0x433, 0x44d, 0x44d, 0x440, 0x20, 0x441, 0x430, 0x440, 0x3b, 0x430, 0x440, 0x430,
-0x432, 0x434, 0x443, 0x433, 0x430, 0x430, 0x440, 0x20, 0x441, 0x430, 0x440, 0x3b, 0x430, 0x440, 0x432, 0x430, 0x43d, 0x20, 0x43d, 0x44d,
-0x433, 0x434, 0x4af, 0x433, 0x44d, 0x44d, 0x440, 0x20, 0x441, 0x430, 0x440, 0x3b, 0x430, 0x440, 0x432, 0x430, 0x43d, 0x20, 0x445, 0x43e,
-0x451, 0x440, 0x434, 0x443, 0x433, 0x430, 0x430, 0x440, 0x20, 0x441, 0x430, 0x440, 0x3b, 0x91c, 0x928, 0x935, 0x930, 0x940, 0x3b, 0x92b,
-0x947, 0x92c, 0x94d, 0x930, 0x941, 0x905, 0x930, 0x940, 0x3b, 0x92e, 0x93e, 0x930, 0x94d, 0x91a, 0x3b, 0x905, 0x92a, 0x94d, 0x930, 0x93f,
-0x932, 0x3b, 0x92e, 0x947, 0x3b, 0x91c, 0x941, 0x928, 0x3b, 0x91c, 0x941, 0x932, 0x93e, 0x908, 0x3b, 0x905, 0x917, 0x938, 0x94d, 0x91f,
-0x3b, 0x938, 0x947, 0x92a, 0x94d, 0x91f, 0x947, 0x92e, 0x94d, 0x92c, 0x930, 0x3b, 0x905, 0x915, 0x94d, 0x91f, 0x94b, 0x92c, 0x930, 0x3b,
-0x928, 0x94b, 0x92d, 0x947, 0x92e, 0x94d, 0x92c, 0x930, 0x3b, 0x921, 0x93f, 0x938, 0x947, 0x92e, 0x94d, 0x92c, 0x930, 0x3b, 0x91c, 0x928,
-0x3b, 0x92b, 0x947, 0x947, 0x92c, 0x3b, 0x92e, 0x93e, 0x930, 0x94d, 0x91a, 0x3b, 0x905, 0x92a, 0x94d, 0x930, 0x3b, 0x92e, 0x947, 0x3b,
-0x91c, 0x941, 0x928, 0x3b, 0x91c, 0x941, 0x932, 0x3b, 0x905, 0x917, 0x3b, 0x938, 0x947, 0x92a, 0x3b, 0x905, 0x915, 0x94d, 0x91f, 0x94b,
-0x3b, 0x928, 0x94b, 0x92d, 0x947, 0x3b, 0x921, 0x93f, 0x938, 0x947, 0x3b, 0x91c, 0x928, 0x3b, 0x92b, 0x947, 0x92c, 0x3b, 0x92e, 0x93e,
-0x930, 0x94d, 0x91a, 0x3b, 0x905, 0x92a, 0x94d, 0x930, 0x3b, 0x92e, 0x947, 0x3b, 0x91c, 0x941, 0x928, 0x3b, 0x91c, 0x941, 0x932, 0x3b,
-0x905, 0x917, 0x3b, 0x938, 0x947, 0x92a, 0x3b, 0x905, 0x915, 0x94d, 0x91f, 0x94b, 0x3b, 0x928, 0x94b, 0x92d, 0x947, 0x3b, 0x921, 0x93f,
-0x938, 0x947, 0x3b, 0x6a, 0x61, 0x6e, 0x75, 0x61, 0x72, 0x3b, 0x66, 0x65, 0x62, 0x72, 0x75, 0x61, 0x72, 0x3b, 0x6d, 0x61,
-0x72, 0x73, 0x3b, 0x61, 0x70, 0x72, 0x69, 0x6c, 0x3b, 0x6d, 0x61, 0x69, 0x3b, 0x6a, 0x75, 0x6e, 0x69, 0x3b, 0x6a, 0x75,
-0x6c, 0x69, 0x3b, 0x61, 0x75, 0x67, 0x75, 0x73, 0x74, 0x3b, 0x73, 0x65, 0x70, 0x74, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x3b,
-0x6f, 0x6b, 0x74, 0x6f, 0x62, 0x65, 0x72, 0x3b, 0x6e, 0x6f, 0x76, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x3b, 0x64, 0x65, 0x73,
-0x65, 0x6d, 0x62, 0x65, 0x72, 0x3b, 0xb1c, 0xb3e, 0xb28, 0xb41, 0xb06, 0xb30, 0xb40, 0x3b, 0xb2b, 0xb47, 0xb2c, 0xb43, 0xb06, 0xb30,
-0xb40, 0x3b, 0xb2e, 0xb3e, 0xb30, 0xb4d, 0xb1a, 0xb4d, 0xb1a, 0x3b, 0xb05, 0xb2a, 0xb4d, 0xb30, 0xb47, 0xb32, 0x3b, 0xb2e, 0xb07, 0x3b,
-0xb1c, 0xb41, 0xb28, 0x3b, 0xb1c, 0xb41, 0xb32, 0xb3e, 0xb07, 0x3b, 0xb05, 0xb17, 0xb37, 0xb4d, 0xb1f, 0x3b, 0xb38, 0xb47, 0xb2a, 0xb4d,
-0xb1f, 0xb47, 0xb2e, 0xb4d, 0xb2c, 0xb30, 0x3b, 0xb05, 0xb15, 0xb4d, 0xb1f, 0xb4b, 0xb2c, 0xb30, 0x3b, 0xb28, 0xb2d, 0xb47, 0xb2e, 0xb4d,
-0xb2c, 0xb30, 0x3b, 0xb21, 0xb3f, 0xb38, 0xb47, 0xb2e, 0xb4d, 0xb2c, 0xb30, 0x3b, 0xb1c, 0xb3e, 0x3b, 0xb2b, 0xb47, 0x3b, 0xb2e, 0xb3e,
-0x3b, 0xb05, 0x3b, 0xb2e, 0xb07, 0x3b, 0xb1c, 0xb41, 0x3b, 0xb1c, 0xb41, 0x3b, 0xb05, 0x3b, 0xb38, 0xb47, 0x3b, 0xb05, 0x3b, 0xb28,
-0x3b, 0xb21, 0xb3f, 0x3b, 0x62c, 0x646, 0x648, 0x631, 0x64a, 0x3b, 0x641, 0x628, 0x631, 0x648, 0x631, 0x64a, 0x3b, 0x645, 0x627, 0x631,
-0x686, 0x3b, 0x627, 0x67e, 0x631, 0x6cc, 0x644, 0x3b, 0x645, 0x6cd, 0x3b, 0x62c, 0x648, 0x646, 0x3b, 0x62c, 0x648, 0x644, 0x627, 0x6cc,
-0x3b, 0x627, 0x6af, 0x633, 0x62a, 0x3b, 0x633, 0x67e, 0x62a, 0x645, 0x628, 0x631, 0x3b, 0x627, 0x6a9, 0x62a, 0x648, 0x628, 0x631, 0x3b,
-0x646, 0x648, 0x645, 0x628, 0x631, 0x3b, 0x62f, 0x633, 0x645, 0x628, 0x631, 0x3b, 0x62c, 0x646, 0x648, 0x631, 0x64a, 0x3b, 0x641, 0x6d0,
-0x628, 0x631, 0x648, 0x631, 0x64a, 0x3b, 0x645, 0x627, 0x631, 0x686, 0x3b, 0x627, 0x67e, 0x631, 0x6cc, 0x644, 0x3b, 0x645, 0x6cd, 0x3b,
-0x62c, 0x648, 0x646, 0x3b, 0x62c, 0x648, 0x644, 0x627, 0x6cc, 0x3b, 0x627, 0x6af, 0x633, 0x62a, 0x3b, 0x633, 0x67e, 0x62a, 0x645, 0x628,
-0x631, 0x3b, 0x627, 0x6a9, 0x62a, 0x648, 0x628, 0x631, 0x3b, 0x646, 0x648, 0x645, 0x628, 0x631, 0x3b, 0x62f, 0x633, 0x645, 0x628, 0x631,
-0x3b, 0x62c, 0x646, 0x648, 0x631, 0x64a, 0x3b, 0x641, 0x628, 0x631, 0x648, 0x631, 0x64a, 0x3b, 0x645, 0x627, 0x631, 0x686, 0x3b, 0x627,
-0x67e, 0x631, 0x6cc, 0x644, 0x3b, 0x645, 0x6cd, 0x3b, 0x62c, 0x648, 0x646, 0x3b, 0x62c, 0x648, 0x644, 0x627, 0x6cc, 0x3b, 0x627, 0x6af,
-0x633, 0x62a, 0x3b, 0x633, 0x6d0, 0x67e, 0x62a, 0x645, 0x628, 0x631, 0x3b, 0x627, 0x6a9, 0x62a, 0x648, 0x628, 0x631, 0x3b, 0x646, 0x648,
-0x645, 0x628, 0x631, 0x3b, 0x62f, 0x633, 0x645, 0x628, 0x631, 0x3b, 0x62c, 0x3b, 0x641, 0x3b, 0x645, 0x3b, 0x627, 0x3b, 0x645, 0x3b,
-0x62c, 0x3b, 0x62c, 0x3b, 0x627, 0x3b, 0x633, 0x3b, 0x627, 0x3b, 0x646, 0x3b, 0x62f, 0x3b, 0x698, 0x627, 0x646, 0x648, 0x6cc, 0x647,
-0x3b, 0x641, 0x648, 0x631, 0x6cc, 0x647, 0x3b, 0x645, 0x627, 0x631, 0x633, 0x3b, 0x622, 0x648, 0x631, 0x6cc, 0x644, 0x3b, 0x645, 0x647,
-0x3b, 0x698, 0x648, 0x626, 0x646, 0x3b, 0x698, 0x648, 0x626, 0x6cc, 0x647, 0x3b, 0x627, 0x648, 0x62a, 0x3b, 0x633, 0x67e, 0x62a, 0x627,
-0x645, 0x628, 0x631, 0x3b, 0x627, 0x6a9, 0x62a, 0x628, 0x631, 0x3b, 0x646, 0x648, 0x627, 0x645, 0x628, 0x631, 0x3b, 0x62f, 0x633, 0x627,
-0x645, 0x628, 0x631, 0x3b, 0x698, 0x3b, 0x641, 0x3b, 0x645, 0x3b, 0x622, 0x3b, 0x645, 0x3b, 0x698, 0x3b, 0x698, 0x3b, 0x627, 0x3b,
-0x633, 0x3b, 0x627, 0x3b, 0x646, 0x3b, 0x62f, 0x3b, 0x698, 0x627, 0x646, 0x648, 0x6cc, 0x647, 0x654, 0x3b, 0x641, 0x648, 0x631, 0x6cc,
-0x647, 0x654, 0x3b, 0x645, 0x627, 0x631, 0x633, 0x3b, 0x622, 0x648, 0x631, 0x6cc, 0x644, 0x3b, 0x645, 0x647, 0x654, 0x3b, 0x698, 0x648,
-0x626, 0x646, 0x3b, 0x698, 0x648, 0x626, 0x6cc, 0x647, 0x654, 0x3b, 0x627, 0x648, 0x62a, 0x3b, 0x633, 0x67e, 0x62a, 0x627, 0x645, 0x628,
-0x631, 0x3b, 0x627, 0x6a9, 0x62a, 0x628, 0x631, 0x3b, 0x646, 0x648, 0x627, 0x645, 0x628, 0x631, 0x3b, 0x62f, 0x633, 0x627, 0x645, 0x628,
-0x631, 0x3b, 0x62c, 0x646, 0x648, 0x631, 0x6cc, 0x3b, 0x641, 0x628, 0x631, 0x648, 0x631, 0x6cc, 0x3b, 0x645, 0x627, 0x631, 0x686, 0x3b,
-0x627, 0x67e, 0x631, 0x6cc, 0x644, 0x3b, 0x645, 0x6cc, 0x3b, 0x62c, 0x648, 0x646, 0x3b, 0x62c, 0x648, 0x644, 0x627, 0x6cc, 0x3b, 0x627,
-0x6af, 0x633, 0x62a, 0x3b, 0x633, 0x67e, 0x62a, 0x645, 0x628, 0x631, 0x3b, 0x627, 0x6a9, 0x62a, 0x648, 0x628, 0x631, 0x3b, 0x646, 0x648,
-0x645, 0x628, 0x631, 0x3b, 0x62f, 0x633, 0x645, 0x628, 0x631, 0x3b, 0x62c, 0x646, 0x648, 0x3b, 0x641, 0x628, 0x631, 0x648, 0x631, 0x6cc,
-0x3b, 0x645, 0x627, 0x631, 0x686, 0x3b, 0x627, 0x67e, 0x631, 0x6cc, 0x644, 0x3b, 0x645, 0x6cc, 0x3b, 0x62c, 0x648, 0x646, 0x3b, 0x62c,
-0x648, 0x644, 0x3b, 0x627, 0x6af, 0x633, 0x62a, 0x3b, 0x633, 0x67e, 0x62a, 0x645, 0x628, 0x631, 0x3b, 0x627, 0x6a9, 0x62a, 0x648, 0x628,
-0x631, 0x3b, 0x646, 0x648, 0x645, 0x628, 0x631, 0x3b, 0x62f, 0x633, 0x645, 0x3b, 0x73, 0x74, 0x79, 0x3b, 0x6c, 0x75, 0x74, 0x3b,
-0x6d, 0x61, 0x72, 0x3b, 0x6b, 0x77, 0x69, 0x3b, 0x6d, 0x61, 0x6a, 0x3b, 0x63, 0x7a, 0x65, 0x3b, 0x6c, 0x69, 0x70, 0x3b,
-0x73, 0x69, 0x65, 0x3b, 0x77, 0x72, 0x7a, 0x3b, 0x70, 0x61, 0x17a, 0x3b, 0x6c, 0x69, 0x73, 0x3b, 0x67, 0x72, 0x75, 0x3b,
-0x73, 0x74, 0x79, 0x63, 0x7a, 0x65, 0x144, 0x3b, 0x6c, 0x75, 0x74, 0x79, 0x3b, 0x6d, 0x61, 0x72, 0x7a, 0x65, 0x63, 0x3b,
-0x6b, 0x77, 0x69, 0x65, 0x63, 0x69, 0x65, 0x144, 0x3b, 0x6d, 0x61, 0x6a, 0x3b, 0x63, 0x7a, 0x65, 0x72, 0x77, 0x69, 0x65,
-0x63, 0x3b, 0x6c, 0x69, 0x70, 0x69, 0x65, 0x63, 0x3b, 0x73, 0x69, 0x65, 0x72, 0x70, 0x69, 0x65, 0x144, 0x3b, 0x77, 0x72,
-0x7a, 0x65, 0x73, 0x69, 0x65, 0x144, 0x3b, 0x70, 0x61, 0x17a, 0x64, 0x7a, 0x69, 0x65, 0x72, 0x6e, 0x69, 0x6b, 0x3b, 0x6c,
-0x69, 0x73, 0x74, 0x6f, 0x70, 0x61, 0x64, 0x3b, 0x67, 0x72, 0x75, 0x64, 0x7a, 0x69, 0x65, 0x144, 0x3b, 0x53, 0x3b, 0x4c,
-0x3b, 0x4d, 0x3b, 0x4b, 0x3b, 0x4d, 0x3b, 0x43, 0x3b, 0x4c, 0x3b, 0x53, 0x3b, 0x57, 0x3b, 0x50, 0x3b, 0x4c, 0x3b, 0x47,
-0x3b, 0x73, 0x74, 0x79, 0x63, 0x7a, 0x6e, 0x69, 0x61, 0x3b, 0x6c, 0x75, 0x74, 0x65, 0x67, 0x6f, 0x3b, 0x6d, 0x61, 0x72,
-0x63, 0x61, 0x3b, 0x6b, 0x77, 0x69, 0x65, 0x74, 0x6e, 0x69, 0x61, 0x3b, 0x6d, 0x61, 0x6a, 0x61, 0x3b, 0x63, 0x7a, 0x65,
-0x72, 0x77, 0x63, 0x61, 0x3b, 0x6c, 0x69, 0x70, 0x63, 0x61, 0x3b, 0x73, 0x69, 0x65, 0x72, 0x70, 0x6e, 0x69, 0x61, 0x3b,
-0x77, 0x72, 0x7a, 0x65, 0x15b, 0x6e, 0x69, 0x61, 0x3b, 0x70, 0x61, 0x17a, 0x64, 0x7a, 0x69, 0x65, 0x72, 0x6e, 0x69, 0x6b,
-0x61, 0x3b, 0x6c, 0x69, 0x73, 0x74, 0x6f, 0x70, 0x61, 0x64, 0x61, 0x3b, 0x67, 0x72, 0x75, 0x64, 0x6e, 0x69, 0x61, 0x3b,
-0x73, 0x3b, 0x6c, 0x3b, 0x6d, 0x3b, 0x6b, 0x3b, 0x6d, 0x3b, 0x63, 0x3b, 0x6c, 0x3b, 0x73, 0x3b, 0x77, 0x3b, 0x70, 0x3b,
-0x6c, 0x3b, 0x67, 0x3b, 0x6a, 0x61, 0x6e, 0x3b, 0x66, 0x65, 0x76, 0x3b, 0x6d, 0x61, 0x72, 0x3b, 0x61, 0x62, 0x72, 0x3b,
-0x6d, 0x61, 0x69, 0x3b, 0x6a, 0x75, 0x6e, 0x3b, 0x6a, 0x75, 0x6c, 0x3b, 0x61, 0x67, 0x6f, 0x3b, 0x73, 0x65, 0x74, 0x3b,
-0x6f, 0x75, 0x74, 0x3b, 0x6e, 0x6f, 0x76, 0x3b, 0x64, 0x65, 0x7a, 0x3b, 0x6a, 0x61, 0x6e, 0x65, 0x69, 0x72, 0x6f, 0x3b,
-0x66, 0x65, 0x76, 0x65, 0x72, 0x65, 0x69, 0x72, 0x6f, 0x3b, 0x6d, 0x61, 0x72, 0xe7, 0x6f, 0x3b, 0x61, 0x62, 0x72, 0x69,
-0x6c, 0x3b, 0x6d, 0x61, 0x69, 0x6f, 0x3b, 0x6a, 0x75, 0x6e, 0x68, 0x6f, 0x3b, 0x6a, 0x75, 0x6c, 0x68, 0x6f, 0x3b, 0x61,
-0x67, 0x6f, 0x73, 0x74, 0x6f, 0x3b, 0x73, 0x65, 0x74, 0x65, 0x6d, 0x62, 0x72, 0x6f, 0x3b, 0x6f, 0x75, 0x74, 0x75, 0x62,
-0x72, 0x6f, 0x3b, 0x6e, 0x6f, 0x76, 0x65, 0x6d, 0x62, 0x72, 0x6f, 0x3b, 0x64, 0x65, 0x7a, 0x65, 0x6d, 0x62, 0x72, 0x6f,
-0x3b, 0xa1c, 0xa28, 0x3b, 0xa2b, 0xa3c, 0xa30, 0x3b, 0xa2e, 0xa3e, 0xa30, 0xa1a, 0x3b, 0xa05, 0xa2a, 0xa4d, 0xa30, 0xa48, 0x3b, 0xa2e,
-0xa08, 0x3b, 0xa1c, 0xa42, 0xa28, 0x3b, 0xa1c, 0xa41, 0xa32, 0xa3e, 0x3b, 0xa05, 0xa17, 0x3b, 0xa38, 0xa24, 0xa70, 0x3b, 0xa05, 0xa15,
-0xa24, 0xa42, 0x3b, 0xa28, 0xa35, 0xa70, 0x3b, 0xa26, 0xa38, 0xa70, 0x3b, 0xa1c, 0xa28, 0xa35, 0xa30, 0xa40, 0x3b, 0xa2b, 0xa3c, 0xa30,
-0xa35, 0xa30, 0xa40, 0x3b, 0xa2e, 0xa3e, 0xa30, 0xa1a, 0x3b, 0xa05, 0xa2a, 0xa4d, 0xa30, 0xa48, 0xa32, 0x3b, 0xa2e, 0xa08, 0x3b, 0xa1c,
-0xa42, 0xa28, 0x3b, 0xa1c, 0xa41, 0xa32, 0xa3e, 0xa08, 0x3b, 0xa05, 0xa17, 0xa38, 0xa24, 0x3b, 0xa38, 0xa24, 0xa70, 0xa2c, 0xa30, 0x3b,
-0xa05, 0xa15, 0xa24, 0xa42, 0xa2c, 0xa30, 0x3b, 0xa28, 0xa35, 0xa70, 0xa2c, 0xa30, 0x3b, 0xa26, 0xa38, 0xa70, 0xa2c, 0xa30, 0x3b, 0xa1c,
-0x3b, 0xa2b, 0xa3c, 0x3b, 0xa2e, 0xa3e, 0x3b, 0xa05, 0x3b, 0xa2e, 0x3b, 0xa1c, 0xa42, 0x3b, 0xa1c, 0xa41, 0x3b, 0xa05, 0x3b, 0xa38,
-0x3b, 0xa05, 0x3b, 0xa28, 0x3b, 0xa26, 0x3b, 0x62c, 0x646, 0x648, 0x631, 0x6cc, 0x3b, 0x641, 0x631, 0x648, 0x631, 0x6cc, 0x3b, 0x645,
-0x627, 0x631, 0x686, 0x3b, 0x627, 0x67e, 0x631, 0x6cc, 0x644, 0x3b, 0x645, 0x626, 0x3b, 0x62c, 0x648, 0x646, 0x3b, 0x62c, 0x648, 0x644,
-0x627, 0x626, 0x6cc, 0x3b, 0x627, 0x6af, 0x633, 0x62a, 0x3b, 0x633, 0x62a, 0x645, 0x628, 0x631, 0x3b, 0x627, 0x6a9, 0x62a, 0x648, 0x628,
-0x631, 0x3b, 0x646, 0x648, 0x645, 0x628, 0x631, 0x3b, 0x62f, 0x633, 0x645, 0x628, 0x631, 0x3b, 0x45, 0x6e, 0x65, 0x3b, 0x46, 0x65,
-0x62, 0x3b, 0x4d, 0x61, 0x72, 0x3b, 0x41, 0x62, 0x72, 0x3b, 0x4d, 0x61, 0x79, 0x3b, 0x4a, 0x75, 0x6e, 0x3b, 0x4a, 0x75,
-0x6c, 0x3b, 0x41, 0x67, 0x6f, 0x3b, 0x53, 0x65, 0x74, 0x3b, 0x4f, 0x63, 0x74, 0x3b, 0x4e, 0x6f, 0x76, 0x3b, 0x44, 0x69,
-0x63, 0x3b, 0x45, 0x6e, 0x65, 0x72, 0x6f, 0x3b, 0x46, 0x65, 0x62, 0x72, 0x65, 0x72, 0x6f, 0x3b, 0x4d, 0x61, 0x72, 0x7a,
-0x6f, 0x3b, 0x41, 0x62, 0x72, 0x69, 0x6c, 0x3b, 0x4d, 0x61, 0x79, 0x6f, 0x3b, 0x4a, 0x75, 0x6e, 0x69, 0x6f, 0x3b, 0x4a,
-0x75, 0x6c, 0x69, 0x6f, 0x3b, 0x41, 0x67, 0x6f, 0x73, 0x74, 0x6f, 0x3b, 0x53, 0x65, 0x74, 0x69, 0x65, 0x6d, 0x62, 0x72,
-0x65, 0x3b, 0x4f, 0x63, 0x74, 0x75, 0x62, 0x72, 0x65, 0x3b, 0x4e, 0x6f, 0x76, 0x69, 0x65, 0x6d, 0x62, 0x72, 0x65, 0x3b,
-0x44, 0x69, 0x63, 0x69, 0x65, 0x6d, 0x62, 0x72, 0x65, 0x3b, 0x73, 0x63, 0x68, 0x61, 0x6e, 0x2e, 0x3b, 0x66, 0x61, 0x76,
-0x72, 0x2e, 0x3b, 0x6d, 0x61, 0x72, 0x73, 0x3b, 0x61, 0x76, 0x72, 0x2e, 0x3b, 0x6d, 0x61, 0x74, 0x67, 0x3b, 0x7a, 0x65,
-0x72, 0x63, 0x6c, 0x2e, 0x3b, 0x66, 0x61, 0x6e, 0x2e, 0x3b, 0x61, 0x76, 0x75, 0x73, 0x74, 0x3b, 0x73, 0x65, 0x74, 0x74,
-0x2e, 0x3b, 0x6f, 0x63, 0x74, 0x2e, 0x3b, 0x6e, 0x6f, 0x76, 0x2e, 0x3b, 0x64, 0x65, 0x63, 0x2e, 0x3b, 0x73, 0x63, 0x68,
-0x61, 0x6e, 0x65, 0x72, 0x3b, 0x66, 0x61, 0x76, 0x72, 0x65, 0x72, 0x3b, 0x6d, 0x61, 0x72, 0x73, 0x3b, 0x61, 0x76, 0x72,
-0x69, 0x67, 0x6c, 0x3b, 0x6d, 0x61, 0x74, 0x67, 0x3b, 0x7a, 0x65, 0x72, 0x63, 0x6c, 0x61, 0x64, 0x75, 0x72, 0x3b, 0x66,
-0x61, 0x6e, 0x61, 0x64, 0x75, 0x72, 0x3b, 0x61, 0x76, 0x75, 0x73, 0x74, 0x3b, 0x73, 0x65, 0x74, 0x74, 0x65, 0x6d, 0x62,
-0x65, 0x72, 0x3b, 0x6f, 0x63, 0x74, 0x6f, 0x62, 0x65, 0x72, 0x3b, 0x6e, 0x6f, 0x76, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x3b,
-0x64, 0x65, 0x63, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x3b, 0x53, 0x3b, 0x46, 0x3b, 0x4d, 0x3b, 0x41, 0x3b, 0x4d, 0x3b, 0x5a,
-0x3b, 0x46, 0x3b, 0x41, 0x3b, 0x53, 0x3b, 0x4f, 0x3b, 0x4e, 0x3b, 0x44, 0x3b, 0x69, 0x61, 0x6e, 0x2e, 0x3b, 0x66, 0x65,
-0x62, 0x2e, 0x3b, 0x6d, 0x61, 0x72, 0x2e, 0x3b, 0x61, 0x70, 0x72, 0x2e, 0x3b, 0x6d, 0x61, 0x69, 0x3b, 0x69, 0x75, 0x6e,
-0x2e, 0x3b, 0x69, 0x75, 0x6c, 0x2e, 0x3b, 0x61, 0x75, 0x67, 0x2e, 0x3b, 0x73, 0x65, 0x70, 0x74, 0x2e, 0x3b, 0x6f, 0x63,
-0x74, 0x2e, 0x3b, 0x6e, 0x6f, 0x76, 0x2e, 0x3b, 0x64, 0x65, 0x63, 0x2e, 0x3b, 0x69, 0x61, 0x6e, 0x75, 0x61, 0x72, 0x69,
-0x65, 0x3b, 0x66, 0x65, 0x62, 0x72, 0x75, 0x61, 0x72, 0x69, 0x65, 0x3b, 0x6d, 0x61, 0x72, 0x74, 0x69, 0x65, 0x3b, 0x61,
-0x70, 0x72, 0x69, 0x6c, 0x69, 0x65, 0x3b, 0x6d, 0x61, 0x69, 0x3b, 0x69, 0x75, 0x6e, 0x69, 0x65, 0x3b, 0x69, 0x75, 0x6c,
-0x69, 0x65, 0x3b, 0x61, 0x75, 0x67, 0x75, 0x73, 0x74, 0x3b, 0x73, 0x65, 0x70, 0x74, 0x65, 0x6d, 0x62, 0x72, 0x69, 0x65,
-0x3b, 0x6f, 0x63, 0x74, 0x6f, 0x6d, 0x62, 0x72, 0x69, 0x65, 0x3b, 0x6e, 0x6f, 0x69, 0x65, 0x6d, 0x62, 0x72, 0x69, 0x65,
-0x3b, 0x64, 0x65, 0x63, 0x65, 0x6d, 0x62, 0x72, 0x69, 0x65, 0x3b, 0x49, 0x3b, 0x46, 0x3b, 0x4d, 0x3b, 0x41, 0x3b, 0x4d,
-0x3b, 0x49, 0x3b, 0x49, 0x3b, 0x41, 0x3b, 0x53, 0x3b, 0x4f, 0x3b, 0x4e, 0x3b, 0x44, 0x3b, 0x44f, 0x43d, 0x432, 0x2e, 0x3b,
-0x444, 0x435, 0x432, 0x440, 0x2e, 0x3b, 0x43c, 0x430, 0x440, 0x442, 0x3b, 0x430, 0x43f, 0x440, 0x2e, 0x3b, 0x43c, 0x430, 0x439, 0x3b,
-0x438, 0x44e, 0x43d, 0x44c, 0x3b, 0x438, 0x44e, 0x43b, 0x44c, 0x3b, 0x430, 0x432, 0x433, 0x2e, 0x3b, 0x441, 0x435, 0x43d, 0x442, 0x2e,
-0x3b, 0x43e, 0x43a, 0x442, 0x2e, 0x3b, 0x43d, 0x43e, 0x44f, 0x431, 0x2e, 0x3b, 0x434, 0x435, 0x43a, 0x2e, 0x3b, 0x44f, 0x43d, 0x432,
-0x2e, 0x3b, 0x444, 0x435, 0x432, 0x440, 0x2e, 0x3b, 0x43c, 0x430, 0x440, 0x2e, 0x3b, 0x430, 0x43f, 0x440, 0x2e, 0x3b, 0x43c, 0x430,
-0x44f, 0x3b, 0x438, 0x44e, 0x43d, 0x2e, 0x3b, 0x438, 0x44e, 0x43b, 0x2e, 0x3b, 0x430, 0x432, 0x433, 0x2e, 0x3b, 0x441, 0x435, 0x43d,
-0x442, 0x2e, 0x3b, 0x43e, 0x43a, 0x442, 0x2e, 0x3b, 0x43d, 0x43e, 0x44f, 0x431, 0x2e, 0x3b, 0x434, 0x435, 0x43a, 0x2e, 0x3b, 0x44f,
-0x43d, 0x432, 0x430, 0x440, 0x44f, 0x3b, 0x444, 0x435, 0x432, 0x440, 0x430, 0x43b, 0x44f, 0x3b, 0x43c, 0x430, 0x440, 0x442, 0x430, 0x3b,
-0x430, 0x43f, 0x440, 0x435, 0x43b, 0x44f, 0x3b, 0x43c, 0x430, 0x44f, 0x3b, 0x438, 0x44e, 0x43d, 0x44f, 0x3b, 0x438, 0x44e, 0x43b, 0x44f,
-0x3b, 0x430, 0x432, 0x433, 0x443, 0x441, 0x442, 0x430, 0x3b, 0x441, 0x435, 0x43d, 0x442, 0x44f, 0x431, 0x440, 0x44f, 0x3b, 0x43e, 0x43a,
-0x442, 0x44f, 0x431, 0x440, 0x44f, 0x3b, 0x43d, 0x43e, 0x44f, 0x431, 0x440, 0x44f, 0x3b, 0x434, 0x435, 0x43a, 0x430, 0x431, 0x440, 0x44f,
-0x3b, 0x4e, 0x79, 0x65, 0x3b, 0x46, 0x75, 0x6c, 0x3b, 0x4d, 0x62, 0xe4, 0x3b, 0x4e, 0x67, 0x75, 0x3b, 0x42, 0xea, 0x6c,
-0x3b, 0x46, 0xf6, 0x6e, 0x3b, 0x4c, 0x65, 0x6e, 0x3b, 0x4b, 0xfc, 0x6b, 0x3b, 0x4d, 0x76, 0x75, 0x3b, 0x4e, 0x67, 0x62,
-0x3b, 0x4e, 0x61, 0x62, 0x3b, 0x4b, 0x61, 0x6b, 0x3b, 0x4e, 0x79, 0x65, 0x6e, 0x79, 0x65, 0x3b, 0x46, 0x75, 0x6c, 0x75,
-0x6e, 0x64, 0xef, 0x67, 0x69, 0x3b, 0x4d, 0x62, 0xe4, 0x6e, 0x67, 0xfc, 0x3b, 0x4e, 0x67, 0x75, 0x62, 0xf9, 0x65, 0x3b,
-0x42, 0xea, 0x6c, 0xe4, 0x77, 0xfc, 0x3b, 0x46, 0xf6, 0x6e, 0x64, 0x6f, 0x3b, 0x4c, 0x65, 0x6e, 0x67, 0x75, 0x61, 0x3b,
-0x4b, 0xfc, 0x6b, 0xfc, 0x72, 0xfc, 0x3b, 0x4d, 0x76, 0x75, 0x6b, 0x61, 0x3b, 0x4e, 0x67, 0x62, 0x65, 0x72, 0x65, 0x72,
-0x65, 0x3b, 0x4e, 0x61, 0x62, 0xe4, 0x6e, 0x64, 0xfc, 0x72, 0x75, 0x3b, 0x4b, 0x61, 0x6b, 0x61, 0x75, 0x6b, 0x61, 0x3b,
-0x4e, 0x3b, 0x46, 0x3b, 0x4d, 0x3b, 0x4e, 0x3b, 0x42, 0x3b, 0x46, 0x3b, 0x4c, 0x3b, 0x4b, 0x3b, 0x4d, 0x3b, 0x4e, 0x3b,
-0x4e, 0x3b, 0x4b, 0x3b, 0x458, 0x430, 0x43d, 0x3b, 0x444, 0x435, 0x431, 0x3b, 0x43c, 0x430, 0x440, 0x3b, 0x430, 0x43f, 0x440, 0x3b,
-0x43c, 0x430, 0x458, 0x3b, 0x458, 0x443, 0x43d, 0x3b, 0x458, 0x443, 0x43b, 0x3b, 0x430, 0x432, 0x433, 0x3b, 0x441, 0x435, 0x43f, 0x3b,
-0x43e, 0x43a, 0x442, 0x3b, 0x43d, 0x43e, 0x432, 0x3b, 0x434, 0x435, 0x446, 0x3b, 0x458, 0x430, 0x43d, 0x443, 0x430, 0x440, 0x3b, 0x444,
-0x435, 0x431, 0x440, 0x443, 0x430, 0x440, 0x3b, 0x43c, 0x430, 0x440, 0x442, 0x3b, 0x430, 0x43f, 0x440, 0x438, 0x43b, 0x3b, 0x43c, 0x430,
-0x458, 0x3b, 0x458, 0x443, 0x43d, 0x3b, 0x458, 0x443, 0x43b, 0x3b, 0x430, 0x432, 0x433, 0x443, 0x441, 0x442, 0x3b, 0x441, 0x435, 0x43f,
-0x442, 0x435, 0x43c, 0x431, 0x430, 0x440, 0x3b, 0x43e, 0x43a, 0x442, 0x43e, 0x431, 0x430, 0x440, 0x3b, 0x43d, 0x43e, 0x432, 0x435, 0x43c,
-0x431, 0x430, 0x440, 0x3b, 0x434, 0x435, 0x446, 0x435, 0x43c, 0x431, 0x430, 0x440, 0x3b, 0x6a, 0x61, 0x6e, 0x3b, 0x66, 0x65, 0x62,
-0x3b, 0x6d, 0x61, 0x72, 0x74, 0x3b, 0x61, 0x70, 0x72, 0x3b, 0x6d, 0x61, 0x6a, 0x3b, 0x6a, 0x75, 0x6e, 0x3b, 0x6a, 0x75,
-0x6c, 0x3b, 0x61, 0x76, 0x67, 0x3b, 0x73, 0x65, 0x70, 0x74, 0x3b, 0x6f, 0x6b, 0x74, 0x3b, 0x6e, 0x6f, 0x76, 0x3b, 0x64,
-0x65, 0x63, 0x3b, 0x6a, 0x61, 0x6e, 0x75, 0x61, 0x72, 0x3b, 0x66, 0x65, 0x62, 0x72, 0x75, 0x61, 0x72, 0x3b, 0x6d, 0x61,
-0x72, 0x74, 0x3b, 0x61, 0x70, 0x72, 0x69, 0x6c, 0x3b, 0x6d, 0x61, 0x6a, 0x3b, 0x6a, 0x75, 0x6e, 0x3b, 0x6a, 0x75, 0x6c,
-0x3b, 0x61, 0x76, 0x67, 0x75, 0x73, 0x74, 0x3b, 0x73, 0x65, 0x70, 0x74, 0x65, 0x6d, 0x62, 0x61, 0x72, 0x3b, 0x6f, 0x6b,
-0x74, 0x6f, 0x62, 0x61, 0x72, 0x3b, 0x6e, 0x6f, 0x76, 0x65, 0x6d, 0x62, 0x61, 0x72, 0x3b, 0x64, 0x65, 0x63, 0x65, 0x6d,
-0x62, 0x61, 0x72, 0x3b, 0x6a, 0x61, 0x6e, 0x3b, 0x66, 0x65, 0x62, 0x3b, 0x6d, 0x61, 0x72, 0x3b, 0x61, 0x70, 0x72, 0x3b,
-0x6d, 0x61, 0x6a, 0x3b, 0x6a, 0x75, 0x6e, 0x3b, 0x6a, 0x75, 0x6c, 0x3b, 0x61, 0x76, 0x67, 0x3b, 0x73, 0x65, 0x70, 0x3b,
-0x6f, 0x6b, 0x74, 0x3b, 0x6e, 0x6f, 0x76, 0x3b, 0x64, 0x65, 0x63, 0x3b, 0x6a, 0x61, 0x6e, 0x2e, 0x3b, 0x66, 0x65, 0x62,
-0x2e, 0x3b, 0x6d, 0x61, 0x72, 0x74, 0x3b, 0x61, 0x70, 0x72, 0x2e, 0x3b, 0x6d, 0x61, 0x6a, 0x3b, 0x6a, 0x75, 0x6e, 0x3b,
-0x6a, 0x75, 0x6c, 0x3b, 0x61, 0x76, 0x67, 0x2e, 0x3b, 0x73, 0x65, 0x70, 0x74, 0x2e, 0x3b, 0x6f, 0x6b, 0x74, 0x2e, 0x3b,
-0x6e, 0x6f, 0x76, 0x2e, 0x3b, 0x64, 0x65, 0x63, 0x2e, 0x3b, 0x458, 0x430, 0x43d, 0x3b, 0x444, 0x435, 0x431, 0x3b, 0x43c, 0x430,
-0x440, 0x442, 0x3b, 0x430, 0x43f, 0x440, 0x3b, 0x43c, 0x430, 0x458, 0x3b, 0x458, 0x443, 0x43d, 0x3b, 0x458, 0x443, 0x43b, 0x3b, 0x430,
-0x432, 0x433, 0x3b, 0x441, 0x435, 0x43f, 0x442, 0x3b, 0x43e, 0x43a, 0x442, 0x3b, 0x43d, 0x43e, 0x432, 0x3b, 0x434, 0x435, 0x446, 0x3b,
-0x42f, 0x43d, 0x432, 0x2e, 0x3b, 0x424, 0x435, 0x432, 0x440, 0x2e, 0x3b, 0x41c, 0x430, 0x440, 0x442, 0x2e, 0x3b, 0x410, 0x43f, 0x440,
-0x2e, 0x3b, 0x41c, 0x430, 0x439, 0x3b, 0x418, 0x44e, 0x43d, 0x44c, 0x3b, 0x418, 0x44e, 0x43b, 0x44c, 0x3b, 0x410, 0x432, 0x433, 0x2e,
-0x3b, 0x421, 0x435, 0x43d, 0x442, 0x2e, 0x3b, 0x41e, 0x43a, 0x442, 0x2e, 0x3b, 0x41d, 0x43e, 0x44f, 0x431, 0x2e, 0x3b, 0x414, 0x435,
-0x43a, 0x2e, 0x3b, 0x42f, 0x43d, 0x432, 0x430, 0x440, 0x44c, 0x3b, 0x424, 0x435, 0x432, 0x440, 0x430, 0x43b, 0x44c, 0x3b, 0x41c, 0x430,
-0x440, 0x442, 0x44a, 0x438, 0x3b, 0x410, 0x43f, 0x440, 0x435, 0x43b, 0x44c, 0x3b, 0x41c, 0x430, 0x439, 0x3b, 0x418, 0x44e, 0x43d, 0x44c,
-0x3b, 0x418, 0x44e, 0x43b, 0x44c, 0x3b, 0x410, 0x432, 0x433, 0x443, 0x441, 0x442, 0x3b, 0x421, 0x435, 0x43d, 0x442, 0x44f, 0x431, 0x440,
-0x44c, 0x3b, 0x41e, 0x43a, 0x442, 0x44f, 0x431, 0x440, 0x44c, 0x3b, 0x41d, 0x43e, 0x44f, 0x431, 0x440, 0x44c, 0x3b, 0x414, 0x435, 0x43a,
-0x430, 0x431, 0x440, 0x44c, 0x3b, 0x44f, 0x43d, 0x432, 0x2e, 0x3b, 0x444, 0x435, 0x432, 0x2e, 0x3b, 0x43c, 0x430, 0x440, 0x2e, 0x3b,
-0x430, 0x43f, 0x440, 0x2e, 0x3b, 0x43c, 0x430, 0x439, 0x44b, 0x3b, 0x438, 0x44e, 0x43d, 0x44b, 0x3b, 0x438, 0x44e, 0x43b, 0x44b, 0x3b,
-0x430, 0x432, 0x433, 0x2e, 0x3b, 0x441, 0x435, 0x43d, 0x2e, 0x3b, 0x43e, 0x43a, 0x442, 0x2e, 0x3b, 0x43d, 0x43e, 0x44f, 0x2e, 0x3b,
-0x434, 0x435, 0x43a, 0x2e, 0x3b, 0x44f, 0x43d, 0x432, 0x430, 0x440, 0x44b, 0x3b, 0x444, 0x435, 0x432, 0x440, 0x430, 0x43b, 0x44b, 0x3b,
-0x43c, 0x430, 0x440, 0x442, 0x44a, 0x438, 0x439, 0x44b, 0x3b, 0x430, 0x43f, 0x440, 0x435, 0x43b, 0x44b, 0x3b, 0x43c, 0x430, 0x439, 0x44b,
-0x3b, 0x438, 0x44e, 0x43d, 0x44b, 0x3b, 0x438, 0x44e, 0x43b, 0x44b, 0x3b, 0x430, 0x432, 0x433, 0x443, 0x441, 0x442, 0x44b, 0x3b, 0x441,
-0x435, 0x43d, 0x442, 0x44f, 0x431, 0x440, 0x44b, 0x3b, 0x43e, 0x43a, 0x442, 0x44f, 0x431, 0x440, 0x44b, 0x3b, 0x43d, 0x43e, 0x44f, 0x431,
-0x440, 0x44b, 0x3b, 0x434, 0x435, 0x43a, 0x430, 0x431, 0x440, 0x44b, 0x3b, 0x4e, 0x64, 0x69, 0x3b, 0x4b, 0x75, 0x6b, 0x3b, 0x4b,
-0x75, 0x72, 0x3b, 0x4b, 0x75, 0x62, 0x3b, 0x43, 0x68, 0x76, 0x3b, 0x43, 0x68, 0x6b, 0x3b, 0x43, 0x68, 0x67, 0x3b, 0x4e,
-0x79, 0x61, 0x3b, 0x47, 0x75, 0x6e, 0x3b, 0x47, 0x75, 0x6d, 0x3b, 0x4d, 0x62, 0x75, 0x3b, 0x5a, 0x76, 0x69, 0x3b, 0x4e,
-0x64, 0x69, 0x72, 0x61, 0x3b, 0x4b, 0x75, 0x6b, 0x61, 0x64, 0x7a, 0x69, 0x3b, 0x4b, 0x75, 0x72, 0x75, 0x6d, 0x65, 0x3b,
-0x4b, 0x75, 0x62, 0x76, 0x75, 0x6d, 0x62, 0x69, 0x3b, 0x43, 0x68, 0x69, 0x76, 0x61, 0x62, 0x76, 0x75, 0x3b, 0x43, 0x68,
-0x69, 0x6b, 0x75, 0x6d, 0x69, 0x3b, 0x43, 0x68, 0x69, 0x6b, 0x75, 0x6e, 0x67, 0x75, 0x72, 0x75, 0x3b, 0x4e, 0x79, 0x61,
-0x6d, 0x61, 0x76, 0x68, 0x75, 0x76, 0x68, 0x75, 0x3b, 0x47, 0x75, 0x6e, 0x79, 0x61, 0x6e, 0x61, 0x3b, 0x47, 0x75, 0x6d,
-0x69, 0x67, 0x75, 0x72, 0x75, 0x3b, 0x4d, 0x62, 0x75, 0x64, 0x7a, 0x69, 0x3b, 0x5a, 0x76, 0x69, 0x74, 0x61, 0x3b, 0x4e,
-0x3b, 0x4b, 0x3b, 0x4b, 0x3b, 0x4b, 0x3b, 0x43, 0x3b, 0x43, 0x3b, 0x43, 0x3b, 0x4e, 0x3b, 0x47, 0x3b, 0x47, 0x3b, 0x4d,
-0x3b, 0x5a, 0x3b, 0x62c, 0x646, 0x648, 0x631, 0x64a, 0x3b, 0x641, 0x64a, 0x628, 0x631, 0x648, 0x631, 0x64a, 0x3b, 0x645, 0x627, 0x631,
-0x686, 0x3b, 0x627, 0x67e, 0x631, 0x64a, 0x644, 0x3b, 0x645, 0x626, 0x64a, 0x3b, 0x62c, 0x648, 0x646, 0x3b, 0x62c, 0x648, 0x644, 0x627,
-0x621, 0x650, 0x3b, 0x622, 0x6af, 0x633, 0x67d, 0x3b, 0x633, 0x64a, 0x67e, 0x67d, 0x645, 0x628, 0x631, 0x3b, 0x622, 0x6aa, 0x67d, 0x648,
-0x628, 0x631, 0x3b, 0x646, 0x648, 0x645, 0x628, 0x631, 0x3b, 0x68a, 0x633, 0x645, 0x628, 0x631, 0x3b, 0xda2, 0xdb1, 0x3b, 0xdb4, 0xdd9,
-0xdb6, 0x3b, 0xdb8, 0xdcf, 0xdbb, 0xdca, 0x3b, 0xd85, 0xdb4, 0xdca, 0x200d, 0xdbb, 0xdda, 0xdbd, 0xdca, 0x3b, 0xdb8, 0xdd0, 0xdba, 0xdd2,
-0x3b, 0xda2, 0xdd6, 0xdb1, 0xdd2, 0x3b, 0xda2, 0xdd6, 0xdbd, 0xdd2, 0x3b, 0xd85, 0xd9c, 0xddd, 0x3b, 0xdc3, 0xdd0, 0xdb4, 0xdca, 0x3b,
-0xd94, 0xd9a, 0xdca, 0x3b, 0xdb1, 0xddc, 0xdc0, 0xdd0, 0x3b, 0xdaf, 0xdd9, 0xdc3, 0xdd0, 0x3b, 0xda2, 0xdb1, 0xdc0, 0xdcf, 0xdbb, 0xdd2,
-0x3b, 0xdb4, 0xdd9, 0xdb6, 0xdbb, 0xdc0, 0xdcf, 0xdbb, 0xdd2, 0x3b, 0xdb8, 0xdcf, 0xdbb, 0xdca, 0xdad, 0xdd4, 0x3b, 0xd85, 0xdb4, 0xdca,
-0x200d, 0xdbb, 0xdda, 0xdbd, 0xdca, 0x3b, 0xdb8, 0xdd0, 0xdba, 0xdd2, 0x3b, 0xda2, 0xdd6, 0xdb1, 0xdd2, 0x3b, 0xda2, 0xdd6, 0xdbd, 0xdd2,
-0x3b, 0xd85, 0xd9c, 0xddd, 0xdc3, 0xdca, 0xdad, 0xdd4, 0x3b, 0xdc3, 0xdd0, 0xdb4, 0xdca, 0xdad, 0xdd0, 0xdb8, 0xdca, 0xdb6, 0xdbb, 0xdca,
-0x3b, 0xd94, 0xd9a, 0xdca, 0xdad, 0xddd, 0xdb6, 0xdbb, 0xdca, 0x3b, 0xdb1, 0xddc, 0xdc0, 0xdd0, 0xdb8, 0xdca, 0xdb6, 0xdbb, 0xdca, 0x3b,
-0xdaf, 0xdd9, 0xdc3, 0xdd0, 0xdb8, 0xdca, 0xdb6, 0xdbb, 0xdca, 0x3b, 0xda2, 0x3b, 0xdb4, 0xdd9, 0x3b, 0xdb8, 0xdcf, 0x3b, 0xd85, 0x3b,
-0xdb8, 0xdd0, 0x3b, 0xda2, 0xdd6, 0x3b, 0xda2, 0xdd6, 0x3b, 0xd85, 0x3b, 0xdc3, 0xdd0, 0x3b, 0xd94, 0x3b, 0xdb1, 0xdd9, 0x3b, 0xdaf,
-0xdd9, 0x3b, 0xda2, 0xdb1, 0x3b, 0xdb4, 0xdd9, 0xdb6, 0x3b, 0xdb8, 0xdcf, 0xdbb, 0xdca, 0xdad, 0xdd4, 0x3b, 0xd85, 0xdb4, 0xdca, 0x200d,
-0xdbb, 0xdda, 0xdbd, 0xdca, 0x3b, 0xdb8, 0xdd0, 0xdba, 0xdd2, 0x3b, 0xda2, 0xdd6, 0xdb1, 0xdd2, 0x3b, 0xda2, 0xdd6, 0xdbd, 0xdd2, 0x3b,
-0xd85, 0xd9c, 0xddd, 0x3b, 0xdc3, 0xdd0, 0xdb4, 0xdca, 0x3b, 0xd94, 0xd9a, 0xdca, 0x3b, 0xdb1, 0xddc, 0xdc0, 0xdd0, 0x3b, 0xdaf, 0xdd9,
-0xdc3, 0xdd0, 0x3b, 0x6a, 0x61, 0x6e, 0x3b, 0x66, 0x65, 0x62, 0x3b, 0x6d, 0x61, 0x72, 0x3b, 0x61, 0x70, 0x72, 0x3b, 0x6d,
-0xe1, 0x6a, 0x3b, 0x6a, 0xfa, 0x6e, 0x3b, 0x6a, 0xfa, 0x6c, 0x3b, 0x61, 0x75, 0x67, 0x3b, 0x73, 0x65, 0x70, 0x3b, 0x6f,
-0x6b, 0x74, 0x3b, 0x6e, 0x6f, 0x76, 0x3b, 0x64, 0x65, 0x63, 0x3b, 0x6a, 0x61, 0x6e, 0x75, 0xe1, 0x72, 0x3b, 0x66, 0x65,
-0x62, 0x72, 0x75, 0xe1, 0x72, 0x3b, 0x6d, 0x61, 0x72, 0x65, 0x63, 0x3b, 0x61, 0x70, 0x72, 0xed, 0x6c, 0x3b, 0x6d, 0xe1,
-0x6a, 0x3b, 0x6a, 0xfa, 0x6e, 0x3b, 0x6a, 0xfa, 0x6c, 0x3b, 0x61, 0x75, 0x67, 0x75, 0x73, 0x74, 0x3b, 0x73, 0x65, 0x70,
-0x74, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x3b, 0x6f, 0x6b, 0x74, 0xf3, 0x62, 0x65, 0x72, 0x3b, 0x6e, 0x6f, 0x76, 0x65, 0x6d,
-0x62, 0x65, 0x72, 0x3b, 0x64, 0x65, 0x63, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x3b, 0x6a, 0x61, 0x6e, 0x75, 0xe1, 0x72, 0x61,
-0x3b, 0x66, 0x65, 0x62, 0x72, 0x75, 0xe1, 0x72, 0x61, 0x3b, 0x6d, 0x61, 0x72, 0x63, 0x61, 0x3b, 0x61, 0x70, 0x72, 0xed,
-0x6c, 0x61, 0x3b, 0x6d, 0xe1, 0x6a, 0x61, 0x3b, 0x6a, 0xfa, 0x6e, 0x61, 0x3b, 0x6a, 0xfa, 0x6c, 0x61, 0x3b, 0x61, 0x75,
-0x67, 0x75, 0x73, 0x74, 0x61, 0x3b, 0x73, 0x65, 0x70, 0x74, 0x65, 0x6d, 0x62, 0x72, 0x61, 0x3b, 0x6f, 0x6b, 0x74, 0xf3,
-0x62, 0x72, 0x61, 0x3b, 0x6e, 0x6f, 0x76, 0x65, 0x6d, 0x62, 0x72, 0x61, 0x3b, 0x64, 0x65, 0x63, 0x65, 0x6d, 0x62, 0x72,
-0x61, 0x3b, 0x6a, 0x61, 0x6e, 0x2e, 0x3b, 0x66, 0x65, 0x62, 0x2e, 0x3b, 0x6d, 0x61, 0x72, 0x2e, 0x3b, 0x61, 0x70, 0x72,
-0x2e, 0x3b, 0x6d, 0x61, 0x6a, 0x3b, 0x6a, 0x75, 0x6e, 0x2e, 0x3b, 0x6a, 0x75, 0x6c, 0x2e, 0x3b, 0x61, 0x76, 0x67, 0x2e,
-0x3b, 0x73, 0x65, 0x70, 0x2e, 0x3b, 0x6f, 0x6b, 0x74, 0x2e, 0x3b, 0x6e, 0x6f, 0x76, 0x2e, 0x3b, 0x64, 0x65, 0x63, 0x2e,
-0x3b, 0x6a, 0x61, 0x6e, 0x75, 0x61, 0x72, 0x3b, 0x66, 0x65, 0x62, 0x72, 0x75, 0x61, 0x72, 0x3b, 0x6d, 0x61, 0x72, 0x65,
-0x63, 0x3b, 0x61, 0x70, 0x72, 0x69, 0x6c, 0x3b, 0x6d, 0x61, 0x6a, 0x3b, 0x6a, 0x75, 0x6e, 0x69, 0x6a, 0x3b, 0x6a, 0x75,
-0x6c, 0x69, 0x6a, 0x3b, 0x61, 0x76, 0x67, 0x75, 0x73, 0x74, 0x3b, 0x73, 0x65, 0x70, 0x74, 0x65, 0x6d, 0x62, 0x65, 0x72,
-0x3b, 0x6f, 0x6b, 0x74, 0x6f, 0x62, 0x65, 0x72, 0x3b, 0x6e, 0x6f, 0x76, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x3b, 0x64, 0x65,
-0x63, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x3b, 0x4a, 0x61, 0x6e, 0x3b, 0x46, 0x65, 0x62, 0x3b, 0x4d, 0x61, 0x72, 0x3b, 0x41,
-0x62, 0x72, 0x3b, 0x4d, 0x61, 0x79, 0x3b, 0x4a, 0x75, 0x6e, 0x3b, 0x4c, 0x75, 0x6c, 0x3b, 0x4f, 0x67, 0x73, 0x3b, 0x53,
-0x65, 0x62, 0x3b, 0x4f, 0x6b, 0x74, 0x3b, 0x4e, 0x6f, 0x66, 0x3b, 0x44, 0x69, 0x73, 0x3b, 0x4a, 0x61, 0x6e, 0x6e, 0x61,
-0x61, 0x79, 0x6f, 0x3b, 0x46, 0x65, 0x62, 0x72, 0x61, 0x61, 0x79, 0x6f, 0x3b, 0x4d, 0x61, 0x61, 0x72, 0x73, 0x6f, 0x3b,
-0x41, 0x62, 0x72, 0x69, 0x69, 0x6c, 0x3b, 0x4d, 0x61, 0x79, 0x3b, 0x4a, 0x75, 0x75, 0x6e, 0x3b, 0x4c, 0x75, 0x75, 0x6c,
-0x69, 0x79, 0x6f, 0x3b, 0x4f, 0x67, 0x6f, 0x73, 0x74, 0x3b, 0x53, 0x65, 0x62, 0x74, 0x65, 0x6d, 0x62, 0x61, 0x72, 0x3b,
-0x4f, 0x6b, 0x74, 0x6f, 0x6f, 0x62, 0x61, 0x72, 0x3b, 0x4e, 0x6f, 0x66, 0x65, 0x6d, 0x62, 0x61, 0x72, 0x3b, 0x44, 0x65,
-0x73, 0x65, 0x6d, 0x62, 0x61, 0x72, 0x3b, 0x4a, 0x3b, 0x46, 0x3b, 0x4d, 0x3b, 0x41, 0x3b, 0x4d, 0x3b, 0x4a, 0x3b, 0x4c,
-0x3b, 0x4f, 0x3b, 0x53, 0x3b, 0x4f, 0x3b, 0x4e, 0x3b, 0x44, 0x3b, 0x42, 0x69, 0x73, 0x68, 0x61, 0x20, 0x4b, 0x6f, 0x6f,
-0x62, 0x61, 0x61, 0x64, 0x3b, 0x42, 0x69, 0x73, 0x68, 0x61, 0x20, 0x4c, 0x61, 0x62, 0x61, 0x61, 0x64, 0x3b, 0x42, 0x69,
-0x73, 0x68, 0x61, 0x20, 0x53, 0x61, 0x64, 0x64, 0x65, 0x78, 0x61, 0x61, 0x64, 0x3b, 0x42, 0x69, 0x73, 0x68, 0x61, 0x20,
-0x41, 0x66, 0x72, 0x61, 0x61, 0x64, 0x3b, 0x42, 0x69, 0x73, 0x68, 0x61, 0x20, 0x53, 0x68, 0x61, 0x6e, 0x61, 0x61, 0x64,
-0x3b, 0x42, 0x69, 0x73, 0x68, 0x61, 0x20, 0x4c, 0x69, 0x78, 0x61, 0x61, 0x64, 0x3b, 0x42, 0x69, 0x73, 0x68, 0x61, 0x20,
-0x54, 0x6f, 0x64, 0x6f, 0x62, 0x61, 0x61, 0x64, 0x3b, 0x42, 0x69, 0x73, 0x68, 0x61, 0x20, 0x53, 0x69, 0x64, 0x65, 0x65,
-0x64, 0x61, 0x61, 0x64, 0x3b, 0x42, 0x69, 0x73, 0x68, 0x61, 0x20, 0x53, 0x61, 0x67, 0x61, 0x61, 0x6c, 0x61, 0x61, 0x64,
-0x3b, 0x42, 0x69, 0x73, 0x68, 0x61, 0x20, 0x54, 0x6f, 0x62, 0x6e, 0x61, 0x61, 0x64, 0x3b, 0x42, 0x69, 0x73, 0x68, 0x61,
-0x20, 0x4b, 0x6f, 0x77, 0x20, 0x69, 0x79, 0x6f, 0x20, 0x54, 0x6f, 0x62, 0x6e, 0x61, 0x61, 0x64, 0x3b, 0x42, 0x69, 0x73,
-0x68, 0x61, 0x20, 0x4c, 0x61, 0x62, 0x61, 0x20, 0x69, 0x79, 0x6f, 0x20, 0x54, 0x6f, 0x62, 0x6e, 0x61, 0x61, 0x64, 0x3b,
-0x65, 0x6e, 0x65, 0x2e, 0x3b, 0x66, 0x65, 0x62, 0x2e, 0x3b, 0x6d, 0x61, 0x72, 0x2e, 0x3b, 0x61, 0x62, 0x72, 0x2e, 0x3b,
-0x6d, 0x61, 0x79, 0x2e, 0x3b, 0x6a, 0x75, 0x6e, 0x2e, 0x3b, 0x6a, 0x75, 0x6c, 0x2e, 0x3b, 0x61, 0x67, 0x6f, 0x2e, 0x3b,
-0x73, 0x65, 0x70, 0x74, 0x2e, 0x3b, 0x6f, 0x63, 0x74, 0x2e, 0x3b, 0x6e, 0x6f, 0x76, 0x2e, 0x3b, 0x64, 0x69, 0x63, 0x2e,
-0x3b, 0x65, 0x6e, 0x65, 0x72, 0x6f, 0x3b, 0x66, 0x65, 0x62, 0x72, 0x65, 0x72, 0x6f, 0x3b, 0x6d, 0x61, 0x72, 0x7a, 0x6f,
-0x3b, 0x61, 0x62, 0x72, 0x69, 0x6c, 0x3b, 0x6d, 0x61, 0x79, 0x6f, 0x3b, 0x6a, 0x75, 0x6e, 0x69, 0x6f, 0x3b, 0x6a, 0x75,
-0x6c, 0x69, 0x6f, 0x3b, 0x61, 0x67, 0x6f, 0x73, 0x74, 0x6f, 0x3b, 0x73, 0x65, 0x70, 0x74, 0x69, 0x65, 0x6d, 0x62, 0x72,
-0x65, 0x3b, 0x6f, 0x63, 0x74, 0x75, 0x62, 0x72, 0x65, 0x3b, 0x6e, 0x6f, 0x76, 0x69, 0x65, 0x6d, 0x62, 0x72, 0x65, 0x3b,
-0x64, 0x69, 0x63, 0x69, 0x65, 0x6d, 0x62, 0x72, 0x65, 0x3b, 0x45, 0x3b, 0x46, 0x3b, 0x4d, 0x3b, 0x41, 0x3b, 0x4d, 0x3b,
-0x4a, 0x3b, 0x4a, 0x3b, 0x41, 0x3b, 0x53, 0x3b, 0x4f, 0x3b, 0x4e, 0x3b, 0x44, 0x3b, 0x65, 0x6e, 0x65, 0x2e, 0x3b, 0x66,
-0x65, 0x62, 0x2e, 0x3b, 0x6d, 0x61, 0x72, 0x2e, 0x3b, 0x61, 0x62, 0x72, 0x2e, 0x3b, 0x6d, 0x61, 0x79, 0x2e, 0x3b, 0x6a,
-0x75, 0x6e, 0x2e, 0x3b, 0x6a, 0x75, 0x6c, 0x2e, 0x3b, 0x61, 0x67, 0x6f, 0x2e, 0x3b, 0x73, 0x65, 0x70, 0x2e, 0x3b, 0x6f,
-0x63, 0x74, 0x2e, 0x3b, 0x6e, 0x6f, 0x76, 0x2e, 0x3b, 0x64, 0x69, 0x63, 0x2e, 0x3b, 0x45, 0x6e, 0x65, 0x2e, 0x3b, 0x46,
-0x65, 0x62, 0x2e, 0x3b, 0x4d, 0x61, 0x72, 0x2e, 0x3b, 0x41, 0x62, 0x72, 0x2e, 0x3b, 0x4d, 0x61, 0x79, 0x2e, 0x3b, 0x4a,
-0x75, 0x6e, 0x2e, 0x3b, 0x4a, 0x75, 0x6c, 0x2e, 0x3b, 0x41, 0x67, 0x6f, 0x2e, 0x3b, 0x53, 0x65, 0x74, 0x2e, 0x3b, 0x4f,
-0x63, 0x74, 0x2e, 0x3b, 0x4e, 0x6f, 0x76, 0x2e, 0x3b, 0x44, 0x69, 0x63, 0x2e, 0x3b, 0x65, 0x6e, 0x65, 0x2e, 0x3b, 0x66,
-0x65, 0x62, 0x2e, 0x3b, 0x6d, 0x61, 0x72, 0x2e, 0x3b, 0x61, 0x62, 0x72, 0x2e, 0x3b, 0x6d, 0x61, 0x79, 0x2e, 0x3b, 0x6a,
-0x75, 0x6e, 0x2e, 0x3b, 0x6a, 0x75, 0x6c, 0x2e, 0x3b, 0x61, 0x67, 0x6f, 0x2e, 0x3b, 0x73, 0x65, 0x74, 0x2e, 0x3b, 0x6f,
-0x63, 0x74, 0x2e, 0x3b, 0x6e, 0x6f, 0x76, 0x2e, 0x3b, 0x64, 0x69, 0x63, 0x2e, 0x3b, 0x65, 0x6e, 0x65, 0x72, 0x6f, 0x3b,
-0x66, 0x65, 0x62, 0x72, 0x65, 0x72, 0x6f, 0x3b, 0x6d, 0x61, 0x72, 0x7a, 0x6f, 0x3b, 0x61, 0x62, 0x72, 0x69, 0x6c, 0x3b,
-0x6d, 0x61, 0x79, 0x6f, 0x3b, 0x6a, 0x75, 0x6e, 0x69, 0x6f, 0x3b, 0x6a, 0x75, 0x6c, 0x69, 0x6f, 0x3b, 0x61, 0x67, 0x6f,
-0x73, 0x74, 0x6f, 0x3b, 0x73, 0x65, 0x74, 0x69, 0x65, 0x6d, 0x62, 0x72, 0x65, 0x3b, 0x6f, 0x63, 0x74, 0x75, 0x62, 0x72,
-0x65, 0x3b, 0x6e, 0x6f, 0x76, 0x69, 0x65, 0x6d, 0x62, 0x72, 0x65, 0x3b, 0x64, 0x69, 0x63, 0x69, 0x65, 0x6d, 0x62, 0x72,
-0x65, 0x3b, 0x4a, 0x61, 0x6e, 0x3b, 0x46, 0x65, 0x62, 0x3b, 0x4d, 0x61, 0x63, 0x3b, 0x41, 0x70, 0x72, 0x3b, 0x4d, 0x65,
-0x69, 0x3b, 0x4a, 0x75, 0x6e, 0x3b, 0x4a, 0x75, 0x6c, 0x3b, 0x41, 0x67, 0x6f, 0x3b, 0x53, 0x65, 0x70, 0x3b, 0x4f, 0x6b,
-0x74, 0x3b, 0x4e, 0x6f, 0x76, 0x3b, 0x44, 0x65, 0x73, 0x3b, 0x4a, 0x61, 0x6e, 0x75, 0x61, 0x72, 0x69, 0x3b, 0x46, 0x65,
-0x62, 0x72, 0x75, 0x61, 0x72, 0x69, 0x3b, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x3b, 0x41, 0x70, 0x72, 0x69, 0x6c, 0x69, 0x3b,
-0x4d, 0x65, 0x69, 0x3b, 0x4a, 0x75, 0x6e, 0x69, 0x3b, 0x4a, 0x75, 0x6c, 0x61, 0x69, 0x3b, 0x41, 0x67, 0x6f, 0x73, 0x74,
-0x69, 0x3b, 0x53, 0x65, 0x70, 0x74, 0x65, 0x6d, 0x62, 0x61, 0x3b, 0x4f, 0x6b, 0x74, 0x6f, 0x62, 0x61, 0x3b, 0x4e, 0x6f,
-0x76, 0x65, 0x6d, 0x62, 0x61, 0x3b, 0x44, 0x65, 0x73, 0x65, 0x6d, 0x62, 0x61, 0x3b, 0x6a, 0x61, 0x6e, 0x2e, 0x3b, 0x66,
-0x65, 0x62, 0x2e, 0x3b, 0x6d, 0x61, 0x72, 0x73, 0x3b, 0x61, 0x70, 0x72, 0x2e, 0x3b, 0x6d, 0x61, 0x6a, 0x3b, 0x6a, 0x75,
-0x6e, 0x69, 0x3b, 0x6a, 0x75, 0x6c, 0x69, 0x3b, 0x61, 0x75, 0x67, 0x2e, 0x3b, 0x73, 0x65, 0x70, 0x2e, 0x3b, 0x6f, 0x6b,
-0x74, 0x2e, 0x3b, 0x6e, 0x6f, 0x76, 0x2e, 0x3b, 0x64, 0x65, 0x63, 0x2e, 0x3b, 0x6a, 0x61, 0x6e, 0x75, 0x61, 0x72, 0x69,
-0x3b, 0x66, 0x65, 0x62, 0x72, 0x75, 0x61, 0x72, 0x69, 0x3b, 0x6d, 0x61, 0x72, 0x73, 0x3b, 0x61, 0x70, 0x72, 0x69, 0x6c,
-0x3b, 0x6d, 0x61, 0x6a, 0x3b, 0x6a, 0x75, 0x6e, 0x69, 0x3b, 0x6a, 0x75, 0x6c, 0x69, 0x3b, 0x61, 0x75, 0x67, 0x75, 0x73,
-0x74, 0x69, 0x3b, 0x73, 0x65, 0x70, 0x74, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x3b, 0x6f, 0x6b, 0x74, 0x6f, 0x62, 0x65, 0x72,
-0x3b, 0x6e, 0x6f, 0x76, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x3b, 0x64, 0x65, 0x63, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x3b, 0x42f,
-0x43d, 0x432, 0x430, 0x440, 0x3b, 0x424, 0x435, 0x432, 0x440, 0x430, 0x43b, 0x3b, 0x41c, 0x430, 0x440, 0x442, 0x3b, 0x410, 0x43f, 0x440,
-0x435, 0x43b, 0x3b, 0x41c, 0x430, 0x439, 0x3b, 0x418, 0x44e, 0x43d, 0x3b, 0x418, 0x44e, 0x43b, 0x3b, 0x410, 0x432, 0x433, 0x443, 0x441,
-0x442, 0x3b, 0x421, 0x435, 0x43d, 0x442, 0x44f, 0x431, 0x440, 0x3b, 0x41e, 0x43a, 0x442, 0x44f, 0x431, 0x440, 0x3b, 0x41d, 0x43e, 0x44f,
-0x431, 0x440, 0x3b, 0x414, 0x435, 0x43a, 0x430, 0x431, 0x440, 0x3b, 0xb9c, 0xba9, 0x2e, 0x3b, 0xbaa, 0xbbf, 0xbaa, 0xbcd, 0x2e, 0x3b,
-0xbae, 0xbbe, 0xbb0, 0xbcd, 0x2e, 0x3b, 0xb8f, 0xbaa, 0xbcd, 0x2e, 0x3b, 0xbae, 0xbc7, 0x3b, 0xb9c, 0xbc2, 0xba9, 0xbcd, 0x3b, 0xb9c,
-0xbc2, 0xbb2, 0xbc8, 0x3b, 0xb86, 0xb95, 0x2e, 0x3b, 0xb9a, 0xbc6, 0xbaa, 0xbcd, 0x2e, 0x3b, 0xb85, 0xb95, 0xbcd, 0x2e, 0x3b, 0xba8,
-0xbb5, 0x2e, 0x3b, 0xb9f, 0xbbf, 0xb9a, 0x2e, 0x3b, 0xb9c, 0xba9, 0xbb5, 0xbb0, 0xbbf, 0x3b, 0xbaa, 0xbbf, 0xbaa, 0xbcd, 0xbb0, 0xbb5,
-0xbb0, 0xbbf, 0x3b, 0xbae, 0xbbe, 0xbb0, 0xbcd, 0xb9a, 0xbcd, 0x3b, 0xb8f, 0xbaa, 0xbcd, 0xbb0, 0xbb2, 0xbcd, 0x3b, 0xbae, 0xbc7, 0x3b,
-0xb9c, 0xbc2, 0xba9, 0xbcd, 0x3b, 0xb9c, 0xbc2, 0xbb2, 0xbc8, 0x3b, 0xb86, 0xb95, 0xbb8, 0xbcd, 0xb9f, 0xbcd, 0x3b, 0xb9a, 0xbc6, 0xbaa,
-0xbcd, 0xb9f, 0xbae, 0xbcd, 0xbaa, 0xbb0, 0xbcd, 0x3b, 0xb85, 0xb95, 0xbcd, 0xb9f, 0xbcb, 0xbaa, 0xbb0, 0xbcd, 0x3b, 0xba8, 0xbb5, 0xbae,
-0xbcd, 0xbaa, 0xbb0, 0xbcd, 0x3b, 0xb9f, 0xbbf, 0xb9a, 0xbae, 0xbcd, 0xbaa, 0xbb0, 0xbcd, 0x3b, 0xb9c, 0x3b, 0xbaa, 0xbbf, 0x3b, 0xbae,
-0xbbe, 0x3b, 0xb8f, 0x3b, 0xbae, 0xbc7, 0x3b, 0xb9c, 0xbc2, 0x3b, 0xb9c, 0xbc2, 0x3b, 0xb86, 0x3b, 0xb9a, 0xbc6, 0x3b, 0xb85, 0x3b,
-0xba8, 0x3b, 0xb9f, 0xbbf, 0x3b, 0x433, 0x44b, 0x439, 0x43d, 0x2e, 0x3b, 0x444, 0x435, 0x432, 0x2e, 0x3b, 0x43c, 0x430, 0x440, 0x2e,
-0x3b, 0x430, 0x43f, 0x440, 0x2e, 0x3b, 0x43c, 0x430, 0x439, 0x3b, 0x438, 0x44e, 0x43d, 0x44c, 0x3b, 0x438, 0x44e, 0x43b, 0x44c, 0x3b,
-0x430, 0x432, 0x433, 0x2e, 0x3b, 0x441, 0x435, 0x43d, 0x442, 0x2e, 0x3b, 0x43e, 0x43a, 0x442, 0x2e, 0x3b, 0x43d, 0x43e, 0x44f, 0x431,
-0x2e, 0x3b, 0x434, 0x435, 0x43a, 0x2e, 0x3b, 0x433, 0x44b, 0x439, 0x43d, 0x432, 0x430, 0x440, 0x3b, 0x444, 0x435, 0x432, 0x440, 0x430,
-0x43b, 0x44c, 0x3b, 0x43c, 0x430, 0x440, 0x442, 0x3b, 0x430, 0x43f, 0x440, 0x435, 0x43b, 0x44c, 0x3b, 0x43c, 0x430, 0x439, 0x3b, 0x438,
-0x44e, 0x43d, 0x44c, 0x3b, 0x438, 0x44e, 0x43b, 0x44c, 0x3b, 0x430, 0x432, 0x433, 0x443, 0x441, 0x442, 0x3b, 0x441, 0x435, 0x43d, 0x442,
-0x44f, 0x431, 0x440, 0x44c, 0x3b, 0x43e, 0x43a, 0x442, 0x44f, 0x431, 0x440, 0x44c, 0x3b, 0x43d, 0x43e, 0x44f, 0x431, 0x440, 0x44c, 0x3b,
-0x434, 0x435, 0x43a, 0x430, 0x431, 0x440, 0x44c, 0x3b, 0xc1c, 0xc28, 0x3b, 0xc2b, 0xc3f, 0xc2c, 0xc4d, 0xc30, 0x3b, 0xc2e, 0xc3e, 0xc30,
-0xc4d, 0xc1a, 0xc3f, 0x3b, 0xc0f, 0xc2a, 0xc4d, 0xc30, 0xc3f, 0x3b, 0xc2e, 0xc47, 0x3b, 0xc1c, 0xc42, 0xc28, 0xc4d, 0x3b, 0xc1c, 0xc41,
-0xc32, 0xc48, 0x3b, 0xc06, 0xc17, 0x3b, 0xc38, 0xc46, 0xc2a, 0xc4d, 0xc1f, 0xc46, 0xc02, 0x3b, 0xc05, 0xc15, 0xc4d, 0xc1f, 0xc4b, 0x3b,
-0xc28, 0xc35, 0xc02, 0x3b, 0xc21, 0xc3f, 0xc38, 0xc46, 0xc02, 0x3b, 0xc1c, 0xc28, 0xc35, 0xc30, 0xc3f, 0x3b, 0xc2b, 0xc3f, 0xc2c, 0xc4d,
-0xc30, 0xc35, 0xc30, 0xc3f, 0x3b, 0xc2e, 0xc3e, 0xc30, 0xc4d, 0xc1a, 0xc3f, 0x3b, 0xc0f, 0xc2a, 0xc4d, 0xc30, 0xc3f, 0xc32, 0xc4d, 0x3b,
-0xc2e, 0xc47, 0x3b, 0xc1c, 0xc42, 0xc28, 0xc4d, 0x3b, 0xc1c, 0xc41, 0xc32, 0xc48, 0x3b, 0xc06, 0xc17, 0xc38, 0xc4d, 0xc1f, 0xc41, 0x3b,
-0xc38, 0xc46, 0xc2a, 0xc4d, 0xc1f, 0xc46, 0xc02, 0xc2c, 0xc30, 0xc4d, 0x3b, 0xc05, 0xc15, 0xc4d, 0xc1f, 0xc4b, 0xc2c, 0xc30, 0xc4d, 0x3b,
-0xc28, 0xc35, 0xc02, 0xc2c, 0xc30, 0xc4d, 0x3b, 0xc21, 0xc3f, 0xc38, 0xc46, 0xc02, 0xc2c, 0xc30, 0xc4d, 0x3b, 0xc1c, 0x3b, 0xc2b, 0xc3f,
-0x3b, 0xc2e, 0xc3e, 0x3b, 0xc0f, 0x3b, 0xc2e, 0xc47, 0x3b, 0xc1c, 0xc42, 0x3b, 0xc1c, 0xc41, 0x3b, 0xc06, 0x3b, 0xc38, 0xc46, 0x3b,
-0xc05, 0x3b, 0xc28, 0x3b, 0xc21, 0xc3f, 0x3b, 0xe21, 0x2e, 0xe04, 0x2e, 0x3b, 0xe01, 0x2e, 0xe1e, 0x2e, 0x3b, 0xe21, 0xe35, 0x2e,
-0xe04, 0x2e, 0x3b, 0xe40, 0xe21, 0x2e, 0xe22, 0x2e, 0x3b, 0xe1e, 0x2e, 0xe04, 0x2e, 0x3b, 0xe21, 0xe34, 0x2e, 0xe22, 0x2e, 0x3b,
-0xe01, 0x2e, 0xe04, 0x2e, 0x3b, 0xe2a, 0x2e, 0xe04, 0x2e, 0x3b, 0xe01, 0x2e, 0xe22, 0x2e, 0x3b, 0xe15, 0x2e, 0xe04, 0x2e, 0x3b,
-0xe1e, 0x2e, 0xe22, 0x2e, 0x3b, 0xe18, 0x2e, 0xe04, 0x2e, 0x3b, 0xe21, 0xe01, 0xe23, 0xe32, 0xe04, 0xe21, 0x3b, 0xe01, 0xe38, 0xe21,
-0xe20, 0xe32, 0xe1e, 0xe31, 0xe19, 0xe18, 0xe4c, 0x3b, 0xe21, 0xe35, 0xe19, 0xe32, 0xe04, 0xe21, 0x3b, 0xe40, 0xe21, 0xe29, 0xe32, 0xe22,
-0xe19, 0x3b, 0xe1e, 0xe24, 0xe29, 0xe20, 0xe32, 0xe04, 0xe21, 0x3b, 0xe21, 0xe34, 0xe16, 0xe38, 0xe19, 0xe32, 0xe22, 0xe19, 0x3b, 0xe01,
-0xe23, 0xe01, 0xe0e, 0xe32, 0xe04, 0xe21, 0x3b, 0xe2a, 0xe34, 0xe07, 0xe2b, 0xe32, 0xe04, 0xe21, 0x3b, 0xe01, 0xe31, 0xe19, 0xe22, 0xe32,
-0xe22, 0xe19, 0x3b, 0xe15, 0xe38, 0xe25, 0xe32, 0xe04, 0xe21, 0x3b, 0xe1e, 0xe24, 0xe28, 0xe08, 0xe34, 0xe01, 0xe32, 0xe22, 0xe19, 0x3b,
-0xe18, 0xe31, 0xe19, 0xe27, 0xe32, 0xe04, 0xe21, 0x3b, 0xf5f, 0xfb3, 0xf0b, 0xf56, 0xf0b, 0xf51, 0xf44, 0xf0b, 0xf54, 0xf7c, 0xf0b, 0x3b,
-0xf5f, 0xfb3, 0xf0b, 0xf56, 0xf0b, 0xf42, 0xf49, 0xf72, 0xf66, 0xf0b, 0xf54, 0xf0b, 0x3b, 0xf5f, 0xfb3, 0xf0b, 0xf56, 0xf0b, 0xf42, 0xf66,
-0xf74, 0xf58, 0xf0b, 0xf54, 0xf0b, 0x3b, 0xf5f, 0xfb3, 0xf0b, 0xf56, 0xf0b, 0xf56, 0xf5e, 0xf72, 0xf0b, 0xf54, 0xf0b, 0x3b, 0xf5f, 0xfb3,
-0xf0b, 0xf56, 0xf0b, 0xf63, 0xf94, 0xf0b, 0xf54, 0xf0b, 0x3b, 0xf5f, 0xfb3, 0xf0b, 0xf56, 0xf0b, 0xf51, 0xfb2, 0xf74, 0xf42, 0xf0b, 0xf54,
-0xf0b, 0x3b, 0xf5f, 0xfb3, 0xf0b, 0xf56, 0xf0b, 0xf56, 0xf51, 0xf74, 0xf53, 0xf0b, 0xf54, 0xf0b, 0x3b, 0xf5f, 0xfb3, 0xf0b, 0xf56, 0xf0b,
-0xf56, 0xf62, 0xf92, 0xfb1, 0xf51, 0xf0b, 0xf54, 0xf0b, 0x3b, 0xf5f, 0xfb3, 0xf0b, 0xf56, 0xf0b, 0xf51, 0xf42, 0xf74, 0xf0b, 0xf54, 0xf0b,
-0x3b, 0xf5f, 0xfb3, 0xf0b, 0xf56, 0xf0b, 0xf56, 0xf45, 0xf74, 0xf0b, 0xf54, 0xf0b, 0x3b, 0xf5f, 0xfb3, 0xf0b, 0xf56, 0xf0b, 0xf56, 0xf45,
-0xf74, 0xf0b, 0xf42, 0xf45, 0xf72, 0xf42, 0xf0b, 0xf54, 0xf0b, 0x3b, 0xf5f, 0xfb3, 0xf0b, 0xf56, 0xf0b, 0xf56, 0xf45, 0xf74, 0xf0b, 0xf42,
-0xf49, 0xf72, 0xf66, 0xf0b, 0xf54, 0xf0b, 0x3b, 0xf5f, 0xfb3, 0xf0b, 0xf56, 0xf0b, 0xf51, 0xf44, 0xf0b, 0xf54, 0xf7c, 0x3b, 0xf5f, 0xfb3,
-0xf0b, 0xf56, 0xf0b, 0xf42, 0xf49, 0xf72, 0xf66, 0xf0b, 0xf54, 0x3b, 0xf5f, 0xfb3, 0xf0b, 0xf56, 0xf0b, 0xf42, 0xf66, 0xf74, 0xf58, 0xf0b,
-0xf54, 0x3b, 0xf5f, 0xfb3, 0xf0b, 0xf56, 0xf0b, 0xf56, 0xf5e, 0xf72, 0xf0b, 0xf54, 0x3b, 0xf5f, 0xfb3, 0xf0b, 0xf56, 0xf0b, 0xf63, 0xf94,
-0xf0b, 0xf54, 0x3b, 0xf5f, 0xfb3, 0xf0b, 0xf56, 0xf0b, 0xf51, 0xfb2, 0xf74, 0xf42, 0xf0b, 0xf54, 0x3b, 0xf5f, 0xfb3, 0xf0b, 0xf56, 0xf0b,
-0xf56, 0xf51, 0xf74, 0xf53, 0xf0b, 0xf54, 0x3b, 0xf5f, 0xfb3, 0xf0b, 0xf56, 0xf0b, 0xf56, 0xf62, 0xf92, 0xfb1, 0xf51, 0xf0b, 0xf54, 0x3b,
-0xf5f, 0xfb3, 0xf0b, 0xf56, 0xf0b, 0xf51, 0xf42, 0xf74, 0xf0b, 0xf54, 0x3b, 0xf5f, 0xfb3, 0xf0b, 0xf56, 0xf0b, 0xf56, 0xf45, 0xf74, 0xf0b,
-0xf54, 0x3b, 0xf5f, 0xfb3, 0xf0b, 0xf56, 0xf0b, 0xf56, 0xf45, 0xf74, 0xf0b, 0xf42, 0xf45, 0xf72, 0xf42, 0xf0b, 0xf54, 0x3b, 0xf5f, 0xfb3,
-0xf0b, 0xf56, 0xf0b, 0xf56, 0xf45, 0xf74, 0xf0b, 0xf42, 0xf49, 0xf72, 0xf66, 0xf0b, 0xf54, 0x3b, 0x1325, 0x122a, 0x3b, 0x1208, 0x12ab, 0x3b,
-0x1218, 0x130b, 0x3b, 0x121a, 0x12eb, 0x3b, 0x130d, 0x1295, 0x3b, 0x1230, 0x1290, 0x3b, 0x1213, 0x121d, 0x3b, 0x1290, 0x1213, 0x3b, 0x1218, 0x1235,
-0x3b, 0x1325, 0x1245, 0x3b, 0x1215, 0x12f3, 0x3b, 0x1273, 0x1215, 0x3b, 0x1325, 0x122a, 0x3b, 0x1208, 0x12ab, 0x1272, 0x1275, 0x3b, 0x1218, 0x130b,
-0x1262, 0x1275, 0x3b, 0x121a, 0x12eb, 0x12dd, 0x12eb, 0x3b, 0x130d, 0x1295, 0x1266, 0x1275, 0x3b, 0x1230, 0x1290, 0x3b, 0x1213, 0x121d, 0x1208, 0x3b,
-0x1290, 0x1213, 0x1230, 0x3b, 0x1218, 0x1235, 0x12a8, 0x1228, 0x121d, 0x3b, 0x1325, 0x1245, 0x121d, 0x1272, 0x3b, 0x1215, 0x12f3, 0x122d, 0x3b, 0x1273,
-0x1215, 0x1233, 0x1235, 0x3b, 0x1325, 0x3b, 0x1208, 0x3b, 0x1218, 0x3b, 0x121a, 0x3b, 0x130d, 0x3b, 0x1230, 0x3b, 0x1213, 0x3b, 0x1290, 0x3b,
-0x1218, 0x3b, 0x1325, 0x3b, 0x1215, 0x3b, 0x1273, 0x3b, 0x53, 0x101, 0x6e, 0x3b, 0x46, 0x113, 0x70, 0x3b, 0x4d, 0x61, 0x2bb, 0x61,
-0x3b, 0x2bb, 0x45, 0x70, 0x65, 0x3b, 0x4d, 0x113, 0x3b, 0x53, 0x75, 0x6e, 0x3b, 0x53, 0x69, 0x75, 0x3b, 0x2bb, 0x41, 0x6f,
-0x6b, 0x3b, 0x53, 0x65, 0x70, 0x3b, 0x2bb, 0x4f, 0x6b, 0x61, 0x3b, 0x4e, 0x14d, 0x76, 0x3b, 0x54, 0x12b, 0x73, 0x3b, 0x53,
-0x101, 0x6e, 0x75, 0x61, 0x6c, 0x69, 0x3b, 0x46, 0x113, 0x70, 0x75, 0x65, 0x6c, 0x69, 0x3b, 0x4d, 0x61, 0x2bb, 0x61, 0x73,
-0x69, 0x3b, 0x2bb, 0x45, 0x70, 0x65, 0x6c, 0x65, 0x6c, 0x69, 0x3b, 0x4d, 0x113, 0x3b, 0x53, 0x75, 0x6e, 0x65, 0x3b, 0x53,
-0x69, 0x75, 0x6c, 0x61, 0x69, 0x3b, 0x2bb, 0x41, 0x6f, 0x6b, 0x6f, 0x73, 0x69, 0x3b, 0x53, 0x65, 0x70, 0x69, 0x74, 0x65,
-0x6d, 0x61, 0x3b, 0x2bb, 0x4f, 0x6b, 0x61, 0x74, 0x6f, 0x70, 0x61, 0x3b, 0x4e, 0x14d, 0x76, 0x65, 0x6d, 0x61, 0x3b, 0x54,
-0x12b, 0x73, 0x65, 0x6d, 0x61, 0x3b, 0x53, 0x3b, 0x46, 0x3b, 0x4d, 0x3b, 0x45, 0x3b, 0x4d, 0x3b, 0x53, 0x3b, 0x53, 0x3b,
-0x41, 0x3b, 0x53, 0x3b, 0x4f, 0x3b, 0x4e, 0x3b, 0x54, 0x3b, 0x4f, 0x63, 0x61, 0x3b, 0x15e, 0x75, 0x62, 0x3b, 0x4d, 0x61,
-0x72, 0x3b, 0x4e, 0x69, 0x73, 0x3b, 0x4d, 0x61, 0x79, 0x3b, 0x48, 0x61, 0x7a, 0x3b, 0x54, 0x65, 0x6d, 0x3b, 0x41, 0x11f,
-0x75, 0x3b, 0x45, 0x79, 0x6c, 0x3b, 0x45, 0x6b, 0x69, 0x3b, 0x4b, 0x61, 0x73, 0x3b, 0x41, 0x72, 0x61, 0x3b, 0x4f, 0x63,
-0x61, 0x6b, 0x3b, 0x15e, 0x75, 0x62, 0x61, 0x74, 0x3b, 0x4d, 0x61, 0x72, 0x74, 0x3b, 0x4e, 0x69, 0x73, 0x61, 0x6e, 0x3b,
-0x4d, 0x61, 0x79, 0x131, 0x73, 0x3b, 0x48, 0x61, 0x7a, 0x69, 0x72, 0x61, 0x6e, 0x3b, 0x54, 0x65, 0x6d, 0x6d, 0x75, 0x7a,
-0x3b, 0x41, 0x11f, 0x75, 0x73, 0x74, 0x6f, 0x73, 0x3b, 0x45, 0x79, 0x6c, 0xfc, 0x6c, 0x3b, 0x45, 0x6b, 0x69, 0x6d, 0x3b,
-0x4b, 0x61, 0x73, 0x131, 0x6d, 0x3b, 0x41, 0x72, 0x61, 0x6c, 0x131, 0x6b, 0x3b, 0x4f, 0x3b, 0x15e, 0x3b, 0x4d, 0x3b, 0x4e,
-0x3b, 0x4d, 0x3b, 0x48, 0x3b, 0x54, 0x3b, 0x41, 0x3b, 0x45, 0x3b, 0x45, 0x3b, 0x4b, 0x3b, 0x41, 0x3b, 0xdd, 0x61, 0x6e,
-0x3b, 0x46, 0x65, 0x77, 0x3b, 0x4d, 0x61, 0x72, 0x3b, 0x41, 0x70, 0x72, 0x3b, 0x4d, 0x61, 0xfd, 0x3b, 0x49, 0xfd, 0x75,
-0x6e, 0x3b, 0x49, 0xfd, 0x75, 0x6c, 0x3b, 0x41, 0x77, 0x67, 0x3b, 0x53, 0x65, 0x6e, 0x3b, 0x4f, 0x6b, 0x74, 0x3b, 0x4e,
-0x6f, 0xfd, 0x3b, 0x44, 0x65, 0x6b, 0x3b, 0xdd, 0x61, 0x6e, 0x77, 0x61, 0x72, 0x3b, 0x46, 0x65, 0x77, 0x72, 0x61, 0x6c,
-0x3b, 0x4d, 0x61, 0x72, 0x74, 0x3b, 0x41, 0x70, 0x72, 0x65, 0x6c, 0x3b, 0x4d, 0x61, 0xfd, 0x3b, 0x49, 0xfd, 0x75, 0x6e,
-0x3b, 0x49, 0xfd, 0x75, 0x6c, 0x3b, 0x41, 0x77, 0x67, 0x75, 0x73, 0x74, 0x3b, 0x53, 0x65, 0x6e, 0x74, 0xfd, 0x61, 0x62,
-0x72, 0x3b, 0x4f, 0x6b, 0x74, 0xfd, 0x61, 0x62, 0x72, 0x3b, 0x4e, 0x6f, 0xfd, 0x61, 0x62, 0x72, 0x3b, 0x44, 0x65, 0x6b,
-0x61, 0x62, 0x72, 0x3b, 0xdd, 0x3b, 0x46, 0x3b, 0x4d, 0x3b, 0x41, 0x3b, 0x4d, 0x3b, 0x49, 0x3b, 0x49, 0x3b, 0x41, 0x3b,
-0x53, 0x3b, 0x4f, 0x3b, 0x4e, 0x3b, 0x44, 0x3b, 0xfd, 0x61, 0x6e, 0x3b, 0x66, 0x65, 0x77, 0x3b, 0x6d, 0x61, 0x72, 0x74,
-0x3b, 0x61, 0x70, 0x72, 0x3b, 0x6d, 0x61, 0xfd, 0x3b, 0x69, 0xfd, 0x75, 0x6e, 0x3b, 0x69, 0xfd, 0x75, 0x6c, 0x3b, 0x61,
-0x77, 0x67, 0x3b, 0x73, 0x65, 0x6e, 0x3b, 0x6f, 0x6b, 0x74, 0x3b, 0x6e, 0x6f, 0xfd, 0x3b, 0x64, 0x65, 0x6b, 0x3b, 0xfd,
-0x61, 0x6e, 0x77, 0x61, 0x72, 0x3b, 0x66, 0x65, 0x77, 0x72, 0x61, 0x6c, 0x3b, 0x6d, 0x61, 0x72, 0x74, 0x3b, 0x61, 0x70,
-0x72, 0x65, 0x6c, 0x3b, 0x6d, 0x61, 0xfd, 0x3b, 0x69, 0xfd, 0x75, 0x6e, 0x3b, 0x69, 0xfd, 0x75, 0x6c, 0x3b, 0x61, 0x77,
-0x67, 0x75, 0x73, 0x74, 0x3b, 0x73, 0x65, 0x6e, 0x74, 0xfd, 0x61, 0x62, 0x72, 0x3b, 0x6f, 0x6b, 0x74, 0xfd, 0x61, 0x62,
-0x72, 0x3b, 0x6e, 0x6f, 0xfd, 0x61, 0x62, 0x72, 0x3b, 0x64, 0x65, 0x6b, 0x61, 0x62, 0x72, 0x3b, 0x64a, 0x627, 0x646, 0x6cb,
-0x627, 0x631, 0x3b, 0x641, 0x6d0, 0x6cb, 0x631, 0x627, 0x644, 0x3b, 0x645, 0x627, 0x631, 0x62a, 0x3b, 0x626, 0x627, 0x67e, 0x631, 0x6d0,
-0x644, 0x3b, 0x645, 0x627, 0x64a, 0x3b, 0x626, 0x649, 0x64a, 0x6c7, 0x646, 0x3b, 0x626, 0x649, 0x64a, 0x6c7, 0x644, 0x3b, 0x626, 0x627,
-0x6cb, 0x63a, 0x6c7, 0x633, 0x62a, 0x3b, 0x633, 0x6d0, 0x646, 0x62a, 0x6d5, 0x628, 0x649, 0x631, 0x3b, 0x626, 0x6c6, 0x643, 0x62a, 0x6d5,
-0x628, 0x649, 0x631, 0x3b, 0x646, 0x648, 0x64a, 0x627, 0x628, 0x649, 0x631, 0x3b, 0x62f, 0x6d0, 0x643, 0x627, 0x628, 0x649, 0x631, 0x3b,
-0x441, 0x456, 0x447, 0x3b, 0x43b, 0x44e, 0x442, 0x3b, 0x431, 0x435, 0x440, 0x3b, 0x43a, 0x432, 0x456, 0x3b, 0x442, 0x440, 0x430, 0x3b,
-0x447, 0x435, 0x440, 0x3b, 0x43b, 0x438, 0x43f, 0x3b, 0x441, 0x435, 0x440, 0x3b, 0x432, 0x435, 0x440, 0x3b, 0x436, 0x43e, 0x432, 0x3b,
-0x43b, 0x438, 0x441, 0x3b, 0x433, 0x440, 0x443, 0x3b, 0x441, 0x456, 0x447, 0x435, 0x43d, 0x44c, 0x3b, 0x43b, 0x44e, 0x442, 0x438, 0x439,
-0x3b, 0x431, 0x435, 0x440, 0x435, 0x437, 0x435, 0x43d, 0x44c, 0x3b, 0x43a, 0x432, 0x456, 0x442, 0x435, 0x43d, 0x44c, 0x3b, 0x442, 0x440,
-0x430, 0x432, 0x435, 0x43d, 0x44c, 0x3b, 0x447, 0x435, 0x440, 0x432, 0x435, 0x43d, 0x44c, 0x3b, 0x43b, 0x438, 0x43f, 0x435, 0x43d, 0x44c,
-0x3b, 0x441, 0x435, 0x440, 0x43f, 0x435, 0x43d, 0x44c, 0x3b, 0x432, 0x435, 0x440, 0x435, 0x441, 0x435, 0x43d, 0x44c, 0x3b, 0x436, 0x43e,
-0x432, 0x442, 0x435, 0x43d, 0x44c, 0x3b, 0x43b, 0x438, 0x441, 0x442, 0x43e, 0x43f, 0x430, 0x434, 0x3b, 0x433, 0x440, 0x443, 0x434, 0x435,
-0x43d, 0x44c, 0x3b, 0x421, 0x3b, 0x41b, 0x3b, 0x411, 0x3b, 0x41a, 0x3b, 0x422, 0x3b, 0x427, 0x3b, 0x41b, 0x3b, 0x421, 0x3b, 0x412,
-0x3b, 0x416, 0x3b, 0x41b, 0x3b, 0x413, 0x3b, 0x441, 0x456, 0x447, 0x2e, 0x3b, 0x43b, 0x44e, 0x442, 0x2e, 0x3b, 0x431, 0x435, 0x440,
-0x2e, 0x3b, 0x43a, 0x432, 0x456, 0x442, 0x2e, 0x3b, 0x442, 0x440, 0x430, 0x432, 0x2e, 0x3b, 0x447, 0x435, 0x440, 0x432, 0x2e, 0x3b,
-0x43b, 0x438, 0x43f, 0x2e, 0x3b, 0x441, 0x435, 0x440, 0x43f, 0x2e, 0x3b, 0x432, 0x435, 0x440, 0x2e, 0x3b, 0x436, 0x43e, 0x432, 0x442,
-0x2e, 0x3b, 0x43b, 0x438, 0x441, 0x442, 0x2e, 0x3b, 0x433, 0x440, 0x443, 0x434, 0x2e, 0x3b, 0x441, 0x456, 0x447, 0x43d, 0x44f, 0x3b,
-0x43b, 0x44e, 0x442, 0x43e, 0x433, 0x43e, 0x3b, 0x431, 0x435, 0x440, 0x435, 0x437, 0x43d, 0x44f, 0x3b, 0x43a, 0x432, 0x456, 0x442, 0x43d,
-0x44f, 0x3b, 0x442, 0x440, 0x430, 0x432, 0x43d, 0x44f, 0x3b, 0x447, 0x435, 0x440, 0x432, 0x43d, 0x44f, 0x3b, 0x43b, 0x438, 0x43f, 0x43d,
-0x44f, 0x3b, 0x441, 0x435, 0x440, 0x43f, 0x43d, 0x44f, 0x3b, 0x432, 0x435, 0x440, 0x435, 0x441, 0x43d, 0x44f, 0x3b, 0x436, 0x43e, 0x432,
-0x442, 0x43d, 0x44f, 0x3b, 0x43b, 0x438, 0x441, 0x442, 0x43e, 0x43f, 0x430, 0x434, 0x430, 0x3b, 0x433, 0x440, 0x443, 0x434, 0x43d, 0x44f,
-0x3b, 0x441, 0x3b, 0x43b, 0x3b, 0x431, 0x3b, 0x43a, 0x3b, 0x442, 0x3b, 0x447, 0x3b, 0x43b, 0x3b, 0x441, 0x3b, 0x432, 0x3b, 0x436,
-0x3b, 0x43b, 0x3b, 0x433, 0x3b, 0x62c, 0x646, 0x648, 0x631, 0x6cc, 0x3b, 0x641, 0x631, 0x648, 0x631, 0x6cc, 0x3b, 0x645, 0x627, 0x631,
-0x686, 0x3b, 0x627, 0x67e, 0x631, 0x6cc, 0x644, 0x3b, 0x645, 0x626, 0x6cc, 0x3b, 0x62c, 0x648, 0x646, 0x3b, 0x62c, 0x648, 0x644, 0x627,
-0x626, 0x6cc, 0x3b, 0x627, 0x6af, 0x633, 0x62a, 0x3b, 0x633, 0x62a, 0x645, 0x628, 0x631, 0x3b, 0x627, 0x6a9, 0x62a, 0x648, 0x628, 0x631,
-0x3b, 0x646, 0x648, 0x645, 0x628, 0x631, 0x3b, 0x62f, 0x633, 0x645, 0x628, 0x631, 0x3b, 0x59, 0x61, 0x6e, 0x3b, 0x46, 0x65, 0x76,
-0x3b, 0x4d, 0x61, 0x72, 0x3b, 0x41, 0x70, 0x72, 0x3b, 0x4d, 0x61, 0x79, 0x3b, 0x49, 0x79, 0x6e, 0x3b, 0x49, 0x79, 0x6c,
-0x3b, 0x41, 0x76, 0x67, 0x3b, 0x53, 0x65, 0x6e, 0x3b, 0x4f, 0x6b, 0x74, 0x3b, 0x4e, 0x6f, 0x79, 0x3b, 0x44, 0x65, 0x6b,
-0x3b, 0x59, 0x61, 0x6e, 0x76, 0x61, 0x72, 0x3b, 0x46, 0x65, 0x76, 0x72, 0x61, 0x6c, 0x3b, 0x4d, 0x61, 0x72, 0x74, 0x3b,
-0x41, 0x70, 0x72, 0x65, 0x6c, 0x3b, 0x4d, 0x61, 0x79, 0x3b, 0x49, 0x79, 0x75, 0x6e, 0x3b, 0x49, 0x79, 0x75, 0x6c, 0x3b,
-0x41, 0x76, 0x67, 0x75, 0x73, 0x74, 0x3b, 0x53, 0x65, 0x6e, 0x74, 0x61, 0x62, 0x72, 0x3b, 0x4f, 0x6b, 0x74, 0x61, 0x62,
-0x72, 0x3b, 0x4e, 0x6f, 0x79, 0x61, 0x62, 0x72, 0x3b, 0x44, 0x65, 0x6b, 0x61, 0x62, 0x72, 0x3b, 0x59, 0x3b, 0x46, 0x3b,
-0x4d, 0x3b, 0x41, 0x3b, 0x4d, 0x3b, 0x49, 0x3b, 0x49, 0x3b, 0x41, 0x3b, 0x53, 0x3b, 0x4f, 0x3b, 0x4e, 0x3b, 0x44, 0x3b,
-0x79, 0x61, 0x6e, 0x3b, 0x66, 0x65, 0x76, 0x3b, 0x6d, 0x61, 0x72, 0x3b, 0x61, 0x70, 0x72, 0x3b, 0x6d, 0x61, 0x79, 0x3b,
-0x69, 0x79, 0x6e, 0x3b, 0x69, 0x79, 0x6c, 0x3b, 0x61, 0x76, 0x67, 0x3b, 0x73, 0x65, 0x6e, 0x3b, 0x6f, 0x6b, 0x74, 0x3b,
-0x6e, 0x6f, 0x79, 0x3b, 0x64, 0x65, 0x6b, 0x3b, 0x79, 0x61, 0x6e, 0x76, 0x61, 0x72, 0x3b, 0x66, 0x65, 0x76, 0x72, 0x61,
-0x6c, 0x3b, 0x6d, 0x61, 0x72, 0x74, 0x3b, 0x61, 0x70, 0x72, 0x65, 0x6c, 0x3b, 0x6d, 0x61, 0x79, 0x3b, 0x69, 0x79, 0x75,
-0x6e, 0x3b, 0x69, 0x79, 0x75, 0x6c, 0x3b, 0x61, 0x76, 0x67, 0x75, 0x73, 0x74, 0x3b, 0x73, 0x65, 0x6e, 0x74, 0x61, 0x62,
-0x72, 0x3b, 0x6f, 0x6b, 0x74, 0x61, 0x62, 0x72, 0x3b, 0x6e, 0x6f, 0x79, 0x61, 0x62, 0x72, 0x3b, 0x64, 0x65, 0x6b, 0x61,
-0x62, 0x72, 0x3b, 0x62c, 0x646, 0x648, 0x3b, 0x641, 0x628, 0x631, 0x3b, 0x645, 0x627, 0x631, 0x3b, 0x627, 0x67e, 0x631, 0x3b, 0x645,
-0x6cc, 0x3b, 0x62c, 0x648, 0x646, 0x3b, 0x62c, 0x648, 0x644, 0x3b, 0x627, 0x6af, 0x633, 0x3b, 0x633, 0x67e, 0x62a, 0x3b, 0x627, 0x6a9,
-0x62a, 0x3b, 0x646, 0x648, 0x645, 0x3b, 0x62f, 0x633, 0x645, 0x3b, 0x44f, 0x43d, 0x432, 0x3b, 0x444, 0x435, 0x432, 0x3b, 0x43c, 0x430,
-0x440, 0x3b, 0x430, 0x43f, 0x440, 0x3b, 0x43c, 0x430, 0x439, 0x3b, 0x438, 0x44e, 0x43d, 0x3b, 0x438, 0x44e, 0x43b, 0x3b, 0x430, 0x432,
-0x433, 0x3b, 0x441, 0x435, 0x43d, 0x3b, 0x43e, 0x43a, 0x442, 0x3b, 0x43d, 0x43e, 0x44f, 0x3b, 0x434, 0x435, 0x43a, 0x3b, 0x44f, 0x43d,
-0x432, 0x430, 0x440, 0x3b, 0x444, 0x435, 0x432, 0x440, 0x430, 0x43b, 0x3b, 0x43c, 0x430, 0x440, 0x442, 0x3b, 0x430, 0x43f, 0x440, 0x435,
-0x43b, 0x3b, 0x43c, 0x430, 0x439, 0x3b, 0x438, 0x44e, 0x43d, 0x3b, 0x438, 0x44e, 0x43b, 0x3b, 0x430, 0x432, 0x433, 0x443, 0x441, 0x442,
-0x3b, 0x441, 0x435, 0x43d, 0x442, 0x44f, 0x431, 0x440, 0x3b, 0x43e, 0x43a, 0x442, 0x44f, 0x431, 0x440, 0x3b, 0x43d, 0x43e, 0x44f, 0x431,
-0x440, 0x3b, 0x434, 0x435, 0x43a, 0x430, 0x431, 0x440, 0x3b, 0x54, 0x68, 0x67, 0x20, 0x31, 0x3b, 0x54, 0x68, 0x67, 0x20, 0x32,
-0x3b, 0x54, 0x68, 0x67, 0x20, 0x33, 0x3b, 0x54, 0x68, 0x67, 0x20, 0x34, 0x3b, 0x54, 0x68, 0x67, 0x20, 0x35, 0x3b, 0x54,
-0x68, 0x67, 0x20, 0x36, 0x3b, 0x54, 0x68, 0x67, 0x20, 0x37, 0x3b, 0x54, 0x68, 0x67, 0x20, 0x38, 0x3b, 0x54, 0x68, 0x67,
-0x20, 0x39, 0x3b, 0x54, 0x68, 0x67, 0x20, 0x31, 0x30, 0x3b, 0x54, 0x68, 0x67, 0x20, 0x31, 0x31, 0x3b, 0x54, 0x68, 0x67,
-0x20, 0x31, 0x32, 0x3b, 0x54, 0x68, 0xe1, 0x6e, 0x67, 0x20, 0x31, 0x3b, 0x54, 0x68, 0xe1, 0x6e, 0x67, 0x20, 0x32, 0x3b,
-0x54, 0x68, 0xe1, 0x6e, 0x67, 0x20, 0x33, 0x3b, 0x54, 0x68, 0xe1, 0x6e, 0x67, 0x20, 0x34, 0x3b, 0x54, 0x68, 0xe1, 0x6e,
-0x67, 0x20, 0x35, 0x3b, 0x54, 0x68, 0xe1, 0x6e, 0x67, 0x20, 0x36, 0x3b, 0x54, 0x68, 0xe1, 0x6e, 0x67, 0x20, 0x37, 0x3b,
-0x54, 0x68, 0xe1, 0x6e, 0x67, 0x20, 0x38, 0x3b, 0x54, 0x68, 0xe1, 0x6e, 0x67, 0x20, 0x39, 0x3b, 0x54, 0x68, 0xe1, 0x6e,
-0x67, 0x20, 0x31, 0x30, 0x3b, 0x54, 0x68, 0xe1, 0x6e, 0x67, 0x20, 0x31, 0x31, 0x3b, 0x54, 0x68, 0xe1, 0x6e, 0x67, 0x20,
-0x31, 0x32, 0x3b, 0x74, 0x68, 0x67, 0x20, 0x31, 0x3b, 0x74, 0x68, 0x67, 0x20, 0x32, 0x3b, 0x74, 0x68, 0x67, 0x20, 0x33,
-0x3b, 0x74, 0x68, 0x67, 0x20, 0x34, 0x3b, 0x74, 0x68, 0x67, 0x20, 0x35, 0x3b, 0x74, 0x68, 0x67, 0x20, 0x36, 0x3b, 0x74,
-0x68, 0x67, 0x20, 0x37, 0x3b, 0x74, 0x68, 0x67, 0x20, 0x38, 0x3b, 0x74, 0x68, 0x67, 0x20, 0x39, 0x3b, 0x74, 0x68, 0x67,
-0x20, 0x31, 0x30, 0x3b, 0x74, 0x68, 0x67, 0x20, 0x31, 0x31, 0x3b, 0x74, 0x68, 0x67, 0x20, 0x31, 0x32, 0x3b, 0x74, 0x68,
-0xe1, 0x6e, 0x67, 0x20, 0x31, 0x3b, 0x74, 0x68, 0xe1, 0x6e, 0x67, 0x20, 0x32, 0x3b, 0x74, 0x68, 0xe1, 0x6e, 0x67, 0x20,
-0x33, 0x3b, 0x74, 0x68, 0xe1, 0x6e, 0x67, 0x20, 0x34, 0x3b, 0x74, 0x68, 0xe1, 0x6e, 0x67, 0x20, 0x35, 0x3b, 0x74, 0x68,
-0xe1, 0x6e, 0x67, 0x20, 0x36, 0x3b, 0x74, 0x68, 0xe1, 0x6e, 0x67, 0x20, 0x37, 0x3b, 0x74, 0x68, 0xe1, 0x6e, 0x67, 0x20,
-0x38, 0x3b, 0x74, 0x68, 0xe1, 0x6e, 0x67, 0x20, 0x39, 0x3b, 0x74, 0x68, 0xe1, 0x6e, 0x67, 0x20, 0x31, 0x30, 0x3b, 0x74,
-0x68, 0xe1, 0x6e, 0x67, 0x20, 0x31, 0x31, 0x3b, 0x74, 0x68, 0xe1, 0x6e, 0x67, 0x20, 0x31, 0x32, 0x3b, 0x79, 0x61, 0x6e,
-0x3b, 0x66, 0x65, 0x62, 0x3b, 0x6d, 0xe4, 0x7a, 0x3b, 0x70, 0x72, 0x6c, 0x3b, 0x6d, 0x61, 0x79, 0x3b, 0x79, 0x75, 0x6e,
-0x3b, 0x79, 0x75, 0x6c, 0x3b, 0x67, 0x73, 0x74, 0x3b, 0x73, 0x65, 0x74, 0x3b, 0x74, 0x6f, 0x62, 0x3b, 0x6e, 0x6f, 0x76,
-0x3b, 0x64, 0x65, 0x6b, 0x3b, 0x79, 0x61, 0x6e, 0x75, 0x6c, 0x3b, 0x66, 0x65, 0x62, 0x75, 0x6c, 0x3b, 0x6d, 0xe4, 0x7a,
-0x75, 0x6c, 0x3b, 0x70, 0x72, 0x69, 0x6c, 0x75, 0x6c, 0x3b, 0x6d, 0x61, 0x79, 0x75, 0x6c, 0x3b, 0x79, 0x75, 0x6e, 0x75,
-0x6c, 0x3b, 0x79, 0x75, 0x6c, 0x75, 0x6c, 0x3b, 0x67, 0x75, 0x73, 0x74, 0x75, 0x6c, 0x3b, 0x73, 0x65, 0x74, 0x75, 0x6c,
-0x3b, 0x74, 0x6f, 0x62, 0x75, 0x6c, 0x3b, 0x6e, 0x6f, 0x76, 0x75, 0x6c, 0x3b, 0x64, 0x65, 0x6b, 0x75, 0x6c, 0x3b, 0x59,
-0x3b, 0x46, 0x3b, 0x4d, 0x3b, 0x50, 0x3b, 0x4d, 0x3b, 0x59, 0x3b, 0x59, 0x3b, 0x47, 0x3b, 0x53, 0x3b, 0x54, 0x3b, 0x4e,
-0x3b, 0x44, 0x3b, 0x79, 0x61, 0x6e, 0x3b, 0x66, 0x65, 0x62, 0x3b, 0x6d, 0xe4, 0x7a, 0x3b, 0x70, 0x72, 0x6c, 0x3b, 0x6d,
-0x61, 0x79, 0x3b, 0x79, 0x75, 0x6e, 0x3b, 0x79, 0x75, 0x6c, 0x3b, 0x67, 0x73, 0x74, 0x3b, 0x73, 0x65, 0x74, 0x3b, 0x74,
-0x6f, 0x6e, 0x3b, 0x6e, 0x6f, 0x76, 0x3b, 0x64, 0x65, 0x6b, 0x3b, 0x49, 0x6f, 0x6e, 0x3b, 0x43, 0x68, 0x77, 0x3b, 0x4d,
-0x61, 0x77, 0x3b, 0x45, 0x62, 0x72, 0x3b, 0x4d, 0x61, 0x69, 0x3b, 0x4d, 0x65, 0x68, 0x3b, 0x47, 0x6f, 0x72, 0x3b, 0x41,
-0x77, 0x73, 0x74, 0x3b, 0x4d, 0x65, 0x64, 0x69, 0x3b, 0x48, 0x79, 0x64, 0x3b, 0x54, 0x61, 0x63, 0x68, 0x3b, 0x52, 0x68,
-0x61, 0x67, 0x3b, 0x49, 0x6f, 0x6e, 0x61, 0x77, 0x72, 0x3b, 0x43, 0x68, 0x77, 0x65, 0x66, 0x72, 0x6f, 0x72, 0x3b, 0x4d,
-0x61, 0x77, 0x72, 0x74, 0x68, 0x3b, 0x45, 0x62, 0x72, 0x69, 0x6c, 0x6c, 0x3b, 0x4d, 0x61, 0x69, 0x3b, 0x4d, 0x65, 0x68,
-0x65, 0x66, 0x69, 0x6e, 0x3b, 0x47, 0x6f, 0x72, 0x66, 0x66, 0x65, 0x6e, 0x6e, 0x61, 0x66, 0x3b, 0x41, 0x77, 0x73, 0x74,
-0x3b, 0x4d, 0x65, 0x64, 0x69, 0x3b, 0x48, 0x79, 0x64, 0x72, 0x65, 0x66, 0x3b, 0x54, 0x61, 0x63, 0x68, 0x77, 0x65, 0x64,
-0x64, 0x3b, 0x52, 0x68, 0x61, 0x67, 0x66, 0x79, 0x72, 0x3b, 0x49, 0x3b, 0x43, 0x68, 0x3b, 0x4d, 0x3b, 0x45, 0x3b, 0x4d,
-0x3b, 0x4d, 0x3b, 0x47, 0x3b, 0x41, 0x3b, 0x4d, 0x3b, 0x48, 0x3b, 0x54, 0x3b, 0x52, 0x68, 0x3b, 0x49, 0x6f, 0x6e, 0x3b,
-0x43, 0x68, 0x77, 0x65, 0x66, 0x3b, 0x4d, 0x61, 0x77, 0x3b, 0x45, 0x62, 0x72, 0x69, 0x6c, 0x6c, 0x3b, 0x4d, 0x61, 0x69,
-0x3b, 0x4d, 0x65, 0x68, 0x3b, 0x47, 0x6f, 0x72, 0x66, 0x66, 0x3b, 0x41, 0x77, 0x73, 0x74, 0x3b, 0x4d, 0x65, 0x64, 0x69,
-0x3b, 0x48, 0x79, 0x64, 0x3b, 0x54, 0x61, 0x63, 0x68, 0x3b, 0x52, 0x68, 0x61, 0x67, 0x3b, 0x53, 0x61, 0x6d, 0x3b, 0x46,
-0x65, 0x77, 0x3b, 0x4d, 0x61, 0x72, 0x3b, 0x41, 0x77, 0x72, 0x3b, 0x4d, 0x65, 0x65, 0x3b, 0x53, 0x75, 0x77, 0x3b, 0x53,
-0x75, 0x6c, 0x3b, 0x55, 0x74, 0x3b, 0x53, 0xe0, 0x74, 0x3b, 0x4f, 0x6b, 0x74, 0x3b, 0x4e, 0x6f, 0x77, 0x3b, 0x44, 0x65,
-0x73, 0x3b, 0x53, 0x61, 0x6d, 0x77, 0x69, 0x79, 0x65, 0x65, 0x3b, 0x46, 0x65, 0x77, 0x72, 0x69, 0x79, 0x65, 0x65, 0x3b,
-0x4d, 0x61, 0x72, 0x73, 0x3b, 0x41, 0x77, 0x72, 0x69, 0x6c, 0x3b, 0x4d, 0x65, 0x65, 0x3b, 0x53, 0x75, 0x77, 0x65, 0x3b,
-0x53, 0x75, 0x6c, 0x65, 0x74, 0x3b, 0x55, 0x74, 0x3b, 0x53, 0xe0, 0x74, 0x74, 0x75, 0x6d, 0x62, 0x61, 0x72, 0x3b, 0x4f,
-0x6b, 0x74, 0x6f, 0x6f, 0x62, 0x61, 0x72, 0x3b, 0x4e, 0x6f, 0x77, 0xe0, 0x6d, 0x62, 0x61, 0x72, 0x3b, 0x44, 0x65, 0x73,
-0xe0, 0x6d, 0x62, 0x61, 0x72, 0x3b, 0x4a, 0x61, 0x6e, 0x3b, 0x46, 0x65, 0x62, 0x3b, 0x4d, 0x61, 0x74, 0x3b, 0x45, 0x70,
-0x72, 0x3b, 0x4d, 0x65, 0x79, 0x3b, 0x4a, 0x75, 0x6e, 0x3b, 0x4a, 0x75, 0x6c, 0x3b, 0x41, 0x67, 0x61, 0x3b, 0x53, 0x65,
-0x70, 0x3b, 0x4f, 0x6b, 0x74, 0x3b, 0x4e, 0x6f, 0x76, 0x3b, 0x44, 0x69, 0x73, 0x3b, 0x4a, 0x61, 0x6e, 0x79, 0x75, 0x77,
-0x61, 0x72, 0x69, 0x3b, 0x46, 0x65, 0x62, 0x72, 0x75, 0x77, 0x61, 0x72, 0x69, 0x3b, 0x4d, 0x61, 0x74, 0x73, 0x68, 0x69,
-0x3b, 0x45, 0x70, 0x72, 0x65, 0x6c, 0x69, 0x3b, 0x4d, 0x65, 0x79, 0x69, 0x3b, 0x4a, 0x75, 0x6e, 0x69, 0x3b, 0x4a, 0x75,
-0x6c, 0x61, 0x79, 0x69, 0x3b, 0x41, 0x67, 0x61, 0x73, 0x74, 0x69, 0x3b, 0x53, 0x65, 0x70, 0x74, 0x65, 0x6d, 0x62, 0x61,
-0x3b, 0x4f, 0x6b, 0x74, 0x68, 0x6f, 0x62, 0x61, 0x3b, 0x4e, 0x6f, 0x76, 0x65, 0x6d, 0x62, 0x61, 0x3b, 0x44, 0x69, 0x73,
-0x65, 0x6d, 0x62, 0x61, 0x3b, 0x5d9, 0x5d0, 0x5b7, 0x5e0, 0x3b, 0x5e4, 0x5bf, 0x5e2, 0x5d1, 0x3b, 0x5de, 0x5e2, 0x5e8, 0x5e5, 0x3b,
-0x5d0, 0x5b7, 0x5e4, 0x5bc, 0x5e8, 0x3b, 0x5de, 0x5d9, 0x5d9, 0x3b, 0x5d9, 0x5d5, 0x5e0, 0x5d9, 0x3b, 0x5d9, 0x5d5, 0x5dc, 0x5d9, 0x3b,
-0x5d0, 0x5d5, 0x5d9, 0x5d2, 0x3b, 0x5e1, 0x5e2, 0x5e4, 0x5bc, 0x3b, 0x5d0, 0x5e7, 0x5d8, 0x3b, 0x5e0, 0x5d0, 0x5d5, 0x5d5, 0x3b, 0x5d3,
-0x5e2, 0x5e6, 0x3b, 0x5d9, 0x5d0, 0x5b7, 0x5e0, 0x5d5, 0x5d0, 0x5b7, 0x5e8, 0x3b, 0x5e4, 0x5bf, 0x5e2, 0x5d1, 0x5e8, 0x5d5, 0x5d0, 0x5b7,
-0x5e8, 0x3b, 0x5de, 0x5e2, 0x5e8, 0x5e5, 0x3b, 0x5d0, 0x5b7, 0x5e4, 0x5bc, 0x5e8, 0x5d9, 0x5dc, 0x3b, 0x5de, 0x5d9, 0x5d9, 0x3b, 0x5d9,
-0x5d5, 0x5e0, 0x5d9, 0x3b, 0x5d9, 0x5d5, 0x5dc, 0x5d9, 0x3b, 0x5d0, 0x5d5, 0x5d9, 0x5d2, 0x5d5, 0x5e1, 0x5d8, 0x3b, 0x5e1, 0x5e2, 0x5e4,
-0x5bc, 0x5d8, 0x5e2, 0x5de, 0x5d1, 0x5e2, 0x5e8, 0x3b, 0x5d0, 0x5e7, 0x5d8, 0x5d0, 0x5d1, 0x5e2, 0x5e8, 0x3b, 0x5e0, 0x5d0, 0x5d5, 0x5d5,
-0x5e2, 0x5de, 0x5d1, 0x5e2, 0x5e8, 0x3b, 0x5d3, 0x5e2, 0x5e6, 0x5e2, 0x5de, 0x5d1, 0x5e2, 0x5e8, 0x3b, 0x1e62, 0x1eb9, 0x301, 0x3b, 0xc8,
-0x72, 0x3b, 0x1eb8, 0x72, 0x3b, 0xcc, 0x67, 0x3b, 0x1eb8, 0x300, 0x62, 0x3b, 0xd2, 0x6b, 0x3b, 0x41, 0x67, 0x3b, 0xd2, 0x67,
-0x3b, 0x4f, 0x77, 0x3b, 0x1ecc, 0x300, 0x77, 0x3b, 0x42, 0xe9, 0x3b, 0x1ecc, 0x300, 0x70, 0x3b, 0x1e62, 0x1eb9, 0x301, 0x72, 0x1eb9,
-0x301, 0x3b, 0xc8, 0x72, 0xe8, 0x6c, 0xe8, 0x3b, 0x1eb8, 0x72, 0x1eb9, 0x300, 0x6e, 0xe0, 0x3b, 0xcc, 0x67, 0x62, 0xe9, 0x3b,
-0x1eb8, 0x300, 0x62, 0x69, 0x62, 0x69, 0x3b, 0xd2, 0x6b, 0xfa, 0x64, 0x75, 0x3b, 0x41, 0x67, 0x1eb9, 0x6d, 0x1ecd, 0x3b, 0xd2,
-0x67, 0xfa, 0x6e, 0x3b, 0x4f, 0x77, 0x65, 0x77, 0x65, 0x3b, 0x1ecc, 0x300, 0x77, 0xe0, 0x72, 0xe0, 0x3b, 0x42, 0xe9, 0x6c,
-0xfa, 0x3b, 0x1ecc, 0x300, 0x70, 0x1eb9, 0x300, 0x3b, 0x53, 0x3b, 0xc8, 0x3b, 0x1eb8, 0x3b, 0xcc, 0x3b, 0x1eb8, 0x300, 0x3b, 0xd2,
-0x3b, 0x41, 0x3b, 0xd2, 0x3b, 0x4f, 0x3b, 0x1ecc, 0x300, 0x3b, 0x42, 0x3b, 0x1ecc, 0x300, 0x3b, 0x1e62, 0x1eb9, 0x301, 0x72, 0x3b,
-0xc8, 0x72, 0xe8, 0x6c, 0x3b, 0x1eb8, 0x72, 0x1eb9, 0x300, 0x6e, 0x3b, 0xcc, 0x67, 0x62, 0x3b, 0x1eb8, 0x300, 0x62, 0x69, 0x3b,
-0xd2, 0x6b, 0xfa, 0x3b, 0x41, 0x67, 0x1eb9, 0x3b, 0xd2, 0x67, 0xfa, 0x3b, 0x4f, 0x77, 0x65, 0x3b, 0x1ecc, 0x300, 0x77, 0xe0,
-0x3b, 0x42, 0xe9, 0x6c, 0x3b, 0x1ecc, 0x300, 0x70, 0x1eb9, 0x3b, 0x4f, 0x1e63, 0xf9, 0x20, 0x1e62, 0x1eb9, 0x301, 0x72, 0x1eb9, 0x301,
-0x3b, 0x4f, 0x1e63, 0xf9, 0x20, 0xc8, 0x72, 0xe8, 0x6c, 0xe8, 0x3b, 0x4f, 0x1e63, 0xf9, 0x20, 0x1eb8, 0x72, 0x1eb9, 0x300, 0x6e,
-0xe0, 0x3b, 0x4f, 0x1e63, 0xf9, 0x20, 0xcc, 0x67, 0x62, 0xe9, 0x3b, 0x4f, 0x1e63, 0xf9, 0x20, 0x1eb8, 0x300, 0x62, 0x69, 0x62,
-0x69, 0x3b, 0x4f, 0x1e63, 0xf9, 0x20, 0xd2, 0x6b, 0xfa, 0x64, 0x75, 0x3b, 0x4f, 0x1e63, 0xf9, 0x20, 0x41, 0x67, 0x1eb9, 0x6d,
-0x1ecd, 0x3b, 0x4f, 0x1e63, 0xf9, 0x20, 0xd2, 0x67, 0xfa, 0x6e, 0x3b, 0x4f, 0x1e63, 0xf9, 0x20, 0x4f, 0x77, 0x65, 0x77, 0x65,
-0x3b, 0x4f, 0x1e63, 0xf9, 0x20, 0x1ecc, 0x300, 0x77, 0xe0, 0x72, 0xe0, 0x3b, 0x4f, 0x1e63, 0xf9, 0x20, 0x42, 0xe9, 0x6c, 0xfa,
-0x3b, 0x4f, 0x1e63, 0xf9, 0x20, 0x1ecc, 0x300, 0x70, 0x1eb9, 0x300, 0x3b, 0x53, 0x68, 0x25b, 0x301, 0x3b, 0xc8, 0x72, 0x3b, 0x190,
-0x72, 0x3b, 0xcc, 0x67, 0x3b, 0x190, 0x300, 0x62, 0x3b, 0xd2, 0x6b, 0x3b, 0x41, 0x67, 0x3b, 0xd2, 0x67, 0x3b, 0x4f, 0x77,
-0x3b, 0x186, 0x300, 0x77, 0x3b, 0x42, 0xe9, 0x3b, 0x186, 0x300, 0x70, 0x3b, 0x53, 0x68, 0x25b, 0x301, 0x72, 0x25b, 0x301, 0x3b,
-0xc8, 0x72, 0xe8, 0x6c, 0xe8, 0x3b, 0x190, 0x72, 0x25b, 0x300, 0x6e, 0xe0, 0x3b, 0xcc, 0x67, 0x62, 0xe9, 0x3b, 0x190, 0x300,
-0x62, 0x69, 0x62, 0x69, 0x3b, 0xd2, 0x6b, 0xfa, 0x64, 0x75, 0x3b, 0x41, 0x67, 0x25b, 0x6d, 0x254, 0x3b, 0xd2, 0x67, 0xfa,
-0x6e, 0x3b, 0x4f, 0x77, 0x65, 0x77, 0x65, 0x3b, 0x186, 0x300, 0x77, 0xe0, 0x72, 0xe0, 0x3b, 0x42, 0xe9, 0x6c, 0xfa, 0x3b,
-0x186, 0x300, 0x70, 0x25b, 0x300, 0x3b, 0x53, 0x3b, 0xc8, 0x3b, 0x190, 0x3b, 0xcc, 0x3b, 0x190, 0x300, 0x3b, 0xd2, 0x3b, 0x41,
-0x3b, 0xd2, 0x3b, 0x4f, 0x3b, 0x186, 0x300, 0x3b, 0x42, 0x3b, 0x186, 0x300, 0x3b, 0x53, 0x68, 0x25b, 0x301, 0x72, 0x3b, 0xc8,
-0x72, 0xe8, 0x6c, 0x3b, 0x190, 0x72, 0x25b, 0x300, 0x6e, 0x3b, 0xcc, 0x67, 0x62, 0x3b, 0x190, 0x300, 0x62, 0x69, 0x3b, 0xd2,
-0x6b, 0xfa, 0x3b, 0x41, 0x67, 0x25b, 0x3b, 0xd2, 0x67, 0xfa, 0x3b, 0x4f, 0x77, 0x65, 0x3b, 0x186, 0x300, 0x77, 0xe0, 0x3b,
-0x42, 0xe9, 0x6c, 0x3b, 0x186, 0x300, 0x70, 0x25b, 0x3b, 0x4f, 0x73, 0x68, 0xf9, 0x20, 0x53, 0x68, 0x25b, 0x301, 0x72, 0x25b,
-0x301, 0x3b, 0x4f, 0x73, 0x68, 0xf9, 0x20, 0xc8, 0x72, 0xe8, 0x6c, 0xe8, 0x3b, 0x4f, 0x73, 0x68, 0xf9, 0x20, 0x190, 0x72,
-0x25b, 0x300, 0x6e, 0xe0, 0x3b, 0x4f, 0x73, 0x68, 0xf9, 0x20, 0xcc, 0x67, 0x62, 0xe9, 0x3b, 0x4f, 0x73, 0x68, 0xf9, 0x20,
-0x190, 0x300, 0x62, 0x69, 0x62, 0x69, 0x3b, 0x4f, 0x73, 0x68, 0xf9, 0x20, 0xd2, 0x6b, 0xfa, 0x64, 0x75, 0x3b, 0x4f, 0x73,
-0x68, 0xf9, 0x20, 0x41, 0x67, 0x25b, 0x6d, 0x254, 0x3b, 0x4f, 0x73, 0x68, 0xf9, 0x20, 0xd2, 0x67, 0xfa, 0x6e, 0x3b, 0x4f,
-0x73, 0x68, 0xf9, 0x20, 0x4f, 0x77, 0x65, 0x77, 0x65, 0x3b, 0x4f, 0x73, 0x68, 0xf9, 0x20, 0x186, 0x300, 0x77, 0xe0, 0x72,
-0xe0, 0x3b, 0x4f, 0x73, 0x68, 0xf9, 0x20, 0x42, 0xe9, 0x6c, 0xfa, 0x3b, 0x4f, 0x73, 0x68, 0xf9, 0x20, 0x186, 0x300, 0x70,
-0x25b, 0x300, 0x3b, 0x4a, 0x61, 0x6e, 0x3b, 0x46, 0x65, 0x62, 0x3b, 0x4d, 0x61, 0x73, 0x3b, 0x45, 0x70, 0x68, 0x3b, 0x4d,
-0x65, 0x79, 0x3b, 0x4a, 0x75, 0x6e, 0x3b, 0x4a, 0x75, 0x6c, 0x3b, 0x41, 0x67, 0x61, 0x3b, 0x53, 0x65, 0x70, 0x3b, 0x4f,
-0x6b, 0x74, 0x3b, 0x4e, 0x6f, 0x76, 0x3b, 0x44, 0x69, 0x73, 0x3b, 0x4a, 0x61, 0x6e, 0x75, 0x77, 0x61, 0x72, 0x69, 0x3b,
-0x46, 0x65, 0x62, 0x72, 0x75, 0x77, 0x61, 0x72, 0x69, 0x3b, 0x4d, 0x61, 0x73, 0x68, 0x69, 0x3b, 0x45, 0x70, 0x68, 0x72,
-0x65, 0x6c, 0x69, 0x3b, 0x4d, 0x65, 0x79, 0x69, 0x3b, 0x4a, 0x75, 0x6e, 0x69, 0x3b, 0x4a, 0x75, 0x6c, 0x61, 0x79, 0x69,
-0x3b, 0x41, 0x67, 0x61, 0x73, 0x74, 0x69, 0x3b, 0x53, 0x65, 0x70, 0x74, 0x68, 0x65, 0x6d, 0x62, 0x61, 0x3b, 0x4f, 0x6b,
-0x74, 0x68, 0x6f, 0x62, 0x61, 0x3b, 0x4e, 0x6f, 0x76, 0x65, 0x6d, 0x62, 0x61, 0x3b, 0x44, 0x69, 0x73, 0x65, 0x6d, 0x62,
-0x61, 0x3b, 0x4a, 0x3b, 0x46, 0x3b, 0x4d, 0x3b, 0x45, 0x3b, 0x4d, 0x3b, 0x4a, 0x3b, 0x4a, 0x3b, 0x41, 0x3b, 0x53, 0x3b,
-0x4f, 0x3b, 0x4e, 0x3b, 0x44, 0x3b, 0x6a, 0x61, 0x6e, 0x2e, 0x3b, 0x66, 0x65, 0x62, 0x2e, 0x3b, 0x6d, 0x61, 0x72, 0x73,
-0x3b, 0x61, 0x70, 0x72, 0x2e, 0x3b, 0x6d, 0x61, 0x69, 0x3b, 0x6a, 0x75, 0x6e, 0x69, 0x3b, 0x6a, 0x75, 0x6c, 0x69, 0x3b,
-0x61, 0x75, 0x67, 0x2e, 0x3b, 0x73, 0x65, 0x70, 0x2e, 0x3b, 0x6f, 0x6b, 0x74, 0x2e, 0x3b, 0x6e, 0x6f, 0x76, 0x2e, 0x3b,
-0x64, 0x65, 0x73, 0x2e, 0x3b, 0x6a, 0x61, 0x6e, 0x75, 0x61, 0x72, 0x3b, 0x66, 0x65, 0x62, 0x72, 0x75, 0x61, 0x72, 0x3b,
-0x6d, 0x61, 0x72, 0x74, 0x3b, 0x61, 0x70, 0x72, 0x69, 0x6c, 0x3b, 0x6d, 0x61, 0x6a, 0x3b, 0x6a, 0x75, 0x6e, 0x69, 0x3b,
-0x6a, 0x75, 0x6c, 0x69, 0x3b, 0x61, 0x75, 0x67, 0x75, 0x73, 0x74, 0x3b, 0x73, 0x65, 0x70, 0x74, 0x65, 0x6d, 0x62, 0x61,
-0x72, 0x3b, 0x6f, 0x6b, 0x74, 0x6f, 0x62, 0x61, 0x72, 0x3b, 0x6e, 0x6f, 0x76, 0x65, 0x6d, 0x62, 0x61, 0x72, 0x3b, 0x64,
-0x65, 0x63, 0x65, 0x6d, 0x62, 0x61, 0x72, 0x3b, 0x458, 0x430, 0x43d, 0x3b, 0x444, 0x435, 0x431, 0x3b, 0x43c, 0x430, 0x440, 0x3b,
-0x430, 0x43f, 0x440, 0x3b, 0x43c, 0x430, 0x458, 0x3b, 0x458, 0x443, 0x43d, 0x3b, 0x458, 0x443, 0x43b, 0x3b, 0x430, 0x443, 0x433, 0x3b,
-0x441, 0x435, 0x43f, 0x3b, 0x43e, 0x43a, 0x442, 0x3b, 0x43d, 0x43e, 0x432, 0x3b, 0x434, 0x435, 0x446, 0x3b, 0x458, 0x430, 0x43d, 0x443,
-0x430, 0x440, 0x3b, 0x444, 0x435, 0x431, 0x440, 0x443, 0x430, 0x440, 0x3b, 0x43c, 0x430, 0x440, 0x442, 0x3b, 0x430, 0x43f, 0x440, 0x438,
-0x43b, 0x3b, 0x43c, 0x430, 0x458, 0x3b, 0x458, 0x443, 0x43d, 0x438, 0x3b, 0x458, 0x443, 0x43b, 0x438, 0x3b, 0x430, 0x443, 0x433, 0x443,
-0x441, 0x442, 0x3b, 0x441, 0x435, 0x43f, 0x442, 0x435, 0x43c, 0x431, 0x430, 0x440, 0x3b, 0x43e, 0x43a, 0x442, 0x43e, 0x431, 0x430, 0x440,
-0x3b, 0x43d, 0x43e, 0x432, 0x435, 0x43c, 0x431, 0x430, 0x440, 0x3b, 0x434, 0x435, 0x446, 0x435, 0x43c, 0x431, 0x430, 0x440, 0x3b, 0x4a,
-0x2d, 0x67, 0x75, 0x65, 0x72, 0x3b, 0x54, 0x2d, 0x61, 0x72, 0x72, 0x65, 0x65, 0x3b, 0x4d, 0x61, 0x79, 0x72, 0x6e, 0x74,
-0x3b, 0x41, 0x76, 0x72, 0x72, 0x69, 0x6c, 0x3b, 0x42, 0x6f, 0x61, 0x6c, 0x64, 0x79, 0x6e, 0x3b, 0x4d, 0x2d, 0x73, 0x6f,
-0x75, 0x72, 0x65, 0x65, 0x3b, 0x4a, 0x2d, 0x73, 0x6f, 0x75, 0x72, 0x65, 0x65, 0x3b, 0x4c, 0x75, 0x61, 0x6e, 0x69, 0x73,
-0x74, 0x79, 0x6e, 0x3b, 0x4d, 0x2d, 0x66, 0x6f, 0x75, 0x79, 0x69, 0x72, 0x3b, 0x4a, 0x2d, 0x66, 0x6f, 0x75, 0x79, 0x69,
-0x72, 0x3b, 0x4d, 0x2d, 0x48, 0x6f, 0x75, 0x6e, 0x65, 0x79, 0x3b, 0x4d, 0x2d, 0x4e, 0x6f, 0x6c, 0x6c, 0x69, 0x63, 0x6b,
-0x3b, 0x4a, 0x65, 0x72, 0x72, 0x65, 0x79, 0x2d, 0x67, 0x65, 0x75, 0x72, 0x65, 0x65, 0x3b, 0x54, 0x6f, 0x73, 0x68, 0x69,
-0x61, 0x67, 0x68, 0x74, 0x2d, 0x61, 0x72, 0x72, 0x65, 0x65, 0x3b, 0x4d, 0x61, 0x79, 0x72, 0x6e, 0x74, 0x3b, 0x41, 0x76,
-0x65, 0x72, 0x69, 0x6c, 0x3b, 0x42, 0x6f, 0x61, 0x6c, 0x64, 0x79, 0x6e, 0x3b, 0x4d, 0x65, 0x61, 0x6e, 0x2d, 0x73, 0x6f,
-0x75, 0x72, 0x65, 0x65, 0x3b, 0x4a, 0x65, 0x72, 0x72, 0x65, 0x79, 0x2d, 0x73, 0x6f, 0x75, 0x72, 0x65, 0x65, 0x3b, 0x4c,
-0x75, 0x61, 0x6e, 0x69, 0x73, 0x74, 0x79, 0x6e, 0x3b, 0x4d, 0x65, 0x61, 0x6e, 0x2d, 0x66, 0x6f, 0x75, 0x79, 0x69, 0x72,
-0x3b, 0x4a, 0x65, 0x72, 0x72, 0x65, 0x79, 0x2d, 0x66, 0x6f, 0x75, 0x79, 0x69, 0x72, 0x3b, 0x4d, 0x65, 0x65, 0x20, 0x48,
-0x6f, 0x75, 0x6e, 0x65, 0x79, 0x3b, 0x4d, 0x65, 0x65, 0x20, 0x6e, 0x79, 0x20, 0x4e, 0x6f, 0x6c, 0x6c, 0x69, 0x63, 0x6b,
-0x3b, 0x47, 0x65, 0x6e, 0x3b, 0x48, 0x77, 0x65, 0x3b, 0x4d, 0x65, 0x75, 0x3b, 0x45, 0x62, 0x72, 0x3b, 0x4d, 0x65, 0x3b,
-0x4d, 0x65, 0x74, 0x3b, 0x47, 0x6f, 0x72, 0x3b, 0x45, 0x73, 0x74, 0x3b, 0x47, 0x77, 0x6e, 0x3b, 0x48, 0x65, 0x64, 0x3b,
-0x44, 0x75, 0x3b, 0x4b, 0x65, 0x76, 0x3b, 0x6d, 0x69, 0x73, 0x20, 0x47, 0x65, 0x6e, 0x76, 0x65, 0x72, 0x3b, 0x6d, 0x69,
-0x73, 0x20, 0x48, 0x77, 0x65, 0x76, 0x72, 0x65, 0x72, 0x3b, 0x6d, 0x69, 0x73, 0x20, 0x4d, 0x65, 0x75, 0x72, 0x74, 0x68,
-0x3b, 0x6d, 0x69, 0x73, 0x20, 0x45, 0x62, 0x72, 0x65, 0x6c, 0x3b, 0x6d, 0x69, 0x73, 0x20, 0x4d, 0x65, 0x3b, 0x6d, 0x69,
-0x73, 0x20, 0x4d, 0x65, 0x74, 0x68, 0x65, 0x76, 0x65, 0x6e, 0x3b, 0x6d, 0x69, 0x73, 0x20, 0x47, 0x6f, 0x72, 0x74, 0x68,
-0x65, 0x72, 0x65, 0x6e, 0x3b, 0x6d, 0x69, 0x73, 0x20, 0x45, 0x73, 0x74, 0x3b, 0x6d, 0x69, 0x73, 0x20, 0x47, 0x77, 0x79,
-0x6e, 0x6e, 0x67, 0x61, 0x6c, 0x61, 0x3b, 0x6d, 0x69, 0x73, 0x20, 0x48, 0x65, 0x64, 0x72, 0x61, 0x3b, 0x6d, 0x69, 0x73,
-0x20, 0x44, 0x75, 0x3b, 0x6d, 0x69, 0x73, 0x20, 0x4b, 0x65, 0x76, 0x61, 0x72, 0x64, 0x68, 0x75, 0x3b, 0x53, 0x2d, 0x186,
-0x3b, 0x4b, 0x2d, 0x186, 0x3b, 0x45, 0x2d, 0x186, 0x3b, 0x45, 0x2d, 0x4f, 0x3b, 0x45, 0x2d, 0x4b, 0x3b, 0x4f, 0x2d, 0x41,
-0x3b, 0x41, 0x2d, 0x4b, 0x3b, 0x44, 0x2d, 0x186, 0x3b, 0x46, 0x2d, 0x190, 0x3b, 0x186, 0x2d, 0x41, 0x3b, 0x186, 0x2d, 0x4f,
-0x3b, 0x4d, 0x2d, 0x186, 0x3b, 0x53, 0x61, 0x6e, 0x64, 0x61, 0x2d, 0x186, 0x70, 0x25b, 0x70, 0x254, 0x6e, 0x3b, 0x4b, 0x77,
-0x61, 0x6b, 0x77, 0x61, 0x72, 0x2d, 0x186, 0x67, 0x79, 0x65, 0x66, 0x75, 0x6f, 0x3b, 0x45, 0x62, 0x254, 0x77, 0x2d, 0x186,
-0x62, 0x65, 0x6e, 0x65, 0x6d, 0x3b, 0x45, 0x62, 0x254, 0x62, 0x69, 0x72, 0x61, 0x2d, 0x4f, 0x66, 0x6f, 0x72, 0x69, 0x73,
-0x75, 0x6f, 0x3b, 0x45, 0x73, 0x75, 0x73, 0x6f, 0x77, 0x20, 0x41, 0x6b, 0x65, 0x74, 0x73, 0x65, 0x61, 0x62, 0x61, 0x2d,
-0x4b, 0x254, 0x74, 0x254, 0x6e, 0x69, 0x6d, 0x62, 0x61, 0x3b, 0x4f, 0x62, 0x69, 0x72, 0x61, 0x64, 0x65, 0x2d, 0x41, 0x79,
-0x25b, 0x77, 0x6f, 0x68, 0x6f, 0x6d, 0x75, 0x6d, 0x75, 0x3b, 0x41, 0x79, 0x25b, 0x77, 0x6f, 0x68, 0x6f, 0x2d, 0x4b, 0x69,
-0x74, 0x61, 0x77, 0x6f, 0x6e, 0x73, 0x61, 0x3b, 0x44, 0x69, 0x66, 0x75, 0x75, 0x2d, 0x186, 0x73, 0x61, 0x6e, 0x64, 0x61,
-0x61, 0x3b, 0x46, 0x61, 0x6e, 0x6b, 0x77, 0x61, 0x2d, 0x190, 0x62, 0x254, 0x3b, 0x186, 0x62, 0x25b, 0x73, 0x25b, 0x2d, 0x41,
-0x68, 0x69, 0x6e, 0x69, 0x6d, 0x65, 0x3b, 0x186, 0x62, 0x65, 0x72, 0x25b, 0x66, 0x25b, 0x77, 0x2d, 0x4f, 0x62, 0x75, 0x62,
-0x75, 0x6f, 0x3b, 0x4d, 0x75, 0x6d, 0x75, 0x2d, 0x186, 0x70, 0x25b, 0x6e, 0x69, 0x6d, 0x62, 0x61, 0x3b, 0x91c, 0x93e, 0x928,
-0x947, 0x935, 0x93e, 0x930, 0x940, 0x3b, 0x92b, 0x947, 0x92c, 0x94d, 0x930, 0x941, 0x935, 0x93e, 0x930, 0x940, 0x3b, 0x92e, 0x93e, 0x930,
-0x94d, 0x91a, 0x3b, 0x90f, 0x92a, 0x94d, 0x930, 0x93f, 0x932, 0x3b, 0x92e, 0x947, 0x3b, 0x91c, 0x942, 0x928, 0x3b, 0x91c, 0x941, 0x932,
-0x93e, 0x92f, 0x3b, 0x906, 0x917, 0x94b, 0x938, 0x94d, 0x924, 0x3b, 0x938, 0x92a, 0x94d, 0x91f, 0x947, 0x902, 0x92c, 0x930, 0x3b, 0x911,
-0x915, 0x94d, 0x91f, 0x94b, 0x92c, 0x930, 0x3b, 0x928, 0x94b, 0x935, 0x94d, 0x939, 0x947, 0x902, 0x92c, 0x930, 0x3b, 0x921, 0x93f, 0x938,
-0x947, 0x902, 0x92c, 0x930, 0x3b, 0x4a, 0x65, 0x6e, 0x3b, 0x46, 0x65, 0x62, 0x3b, 0x4d, 0x61, 0x61, 0x3b, 0x45, 0x70, 0x72,
-0x3b, 0x4d, 0x65, 0x65, 0x3b, 0x4a, 0x75, 0x75, 0x3b, 0x4a, 0x75, 0x6c, 0x3b, 0x1ecc, 0x67, 0x1ecd, 0x3b, 0x53, 0x65, 0x70,
-0x3b, 0x1ecc, 0x6b, 0x74, 0x3b, 0x4e, 0x6f, 0x76, 0x3b, 0x44, 0x69, 0x73, 0x3b, 0x4a, 0x65, 0x6e, 0x1ee5, 0x77, 0x61, 0x72,
-0x1ecb, 0x3b, 0x46, 0x65, 0x62, 0x72, 0x1ee5, 0x77, 0x61, 0x72, 0x1ecb, 0x3b, 0x4d, 0x61, 0x61, 0x63, 0x68, 0x1ecb, 0x3b, 0x45,
-0x70, 0x72, 0x65, 0x65, 0x6c, 0x3b, 0x4d, 0x65, 0x65, 0x3b, 0x4a, 0x75, 0x75, 0x6e, 0x3b, 0x4a, 0x75, 0x6c, 0x61, 0x1ecb,
-0x3b, 0x1ecc, 0x67, 0x1ecd, 0x1ecd, 0x73, 0x74, 0x3b, 0x53, 0x65, 0x70, 0x74, 0x65, 0x6d, 0x62, 0x61, 0x3b, 0x1ecc, 0x6b, 0x74,
-0x6f, 0x62, 0x61, 0x3b, 0x4e, 0x6f, 0x76, 0x65, 0x6d, 0x62, 0x61, 0x3b, 0x44, 0x69, 0x73, 0x65, 0x6d, 0x62, 0x61, 0x3b,
-0x4a, 0x3b, 0x46, 0x3b, 0x4d, 0x3b, 0x45, 0x3b, 0x4d, 0x3b, 0x4a, 0x3b, 0x4a, 0x3b, 0x1ecc, 0x3b, 0x53, 0x3b, 0x1ecc, 0x3b,
-0x4e, 0x3b, 0x44, 0x3b, 0x4d, 0x62, 0x65, 0x3b, 0x4b, 0x65, 0x6c, 0x3b, 0x4b, 0x74, 0x169, 0x3b, 0x4b, 0x61, 0x6e, 0x3b,
-0x4b, 0x74, 0x6e, 0x3b, 0x54, 0x68, 0x61, 0x3b, 0x4d, 0x6f, 0x6f, 0x3b, 0x4e, 0x79, 0x61, 0x3b, 0x4b, 0x6e, 0x64, 0x3b,
-0x128, 0x6b, 0x75, 0x3b, 0x128, 0x6b, 0x6d, 0x3b, 0x128, 0x6b, 0x6c, 0x3b, 0x4d, 0x77, 0x61, 0x69, 0x20, 0x77, 0x61, 0x20,
-0x6d, 0x62, 0x65, 0x65, 0x3b, 0x4d, 0x77, 0x61, 0x69, 0x20, 0x77, 0x61, 0x20, 0x6b, 0x65, 0x6c, 0x129, 0x3b, 0x4d, 0x77,
-0x61, 0x69, 0x20, 0x77, 0x61, 0x20, 0x6b, 0x61, 0x74, 0x61, 0x74, 0x169, 0x3b, 0x4d, 0x77, 0x61, 0x69, 0x20, 0x77, 0x61,
-0x20, 0x6b, 0x61, 0x6e, 0x61, 0x3b, 0x4d, 0x77, 0x61, 0x69, 0x20, 0x77, 0x61, 0x20, 0x6b, 0x61, 0x74, 0x61, 0x6e, 0x6f,
-0x3b, 0x4d, 0x77, 0x61, 0x69, 0x20, 0x77, 0x61, 0x20, 0x74, 0x68, 0x61, 0x6e, 0x74, 0x68, 0x61, 0x74, 0x169, 0x3b, 0x4d,
-0x77, 0x61, 0x69, 0x20, 0x77, 0x61, 0x20, 0x6d, 0x75, 0x6f, 0x6e, 0x7a, 0x61, 0x3b, 0x4d, 0x77, 0x61, 0x69, 0x20, 0x77,
-0x61, 0x20, 0x6e, 0x79, 0x61, 0x61, 0x6e, 0x79, 0x61, 0x3b, 0x4d, 0x77, 0x61, 0x69, 0x20, 0x77, 0x61, 0x20, 0x6b, 0x65,
-0x6e, 0x64, 0x61, 0x3b, 0x4d, 0x77, 0x61, 0x69, 0x20, 0x77, 0x61, 0x20, 0x129, 0x6b, 0x75, 0x6d, 0x69, 0x3b, 0x4d, 0x77,
-0x61, 0x69, 0x20, 0x77, 0x61, 0x20, 0x129, 0x6b, 0x75, 0x6d, 0x69, 0x20, 0x6e, 0x61, 0x20, 0x129, 0x6d, 0x77, 0x65, 0x3b,
-0x4d, 0x77, 0x61, 0x69, 0x20, 0x77, 0x61, 0x20, 0x129, 0x6b, 0x75, 0x6d, 0x69, 0x20, 0x6e, 0x61, 0x20, 0x69, 0x6c, 0x129,
-0x3b, 0x4d, 0x3b, 0x4b, 0x3b, 0x4b, 0x3b, 0x4b, 0x3b, 0x4b, 0x3b, 0x54, 0x3b, 0x4d, 0x3b, 0x4e, 0x3b, 0x4b, 0x3b, 0x128,
-0x3b, 0x128, 0x3b, 0x128, 0x3b, 0x5a, 0x65, 0x6e, 0x3b, 0x46, 0x65, 0x76, 0x3b, 0x4d, 0x61, 0x72, 0x3b, 0x41, 0x76, 0x72,
-0x3b, 0x4d, 0x61, 0x69, 0x3b, 0x4a, 0x75, 0x67, 0x3b, 0x4c, 0x75, 0x69, 0x3b, 0x41, 0x76, 0x6f, 0x3b, 0x53, 0x65, 0x74,
-0x3b, 0x4f, 0x74, 0x75, 0x3b, 0x4e, 0x6f, 0x76, 0x3b, 0x44, 0x69, 0x63, 0x3b, 0x5a, 0x65, 0x6e, 0xe2, 0x72, 0x3b, 0x46,
-0x65, 0x76, 0x72, 0xe2, 0x72, 0x3b, 0x4d, 0x61, 0x72, 0xe7, 0x3b, 0x41, 0x76, 0x72, 0xee, 0x6c, 0x3b, 0x4d, 0x61, 0x69,
-0x3b, 0x4a, 0x75, 0x67, 0x6e, 0x3b, 0x4c, 0x75, 0x69, 0x3b, 0x41, 0x76, 0x6f, 0x73, 0x74, 0x3b, 0x53, 0x65, 0x74, 0x65,
-0x6d, 0x62, 0x61, 0x72, 0x3b, 0x4f, 0x74, 0x75, 0x62, 0x61, 0x72, 0x3b, 0x4e, 0x6f, 0x76, 0x65, 0x6d, 0x62, 0x61, 0x72,
-0x3b, 0x44, 0x69, 0x63, 0x65, 0x6d, 0x62, 0x61, 0x72, 0x3b, 0x5a, 0x3b, 0x46, 0x3b, 0x4d, 0x3b, 0x41, 0x3b, 0x4d, 0x3b,
-0x4a, 0x3b, 0x4c, 0x3b, 0x41, 0x3b, 0x53, 0x3b, 0x4f, 0x3b, 0x4e, 0x3b, 0x44, 0x3b, 0x64, 0x7a, 0x76, 0x3b, 0x64, 0x7a,
-0x64, 0x3b, 0x74, 0x65, 0x64, 0x3b, 0x61, 0x66, 0x254, 0x3b, 0x64, 0x61, 0x6d, 0x3b, 0x6d, 0x61, 0x73, 0x3b, 0x73, 0x69,
-0x61, 0x3b, 0x64, 0x65, 0x61, 0x3b, 0x61, 0x6e, 0x79, 0x3b, 0x6b, 0x65, 0x6c, 0x3b, 0x61, 0x64, 0x65, 0x3b, 0x64, 0x7a,
-0x6d, 0x3b, 0x64, 0x7a, 0x6f, 0x76, 0x65, 0x3b, 0x64, 0x7a, 0x6f, 0x64, 0x7a, 0x65, 0x3b, 0x74, 0x65, 0x64, 0x6f, 0x78,
-0x65, 0x3b, 0x61, 0x66, 0x254, 0x66, 0x129, 0x65, 0x3b, 0x64, 0x61, 0x6d, 0x61, 0x3b, 0x6d, 0x61, 0x73, 0x61, 0x3b, 0x73,
-0x69, 0x61, 0x6d, 0x6c, 0x254, 0x6d, 0x3b, 0x64, 0x65, 0x61, 0x73, 0x69, 0x61, 0x6d, 0x69, 0x6d, 0x65, 0x3b, 0x61, 0x6e,
-0x79, 0x254, 0x6e, 0x79, 0x254, 0x3b, 0x6b, 0x65, 0x6c, 0x65, 0x3b, 0x61, 0x64, 0x65, 0x25b, 0x6d, 0x65, 0x6b, 0x70, 0x254,
-0x78, 0x65, 0x3b, 0x64, 0x7a, 0x6f, 0x6d, 0x65, 0x3b, 0x64, 0x3b, 0x64, 0x3b, 0x74, 0x3b, 0x61, 0x3b, 0x64, 0x3b, 0x6d,
-0x3b, 0x73, 0x3b, 0x64, 0x3b, 0x61, 0x3b, 0x6b, 0x3b, 0x61, 0x3b, 0x64, 0x3b, 0x49, 0x61, 0x6e, 0x2e, 0x3b, 0x50, 0x65,
-0x70, 0x2e, 0x3b, 0x4d, 0x61, 0x6c, 0x2e, 0x3b, 0x2bb, 0x41, 0x70, 0x2e, 0x3b, 0x4d, 0x65, 0x69, 0x3b, 0x49, 0x75, 0x6e,
-0x2e, 0x3b, 0x49, 0x75, 0x6c, 0x2e, 0x3b, 0x2bb, 0x41, 0x75, 0x2e, 0x3b, 0x4b, 0x65, 0x70, 0x2e, 0x3b, 0x2bb, 0x4f, 0x6b,
-0x2e, 0x3b, 0x4e, 0x6f, 0x77, 0x2e, 0x3b, 0x4b, 0x65, 0x6b, 0x2e, 0x3b, 0x49, 0x61, 0x6e, 0x75, 0x61, 0x6c, 0x69, 0x3b,
-0x50, 0x65, 0x70, 0x65, 0x6c, 0x75, 0x61, 0x6c, 0x69, 0x3b, 0x4d, 0x61, 0x6c, 0x61, 0x6b, 0x69, 0x3b, 0x2bb, 0x41, 0x70,
-0x65, 0x6c, 0x69, 0x6c, 0x61, 0x3b, 0x4d, 0x65, 0x69, 0x3b, 0x49, 0x75, 0x6e, 0x65, 0x3b, 0x49, 0x75, 0x6c, 0x61, 0x69,
-0x3b, 0x2bb, 0x41, 0x75, 0x6b, 0x61, 0x6b, 0x65, 0x3b, 0x4b, 0x65, 0x70, 0x61, 0x6b, 0x65, 0x6d, 0x61, 0x70, 0x61, 0x3b,
-0x2bb, 0x4f, 0x6b, 0x61, 0x6b, 0x6f, 0x70, 0x61, 0x3b, 0x4e, 0x6f, 0x77, 0x65, 0x6d, 0x61, 0x70, 0x61, 0x3b, 0x4b, 0x65,
-0x6b, 0x65, 0x6d, 0x61, 0x70, 0x61, 0x3b, 0x45, 0x6e, 0x65, 0x3b, 0x50, 0x65, 0x62, 0x3b, 0x4d, 0x61, 0x72, 0x3b, 0x41,
-0x62, 0x72, 0x3b, 0x4d, 0x61, 0x79, 0x3b, 0x48, 0x75, 0x6e, 0x3b, 0x48, 0x75, 0x6c, 0x3b, 0x41, 0x67, 0x6f, 0x3b, 0x53,
-0x65, 0x74, 0x3b, 0x4f, 0x6b, 0x74, 0x3b, 0x4e, 0x6f, 0x62, 0x3b, 0x44, 0x69, 0x73, 0x3b, 0x45, 0x6e, 0x65, 0x72, 0x6f,
-0x3b, 0x50, 0x65, 0x62, 0x72, 0x65, 0x72, 0x6f, 0x3b, 0x4d, 0x61, 0x72, 0x73, 0x6f, 0x3b, 0x41, 0x62, 0x72, 0x69, 0x6c,
-0x3b, 0x4d, 0x61, 0x79, 0x6f, 0x3b, 0x48, 0x75, 0x6e, 0x79, 0x6f, 0x3b, 0x48, 0x75, 0x6c, 0x79, 0x6f, 0x3b, 0x41, 0x67,
-0x6f, 0x73, 0x74, 0x6f, 0x3b, 0x53, 0x65, 0x74, 0x79, 0x65, 0x6d, 0x62, 0x72, 0x65, 0x3b, 0x4f, 0x6b, 0x74, 0x75, 0x62,
-0x72, 0x65, 0x3b, 0x4e, 0x6f, 0x62, 0x79, 0x65, 0x6d, 0x62, 0x72, 0x65, 0x3b, 0x44, 0x69, 0x73, 0x79, 0x65, 0x6d, 0x62,
-0x72, 0x65, 0x3b, 0x45, 0x3b, 0x50, 0x3b, 0x4d, 0x3b, 0x41, 0x3b, 0x4d, 0x3b, 0x48, 0x75, 0x6e, 0x3b, 0x48, 0x75, 0x6c,
-0x3b, 0x41, 0x67, 0x6f, 0x3b, 0x53, 0x65, 0x74, 0x3b, 0x4f, 0x6b, 0x74, 0x3b, 0x4e, 0x6f, 0x62, 0x3b, 0x44, 0x69, 0x73,
-0x3b, 0x4a, 0x61, 0x6e, 0x75, 0x61, 0x72, 0x3b, 0x46, 0x65, 0x62, 0x72, 0x75, 0x61, 0x72, 0x3b, 0x4d, 0xe4, 0x72, 0x7a,
-0x3b, 0x41, 0x70, 0x72, 0x69, 0x6c, 0x3b, 0x4d, 0x61, 0x69, 0x3b, 0x4a, 0x75, 0x6e, 0x69, 0x3b, 0x4a, 0x75, 0x6c, 0x69,
-0x3b, 0x41, 0x75, 0x67, 0x75, 0x73, 0x63, 0x68, 0x74, 0x3b, 0x53, 0x65, 0x70, 0x74, 0xe4, 0x6d, 0x62, 0x65, 0x72, 0x3b,
-0x4f, 0x6b, 0x74, 0x6f, 0x6f, 0x62, 0x65, 0x72, 0x3b, 0x4e, 0x6f, 0x76, 0xe4, 0x6d, 0x62, 0x65, 0x72, 0x3b, 0x44, 0x65,
-0x7a, 0xe4, 0x6d, 0x62, 0x65, 0x72, 0x3b, 0xa2cd, 0xa1aa, 0x3b, 0xa44d, 0xa1aa, 0x3b, 0xa315, 0xa1aa, 0x3b, 0xa1d6, 0xa1aa, 0x3b, 0xa26c,
-0xa1aa, 0x3b, 0xa0d8, 0xa1aa, 0x3b, 0xa3c3, 0xa1aa, 0x3b, 0xa246, 0xa1aa, 0x3b, 0xa22c, 0xa1aa, 0x3b, 0xa2b0, 0xa1aa, 0x3b, 0xa2b0, 0xa2aa, 0xa1aa,
-0x3b, 0xa2b0, 0xa44b, 0xa1aa, 0x3b, 0x4a, 0x61, 0x6e, 0x2e, 0x3b, 0x46, 0x65, 0x62, 0x2e, 0x3b, 0x4d, 0xe4, 0x72, 0x7a, 0x3b,
-0x41, 0x70, 0x72, 0x2e, 0x3b, 0x4d, 0x61, 0x69, 0x3b, 0x4a, 0x75, 0x6e, 0x69, 0x3b, 0x4a, 0x75, 0x6c, 0x69, 0x3b, 0x41,
-0x75, 0x67, 0x2e, 0x3b, 0x53, 0x65, 0x70, 0x2e, 0x3b, 0x4f, 0x6b, 0x74, 0x2e, 0x3b, 0x4e, 0x6f, 0x76, 0x2e, 0x3b, 0x44,
-0x65, 0x7a, 0x2e, 0x3b, 0x4a, 0x61, 0x6e, 0x75, 0x61, 0x61, 0x72, 0x3b, 0x46, 0x65, 0x62, 0x72, 0x75, 0x61, 0x61, 0x72,
-0x3b, 0x4d, 0xe4, 0x72, 0x7a, 0x3b, 0x41, 0x70, 0x72, 0x69, 0x6c, 0x3b, 0x4d, 0x61, 0x69, 0x3b, 0x4a, 0x75, 0x6e, 0x69,
-0x3b, 0x4a, 0x75, 0x6c, 0x69, 0x3b, 0x41, 0x75, 0x67, 0x75, 0x73, 0x74, 0x3b, 0x53, 0x65, 0x70, 0x74, 0x65, 0x6d, 0x62,
-0x65, 0x72, 0x3b, 0x4f, 0x6b, 0x74, 0x6f, 0x76, 0x65, 0x72, 0x3b, 0x4e, 0x6f, 0x76, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x3b,
-0x44, 0x65, 0x7a, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x3b, 0x6f, 0x111, 0x111, 0x6a, 0x3b, 0x67, 0x75, 0x6f, 0x76, 0x3b, 0x6e,
-0x6a, 0x75, 0x6b, 0x3b, 0x63, 0x75, 0x6f, 0x3b, 0x6d, 0x69, 0x65, 0x73, 0x3b, 0x67, 0x65, 0x61, 0x73, 0x3b, 0x73, 0x75,
-0x6f, 0x69, 0x3b, 0x62, 0x6f, 0x72, 0x67, 0x3b, 0x10d, 0x61, 0x6b, 0x10d, 0x3b, 0x67, 0x6f, 0x6c, 0x67, 0x3b, 0x73, 0x6b,
-0xe1, 0x62, 0x3b, 0x6a, 0x75, 0x6f, 0x76, 0x3b, 0x6f, 0x111, 0x111, 0x61, 0x6a, 0x61, 0x67, 0x65, 0x6d, 0xe1, 0x6e, 0x6e,
-0x75, 0x3b, 0x67, 0x75, 0x6f, 0x76, 0x76, 0x61, 0x6d, 0xe1, 0x6e, 0x6e, 0x75, 0x3b, 0x6e, 0x6a, 0x75, 0x6b, 0x10d, 0x61,
-0x6d, 0xe1, 0x6e, 0x6e, 0x75, 0x3b, 0x63, 0x75, 0x6f, 0x14b, 0x6f, 0x6d, 0xe1, 0x6e, 0x6e, 0x75, 0x3b, 0x6d, 0x69, 0x65,
-0x73, 0x73, 0x65, 0x6d, 0xe1, 0x6e, 0x6e, 0x75, 0x3b, 0x67, 0x65, 0x61, 0x73, 0x73, 0x65, 0x6d, 0xe1, 0x6e, 0x6e, 0x75,
-0x3b, 0x73, 0x75, 0x6f, 0x69, 0x64, 0x6e, 0x65, 0x6d, 0xe1, 0x6e, 0x6e, 0x75, 0x3b, 0x62, 0x6f, 0x72, 0x67, 0x65, 0x6d,
-0xe1, 0x6e, 0x6e, 0x75, 0x3b, 0x10d, 0x61, 0x6b, 0x10d, 0x61, 0x6d, 0xe1, 0x6e, 0x6e, 0x75, 0x3b, 0x67, 0x6f, 0x6c, 0x67,
-0x67, 0x6f, 0x74, 0x6d, 0xe1, 0x6e, 0x6e, 0x75, 0x3b, 0x73, 0x6b, 0xe1, 0x62, 0x6d, 0x61, 0x6d, 0xe1, 0x6e, 0x6e, 0x75,
-0x3b, 0x6a, 0x75, 0x6f, 0x76, 0x6c, 0x61, 0x6d, 0xe1, 0x6e, 0x6e, 0x75, 0x3b, 0x4f, 0x3b, 0x47, 0x3b, 0x4e, 0x3b, 0x43,
-0x3b, 0x4d, 0x3b, 0x47, 0x3b, 0x53, 0x3b, 0x42, 0x3b, 0x10c, 0x3b, 0x47, 0x3b, 0x53, 0x3b, 0x4a, 0x3b, 0x6f, 0x111, 0x111,
-0x6a, 0x3b, 0x67, 0x75, 0x6f, 0x76, 0x3b, 0x6e, 0x6a, 0x75, 0x6b, 0x3b, 0x63, 0x75, 0x6f, 0x14b, 0x3b, 0x6d, 0x69, 0x65,
-0x73, 0x3b, 0x67, 0x65, 0x61, 0x73, 0x3b, 0x73, 0x75, 0x6f, 0x69, 0x3b, 0x62, 0x6f, 0x72, 0x67, 0x3b, 0x10d, 0x61, 0x6b,
-0x10d, 0x3b, 0x67, 0x6f, 0x6c, 0x67, 0x3b, 0x73, 0x6b, 0xe1, 0x62, 0x3b, 0x6a, 0x75, 0x6f, 0x76, 0x3b, 0x43, 0x61, 0x6e,
-0x3b, 0x46, 0x65, 0x62, 0x3b, 0x4d, 0x61, 0x63, 0x3b, 0x41, 0x70, 0x72, 0x3b, 0x4d, 0x65, 0x69, 0x3b, 0x4a, 0x75, 0x6e,
-0x3b, 0x43, 0x75, 0x6c, 0x3b, 0x41, 0x67, 0x74, 0x3b, 0x53, 0x65, 0x70, 0x3b, 0x4f, 0x6b, 0x74, 0x3b, 0x4e, 0x6f, 0x62,
-0x3b, 0x44, 0x69, 0x73, 0x3b, 0x43, 0x68, 0x61, 0x6e, 0x75, 0x61, 0x72, 0x69, 0x3b, 0x46, 0x65, 0x62, 0x75, 0x72, 0x61,
-0x72, 0x69, 0x3b, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x3b, 0x41, 0x70, 0x69, 0x72, 0x69, 0x72, 0x69, 0x3b, 0x4d, 0x65, 0x69,
-0x3b, 0x4a, 0x75, 0x6e, 0x69, 0x3b, 0x43, 0x68, 0x75, 0x6c, 0x61, 0x69, 0x3b, 0x41, 0x67, 0x6f, 0x73, 0x74, 0x69, 0x3b,
-0x53, 0x65, 0x70, 0x74, 0x65, 0x6d, 0x62, 0x61, 0x3b, 0x4f, 0x6b, 0x69, 0x74, 0x6f, 0x62, 0x61, 0x3b, 0x4e, 0x6f, 0x62,
-0x65, 0x6d, 0x62, 0x61, 0x3b, 0x44, 0x69, 0x73, 0x65, 0x6d, 0x62, 0x61, 0x3b, 0x43, 0x3b, 0x46, 0x3b, 0x4d, 0x3b, 0x41,
-0x3b, 0x4d, 0x3b, 0x4a, 0x3b, 0x43, 0x3b, 0x41, 0x3b, 0x53, 0x3b, 0x4f, 0x3b, 0x4e, 0x3b, 0x44, 0x3b, 0x49, 0x6d, 0x62,
-0x3b, 0x4b, 0x61, 0x77, 0x3b, 0x4b, 0x61, 0x64, 0x3b, 0x4b, 0x61, 0x6e, 0x3b, 0x4b, 0x61, 0x73, 0x3b, 0x4b, 0x61, 0x72,
-0x3b, 0x4d, 0x66, 0x75, 0x3b, 0x57, 0x75, 0x6e, 0x3b, 0x49, 0x6b, 0x65, 0x3b, 0x49, 0x6b, 0x75, 0x3b, 0x49, 0x6d, 0x77,
-0x3b, 0x49, 0x77, 0x69, 0x3b, 0x4d, 0x6f, 0x72, 0x69, 0x20, 0x67, 0x68, 0x77, 0x61, 0x20, 0x69, 0x6d, 0x62, 0x69, 0x72,
-0x69, 0x3b, 0x4d, 0x6f, 0x72, 0x69, 0x20, 0x67, 0x68, 0x77, 0x61, 0x20, 0x6b, 0x61, 0x77, 0x69, 0x3b, 0x4d, 0x6f, 0x72,
-0x69, 0x20, 0x67, 0x68, 0x77, 0x61, 0x20, 0x6b, 0x61, 0x64, 0x61, 0x64, 0x75, 0x3b, 0x4d, 0x6f, 0x72, 0x69, 0x20, 0x67,
-0x68, 0x77, 0x61, 0x20, 0x6b, 0x61, 0x6e, 0x61, 0x3b, 0x4d, 0x6f, 0x72, 0x69, 0x20, 0x67, 0x68, 0x77, 0x61, 0x20, 0x6b,
-0x61, 0x73, 0x61, 0x6e, 0x75, 0x3b, 0x4d, 0x6f, 0x72, 0x69, 0x20, 0x67, 0x68, 0x77, 0x61, 0x20, 0x6b, 0x61, 0x72, 0x61,
-0x6e, 0x64, 0x61, 0x64, 0x75, 0x3b, 0x4d, 0x6f, 0x72, 0x69, 0x20, 0x67, 0x68, 0x77, 0x61, 0x20, 0x6d, 0x66, 0x75, 0x6e,
-0x67, 0x61, 0x64, 0x65, 0x3b, 0x4d, 0x6f, 0x72, 0x69, 0x20, 0x67, 0x68, 0x77, 0x61, 0x20, 0x77, 0x75, 0x6e, 0x79, 0x61,
-0x6e, 0x79, 0x61, 0x3b, 0x4d, 0x6f, 0x72, 0x69, 0x20, 0x67, 0x68, 0x77, 0x61, 0x20, 0x69, 0x6b, 0x65, 0x6e, 0x64, 0x61,
-0x3b, 0x4d, 0x6f, 0x72, 0x69, 0x20, 0x67, 0x68, 0x77, 0x61, 0x20, 0x69, 0x6b, 0x75, 0x6d, 0x69, 0x3b, 0x4d, 0x6f, 0x72,
-0x69, 0x20, 0x67, 0x68, 0x77, 0x61, 0x20, 0x69, 0x6b, 0x75, 0x6d, 0x69, 0x20, 0x6e, 0x61, 0x20, 0x69, 0x6d, 0x77, 0x65,
-0x72, 0x69, 0x3b, 0x4d, 0x6f, 0x72, 0x69, 0x20, 0x67, 0x68, 0x77, 0x61, 0x20, 0x69, 0x6b, 0x75, 0x6d, 0x69, 0x20, 0x6e,
-0x61, 0x20, 0x69, 0x77, 0x69, 0x3b, 0x49, 0x3b, 0x4b, 0x3b, 0x4b, 0x3b, 0x4b, 0x3b, 0x4b, 0x3b, 0x4b, 0x3b, 0x4d, 0x3b,
-0x57, 0x3b, 0x49, 0x3b, 0x49, 0x3b, 0x49, 0x3b, 0x49, 0x3b, 0x73, 0x69, 0x69, 0x3b, 0x63, 0x6f, 0x6c, 0x3b, 0x6d, 0x62,
-0x6f, 0x3b, 0x73, 0x65, 0x65, 0x3b, 0x64, 0x75, 0x75, 0x3b, 0x6b, 0x6f, 0x72, 0x3b, 0x6d, 0x6f, 0x72, 0x3b, 0x6a, 0x75,
-0x6b, 0x3b, 0x73, 0x6c, 0x74, 0x3b, 0x79, 0x61, 0x72, 0x3b, 0x6a, 0x6f, 0x6c, 0x3b, 0x62, 0x6f, 0x77, 0x3b, 0x73, 0x69,
-0x69, 0x6c, 0x6f, 0x3b, 0x63, 0x6f, 0x6c, 0x74, 0x65, 0x3b, 0x6d, 0x62, 0x6f, 0x6f, 0x79, 0x3b, 0x73, 0x65, 0x65, 0x257,
-0x74, 0x6f, 0x3b, 0x64, 0x75, 0x75, 0x6a, 0x61, 0x6c, 0x3b, 0x6b, 0x6f, 0x72, 0x73, 0x65, 0x3b, 0x6d, 0x6f, 0x72, 0x73,
-0x6f, 0x3b, 0x6a, 0x75, 0x6b, 0x6f, 0x3b, 0x73, 0x69, 0x69, 0x6c, 0x74, 0x6f, 0x3b, 0x79, 0x61, 0x72, 0x6b, 0x6f, 0x6d,
-0x61, 0x61, 0x3b, 0x6a, 0x6f, 0x6c, 0x61, 0x6c, 0x3b, 0x62, 0x6f, 0x77, 0x74, 0x65, 0x3b, 0x73, 0x3b, 0x63, 0x3b, 0x6d,
-0x3b, 0x73, 0x3b, 0x64, 0x3b, 0x6b, 0x3b, 0x6d, 0x3b, 0x6a, 0x3b, 0x73, 0x3b, 0x79, 0x3b, 0x6a, 0x3b, 0x62, 0x3b, 0x4a,
-0x45, 0x4e, 0x3b, 0x57, 0x4b, 0x52, 0x3b, 0x57, 0x47, 0x54, 0x3b, 0x57, 0x4b, 0x4e, 0x3b, 0x57, 0x54, 0x4e, 0x3b, 0x57,
-0x54, 0x44, 0x3b, 0x57, 0x4d, 0x4a, 0x3b, 0x57, 0x4e, 0x4e, 0x3b, 0x57, 0x4b, 0x44, 0x3b, 0x57, 0x49, 0x4b, 0x3b, 0x57,
-0x4d, 0x57, 0x3b, 0x44, 0x49, 0x54, 0x3b, 0x4e, 0x6a, 0x65, 0x6e, 0x75, 0x61, 0x72, 0x129, 0x3b, 0x4d, 0x77, 0x65, 0x72,
-0x65, 0x20, 0x77, 0x61, 0x20, 0x6b, 0x65, 0x72, 0x129, 0x3b, 0x4d, 0x77, 0x65, 0x72, 0x65, 0x20, 0x77, 0x61, 0x20, 0x67,
-0x61, 0x74, 0x61, 0x74, 0x169, 0x3b, 0x4d, 0x77, 0x65, 0x72, 0x65, 0x20, 0x77, 0x61, 0x20, 0x6b, 0x61, 0x6e, 0x61, 0x3b,
-0x4d, 0x77, 0x65, 0x72, 0x65, 0x20, 0x77, 0x61, 0x20, 0x67, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x3b, 0x4d, 0x77, 0x65, 0x72,
-0x65, 0x20, 0x77, 0x61, 0x20, 0x67, 0x61, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x74, 0x169, 0x3b, 0x4d, 0x77, 0x65, 0x72, 0x65,
-0x20, 0x77, 0x61, 0x20, 0x6d, 0x169, 0x67, 0x77, 0x61, 0x6e, 0x6a, 0x61, 0x3b, 0x4d, 0x77, 0x65, 0x72, 0x65, 0x20, 0x77,
-0x61, 0x20, 0x6b, 0x61, 0x6e, 0x61, 0x6e, 0x61, 0x3b, 0x4d, 0x77, 0x65, 0x72, 0x65, 0x20, 0x77, 0x61, 0x20, 0x6b, 0x65,
-0x6e, 0x64, 0x61, 0x3b, 0x4d, 0x77, 0x65, 0x72, 0x65, 0x20, 0x77, 0x61, 0x20, 0x69, 0x6b, 0x169, 0x6d, 0x69, 0x3b, 0x4d,
-0x77, 0x65, 0x72, 0x65, 0x20, 0x77, 0x61, 0x20, 0x69, 0x6b, 0x169, 0x6d, 0x69, 0x20, 0x6e, 0x61, 0x20, 0x169, 0x6d, 0x77,
-0x65, 0x3b, 0x4e, 0x64, 0x69, 0x74, 0x68, 0x65, 0x6d, 0x62, 0x61, 0x3b, 0x4a, 0x3b, 0x4b, 0x3b, 0x47, 0x3b, 0x4b, 0x3b,
-0x47, 0x3b, 0x47, 0x3b, 0x4d, 0x3b, 0x4b, 0x3b, 0x4b, 0x3b, 0x49, 0x3b, 0x49, 0x3b, 0x44, 0x3b, 0x4f, 0x62, 0x6f, 0x3b,
-0x57, 0x61, 0x61, 0x3b, 0x4f, 0x6b, 0x75, 0x3b, 0x4f, 0x6e, 0x67, 0x3b, 0x49, 0x6d, 0x65, 0x3b, 0x49, 0x6c, 0x65, 0x3b,
-0x53, 0x61, 0x70, 0x3b, 0x49, 0x73, 0x69, 0x3b, 0x53, 0x61, 0x61, 0x3b, 0x54, 0x6f, 0x6d, 0x3b, 0x54, 0x6f, 0x62, 0x3b,
-0x54, 0x6f, 0x77, 0x3b, 0x4c, 0x61, 0x70, 0x61, 0x20, 0x6c, 0x65, 0x20, 0x6f, 0x62, 0x6f, 0x3b, 0x4c, 0x61, 0x70, 0x61,
-0x20, 0x6c, 0x65, 0x20, 0x77, 0x61, 0x61, 0x72, 0x65, 0x3b, 0x4c, 0x61, 0x70, 0x61, 0x20, 0x6c, 0x65, 0x20, 0x6f, 0x6b,
-0x75, 0x6e, 0x69, 0x3b, 0x4c, 0x61, 0x70, 0x61, 0x20, 0x6c, 0x65, 0x20, 0x6f, 0x6e, 0x67, 0x2019, 0x77, 0x61, 0x6e, 0x3b,
-0x4c, 0x61, 0x70, 0x61, 0x20, 0x6c, 0x65, 0x20, 0x69, 0x6d, 0x65, 0x74, 0x3b, 0x4c, 0x61, 0x70, 0x61, 0x20, 0x6c, 0x65,
-0x20, 0x69, 0x6c, 0x65, 0x3b, 0x4c, 0x61, 0x70, 0x61, 0x20, 0x6c, 0x65, 0x20, 0x73, 0x61, 0x70, 0x61, 0x3b, 0x4c, 0x61,
-0x70, 0x61, 0x20, 0x6c, 0x65, 0x20, 0x69, 0x73, 0x69, 0x65, 0x74, 0x3b, 0x4c, 0x61, 0x70, 0x61, 0x20, 0x6c, 0x65, 0x20,
-0x73, 0x61, 0x61, 0x6c, 0x3b, 0x4c, 0x61, 0x70, 0x61, 0x20, 0x6c, 0x65, 0x20, 0x74, 0x6f, 0x6d, 0x6f, 0x6e, 0x3b, 0x4c,
-0x61, 0x70, 0x61, 0x20, 0x6c, 0x65, 0x20, 0x74, 0x6f, 0x6d, 0x6f, 0x6e, 0x20, 0x6f, 0x62, 0x6f, 0x3b, 0x4c, 0x61, 0x70,
-0x61, 0x20, 0x6c, 0x65, 0x20, 0x74, 0x6f, 0x6d, 0x6f, 0x6e, 0x20, 0x77, 0x61, 0x61, 0x72, 0x65, 0x3b, 0x4f, 0x3b, 0x57,
-0x3b, 0x4f, 0x3b, 0x4f, 0x3b, 0x49, 0x3b, 0x49, 0x3b, 0x53, 0x3b, 0x49, 0x3b, 0x53, 0x3b, 0x54, 0x3b, 0x54, 0x3b, 0x54,
-0x3b, 0x4a, 0x61, 0x6e, 0x3b, 0x46, 0x65, 0x76, 0x3b, 0x4d, 0x61, 0x72, 0x3b, 0x41, 0x62, 0x72, 0x3b, 0x4d, 0x61, 0x69,
-0x3b, 0x4a, 0x75, 0x6e, 0x3b, 0x4a, 0x75, 0x6c, 0x3b, 0x41, 0x75, 0x67, 0x3b, 0x53, 0x65, 0x74, 0x3b, 0x4f, 0x74, 0x75,
-0x3b, 0x4e, 0x6f, 0x76, 0x3b, 0x44, 0x65, 0x63, 0x3b, 0x4a, 0x61, 0x6e, 0x65, 0x69, 0x72, 0x6f, 0x3b, 0x46, 0x65, 0x76,
-0x72, 0x65, 0x69, 0x72, 0x6f, 0x3b, 0x4d, 0x61, 0x72, 0x63, 0x6f, 0x3b, 0x41, 0x62, 0x72, 0x69, 0x6c, 0x3b, 0x4d, 0x61,
-0x69, 0x6f, 0x3b, 0x4a, 0x75, 0x6e, 0x68, 0x6f, 0x3b, 0x4a, 0x75, 0x6c, 0x68, 0x6f, 0x3b, 0x41, 0x75, 0x67, 0x75, 0x73,
-0x74, 0x6f, 0x3b, 0x53, 0x65, 0x74, 0x65, 0x6d, 0x62, 0x72, 0x6f, 0x3b, 0x4f, 0x74, 0x75, 0x62, 0x72, 0x6f, 0x3b, 0x4e,
-0x6f, 0x76, 0x65, 0x6d, 0x62, 0x72, 0x6f, 0x3b, 0x44, 0x65, 0x63, 0x65, 0x6d, 0x62, 0x72, 0x6f, 0x3b, 0x5a, 0x69, 0x62,
-0x3b, 0x4e, 0x68, 0x6c, 0x6f, 0x3b, 0x4d, 0x62, 0x69, 0x3b, 0x4d, 0x61, 0x62, 0x3b, 0x4e, 0x6b, 0x77, 0x3b, 0x4e, 0x68,
-0x6c, 0x61, 0x3b, 0x4e, 0x74, 0x75, 0x3b, 0x4e, 0x63, 0x77, 0x3b, 0x4d, 0x70, 0x61, 0x6e, 0x3b, 0x4d, 0x66, 0x75, 0x3b,
-0x4c, 0x77, 0x65, 0x3b, 0x4d, 0x70, 0x61, 0x6c, 0x3b, 0x5a, 0x69, 0x62, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x6c, 0x61, 0x3b,
-0x4e, 0x68, 0x6c, 0x6f, 0x6c, 0x61, 0x6e, 0x6a, 0x61, 0x3b, 0x4d, 0x62, 0x69, 0x6d, 0x62, 0x69, 0x74, 0x68, 0x6f, 0x3b,
-0x4d, 0x61, 0x62, 0x61, 0x73, 0x61, 0x3b, 0x4e, 0x6b, 0x77, 0x65, 0x6e, 0x6b, 0x77, 0x65, 0x7a, 0x69, 0x3b, 0x4e, 0x68,
-0x6c, 0x61, 0x6e, 0x67, 0x75, 0x6c, 0x61, 0x3b, 0x4e, 0x74, 0x75, 0x6c, 0x69, 0x6b, 0x61, 0x7a, 0x69, 0x3b, 0x4e, 0x63,
-0x77, 0x61, 0x62, 0x61, 0x6b, 0x61, 0x7a, 0x69, 0x3b, 0x4d, 0x70, 0x61, 0x6e, 0x64, 0x75, 0x6c, 0x61, 0x3b, 0x4d, 0x66,
-0x75, 0x6d, 0x66, 0x75, 0x3b, 0x4c, 0x77, 0x65, 0x7a, 0x69, 0x3b, 0x4d, 0x70, 0x61, 0x6c, 0x61, 0x6b, 0x61, 0x7a, 0x69,
-0x3b, 0x5a, 0x3b, 0x4e, 0x3b, 0x4d, 0x3b, 0x4d, 0x3b, 0x4e, 0x3b, 0x4e, 0x3b, 0x4e, 0x3b, 0x4e, 0x3b, 0x4d, 0x3b, 0x4d,
-0x3b, 0x4c, 0x3b, 0x4d, 0x3b, 0x4d, 0x31, 0x3b, 0x4d, 0x32, 0x3b, 0x4d, 0x33, 0x3b, 0x4d, 0x34, 0x3b, 0x4d, 0x35, 0x3b,
-0x4d, 0x36, 0x3b, 0x4d, 0x37, 0x3b, 0x4d, 0x38, 0x3b, 0x4d, 0x39, 0x3b, 0x4d, 0x31, 0x30, 0x3b, 0x4d, 0x31, 0x31, 0x3b,
-0x4d, 0x31, 0x32, 0x3b, 0x4d, 0x77, 0x65, 0x72, 0x69, 0x20, 0x77, 0x61, 0x20, 0x6b, 0x77, 0x61, 0x6e, 0x7a, 0x61, 0x3b,
-0x4d, 0x77, 0x65, 0x72, 0x69, 0x20, 0x77, 0x61, 0x20, 0x6b, 0x61, 0x69, 0x6c, 0x69, 0x3b, 0x4d, 0x77, 0x65, 0x72, 0x69,
-0x20, 0x77, 0x61, 0x20, 0x6b, 0x61, 0x74, 0x61, 0x74, 0x75, 0x3b, 0x4d, 0x77, 0x65, 0x72, 0x69, 0x20, 0x77, 0x61, 0x20,
-0x6b, 0x61, 0x61, 0x6e, 0x61, 0x3b, 0x4d, 0x77, 0x65, 0x72, 0x69, 0x20, 0x77, 0x61, 0x20, 0x74, 0x61, 0x6e, 0x75, 0x3b,
-0x4d, 0x77, 0x65, 0x72, 0x69, 0x20, 0x77, 0x61, 0x20, 0x73, 0x69, 0x74, 0x61, 0x3b, 0x4d, 0x77, 0x65, 0x72, 0x69, 0x20,
-0x77, 0x61, 0x20, 0x73, 0x61, 0x62, 0x61, 0x3b, 0x4d, 0x77, 0x65, 0x72, 0x69, 0x20, 0x77, 0x61, 0x20, 0x6e, 0x61, 0x6e,
-0x65, 0x3b, 0x4d, 0x77, 0x65, 0x72, 0x69, 0x20, 0x77, 0x61, 0x20, 0x74, 0x69, 0x73, 0x61, 0x3b, 0x4d, 0x77, 0x65, 0x72,
-0x69, 0x20, 0x77, 0x61, 0x20, 0x69, 0x6b, 0x75, 0x6d, 0x69, 0x3b, 0x4d, 0x77, 0x65, 0x72, 0x69, 0x20, 0x77, 0x61, 0x20,
-0x69, 0x6b, 0x75, 0x6d, 0x69, 0x20, 0x6e, 0x61, 0x20, 0x6d, 0x6f, 0x6a, 0x61, 0x3b, 0x4d, 0x77, 0x65, 0x72, 0x69, 0x20,
-0x77, 0x61, 0x20, 0x69, 0x6b, 0x75, 0x6d, 0x69, 0x20, 0x6e, 0x61, 0x20, 0x6d, 0x62, 0x69, 0x6c, 0x69, 0x3b, 0x4b, 0x3b,
-0x4b, 0x3b, 0x4b, 0x3b, 0x4b, 0x3b, 0x54, 0x3b, 0x53, 0x3b, 0x53, 0x3b, 0x4e, 0x3b, 0x54, 0x3b, 0x49, 0x3b, 0x49, 0x3b,
-0x49, 0x3b, 0x2d49, 0x2d4f, 0x2d4f, 0x3b, 0x2d31, 0x2d55, 0x2d30, 0x3b, 0x2d4e, 0x2d30, 0x2d55, 0x3b, 0x2d49, 0x2d31, 0x2d54, 0x3b, 0x2d4e, 0x2d30,
-0x2d62, 0x3b, 0x2d62, 0x2d53, 0x2d4f, 0x3b, 0x2d62, 0x2d53, 0x2d4d, 0x3b, 0x2d56, 0x2d53, 0x2d5b, 0x3b, 0x2d5b, 0x2d53, 0x2d5c, 0x3b, 0x2d3d, 0x2d5c,
-0x2d53, 0x3b, 0x2d4f, 0x2d53, 0x2d61, 0x3b, 0x2d37, 0x2d53, 0x2d4a, 0x3b, 0x2d49, 0x2d4f, 0x2d4f, 0x2d30, 0x2d62, 0x2d54, 0x3b, 0x2d31, 0x2d55, 0x2d30,
-0x2d62, 0x2d55, 0x3b, 0x2d4e, 0x2d30, 0x2d55, 0x2d5a, 0x3b, 0x2d49, 0x2d31, 0x2d54, 0x2d49, 0x2d54, 0x3b, 0x2d4e, 0x2d30, 0x2d62, 0x2d62, 0x2d53, 0x3b,
-0x2d62, 0x2d53, 0x2d4f, 0x2d62, 0x2d53, 0x3b, 0x2d62, 0x2d53, 0x2d4d, 0x2d62, 0x2d53, 0x2d63, 0x3b, 0x2d56, 0x2d53, 0x2d5b, 0x2d5c, 0x3b, 0x2d5b, 0x2d53,
-0x2d5c, 0x2d30, 0x2d4f, 0x2d31, 0x2d49, 0x2d54, 0x3b, 0x2d3d, 0x2d5c, 0x2d53, 0x2d31, 0x2d54, 0x3b, 0x2d4f, 0x2d53, 0x2d61, 0x2d30, 0x2d4f, 0x2d31, 0x2d49,
-0x2d54, 0x3b, 0x2d37, 0x2d53, 0x2d4a, 0x2d30, 0x2d4f, 0x2d31, 0x2d49, 0x2d54, 0x3b, 0x2d49, 0x3b, 0x2d31, 0x3b, 0x2d4e, 0x3b, 0x2d49, 0x3b, 0x2d4e,
-0x3b, 0x2d62, 0x3b, 0x2d62, 0x3b, 0x2d56, 0x3b, 0x2d5b, 0x3b, 0x2d3d, 0x3b, 0x2d4f, 0x3b, 0x2d37, 0x3b, 0x69, 0x6e, 0x6e, 0x3b, 0x62,
-0x1e5b, 0x61, 0x3b, 0x6d, 0x61, 0x1e5b, 0x3b, 0x69, 0x62, 0x72, 0x3b, 0x6d, 0x61, 0x79, 0x3b, 0x79, 0x75, 0x6e, 0x3b, 0x79,
-0x75, 0x6c, 0x3b, 0x263, 0x75, 0x63, 0x3b, 0x63, 0x75, 0x74, 0x3b, 0x6b, 0x74, 0x75, 0x3b, 0x6e, 0x75, 0x77, 0x3b, 0x64,
-0x75, 0x6a, 0x3b, 0x69, 0x6e, 0x6e, 0x61, 0x79, 0x72, 0x3b, 0x62, 0x1e5b, 0x61, 0x79, 0x1e5b, 0x3b, 0x6d, 0x61, 0x1e5b, 0x1e63,
-0x3b, 0x69, 0x62, 0x72, 0x69, 0x72, 0x3b, 0x6d, 0x61, 0x79, 0x79, 0x75, 0x3b, 0x79, 0x75, 0x6e, 0x79, 0x75, 0x3b, 0x79,
-0x75, 0x6c, 0x79, 0x75, 0x7a, 0x3b, 0x263, 0x75, 0x63, 0x74, 0x3b, 0x63, 0x75, 0x74, 0x61, 0x6e, 0x62, 0x69, 0x72, 0x3b,
-0x6b, 0x74, 0x75, 0x62, 0x72, 0x3b, 0x6e, 0x75, 0x77, 0x61, 0x6e, 0x62, 0x69, 0x72, 0x3b, 0x64, 0x75, 0x6a, 0x61, 0x6e,
-0x62, 0x69, 0x72, 0x3b, 0x69, 0x3b, 0x62, 0x3b, 0x6d, 0x3b, 0x69, 0x3b, 0x6d, 0x3b, 0x79, 0x3b, 0x79, 0x3b, 0x263, 0x3b,
-0x63, 0x3b, 0x6b, 0x3b, 0x6e, 0x3b, 0x64, 0x3b, 0x59, 0x65, 0x6e, 0x3b, 0x46, 0x75, 0x72, 0x3b, 0x4d, 0x65, 0x263, 0x3b,
-0x59, 0x65, 0x62, 0x3b, 0x4d, 0x61, 0x79, 0x3b, 0x59, 0x75, 0x6e, 0x3b, 0x59, 0x75, 0x6c, 0x3b, 0x194, 0x75, 0x63, 0x3b,
-0x43, 0x74, 0x65, 0x3b, 0x54, 0x75, 0x62, 0x3b, 0x57, 0x61, 0x6d, 0x3b, 0x44, 0x75, 0x6a, 0x3b, 0x59, 0x65, 0x6e, 0x6e,
-0x61, 0x79, 0x65, 0x72, 0x3b, 0x46, 0x75, 0x1e5b, 0x61, 0x72, 0x3b, 0x4d, 0x65, 0x263, 0x72, 0x65, 0x73, 0x3b, 0x59, 0x65,
-0x62, 0x72, 0x69, 0x72, 0x3b, 0x4d, 0x61, 0x79, 0x79, 0x75, 0x3b, 0x59, 0x75, 0x6e, 0x79, 0x75, 0x3b, 0x59, 0x75, 0x6c,
-0x79, 0x75, 0x3b, 0x194, 0x75, 0x63, 0x74, 0x3b, 0x43, 0x74, 0x65, 0x6d, 0x62, 0x65, 0x1e5b, 0x3b, 0x54, 0x75, 0x62, 0x65,
-0x1e5b, 0x3b, 0x57, 0x61, 0x6d, 0x62, 0x65, 0x1e5b, 0x3b, 0x44, 0x75, 0x1e7, 0x65, 0x6d, 0x62, 0x65, 0x1e5b, 0x3b, 0x59, 0x3b,
-0x46, 0x3b, 0x4d, 0x3b, 0x59, 0x3b, 0x4d, 0x3b, 0x59, 0x3b, 0x59, 0x3b, 0x194, 0x3b, 0x43, 0x3b, 0x54, 0x3b, 0x4e, 0x3b,
-0x44, 0x3b, 0x59, 0x65, 0x6e, 0x3b, 0x46, 0x75, 0x72, 0x3b, 0x4d, 0x65, 0x263, 0x3b, 0x59, 0x65, 0x62, 0x3b, 0x4d, 0x61,
-0x79, 0x3b, 0x59, 0x75, 0x6e, 0x3b, 0x59, 0x75, 0x6c, 0x3b, 0x194, 0x75, 0x63, 0x3b, 0x43, 0x74, 0x65, 0x3b, 0x54, 0x75,
-0x62, 0x3b, 0x4e, 0x75, 0x6e, 0x3b, 0x44, 0x75, 0x1e7, 0x3b, 0x59, 0x65, 0x6e, 0x6e, 0x61, 0x79, 0x65, 0x72, 0x3b, 0x46,
-0x75, 0x1e5b, 0x61, 0x72, 0x3b, 0x4d, 0x65, 0x263, 0x72, 0x65, 0x73, 0x3b, 0x59, 0x65, 0x62, 0x72, 0x69, 0x72, 0x3b, 0x4d,
-0x61, 0x79, 0x79, 0x75, 0x3b, 0x59, 0x75, 0x6e, 0x79, 0x75, 0x3b, 0x59, 0x75, 0x6c, 0x79, 0x75, 0x3b, 0x194, 0x75, 0x63,
-0x74, 0x3b, 0x43, 0x74, 0x65, 0x6d, 0x62, 0x65, 0x1e5b, 0x3b, 0x54, 0x75, 0x62, 0x65, 0x1e5b, 0x3b, 0x4e, 0x75, 0x6e, 0x65,
-0x6d, 0x62, 0x65, 0x1e5b, 0x3b, 0x44, 0x75, 0x1e7, 0x65, 0x6d, 0x62, 0x65, 0x1e5b, 0x3b, 0x59, 0x3b, 0x46, 0x3b, 0x194, 0x3b,
-0x42, 0x3b, 0x4d, 0x3b, 0x4e, 0x3b, 0x4c, 0x3b, 0x43, 0x3b, 0x54, 0x3b, 0x52, 0x3b, 0x57, 0x3b, 0x44, 0x3b, 0x4b, 0x42,
-0x5a, 0x3b, 0x4b, 0x42, 0x52, 0x3b, 0x4b, 0x53, 0x54, 0x3b, 0x4b, 0x4b, 0x4e, 0x3b, 0x4b, 0x54, 0x4e, 0x3b, 0x4b, 0x4d,
-0x4b, 0x3b, 0x4b, 0x4d, 0x53, 0x3b, 0x4b, 0x4d, 0x4e, 0x3b, 0x4b, 0x4d, 0x57, 0x3b, 0x4b, 0x4b, 0x4d, 0x3b, 0x4b, 0x4e,
-0x4b, 0x3b, 0x4b, 0x4e, 0x42, 0x3b, 0x4f, 0x6b, 0x77, 0x6f, 0x6b, 0x75, 0x62, 0x61, 0x6e, 0x7a, 0x61, 0x3b, 0x4f, 0x6b,
-0x77, 0x61, 0x6b, 0x61, 0x62, 0x69, 0x72, 0x69, 0x3b, 0x4f, 0x6b, 0x77, 0x61, 0x6b, 0x61, 0x73, 0x68, 0x61, 0x74, 0x75,
-0x3b, 0x4f, 0x6b, 0x77, 0x61, 0x6b, 0x61, 0x6e, 0x61, 0x3b, 0x4f, 0x6b, 0x77, 0x61, 0x6b, 0x61, 0x74, 0x61, 0x61, 0x6e,
-0x61, 0x3b, 0x4f, 0x6b, 0x77, 0x61, 0x6d, 0x75, 0x6b, 0x61, 0x61, 0x67, 0x61, 0x3b, 0x4f, 0x6b, 0x77, 0x61, 0x6d, 0x75,
-0x73, 0x68, 0x61, 0x6e, 0x6a, 0x75, 0x3b, 0x4f, 0x6b, 0x77, 0x61, 0x6d, 0x75, 0x6e, 0x61, 0x61, 0x6e, 0x61, 0x3b, 0x4f,
-0x6b, 0x77, 0x61, 0x6d, 0x77, 0x65, 0x6e, 0x64, 0x61, 0x3b, 0x4f, 0x6b, 0x77, 0x61, 0x69, 0x6b, 0x75, 0x6d, 0x69, 0x3b,
-0x4f, 0x6b, 0x77, 0x61, 0x69, 0x6b, 0x75, 0x6d, 0x69, 0x20, 0x6e, 0x61, 0x20, 0x6b, 0x75, 0x6d, 0x77, 0x65, 0x3b, 0x4f,
-0x6b, 0x77, 0x61, 0x69, 0x6b, 0x75, 0x6d, 0x69, 0x20, 0x6e, 0x61, 0x20, 0x69, 0x62, 0x69, 0x72, 0x69, 0x3b, 0x48, 0x75,
-0x74, 0x3b, 0x56, 0x69, 0x6c, 0x3b, 0x44, 0x61, 0x74, 0x3b, 0x54, 0x61, 0x69, 0x3b, 0x48, 0x61, 0x6e, 0x3b, 0x53, 0x69,
-0x74, 0x3b, 0x53, 0x61, 0x62, 0x3b, 0x4e, 0x61, 0x6e, 0x3b, 0x54, 0x69, 0x73, 0x3b, 0x4b, 0x75, 0x6d, 0x3b, 0x4b, 0x6d,
-0x6a, 0x3b, 0x4b, 0x6d, 0x62, 0x3b, 0x70, 0x61, 0x20, 0x6d, 0x77, 0x65, 0x64, 0x7a, 0x69, 0x20, 0x67, 0x77, 0x61, 0x20,
-0x68, 0x75, 0x74, 0x61, 0x6c, 0x61, 0x3b, 0x70, 0x61, 0x20, 0x6d, 0x77, 0x65, 0x64, 0x7a, 0x69, 0x20, 0x67, 0x77, 0x61,
-0x20, 0x77, 0x75, 0x76, 0x69, 0x6c, 0x69, 0x3b, 0x70, 0x61, 0x20, 0x6d, 0x77, 0x65, 0x64, 0x7a, 0x69, 0x20, 0x67, 0x77,
-0x61, 0x20, 0x77, 0x75, 0x64, 0x61, 0x74, 0x75, 0x3b, 0x70, 0x61, 0x20, 0x6d, 0x77, 0x65, 0x64, 0x7a, 0x69, 0x20, 0x67,
-0x77, 0x61, 0x20, 0x77, 0x75, 0x74, 0x61, 0x69, 0x3b, 0x70, 0x61, 0x20, 0x6d, 0x77, 0x65, 0x64, 0x7a, 0x69, 0x20, 0x67,
-0x77, 0x61, 0x20, 0x77, 0x75, 0x68, 0x61, 0x6e, 0x75, 0x3b, 0x70, 0x61, 0x20, 0x6d, 0x77, 0x65, 0x64, 0x7a, 0x69, 0x20,
-0x67, 0x77, 0x61, 0x20, 0x73, 0x69, 0x74, 0x61, 0x3b, 0x70, 0x61, 0x20, 0x6d, 0x77, 0x65, 0x64, 0x7a, 0x69, 0x20, 0x67,
-0x77, 0x61, 0x20, 0x73, 0x61, 0x62, 0x61, 0x3b, 0x70, 0x61, 0x20, 0x6d, 0x77, 0x65, 0x64, 0x7a, 0x69, 0x20, 0x67, 0x77,
-0x61, 0x20, 0x6e, 0x61, 0x6e, 0x65, 0x3b, 0x70, 0x61, 0x20, 0x6d, 0x77, 0x65, 0x64, 0x7a, 0x69, 0x20, 0x67, 0x77, 0x61,
-0x20, 0x74, 0x69, 0x73, 0x61, 0x3b, 0x70, 0x61, 0x20, 0x6d, 0x77, 0x65, 0x64, 0x7a, 0x69, 0x20, 0x67, 0x77, 0x61, 0x20,
-0x6b, 0x75, 0x6d, 0x69, 0x3b, 0x70, 0x61, 0x20, 0x6d, 0x77, 0x65, 0x64, 0x7a, 0x69, 0x20, 0x67, 0x77, 0x61, 0x20, 0x6b,
-0x75, 0x6d, 0x69, 0x20, 0x6e, 0x61, 0x20, 0x6d, 0x6f, 0x6a, 0x61, 0x3b, 0x70, 0x61, 0x20, 0x6d, 0x77, 0x65, 0x64, 0x7a,
-0x69, 0x20, 0x67, 0x77, 0x61, 0x20, 0x6b, 0x75, 0x6d, 0x69, 0x20, 0x6e, 0x61, 0x20, 0x6d, 0x62, 0x69, 0x6c, 0x69, 0x3b,
-0x48, 0x3b, 0x56, 0x3b, 0x44, 0x3b, 0x54, 0x3b, 0x48, 0x3b, 0x53, 0x3b, 0x53, 0x3b, 0x4e, 0x3b, 0x54, 0x3b, 0x4b, 0x3b,
-0x4b, 0x3b, 0x4b, 0x3b, 0x4a, 0x61, 0x6e, 0x75, 0x61, 0x72, 0x69, 0x3b, 0x46, 0x65, 0x62, 0x72, 0x75, 0x61, 0x72, 0x69,
-0x3b, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x3b, 0x41, 0x70, 0x72, 0x69, 0x6c, 0x79, 0x69, 0x3b, 0x4d, 0x65, 0x69, 0x3b, 0x4a,
-0x75, 0x6e, 0x79, 0x69, 0x3b, 0x4a, 0x75, 0x6c, 0x79, 0x61, 0x69, 0x3b, 0x41, 0x67, 0x75, 0x73, 0x74, 0x69, 0x3b, 0x53,
-0x65, 0x70, 0x74, 0x65, 0x6d, 0x62, 0x61, 0x3b, 0x4f, 0x6b, 0x74, 0x6f, 0x62, 0x61, 0x3b, 0x4e, 0x6f, 0x76, 0x65, 0x6d,
-0x62, 0x61, 0x3b, 0x44, 0x65, 0x73, 0x65, 0x6d, 0x62, 0x61, 0x3b, 0x7a, 0x61, 0x6e, 0x3b, 0x66, 0x65, 0x62, 0x3b, 0x6d,
-0x61, 0x72, 0x3b, 0x61, 0x77, 0x69, 0x3b, 0x6d, 0x25b, 0x3b, 0x7a, 0x75, 0x77, 0x3b, 0x7a, 0x75, 0x6c, 0x3b, 0x75, 0x74,
-0x69, 0x3b, 0x73, 0x25b, 0x74, 0x3b, 0x254, 0x6b, 0x75, 0x3b, 0x6e, 0x6f, 0x77, 0x3b, 0x64, 0x65, 0x73, 0x3b, 0x7a, 0x61,
-0x6e, 0x77, 0x75, 0x79, 0x65, 0x3b, 0x66, 0x65, 0x62, 0x75, 0x72, 0x75, 0x79, 0x65, 0x3b, 0x6d, 0x61, 0x72, 0x69, 0x73,
-0x69, 0x3b, 0x61, 0x77, 0x69, 0x72, 0x69, 0x6c, 0x69, 0x3b, 0x6d, 0x25b, 0x3b, 0x7a, 0x75, 0x77, 0x25b, 0x6e, 0x3b, 0x7a,
-0x75, 0x6c, 0x75, 0x79, 0x65, 0x3b, 0x75, 0x74, 0x69, 0x3b, 0x73, 0x25b, 0x74, 0x61, 0x6e, 0x62, 0x75, 0x72, 0x75, 0x3b,
-0x254, 0x6b, 0x75, 0x74, 0x254, 0x62, 0x75, 0x72, 0x75, 0x3b, 0x6e, 0x6f, 0x77, 0x61, 0x6e, 0x62, 0x75, 0x72, 0x75, 0x3b,
-0x64, 0x65, 0x73, 0x61, 0x6e, 0x62, 0x75, 0x72, 0x75, 0x3b, 0x5a, 0x3b, 0x46, 0x3b, 0x4d, 0x3b, 0x41, 0x3b, 0x4d, 0x3b,
-0x5a, 0x3b, 0x5a, 0x3b, 0x55, 0x3b, 0x53, 0x3b, 0x186, 0x3b, 0x4e, 0x3b, 0x44, 0x3b, 0x4d, 0x62, 0x65, 0x3b, 0x4b, 0x61,
-0x69, 0x3b, 0x4b, 0x61, 0x74, 0x3b, 0x4b, 0x61, 0x6e, 0x3b, 0x47, 0x61, 0x74, 0x3b, 0x47, 0x61, 0x6e, 0x3b, 0x4d, 0x75,
-0x67, 0x3b, 0x4b, 0x6e, 0x6e, 0x3b, 0x4b, 0x65, 0x6e, 0x3b, 0x49, 0x6b, 0x75, 0x3b, 0x49, 0x6d, 0x77, 0x3b, 0x49, 0x67,
-0x69, 0x3b, 0x4d, 0x77, 0x65, 0x72, 0x69, 0x20, 0x77, 0x61, 0x20, 0x6d, 0x62, 0x65, 0x72, 0x65, 0x3b, 0x4d, 0x77, 0x65,
-0x72, 0x69, 0x20, 0x77, 0x61, 0x20, 0x6b, 0x61, 0x129, 0x72, 0x69, 0x3b, 0x4d, 0x77, 0x65, 0x72, 0x69, 0x20, 0x77, 0x61,
-0x20, 0x6b, 0x61, 0x74, 0x68, 0x61, 0x74, 0x169, 0x3b, 0x4d, 0x77, 0x65, 0x72, 0x69, 0x20, 0x77, 0x61, 0x20, 0x6b, 0x61,
-0x6e, 0x61, 0x3b, 0x4d, 0x77, 0x65, 0x72, 0x69, 0x20, 0x77, 0x61, 0x20, 0x67, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x3b, 0x4d,
-0x77, 0x65, 0x72, 0x69, 0x20, 0x77, 0x61, 0x20, 0x67, 0x61, 0x74, 0x61, 0x6e, 0x74, 0x61, 0x74, 0x169, 0x3b, 0x4d, 0x77,
-0x65, 0x72, 0x69, 0x20, 0x77, 0x61, 0x20, 0x6d, 0x169, 0x67, 0x77, 0x61, 0x6e, 0x6a, 0x61, 0x3b, 0x4d, 0x77, 0x65, 0x72,
-0x69, 0x20, 0x77, 0x61, 0x20, 0x6b, 0x61, 0x6e, 0x61, 0x6e, 0x61, 0x3b, 0x4d, 0x77, 0x65, 0x72, 0x69, 0x20, 0x77, 0x61,
-0x20, 0x6b, 0x65, 0x6e, 0x64, 0x61, 0x3b, 0x4d, 0x77, 0x65, 0x72, 0x69, 0x20, 0x77, 0x61, 0x20, 0x69, 0x6b, 0x169, 0x6d,
-0x69, 0x3b, 0x4d, 0x77, 0x65, 0x72, 0x69, 0x20, 0x77, 0x61, 0x20, 0x69, 0x6b, 0x169, 0x6d, 0x69, 0x20, 0x6e, 0x61, 0x20,
-0x169, 0x6d, 0x77, 0x65, 0x3b, 0x4d, 0x77, 0x65, 0x72, 0x69, 0x20, 0x77, 0x61, 0x20, 0x69, 0x6b, 0x169, 0x6d, 0x69, 0x20,
-0x6e, 0x61, 0x20, 0x4b, 0x61, 0x129, 0x72, 0x129, 0x3b, 0x4d, 0x3b, 0x4b, 0x3b, 0x4b, 0x3b, 0x4b, 0x3b, 0x47, 0x3b, 0x47,
-0x3b, 0x4d, 0x3b, 0x4b, 0x3b, 0x4b, 0x3b, 0x49, 0x3b, 0x49, 0x3b, 0x49, 0x3b, 0x13a4, 0x13c3, 0x3b, 0x13a7, 0x13a6, 0x3b, 0x13a0,
-0x13c5, 0x3b, 0x13a7, 0x13ec, 0x3b, 0x13a0, 0x13c2, 0x3b, 0x13d5, 0x13ad, 0x3b, 0x13ab, 0x13f0, 0x3b, 0x13a6, 0x13b6, 0x3b, 0x13da, 0x13b5, 0x3b,
-0x13da, 0x13c2, 0x3b, 0x13c5, 0x13d3, 0x3b, 0x13a5, 0x13cd, 0x3b, 0x13a4, 0x13c3, 0x13b8, 0x13d4, 0x13c5, 0x3b, 0x13a7, 0x13a6, 0x13b5, 0x3b, 0x13a0,
-0x13c5, 0x13f1, 0x3b, 0x13a7, 0x13ec, 0x13c2, 0x3b, 0x13a0, 0x13c2, 0x13cd, 0x13ac, 0x13d8, 0x3b, 0x13d5, 0x13ad, 0x13b7, 0x13f1, 0x3b, 0x13ab, 0x13f0,
-0x13c9, 0x13c2, 0x3b, 0x13a6, 0x13b6, 0x13c2, 0x3b, 0x13da, 0x13b5, 0x13cd, 0x13d7, 0x3b, 0x13da, 0x13c2, 0x13c5, 0x13d7, 0x3b, 0x13c5, 0x13d3, 0x13d5,
-0x13c6, 0x3b, 0x13a5, 0x13cd, 0x13a9, 0x13f1, 0x3b, 0x13a4, 0x3b, 0x13a7, 0x3b, 0x13a0, 0x3b, 0x13a7, 0x3b, 0x13a0, 0x3b, 0x13d5, 0x3b, 0x13ab,
-0x3b, 0x13a6, 0x3b, 0x13da, 0x3b, 0x13da, 0x3b, 0x13c5, 0x3b, 0x13a5, 0x3b, 0x7a, 0x61, 0x6e, 0x3b, 0x66, 0x65, 0x76, 0x3b, 0x6d,
-0x61, 0x72, 0x3b, 0x61, 0x76, 0x72, 0x3b, 0x6d, 0x65, 0x3b, 0x7a, 0x69, 0x6e, 0x3b, 0x7a, 0x69, 0x6c, 0x3b, 0x6f, 0x75,
-0x74, 0x3b, 0x73, 0x65, 0x70, 0x3b, 0x6f, 0x6b, 0x74, 0x3b, 0x6e, 0x6f, 0x76, 0x3b, 0x64, 0x65, 0x73, 0x3b, 0x7a, 0x61,
-0x6e, 0x76, 0x69, 0x65, 0x3b, 0x66, 0x65, 0x76, 0x72, 0x69, 0x79, 0x65, 0x3b, 0x6d, 0x61, 0x72, 0x73, 0x3b, 0x61, 0x76,
-0x72, 0x69, 0x6c, 0x3b, 0x6d, 0x65, 0x3b, 0x7a, 0x69, 0x6e, 0x3b, 0x7a, 0x69, 0x6c, 0x79, 0x65, 0x3b, 0x6f, 0x75, 0x74,
-0x3b, 0x73, 0x65, 0x70, 0x74, 0x61, 0x6d, 0x3b, 0x6f, 0x6b, 0x74, 0x6f, 0x62, 0x3b, 0x6e, 0x6f, 0x76, 0x61, 0x6d, 0x3b,
-0x64, 0x65, 0x73, 0x61, 0x6d, 0x3b, 0x7a, 0x3b, 0x66, 0x3b, 0x6d, 0x3b, 0x61, 0x3b, 0x6d, 0x3b, 0x7a, 0x3b, 0x7a, 0x3b,
-0x6f, 0x3b, 0x73, 0x3b, 0x6f, 0x3b, 0x6e, 0x3b, 0x64, 0x3b, 0x4d, 0x77, 0x65, 0x64, 0x69, 0x20, 0x4e, 0x74, 0x61, 0x6e,
-0x64, 0x69, 0x3b, 0x4d, 0x77, 0x65, 0x64, 0x69, 0x20, 0x77, 0x61, 0x20, 0x50, 0x69, 0x6c, 0x69, 0x3b, 0x4d, 0x77, 0x65,
-0x64, 0x69, 0x20, 0x77, 0x61, 0x20, 0x54, 0x61, 0x74, 0x75, 0x3b, 0x4d, 0x77, 0x65, 0x64, 0x69, 0x20, 0x77, 0x61, 0x20,
-0x4e, 0x63, 0x68, 0x65, 0x63, 0x68, 0x69, 0x3b, 0x4d, 0x77, 0x65, 0x64, 0x69, 0x20, 0x77, 0x61, 0x20, 0x4e, 0x6e, 0x79,
-0x61, 0x6e, 0x6f, 0x3b, 0x4d, 0x77, 0x65, 0x64, 0x69, 0x20, 0x77, 0x61, 0x20, 0x4e, 0x6e, 0x79, 0x61, 0x6e, 0x6f, 0x20,
-0x6e, 0x61, 0x20, 0x55, 0x6d, 0x6f, 0x3b, 0x4d, 0x77, 0x65, 0x64, 0x69, 0x20, 0x77, 0x61, 0x20, 0x4e, 0x6e, 0x79, 0x61,
-0x6e, 0x6f, 0x20, 0x6e, 0x61, 0x20, 0x4d, 0x69, 0x76, 0x69, 0x6c, 0x69, 0x3b, 0x4d, 0x77, 0x65, 0x64, 0x69, 0x20, 0x77,
-0x61, 0x20, 0x4e, 0x6e, 0x79, 0x61, 0x6e, 0x6f, 0x20, 0x6e, 0x61, 0x20, 0x4d, 0x69, 0x74, 0x61, 0x74, 0x75, 0x3b, 0x4d,
-0x77, 0x65, 0x64, 0x69, 0x20, 0x77, 0x61, 0x20, 0x4e, 0x6e, 0x79, 0x61, 0x6e, 0x6f, 0x20, 0x6e, 0x61, 0x20, 0x4e, 0x63,
-0x68, 0x65, 0x63, 0x68, 0x69, 0x3b, 0x4d, 0x77, 0x65, 0x64, 0x69, 0x20, 0x77, 0x61, 0x20, 0x4e, 0x6e, 0x79, 0x61, 0x6e,
-0x6f, 0x20, 0x6e, 0x61, 0x20, 0x4e, 0x6e, 0x79, 0x61, 0x6e, 0x6f, 0x3b, 0x4d, 0x77, 0x65, 0x64, 0x69, 0x20, 0x77, 0x61,
-0x20, 0x4e, 0x6e, 0x79, 0x61, 0x6e, 0x6f, 0x20, 0x6e, 0x61, 0x20, 0x4e, 0x6e, 0x79, 0x61, 0x6e, 0x6f, 0x20, 0x6e, 0x61,
-0x20, 0x55, 0x3b, 0x4d, 0x77, 0x65, 0x64, 0x69, 0x20, 0x77, 0x61, 0x20, 0x4e, 0x6e, 0x79, 0x61, 0x6e, 0x6f, 0x20, 0x6e,
-0x61, 0x20, 0x4e, 0x6e, 0x79, 0x61, 0x6e, 0x6f, 0x20, 0x6e, 0x61, 0x20, 0x4d, 0x3b, 0x46, 0xfa, 0x6e, 0x67, 0x61, 0x74,
-0x268, 0x3b, 0x4e, 0x61, 0x61, 0x6e, 0x268, 0x3b, 0x4b, 0x65, 0x65, 0x6e, 0x64, 0x61, 0x3b, 0x49, 0x6b, 0xfa, 0x6d, 0x69,
-0x3b, 0x49, 0x6e, 0x79, 0x61, 0x6d, 0x62, 0x61, 0x6c, 0x61, 0x3b, 0x49, 0x64, 0x77, 0x61, 0x61, 0x74, 0x61, 0x3b, 0x4d,
-0x289, 0x289, 0x6e, 0x63, 0x68, 0x268, 0x3b, 0x56, 0x268, 0x268, 0x72, 0x268, 0x3b, 0x53, 0x61, 0x61, 0x74, 0x289, 0x3b, 0x49,
-0x6e, 0x79, 0x69, 0x3b, 0x53, 0x61, 0x61, 0x6e, 0x6f, 0x3b, 0x53, 0x61, 0x73, 0x61, 0x74, 0x289, 0x3b, 0x4b, 0x289, 0x66,
-0xfa, 0x6e, 0x67, 0x61, 0x74, 0x268, 0x3b, 0x4b, 0x289, 0x6e, 0x61, 0x61, 0x6e, 0x268, 0x3b, 0x4b, 0x289, 0x6b, 0x65, 0x65,
-0x6e, 0x64, 0x61, 0x3b, 0x4b, 0x77, 0x69, 0x69, 0x6b, 0x75, 0x6d, 0x69, 0x3b, 0x4b, 0x77, 0x69, 0x69, 0x6e, 0x79, 0x61,
-0x6d, 0x62, 0xe1, 0x6c, 0x61, 0x3b, 0x4b, 0x77, 0x69, 0x69, 0x64, 0x77, 0x61, 0x61, 0x74, 0x61, 0x3b, 0x4b, 0x289, 0x6d,
-0x289, 0x289, 0x6e, 0x63, 0x68, 0x268, 0x3b, 0x4b, 0x289, 0x76, 0x268, 0x268, 0x72, 0x268, 0x3b, 0x4b, 0x289, 0x73, 0x61, 0x61,
-0x74, 0x289, 0x3b, 0x4b, 0x77, 0x69, 0x69, 0x6e, 0x79, 0x69, 0x3b, 0x4b, 0x289, 0x73, 0x61, 0x61, 0x6e, 0x6f, 0x3b, 0x4b,
-0x289, 0x73, 0x61, 0x73, 0x61, 0x74, 0x289, 0x3b, 0x46, 0x3b, 0x4e, 0x3b, 0x4b, 0x3b, 0x49, 0x3b, 0x49, 0x3b, 0x49, 0x3b,
-0x4d, 0x3b, 0x56, 0x3b, 0x53, 0x3b, 0x49, 0x3b, 0x53, 0x3b, 0x53, 0x3b, 0x4a, 0x61, 0x6e, 0x3b, 0x46, 0x65, 0x62, 0x3b,
-0x4d, 0x61, 0x72, 0x3b, 0x41, 0x70, 0x75, 0x3b, 0x4d, 0x61, 0x61, 0x3b, 0x4a, 0x75, 0x75, 0x3b, 0x4a, 0x75, 0x6c, 0x3b,
-0x41, 0x67, 0x75, 0x3b, 0x53, 0x65, 0x62, 0x3b, 0x4f, 0x6b, 0x69, 0x3b, 0x4e, 0x6f, 0x76, 0x3b, 0x44, 0x65, 0x73, 0x3b,
-0x4a, 0x61, 0x6e, 0x77, 0x61, 0x6c, 0x69, 0x79, 0x6f, 0x3b, 0x46, 0x65, 0x62, 0x77, 0x61, 0x6c, 0x69, 0x79, 0x6f, 0x3b,
-0x4d, 0x61, 0x72, 0x69, 0x73, 0x69, 0x3b, 0x41, 0x70, 0x75, 0x6c, 0x69, 0x3b, 0x4d, 0x61, 0x61, 0x79, 0x69, 0x3b, 0x4a,
-0x75, 0x75, 0x6e, 0x69, 0x3b, 0x4a, 0x75, 0x6c, 0x61, 0x61, 0x79, 0x69, 0x3b, 0x41, 0x67, 0x75, 0x73, 0x69, 0x74, 0x6f,
-0x3b, 0x53, 0x65, 0x62, 0x75, 0x74, 0x74, 0x65, 0x6d, 0x62, 0x61, 0x3b, 0x4f, 0x6b, 0x69, 0x74, 0x6f, 0x62, 0x62, 0x61,
-0x3b, 0x4e, 0x6f, 0x76, 0x65, 0x6d, 0x62, 0x61, 0x3b, 0x44, 0x65, 0x73, 0x65, 0x6d, 0x62, 0x61, 0x3b, 0x4a, 0x61, 0x6e,
-0x3b, 0x46, 0x65, 0x62, 0x3b, 0x4d, 0x61, 0x63, 0x3b, 0x45, 0x70, 0x72, 0x3b, 0x4d, 0x65, 0x69, 0x3b, 0x4a, 0x75, 0x6e,
-0x3b, 0x4a, 0x75, 0x6c, 0x3b, 0x4f, 0x67, 0x61, 0x3b, 0x53, 0x65, 0x70, 0x3b, 0x4f, 0x6b, 0x74, 0x3b, 0x4e, 0x6f, 0x76,
-0x3b, 0x44, 0x69, 0x73, 0x3b, 0x4a, 0x61, 0x6e, 0x75, 0x61, 0x72, 0x69, 0x3b, 0x46, 0x65, 0x62, 0x72, 0x75, 0x61, 0x72,
-0x69, 0x3b, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x3b, 0x45, 0x70, 0x72, 0x65, 0x6f, 0x3b, 0x4d, 0x65, 0x69, 0x3b, 0x4a, 0x75,
-0x6e, 0x69, 0x3b, 0x4a, 0x75, 0x6c, 0x61, 0x69, 0x3b, 0x4f, 0x67, 0x61, 0x73, 0x74, 0x69, 0x3b, 0x53, 0x65, 0x70, 0x74,
-0x65, 0x6d, 0x62, 0x61, 0x3b, 0x4f, 0x6b, 0x74, 0x6f, 0x62, 0x61, 0x3b, 0x4e, 0x6f, 0x76, 0x65, 0x6d, 0x62, 0x61, 0x3b,
-0x44, 0x69, 0x73, 0x65, 0x6d, 0x62, 0x61, 0x3b, 0x4a, 0x3b, 0x46, 0x3b, 0x4d, 0x3b, 0x45, 0x3b, 0x4d, 0x3b, 0x4a, 0x3b,
-0x4a, 0x3b, 0x4f, 0x3b, 0x53, 0x3b, 0x4f, 0x3b, 0x4e, 0x3b, 0x44, 0x3b, 0x4a, 0x61, 0x6e, 0x3b, 0x46, 0x65, 0x62, 0x3b,
-0x4d, 0x61, 0x72, 0x3b, 0x41, 0x62, 0x72, 0x3b, 0x4d, 0x61, 0x69, 0x3b, 0x4a, 0x75, 0x6e, 0x3b, 0x4a, 0x75, 0x6c, 0x3b,
-0x41, 0x67, 0x6f, 0x3b, 0x53, 0x65, 0x74, 0x3b, 0x4f, 0x74, 0x75, 0x3b, 0x4e, 0x75, 0x76, 0x3b, 0x44, 0x69, 0x7a, 0x3b,
-0x4a, 0x61, 0x6e, 0x65, 0x72, 0x75, 0x3b, 0x46, 0x65, 0x62, 0x72, 0x65, 0x72, 0x75, 0x3b, 0x4d, 0x61, 0x72, 0x73, 0x75,
-0x3b, 0x41, 0x62, 0x72, 0x69, 0x6c, 0x3b, 0x4d, 0x61, 0x69, 0x75, 0x3b, 0x4a, 0x75, 0x6e, 0x68, 0x75, 0x3b, 0x4a, 0x75,
-0x6c, 0x68, 0x75, 0x3b, 0x41, 0x67, 0x6f, 0x73, 0x74, 0x75, 0x3b, 0x53, 0x65, 0x74, 0x65, 0x6e, 0x62, 0x72, 0x75, 0x3b,
-0x4f, 0x74, 0x75, 0x62, 0x72, 0x75, 0x3b, 0x4e, 0x75, 0x76, 0x65, 0x6e, 0x62, 0x72, 0x75, 0x3b, 0x44, 0x69, 0x7a, 0x65,
-0x6e, 0x62, 0x72, 0x75, 0x3b, 0x4a, 0x41, 0x4e, 0x3b, 0x46, 0x45, 0x42, 0x3b, 0x4d, 0x41, 0x43, 0x3b, 0x128, 0x50, 0x55,
-0x3b, 0x4d, 0x128, 0x128, 0x3b, 0x4e, 0x4a, 0x55, 0x3b, 0x4e, 0x4a, 0x52, 0x3b, 0x41, 0x47, 0x41, 0x3b, 0x53, 0x50, 0x54,
-0x3b, 0x4f, 0x4b, 0x54, 0x3b, 0x4e, 0x4f, 0x56, 0x3b, 0x44, 0x45, 0x43, 0x3b, 0x4a, 0x61, 0x6e, 0x75, 0x61, 0x72, 0x129,
-0x3b, 0x46, 0x65, 0x62, 0x75, 0x72, 0x75, 0x61, 0x72, 0x129, 0x3b, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x3b, 0x128, 0x70, 0x75,
-0x72, 0x169, 0x3b, 0x4d, 0x129, 0x129, 0x3b, 0x4e, 0x6a, 0x75, 0x6e, 0x69, 0x3b, 0x4e, 0x6a, 0x75, 0x72, 0x61, 0x129, 0x3b,
-0x41, 0x67, 0x61, 0x73, 0x74, 0x69, 0x3b, 0x53, 0x65, 0x70, 0x74, 0x65, 0x6d, 0x62, 0x61, 0x3b, 0x4f, 0x6b, 0x74, 0x169,
-0x62, 0x61, 0x3b, 0x4e, 0x6f, 0x76, 0x65, 0x6d, 0x62, 0x61, 0x3b, 0x44, 0x69, 0x63, 0x65, 0x6d, 0x62, 0x61, 0x3b, 0x4a,
-0x3b, 0x46, 0x3b, 0x4d, 0x3b, 0x128, 0x3b, 0x4d, 0x3b, 0x4e, 0x3b, 0x4e, 0x3b, 0x41, 0x3b, 0x53, 0x3b, 0x4f, 0x3b, 0x4e,
-0x3b, 0x44, 0x3b, 0x4d, 0x75, 0x6c, 0x3b, 0x4e, 0x67, 0x61, 0x74, 0x3b, 0x54, 0x61, 0x61, 0x3b, 0x49, 0x77, 0x6f, 0x3b,
-0x4d, 0x61, 0x6d, 0x3b, 0x50, 0x61, 0x61, 0x3b, 0x4e, 0x67, 0x65, 0x3b, 0x52, 0x6f, 0x6f, 0x3b, 0x42, 0x75, 0x72, 0x3b,
-0x45, 0x70, 0x65, 0x3b, 0x4b, 0x70, 0x74, 0x3b, 0x4b, 0x70, 0x61, 0x3b, 0x4d, 0x75, 0x6c, 0x67, 0x75, 0x6c, 0x3b, 0x4e,
-0x67, 0x2019, 0x61, 0x74, 0x79, 0x61, 0x61, 0x74, 0x6f, 0x3b, 0x4b, 0x69, 0x70, 0x74, 0x61, 0x61, 0x6d, 0x6f, 0x3b, 0x49,
-0x77, 0x6f, 0x6f, 0x74, 0x6b, 0x75, 0x75, 0x74, 0x3b, 0x4d, 0x61, 0x6d, 0x75, 0x75, 0x74, 0x3b, 0x50, 0x61, 0x61, 0x67,
-0x69, 0x3b, 0x4e, 0x67, 0x2019, 0x65, 0x69, 0x79, 0x65, 0x65, 0x74, 0x3b, 0x52, 0x6f, 0x6f, 0x70, 0x74, 0x75, 0x69, 0x3b,
-0x42, 0x75, 0x72, 0x65, 0x65, 0x74, 0x3b, 0x45, 0x70, 0x65, 0x65, 0x73, 0x6f, 0x3b, 0x4b, 0x69, 0x70, 0x73, 0x75, 0x75,
-0x6e, 0x64, 0x65, 0x20, 0x6e, 0x65, 0x20, 0x74, 0x61, 0x61, 0x69, 0x3b, 0x4b, 0x69, 0x70, 0x73, 0x75, 0x75, 0x6e, 0x64,
-0x65, 0x20, 0x6e, 0x65, 0x62, 0x6f, 0x20, 0x61, 0x65, 0x6e, 0x67, 0x2019, 0x3b, 0x4d, 0x3b, 0x4e, 0x3b, 0x54, 0x3b, 0x49,
-0x3b, 0x4d, 0x3b, 0x50, 0x3b, 0x4e, 0x3b, 0x52, 0x3b, 0x42, 0x3b, 0x45, 0x3b, 0x4b, 0x3b, 0x4b, 0x3b, 0x1c3, 0x4b, 0x68,
-0x61, 0x6e, 0x6e, 0x69, 0x3b, 0x1c3, 0x4b, 0x68, 0x61, 0x6e, 0x1c0, 0x67, 0xf4, 0x61, 0x62, 0x3b, 0x1c0, 0x4b, 0x68, 0x75,
-0x75, 0x1c1, 0x6b, 0x68, 0xe2, 0x62, 0x3b, 0x1c3, 0x48, 0xf4, 0x61, 0x1c2, 0x6b, 0x68, 0x61, 0x69, 0x62, 0x3b, 0x1c3, 0x4b,
-0x68, 0x61, 0x69, 0x74, 0x73, 0xe2, 0x62, 0x3b, 0x47, 0x61, 0x6d, 0x61, 0x1c0, 0x61, 0x65, 0x62, 0x3b, 0x1c2, 0x4b, 0x68,
-0x6f, 0x65, 0x73, 0x61, 0x6f, 0x62, 0x3b, 0x41, 0x6f, 0x1c1, 0x6b, 0x68, 0x75, 0x75, 0x6d, 0xfb, 0x1c1, 0x6b, 0x68, 0xe2,
-0x62, 0x3b, 0x54, 0x61, 0x72, 0x61, 0x1c0, 0x6b, 0x68, 0x75, 0x75, 0x6d, 0xfb, 0x1c1, 0x6b, 0x68, 0xe2, 0x62, 0x3b, 0x1c2,
-0x4e, 0xfb, 0x1c1, 0x6e, 0xe2, 0x69, 0x73, 0x65, 0x62, 0x3b, 0x1c0, 0x48, 0x6f, 0x6f, 0x1c2, 0x67, 0x61, 0x65, 0x62, 0x3b,
-0x48, 0xf4, 0x61, 0x73, 0x6f, 0x72, 0x65, 0x1c1, 0x6b, 0x68, 0xe2, 0x62, 0x3b, 0x4a, 0x61, 0x6e, 0x2e, 0x3b, 0x46, 0xe4,
-0x62, 0x2e, 0x3b, 0x4d, 0xe4, 0x7a, 0x2e, 0x3b, 0x41, 0x70, 0x72, 0x2e, 0x3b, 0x4d, 0x61, 0x69, 0x3b, 0x4a, 0x75, 0x6e,
-0x2e, 0x3b, 0x4a, 0x75, 0x6c, 0x2e, 0x3b, 0x4f, 0x75, 0x6a, 0x2e, 0x3b, 0x53, 0xe4, 0x70, 0x2e, 0x3b, 0x4f, 0x6b, 0x74,
-0x2e, 0x3b, 0x4e, 0x6f, 0x76, 0x2e, 0x3b, 0x44, 0x65, 0x7a, 0x2e, 0x3b, 0x4a, 0x61, 0x6e, 0x6e, 0x65, 0x77, 0x61, 0x3b,
-0x46, 0xe4, 0x62, 0x72, 0x6f, 0x77, 0x61, 0x3b, 0x4d, 0xe4, 0xe4, 0x7a, 0x3b, 0x41, 0x70, 0x72, 0x65, 0x6c, 0x6c, 0x3b,
-0x4d, 0x61, 0x69, 0x3b, 0x4a, 0x75, 0x75, 0x6e, 0x69, 0x3b, 0x4a, 0x75, 0x75, 0x6c, 0x69, 0x3b, 0x4f, 0x75, 0x6a, 0x6f,
-0xdf, 0x3b, 0x53, 0x65, 0x70, 0x74, 0xe4, 0x6d, 0x62, 0x65, 0x72, 0x3b, 0x4f, 0x6b, 0x74, 0x6f, 0x68, 0x62, 0x65, 0x72,
-0x3b, 0x4e, 0x6f, 0x76, 0xe4, 0x6d, 0x62, 0x65, 0x72, 0x3b, 0x44, 0x65, 0x7a, 0xe4, 0x6d, 0x62, 0x65, 0x72, 0x3b, 0x4a,
-0x61, 0x6e, 0x3b, 0x46, 0xe4, 0x62, 0x3b, 0x4d, 0xe4, 0x7a, 0x3b, 0x41, 0x70, 0x72, 0x3b, 0x4d, 0x61, 0x69, 0x3b, 0x4a,
-0x75, 0x6e, 0x3b, 0x4a, 0x75, 0x6c, 0x3b, 0x4f, 0x75, 0x6a, 0x3b, 0x53, 0xe4, 0x70, 0x3b, 0x4f, 0x6b, 0x74, 0x3b, 0x4e,
-0x6f, 0x76, 0x3b, 0x44, 0x65, 0x7a, 0x3b, 0x44, 0x61, 0x6c, 0x3b, 0x41, 0x72, 0xe1, 0x3b, 0x186, 0x25b, 0x6e, 0x3b, 0x44,
-0x6f, 0x79, 0x3b, 0x4c, 0xe9, 0x70, 0x3b, 0x52, 0x6f, 0x6b, 0x3b, 0x53, 0xe1, 0x73, 0x3b, 0x42, 0x254, 0x301, 0x72, 0x3b,
-0x4b, 0xfa, 0x73, 0x3b, 0x47, 0xed, 0x73, 0x3b, 0x53, 0x68, 0x289, 0x301, 0x3b, 0x4e, 0x74, 0x289, 0x301, 0x3b, 0x4f, 0x6c,
-0x61, 0x64, 0x61, 0x6c, 0x289, 0x301, 0x3b, 0x41, 0x72, 0xe1, 0x74, 0x3b, 0x186, 0x25b, 0x6e, 0x268, 0x301, 0x254, 0x268, 0x14b,
-0x254, 0x6b, 0x3b, 0x4f, 0x6c, 0x6f, 0x64, 0x6f, 0x79, 0xed, 0xf3, 0x72, 0xed, 0xea, 0x20, 0x69, 0x6e, 0x6b, 0xf3, 0x6b,
-0xfa, 0xe2, 0x3b, 0x4f, 0x6c, 0x6f, 0x69, 0x6c, 0xe9, 0x70, 0x16b, 0x6e, 0x79, 0x12b, 0x113, 0x20, 0x69, 0x6e, 0x6b, 0xf3,
-0x6b, 0xfa, 0xe2, 0x3b, 0x4b, 0xfa, 0x6a, 0xfa, 0x254, 0x72, 0x254, 0x6b, 0x3b, 0x4d, 0xf3, 0x72, 0x75, 0x73, 0xe1, 0x73,
-0x69, 0x6e, 0x3b, 0x186, 0x6c, 0x254, 0x301, 0x268, 0x301, 0x62, 0x254, 0x301, 0x72, 0xe1, 0x72, 0x25b, 0x3b, 0x4b, 0xfa, 0x73,
-0x68, 0xee, 0x6e, 0x3b, 0x4f, 0x6c, 0x67, 0xed, 0x73, 0x61, 0x6e, 0x3b, 0x50, 0x289, 0x73, 0x68, 0x289, 0x301, 0x6b, 0x61,
-0x3b, 0x4e, 0x74, 0x289, 0x301, 0x14b, 0x289, 0x301, 0x73, 0x3b, 0x4a, 0x61, 0x6e, 0x3b, 0x46, 0x65, 0x62, 0x3b, 0x4d, 0x61,
-0x72, 0x3b, 0x41, 0x70, 0x72, 0x3b, 0x4d, 0x65, 0x69, 0x3b, 0x4a, 0x75, 0x6e, 0x3b, 0x4a, 0x75, 0x6c, 0x3b, 0x41, 0x67,
-0x6f, 0x3b, 0x53, 0x65, 0x70, 0x3b, 0x4f, 0x6b, 0x74, 0x3b, 0x4e, 0x6f, 0x76, 0x3b, 0x44, 0x65, 0x73, 0x3b, 0x4a, 0x61,
-0x6e, 0x3b, 0x46, 0x65, 0x62, 0x3b, 0x4d, 0x61, 0x63, 0x3b, 0x41, 0x70, 0x72, 0x3b, 0x4d, 0x65, 0x69, 0x3b, 0x4a, 0x75,
-0x6e, 0x3b, 0x4a, 0x75, 0x6c, 0x3b, 0x41, 0x67, 0x6f, 0x3b, 0x53, 0x65, 0x70, 0x3b, 0x4f, 0x6b, 0x74, 0x3b, 0x4e, 0x6f,
-0x76, 0x3b, 0x44, 0x65, 0x63, 0x3b, 0x52, 0x61, 0x72, 0x3b, 0x4d, 0x75, 0x6b, 0x3b, 0x4b, 0x77, 0x61, 0x3b, 0x44, 0x75,
-0x6e, 0x3b, 0x4d, 0x61, 0x72, 0x3b, 0x4d, 0x6f, 0x64, 0x3b, 0x4a, 0x6f, 0x6c, 0x3b, 0x50, 0x65, 0x64, 0x3b, 0x53, 0x6f,
-0x6b, 0x3b, 0x54, 0x69, 0x62, 0x3b, 0x4c, 0x61, 0x62, 0x3b, 0x50, 0x6f, 0x6f, 0x3b, 0x4f, 0x72, 0x61, 0x72, 0x61, 0x3b,
-0x4f, 0x6d, 0x75, 0x6b, 0x3b, 0x4f, 0x6b, 0x77, 0x61, 0x6d, 0x67, 0x2019, 0x3b, 0x4f, 0x64, 0x75, 0x6e, 0x67, 0x2019, 0x65,
-0x6c, 0x3b, 0x4f, 0x6d, 0x61, 0x72, 0x75, 0x6b, 0x3b, 0x4f, 0x6d, 0x6f, 0x64, 0x6f, 0x6b, 0x2019, 0x6b, 0x69, 0x6e, 0x67,
-0x2019, 0x6f, 0x6c, 0x3b, 0x4f, 0x6a, 0x6f, 0x6c, 0x61, 0x3b, 0x4f, 0x70, 0x65, 0x64, 0x65, 0x6c, 0x3b, 0x4f, 0x73, 0x6f,
-0x6b, 0x6f, 0x73, 0x6f, 0x6b, 0x6f, 0x6d, 0x61, 0x3b, 0x4f, 0x74, 0x69, 0x62, 0x61, 0x72, 0x3b, 0x4f, 0x6c, 0x61, 0x62,
-0x6f, 0x72, 0x3b, 0x4f, 0x70, 0x6f, 0x6f, 0x3b, 0x52, 0x3b, 0x4d, 0x3b, 0x4b, 0x3b, 0x44, 0x3b, 0x4d, 0x3b, 0x4d, 0x3b,
-0x4a, 0x3b, 0x50, 0x3b, 0x53, 0x3b, 0x54, 0x3b, 0x4c, 0x3b, 0x50, 0x3b, 0x17d, 0x61, 0x6e, 0x3b, 0x46, 0x65, 0x65, 0x3b,
-0x4d, 0x61, 0x72, 0x3b, 0x41, 0x77, 0x69, 0x3b, 0x4d, 0x65, 0x3b, 0x17d, 0x75, 0x77, 0x3b, 0x17d, 0x75, 0x79, 0x3b, 0x55,
-0x74, 0x3b, 0x53, 0x65, 0x6b, 0x3b, 0x4f, 0x6b, 0x74, 0x3b, 0x4e, 0x6f, 0x6f, 0x3b, 0x44, 0x65, 0x65, 0x3b, 0x17d, 0x61,
-0x6e, 0x77, 0x69, 0x79, 0x65, 0x3b, 0x46, 0x65, 0x65, 0x77, 0x69, 0x72, 0x69, 0x79, 0x65, 0x3b, 0x4d, 0x61, 0x72, 0x73,
-0x69, 0x3b, 0x41, 0x77, 0x69, 0x72, 0x69, 0x6c, 0x3b, 0x4d, 0x65, 0x3b, 0x17d, 0x75, 0x77, 0x65, 0x14b, 0x3b, 0x17d, 0x75,
-0x79, 0x79, 0x65, 0x3b, 0x55, 0x74, 0x3b, 0x53, 0x65, 0x6b, 0x74, 0x61, 0x6e, 0x62, 0x75, 0x72, 0x3b, 0x4f, 0x6b, 0x74,
-0x6f, 0x6f, 0x62, 0x75, 0x72, 0x3b, 0x4e, 0x6f, 0x6f, 0x77, 0x61, 0x6e, 0x62, 0x75, 0x72, 0x3b, 0x44, 0x65, 0x65, 0x73,
-0x61, 0x6e, 0x62, 0x75, 0x72, 0x3b, 0x17d, 0x3b, 0x46, 0x3b, 0x4d, 0x3b, 0x41, 0x3b, 0x4d, 0x3b, 0x17d, 0x3b, 0x17d, 0x3b,
-0x55, 0x3b, 0x53, 0x3b, 0x4f, 0x3b, 0x4e, 0x3b, 0x44, 0x3b, 0x44, 0x41, 0x43, 0x3b, 0x44, 0x41, 0x52, 0x3b, 0x44, 0x41,
-0x44, 0x3b, 0x44, 0x41, 0x4e, 0x3b, 0x44, 0x41, 0x48, 0x3b, 0x44, 0x41, 0x55, 0x3b, 0x44, 0x41, 0x4f, 0x3b, 0x44, 0x41,
-0x42, 0x3b, 0x44, 0x4f, 0x43, 0x3b, 0x44, 0x41, 0x50, 0x3b, 0x44, 0x47, 0x49, 0x3b, 0x44, 0x41, 0x47, 0x3b, 0x44, 0x77,
-0x65, 0x20, 0x6d, 0x61, 0x72, 0x20, 0x41, 0x63, 0x68, 0x69, 0x65, 0x6c, 0x3b, 0x44, 0x77, 0x65, 0x20, 0x6d, 0x61, 0x72,
-0x20, 0x41, 0x72, 0x69, 0x79, 0x6f, 0x3b, 0x44, 0x77, 0x65, 0x20, 0x6d, 0x61, 0x72, 0x20, 0x41, 0x64, 0x65, 0x6b, 0x3b,
-0x44, 0x77, 0x65, 0x20, 0x6d, 0x61, 0x72, 0x20, 0x41, 0x6e, 0x67, 0x2019, 0x77, 0x65, 0x6e, 0x3b, 0x44, 0x77, 0x65, 0x20,
-0x6d, 0x61, 0x72, 0x20, 0x41, 0x62, 0x69, 0x63, 0x68, 0x3b, 0x44, 0x77, 0x65, 0x20, 0x6d, 0x61, 0x72, 0x20, 0x41, 0x75,
-0x63, 0x68, 0x69, 0x65, 0x6c, 0x3b, 0x44, 0x77, 0x65, 0x20, 0x6d, 0x61, 0x72, 0x20, 0x41, 0x62, 0x69, 0x72, 0x69, 0x79,
-0x6f, 0x3b, 0x44, 0x77, 0x65, 0x20, 0x6d, 0x61, 0x72, 0x20, 0x41, 0x62, 0x6f, 0x72, 0x6f, 0x3b, 0x44, 0x77, 0x65, 0x20,
-0x6d, 0x61, 0x72, 0x20, 0x4f, 0x63, 0x68, 0x69, 0x6b, 0x6f, 0x3b, 0x44, 0x77, 0x65, 0x20, 0x6d, 0x61, 0x72, 0x20, 0x41,
-0x70, 0x61, 0x72, 0x3b, 0x44, 0x77, 0x65, 0x20, 0x6d, 0x61, 0x72, 0x20, 0x67, 0x69, 0x20, 0x61, 0x63, 0x68, 0x69, 0x65,
-0x6c, 0x3b, 0x44, 0x77, 0x65, 0x20, 0x6d, 0x61, 0x72, 0x20, 0x41, 0x70, 0x61, 0x72, 0x20, 0x67, 0x69, 0x20, 0x61, 0x72,
-0x69, 0x79, 0x6f, 0x3b, 0x43, 0x3b, 0x52, 0x3b, 0x44, 0x3b, 0x4e, 0x3b, 0x42, 0x3b, 0x55, 0x3b, 0x42, 0x3b, 0x42, 0x3b,
-0x43, 0x3b, 0x50, 0x3b, 0x43, 0x3b, 0x50, 0x3b, 0x59, 0x65, 0x6e, 0x3b, 0x59, 0x65, 0x62, 0x3b, 0x4d, 0x61, 0x72, 0x3b,
-0x49, 0x62, 0x72, 0x3b, 0x4d, 0x61, 0x79, 0x3b, 0x59, 0x75, 0x6e, 0x3b, 0x59, 0x75, 0x6c, 0x3b, 0x194, 0x75, 0x63, 0x3b,
-0x43, 0x75, 0x74, 0x3b, 0x4b, 0x1e6d, 0x75, 0x3b, 0x4e, 0x77, 0x61, 0x3b, 0x44, 0x75, 0x6a, 0x3b, 0x59, 0x65, 0x6e, 0x6e,
-0x61, 0x79, 0x65, 0x72, 0x3b, 0x59, 0x65, 0x62, 0x72, 0x61, 0x79, 0x65, 0x72, 0x3b, 0x4d, 0x61, 0x72, 0x73, 0x3b, 0x49,
-0x62, 0x72, 0x69, 0x72, 0x3b, 0x4d, 0x61, 0x79, 0x79, 0x75, 0x3b, 0x59, 0x75, 0x6e, 0x79, 0x75, 0x3b, 0x59, 0x75, 0x6c,
-0x79, 0x75, 0x7a, 0x3b, 0x194, 0x75, 0x63, 0x74, 0x3b, 0x43, 0x75, 0x74, 0x61, 0x6e, 0x62, 0x69, 0x72, 0x3b, 0x4b, 0x1e6d,
-0x75, 0x62, 0x65, 0x72, 0x3b, 0x4e, 0x77, 0x61, 0x6e, 0x62, 0x69, 0x72, 0x3b, 0x44, 0x75, 0x6a, 0x61, 0x6e, 0x62, 0x69,
-0x72, 0x3b, 0x59, 0x3b, 0x59, 0x3b, 0x4d, 0x3b, 0x49, 0x3b, 0x4d, 0x3b, 0x59, 0x3b, 0x59, 0x3b, 0x194, 0x3b, 0x43, 0x3b,
-0x4b, 0x3b, 0x4e, 0x3b, 0x44, 0x3b, 0x4a, 0x61, 0x6e, 0x75, 0x61, 0x6c, 0x69, 0x3b, 0x46, 0x65, 0x62, 0x6c, 0x75, 0x61,
-0x6c, 0x69, 0x3b, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x3b, 0x41, 0x70, 0x6c, 0x69, 0x6c, 0x69, 0x3b, 0x4d, 0x65, 0x69, 0x3b,
-0x4a, 0x75, 0x6e, 0x69, 0x3b, 0x4a, 0x75, 0x6c, 0x61, 0x69, 0x3b, 0x41, 0x67, 0x6f, 0x73, 0x74, 0x69, 0x3b, 0x53, 0x65,
-0x70, 0x74, 0x65, 0x6d, 0x62, 0x61, 0x3b, 0x4f, 0x6b, 0x74, 0x6f, 0x62, 0x61, 0x3b, 0x4e, 0x6f, 0x76, 0x65, 0x6d, 0x62,
-0x61, 0x3b, 0x44, 0x65, 0x73, 0x65, 0x6d, 0x62, 0x61, 0x3b, 0x91c, 0x93e, 0x928, 0x941, 0x935, 0x93e, 0x930, 0x940, 0x3b, 0x92b,
-0x947, 0x92c, 0x94d, 0x930, 0x941, 0x935, 0x93e, 0x930, 0x940, 0x3b, 0x92e, 0x93e, 0x930, 0x94d, 0x938, 0x3b, 0x90f, 0x92b, 0x94d, 0x930,
-0x93f, 0x932, 0x3b, 0x92e, 0x947, 0x3b, 0x91c, 0x941, 0x928, 0x3b, 0x91c, 0x941, 0x932, 0x93e, 0x907, 0x3b, 0x906, 0x917, 0x938, 0x94d,
-0x925, 0x3b, 0x938, 0x947, 0x92c, 0x925, 0x947, 0x91c, 0x94d, 0x92c, 0x93c, 0x930, 0x3b, 0x905, 0x916, 0x925, 0x92c, 0x930, 0x3b, 0x928,
-0x92c, 0x947, 0x91c, 0x94d, 0x92c, 0x93c, 0x930, 0x3b, 0x926, 0x93f, 0x938, 0x947, 0x91c, 0x94d, 0x92c, 0x93c, 0x930, 0x3b, 0x91c, 0x3b,
-0x92b, 0x947, 0x3b, 0x92e, 0x93e, 0x3b, 0x90f, 0x3b, 0x92e, 0x947, 0x3b, 0x91c, 0x941, 0x3b, 0x91c, 0x941, 0x3b, 0x906, 0x3b, 0x938,
-0x947, 0x3b, 0x905, 0x3b, 0x928, 0x3b, 0x926, 0x93f, 0x3b, 0x456, 0x486, 0x430, 0x2de9, 0x487, 0x3b, 0x444, 0x435, 0x2de1, 0x487, 0x3b,
-0x43c, 0x430, 0x2dec, 0x487, 0x3b, 0x430, 0x486, 0x43f, 0x2dec, 0x487, 0x3b, 0x43c, 0x430, 0xa675, 0x3b, 0x456, 0x486, 0xa64b, 0x2de9, 0x487,
-0x3b, 0x456, 0x486, 0xa64b, 0x2de7, 0x487, 0x3b, 0x430, 0x486, 0x301, 0x475, 0x2de2, 0x487, 0x3b, 0x441, 0x435, 0x2deb, 0x487, 0x3b, 0x47b,
-0x486, 0x43a, 0x2dee, 0x3b, 0x43d, 0x43e, 0x435, 0x2de8, 0x3b, 0x434, 0x435, 0x2de6, 0x487, 0x3b, 0x456, 0x486, 0x430, 0x43d, 0x43d, 0xa64b,
-0x430, 0x301, 0x440, 0x457, 0x439, 0x3b, 0x444, 0x435, 0x432, 0x440, 0xa64b, 0x430, 0x301, 0x440, 0x457, 0x439, 0x3b, 0x43c, 0x430, 0x301,
-0x440, 0x442, 0x44a, 0x3b, 0x430, 0x486, 0x43f, 0x440, 0x456, 0x301, 0x43b, 0x43b, 0x457, 0x439, 0x3b, 0x43c, 0x430, 0x301, 0x457, 0x439,
-0x3b, 0x456, 0x486, 0xa64b, 0x301, 0x43d, 0x457, 0x439, 0x3b, 0x456, 0x486, 0xa64b, 0x301, 0x43b, 0x457, 0x439, 0x3b, 0x430, 0x486, 0x301,
-0x475, 0x433, 0xa64b, 0x441, 0x442, 0x44a, 0x3b, 0x441, 0x435, 0x43f, 0x442, 0x435, 0x301, 0x43c, 0x432, 0x440, 0x457, 0x439, 0x3b, 0x47b,
-0x486, 0x43a, 0x442, 0x461, 0x301, 0x432, 0x440, 0x457, 0x439, 0x3b, 0x43d, 0x43e, 0x435, 0x301, 0x43c, 0x432, 0x440, 0x457, 0x439, 0x3b,
-0x434, 0x435, 0x43a, 0x435, 0x301, 0x43c, 0x432, 0x440, 0x457, 0x439, 0x3b, 0x406, 0x486, 0x3b, 0x424, 0x3b, 0x41c, 0x3b, 0x410, 0x486,
-0x3b, 0x41c, 0x3b, 0x406, 0x486, 0x3b, 0x406, 0x486, 0x3b, 0x410, 0x486, 0x3b, 0x421, 0x3b, 0x47a, 0x486, 0x3b, 0x41d, 0x3b, 0x414,
-0x3b, 0x456, 0x486, 0x430, 0x43d, 0x43d, 0xa64b, 0x430, 0x301, 0x440, 0x457, 0x430, 0x3b, 0x444, 0x435, 0x432, 0x440, 0xa64b, 0x430, 0x301,
-0x440, 0x457, 0x430, 0x3b, 0x43c, 0x430, 0x301, 0x440, 0x442, 0x430, 0x3b, 0x430, 0x486, 0x43f, 0x440, 0x456, 0x301, 0x43b, 0x43b, 0x457,
-0x430, 0x3b, 0x43c, 0x430, 0x301, 0x457, 0x430, 0x3b, 0x456, 0x486, 0xa64b, 0x301, 0x43d, 0x457, 0x430, 0x3b, 0x456, 0x486, 0xa64b, 0x301,
-0x43b, 0x457, 0x430, 0x3b, 0x430, 0x486, 0x301, 0x475, 0x433, 0xa64b, 0x441, 0x442, 0x430, 0x3b, 0x441, 0x435, 0x43f, 0x442, 0x435, 0x301,
-0x43c, 0x432, 0x440, 0x457, 0x430, 0x3b, 0x47b, 0x486, 0x43a, 0x442, 0x461, 0x301, 0x432, 0x440, 0x457, 0x430, 0x3b, 0x43d, 0x43e, 0x435,
-0x301, 0x43c, 0x432, 0x440, 0x457, 0x430, 0x3b, 0x434, 0x435, 0x43a, 0x435, 0x301, 0x43c, 0x432, 0x440, 0x457, 0x430, 0x3b, 0x43, 0x69,
-0x6f, 0x3b, 0x4c, 0x75, 0x69, 0x3b, 0x4c, 0x75, 0x73, 0x3b, 0x4d, 0x75, 0x75, 0x3b, 0x4c, 0x75, 0x6d, 0x3b, 0x4c, 0x75,
-0x66, 0x3b, 0x4b, 0x61, 0x62, 0x3b, 0x4c, 0x75, 0x73, 0x68, 0x3b, 0x4c, 0x75, 0x74, 0x3b, 0x4c, 0x75, 0x6e, 0x3b, 0x4b,
-0x61, 0x73, 0x3b, 0x43, 0x69, 0x73, 0x3b, 0x43, 0x69, 0x6f, 0x6e, 0x67, 0x6f, 0x3b, 0x4c, 0xf9, 0x69, 0x73, 0x68, 0x69,
-0x3b, 0x4c, 0x75, 0x73, 0xf2, 0x6c, 0x6f, 0x3b, 0x4d, 0xf9, 0x75, 0x79, 0xe0, 0x3b, 0x4c, 0x75, 0x6d, 0xf9, 0x6e, 0x67,
-0xf9, 0x6c, 0xf9, 0x3b, 0x4c, 0x75, 0x66, 0x75, 0x69, 0x6d, 0x69, 0x3b, 0x4b, 0x61, 0x62, 0xe0, 0x6c, 0xe0, 0x73, 0x68,
-0xec, 0x70, 0xf9, 0x3b, 0x4c, 0xf9, 0x73, 0x68, 0xec, 0x6b, 0xe0, 0x3b, 0x4c, 0x75, 0x74, 0x6f, 0x6e, 0x67, 0x6f, 0x6c,
-0x6f, 0x3b, 0x4c, 0x75, 0x6e, 0x67, 0xf9, 0x64, 0x69, 0x3b, 0x4b, 0x61, 0x73, 0x77, 0xe8, 0x6b, 0xe8, 0x73, 0xe8, 0x3b,
-0x43, 0x69, 0x73, 0x77, 0xe0, 0x3b, 0x43, 0x3b, 0x4c, 0x3b, 0x4c, 0x3b, 0x4d, 0x3b, 0x4c, 0x3b, 0x4c, 0x3b, 0x4b, 0x3b,
-0x4c, 0x3b, 0x4c, 0x3b, 0x4c, 0x3b, 0x4b, 0x3b, 0x43, 0x3b, 0x4a, 0x61, 0x6e, 0x3b, 0x46, 0x65, 0x62, 0x3b, 0x4d, 0xe4,
-0x65, 0x3b, 0x41, 0x62, 0x72, 0x3b, 0x4d, 0x65, 0x65, 0x3b, 0x4a, 0x75, 0x6e, 0x3b, 0x4a, 0x75, 0x6c, 0x3b, 0x41, 0x75,
-0x67, 0x3b, 0x53, 0x65, 0x70, 0x3b, 0x4f, 0x6b, 0x74, 0x3b, 0x4e, 0x6f, 0x76, 0x3b, 0x44, 0x65, 0x7a, 0x3b, 0x4a, 0x61,
-0x6e, 0x75, 0x61, 0x72, 0x3b, 0x46, 0x65, 0x62, 0x72, 0x75, 0x61, 0x72, 0x3b, 0x4d, 0xe4, 0x65, 0x72, 0x7a, 0x3b, 0x41,
-0x62, 0x72, 0xeb, 0x6c, 0x6c, 0x3b, 0x4d, 0x65, 0x65, 0x3b, 0x4a, 0x75, 0x6e, 0x69, 0x3b, 0x4a, 0x75, 0x6c, 0x69, 0x3b,
-0x41, 0x75, 0x67, 0x75, 0x73, 0x74, 0x3b, 0x53, 0x65, 0x70, 0x74, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x3b, 0x4f, 0x6b, 0x74,
-0x6f, 0x62, 0x65, 0x72, 0x3b, 0x4e, 0x6f, 0x76, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x3b, 0x44, 0x65, 0x7a, 0x65, 0x6d, 0x62,
-0x65, 0x72, 0x3b, 0x4a, 0x61, 0x6e, 0x2e, 0x3b, 0x46, 0x65, 0x62, 0x2e, 0x3b, 0x4d, 0xe4, 0x65, 0x2e, 0x3b, 0x41, 0x62,
-0x72, 0x2e, 0x3b, 0x4d, 0x65, 0x65, 0x3b, 0x4a, 0x75, 0x6e, 0x69, 0x3b, 0x4a, 0x75, 0x6c, 0x69, 0x3b, 0x41, 0x75, 0x67,
-0x2e, 0x3b, 0x53, 0x65, 0x70, 0x2e, 0x3b, 0x4f, 0x6b, 0x74, 0x2e, 0x3b, 0x4e, 0x6f, 0x76, 0x2e, 0x3b, 0x44, 0x65, 0x7a,
-0x2e, 0x3b, 0x6e, 0xf9, 0x6d, 0x3b, 0x6b, 0x268, 0x7a, 0x3b, 0x74, 0x268, 0x64, 0x3b, 0x74, 0x61, 0x61, 0x3b, 0x73, 0x65,
-0x65, 0x3b, 0x6e, 0x7a, 0x75, 0x3b, 0x64, 0x75, 0x6d, 0x3b, 0x66, 0x254, 0x65, 0x3b, 0x64, 0x7a, 0x75, 0x3b, 0x6c, 0x254,
-0x6d, 0x3b, 0x6b, 0x61, 0x61, 0x3b, 0x66, 0x77, 0x6f, 0x3b, 0x6e, 0x64, 0x7a, 0x254, 0x300, 0x14b, 0x254, 0x300, 0x6e, 0xf9,
-0x6d, 0x3b, 0x6e, 0x64, 0x7a, 0x254, 0x300, 0x14b, 0x254, 0x300, 0x6b, 0x197, 0x300, 0x7a, 0xf9, 0x294, 0x3b, 0x6e, 0x64, 0x7a,
-0x254, 0x300, 0x14b, 0x254, 0x300, 0x74, 0x197, 0x300, 0x64, 0x289, 0x300, 0x67, 0x68, 0xe0, 0x3b, 0x6e, 0x64, 0x7a, 0x254, 0x300,
-0x14b, 0x254, 0x300, 0x74, 0x1ce, 0x61, 0x66, 0x289, 0x304, 0x67, 0x68, 0x101, 0x3b, 0x6e, 0x64, 0x7a, 0x254, 0x300, 0x14b, 0xe8,
-0x73, 0xe8, 0x65, 0x3b, 0x6e, 0x64, 0x7a, 0x254, 0x300, 0x14b, 0x254, 0x300, 0x6e, 0x7a, 0xf9, 0x67, 0x68, 0xf2, 0x3b, 0x6e,
-0x64, 0x7a, 0x254, 0x300, 0x14b, 0x254, 0x300, 0x64, 0xf9, 0x6d, 0x6c, 0x6f, 0x3b, 0x6e, 0x64, 0x7a, 0x254, 0x300, 0x14b, 0x254,
-0x300, 0x6b, 0x77, 0xee, 0x66, 0x254, 0x300, 0x65, 0x3b, 0x6e, 0x64, 0x7a, 0x254, 0x300, 0x14b, 0x254, 0x300, 0x74, 0x197, 0x300,
-0x66, 0x289, 0x300, 0x67, 0x68, 0xe0, 0x64, 0x7a, 0x75, 0x67, 0x68, 0xf9, 0x3b, 0x6e, 0x64, 0x7a, 0x254, 0x300, 0x14b, 0x254,
-0x300, 0x67, 0x68, 0x1d4, 0x75, 0x77, 0x65, 0x6c, 0x254, 0x300, 0x6d, 0x3b, 0x6e, 0x64, 0x7a, 0x254, 0x300, 0x14b, 0x254, 0x300,
-0x63, 0x68, 0x77, 0x61, 0x294, 0xe0, 0x6b, 0x61, 0x61, 0x20, 0x77, 0x6f, 0x3b, 0x6e, 0x64, 0x7a, 0x254, 0x300, 0x14b, 0xe8,
-0x66, 0x77, 0xf2, 0x6f, 0x3b, 0x6e, 0x3b, 0x6b, 0x3b, 0x74, 0x3b, 0x74, 0x3b, 0x73, 0x3b, 0x7a, 0x3b, 0x6b, 0x3b, 0x66,
-0x3b, 0x64, 0x3b, 0x6c, 0x3b, 0x63, 0x3b, 0x66, 0x3b, 0x6b, 0x254, 0x6e, 0x3b, 0x6d, 0x61, 0x63, 0x3b, 0x6d, 0x61, 0x74,
-0x3b, 0x6d, 0x74, 0x6f, 0x3b, 0x6d, 0x70, 0x75, 0x3b, 0x68, 0x69, 0x6c, 0x3b, 0x6e, 0x6a, 0x65, 0x3b, 0x68, 0x69, 0x6b,
-0x3b, 0x64, 0x69, 0x70, 0x3b, 0x62, 0x69, 0x6f, 0x3b, 0x6d, 0x61, 0x79, 0x3b, 0x6c, 0x69, 0x253, 0x3b, 0x4b, 0x254, 0x6e,
-0x64, 0x254, 0x14b, 0x3b, 0x4d, 0xe0, 0x63, 0x25b, 0x302, 0x6c, 0x3b, 0x4d, 0xe0, 0x74, 0xf9, 0x6d, 0x62, 0x3b, 0x4d, 0xe0,
-0x74, 0x6f, 0x70, 0x3b, 0x4d, 0x300, 0x70, 0x75, 0x79, 0x25b, 0x3b, 0x48, 0xec, 0x6c, 0xf2, 0x6e, 0x64, 0x25b, 0x300, 0x3b,
-0x4e, 0x6a, 0xe8, 0x62, 0xe0, 0x3b, 0x48, 0xec, 0x6b, 0x61, 0x14b, 0x3b, 0x44, 0xec, 0x70, 0x254, 0x300, 0x73, 0x3b, 0x42,
-0xec, 0xf2, 0xf4, 0x6d, 0x3b, 0x4d, 0xe0, 0x79, 0x25b, 0x73, 0xe8, 0x70, 0x3b, 0x4c, 0xec, 0x62, 0x75, 0x79, 0x20, 0x6c,
-0x69, 0x20, 0x144, 0x79, 0xe8, 0x65, 0x3b, 0x6b, 0x3b, 0x6d, 0x3b, 0x6d, 0x3b, 0x6d, 0x3b, 0x6d, 0x3b, 0x68, 0x3b, 0x6e,
-0x3b, 0x68, 0x3b, 0x64, 0x3b, 0x62, 0x3b, 0x6d, 0x3b, 0x6c, 0x3b, 0x64, 0x69, 0x3b, 0x14b, 0x67, 0x254, 0x6e, 0x3b, 0x73,
-0x254, 0x14b, 0x3b, 0x64, 0x69, 0x253, 0x3b, 0x65, 0x6d, 0x69, 0x3b, 0x65, 0x73, 0x254, 0x3b, 0x6d, 0x61, 0x64, 0x3b, 0x64,
-0x69, 0x14b, 0x3b, 0x6e, 0x79, 0x25b, 0x74, 0x3b, 0x6d, 0x61, 0x79, 0x3b, 0x74, 0x69, 0x6e, 0x3b, 0x65, 0x6c, 0xe1, 0x3b,
-0x64, 0x69, 0x6d, 0x254, 0x301, 0x64, 0x69, 0x3b, 0x14b, 0x67, 0x254, 0x6e, 0x64, 0x25b, 0x3b, 0x73, 0x254, 0x14b, 0x25b, 0x3b,
-0x64, 0x69, 0x253, 0xe1, 0x253, 0xe1, 0x3b, 0x65, 0x6d, 0x69, 0x61, 0x73, 0x65, 0x6c, 0x65, 0x3b, 0x65, 0x73, 0x254, 0x70,
-0x25b, 0x73, 0x254, 0x70, 0x25b, 0x3b, 0x6d, 0x61, 0x64, 0x69, 0x253, 0x25b, 0x301, 0x64, 0xed, 0x253, 0x25b, 0x301, 0x3b, 0x64,
-0x69, 0x14b, 0x67, 0x69, 0x6e, 0x64, 0x69, 0x3b, 0x6e, 0x79, 0x25b, 0x74, 0x25b, 0x6b, 0x69, 0x3b, 0x6d, 0x61, 0x79, 0xe9,
-0x73, 0x25b, 0x301, 0x3b, 0x74, 0x69, 0x6e, 0xed, 0x6e, 0xed, 0x3b, 0x65, 0x6c, 0xe1, 0x14b, 0x67, 0x25b, 0x301, 0x3b, 0x64,
-0x3b, 0x14b, 0x3b, 0x73, 0x3b, 0x64, 0x3b, 0x65, 0x3b, 0x65, 0x3b, 0x6d, 0x3b, 0x64, 0x3b, 0x6e, 0x3b, 0x6d, 0x3b, 0x74,
-0x3b, 0x65, 0x3b, 0x53, 0x61, 0x3b, 0x46, 0x65, 0x3b, 0x4d, 0x61, 0x3b, 0x41, 0x62, 0x3b, 0x4d, 0x65, 0x3b, 0x53, 0x75,
-0x3b, 0x53, 0xfa, 0x3b, 0x55, 0x74, 0x3b, 0x53, 0x65, 0x3b, 0x4f, 0x6b, 0x3b, 0x4e, 0x6f, 0x3b, 0x44, 0x65, 0x3b, 0x53,
-0x61, 0x6e, 0x76, 0x69, 0x65, 0x3b, 0x46, 0xe9, 0x62, 0x69, 0x72, 0x69, 0x65, 0x3b, 0x4d, 0x61, 0x72, 0x73, 0x3b, 0x41,
-0x62, 0x75, 0x72, 0x69, 0x6c, 0x3b, 0x4d, 0x65, 0x65, 0x3b, 0x53, 0x75, 0x65, 0x14b, 0x3b, 0x53, 0xfa, 0x75, 0x79, 0x65,
-0x65, 0x3b, 0x55, 0x74, 0x3b, 0x53, 0x65, 0x74, 0x74, 0x65, 0x6d, 0x62, 0x61, 0x72, 0x3b, 0x4f, 0x6b, 0x74, 0x6f, 0x62,
-0x61, 0x72, 0x3b, 0x4e, 0x6f, 0x76, 0x65, 0x6d, 0x62, 0x61, 0x72, 0x3b, 0x44, 0x69, 0x73, 0x61, 0x6d, 0x62, 0x61, 0x72,
-0x3b, 0x53, 0x3b, 0x46, 0x3b, 0x4d, 0x3b, 0x41, 0x3b, 0x4d, 0x3b, 0x53, 0x3b, 0x53, 0x3b, 0x55, 0x3b, 0x53, 0x3b, 0x4f,
-0x3b, 0x4e, 0x3b, 0x44, 0x3b, 0x6e, 0x67, 0x6f, 0x3b, 0x6e, 0x67, 0x62, 0x3b, 0x6e, 0x67, 0x6c, 0x3b, 0x6e, 0x67, 0x6e,
-0x3b, 0x6e, 0x67, 0x74, 0x3b, 0x6e, 0x67, 0x73, 0x3b, 0x6e, 0x67, 0x7a, 0x3b, 0x6e, 0x67, 0x6d, 0x3b, 0x6e, 0x67, 0x65,
-0x3b, 0x6e, 0x67, 0x61, 0x3b, 0x6e, 0x67, 0x61, 0x64, 0x3b, 0x6e, 0x67, 0x61, 0x62, 0x3b, 0x6e, 0x67, 0x254, 0x6e, 0x20,
-0x6f, 0x73, 0xfa, 0x3b, 0x6e, 0x67, 0x254, 0x6e, 0x20, 0x62, 0x25b, 0x30c, 0x3b, 0x6e, 0x67, 0x254, 0x6e, 0x20, 0x6c, 0xe1,
-0x6c, 0x61, 0x3b, 0x6e, 0x67, 0x254, 0x6e, 0x20, 0x6e, 0x79, 0x69, 0x6e, 0x61, 0x3b, 0x6e, 0x67, 0x254, 0x6e, 0x20, 0x74,
-0xe1, 0x6e, 0x61, 0x3b, 0x6e, 0x67, 0x254, 0x6e, 0x20, 0x73, 0x61, 0x6d, 0x259, 0x6e, 0x61, 0x3b, 0x6e, 0x67, 0x254, 0x6e,
-0x20, 0x7a, 0x61, 0x6d, 0x67, 0x62, 0xe1, 0x6c, 0x61, 0x3b, 0x6e, 0x67, 0x254, 0x6e, 0x20, 0x6d, 0x77, 0x6f, 0x6d, 0x3b,
-0x6e, 0x67, 0x254, 0x6e, 0x20, 0x65, 0x62, 0x75, 0x6c, 0xfa, 0x3b, 0x6e, 0x67, 0x254, 0x6e, 0x20, 0x61, 0x77, 0xf3, 0x6d,
-0x3b, 0x6e, 0x67, 0x254, 0x6e, 0x20, 0x61, 0x77, 0xf3, 0x6d, 0x20, 0x61, 0x69, 0x20, 0x64, 0x7a, 0x69, 0xe1, 0x3b, 0x6e,
-0x67, 0x254, 0x6e, 0x20, 0x61, 0x77, 0xf3, 0x6d, 0x20, 0x61, 0x69, 0x20, 0x62, 0x25b, 0x30c, 0x3b, 0x6f, 0x3b, 0x62, 0x3b,
-0x6c, 0x3b, 0x6e, 0x3b, 0x74, 0x3b, 0x73, 0x3b, 0x7a, 0x3b, 0x6d, 0x3b, 0x65, 0x3b, 0x61, 0x3b, 0x64, 0x3b, 0x62, 0x3b,
-0x14b, 0x31, 0x3b, 0x14b, 0x32, 0x3b, 0x14b, 0x33, 0x3b, 0x14b, 0x34, 0x3b, 0x14b, 0x35, 0x3b, 0x14b, 0x36, 0x3b, 0x14b, 0x37,
-0x3b, 0x14b, 0x38, 0x3b, 0x14b, 0x39, 0x3b, 0x14b, 0x31, 0x30, 0x3b, 0x14b, 0x31, 0x31, 0x3b, 0x14b, 0x31, 0x32, 0x3b, 0x14b,
-0x77, 0xed, 0xed, 0x20, 0x61, 0x20, 0x6e, 0x74, 0x254, 0x301, 0x6e, 0x74, 0x254, 0x3b, 0x14b, 0x77, 0xed, 0xed, 0x20, 0x61,
-0x6b, 0x1dd, 0x20, 0x62, 0x25b, 0x301, 0x25b, 0x3b, 0x14b, 0x77, 0xed, 0xed, 0x20, 0x61, 0x6b, 0x1dd, 0x20, 0x72, 0xe1, 0xe1,
-0x3b, 0x14b, 0x77, 0xed, 0xed, 0x20, 0x61, 0x6b, 0x1dd, 0x20, 0x6e, 0x69, 0x6e, 0x3b, 0x14b, 0x77, 0xed, 0xed, 0x20, 0x61,
-0x6b, 0x1dd, 0x20, 0x74, 0xe1, 0x61, 0x6e, 0x3b, 0x14b, 0x77, 0xed, 0xed, 0x20, 0x61, 0x6b, 0x1dd, 0x20, 0x74, 0xe1, 0x61,
-0x66, 0x254, 0x6b, 0x3b, 0x14b, 0x77, 0xed, 0xed, 0x20, 0x61, 0x6b, 0x1dd, 0x20, 0x74, 0xe1, 0x61, 0x62, 0x25b, 0x25b, 0x3b,
-0x14b, 0x77, 0xed, 0xed, 0x20, 0x61, 0x6b, 0x1dd, 0x20, 0x74, 0xe1, 0x61, 0x72, 0x61, 0x61, 0x3b, 0x14b, 0x77, 0xed, 0xed,
-0x20, 0x61, 0x6b, 0x1dd, 0x20, 0x74, 0xe1, 0x61, 0x6e, 0x69, 0x6e, 0x3b, 0x14b, 0x77, 0xed, 0xed, 0x20, 0x61, 0x6b, 0x1dd,
-0x20, 0x6e, 0x74, 0x25b, 0x6b, 0x3b, 0x14b, 0x77, 0xed, 0xed, 0x20, 0x61, 0x6b, 0x1dd, 0x20, 0x6e, 0x74, 0x25b, 0x6b, 0x20,
-0x64, 0x69, 0x20, 0x62, 0x254, 0x301, 0x6b, 0x3b, 0x14b, 0x77, 0xed, 0xed, 0x20, 0x61, 0x6b, 0x1dd, 0x20, 0x6e, 0x74, 0x25b,
-0x6b, 0x20, 0x64, 0x69, 0x20, 0x62, 0x25b, 0x301, 0x25b, 0x3b, 0x4b, 0x77, 0x61, 0x3b, 0x55, 0x6e, 0x61, 0x3b, 0x52, 0x61,
-0x72, 0x3b, 0x43, 0x68, 0x65, 0x3b, 0x54, 0x68, 0x61, 0x3b, 0x4d, 0x6f, 0x63, 0x3b, 0x53, 0x61, 0x62, 0x3b, 0x4e, 0x61,
-0x6e, 0x3b, 0x54, 0x69, 0x73, 0x3b, 0x4b, 0x75, 0x6d, 0x3b, 0x4d, 0x6f, 0x6a, 0x3b, 0x59, 0x65, 0x6c, 0x3b, 0x4d, 0x77,
-0x65, 0x72, 0x69, 0x20, 0x77, 0x6f, 0x20, 0x6b, 0x77, 0x61, 0x6e, 0x7a, 0x61, 0x3b, 0x4d, 0x77, 0x65, 0x72, 0x69, 0x20,
-0x77, 0x6f, 0x20, 0x75, 0x6e, 0x61, 0x79, 0x65, 0x6c, 0x69, 0x3b, 0x4d, 0x77, 0x65, 0x72, 0x69, 0x20, 0x77, 0x6f, 0x20,
-0x75, 0x6e, 0x65, 0x72, 0x61, 0x72, 0x75, 0x3b, 0x4d, 0x77, 0x65, 0x72, 0x69, 0x20, 0x77, 0x6f, 0x20, 0x75, 0x6e, 0x65,
-0x63, 0x68, 0x65, 0x73, 0x68, 0x65, 0x3b, 0x4d, 0x77, 0x65, 0x72, 0x69, 0x20, 0x77, 0x6f, 0x20, 0x75, 0x6e, 0x65, 0x74,
-0x68, 0x61, 0x6e, 0x75, 0x3b, 0x4d, 0x77, 0x65, 0x72, 0x69, 0x20, 0x77, 0x6f, 0x20, 0x74, 0x68, 0x61, 0x6e, 0x75, 0x20,
-0x6e, 0x61, 0x20, 0x6d, 0x6f, 0x63, 0x68, 0x61, 0x3b, 0x4d, 0x77, 0x65, 0x72, 0x69, 0x20, 0x77, 0x6f, 0x20, 0x73, 0x61,
-0x62, 0x61, 0x3b, 0x4d, 0x77, 0x65, 0x72, 0x69, 0x20, 0x77, 0x6f, 0x20, 0x6e, 0x61, 0x6e, 0x65, 0x3b, 0x4d, 0x77, 0x65,
-0x72, 0x69, 0x20, 0x77, 0x6f, 0x20, 0x74, 0x69, 0x73, 0x61, 0x3b, 0x4d, 0x77, 0x65, 0x72, 0x69, 0x20, 0x77, 0x6f, 0x20,
-0x6b, 0x75, 0x6d, 0x69, 0x3b, 0x4d, 0x77, 0x65, 0x72, 0x69, 0x20, 0x77, 0x6f, 0x20, 0x6b, 0x75, 0x6d, 0x69, 0x20, 0x6e,
-0x61, 0x20, 0x6d, 0x6f, 0x6a, 0x61, 0x3b, 0x4d, 0x77, 0x65, 0x72, 0x69, 0x20, 0x77, 0x6f, 0x20, 0x6b, 0x75, 0x6d, 0x69,
-0x20, 0x6e, 0x61, 0x20, 0x79, 0x65, 0x6c, 0x2019, 0x6c, 0x69, 0x3b, 0x4b, 0x3b, 0x55, 0x3b, 0x52, 0x3b, 0x43, 0x3b, 0x54,
-0x3b, 0x4d, 0x3b, 0x53, 0x3b, 0x4e, 0x3b, 0x54, 0x3b, 0x4b, 0x3b, 0x4d, 0x3b, 0x59, 0x3b, 0x46, 0x4c, 0x4f, 0x3b, 0x43,
-0x4c, 0x41, 0x3b, 0x43, 0x4b, 0x49, 0x3b, 0x46, 0x4d, 0x46, 0x3b, 0x4d, 0x41, 0x44, 0x3b, 0x4d, 0x42, 0x49, 0x3b, 0x4d,
-0x4c, 0x49, 0x3b, 0x4d, 0x41, 0x4d, 0x3b, 0x46, 0x44, 0x45, 0x3b, 0x46, 0x4d, 0x55, 0x3b, 0x46, 0x47, 0x57, 0x3b, 0x46,
-0x59, 0x55, 0x3b, 0x46, 0x129, 0x69, 0x20, 0x4c, 0x6f, 0x6f, 0x3b, 0x43, 0x6f, 0x6b, 0x63, 0x77, 0x61, 0x6b, 0x6c, 0x61,
-0x14b, 0x6e, 0x65, 0x3b, 0x43, 0x6f, 0x6b, 0x63, 0x77, 0x61, 0x6b, 0x6c, 0x69, 0x69, 0x3b, 0x46, 0x129, 0x69, 0x20, 0x4d,
-0x61, 0x72, 0x66, 0x6f, 0x6f, 0x3b, 0x4d, 0x61, 0x64, 0x1dd, 0x1dd, 0x75, 0x75, 0x74, 0x1dd, 0x62, 0x69, 0x6a, 0x61, 0x14b,
-0x3b, 0x4d, 0x61, 0x6d, 0x1dd, 0x14b, 0x67, 0x77, 0xe3, 0x61, 0x66, 0x61, 0x68, 0x62, 0x69, 0x69, 0x3b, 0x4d, 0x61, 0x6d,
-0x1dd, 0x14b, 0x67, 0x77, 0xe3, 0x61, 0x6c, 0x69, 0x69, 0x3b, 0x4d, 0x61, 0x64, 0x1dd, 0x6d, 0x62, 0x69, 0x69, 0x3b, 0x46,
-0x129, 0x69, 0x20, 0x44, 0x1dd, 0x253, 0x6c, 0x69, 0x69, 0x3b, 0x46, 0x129, 0x69, 0x20, 0x4d, 0x75, 0x6e, 0x64, 0x61, 0x14b,
-0x3b, 0x46, 0x129, 0x69, 0x20, 0x47, 0x77, 0x61, 0x68, 0x6c, 0x6c, 0x65, 0x3b, 0x46, 0x129, 0x69, 0x20, 0x59, 0x75, 0x72,
-0x75, 0x3b, 0x4f, 0x3b, 0x41, 0x3b, 0x49, 0x3b, 0x46, 0x3b, 0x44, 0x3b, 0x42, 0x3b, 0x4c, 0x3b, 0x4d, 0x3b, 0x45, 0x3b,
-0x55, 0x3b, 0x57, 0x3b, 0x59, 0x3b, 0x6e, 0x67, 0x31, 0x3b, 0x6e, 0x67, 0x32, 0x3b, 0x6e, 0x67, 0x33, 0x3b, 0x6e, 0x67,
-0x34, 0x3b, 0x6e, 0x67, 0x35, 0x3b, 0x6e, 0x67, 0x36, 0x3b, 0x6e, 0x67, 0x37, 0x3b, 0x6e, 0x67, 0x38, 0x3b, 0x6e, 0x67,
-0x39, 0x3b, 0x6e, 0x67, 0x31, 0x30, 0x3b, 0x6e, 0x67, 0x31, 0x31, 0x3b, 0x6b, 0x72, 0x69, 0x73, 0x3b, 0x6e, 0x67, 0x77,
-0x25b, 0x6e, 0x20, 0x6d, 0x61, 0x74, 0xe1, 0x68, 0x72, 0x61, 0x3b, 0x6e, 0x67, 0x77, 0x25b, 0x6e, 0x20, 0x144, 0x6d, 0x62,
-0x61, 0x3b, 0x6e, 0x67, 0x77, 0x25b, 0x6e, 0x20, 0x144, 0x6c, 0x61, 0x6c, 0x3b, 0x6e, 0x67, 0x77, 0x25b, 0x6e, 0x20, 0x144,
-0x6e, 0x61, 0x3b, 0x6e, 0x67, 0x77, 0x25b, 0x6e, 0x20, 0x144, 0x74, 0x61, 0x6e, 0x3b, 0x6e, 0x67, 0x77, 0x25b, 0x6e, 0x20,
-0x144, 0x74, 0x75, 0xf3, 0x3b, 0x6e, 0x67, 0x77, 0x25b, 0x6e, 0x20, 0x68, 0x25b, 0x6d, 0x62, 0x75, 0x25b, 0x72, 0xed, 0x3b,
-0x6e, 0x67, 0x77, 0x25b, 0x6e, 0x20, 0x6c, 0x254, 0x6d, 0x62, 0x69, 0x3b, 0x6e, 0x67, 0x77, 0x25b, 0x6e, 0x20, 0x72, 0x25b,
-0x62, 0x76, 0x75, 0xe2, 0x3b, 0x6e, 0x67, 0x77, 0x25b, 0x6e, 0x20, 0x77, 0x75, 0x6d, 0x3b, 0x6e, 0x67, 0x77, 0x25b, 0x6e,
-0x20, 0x77, 0x75, 0x6d, 0x20, 0x6e, 0x61, 0x76, 0x1d4, 0x72, 0x3b, 0x6b, 0x72, 0xed, 0x73, 0x69, 0x6d, 0x69, 0x6e, 0x3b,
-0x54, 0x69, 0x6f, 0x70, 0x3b, 0x50, 0x25b, 0x74, 0x3b, 0x44, 0x75, 0x254, 0x331, 0x254, 0x331, 0x3b, 0x47, 0x75, 0x61, 0x6b,
-0x3b, 0x44, 0x75, 0xe4, 0x3b, 0x4b, 0x6f, 0x72, 0x3b, 0x50, 0x61, 0x79, 0x3b, 0x54, 0x68, 0x6f, 0x6f, 0x3b, 0x54, 0x25b,
-0x25b, 0x3b, 0x4c, 0x61, 0x61, 0x3b, 0x4b, 0x75, 0x72, 0x3b, 0x54, 0x69, 0x64, 0x3b, 0x54, 0x69, 0x6f, 0x70, 0x20, 0x74,
-0x68, 0x61, 0x72, 0x20, 0x70, 0x25b, 0x74, 0x3b, 0x50, 0x25b, 0x74, 0x3b, 0x44, 0x75, 0x254, 0x331, 0x254, 0x331, 0x14b, 0x3b,
-0x47, 0x75, 0x61, 0x6b, 0x3b, 0x44, 0x75, 0xe4, 0x74, 0x3b, 0x4b, 0x6f, 0x72, 0x6e, 0x79, 0x6f, 0x6f, 0x74, 0x3b, 0x50,
-0x61, 0x79, 0x20, 0x79, 0x69, 0x65, 0x331, 0x74, 0x6e, 0x69, 0x3b, 0x54, 0x68, 0x6f, 0x331, 0x6f, 0x331, 0x72, 0x3b, 0x54,
-0x25b, 0x25b, 0x72, 0x3b, 0x4c, 0x61, 0x61, 0x74, 0x68, 0x3b, 0x4b, 0x75, 0x72, 0x3b, 0x54, 0x69, 0x6f, 0x331, 0x70, 0x20,
-0x69, 0x6e, 0x20, 0x64, 0x69, 0x331, 0x69, 0x331, 0x74, 0x3b, 0x54, 0x3b, 0x50, 0x3b, 0x44, 0x3b, 0x47, 0x3b, 0x44, 0x3b,
-0x4b, 0x3b, 0x50, 0x3b, 0x54, 0x3b, 0x54, 0x3b, 0x4c, 0x3b, 0x4b, 0x3b, 0x54, 0x3b, 0x422, 0x43e, 0x445, 0x441, 0x3b, 0x41e,
-0x43b, 0x443, 0x43d, 0x3b, 0x41a, 0x43b, 0x43d, 0x3b, 0x41c, 0x441, 0x443, 0x3b, 0x42b, 0x430, 0x43c, 0x3b, 0x411, 0x44d, 0x441, 0x3b,
-0x41e, 0x442, 0x439, 0x3b, 0x410, 0x442, 0x440, 0x3b, 0x411, 0x43b, 0x495, 0x3b, 0x410, 0x43b, 0x442, 0x3b, 0x421, 0x44d, 0x442, 0x3b,
-0x410, 0x445, 0x441, 0x3b, 0x442, 0x43e, 0x445, 0x441, 0x443, 0x43d, 0x43d, 0x44c, 0x443, 0x3b, 0x43e, 0x43b, 0x443, 0x43d, 0x43d, 0x44c,
-0x443, 0x3b, 0x43a, 0x443, 0x43b, 0x443, 0x43d, 0x20, 0x442, 0x443, 0x442, 0x430, 0x440, 0x3b, 0x43c, 0x443, 0x443, 0x441, 0x20, 0x443,
-0x441, 0x442, 0x430, 0x440, 0x3b, 0x44b, 0x430, 0x43c, 0x20, 0x44b, 0x439, 0x430, 0x3b, 0x431, 0x44d, 0x441, 0x20, 0x44b, 0x439, 0x430,
-0x3b, 0x43e, 0x442, 0x20, 0x44b, 0x439, 0x430, 0x3b, 0x430, 0x442, 0x44b, 0x440, 0x434, 0x44c, 0x44b, 0x445, 0x20, 0x44b, 0x439, 0x430,
-0x3b, 0x431, 0x430, 0x43b, 0x430, 0x495, 0x430, 0x43d, 0x20, 0x44b, 0x439, 0x430, 0x3b, 0x430, 0x43b, 0x442, 0x44b, 0x43d, 0x43d, 0x44c,
-0x44b, 0x3b, 0x441, 0x44d, 0x442, 0x438, 0x43d, 0x43d, 0x44c, 0x438, 0x3b, 0x430, 0x445, 0x441, 0x44b, 0x43d, 0x43d, 0x44c, 0x44b, 0x3b,
-0x422, 0x3b, 0x41e, 0x3b, 0x41a, 0x3b, 0x41c, 0x3b, 0x42b, 0x3b, 0x411, 0x3b, 0x41e, 0x3b, 0x410, 0x3b, 0x411, 0x3b, 0x410, 0x3b,
-0x421, 0x3b, 0x410, 0x3b, 0x422, 0x43e, 0x445, 0x441, 0x443, 0x43d, 0x43d, 0x44c, 0x443, 0x3b, 0x41e, 0x43b, 0x443, 0x43d, 0x43d, 0x44c,
-0x443, 0x3b, 0x41a, 0x443, 0x43b, 0x443, 0x43d, 0x20, 0x442, 0x443, 0x442, 0x430, 0x440, 0x3b, 0x41c, 0x443, 0x443, 0x441, 0x20, 0x443,
-0x441, 0x442, 0x430, 0x440, 0x3b, 0x42b, 0x430, 0x43c, 0x20, 0x44b, 0x439, 0x44b, 0x43d, 0x3b, 0x411, 0x44d, 0x441, 0x20, 0x44b, 0x439,
-0x44b, 0x43d, 0x3b, 0x41e, 0x442, 0x20, 0x44b, 0x439, 0x44b, 0x43d, 0x3b, 0x410, 0x442, 0x44b, 0x440, 0x434, 0x44c, 0x44b, 0x445, 0x20,
-0x44b, 0x439, 0x44b, 0x43d, 0x3b, 0x411, 0x430, 0x43b, 0x430, 0x495, 0x430, 0x43d, 0x20, 0x44b, 0x439, 0x44b, 0x43d, 0x3b, 0x410, 0x43b,
-0x442, 0x44b, 0x43d, 0x43d, 0x44c, 0x44b, 0x3b, 0x421, 0x44d, 0x442, 0x438, 0x43d, 0x43d, 0x44c, 0x438, 0x3b, 0x430, 0x445, 0x441, 0x44b,
-0x43d, 0x43d, 0x44c, 0x44b, 0x3b, 0x4d, 0x75, 0x70, 0x3b, 0x4d, 0x77, 0x69, 0x3b, 0x4d, 0x73, 0x68, 0x3b, 0x4d, 0x75, 0x6e,
-0x3b, 0x4d, 0x61, 0x67, 0x3b, 0x4d, 0x75, 0x6a, 0x3b, 0x4d, 0x73, 0x70, 0x3b, 0x4d, 0x70, 0x67, 0x3b, 0x4d, 0x79, 0x65,
-0x3b, 0x4d, 0x6f, 0x6b, 0x3b, 0x4d, 0x75, 0x73, 0x3b, 0x4d, 0x75, 0x68, 0x3b, 0x4d, 0x75, 0x70, 0x61, 0x6c, 0x61, 0x6e,
-0x67, 0x75, 0x6c, 0x77, 0x61, 0x3b, 0x4d, 0x77, 0x69, 0x74, 0x6f, 0x70, 0x65, 0x3b, 0x4d, 0x75, 0x73, 0x68, 0x65, 0x6e,
-0x64, 0x65, 0x3b, 0x4d, 0x75, 0x6e, 0x79, 0x69, 0x3b, 0x4d, 0x75, 0x73, 0x68, 0x65, 0x6e, 0x64, 0x65, 0x20, 0x4d, 0x61,
-0x67, 0x61, 0x6c, 0x69, 0x3b, 0x4d, 0x75, 0x6a, 0x69, 0x6d, 0x62, 0x69, 0x3b, 0x4d, 0x75, 0x73, 0x68, 0x69, 0x70, 0x65,
-0x70, 0x6f, 0x3b, 0x4d, 0x75, 0x70, 0x75, 0x67, 0x75, 0x74, 0x6f, 0x3b, 0x4d, 0x75, 0x6e, 0x79, 0x65, 0x6e, 0x73, 0x65,
-0x3b, 0x4d, 0x6f, 0x6b, 0x68, 0x75, 0x3b, 0x4d, 0x75, 0x73, 0x6f, 0x6e, 0x67, 0x61, 0x6e, 0x64, 0x65, 0x6d, 0x62, 0x77,
-0x65, 0x3b, 0x4d, 0x75, 0x68, 0x61, 0x61, 0x6e, 0x6f, 0x3b, 0xa5a8, 0xa595, 0xa51e, 0x3b, 0xa552, 0xa561, 0x3b, 0xa57e, 0xa5ba, 0x3b,
-0xa5a2, 0xa595, 0x3b, 0xa591, 0xa571, 0x3b, 0xa5b1, 0xa60b, 0x3b, 0xa5b1, 0xa55e, 0x3b, 0xa5db, 0xa515, 0x3b, 0xa562, 0xa54c, 0x3b, 0xa56d, 0xa583,
-0x3b, 0xa51e, 0xa60b, 0x3b, 0xa5a8, 0xa595, 0xa5cf, 0x3b, 0xa5a8, 0xa595, 0x20, 0xa56a, 0xa574, 0x20, 0xa51e, 0xa500, 0xa56e, 0xa54a, 0x3b, 0xa552,
-0xa561, 0xa59d, 0xa595, 0x3b, 0xa57e, 0xa5ba, 0x3b, 0xa5a2, 0xa595, 0x3b, 0xa591, 0xa571, 0x3b, 0xa5b1, 0xa60b, 0x3b, 0xa5b1, 0xa55e, 0xa524, 0x3b,
-0xa5db, 0xa515, 0x3b, 0xa562, 0xa54c, 0x3b, 0xa56d, 0xa583, 0x3b, 0xa51e, 0xa60b, 0xa554, 0xa57f, 0x20, 0xa578, 0xa583, 0xa5cf, 0x3b, 0xa5a8, 0xa595,
-0x20, 0xa56a, 0xa574, 0x20, 0xa5cf, 0xa5ba, 0xa56e, 0xa54a, 0x3b, 0x6c, 0x75, 0x75, 0x6b, 0x61, 0x6f, 0x20, 0x6b, 0x65, 0x6d, 0xe3,
-0x3b, 0x253, 0x61, 0x6e, 0x64, 0x61, 0x253, 0x75, 0x3b, 0x76, 0x254, 0x254, 0x3b, 0x66, 0x75, 0x6c, 0x75, 0x3b, 0x67, 0x6f,
-0x6f, 0x3b, 0x36, 0x3b, 0x37, 0x3b, 0x6b, 0x254, 0x6e, 0x64, 0x65, 0x3b, 0x73, 0x61, 0x61, 0x68, 0x3b, 0x67, 0x61, 0x6c,
-0x6f, 0x3b, 0x6b, 0x65, 0x6e, 0x70, 0x6b, 0x61, 0x74, 0x6f, 0x20, 0x253, 0x6f, 0x6c, 0x6f, 0x6c, 0x254, 0x3b, 0x6c, 0x75,
-0x75, 0x6b, 0x61, 0x6f, 0x20, 0x6c, 0x254, 0x6d, 0x61, 0x3b, 0x4a, 0x65, 0x6e, 0x3b, 0x48, 0x6f, 0x72, 0x3b, 0x4d, 0xe4,
-0x72, 0x3b, 0x41, 0x62, 0x72, 0x3b, 0x4d, 0x65, 0x69, 0x3b, 0x42, 0x72, 0xe1, 0x3b, 0x48, 0x65, 0x69, 0x3b, 0xd6, 0x69,
-0x67, 0x3b, 0x48, 0x65, 0x72, 0x3b, 0x57, 0xed, 0x6d, 0x3b, 0x57, 0x69, 0x6e, 0x3b, 0x43, 0x68, 0x72, 0x3b, 0x4a, 0x65,
-0x6e, 0x6e, 0x65, 0x72, 0x3b, 0x48, 0x6f, 0x72, 0x6e, 0x69, 0x67, 0x3b, 0x4d, 0xe4, 0x72, 0x7a, 0x65, 0x3b, 0x41, 0x62,
-0x72, 0x69, 0x6c, 0x6c, 0x65, 0x3b, 0x4d, 0x65, 0x69, 0x6a, 0x65, 0x3b, 0x42, 0x72, 0xe1, 0x10d, 0x65, 0x74, 0x3b, 0x48,
-0x65, 0x69, 0x77, 0x65, 0x74, 0x3b, 0xd6, 0x69, 0x67, 0x161, 0x74, 0x65, 0x3b, 0x48, 0x65, 0x72, 0x62, 0x161, 0x74, 0x6d,
-0xe1, 0x6e, 0x65, 0x74, 0x3b, 0x57, 0xed, 0x6d, 0xe1, 0x6e, 0x65, 0x74, 0x3b, 0x57, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6d,
-0xe1, 0x6e, 0x65, 0x74, 0x3b, 0x43, 0x68, 0x72, 0x69, 0x161, 0x74, 0x6d, 0xe1, 0x6e, 0x65, 0x74, 0x3b, 0x4a, 0x3b, 0x48,
-0x3b, 0x4d, 0x3b, 0x41, 0x3b, 0x4d, 0x3b, 0x42, 0x3b, 0x48, 0x3b, 0xd6, 0x3b, 0x48, 0x3b, 0x57, 0x3b, 0x57, 0x3b, 0x43,
-0x3b, 0x6f, 0x2e, 0x31, 0x3b, 0x6f, 0x2e, 0x32, 0x3b, 0x6f, 0x2e, 0x33, 0x3b, 0x6f, 0x2e, 0x34, 0x3b, 0x6f, 0x2e, 0x35,
-0x3b, 0x6f, 0x2e, 0x36, 0x3b, 0x6f, 0x2e, 0x37, 0x3b, 0x6f, 0x2e, 0x38, 0x3b, 0x6f, 0x2e, 0x39, 0x3b, 0x6f, 0x2e, 0x31,
-0x30, 0x3b, 0x6f, 0x2e, 0x31, 0x31, 0x3b, 0x6f, 0x2e, 0x31, 0x32, 0x3b, 0x70, 0x69, 0x6b, 0xed, 0x74, 0xed, 0x6b, 0xed,
-0x74, 0x69, 0x65, 0x2c, 0x20, 0x6f, 0xf3, 0x6c, 0xed, 0x20, 0xfa, 0x20, 0x6b, 0x75, 0x74, 0xfa, 0x61, 0x6e, 0x3b, 0x73,
-0x69, 0x25b, 0x79, 0x25b, 0x301, 0x2c, 0x20, 0x6f, 0xf3, 0x6c, 0x69, 0x20, 0xfa, 0x20, 0x6b, 0xe1, 0x6e, 0x64, 0xed, 0x25b,
-0x3b, 0x254, 0x6e, 0x73, 0xfa, 0x6d, 0x62, 0x254, 0x6c, 0x2c, 0x20, 0x6f, 0xf3, 0x6c, 0x69, 0x20, 0xfa, 0x20, 0x6b, 0xe1,
-0x74, 0xe1, 0x74, 0xfa, 0x25b, 0x3b, 0x6d, 0x65, 0x73, 0x69, 0x14b, 0x2c, 0x20, 0x6f, 0xf3, 0x6c, 0x69, 0x20, 0xfa, 0x20,
-0x6b, 0xe9, 0x6e, 0x69, 0x65, 0x3b, 0x65, 0x6e, 0x73, 0x69, 0x6c, 0x2c, 0x20, 0x6f, 0xf3, 0x6c, 0x69, 0x20, 0xfa, 0x20,
-0x6b, 0xe1, 0x74, 0xe1, 0x6e, 0x75, 0x25b, 0x3b, 0x254, 0x73, 0x254, 0x6e, 0x3b, 0x65, 0x66, 0x75, 0x74, 0x65, 0x3b, 0x70,
-0x69, 0x73, 0x75, 0x79, 0xfa, 0x3b, 0x69, 0x6d, 0x25b, 0x14b, 0x20, 0x69, 0x20, 0x70, 0x75, 0x254, 0x73, 0x3b, 0x69, 0x6d,
-0x25b, 0x14b, 0x20, 0x69, 0x20, 0x70, 0x75, 0x74, 0xfa, 0x6b, 0x2c, 0x6f, 0xf3, 0x6c, 0x69, 0x20, 0xfa, 0x20, 0x6b, 0xe1,
-0x74, 0xed, 0x25b, 0x3b, 0x6d, 0x61, 0x6b, 0x61, 0x6e, 0x64, 0x69, 0x6b, 0x25b, 0x3b, 0x70, 0x69, 0x6c, 0x254, 0x6e, 0x64,
-0x254, 0x301, 0x3b, 0x58, 0x69, 0x6e, 0x3b, 0x46, 0x65, 0x62, 0x3b, 0x4d, 0x61, 0x72, 0x3b, 0x41, 0x62, 0x72, 0x3b, 0x4d,
-0x61, 0x79, 0x3b, 0x58, 0x75, 0x6e, 0x3b, 0x58, 0x6e, 0x74, 0x3b, 0x41, 0x67, 0x6f, 0x3b, 0x53, 0x65, 0x74, 0x3b, 0x4f,
-0x63, 0x68, 0x3b, 0x50, 0x61, 0x79, 0x3b, 0x41, 0x76, 0x69, 0x3b, 0x78, 0x69, 0x6e, 0x65, 0x72, 0x75, 0x3b, 0x66, 0x65,
-0x62, 0x72, 0x65, 0x72, 0x75, 0x3b, 0x6d, 0x61, 0x72, 0x7a, 0x75, 0x3b, 0x61, 0x62, 0x72, 0x69, 0x6c, 0x3b, 0x6d, 0x61,
-0x79, 0x75, 0x3b, 0x78, 0x75, 0x6e, 0x75, 0x3b, 0x78, 0x75, 0x6e, 0x65, 0x74, 0x75, 0x3b, 0x61, 0x67, 0x6f, 0x73, 0x74,
-0x75, 0x3b, 0x73, 0x65, 0x74, 0x69, 0x65, 0x6d, 0x62, 0x72, 0x65, 0x3b, 0x6f, 0x63, 0x68, 0x6f, 0x62, 0x72, 0x65, 0x3b,
-0x70, 0x61, 0x79, 0x61, 0x72, 0x65, 0x73, 0x3b, 0x61, 0x76, 0x69, 0x65, 0x6e, 0x74, 0x75, 0x3b, 0x58, 0x3b, 0x46, 0x3b,
-0x4d, 0x3b, 0x41, 0x3b, 0x4d, 0x3b, 0x58, 0x3b, 0x58, 0x3b, 0x41, 0x3b, 0x53, 0x3b, 0x4f, 0x3b, 0x50, 0x3b, 0x41, 0x3b,
-0x78, 0x69, 0x6e, 0x3b, 0x66, 0x65, 0x62, 0x3b, 0x6d, 0x61, 0x72, 0x3b, 0x61, 0x62, 0x72, 0x3b, 0x6d, 0x61, 0x79, 0x3b,
-0x78, 0x75, 0x6e, 0x3b, 0x78, 0x6e, 0x74, 0x3b, 0x61, 0x67, 0x6f, 0x3b, 0x73, 0x65, 0x74, 0x3b, 0x6f, 0x63, 0x68, 0x3b,
-0x70, 0x61, 0x79, 0x3b, 0x61, 0x76, 0x69, 0x3b, 0x64, 0x65, 0x20, 0x78, 0x69, 0x6e, 0x65, 0x72, 0x75, 0x3b, 0x64, 0x65,
-0x20, 0x66, 0x65, 0x62, 0x72, 0x65, 0x72, 0x75, 0x3b, 0x64, 0x65, 0x20, 0x6d, 0x61, 0x72, 0x7a, 0x75, 0x3b, 0x64, 0x2019,
-0x61, 0x62, 0x72, 0x69, 0x6c, 0x3b, 0x64, 0x65, 0x20, 0x6d, 0x61, 0x79, 0x75, 0x3b, 0x64, 0x65, 0x20, 0x78, 0x75, 0x6e,
-0x75, 0x3b, 0x64, 0x65, 0x20, 0x78, 0x75, 0x6e, 0x65, 0x74, 0x75, 0x3b, 0x64, 0x2019, 0x61, 0x67, 0x6f, 0x73, 0x74, 0x75,
-0x3b, 0x64, 0x65, 0x20, 0x73, 0x65, 0x74, 0x69, 0x65, 0x6d, 0x62, 0x72, 0x65, 0x3b, 0x64, 0x2019, 0x6f, 0x63, 0x68, 0x6f,
-0x62, 0x72, 0x65, 0x3b, 0x64, 0x65, 0x20, 0x70, 0x61, 0x79, 0x61, 0x72, 0x65, 0x73, 0x3b, 0x64, 0x2019, 0x61, 0x76, 0x69,
-0x65, 0x6e, 0x74, 0x75, 0x3b, 0x4e, 0x64, 0x75, 0x14b, 0x6d, 0x62, 0x69, 0x20, 0x53, 0x61, 0x14b, 0x3b, 0x50, 0x25b, 0x73,
-0x61, 0x14b, 0x20, 0x50, 0x25b, 0x301, 0x70, 0xe1, 0x3b, 0x50, 0x25b, 0x73, 0x61, 0x14b, 0x20, 0x50, 0x25b, 0x301, 0x74, 0xe1,
-0x74, 0x3b, 0x50, 0x25b, 0x73, 0x61, 0x14b, 0x20, 0x50, 0x25b, 0x301, 0x6e, 0x25b, 0x301, 0x6b, 0x77, 0x61, 0x3b, 0x50, 0x25b,
-0x73, 0x61, 0x14b, 0x20, 0x50, 0x61, 0x74, 0x61, 0x61, 0x3b, 0x50, 0x25b, 0x73, 0x61, 0x14b, 0x20, 0x50, 0x25b, 0x301, 0x6e,
-0x25b, 0x301, 0x6e, 0x74, 0xfa, 0x6b, 0xfa, 0x3b, 0x50, 0x25b, 0x73, 0x61, 0x14b, 0x20, 0x53, 0x61, 0x61, 0x6d, 0x62, 0xe1,
-0x3b, 0x50, 0x25b, 0x73, 0x61, 0x14b, 0x20, 0x50, 0x25b, 0x301, 0x6e, 0x25b, 0x301, 0x66, 0x254, 0x6d, 0x3b, 0x50, 0x25b, 0x73,
-0x61, 0x14b, 0x20, 0x50, 0x25b, 0x301, 0x6e, 0x25b, 0x301, 0x70, 0x66, 0xfa, 0xa78b, 0xfa, 0x3b, 0x50, 0x25b, 0x73, 0x61, 0x14b,
-0x20, 0x4e, 0x25b, 0x67, 0x25b, 0x301, 0x6d, 0x3b, 0x50, 0x25b, 0x73, 0x61, 0x14b, 0x20, 0x4e, 0x74, 0x73, 0x254, 0x30c, 0x70,
-0x6d, 0x254, 0x301, 0x3b, 0x50, 0x25b, 0x73, 0x61, 0x14b, 0x20, 0x4e, 0x74, 0x73, 0x254, 0x30c, 0x70, 0x70, 0xe1, 0x3b, 0x70,
-0x61, 0x6d, 0x62, 0x61, 0x3b, 0x77, 0x61, 0x6e, 0x6a, 0x61, 0x3b, 0x6d, 0x62, 0x69, 0x79, 0x254, 0x20, 0x6d, 0x25b, 0x6e,
-0x64, 0x6f, 0x14b, 0x67, 0x254, 0x3b, 0x4e, 0x79, 0x254, 0x6c, 0x254, 0x6d, 0x62, 0x254, 0x14b, 0x67, 0x254, 0x3b, 0x4d, 0x254,
-0x6e, 0x254, 0x20, 0x14b, 0x67, 0x62, 0x61, 0x6e, 0x6a, 0x61, 0x3b, 0x4e, 0x79, 0x61, 0x14b, 0x67, 0x77, 0x25b, 0x20, 0x14b,
-0x67, 0x62, 0x61, 0x6e, 0x6a, 0x61, 0x3b, 0x6b, 0x75, 0x14b, 0x67, 0x77, 0x25b, 0x3b, 0x66, 0x25b, 0x3b, 0x6e, 0x6a, 0x61,
-0x70, 0x69, 0x3b, 0x6e, 0x79, 0x75, 0x6b, 0x75, 0x6c, 0x3b, 0x31, 0x31, 0x3b, 0x253, 0x75, 0x6c, 0x253, 0x75, 0x73, 0x25b,
-0x3b, 0x6d, 0x62, 0x65, 0x67, 0x74, 0x75, 0x67, 0x3b, 0x69, 0x6d, 0x65, 0x67, 0x20, 0xe0, 0x62, 0xf9, 0x62, 0xec, 0x3b,
-0x69, 0x6d, 0x65, 0x67, 0x20, 0x6d, 0x62, 0x259, 0x14b, 0x63, 0x68, 0x75, 0x62, 0x69, 0x3b, 0x69, 0x6d, 0x259, 0x67, 0x20,
-0x6e, 0x67, 0x77, 0x259, 0x300, 0x74, 0x3b, 0x69, 0x6d, 0x259, 0x67, 0x20, 0x66, 0x6f, 0x67, 0x3b, 0x69, 0x6d, 0x259, 0x67,
-0x20, 0x69, 0x63, 0x68, 0x69, 0x69, 0x62, 0x254, 0x64, 0x3b, 0x69, 0x6d, 0x259, 0x67, 0x20, 0xe0, 0x64, 0xf9, 0x6d, 0x62,
-0x259, 0x300, 0x14b, 0x3b, 0x69, 0x6d, 0x259, 0x67, 0x20, 0x69, 0x63, 0x68, 0x69, 0x6b, 0x61, 0x3b, 0x69, 0x6d, 0x259, 0x67,
-0x20, 0x6b, 0x75, 0x64, 0x3b, 0x69, 0x6d, 0x259, 0x67, 0x20, 0x74, 0xe8, 0x73, 0x69, 0x2bc, 0x65, 0x3b, 0x69, 0x6d, 0x259,
-0x67, 0x20, 0x7a, 0xf2, 0x3b, 0x69, 0x6d, 0x259, 0x67, 0x20, 0x6b, 0x72, 0x69, 0x7a, 0x6d, 0x65, 0x64, 0x3b, 0x69, 0x6d,
-0x259, 0x67, 0x20, 0x6d, 0x62, 0x65, 0x67, 0x74, 0x75, 0x67, 0x3b, 0x69, 0x6d, 0x65, 0x67, 0x20, 0xe0, 0x62, 0xf9, 0x62,
-0xec, 0x3b, 0x69, 0x6d, 0x65, 0x67, 0x20, 0x6d, 0x62, 0x259, 0x14b, 0x63, 0x68, 0x75, 0x62, 0x69, 0x3b, 0x69, 0x6d, 0x259,
-0x67, 0x20, 0x6e, 0x67, 0x77, 0x259, 0x300, 0x74, 0x3b, 0x69, 0x6d, 0x259, 0x67, 0x20, 0x66, 0x6f, 0x67, 0x3b, 0x69, 0x6d,
-0x259, 0x67, 0x20, 0x69, 0x63, 0x68, 0x69, 0x69, 0x62, 0x254, 0x64, 0x3b, 0x69, 0x6d, 0x259, 0x67, 0x20, 0xe0, 0x64, 0xf9,
-0x6d, 0x62, 0x259, 0x300, 0x14b, 0x3b, 0x69, 0x6d, 0x259, 0x67, 0x20, 0x69, 0x63, 0x68, 0x69, 0x6b, 0x61, 0x3b, 0x69, 0x6d,
-0x259, 0x67, 0x20, 0x6b, 0x75, 0x64, 0x3b, 0x69, 0x6d, 0x259, 0x67, 0x20, 0x74, 0xe8, 0x73, 0x69, 0x2bc, 0x65, 0x3b, 0x69,
-0x6d, 0x259, 0x67, 0x20, 0x7a, 0xf2, 0x3b, 0x69, 0x6d, 0x259, 0x67, 0x20, 0x6b, 0x72, 0x69, 0x7a, 0x6d, 0x65, 0x64, 0x3b,
-0x4d, 0x31, 0x3b, 0x41, 0x32, 0x3b, 0x4d, 0x33, 0x3b, 0x4e, 0x34, 0x3b, 0x46, 0x35, 0x3b, 0x49, 0x36, 0x3b, 0x41, 0x37,
-0x3b, 0x49, 0x38, 0x3b, 0x4b, 0x39, 0x3b, 0x31, 0x30, 0x3b, 0x31, 0x31, 0x3b, 0x31, 0x32, 0x3b, 0x73, 0x61, 0x14b, 0x20,
-0x74, 0x73, 0x65, 0x74, 0x73, 0x25b, 0x300, 0x25b, 0x20, 0x6c, 0xf9, 0x6d, 0x3b, 0x73, 0x61, 0x14b, 0x20, 0x6b, 0xe0, 0x67,
-0x20, 0x6e, 0x67, 0x77, 0xf3, 0x14b, 0x3b, 0x73, 0x61, 0x14b, 0x20, 0x6c, 0x65, 0x70, 0x79, 0xe8, 0x20, 0x73, 0x68, 0xfa,
-0x6d, 0x3b, 0x73, 0x61, 0x14b, 0x20, 0x63, 0xff, 0xf3, 0x3b, 0x73, 0x61, 0x14b, 0x20, 0x74, 0x73, 0x25b, 0x300, 0x25b, 0x20,
-0x63, 0xff, 0xf3, 0x3b, 0x73, 0x61, 0x14b, 0x20, 0x6e, 0x6a, 0xff, 0x6f, 0x6c, 0xe1, 0x2bc, 0x3b, 0x73, 0x61, 0x14b, 0x20,
-0x74, 0x79, 0x25b, 0x300, 0x62, 0x20, 0x74, 0x79, 0x25b, 0x300, 0x62, 0x20, 0x6d, 0x62, 0x289, 0x300, 0x14b, 0x3b, 0x73, 0x61,
-0x14b, 0x20, 0x6d, 0x62, 0x289, 0x300, 0x14b, 0x3b, 0x73, 0x61, 0x14b, 0x20, 0x6e, 0x67, 0x77, 0x254, 0x300, 0x2bc, 0x20, 0x6d,
-0x62, 0xff, 0x25b, 0x3b, 0x73, 0x61, 0x14b, 0x20, 0x74, 0xe0, 0x14b, 0x61, 0x20, 0x74, 0x73, 0x65, 0x74, 0x73, 0xe1, 0x2bc,
-0x3b, 0x73, 0x61, 0x14b, 0x20, 0x6d, 0x65, 0x6a, 0x77, 0x6f, 0x14b, 0xf3, 0x3b, 0x73, 0x61, 0x14b, 0x20, 0x6c, 0xf9, 0x6d,
-0x3b, 0x57, 0x69, 0xf3, 0x74, 0x68, 0x65, 0x21f, 0x69, 0x6b, 0x61, 0x20, 0x57, 0xed, 0x3b, 0x54, 0x68, 0x69, 0x79, 0xf3,
-0x21f, 0x65, 0x79, 0x75, 0x14b, 0x6b, 0x61, 0x20, 0x57, 0xed, 0x3b, 0x49, 0x161, 0x74, 0xe1, 0x77, 0x69, 0x10d, 0x68, 0x61,
-0x79, 0x61, 0x7a, 0x61, 0x14b, 0x20, 0x57, 0xed, 0x3b, 0x50, 0x21f, 0x65, 0x17e, 0xed, 0x74, 0x21f, 0x6f, 0x20, 0x57, 0xed,
-0x3b, 0x10c, 0x68, 0x61, 0x14b, 0x77, 0xe1, 0x70, 0x65, 0x74, 0x21f, 0x6f, 0x20, 0x57, 0xed, 0x3b, 0x57, 0xed, 0x70, 0x61,
-0x7a, 0x75, 0x6b, 0x21f, 0x61, 0x2d, 0x77, 0x61, 0x161, 0x74, 0xe9, 0x20, 0x57, 0xed, 0x3b, 0x10c, 0x68, 0x61, 0x14b, 0x70,
-0x21f, 0xe1, 0x73, 0x61, 0x70, 0x61, 0x20, 0x57, 0xed, 0x3b, 0x57, 0x61, 0x73, 0xfa, 0x74, 0x21f, 0x75, 0x14b, 0x20, 0x57,
-0xed, 0x3b, 0x10c, 0x68, 0x61, 0x14b, 0x77, 0xe1, 0x70, 0x65, 0x1e7, 0x69, 0x20, 0x57, 0xed, 0x3b, 0x10c, 0x68, 0x61, 0x14b,
-0x77, 0xe1, 0x70, 0x65, 0x2d, 0x6b, 0x61, 0x73, 0x6e, 0xe1, 0x20, 0x57, 0xed, 0x3b, 0x57, 0x61, 0x6e, 0xed, 0x79, 0x65,
-0x74, 0x75, 0x20, 0x57, 0xed, 0x3b, 0x54, 0x21f, 0x61, 0x68, 0xe9, 0x6b, 0x61, 0x70, 0x161, 0x75, 0x14b, 0x20, 0x57, 0xed,
-0x3b, 0x6a9, 0x627, 0x646, 0x648, 0x648, 0x646, 0x6cc, 0x20, 0x62f, 0x648, 0x648, 0x6d5, 0x645, 0x3b, 0x634, 0x648, 0x628, 0x627, 0x62a,
-0x3b, 0x626, 0x627, 0x632, 0x627, 0x631, 0x3b, 0x646, 0x6cc, 0x633, 0x627, 0x646, 0x3b, 0x626, 0x627, 0x6cc, 0x627, 0x631, 0x3b, 0x62d,
-0x648, 0x632, 0x6d5, 0x6cc, 0x631, 0x627, 0x646, 0x3b, 0x62a, 0x6d5, 0x645, 0x648, 0x648, 0x632, 0x3b, 0x626, 0x627, 0x628, 0x3b, 0x626,
-0x6d5, 0x6cc, 0x644, 0x648, 0x648, 0x644, 0x3b, 0x62a, 0x634, 0x631, 0x6cc, 0x646, 0x6cc, 0x20, 0x6cc, 0x6d5, 0x6a9, 0x6d5, 0x645, 0x3b,
-0x62a, 0x634, 0x631, 0x6cc, 0x646, 0x6cc, 0x20, 0x62f, 0x648, 0x648, 0x6d5, 0x645, 0x3b, 0x6a9, 0x627, 0x646, 0x648, 0x646, 0x6cc, 0x20,
-0x6cc, 0x6d5, 0x6a9, 0x6d5, 0x645, 0x3b, 0x6a9, 0x3b, 0x634, 0x3b, 0x626, 0x3b, 0x646, 0x3b, 0x626, 0x3b, 0x62d, 0x3b, 0x62a, 0x3b,
-0x626, 0x3b, 0x626, 0x3b, 0x62a, 0x3b, 0x62a, 0x3b, 0x6a9, 0x3b, 0x6a, 0x61, 0x6e, 0x3b, 0x66, 0x65, 0x62, 0x3b, 0x6d, 0x11b,
-0x72, 0x3b, 0x61, 0x70, 0x72, 0x3b, 0x6d, 0x61, 0x6a, 0x3b, 0x6a, 0x75, 0x6e, 0x3b, 0x6a, 0x75, 0x6c, 0x3b, 0x61, 0x77,
-0x67, 0x3b, 0x73, 0x65, 0x70, 0x3b, 0x6f, 0x6b, 0x74, 0x3b, 0x6e, 0x6f, 0x77, 0x3b, 0x64, 0x65, 0x63, 0x3b, 0x6a, 0x61,
-0x6e, 0x75, 0x61, 0x72, 0x3b, 0x66, 0x65, 0x62, 0x72, 0x75, 0x61, 0x72, 0x3b, 0x6d, 0x11b, 0x72, 0x63, 0x3b, 0x61, 0x70,
-0x72, 0x79, 0x6c, 0x3b, 0x6d, 0x61, 0x6a, 0x3b, 0x6a, 0x75, 0x6e, 0x69, 0x6a, 0x3b, 0x6a, 0x75, 0x6c, 0x69, 0x6a, 0x3b,
-0x61, 0x77, 0x67, 0x75, 0x73, 0x74, 0x3b, 0x73, 0x65, 0x70, 0x74, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x3b, 0x6f, 0x6b, 0x74,
-0x6f, 0x62, 0x65, 0x72, 0x3b, 0x6e, 0x6f, 0x77, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x3b, 0x64, 0x65, 0x63, 0x65, 0x6d, 0x62,
-0x65, 0x72, 0x3b, 0x6a, 0x61, 0x6e, 0x2e, 0x3b, 0x66, 0x65, 0x62, 0x2e, 0x3b, 0x6d, 0x11b, 0x72, 0x2e, 0x3b, 0x61, 0x70,
-0x72, 0x2e, 0x3b, 0x6d, 0x61, 0x6a, 0x2e, 0x3b, 0x6a, 0x75, 0x6e, 0x2e, 0x3b, 0x6a, 0x75, 0x6c, 0x2e, 0x3b, 0x61, 0x77,
-0x67, 0x2e, 0x3b, 0x73, 0x65, 0x70, 0x2e, 0x3b, 0x6f, 0x6b, 0x74, 0x2e, 0x3b, 0x6e, 0x6f, 0x77, 0x2e, 0x3b, 0x64, 0x65,
-0x63, 0x2e, 0x3b, 0x6a, 0x61, 0x6e, 0x75, 0x61, 0x72, 0x61, 0x3b, 0x66, 0x65, 0x62, 0x72, 0x75, 0x61, 0x72, 0x61, 0x3b,
-0x6d, 0x11b, 0x72, 0x63, 0x61, 0x3b, 0x61, 0x70, 0x72, 0x79, 0x6c, 0x61, 0x3b, 0x6d, 0x61, 0x6a, 0x61, 0x3b, 0x6a, 0x75,
-0x6e, 0x69, 0x6a, 0x61, 0x3b, 0x6a, 0x75, 0x6c, 0x69, 0x6a, 0x61, 0x3b, 0x61, 0x77, 0x67, 0x75, 0x73, 0x74, 0x61, 0x3b,
-0x73, 0x65, 0x70, 0x74, 0x65, 0x6d, 0x62, 0x72, 0x61, 0x3b, 0x6f, 0x6b, 0x74, 0x6f, 0x62, 0x72, 0x61, 0x3b, 0x6e, 0x6f,
-0x77, 0x65, 0x6d, 0x62, 0x72, 0x61, 0x3b, 0x64, 0x65, 0x63, 0x65, 0x6d, 0x62, 0x72, 0x61, 0x3b, 0x6a, 0x61, 0x6e, 0x3b,
-0x66, 0x65, 0x62, 0x3b, 0x6d, 0x11b, 0x72, 0x3b, 0x61, 0x70, 0x72, 0x3b, 0x6d, 0x65, 0x6a, 0x3b, 0x6a, 0x75, 0x6e, 0x3b,
-0x6a, 0x75, 0x6c, 0x3b, 0x61, 0x77, 0x67, 0x3b, 0x73, 0x65, 0x70, 0x3b, 0x6f, 0x6b, 0x74, 0x3b, 0x6e, 0x6f, 0x77, 0x3b,
-0x64, 0x65, 0x63, 0x3b, 0x6a, 0x61, 0x6e, 0x75, 0x61, 0x72, 0x3b, 0x66, 0x65, 0x62, 0x72, 0x75, 0x61, 0x72, 0x3b, 0x6d,
-0x11b, 0x72, 0x63, 0x3b, 0x61, 0x70, 0x72, 0x79, 0x6c, 0x3b, 0x6d, 0x65, 0x6a, 0x61, 0x3b, 0x6a, 0x75, 0x6e, 0x69, 0x6a,
-0x3b, 0x6a, 0x75, 0x6c, 0x69, 0x6a, 0x3b, 0x61, 0x77, 0x67, 0x75, 0x73, 0x74, 0x3b, 0x73, 0x65, 0x70, 0x74, 0x65, 0x6d,
-0x62, 0x65, 0x72, 0x3b, 0x6f, 0x6b, 0x74, 0x6f, 0x62, 0x65, 0x72, 0x3b, 0x6e, 0x6f, 0x77, 0x65, 0x6d, 0x62, 0x65, 0x72,
-0x3b, 0x64, 0x65, 0x63, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x3b, 0x6a, 0x61, 0x6e, 0x2e, 0x3b, 0x66, 0x65, 0x62, 0x2e, 0x3b,
-0x6d, 0x11b, 0x72, 0x2e, 0x3b, 0x61, 0x70, 0x72, 0x2e, 0x3b, 0x6d, 0x65, 0x6a, 0x2e, 0x3b, 0x6a, 0x75, 0x6e, 0x2e, 0x3b,
-0x6a, 0x75, 0x6c, 0x2e, 0x3b, 0x61, 0x77, 0x67, 0x2e, 0x3b, 0x73, 0x65, 0x70, 0x2e, 0x3b, 0x6f, 0x6b, 0x74, 0x2e, 0x3b,
-0x6e, 0x6f, 0x77, 0x2e, 0x3b, 0x64, 0x65, 0x63, 0x2e, 0x3b, 0x6a, 0x61, 0x6e, 0x75, 0x61, 0x72, 0x61, 0x3b, 0x66, 0x65,
-0x62, 0x72, 0x75, 0x61, 0x72, 0x61, 0x3b, 0x6d, 0x11b, 0x72, 0x63, 0x61, 0x3b, 0x61, 0x70, 0x72, 0x79, 0x6c, 0x61, 0x3b,
-0x6d, 0x65, 0x6a, 0x65, 0x3b, 0x6a, 0x75, 0x6e, 0x69, 0x6a, 0x61, 0x3b, 0x6a, 0x75, 0x6c, 0x69, 0x6a, 0x61, 0x3b, 0x61,
-0x77, 0x67, 0x75, 0x73, 0x74, 0x61, 0x3b, 0x73, 0x65, 0x70, 0x74, 0x65, 0x6d, 0x62, 0x72, 0x61, 0x3b, 0x6f, 0x6b, 0x74,
-0x6f, 0x62, 0x72, 0x61, 0x3b, 0x6e, 0x6f, 0x77, 0x65, 0x6d, 0x62, 0x72, 0x61, 0x3b, 0x64, 0x65, 0x63, 0x65, 0x6d, 0x62,
-0x72, 0x61, 0x3b, 0x72, 0x61, 0x67, 0x3b, 0x77, 0x61, 0x73, 0x3b, 0x70, 0x16b, 0x6c, 0x3b, 0x73, 0x61, 0x6b, 0x3b, 0x7a,
-0x61, 0x6c, 0x3b, 0x73, 0x12b, 0x6d, 0x3b, 0x6c, 0x12b, 0x70, 0x3b, 0x64, 0x61, 0x67, 0x3b, 0x73, 0x69, 0x6c, 0x3b, 0x73,
-0x70, 0x61, 0x3b, 0x6c, 0x61, 0x70, 0x3b, 0x73, 0x61, 0x6c, 0x3b, 0x72, 0x61, 0x67, 0x73, 0x3b, 0x77, 0x61, 0x73, 0x73,
-0x61, 0x72, 0x69, 0x6e, 0x73, 0x3b, 0x70, 0x16b, 0x6c, 0x69, 0x73, 0x3b, 0x73, 0x61, 0x6b, 0x6b, 0x69, 0x73, 0x3b, 0x7a,
-0x61, 0x6c, 0x6c, 0x61, 0x77, 0x73, 0x3b, 0x73, 0x12b, 0x6d, 0x65, 0x6e, 0x69, 0x73, 0x3b, 0x6c, 0x12b, 0x70, 0x61, 0x3b,
-0x64, 0x61, 0x67, 0x67, 0x69, 0x73, 0x3b, 0x73, 0x69, 0x6c, 0x6c, 0x69, 0x6e, 0x73, 0x3b, 0x73, 0x70, 0x61, 0x6c, 0x6c,
-0x69, 0x6e, 0x73, 0x3b, 0x6c, 0x61, 0x70, 0x6b, 0x72, 0x16b, 0x74, 0x69, 0x73, 0x3b, 0x73, 0x61, 0x6c, 0x6c, 0x61, 0x77,
-0x73, 0x3b, 0x52, 0x3b, 0x57, 0x3b, 0x50, 0x3b, 0x53, 0x3b, 0x5a, 0x3b, 0x53, 0x3b, 0x4c, 0x3b, 0x44, 0x3b, 0x53, 0x3b,
-0x53, 0x3b, 0x4c, 0x3b, 0x53, 0x3b, 0x75, 0x111, 0x69, 0x76, 0x3b, 0x6b, 0x75, 0x6f, 0x76, 0xe2, 0x3b, 0x6e, 0x6a, 0x75,
-0x68, 0x10d, 0xe2, 0x3b, 0x63, 0x75, 0xe1, 0x14b, 0x75, 0x69, 0x3b, 0x76, 0x79, 0x65, 0x73, 0x69, 0x3b, 0x6b, 0x65, 0x73,
-0x69, 0x3b, 0x73, 0x79, 0x65, 0x69, 0x6e, 0x69, 0x3b, 0x70, 0x6f, 0x72, 0x67, 0x65, 0x3b, 0x10d, 0x6f, 0x68, 0x10d, 0xe2,
-0x3b, 0x72, 0x6f, 0x6f, 0x76, 0x76, 0xe2, 0x64, 0x3b, 0x73, 0x6b, 0x61, 0x6d, 0x6d, 0xe2, 0x3b, 0x6a, 0x75, 0x6f, 0x76,
-0x6c, 0xe2, 0x3b, 0x75, 0x111, 0x111, 0xe2, 0x69, 0x76, 0x65, 0x6d, 0xe1, 0xe1, 0x6e, 0x75, 0x3b, 0x6b, 0x75, 0x6f, 0x76,
-0xe2, 0x6d, 0xe1, 0xe1, 0x6e, 0x75, 0x3b, 0x6e, 0x6a, 0x75, 0x68, 0x10d, 0xe2, 0x6d, 0xe1, 0xe1, 0x6e, 0x75, 0x3b, 0x63,
-0x75, 0xe1, 0x14b, 0x75, 0x69, 0x6d, 0xe1, 0xe1, 0x6e, 0x75, 0x3b, 0x76, 0x79, 0x65, 0x73, 0x69, 0x6d, 0xe1, 0xe1, 0x6e,
-0x75, 0x3b, 0x6b, 0x65, 0x73, 0x69, 0x6d, 0xe1, 0xe1, 0x6e, 0x75, 0x3b, 0x73, 0x79, 0x65, 0x69, 0x6e, 0x69, 0x6d, 0xe1,
-0xe1, 0x6e, 0x75, 0x3b, 0x70, 0x6f, 0x72, 0x67, 0x65, 0x6d, 0xe1, 0xe1, 0x6e, 0x75, 0x3b, 0x10d, 0x6f, 0x68, 0x10d, 0xe2,
-0x6d, 0xe1, 0xe1, 0x6e, 0x75, 0x3b, 0x72, 0x6f, 0x6f, 0x76, 0x76, 0xe2, 0x64, 0x6d, 0xe1, 0xe1, 0x6e, 0x75, 0x3b, 0x73,
-0x6b, 0x61, 0x6d, 0x6d, 0xe2, 0x6d, 0xe1, 0xe1, 0x6e, 0x75, 0x3b, 0x6a, 0x75, 0x6f, 0x76, 0x6c, 0xe2, 0x6d, 0xe1, 0xe1,
-0x6e, 0x75, 0x3b, 0x55, 0x3b, 0x4b, 0x3b, 0x4e, 0x4a, 0x3b, 0x43, 0x3b, 0x56, 0x3b, 0x4b, 0x3b, 0x53, 0x3b, 0x50, 0x3b,
-0x10c, 0x3b, 0x52, 0x3b, 0x53, 0x3b, 0x4a, 0x3b, 0x62c, 0x627, 0x646, 0x6a4, 0x6cc, 0x6d5, 0x3b, 0x641, 0x626, 0x6a4, 0x631, 0x6cc,
-0x6d5, 0x3b, 0x645, 0x627, 0x631, 0x633, 0x3b, 0x622, 0x6a4, 0x631, 0x6cc, 0x644, 0x3b, 0x645, 0x626, 0x6cc, 0x3b, 0x62c, 0x648, 0x659,
-0x623, 0x646, 0x3b, 0x62c, 0x648, 0x659, 0x644, 0x627, 0x3b, 0x622, 0x6af, 0x648, 0x633, 0x62a, 0x3b, 0x633, 0x626, 0x67e, 0x62a, 0x627,
-0x645, 0x631, 0x3b, 0x626, 0x648, 0x6a9, 0x62a, 0x648, 0x6a4, 0x631, 0x3b, 0x646, 0x648, 0x6a4, 0x627, 0x645, 0x631, 0x3b, 0x62f, 0x626,
-0x633, 0x627, 0x645, 0x631, 0x3b
-};
-
-static const ushort days_data[] = {
-0x53, 0x75, 0x6e, 0x3b, 0x4d, 0x6f, 0x6e, 0x3b, 0x54, 0x75, 0x65, 0x3b, 0x57, 0x65, 0x64, 0x3b, 0x54, 0x68, 0x75, 0x3b,
-0x46, 0x72, 0x69, 0x3b, 0x53, 0x61, 0x74, 0x3b, 0x53, 0x75, 0x6e, 0x64, 0x61, 0x79, 0x3b, 0x4d, 0x6f, 0x6e, 0x64, 0x61,
-0x79, 0x3b, 0x54, 0x75, 0x65, 0x73, 0x64, 0x61, 0x79, 0x3b, 0x57, 0x65, 0x64, 0x6e, 0x65, 0x73, 0x64, 0x61, 0x79, 0x3b,
-0x54, 0x68, 0x75, 0x72, 0x73, 0x64, 0x61, 0x79, 0x3b, 0x46, 0x72, 0x69, 0x64, 0x61, 0x79, 0x3b, 0x53, 0x61, 0x74, 0x75,
-0x72, 0x64, 0x61, 0x79, 0x3b, 0x53, 0x3b, 0x4d, 0x3b, 0x54, 0x3b, 0x57, 0x3b, 0x54, 0x3b, 0x46, 0x3b, 0x53, 0x3b, 0x37,
-0x3b, 0x31, 0x3b, 0x32, 0x3b, 0x33, 0x3b, 0x34, 0x3b, 0x35, 0x3b, 0x36, 0x3b, 0x44, 0x69, 0x6c, 0x3b, 0x57, 0x69, 0x78,
-0x3b, 0x51, 0x69, 0x62, 0x3b, 0x52, 0x6f, 0x62, 0x3b, 0x4b, 0x61, 0x6d, 0x3b, 0x4a, 0x69, 0x6d, 0x3b, 0x53, 0x61, 0x6e,
-0x3b, 0x44, 0x69, 0x6c, 0x62, 0x61, 0x74, 0x61, 0x3b, 0x57, 0x69, 0x69, 0x78, 0x61, 0x74, 0x61, 0x3b, 0x51, 0x69, 0x62,
-0x78, 0x61, 0x74, 0x61, 0x3b, 0x52, 0x6f, 0x6f, 0x62, 0x69, 0x69, 0x3b, 0x4b, 0x61, 0x6d, 0x69, 0x69, 0x73, 0x61, 0x3b,
-0x4a, 0x69, 0x6d, 0x61, 0x61, 0x74, 0x61, 0x3b, 0x53, 0x61, 0x6e, 0x62, 0x61, 0x74, 0x61, 0x3b, 0x44, 0x3b, 0x57, 0x3b,
-0x51, 0x3b, 0x52, 0x3b, 0x4b, 0x3b, 0x4a, 0x3b, 0x53, 0x3b, 0x53, 0x6f, 0x2e, 0x3b, 0x4d, 0x61, 0x2e, 0x3b, 0x44, 0x69,
-0x2e, 0x3b, 0x57, 0x6f, 0x2e, 0x3b, 0x44, 0x6f, 0x2e, 0x3b, 0x56, 0x72, 0x2e, 0x3b, 0x53, 0x61, 0x2e, 0x3b, 0x53, 0x6f,
-0x6e, 0x64, 0x61, 0x67, 0x3b, 0x4d, 0x61, 0x61, 0x6e, 0x64, 0x61, 0x67, 0x3b, 0x44, 0x69, 0x6e, 0x73, 0x64, 0x61, 0x67,
-0x3b, 0x57, 0x6f, 0x65, 0x6e, 0x73, 0x64, 0x61, 0x67, 0x3b, 0x44, 0x6f, 0x6e, 0x64, 0x65, 0x72, 0x64, 0x61, 0x67, 0x3b,
-0x56, 0x72, 0x79, 0x64, 0x61, 0x67, 0x3b, 0x53, 0x61, 0x74, 0x65, 0x72, 0x64, 0x61, 0x67, 0x3b, 0x53, 0x3b, 0x4d, 0x3b,
-0x44, 0x3b, 0x57, 0x3b, 0x44, 0x3b, 0x56, 0x3b, 0x53, 0x3b, 0x64, 0x69, 0x65, 0x3b, 0x68, 0xeb, 0x6e, 0x3b, 0x6d, 0x61,
-0x72, 0x3b, 0x6d, 0xeb, 0x72, 0x3b, 0x65, 0x6e, 0x6a, 0x3b, 0x70, 0x72, 0x65, 0x3b, 0x73, 0x68, 0x74, 0x3b, 0x65, 0x20,
-0x64, 0x69, 0x65, 0x6c, 0x3b, 0x65, 0x20, 0x68, 0xeb, 0x6e, 0xeb, 0x3b, 0x65, 0x20, 0x6d, 0x61, 0x72, 0x74, 0xeb, 0x3b,
-0x65, 0x20, 0x6d, 0xeb, 0x72, 0x6b, 0x75, 0x72, 0xeb, 0x3b, 0x65, 0x20, 0x65, 0x6e, 0x6a, 0x74, 0x65, 0x3b, 0x65, 0x20,
-0x70, 0x72, 0x65, 0x6d, 0x74, 0x65, 0x3b, 0x65, 0x20, 0x73, 0x68, 0x74, 0x75, 0x6e, 0xeb, 0x3b, 0x64, 0x3b, 0x68, 0x3b,
-0x6d, 0x3b, 0x6d, 0x3b, 0x65, 0x3b, 0x70, 0x3b, 0x73, 0x68, 0x3b, 0x44, 0x69, 0x65, 0x3b, 0x48, 0xeb, 0x6e, 0x3b, 0x4d,
-0x61, 0x72, 0x3b, 0x4d, 0xeb, 0x72, 0x3b, 0x45, 0x6e, 0x6a, 0x3b, 0x50, 0x72, 0x65, 0x3b, 0x53, 0x68, 0x74, 0x3b, 0x12a5,
-0x1211, 0x12f5, 0x3b, 0x1230, 0x129e, 0x3b, 0x121b, 0x12ad, 0x1230, 0x3b, 0x1228, 0x1261, 0x12d5, 0x3b, 0x1210, 0x1219, 0x1235, 0x3b, 0x12d3, 0x122d,
-0x1265, 0x3b, 0x1245, 0x12f3, 0x121c, 0x3b, 0x12a5, 0x1211, 0x12f5, 0x3b, 0x1230, 0x129e, 0x3b, 0x121b, 0x12ad, 0x1230, 0x129e, 0x3b, 0x1228, 0x1261,
-0x12d5, 0x3b, 0x1210, 0x1219, 0x1235, 0x3b, 0x12d3, 0x122d, 0x1265, 0x3b, 0x1245, 0x12f3, 0x121c, 0x3b, 0x12a5, 0x3b, 0x1230, 0x3b, 0x121b, 0x3b,
-0x1228, 0x3b, 0x1210, 0x3b, 0x12d3, 0x3b, 0x1245, 0x3b, 0x627, 0x644, 0x623, 0x62d, 0x62f, 0x3b, 0x627, 0x644, 0x627, 0x62b, 0x646, 0x64a,
-0x646, 0x3b, 0x627, 0x644, 0x62b, 0x644, 0x627, 0x62b, 0x627, 0x621, 0x3b, 0x627, 0x644, 0x623, 0x631, 0x628, 0x639, 0x627, 0x621, 0x3b,
-0x627, 0x644, 0x62e, 0x645, 0x64a, 0x633, 0x3b, 0x627, 0x644, 0x62c, 0x645, 0x639, 0x629, 0x3b, 0x627, 0x644, 0x633, 0x628, 0x62a, 0x3b,
-0x62d, 0x3b, 0x646, 0x3b, 0x62b, 0x3b, 0x631, 0x3b, 0x62e, 0x3b, 0x62c, 0x3b, 0x633, 0x3b, 0x56f, 0x56b, 0x580, 0x3b, 0x565, 0x580,
-0x56f, 0x3b, 0x565, 0x580, 0x584, 0x3b, 0x579, 0x580, 0x584, 0x3b, 0x570, 0x576, 0x563, 0x3b, 0x578, 0x582, 0x580, 0x3b, 0x577, 0x562,
-0x569, 0x3b, 0x56f, 0x56b, 0x580, 0x561, 0x56f, 0x56b, 0x3b, 0x565, 0x580, 0x56f, 0x578, 0x582, 0x577, 0x561, 0x562, 0x569, 0x56b, 0x3b,
-0x565, 0x580, 0x565, 0x584, 0x577, 0x561, 0x562, 0x569, 0x56b, 0x3b, 0x579, 0x578, 0x580, 0x565, 0x584, 0x577, 0x561, 0x562, 0x569, 0x56b,
-0x3b, 0x570, 0x56b, 0x576, 0x563, 0x577, 0x561, 0x562, 0x569, 0x56b, 0x3b, 0x578, 0x582, 0x580, 0x562, 0x561, 0x569, 0x3b, 0x577, 0x561,
-0x562, 0x561, 0x569, 0x3b, 0x53f, 0x3b, 0x535, 0x3b, 0x535, 0x3b, 0x549, 0x3b, 0x540, 0x3b, 0x548, 0x3b, 0x547, 0x3b, 0x9a6, 0x9c7,
-0x993, 0x3b, 0x9b8, 0x9cb, 0x9ae, 0x3b, 0x9ae, 0x999, 0x9cd, 0x997, 0x9b2, 0x3b, 0x9ac, 0x9c1, 0x9a7, 0x3b, 0x9ac, 0x9c3, 0x9b9, 0x3b,
-0x9b6, 0x9c1, 0x995, 0x9cd, 0x9f0, 0x3b, 0x9b6, 0x9a8, 0x9bf, 0x3b, 0x9a6, 0x9c7, 0x993, 0x9ac, 0x9be, 0x9f0, 0x3b, 0x9b8, 0x9cb, 0x9ae,
-0x9ac, 0x9be, 0x9f0, 0x3b, 0x9ae, 0x999, 0x9cd, 0x997, 0x9b2, 0x9ac, 0x9be, 0x9f0, 0x3b, 0x9ac, 0x9c1, 0x9a7, 0x9ac, 0x9be, 0x9f0, 0x3b,
-0x9ac, 0x9c3, 0x9b9, 0x9b8, 0x9cd, 0x9aa, 0x9a4, 0x9bf, 0x9ac, 0x9be, 0x9f0, 0x3b, 0x9b6, 0x9c1, 0x995, 0x9cd, 0x9f0, 0x9ac, 0x9be, 0x9f0,
-0x3b, 0x9b6, 0x9a8, 0x9bf, 0x9ac, 0x9be, 0x9f0, 0x3b, 0x9a6, 0x3b, 0x9b8, 0x3b, 0x9ae, 0x3b, 0x9ac, 0x3b, 0x9ac, 0x3b, 0x9b6, 0x3b,
-0x9b6, 0x3b, 0x42, 0x2e, 0x3b, 0x42, 0x2e, 0x45, 0x2e, 0x3b, 0xc7, 0x2e, 0x41, 0x2e, 0x3b, 0xc7, 0x2e, 0x3b, 0x43, 0x2e,
-0x41, 0x2e, 0x3b, 0x43, 0x2e, 0x3b, 0x15e, 0x2e, 0x3b, 0x62, 0x61, 0x7a, 0x61, 0x72, 0x3b, 0x62, 0x61, 0x7a, 0x61, 0x72,
-0x20, 0x65, 0x72, 0x74, 0x259, 0x73, 0x69, 0x3b, 0xe7, 0x259, 0x72, 0x15f, 0x259, 0x6e, 0x62, 0x259, 0x20, 0x61, 0x78, 0x15f,
-0x61, 0x6d, 0x131, 0x3b, 0xe7, 0x259, 0x72, 0x15f, 0x259, 0x6e, 0x62, 0x259, 0x3b, 0x63, 0xfc, 0x6d, 0x259, 0x20, 0x61, 0x78,
-0x15f, 0x61, 0x6d, 0x131, 0x3b, 0x63, 0xfc, 0x6d, 0x259, 0x3b, 0x15f, 0x259, 0x6e, 0x62, 0x259, 0x3b, 0x411, 0x2e, 0x3b, 0x411,
-0x2e, 0x415, 0x2e, 0x3b, 0x427, 0x2e, 0x410, 0x2e, 0x3b, 0x427, 0x2e, 0x3b, 0x4b8, 0x2e, 0x410, 0x2e, 0x3b, 0x4b8, 0x2e, 0x3b,
-0x428, 0x2e, 0x3b, 0x431, 0x430, 0x437, 0x430, 0x440, 0x3b, 0x431, 0x430, 0x437, 0x430, 0x440, 0x20, 0x435, 0x440, 0x442, 0x4d9, 0x441,
-0x438, 0x3b, 0x447, 0x4d9, 0x440, 0x448, 0x4d9, 0x43d, 0x431, 0x4d9, 0x20, 0x430, 0x445, 0x448, 0x430, 0x43c, 0x44b, 0x3b, 0x447, 0x4d9,
-0x440, 0x448, 0x4d9, 0x43d, 0x431, 0x4d9, 0x3b, 0x4b9, 0x4af, 0x43c, 0x4d9, 0x20, 0x430, 0x445, 0x448, 0x430, 0x43c, 0x44b, 0x3b, 0x4b9,
-0x4af, 0x43c, 0x4d9, 0x3b, 0x448, 0x4d9, 0x43d, 0x431, 0x4d9, 0x3b, 0x69, 0x67, 0x2e, 0x3b, 0x61, 0x6c, 0x2e, 0x3b, 0x61, 0x72,
-0x2e, 0x3b, 0x61, 0x7a, 0x2e, 0x3b, 0x6f, 0x67, 0x2e, 0x3b, 0x6f, 0x72, 0x2e, 0x3b, 0x6c, 0x72, 0x2e, 0x3b, 0x69, 0x67,
-0x61, 0x6e, 0x64, 0x65, 0x61, 0x3b, 0x61, 0x73, 0x74, 0x65, 0x6c, 0x65, 0x68, 0x65, 0x6e, 0x61, 0x3b, 0x61, 0x73, 0x74,
-0x65, 0x61, 0x72, 0x74, 0x65, 0x61, 0x3b, 0x61, 0x73, 0x74, 0x65, 0x61, 0x7a, 0x6b, 0x65, 0x6e, 0x61, 0x3b, 0x6f, 0x73,
-0x74, 0x65, 0x67, 0x75, 0x6e, 0x61, 0x3b, 0x6f, 0x73, 0x74, 0x69, 0x72, 0x61, 0x6c, 0x61, 0x3b, 0x6c, 0x61, 0x72, 0x75,
-0x6e, 0x62, 0x61, 0x74, 0x61, 0x3b, 0x49, 0x3b, 0x41, 0x3b, 0x41, 0x3b, 0x41, 0x3b, 0x4f, 0x3b, 0x4f, 0x3b, 0x4c, 0x3b,
-0x9b0, 0x9ac, 0x9bf, 0x3b, 0x9b8, 0x9cb, 0x9ae, 0x3b, 0x9ae, 0x999, 0x9cd, 0x997, 0x9b2, 0x3b, 0x9ac, 0x9c1, 0x9a7, 0x3b, 0x9ac, 0x9c3,
-0x9b9, 0x9b8, 0x9cd, 0x9aa, 0x9a4, 0x9bf, 0x3b, 0x9b6, 0x9c1, 0x995, 0x9cd, 0x9b0, 0x3b, 0x9b6, 0x9a8, 0x9bf, 0x3b, 0x9b0, 0x9ac, 0x9bf,
-0x9ac, 0x9be, 0x9b0, 0x3b, 0x9b8, 0x9cb, 0x9ae, 0x9ac, 0x9be, 0x9b0, 0x3b, 0x9ae, 0x999, 0x9cd, 0x997, 0x9b2, 0x9ac, 0x9be, 0x9b0, 0x3b,
-0x9ac, 0x9c1, 0x9a7, 0x9ac, 0x9be, 0x9b0, 0x3b, 0x9ac, 0x9c3, 0x9b9, 0x9b8, 0x9cd, 0x9aa, 0x9a4, 0x9bf, 0x9ac, 0x9be, 0x9b0, 0x3b, 0x9b6,
-0x9c1, 0x995, 0x9cd, 0x9b0, 0x9ac, 0x9be, 0x9b0, 0x3b, 0x9b6, 0x9a8, 0x9bf, 0x9ac, 0x9be, 0x9b0, 0x3b, 0x9b0, 0x3b, 0x9b8, 0x9cb, 0x3b,
-0x9ae, 0x3b, 0x9ac, 0x9c1, 0x3b, 0x9ac, 0x9c3, 0x3b, 0x9b6, 0x9c1, 0x3b, 0x9b6, 0x3b, 0xf5f, 0xfb3, 0xf0b, 0x3b, 0xf58, 0xf72, 0xf62,
-0xf0b, 0x3b, 0xf63, 0xfb7, 0xf42, 0xf0b, 0x3b, 0xf55, 0xf74, 0xf62, 0xf0b, 0x3b, 0xf66, 0xf44, 0xf66, 0xf0b, 0x3b, 0xf66, 0xfa4, 0xf7a,
-0xf53, 0xf0b, 0x3b, 0xf49, 0xf72, 0xf0b, 0x3b, 0xf42, 0xf5f, 0xf60, 0xf0b, 0xf5f, 0xfb3, 0xf0b, 0xf56, 0xf0b, 0x3b, 0xf42, 0xf5f, 0xf60,
-0xf0b, 0xf58, 0xf72, 0xf42, 0xf0b, 0xf51, 0xf58, 0xf62, 0xf0b, 0x3b, 0xf42, 0xf5f, 0xf60, 0xf0b, 0xf63, 0xfb7, 0xf42, 0xf0b, 0xf54, 0xf0b,
-0x3b, 0xf42, 0xf5f, 0xf60, 0xf0b, 0xf55, 0xf74, 0xf62, 0xf0b, 0xf56, 0xf74, 0xf0b, 0x3b, 0xf42, 0xf5f, 0xf60, 0xf0b, 0xf54, 0xf0b, 0xf66,
-0xf44, 0xf66, 0xf0b, 0x3b, 0xf42, 0xf5f, 0xf60, 0xf0b, 0xf66, 0xfa4, 0xf7a, 0xf53, 0xf0b, 0xf54, 0xf0b, 0x3b, 0xf42, 0xf5f, 0xf60, 0xf0b,
-0xf49, 0xf72, 0xf0b, 0xf58, 0xf0b, 0x3b, 0xf5f, 0xfb3, 0x3b, 0xf58, 0xf72, 0xf62, 0x3b, 0xf63, 0xfb7, 0xf42, 0x3b, 0xf55, 0xf74, 0xf62,
-0x3b, 0xf66, 0xf44, 0xfb6, 0x3b, 0xf66, 0xfa4, 0xf7a, 0xf53, 0x3b, 0xf49, 0xf72, 0x3b, 0x53, 0x75, 0x6c, 0x3b, 0x4c, 0x75, 0x6e,
-0x3b, 0x4d, 0x65, 0x75, 0x2e, 0x3b, 0x4d, 0x65, 0x72, 0x2e, 0x3b, 0x59, 0x61, 0x6f, 0x75, 0x3b, 0x47, 0x77, 0x65, 0x2e,
-0x3b, 0x53, 0x61, 0x64, 0x2e, 0x3b, 0x53, 0x75, 0x6c, 0x3b, 0x4c, 0x75, 0x6e, 0x3b, 0x4d, 0x65, 0x75, 0x72, 0x7a, 0x68,
-0x3b, 0x4d, 0x65, 0x72, 0x63, 0x2bc, 0x68, 0x65, 0x72, 0x3b, 0x59, 0x61, 0x6f, 0x75, 0x3b, 0x47, 0x77, 0x65, 0x6e, 0x65,
-0x72, 0x3b, 0x53, 0x61, 0x64, 0x6f, 0x72, 0x6e, 0x3b, 0x53, 0x75, 0x3b, 0x4c, 0x3b, 0x4d, 0x7a, 0x3b, 0x4d, 0x63, 0x3b,
-0x59, 0x3b, 0x47, 0x3b, 0x53, 0x61, 0x3b, 0x43d, 0x434, 0x3b, 0x43f, 0x43d, 0x3b, 0x432, 0x442, 0x3b, 0x441, 0x440, 0x3b, 0x447,
-0x442, 0x3b, 0x43f, 0x442, 0x3b, 0x441, 0x431, 0x3b, 0x43d, 0x435, 0x434, 0x435, 0x43b, 0x44f, 0x3b, 0x43f, 0x43e, 0x43d, 0x435, 0x434,
-0x435, 0x43b, 0x43d, 0x438, 0x43a, 0x3b, 0x432, 0x442, 0x43e, 0x440, 0x43d, 0x438, 0x43a, 0x3b, 0x441, 0x440, 0x44f, 0x434, 0x430, 0x3b,
-0x447, 0x435, 0x442, 0x432, 0x44a, 0x440, 0x442, 0x44a, 0x43a, 0x3b, 0x43f, 0x435, 0x442, 0x44a, 0x43a, 0x3b, 0x441, 0x44a, 0x431, 0x43e,
-0x442, 0x430, 0x3b, 0x43d, 0x3b, 0x43f, 0x3b, 0x432, 0x3b, 0x441, 0x3b, 0x447, 0x3b, 0x43f, 0x3b, 0x441, 0x3b, 0x1010, 0x1014, 0x1004,
-0x103a, 0x1039, 0x1002, 0x1014, 0x103d, 0x1031, 0x3b, 0x1010, 0x1014, 0x1004, 0x103a, 0x1039, 0x101c, 0x102c, 0x3b, 0x1021, 0x1004, 0x103a, 0x1039, 0x1002,
-0x102b, 0x3b, 0x1017, 0x102f, 0x1012, 0x1039, 0x1013, 0x101f, 0x1030, 0x1038, 0x3b, 0x1000, 0x103c, 0x102c, 0x101e, 0x1015, 0x1010, 0x1031, 0x1038, 0x3b,
-0x101e, 0x1031, 0x102c, 0x1000, 0x103c, 0x102c, 0x3b, 0x1005, 0x1014, 0x1031, 0x3b, 0x1010, 0x3b, 0x1010, 0x3b, 0x1021, 0x3b, 0x1017, 0x3b, 0x1000,
-0x3b, 0x101e, 0x3b, 0x1005, 0x3b, 0x43d, 0x434, 0x3b, 0x43f, 0x43d, 0x3b, 0x430, 0x45e, 0x3b, 0x441, 0x440, 0x3b, 0x447, 0x446, 0x3b,
-0x43f, 0x442, 0x3b, 0x441, 0x431, 0x3b, 0x43d, 0x44f, 0x434, 0x437, 0x435, 0x43b, 0x44f, 0x3b, 0x43f, 0x430, 0x43d, 0x44f, 0x434, 0x437,
-0x435, 0x43b, 0x430, 0x43a, 0x3b, 0x430, 0x45e, 0x442, 0x43e, 0x440, 0x430, 0x43a, 0x3b, 0x441, 0x435, 0x440, 0x430, 0x434, 0x430, 0x3b,
-0x447, 0x430, 0x446, 0x432, 0x435, 0x440, 0x3b, 0x43f, 0x44f, 0x442, 0x43d, 0x456, 0x446, 0x430, 0x3b, 0x441, 0x443, 0x431, 0x43e, 0x442,
-0x430, 0x3b, 0x43d, 0x3b, 0x43f, 0x3b, 0x430, 0x3b, 0x441, 0x3b, 0x447, 0x3b, 0x43f, 0x3b, 0x441, 0x3b, 0x17a2, 0x17b6, 0x1791, 0x17b7,
-0x178f, 0x17d2, 0x1799, 0x3b, 0x1785, 0x1793, 0x17d2, 0x1791, 0x3b, 0x17a2, 0x1784, 0x17d2, 0x1782, 0x17b6, 0x179a, 0x3b, 0x1796, 0x17bb, 0x1792, 0x3b,
-0x1796, 0x17d2, 0x179a, 0x17a0, 0x3b, 0x179f, 0x17bb, 0x1780, 0x17d2, 0x179a, 0x3b, 0x179f, 0x17c5, 0x179a, 0x17cd, 0x3b, 0x17a2, 0x17b6, 0x1791, 0x17b7,
-0x178f, 0x17d2, 0x1799, 0x3b, 0x1785, 0x1793, 0x17d2, 0x1791, 0x3b, 0x17a2, 0x1784, 0x17d2, 0x1782, 0x17b6, 0x179a, 0x3b, 0x1796, 0x17bb, 0x1792, 0x3b,
-0x1796, 0x17d2, 0x179a, 0x17a0, 0x179f, 0x17d2, 0x1794, 0x178f, 0x17b7, 0x17cd, 0x3b, 0x179f, 0x17bb, 0x1780, 0x17d2, 0x179a, 0x3b, 0x179f, 0x17c5, 0x179a,
-0x17cd, 0x3b, 0x17a2, 0x3b, 0x1785, 0x3b, 0x17a2, 0x3b, 0x1796, 0x3b, 0x1796, 0x3b, 0x179f, 0x3b, 0x179f, 0x3b, 0x17a2, 0x17b6, 0x1791, 0x17b7,
-0x178f, 0x17d2, 0x1799, 0x3b, 0x1785, 0x17d0, 0x1793, 0x17d2, 0x1791, 0x3b, 0x17a2, 0x1784, 0x17d2, 0x1782, 0x17b6, 0x179a, 0x3b, 0x1796, 0x17bb, 0x1792,
-0x3b, 0x1796, 0x17d2, 0x179a, 0x17a0, 0x179f, 0x17d2, 0x1794, 0x178f, 0x17b7, 0x17cd, 0x3b, 0x179f, 0x17bb, 0x1780, 0x17d2, 0x179a, 0x3b, 0x179f, 0x17c5,
-0x179a, 0x17cd, 0x3b, 0x64, 0x67, 0x2e, 0x3b, 0x64, 0x6c, 0x2e, 0x3b, 0x64, 0x74, 0x2e, 0x3b, 0x64, 0x63, 0x2e, 0x3b, 0x64,
-0x6a, 0x2e, 0x3b, 0x64, 0x76, 0x2e, 0x3b, 0x64, 0x73, 0x2e, 0x3b, 0x64, 0x69, 0x75, 0x6d, 0x65, 0x6e, 0x67, 0x65, 0x3b,
-0x64, 0x69, 0x6c, 0x6c, 0x75, 0x6e, 0x73, 0x3b, 0x64, 0x69, 0x6d, 0x61, 0x72, 0x74, 0x73, 0x3b, 0x64, 0x69, 0x6d, 0x65,
-0x63, 0x72, 0x65, 0x73, 0x3b, 0x64, 0x69, 0x6a, 0x6f, 0x75, 0x73, 0x3b, 0x64, 0x69, 0x76, 0x65, 0x6e, 0x64, 0x72, 0x65,
-0x73, 0x3b, 0x64, 0x69, 0x73, 0x73, 0x61, 0x62, 0x74, 0x65, 0x3b, 0x64, 0x67, 0x3b, 0x64, 0x6c, 0x3b, 0x64, 0x74, 0x3b,
-0x64, 0x63, 0x3b, 0x64, 0x6a, 0x3b, 0x64, 0x76, 0x3b, 0x64, 0x73, 0x3b, 0x5468, 0x65e5, 0x3b, 0x5468, 0x4e00, 0x3b, 0x5468, 0x4e8c,
-0x3b, 0x5468, 0x4e09, 0x3b, 0x5468, 0x56db, 0x3b, 0x5468, 0x4e94, 0x3b, 0x5468, 0x516d, 0x3b, 0x661f, 0x671f, 0x65e5, 0x3b, 0x661f, 0x671f, 0x4e00,
-0x3b, 0x661f, 0x671f, 0x4e8c, 0x3b, 0x661f, 0x671f, 0x4e09, 0x3b, 0x661f, 0x671f, 0x56db, 0x3b, 0x661f, 0x671f, 0x4e94, 0x3b, 0x661f, 0x671f, 0x516d,
-0x3b, 0x65e5, 0x3b, 0x4e00, 0x3b, 0x4e8c, 0x3b, 0x4e09, 0x3b, 0x56db, 0x3b, 0x4e94, 0x3b, 0x516d, 0x3b, 0x9031, 0x65e5, 0x3b, 0x9031, 0x4e00,
-0x3b, 0x9031, 0x4e8c, 0x3b, 0x9031, 0x4e09, 0x3b, 0x9031, 0x56db, 0x3b, 0x9031, 0x4e94, 0x3b, 0x9031, 0x516d, 0x3b, 0x6e, 0x65, 0x64, 0x3b,
-0x70, 0x6f, 0x6e, 0x3b, 0x75, 0x74, 0x6f, 0x3b, 0x73, 0x72, 0x69, 0x3b, 0x10d, 0x65, 0x74, 0x3b, 0x70, 0x65, 0x74, 0x3b,
-0x73, 0x75, 0x62, 0x3b, 0x6e, 0x65, 0x64, 0x6a, 0x65, 0x6c, 0x6a, 0x61, 0x3b, 0x70, 0x6f, 0x6e, 0x65, 0x64, 0x6a, 0x65,
-0x6c, 0x6a, 0x61, 0x6b, 0x3b, 0x75, 0x74, 0x6f, 0x72, 0x61, 0x6b, 0x3b, 0x73, 0x72, 0x69, 0x6a, 0x65, 0x64, 0x61, 0x3b,
-0x10d, 0x65, 0x74, 0x76, 0x72, 0x74, 0x61, 0x6b, 0x3b, 0x70, 0x65, 0x74, 0x61, 0x6b, 0x3b, 0x73, 0x75, 0x62, 0x6f, 0x74,
-0x61, 0x3b, 0x6e, 0x3b, 0x70, 0x3b, 0x75, 0x3b, 0x73, 0x3b, 0x10d, 0x3b, 0x70, 0x3b, 0x73, 0x3b, 0x4e, 0x3b, 0x50, 0x3b,
-0x55, 0x3b, 0x53, 0x3b, 0x10c, 0x3b, 0x50, 0x3b, 0x53, 0x3b, 0x6e, 0x65, 0x3b, 0x70, 0x6f, 0x3b, 0xfa, 0x74, 0x3b, 0x73,
-0x74, 0x3b, 0x10d, 0x74, 0x3b, 0x70, 0xe1, 0x3b, 0x73, 0x6f, 0x3b, 0x6e, 0x65, 0x64, 0x11b, 0x6c, 0x65, 0x3b, 0x70, 0x6f,
-0x6e, 0x64, 0x11b, 0x6c, 0xed, 0x3b, 0xfa, 0x74, 0x65, 0x72, 0xfd, 0x3b, 0x73, 0x74, 0x159, 0x65, 0x64, 0x61, 0x3b, 0x10d,
-0x74, 0x76, 0x72, 0x74, 0x65, 0x6b, 0x3b, 0x70, 0xe1, 0x74, 0x65, 0x6b, 0x3b, 0x73, 0x6f, 0x62, 0x6f, 0x74, 0x61, 0x3b,
-0x4e, 0x3b, 0x50, 0x3b, 0xda, 0x3b, 0x53, 0x3b, 0x10c, 0x3b, 0x50, 0x3b, 0x53, 0x3b, 0x73, 0xf8, 0x6e, 0x3b, 0x6d, 0x61,
-0x6e, 0x3b, 0x74, 0x69, 0x72, 0x3b, 0x6f, 0x6e, 0x73, 0x3b, 0x74, 0x6f, 0x72, 0x3b, 0x66, 0x72, 0x65, 0x3b, 0x6c, 0xf8,
-0x72, 0x3b, 0x73, 0xf8, 0x6e, 0x64, 0x61, 0x67, 0x3b, 0x6d, 0x61, 0x6e, 0x64, 0x61, 0x67, 0x3b, 0x74, 0x69, 0x72, 0x73,
-0x64, 0x61, 0x67, 0x3b, 0x6f, 0x6e, 0x73, 0x64, 0x61, 0x67, 0x3b, 0x74, 0x6f, 0x72, 0x73, 0x64, 0x61, 0x67, 0x3b, 0x66,
-0x72, 0x65, 0x64, 0x61, 0x67, 0x3b, 0x6c, 0xf8, 0x72, 0x64, 0x61, 0x67, 0x3b, 0x53, 0x3b, 0x4d, 0x3b, 0x54, 0x3b, 0x4f,
-0x3b, 0x54, 0x3b, 0x46, 0x3b, 0x4c, 0x3b, 0x73, 0xf8, 0x6e, 0x2e, 0x3b, 0x6d, 0x61, 0x6e, 0x2e, 0x3b, 0x74, 0x69, 0x72,
-0x2e, 0x3b, 0x6f, 0x6e, 0x73, 0x2e, 0x3b, 0x74, 0x6f, 0x72, 0x2e, 0x3b, 0x66, 0x72, 0x65, 0x2e, 0x3b, 0x6c, 0xf8, 0x72,
-0x2e, 0x3b, 0x7a, 0x6f, 0x3b, 0x6d, 0x61, 0x3b, 0x64, 0x69, 0x3b, 0x77, 0x6f, 0x3b, 0x64, 0x6f, 0x3b, 0x76, 0x72, 0x3b,
-0x7a, 0x61, 0x3b, 0x7a, 0x6f, 0x6e, 0x64, 0x61, 0x67, 0x3b, 0x6d, 0x61, 0x61, 0x6e, 0x64, 0x61, 0x67, 0x3b, 0x64, 0x69,
-0x6e, 0x73, 0x64, 0x61, 0x67, 0x3b, 0x77, 0x6f, 0x65, 0x6e, 0x73, 0x64, 0x61, 0x67, 0x3b, 0x64, 0x6f, 0x6e, 0x64, 0x65,
-0x72, 0x64, 0x61, 0x67, 0x3b, 0x76, 0x72, 0x69, 0x6a, 0x64, 0x61, 0x67, 0x3b, 0x7a, 0x61, 0x74, 0x65, 0x72, 0x64, 0x61,
-0x67, 0x3b, 0x5a, 0x3b, 0x4d, 0x3b, 0x44, 0x3b, 0x57, 0x3b, 0x44, 0x3b, 0x56, 0x3b, 0x5a, 0x3b, 0x53, 0x75, 0x2e, 0x3b,
-0x4d, 0x2e, 0x3b, 0x54, 0x75, 0x2e, 0x3b, 0x57, 0x2e, 0x3b, 0x54, 0x68, 0x2e, 0x3b, 0x46, 0x2e, 0x3b, 0x53, 0x61, 0x2e,
-0x3b, 0x53, 0x75, 0x6e, 0x2e, 0x3b, 0x4d, 0x6f, 0x6e, 0x2e, 0x3b, 0x54, 0x75, 0x65, 0x2e, 0x3b, 0x57, 0x65, 0x64, 0x2e,
-0x3b, 0x54, 0x68, 0x75, 0x2e, 0x3b, 0x46, 0x72, 0x69, 0x2e, 0x3b, 0x53, 0x61, 0x74, 0x2e, 0x3b, 0x64, 0x69, 0x3b, 0x6c,
-0x75, 0x3b, 0x6d, 0x61, 0x3b, 0x6d, 0x65, 0x3b, 0x135, 0x61, 0x3b, 0x76, 0x65, 0x3b, 0x73, 0x61, 0x3b, 0x64, 0x69, 0x6d,
-0x61, 0x6e, 0x109, 0x6f, 0x3b, 0x6c, 0x75, 0x6e, 0x64, 0x6f, 0x3b, 0x6d, 0x61, 0x72, 0x64, 0x6f, 0x3b, 0x6d, 0x65, 0x72,
-0x6b, 0x72, 0x65, 0x64, 0x6f, 0x3b, 0x135, 0x61, 0x16d, 0x64, 0x6f, 0x3b, 0x76, 0x65, 0x6e, 0x64, 0x72, 0x65, 0x64, 0x6f,
-0x3b, 0x73, 0x61, 0x62, 0x61, 0x74, 0x6f, 0x3b, 0x44, 0x3b, 0x4c, 0x3b, 0x4d, 0x3b, 0x4d, 0x3b, 0x134, 0x3b, 0x56, 0x3b,
-0x53, 0x3b, 0x50, 0x3b, 0x45, 0x3b, 0x54, 0x3b, 0x4b, 0x3b, 0x4e, 0x3b, 0x52, 0x3b, 0x4c, 0x3b, 0x70, 0xfc, 0x68, 0x61,
-0x70, 0xe4, 0x65, 0x76, 0x3b, 0x65, 0x73, 0x6d, 0x61, 0x73, 0x70, 0xe4, 0x65, 0x76, 0x3b, 0x74, 0x65, 0x69, 0x73, 0x69,
-0x70, 0xe4, 0x65, 0x76, 0x3b, 0x6b, 0x6f, 0x6c, 0x6d, 0x61, 0x70, 0xe4, 0x65, 0x76, 0x3b, 0x6e, 0x65, 0x6c, 0x6a, 0x61,
-0x70, 0xe4, 0x65, 0x76, 0x3b, 0x72, 0x65, 0x65, 0x64, 0x65, 0x3b, 0x6c, 0x61, 0x75, 0x70, 0xe4, 0x65, 0x76, 0x3b, 0x73,
-0x75, 0x6e, 0x3b, 0x6d, 0xe1, 0x6e, 0x3b, 0x74, 0xfd, 0x73, 0x3b, 0x6d, 0x69, 0x6b, 0x3b, 0x68, 0xf3, 0x73, 0x3b, 0x66,
-0x72, 0xed, 0x3b, 0x6c, 0x65, 0x79, 0x3b, 0x73, 0x75, 0x6e, 0x6e, 0x75, 0x64, 0x61, 0x67, 0x75, 0x72, 0x3b, 0x6d, 0xe1,
-0x6e, 0x61, 0x64, 0x61, 0x67, 0x75, 0x72, 0x3b, 0x74, 0xfd, 0x73, 0x64, 0x61, 0x67, 0x75, 0x72, 0x3b, 0x6d, 0x69, 0x6b,
-0x75, 0x64, 0x61, 0x67, 0x75, 0x72, 0x3b, 0x68, 0xf3, 0x73, 0x64, 0x61, 0x67, 0x75, 0x72, 0x3b, 0x66, 0x72, 0xed, 0x67,
-0x67, 0x6a, 0x61, 0x64, 0x61, 0x67, 0x75, 0x72, 0x3b, 0x6c, 0x65, 0x79, 0x67, 0x61, 0x72, 0x64, 0x61, 0x67, 0x75, 0x72,
-0x3b, 0x53, 0x3b, 0x4d, 0x3b, 0x54, 0x3b, 0x4d, 0x3b, 0x48, 0x3b, 0x46, 0x3b, 0x4c, 0x3b, 0x73, 0x75, 0x6e, 0x2e, 0x3b,
-0x6d, 0xe1, 0x6e, 0x2e, 0x3b, 0x74, 0xfd, 0x73, 0x2e, 0x3b, 0x6d, 0x69, 0x6b, 0x2e, 0x3b, 0x68, 0xf3, 0x73, 0x2e, 0x3b,
-0x66, 0x72, 0xed, 0x2e, 0x3b, 0x6c, 0x65, 0x79, 0x2e, 0x3b, 0x73, 0x75, 0x3b, 0x6d, 0x61, 0x3b, 0x74, 0x69, 0x3b, 0x6b,
-0x65, 0x3b, 0x74, 0x6f, 0x3b, 0x70, 0x65, 0x3b, 0x6c, 0x61, 0x3b, 0x73, 0x75, 0x6e, 0x6e, 0x75, 0x6e, 0x74, 0x61, 0x69,
-0x3b, 0x6d, 0x61, 0x61, 0x6e, 0x61, 0x6e, 0x74, 0x61, 0x69, 0x3b, 0x74, 0x69, 0x69, 0x73, 0x74, 0x61, 0x69, 0x3b, 0x6b,
-0x65, 0x73, 0x6b, 0x69, 0x76, 0x69, 0x69, 0x6b, 0x6b, 0x6f, 0x3b, 0x74, 0x6f, 0x72, 0x73, 0x74, 0x61, 0x69, 0x3b, 0x70,
-0x65, 0x72, 0x6a, 0x61, 0x6e, 0x74, 0x61, 0x69, 0x3b, 0x6c, 0x61, 0x75, 0x61, 0x6e, 0x74, 0x61, 0x69, 0x3b, 0x53, 0x3b,
-0x4d, 0x3b, 0x54, 0x3b, 0x4b, 0x3b, 0x54, 0x3b, 0x50, 0x3b, 0x4c, 0x3b, 0x73, 0x75, 0x6e, 0x6e, 0x75, 0x6e, 0x74, 0x61,
-0x69, 0x6e, 0x61, 0x3b, 0x6d, 0x61, 0x61, 0x6e, 0x61, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x61, 0x3b, 0x74, 0x69, 0x69, 0x73,
-0x74, 0x61, 0x69, 0x6e, 0x61, 0x3b, 0x6b, 0x65, 0x73, 0x6b, 0x69, 0x76, 0x69, 0x69, 0x6b, 0x6b, 0x6f, 0x6e, 0x61, 0x3b,
-0x74, 0x6f, 0x72, 0x73, 0x74, 0x61, 0x69, 0x6e, 0x61, 0x3b, 0x70, 0x65, 0x72, 0x6a, 0x61, 0x6e, 0x74, 0x61, 0x69, 0x6e,
-0x61, 0x3b, 0x6c, 0x61, 0x75, 0x61, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x61, 0x3b, 0x64, 0x69, 0x6d, 0x2e, 0x3b, 0x6c, 0x75,
-0x6e, 0x2e, 0x3b, 0x6d, 0x61, 0x72, 0x2e, 0x3b, 0x6d, 0x65, 0x72, 0x2e, 0x3b, 0x6a, 0x65, 0x75, 0x2e, 0x3b, 0x76, 0x65,
-0x6e, 0x2e, 0x3b, 0x73, 0x61, 0x6d, 0x2e, 0x3b, 0x64, 0x69, 0x6d, 0x61, 0x6e, 0x63, 0x68, 0x65, 0x3b, 0x6c, 0x75, 0x6e,
-0x64, 0x69, 0x3b, 0x6d, 0x61, 0x72, 0x64, 0x69, 0x3b, 0x6d, 0x65, 0x72, 0x63, 0x72, 0x65, 0x64, 0x69, 0x3b, 0x6a, 0x65,
-0x75, 0x64, 0x69, 0x3b, 0x76, 0x65, 0x6e, 0x64, 0x72, 0x65, 0x64, 0x69, 0x3b, 0x73, 0x61, 0x6d, 0x65, 0x64, 0x69, 0x3b,
-0x44, 0x3b, 0x4c, 0x3b, 0x4d, 0x3b, 0x4d, 0x3b, 0x4a, 0x3b, 0x56, 0x3b, 0x53, 0x3b, 0x73, 0x69, 0x3b, 0x6d, 0x6f, 0x3b,
-0x74, 0x69, 0x3b, 0x77, 0x6f, 0x3b, 0x74, 0x6f, 0x3b, 0x66, 0x72, 0x3b, 0x73, 0x6f, 0x3b, 0x73, 0x6e, 0x65, 0x69, 0x6e,
-0x3b, 0x6d, 0x6f, 0x61, 0x6e, 0x64, 0x65, 0x69, 0x3b, 0x74, 0x69, 0x69, 0x73, 0x64, 0x65, 0x69, 0x3b, 0x77, 0x6f, 0x61,
-0x6e, 0x73, 0x64, 0x65, 0x69, 0x3b, 0x74, 0x6f, 0x6e, 0x67, 0x65, 0x72, 0x73, 0x64, 0x65, 0x69, 0x3b, 0x66, 0x72, 0x65,
-0x65, 0x64, 0x3b, 0x73, 0x6e, 0x65, 0x6f, 0x6e, 0x3b, 0x44, 0x69, 0x44, 0x3b, 0x44, 0x69, 0x4c, 0x3b, 0x44, 0x69, 0x4d,
-0x3b, 0x44, 0x69, 0x43, 0x3b, 0x44, 0x69, 0x61, 0x3b, 0x44, 0x69, 0x68, 0x3b, 0x44, 0x69, 0x53, 0x3b, 0x44, 0x69, 0x44,
-0xf2, 0x6d, 0x68, 0x6e, 0x61, 0x69, 0x63, 0x68, 0x3b, 0x44, 0x69, 0x4c, 0x75, 0x61, 0x69, 0x6e, 0x3b, 0x44, 0x69, 0x4d,
-0xe0, 0x69, 0x72, 0x74, 0x3b, 0x44, 0x69, 0x43, 0x69, 0x61, 0x64, 0x61, 0x69, 0x6e, 0x3b, 0x44, 0x69, 0x61, 0x72, 0x44,
-0x61, 0x6f, 0x69, 0x6e, 0x3b, 0x44, 0x69, 0x68, 0x41, 0x6f, 0x69, 0x6e, 0x65, 0x3b, 0x44, 0x69, 0x53, 0x61, 0x74, 0x68,
-0x61, 0x69, 0x72, 0x6e, 0x65, 0x3b, 0x44, 0x3b, 0x4c, 0x3b, 0x4d, 0x3b, 0x43, 0x3b, 0x41, 0x3b, 0x48, 0x3b, 0x53, 0x3b,
-0x44, 0x6f, 0x6d, 0x2e, 0x3b, 0x4c, 0x75, 0x6e, 0x73, 0x3b, 0x4d, 0x61, 0x72, 0x2e, 0x3b, 0x4d, 0xe9, 0x72, 0x2e, 0x3b,
-0x58, 0x6f, 0x76, 0x2e, 0x3b, 0x56, 0x65, 0x6e, 0x2e, 0x3b, 0x53, 0xe1, 0x62, 0x2e, 0x3b, 0x44, 0x6f, 0x6d, 0x69, 0x6e,
-0x67, 0x6f, 0x3b, 0x4c, 0x75, 0x6e, 0x73, 0x3b, 0x4d, 0x61, 0x72, 0x74, 0x65, 0x73, 0x3b, 0x4d, 0xe9, 0x72, 0x63, 0x6f,
-0x72, 0x65, 0x73, 0x3b, 0x58, 0x6f, 0x76, 0x65, 0x73, 0x3b, 0x56, 0x65, 0x6e, 0x72, 0x65, 0x73, 0x3b, 0x53, 0xe1, 0x62,
-0x61, 0x64, 0x6f, 0x3b, 0x44, 0x3b, 0x4c, 0x3b, 0x4d, 0x3b, 0x4d, 0x3b, 0x58, 0x3b, 0x56, 0x3b, 0x53, 0x3b, 0x64, 0x6f,
-0x6d, 0x2e, 0x3b, 0x6c, 0x75, 0x6e, 0x73, 0x3b, 0x6d, 0x61, 0x72, 0x2e, 0x3b, 0x6d, 0xe9, 0x72, 0x2e, 0x3b, 0x78, 0x6f,
-0x76, 0x2e, 0x3b, 0x76, 0x65, 0x6e, 0x2e, 0x3b, 0x73, 0xe1, 0x62, 0x2e, 0x3b, 0x64, 0x6f, 0x6d, 0x69, 0x6e, 0x67, 0x6f,
-0x3b, 0x6c, 0x75, 0x6e, 0x73, 0x3b, 0x6d, 0x61, 0x72, 0x74, 0x65, 0x73, 0x3b, 0x6d, 0xe9, 0x72, 0x63, 0x6f, 0x72, 0x65,
-0x73, 0x3b, 0x78, 0x6f, 0x76, 0x65, 0x73, 0x3b, 0x76, 0x65, 0x6e, 0x72, 0x65, 0x73, 0x3b, 0x73, 0xe1, 0x62, 0x61, 0x64,
-0x6f, 0x3b, 0x64, 0x2e, 0x3b, 0x6c, 0x2e, 0x3b, 0x6d, 0x2e, 0x3b, 0x6d, 0x2e, 0x3b, 0x78, 0x2e, 0x3b, 0x76, 0x2e, 0x3b,
-0x73, 0x2e, 0x3b, 0x10d9, 0x10d5, 0x10d8, 0x3b, 0x10dd, 0x10e0, 0x10e8, 0x3b, 0x10e1, 0x10d0, 0x10db, 0x3b, 0x10dd, 0x10d7, 0x10ee, 0x3b, 0x10ee,
-0x10e3, 0x10d7, 0x3b, 0x10de, 0x10d0, 0x10e0, 0x3b, 0x10e8, 0x10d0, 0x10d1, 0x3b, 0x10d9, 0x10d5, 0x10d8, 0x10e0, 0x10d0, 0x3b, 0x10dd, 0x10e0, 0x10e8,
-0x10d0, 0x10d1, 0x10d0, 0x10d7, 0x10d8, 0x3b, 0x10e1, 0x10d0, 0x10db, 0x10e8, 0x10d0, 0x10d1, 0x10d0, 0x10d7, 0x10d8, 0x3b, 0x10dd, 0x10d7, 0x10ee, 0x10e8,
-0x10d0, 0x10d1, 0x10d0, 0x10d7, 0x10d8, 0x3b, 0x10ee, 0x10e3, 0x10d7, 0x10e8, 0x10d0, 0x10d1, 0x10d0, 0x10d7, 0x10d8, 0x3b, 0x10de, 0x10d0, 0x10e0, 0x10d0,
-0x10e1, 0x10d9, 0x10d4, 0x10d5, 0x10d8, 0x3b, 0x10e8, 0x10d0, 0x10d1, 0x10d0, 0x10d7, 0x10d8, 0x3b, 0x10d9, 0x3b, 0x10dd, 0x3b, 0x10e1, 0x3b, 0x10dd,
-0x3b, 0x10ee, 0x3b, 0x10de, 0x3b, 0x10e8, 0x3b, 0x53, 0x6f, 0x3b, 0x4d, 0x6f, 0x3b, 0x44, 0x69, 0x3b, 0x4d, 0x69, 0x3b, 0x44,
-0x6f, 0x3b, 0x46, 0x72, 0x3b, 0x53, 0x61, 0x3b, 0x53, 0x6f, 0x6e, 0x6e, 0x74, 0x61, 0x67, 0x3b, 0x4d, 0x6f, 0x6e, 0x74,
-0x61, 0x67, 0x3b, 0x44, 0x69, 0x65, 0x6e, 0x73, 0x74, 0x61, 0x67, 0x3b, 0x4d, 0x69, 0x74, 0x74, 0x77, 0x6f, 0x63, 0x68,
-0x3b, 0x44, 0x6f, 0x6e, 0x6e, 0x65, 0x72, 0x73, 0x74, 0x61, 0x67, 0x3b, 0x46, 0x72, 0x65, 0x69, 0x74, 0x61, 0x67, 0x3b,
-0x53, 0x61, 0x6d, 0x73, 0x74, 0x61, 0x67, 0x3b, 0x53, 0x3b, 0x4d, 0x3b, 0x44, 0x3b, 0x4d, 0x3b, 0x44, 0x3b, 0x46, 0x3b,
-0x53, 0x3b, 0x53, 0x6f, 0x2e, 0x3b, 0x4d, 0x6f, 0x2e, 0x3b, 0x44, 0x69, 0x2e, 0x3b, 0x4d, 0x69, 0x2e, 0x3b, 0x44, 0x6f,
-0x2e, 0x3b, 0x46, 0x72, 0x2e, 0x3b, 0x53, 0x61, 0x2e, 0x3b, 0x39a, 0x3c5, 0x3c1, 0x3b, 0x394, 0x3b5, 0x3c5, 0x3b, 0x3a4, 0x3c1,
-0x3af, 0x3b, 0x3a4, 0x3b5, 0x3c4, 0x3b, 0x3a0, 0x3ad, 0x3bc, 0x3b, 0x3a0, 0x3b1, 0x3c1, 0x3b, 0x3a3, 0x3ac, 0x3b2, 0x3b, 0x39a, 0x3c5,
-0x3c1, 0x3b9, 0x3b1, 0x3ba, 0x3ae, 0x3b, 0x394, 0x3b5, 0x3c5, 0x3c4, 0x3ad, 0x3c1, 0x3b1, 0x3b, 0x3a4, 0x3c1, 0x3af, 0x3c4, 0x3b7, 0x3b,
-0x3a4, 0x3b5, 0x3c4, 0x3ac, 0x3c1, 0x3c4, 0x3b7, 0x3b, 0x3a0, 0x3ad, 0x3bc, 0x3c0, 0x3c4, 0x3b7, 0x3b, 0x3a0, 0x3b1, 0x3c1, 0x3b1, 0x3c3,
-0x3ba, 0x3b5, 0x3c5, 0x3ae, 0x3b, 0x3a3, 0x3ac, 0x3b2, 0x3b2, 0x3b1, 0x3c4, 0x3bf, 0x3b, 0x39a, 0x3b, 0x394, 0x3b, 0x3a4, 0x3b, 0x3a4,
-0x3b, 0x3a0, 0x3b, 0x3a0, 0x3b, 0x3a3, 0x3b, 0x73, 0x61, 0x70, 0x3b, 0x61, 0x74, 0x61, 0x3b, 0x6d, 0x61, 0x72, 0x3b, 0x70,
-0x69, 0x6e, 0x3b, 0x73, 0x69, 0x73, 0x3b, 0x74, 0x61, 0x6c, 0x3b, 0x61, 0x72, 0x66, 0x3b, 0x73, 0x61, 0x70, 0x61, 0x61,
-0x74, 0x3b, 0x61, 0x74, 0x61, 0x61, 0x73, 0x69, 0x6e, 0x6e, 0x67, 0x6f, 0x72, 0x6e, 0x65, 0x71, 0x3b, 0x6d, 0x61, 0x72,
-0x6c, 0x75, 0x6e, 0x6e, 0x67, 0x6f, 0x72, 0x6e, 0x65, 0x71, 0x3b, 0x70, 0x69, 0x6e, 0x67, 0x61, 0x73, 0x75, 0x6e, 0x6e,
-0x67, 0x6f, 0x72, 0x6e, 0x65, 0x71, 0x3b, 0x73, 0x69, 0x73, 0x61, 0x6d, 0x61, 0x6e, 0x6e, 0x67, 0x6f, 0x72, 0x6e, 0x65,
-0x71, 0x3b, 0x74, 0x61, 0x6c, 0x6c, 0x69, 0x6d, 0x61, 0x6e, 0x6e, 0x67, 0x6f, 0x72, 0x6e, 0x65, 0x71, 0x3b, 0x61, 0x72,
-0x66, 0x69, 0x6e, 0x69, 0x6e, 0x6e, 0x67, 0x6f, 0x72, 0x6e, 0x65, 0x71, 0x3b, 0x53, 0x3b, 0x41, 0x3b, 0x4d, 0x3b, 0x50,
-0x3b, 0x53, 0x3b, 0x54, 0x3b, 0x41, 0x3b, 0xab0, 0xab5, 0xabf, 0x3b, 0xab8, 0xacb, 0xaae, 0x3b, 0xaae, 0xa82, 0xa97, 0xab3, 0x3b,
-0xaac, 0xac1, 0xaa7, 0x3b, 0xa97, 0xac1, 0xab0, 0xac1, 0x3b, 0xab6, 0xac1, 0xa95, 0xacd, 0xab0, 0x3b, 0xab6, 0xaa8, 0xabf, 0x3b, 0xab0,
-0xab5, 0xabf, 0xab5, 0xabe, 0xab0, 0x3b, 0xab8, 0xacb, 0xaae, 0xab5, 0xabe, 0xab0, 0x3b, 0xaae, 0xa82, 0xa97, 0xab3, 0xab5, 0xabe, 0xab0,
-0x3b, 0xaac, 0xac1, 0xaa7, 0xab5, 0xabe, 0xab0, 0x3b, 0xa97, 0xac1, 0xab0, 0xac1, 0xab5, 0xabe, 0xab0, 0x3b, 0xab6, 0xac1, 0xa95, 0xacd,
-0xab0, 0xab5, 0xabe, 0xab0, 0x3b, 0xab6, 0xaa8, 0xabf, 0xab5, 0xabe, 0xab0, 0x3b, 0xab0, 0x3b, 0xab8, 0xacb, 0x3b, 0xaae, 0xa82, 0x3b,
-0xaac, 0xac1, 0x3b, 0xa97, 0xac1, 0x3b, 0xab6, 0xac1, 0x3b, 0xab6, 0x3b, 0x4c, 0x61, 0x68, 0x3b, 0x4c, 0x69, 0x74, 0x3b, 0x54,
-0x61, 0x6c, 0x3b, 0x4c, 0x61, 0x72, 0x3b, 0x41, 0x6c, 0x68, 0x3b, 0x4a, 0x75, 0x6d, 0x3b, 0x41, 0x73, 0x61, 0x3b, 0x4c,
-0x61, 0x68, 0x61, 0x64, 0x69, 0x3b, 0x4c, 0x69, 0x74, 0x69, 0x6e, 0x69, 0x6e, 0x3b, 0x54, 0x61, 0x6c, 0x61, 0x74, 0x61,
-0x3b, 0x4c, 0x61, 0x72, 0x61, 0x62, 0x61, 0x3b, 0x41, 0x6c, 0x68, 0x61, 0x6d, 0x69, 0x73, 0x3b, 0x4a, 0x75, 0x6d, 0x6d,
-0x61, 0x2bc, 0x61, 0x3b, 0x41, 0x73, 0x61, 0x62, 0x61, 0x72, 0x3b, 0x4c, 0x3b, 0x4c, 0x3b, 0x54, 0x3b, 0x4c, 0x3b, 0x41,
-0x3b, 0x4a, 0x3b, 0x41, 0x3b, 0x5d9, 0x5d5, 0x5dd, 0x20, 0x5d0, 0x5f3, 0x3b, 0x5d9, 0x5d5, 0x5dd, 0x20, 0x5d1, 0x5f3, 0x3b, 0x5d9,
-0x5d5, 0x5dd, 0x20, 0x5d2, 0x5f3, 0x3b, 0x5d9, 0x5d5, 0x5dd, 0x20, 0x5d3, 0x5f3, 0x3b, 0x5d9, 0x5d5, 0x5dd, 0x20, 0x5d4, 0x5f3, 0x3b,
-0x5d9, 0x5d5, 0x5dd, 0x20, 0x5d5, 0x5f3, 0x3b, 0x5e9, 0x5d1, 0x5ea, 0x3b, 0x5d9, 0x5d5, 0x5dd, 0x20, 0x5e8, 0x5d0, 0x5e9, 0x5d5, 0x5df,
-0x3b, 0x5d9, 0x5d5, 0x5dd, 0x20, 0x5e9, 0x5e0, 0x5d9, 0x3b, 0x5d9, 0x5d5, 0x5dd, 0x20, 0x5e9, 0x5dc, 0x5d9, 0x5e9, 0x5d9, 0x3b, 0x5d9,
-0x5d5, 0x5dd, 0x20, 0x5e8, 0x5d1, 0x5d9, 0x5e2, 0x5d9, 0x3b, 0x5d9, 0x5d5, 0x5dd, 0x20, 0x5d7, 0x5de, 0x5d9, 0x5e9, 0x5d9, 0x3b, 0x5d9,
-0x5d5, 0x5dd, 0x20, 0x5e9, 0x5d9, 0x5e9, 0x5d9, 0x3b, 0x5d9, 0x5d5, 0x5dd, 0x20, 0x5e9, 0x5d1, 0x5ea, 0x3b, 0x5d0, 0x5f3, 0x3b, 0x5d1,
-0x5f3, 0x3b, 0x5d2, 0x5f3, 0x3b, 0x5d3, 0x5f3, 0x3b, 0x5d4, 0x5f3, 0x3b, 0x5d5, 0x5f3, 0x3b, 0x5e9, 0x5f3, 0x3b, 0x930, 0x935, 0x93f,
-0x3b, 0x938, 0x94b, 0x92e, 0x3b, 0x92e, 0x902, 0x917, 0x932, 0x3b, 0x92c, 0x941, 0x927, 0x3b, 0x917, 0x941, 0x930, 0x941, 0x3b, 0x936,
-0x941, 0x915, 0x94d, 0x930, 0x3b, 0x936, 0x928, 0x93f, 0x3b, 0x930, 0x935, 0x93f, 0x935, 0x93e, 0x930, 0x3b, 0x938, 0x94b, 0x92e, 0x935,
-0x93e, 0x930, 0x3b, 0x92e, 0x902, 0x917, 0x932, 0x935, 0x93e, 0x930, 0x3b, 0x92c, 0x941, 0x927, 0x935, 0x93e, 0x930, 0x3b, 0x917, 0x941,
-0x930, 0x941, 0x935, 0x93e, 0x930, 0x3b, 0x936, 0x941, 0x915, 0x94d, 0x930, 0x935, 0x93e, 0x930, 0x3b, 0x936, 0x928, 0x93f, 0x935, 0x93e,
-0x930, 0x3b, 0x930, 0x3b, 0x938, 0x94b, 0x3b, 0x92e, 0x902, 0x3b, 0x92c, 0x941, 0x3b, 0x917, 0x941, 0x3b, 0x936, 0x941, 0x3b, 0x936,
-0x3b, 0x56, 0x3b, 0x48, 0x3b, 0x4b, 0x3b, 0x53, 0x7a, 0x65, 0x3b, 0x43, 0x73, 0x3b, 0x50, 0x3b, 0x53, 0x7a, 0x6f, 0x3b,
-0x76, 0x61, 0x73, 0xe1, 0x72, 0x6e, 0x61, 0x70, 0x3b, 0x68, 0xe9, 0x74, 0x66, 0x151, 0x3b, 0x6b, 0x65, 0x64, 0x64, 0x3b,
-0x73, 0x7a, 0x65, 0x72, 0x64, 0x61, 0x3b, 0x63, 0x73, 0xfc, 0x74, 0xf6, 0x72, 0x74, 0xf6, 0x6b, 0x3b, 0x70, 0xe9, 0x6e,
-0x74, 0x65, 0x6b, 0x3b, 0x73, 0x7a, 0x6f, 0x6d, 0x62, 0x61, 0x74, 0x3b, 0x56, 0x3b, 0x48, 0x3b, 0x4b, 0x3b, 0x53, 0x7a,
-0x3b, 0x43, 0x73, 0x3b, 0x50, 0x3b, 0x53, 0x7a, 0x3b, 0x73, 0x75, 0x6e, 0x2e, 0x3b, 0x6d, 0xe1, 0x6e, 0x2e, 0x3b, 0xfe,
-0x72, 0x69, 0x2e, 0x3b, 0x6d, 0x69, 0xf0, 0x2e, 0x3b, 0x66, 0x69, 0x6d, 0x2e, 0x3b, 0x66, 0xf6, 0x73, 0x2e, 0x3b, 0x6c,
-0x61, 0x75, 0x2e, 0x3b, 0x73, 0x75, 0x6e, 0x6e, 0x75, 0x64, 0x61, 0x67, 0x75, 0x72, 0x3b, 0x6d, 0xe1, 0x6e, 0x75, 0x64,
-0x61, 0x67, 0x75, 0x72, 0x3b, 0xfe, 0x72, 0x69, 0xf0, 0x6a, 0x75, 0x64, 0x61, 0x67, 0x75, 0x72, 0x3b, 0x6d, 0x69, 0xf0,
-0x76, 0x69, 0x6b, 0x75, 0x64, 0x61, 0x67, 0x75, 0x72, 0x3b, 0x66, 0x69, 0x6d, 0x6d, 0x74, 0x75, 0x64, 0x61, 0x67, 0x75,
-0x72, 0x3b, 0x66, 0xf6, 0x73, 0x74, 0x75, 0x64, 0x61, 0x67, 0x75, 0x72, 0x3b, 0x6c, 0x61, 0x75, 0x67, 0x61, 0x72, 0x64,
-0x61, 0x67, 0x75, 0x72, 0x3b, 0x53, 0x3b, 0x4d, 0x3b, 0xde, 0x3b, 0x4d, 0x3b, 0x46, 0x3b, 0x46, 0x3b, 0x4c, 0x3b, 0x4d,
-0x69, 0x6e, 0x3b, 0x53, 0x65, 0x6e, 0x3b, 0x53, 0x65, 0x6c, 0x3b, 0x52, 0x61, 0x62, 0x3b, 0x4b, 0x61, 0x6d, 0x3b, 0x4a,
-0x75, 0x6d, 0x3b, 0x53, 0x61, 0x62, 0x3b, 0x4d, 0x69, 0x6e, 0x67, 0x67, 0x75, 0x3b, 0x53, 0x65, 0x6e, 0x69, 0x6e, 0x3b,
-0x53, 0x65, 0x6c, 0x61, 0x73, 0x61, 0x3b, 0x52, 0x61, 0x62, 0x75, 0x3b, 0x4b, 0x61, 0x6d, 0x69, 0x73, 0x3b, 0x4a, 0x75,
-0x6d, 0x61, 0x74, 0x3b, 0x53, 0x61, 0x62, 0x74, 0x75, 0x3b, 0x4d, 0x3b, 0x53, 0x3b, 0x53, 0x3b, 0x52, 0x3b, 0x4b, 0x3b,
-0x4a, 0x3b, 0x53, 0x3b, 0x64, 0x6f, 0x6d, 0x3b, 0x6c, 0x75, 0x6e, 0x3b, 0x6d, 0x61, 0x72, 0x3b, 0x6d, 0x65, 0x72, 0x3b,
-0x6a, 0x6f, 0x76, 0x3b, 0x76, 0x65, 0x6e, 0x3b, 0x73, 0x61, 0x62, 0x3b, 0x64, 0x6f, 0x6d, 0x69, 0x6e, 0x69, 0x63, 0x61,
-0x3b, 0x6c, 0x75, 0x6e, 0x65, 0x64, 0x69, 0x3b, 0x6d, 0x61, 0x72, 0x74, 0x65, 0x64, 0x69, 0x3b, 0x6d, 0x65, 0x72, 0x63,
-0x75, 0x72, 0x69, 0x64, 0x69, 0x3b, 0x6a, 0x6f, 0x76, 0x65, 0x64, 0x69, 0x3b, 0x76, 0x65, 0x6e, 0x65, 0x72, 0x64, 0x69,
-0x3b, 0x73, 0x61, 0x62, 0x62, 0x61, 0x74, 0x6f, 0x3b, 0x64, 0x3b, 0x6c, 0x3b, 0x6d, 0x3b, 0x6d, 0x3b, 0x6a, 0x3b, 0x76,
-0x3b, 0x73, 0x3b, 0x44, 0x6f, 0x6d, 0x68, 0x3b, 0x4c, 0x75, 0x61, 0x6e, 0x3b, 0x4d, 0xe1, 0x69, 0x72, 0x74, 0x3b, 0x43,
-0xe9, 0x61, 0x64, 0x3b, 0x44, 0xe9, 0x61, 0x72, 0x3b, 0x41, 0x6f, 0x69, 0x6e, 0x65, 0x3b, 0x53, 0x61, 0x74, 0x68, 0x3b,
-0x44, 0xe9, 0x20, 0x44, 0x6f, 0x6d, 0x68, 0x6e, 0x61, 0x69, 0x67, 0x68, 0x3b, 0x44, 0xe9, 0x20, 0x4c, 0x75, 0x61, 0x69,
-0x6e, 0x3b, 0x44, 0xe9, 0x20, 0x4d, 0xe1, 0x69, 0x72, 0x74, 0x3b, 0x44, 0xe9, 0x20, 0x43, 0xe9, 0x61, 0x64, 0x61, 0x6f,
-0x69, 0x6e, 0x3b, 0x44, 0xe9, 0x61, 0x72, 0x64, 0x61, 0x6f, 0x69, 0x6e, 0x3b, 0x44, 0xe9, 0x20, 0x68, 0x41, 0x6f, 0x69,
-0x6e, 0x65, 0x3b, 0x44, 0xe9, 0x20, 0x53, 0x61, 0x74, 0x68, 0x61, 0x69, 0x72, 0x6e, 0x3b, 0x44, 0x3b, 0x4c, 0x3b, 0x4d,
-0x3b, 0x43, 0x3b, 0x44, 0x3b, 0x41, 0x3b, 0x53, 0x3b, 0x64, 0x6f, 0x6d, 0x3b, 0x6c, 0x75, 0x6e, 0x3b, 0x6d, 0x61, 0x72,
-0x3b, 0x6d, 0x65, 0x72, 0x3b, 0x67, 0x69, 0x6f, 0x3b, 0x76, 0x65, 0x6e, 0x3b, 0x73, 0x61, 0x62, 0x3b, 0x64, 0x6f, 0x6d,
-0x65, 0x6e, 0x69, 0x63, 0x61, 0x3b, 0x6c, 0x75, 0x6e, 0x65, 0x64, 0xec, 0x3b, 0x6d, 0x61, 0x72, 0x74, 0x65, 0x64, 0xec,
-0x3b, 0x6d, 0x65, 0x72, 0x63, 0x6f, 0x6c, 0x65, 0x64, 0xec, 0x3b, 0x67, 0x69, 0x6f, 0x76, 0x65, 0x64, 0xec, 0x3b, 0x76,
-0x65, 0x6e, 0x65, 0x72, 0x64, 0xec, 0x3b, 0x73, 0x61, 0x62, 0x61, 0x74, 0x6f, 0x3b, 0x44, 0x3b, 0x4c, 0x3b, 0x4d, 0x3b,
-0x4d, 0x3b, 0x47, 0x3b, 0x56, 0x3b, 0x53, 0x3b, 0x65e5, 0x3b, 0x6708, 0x3b, 0x706b, 0x3b, 0x6c34, 0x3b, 0x6728, 0x3b, 0x91d1, 0x3b,
-0x571f, 0x3b, 0x65e5, 0x66dc, 0x65e5, 0x3b, 0x6708, 0x66dc, 0x65e5, 0x3b, 0x706b, 0x66dc, 0x65e5, 0x3b, 0x6c34, 0x66dc, 0x65e5, 0x3b, 0x6728, 0x66dc,
-0x65e5, 0x3b, 0x91d1, 0x66dc, 0x65e5, 0x3b, 0x571f, 0x66dc, 0x65e5, 0x3b, 0x41, 0x68, 0x64, 0x3b, 0x53, 0x65, 0x6e, 0x3b, 0x53, 0x65,
-0x6c, 0x3b, 0x52, 0x61, 0x62, 0x3b, 0x4b, 0x61, 0x6d, 0x3b, 0x4a, 0x75, 0x6d, 0x3b, 0x53, 0x61, 0x62, 0x3b, 0x41, 0x68,
-0x61, 0x64, 0x3b, 0x53, 0x65, 0x6e, 0x69, 0x6e, 0x3b, 0x53, 0x65, 0x6c, 0x61, 0x73, 0x61, 0x3b, 0x52, 0x61, 0x62, 0x75,
-0x3b, 0x4b, 0x61, 0x6d, 0x69, 0x73, 0x3b, 0x4a, 0x75, 0x6d, 0x61, 0x74, 0x3b, 0x53, 0x61, 0x62, 0x74, 0x75, 0x3b, 0x41,
-0x3b, 0x53, 0x3b, 0x53, 0x3b, 0x52, 0x3b, 0x4b, 0x3b, 0x4a, 0x3b, 0x53, 0x3b, 0xcad, 0xcbe, 0xca8, 0xcc1, 0x3b, 0xcb8, 0xccb,
-0xcae, 0x3b, 0xcae, 0xc82, 0xc97, 0xcb3, 0x3b, 0xcac, 0xcc1, 0xca7, 0x3b, 0xc97, 0xcc1, 0xcb0, 0xcc1, 0x3b, 0xcb6, 0xcc1, 0xc95, 0xccd,
-0xcb0, 0x3b, 0xcb6, 0xca8, 0xcbf, 0x3b, 0xcad, 0xcbe, 0xca8, 0xcc1, 0xcb5, 0xcbe, 0xcb0, 0x3b, 0xcb8, 0xccb, 0xcae, 0xcb5, 0xcbe, 0xcb0,
-0x3b, 0xcae, 0xc82, 0xc97, 0xcb3, 0xcb5, 0xcbe, 0xcb0, 0x3b, 0xcac, 0xcc1, 0xca7, 0xcb5, 0xcbe, 0xcb0, 0x3b, 0xc97, 0xcc1, 0xcb0, 0xcc1,
-0xcb5, 0xcbe, 0xcb0, 0x3b, 0xcb6, 0xcc1, 0xc95, 0xccd, 0xcb0, 0xcb5, 0xcbe, 0xcb0, 0x3b, 0xcb6, 0xca8, 0xcbf, 0xcb5, 0xcbe, 0xcb0, 0x3b,
-0xcad, 0xcbe, 0x3b, 0xcb8, 0xccb, 0x3b, 0xcae, 0xc82, 0x3b, 0xcac, 0xcc1, 0x3b, 0xc97, 0xcc1, 0x3b, 0xcb6, 0xcc1, 0x3b, 0xcb6, 0x3b,
-0x622, 0x62a, 0x6be, 0x648, 0x627, 0x631, 0x3b, 0x698, 0x654, 0x646, 0x62f, 0x655, 0x631, 0x648, 0x627, 0x631, 0x3b, 0x628, 0x6c6, 0x645,
-0x648, 0x627, 0x631, 0x3b, 0x628, 0x648, 0x62f, 0x648, 0x627, 0x631, 0x3b, 0x628, 0x631, 0x620, 0x633, 0x648, 0x627, 0x631, 0x3b, 0x62c,
-0x64f, 0x645, 0x6c1, 0x3b, 0x628, 0x679, 0x648, 0x627, 0x631, 0x3b, 0x627, 0x64e, 0x62a, 0x6be, 0x648, 0x627, 0x631, 0x3b, 0x698, 0x654,
-0x646, 0x62f, 0x631, 0x655, 0x631, 0x648, 0x627, 0x631, 0x3b, 0x628, 0x6c6, 0x645, 0x648, 0x627, 0x631, 0x3b, 0x628, 0x648, 0x62f, 0x648,
-0x627, 0x631, 0x3b, 0x628, 0x631, 0x620, 0x633, 0x648, 0x627, 0x631, 0x3b, 0x62c, 0x64f, 0x645, 0x6c1, 0x3b, 0x628, 0x679, 0x648, 0x627,
-0x631, 0x3b, 0x627, 0x3b, 0x698, 0x3b, 0x628, 0x3b, 0x628, 0x3b, 0x628, 0x3b, 0x62c, 0x3b, 0x628, 0x3b, 0x436, 0x441, 0x3b, 0x434,
-0x441, 0x3b, 0x441, 0x441, 0x3b, 0x441, 0x440, 0x3b, 0x431, 0x441, 0x3b, 0x436, 0x43c, 0x3b, 0x441, 0x431, 0x3b, 0x436, 0x435, 0x43a,
-0x441, 0x435, 0x43d, 0x431, 0x456, 0x3b, 0x434, 0x4af, 0x439, 0x441, 0x435, 0x43d, 0x431, 0x456, 0x3b, 0x441, 0x435, 0x439, 0x441, 0x435,
-0x43d, 0x431, 0x456, 0x3b, 0x441, 0x4d9, 0x440, 0x441, 0x435, 0x43d, 0x431, 0x456, 0x3b, 0x431, 0x435, 0x439, 0x441, 0x435, 0x43d, 0x431,
-0x456, 0x3b, 0x436, 0x4b1, 0x43c, 0x430, 0x3b, 0x441, 0x435, 0x43d, 0x431, 0x456, 0x3b, 0x416, 0x3b, 0x414, 0x3b, 0x421, 0x3b, 0x421,
-0x3b, 0x411, 0x3b, 0x416, 0x3b, 0x421, 0x3b, 0x63, 0x79, 0x75, 0x2e, 0x3b, 0x6d, 0x62, 0x65, 0x2e, 0x3b, 0x6b, 0x61, 0x62,
-0x2e, 0x3b, 0x67, 0x74, 0x75, 0x2e, 0x3b, 0x6b, 0x61, 0x6e, 0x2e, 0x3b, 0x67, 0x6e, 0x75, 0x2e, 0x3b, 0x67, 0x6e, 0x64,
-0x2e, 0x3b, 0x4b, 0x75, 0x20, 0x63, 0x79, 0x75, 0x6d, 0x77, 0x65, 0x72, 0x75, 0x3b, 0x4b, 0x75, 0x77, 0x61, 0x20, 0x6d,
-0x62, 0x65, 0x72, 0x65, 0x3b, 0x4b, 0x75, 0x77, 0x61, 0x20, 0x6b, 0x61, 0x62, 0x69, 0x72, 0x69, 0x3b, 0x4b, 0x75, 0x77,
-0x61, 0x20, 0x67, 0x61, 0x74, 0x61, 0x74, 0x75, 0x3b, 0x4b, 0x75, 0x77, 0x61, 0x20, 0x6b, 0x61, 0x6e, 0x65, 0x3b, 0x4b,
-0x75, 0x77, 0x61, 0x20, 0x67, 0x61, 0x74, 0x61, 0x6e, 0x75, 0x3b, 0x4b, 0x75, 0x77, 0x61, 0x20, 0x67, 0x61, 0x74, 0x61,
-0x6e, 0x64, 0x61, 0x74, 0x75, 0x3b, 0x436, 0x435, 0x43a, 0x2e, 0x3b, 0x434, 0x4af, 0x439, 0x2e, 0x3b, 0x448, 0x435, 0x439, 0x448,
-0x2e, 0x3b, 0x448, 0x430, 0x440, 0x448, 0x2e, 0x3b, 0x431, 0x435, 0x439, 0x448, 0x2e, 0x3b, 0x436, 0x443, 0x43c, 0x430, 0x3b, 0x438,
-0x448, 0x43c, 0x2e, 0x3b, 0x436, 0x435, 0x43a, 0x448, 0x435, 0x43c, 0x431, 0x438, 0x3b, 0x434, 0x4af, 0x439, 0x448, 0x4e9, 0x43c, 0x431,
-0x4af, 0x3b, 0x448, 0x435, 0x439, 0x448, 0x435, 0x43c, 0x431, 0x438, 0x3b, 0x448, 0x430, 0x440, 0x448, 0x435, 0x43c, 0x431, 0x438, 0x3b,
-0x431, 0x435, 0x439, 0x448, 0x435, 0x43c, 0x431, 0x438, 0x3b, 0x436, 0x443, 0x43c, 0x430, 0x3b, 0x438, 0x448, 0x435, 0x43c, 0x431, 0x438,
-0x3b, 0x416, 0x3b, 0x414, 0x3b, 0x428, 0x3b, 0x428, 0x3b, 0x411, 0x3b, 0x416, 0x3b, 0x418, 0x3b, 0xc77c, 0x3b, 0xc6d4, 0x3b, 0xd654,
-0x3b, 0xc218, 0x3b, 0xbaa9, 0x3b, 0xae08, 0x3b, 0xd1a0, 0x3b, 0xc77c, 0xc694, 0xc77c, 0x3b, 0xc6d4, 0xc694, 0xc77c, 0x3b, 0xd654, 0xc694, 0xc77c,
-0x3b, 0xc218, 0xc694, 0xc77c, 0x3b, 0xbaa9, 0xc694, 0xc77c, 0x3b, 0xae08, 0xc694, 0xc77c, 0x3b, 0xd1a0, 0xc694, 0xc77c, 0x3b, 0x79, 0x15f, 0x3b,
-0x64, 0x15f, 0x3b, 0x73, 0x15f, 0x3b, 0xe7, 0x15f, 0x3b, 0x70, 0x15f, 0x3b, 0xee, 0x6e, 0x3b, 0x15f, 0x3b, 0x79, 0x65, 0x6b,
-0x15f, 0x65, 0x6d, 0x3b, 0x64, 0x75, 0x15f, 0x65, 0x6d, 0x3b, 0x73, 0xea, 0x15f, 0x65, 0x6d, 0x3b, 0xe7, 0x61, 0x72, 0x15f,
-0x65, 0x6d, 0x3b, 0x70, 0xea, 0x6e, 0x63, 0x15f, 0x65, 0x6d, 0x3b, 0xee, 0x6e, 0x3b, 0x15f, 0x65, 0x6d, 0xee, 0x3b, 0x59,
-0x3b, 0x44, 0x3b, 0x53, 0x3b, 0xc7, 0x3b, 0x50, 0x3b, 0xce, 0x3b, 0x15e, 0x3b, 0x63, 0x75, 0x2e, 0x3b, 0x6d, 0x62, 0x65,
-0x2e, 0x3b, 0x6b, 0x61, 0x62, 0x2e, 0x3b, 0x67, 0x74, 0x75, 0x2e, 0x3b, 0x6b, 0x61, 0x6e, 0x2e, 0x3b, 0x67, 0x6e, 0x75,
-0x2e, 0x3b, 0x67, 0x6e, 0x64, 0x2e, 0x3b, 0x4b, 0x75, 0x20, 0x77, 0x2019, 0x69, 0x6e, 0x64, 0x77, 0x69, 0x3b, 0x4b, 0x75,
-0x20, 0x77, 0x61, 0x20, 0x6d, 0x62, 0x65, 0x72, 0x65, 0x3b, 0x4b, 0x75, 0x20, 0x77, 0x61, 0x20, 0x6b, 0x61, 0x62, 0x69,
-0x72, 0x69, 0x3b, 0x4b, 0x75, 0x20, 0x77, 0x61, 0x20, 0x67, 0x61, 0x74, 0x61, 0x74, 0x75, 0x3b, 0x4b, 0x75, 0x20, 0x77,
-0x61, 0x20, 0x6b, 0x61, 0x6e, 0x65, 0x3b, 0x4b, 0x75, 0x20, 0x77, 0x61, 0x20, 0x67, 0x61, 0x74, 0x61, 0x6e, 0x75, 0x3b,
-0x4b, 0x75, 0x20, 0x77, 0x61, 0x20, 0x67, 0x61, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x74, 0x75, 0x3b, 0xead, 0xeb2, 0xe97, 0xeb4,
-0xe94, 0x3b, 0xe88, 0xeb1, 0xe99, 0x3b, 0xead, 0xeb1, 0xe87, 0xe84, 0xeb2, 0xe99, 0x3b, 0xe9e, 0xeb8, 0xe94, 0x3b, 0xe9e, 0xeb0, 0xeab,
-0xeb1, 0xe94, 0x3b, 0xeaa, 0xeb8, 0xe81, 0x3b, 0xec0, 0xeaa, 0xebb, 0xeb2, 0x3b, 0xea7, 0xeb1, 0xe99, 0xead, 0xeb2, 0xe97, 0xeb4, 0xe94,
-0x3b, 0xea7, 0xeb1, 0xe99, 0xe88, 0xeb1, 0xe99, 0x3b, 0xea7, 0xeb1, 0xe99, 0xead, 0xeb1, 0xe87, 0xe84, 0xeb2, 0xe99, 0x3b, 0xea7, 0xeb1,
-0xe99, 0xe9e, 0xeb8, 0xe94, 0x3b, 0xea7, 0xeb1, 0xe99, 0xe9e, 0xeb0, 0xeab, 0xeb1, 0xe94, 0x3b, 0xea7, 0xeb1, 0xe99, 0xeaa, 0xeb8, 0xe81,
-0x3b, 0xea7, 0xeb1, 0xe99, 0xec0, 0xeaa, 0xebb, 0xeb2, 0x3b, 0xead, 0xeb2, 0x3b, 0xe88, 0x3b, 0xead, 0x3b, 0xe9e, 0x3b, 0xe9e, 0xeab,
-0x3b, 0xeaa, 0xeb8, 0x3b, 0xeaa, 0x3b, 0x53, 0x76, 0x113, 0x74, 0x64, 0x2e, 0x3b, 0x50, 0x69, 0x72, 0x6d, 0x64, 0x2e, 0x3b,
-0x4f, 0x74, 0x72, 0x64, 0x2e, 0x3b, 0x54, 0x72, 0x65, 0x161, 0x64, 0x2e, 0x3b, 0x43, 0x65, 0x74, 0x75, 0x72, 0x74, 0x64,
-0x2e, 0x3b, 0x50, 0x69, 0x65, 0x6b, 0x74, 0x64, 0x2e, 0x3b, 0x53, 0x65, 0x73, 0x74, 0x64, 0x2e, 0x3b, 0x53, 0x76, 0x113,
-0x74, 0x64, 0x69, 0x65, 0x6e, 0x61, 0x3b, 0x50, 0x69, 0x72, 0x6d, 0x64, 0x69, 0x65, 0x6e, 0x61, 0x3b, 0x4f, 0x74, 0x72,
-0x64, 0x69, 0x65, 0x6e, 0x61, 0x3b, 0x54, 0x72, 0x65, 0x161, 0x64, 0x69, 0x65, 0x6e, 0x61, 0x3b, 0x43, 0x65, 0x74, 0x75,
-0x72, 0x74, 0x64, 0x69, 0x65, 0x6e, 0x61, 0x3b, 0x50, 0x69, 0x65, 0x6b, 0x74, 0x64, 0x69, 0x65, 0x6e, 0x61, 0x3b, 0x53,
-0x65, 0x73, 0x74, 0x64, 0x69, 0x65, 0x6e, 0x61, 0x3b, 0x53, 0x3b, 0x50, 0x3b, 0x4f, 0x3b, 0x54, 0x3b, 0x43, 0x3b, 0x50,
-0x3b, 0x53, 0x3b, 0x73, 0x76, 0x113, 0x74, 0x64, 0x2e, 0x3b, 0x70, 0x69, 0x72, 0x6d, 0x64, 0x2e, 0x3b, 0x6f, 0x74, 0x72,
-0x64, 0x2e, 0x3b, 0x74, 0x72, 0x65, 0x161, 0x64, 0x2e, 0x3b, 0x63, 0x65, 0x74, 0x75, 0x72, 0x74, 0x64, 0x2e, 0x3b, 0x70,
-0x69, 0x65, 0x6b, 0x74, 0x64, 0x2e, 0x3b, 0x73, 0x65, 0x73, 0x74, 0x64, 0x2e, 0x3b, 0x73, 0x76, 0x113, 0x74, 0x64, 0x69,
-0x65, 0x6e, 0x61, 0x3b, 0x70, 0x69, 0x72, 0x6d, 0x64, 0x69, 0x65, 0x6e, 0x61, 0x3b, 0x6f, 0x74, 0x72, 0x64, 0x69, 0x65,
-0x6e, 0x61, 0x3b, 0x74, 0x72, 0x65, 0x161, 0x64, 0x69, 0x65, 0x6e, 0x61, 0x3b, 0x63, 0x65, 0x74, 0x75, 0x72, 0x74, 0x64,
-0x69, 0x65, 0x6e, 0x61, 0x3b, 0x70, 0x69, 0x65, 0x6b, 0x74, 0x64, 0x69, 0x65, 0x6e, 0x61, 0x3b, 0x73, 0x65, 0x73, 0x74,
-0x64, 0x69, 0x65, 0x6e, 0x61, 0x3b, 0x65, 0x79, 0x65, 0x3b, 0x79, 0x62, 0x6f, 0x3b, 0x6d, 0x62, 0x6c, 0x3b, 0x6d, 0x73,
-0x74, 0x3b, 0x6d, 0x69, 0x6e, 0x3b, 0x6d, 0x74, 0x6e, 0x3b, 0x6d, 0x70, 0x73, 0x3b, 0x65, 0x79, 0x65, 0x6e, 0x67, 0x61,
-0x3b, 0x6d, 0x6f, 0x6b, 0x254, 0x6c, 0x254, 0x20, 0x6d, 0x77, 0x61, 0x20, 0x79, 0x61, 0x6d, 0x62, 0x6f, 0x3b, 0x6d, 0x6f,
-0x6b, 0x254, 0x6c, 0x254, 0x20, 0x6d, 0x77, 0x61, 0x20, 0x6d, 0xed, 0x62, 0x61, 0x6c, 0xe9, 0x3b, 0x6d, 0x6f, 0x6b, 0x254,
-0x6c, 0x254, 0x20, 0x6d, 0x77, 0x61, 0x20, 0x6d, 0xed, 0x73, 0xe1, 0x74, 0x6f, 0x3b, 0x6d, 0x6f, 0x6b, 0x254, 0x6c, 0x254,
-0x20, 0x79, 0x61, 0x20, 0x6d, 0xed, 0x6e, 0xe9, 0x69, 0x3b, 0x6d, 0x6f, 0x6b, 0x254, 0x6c, 0x254, 0x20, 0x79, 0x61, 0x20,
-0x6d, 0xed, 0x74, 0xe1, 0x6e, 0x6f, 0x3b, 0x6d, 0x70, 0x254, 0x301, 0x73, 0x254, 0x3b, 0x65, 0x3b, 0x79, 0x3b, 0x6d, 0x3b,
-0x6d, 0x3b, 0x6d, 0x3b, 0x6d, 0x3b, 0x70, 0x3b, 0x73, 0x6b, 0x3b, 0x70, 0x72, 0x3b, 0x61, 0x6e, 0x3b, 0x74, 0x72, 0x3b,
-0x6b, 0x74, 0x3b, 0x70, 0x6e, 0x3b, 0x161, 0x74, 0x3b, 0x73, 0x65, 0x6b, 0x6d, 0x61, 0x64, 0x69, 0x65, 0x6e, 0x69, 0x73,
-0x3b, 0x70, 0x69, 0x72, 0x6d, 0x61, 0x64, 0x69, 0x65, 0x6e, 0x69, 0x73, 0x3b, 0x61, 0x6e, 0x74, 0x72, 0x61, 0x64, 0x69,
-0x65, 0x6e, 0x69, 0x73, 0x3b, 0x74, 0x72, 0x65, 0x10d, 0x69, 0x61, 0x64, 0x69, 0x65, 0x6e, 0x69, 0x73, 0x3b, 0x6b, 0x65,
-0x74, 0x76, 0x69, 0x72, 0x74, 0x61, 0x64, 0x69, 0x65, 0x6e, 0x69, 0x73, 0x3b, 0x70, 0x65, 0x6e, 0x6b, 0x74, 0x61, 0x64,
-0x69, 0x65, 0x6e, 0x69, 0x73, 0x3b, 0x161, 0x65, 0x161, 0x74, 0x61, 0x64, 0x69, 0x65, 0x6e, 0x69, 0x73, 0x3b, 0x53, 0x3b,
-0x50, 0x3b, 0x41, 0x3b, 0x54, 0x3b, 0x4b, 0x3b, 0x50, 0x3b, 0x160, 0x3b, 0x43d, 0x435, 0x434, 0x2e, 0x3b, 0x43f, 0x43e, 0x43d,
-0x2e, 0x3b, 0x432, 0x442, 0x43e, 0x2e, 0x3b, 0x441, 0x440, 0x435, 0x2e, 0x3b, 0x447, 0x435, 0x442, 0x2e, 0x3b, 0x43f, 0x435, 0x442,
-0x2e, 0x3b, 0x441, 0x430, 0x431, 0x2e, 0x3b, 0x43d, 0x435, 0x434, 0x435, 0x43b, 0x430, 0x3b, 0x43f, 0x43e, 0x43d, 0x435, 0x434, 0x435,
-0x43b, 0x43d, 0x438, 0x43a, 0x3b, 0x432, 0x442, 0x43e, 0x440, 0x43d, 0x438, 0x43a, 0x3b, 0x441, 0x440, 0x435, 0x434, 0x430, 0x3b, 0x447,
-0x435, 0x442, 0x432, 0x440, 0x442, 0x43e, 0x43a, 0x3b, 0x43f, 0x435, 0x442, 0x43e, 0x43a, 0x3b, 0x441, 0x430, 0x431, 0x43e, 0x442, 0x430,
-0x3b, 0x43d, 0x435, 0x434, 0x2e, 0x3b, 0x43f, 0x43e, 0x43d, 0x2e, 0x3b, 0x432, 0x442, 0x2e, 0x3b, 0x441, 0x440, 0x435, 0x2e, 0x3b,
-0x447, 0x435, 0x442, 0x2e, 0x3b, 0x43f, 0x435, 0x442, 0x2e, 0x3b, 0x441, 0x430, 0x431, 0x2e, 0x3b, 0x41, 0x6c, 0x61, 0x68, 0x3b,
-0x41, 0x6c, 0x61, 0x74, 0x73, 0x3b, 0x54, 0x61, 0x6c, 0x3b, 0x41, 0x6c, 0x61, 0x72, 0x3b, 0x41, 0x6c, 0x61, 0x6b, 0x3b,
-0x5a, 0x6f, 0x6d, 0x3b, 0x41, 0x73, 0x61, 0x62, 0x3b, 0x41, 0x6c, 0x61, 0x68, 0x61, 0x64, 0x79, 0x3b, 0x41, 0x6c, 0x61,
-0x74, 0x73, 0x69, 0x6e, 0x61, 0x69, 0x6e, 0x79, 0x3b, 0x54, 0x61, 0x6c, 0x61, 0x74, 0x61, 0x3b, 0x41, 0x6c, 0x61, 0x72,
-0x6f, 0x62, 0x69, 0x61, 0x3b, 0x41, 0x6c, 0x61, 0x6b, 0x61, 0x6d, 0x69, 0x73, 0x79, 0x3b, 0x5a, 0x6f, 0x6d, 0x61, 0x3b,
-0x41, 0x73, 0x61, 0x62, 0x6f, 0x74, 0x73, 0x79, 0x3b, 0x41, 0x3b, 0x41, 0x3b, 0x54, 0x3b, 0x41, 0x3b, 0x41, 0x3b, 0x5a,
-0x3b, 0x41, 0x3b, 0x41, 0x68, 0x64, 0x3b, 0x49, 0x73, 0x6e, 0x3b, 0x53, 0x65, 0x6c, 0x3b, 0x52, 0x61, 0x62, 0x3b, 0x4b,
-0x68, 0x61, 0x3b, 0x4a, 0x75, 0x6d, 0x3b, 0x53, 0x61, 0x62, 0x3b, 0x41, 0x68, 0x61, 0x64, 0x3b, 0x49, 0x73, 0x6e, 0x69,
-0x6e, 0x3b, 0x53, 0x65, 0x6c, 0x61, 0x73, 0x61, 0x3b, 0x52, 0x61, 0x62, 0x75, 0x3b, 0x4b, 0x68, 0x61, 0x6d, 0x69, 0x73,
-0x3b, 0x4a, 0x75, 0x6d, 0x61, 0x61, 0x74, 0x3b, 0x53, 0x61, 0x62, 0x74, 0x75, 0x3b, 0x41, 0x3b, 0x49, 0x3b, 0x53, 0x3b,
-0x52, 0x3b, 0x4b, 0x3b, 0x4a, 0x3b, 0x53, 0x3b, 0xd1e, 0xd3e, 0xd2f, 0xd7c, 0x3b, 0xd24, 0xd3f, 0xd19, 0xd4d, 0xd15, 0xd7e, 0x3b,
-0xd1a, 0xd4a, 0xd35, 0xd4d, 0xd35, 0x3b, 0xd2c, 0xd41, 0xd27, 0xd7b, 0x3b, 0xd35, 0xd4d, 0xd2f, 0xd3e, 0xd34, 0xd02, 0x3b, 0xd35, 0xd46,
-0xd33, 0xd4d, 0xd33, 0xd3f, 0x3b, 0xd36, 0xd28, 0xd3f, 0x3b, 0xd1e, 0xd3e, 0xd2f, 0xd31, 0xd3e, 0xd34, 0xd4d, 0x200c, 0xd1a, 0x3b, 0xd24,
-0xd3f, 0xd19, 0xd4d, 0xd15, 0xd33, 0xd3e, 0xd34, 0xd4d, 0x200c, 0xd1a, 0x3b, 0xd1a, 0xd4a, 0xd35, 0xd4d, 0xd35, 0xd3e, 0xd34, 0xd4d, 0x200c,
-0xd1a, 0x3b, 0xd2c, 0xd41, 0xd27, 0xd28, 0xd3e, 0xd34, 0xd4d, 0x200c, 0xd1a, 0x3b, 0xd35, 0xd4d, 0xd2f, 0xd3e, 0xd34, 0xd3e, 0xd34, 0xd4d,
-0x200c, 0xd1a, 0x3b, 0xd35, 0xd46, 0xd33, 0xd4d, 0xd33, 0xd3f, 0xd2f, 0xd3e, 0xd34, 0xd4d, 0x200c, 0xd1a, 0x3b, 0xd36, 0xd28, 0xd3f, 0xd2f,
-0xd3e, 0xd34, 0xd4d, 0x200c, 0xd1a, 0x3b, 0xd1e, 0xd3e, 0x3b, 0xd24, 0xd3f, 0x3b, 0xd1a, 0xd4a, 0x3b, 0xd2c, 0xd41, 0x3b, 0xd35, 0xd4d,
-0xd2f, 0xd3e, 0x3b, 0xd35, 0xd46, 0x3b, 0xd36, 0x3b, 0xd1e, 0xd3e, 0xd2f, 0xd31, 0xd3e, 0xd34, 0xd4d, 0x200c, 0xd1a, 0x3b, 0xd24, 0xd3f,
-0xd19, 0xd4d, 0xd15, 0xd33, 0xd3e, 0xd34, 0xd4d, 0x200c, 0xd1a, 0x3b, 0xd1a, 0xd4a, 0xd35, 0xd4d, 0xd35, 0xd3e, 0xd34, 0xd4d, 0xd1a, 0x3b,
-0xd2c, 0xd41, 0xd27, 0xd28, 0xd3e, 0xd34, 0xd4d, 0x200c, 0xd1a, 0x3b, 0xd35, 0xd4d, 0xd2f, 0xd3e, 0xd34, 0xd3e, 0xd34, 0xd4d, 0x200c, 0xd1a,
-0x3b, 0xd35, 0xd46, 0xd33, 0xd4d, 0xd33, 0xd3f, 0xd2f, 0xd3e, 0xd34, 0xd4d, 0x200c, 0xd1a, 0x3b, 0xd36, 0xd28, 0xd3f, 0xd2f, 0xd3e, 0xd34,
-0xd4d, 0x200c, 0xd1a, 0x3b, 0xd1e, 0x3b, 0xd24, 0xd3f, 0x3b, 0xd1a, 0xd4a, 0x3b, 0xd2c, 0xd41, 0x3b, 0xd35, 0xd4d, 0xd2f, 0xd3e, 0x3b,
-0xd35, 0xd46, 0x3b, 0xd36, 0x3b, 0x126, 0x61, 0x64, 0x3b, 0x54, 0x6e, 0x65, 0x3b, 0x54, 0x6c, 0x69, 0x3b, 0x45, 0x72, 0x62,
-0x3b, 0x126, 0x61, 0x6d, 0x3b, 0x120, 0x69, 0x6d, 0x3b, 0x53, 0x69, 0x62, 0x3b, 0x49, 0x6c, 0x2d, 0x126, 0x61, 0x64, 0x64,
-0x3b, 0x49, 0x74, 0x2d, 0x54, 0x6e, 0x65, 0x6a, 0x6e, 0x3b, 0x49, 0x74, 0x2d, 0x54, 0x6c, 0x69, 0x65, 0x74, 0x61, 0x3b,
-0x4c, 0x2d, 0x45, 0x72, 0x62, 0x67, 0x127, 0x61, 0x3b, 0x49, 0x6c, 0x2d, 0x126, 0x61, 0x6d, 0x69, 0x73, 0x3b, 0x49, 0x6c,
-0x2d, 0x120, 0x69, 0x6d, 0x67, 0x127, 0x61, 0x3b, 0x49, 0x73, 0x2d, 0x53, 0x69, 0x62, 0x74, 0x3b, 0x126, 0x64, 0x3b, 0x54,
-0x6e, 0x3b, 0x54, 0x6c, 0x3b, 0x45, 0x72, 0x3b, 0x126, 0x6d, 0x3b, 0x120, 0x6d, 0x3b, 0x53, 0x62, 0x3b, 0x126, 0x64, 0x3b,
-0x54, 0x3b, 0x54, 0x6c, 0x3b, 0x45, 0x72, 0x3b, 0x126, 0x6d, 0x3b, 0x120, 0x6d, 0x3b, 0x53, 0x62, 0x3b, 0x54, 0x61, 0x70,
-0x3b, 0x48, 0x69, 0x6e, 0x3b, 0x54, 0x16b, 0x3b, 0x41, 0x70, 0x61, 0x3b, 0x50, 0x61, 0x72, 0x3b, 0x4d, 0x65, 0x72, 0x3b,
-0x48, 0x6f, 0x72, 0x3b, 0x52, 0x101, 0x74, 0x61, 0x70, 0x75, 0x3b, 0x52, 0x101, 0x68, 0x69, 0x6e, 0x61, 0x3b, 0x52, 0x101,
-0x74, 0x16b, 0x3b, 0x52, 0x101, 0x61, 0x70, 0x61, 0x3b, 0x52, 0x101, 0x70, 0x61, 0x72, 0x65, 0x3b, 0x52, 0x101, 0x6d, 0x65,
-0x72, 0x65, 0x3b, 0x52, 0x101, 0x68, 0x6f, 0x72, 0x6f, 0x69, 0x3b, 0x54, 0x3b, 0x48, 0x3b, 0x54, 0x3b, 0x41, 0x3b, 0x50,
-0x3b, 0x4d, 0x3b, 0x48, 0x3b, 0x930, 0x935, 0x93f, 0x3b, 0x938, 0x94b, 0x92e, 0x3b, 0x92e, 0x902, 0x917, 0x933, 0x3b, 0x92c, 0x941,
-0x927, 0x3b, 0x917, 0x941, 0x930, 0x941, 0x3b, 0x936, 0x941, 0x915, 0x94d, 0x930, 0x3b, 0x936, 0x928, 0x93f, 0x3b, 0x930, 0x935, 0x93f,
-0x935, 0x93e, 0x930, 0x3b, 0x938, 0x94b, 0x92e, 0x935, 0x93e, 0x930, 0x3b, 0x92e, 0x902, 0x917, 0x933, 0x935, 0x93e, 0x930, 0x3b, 0x92c,
-0x941, 0x927, 0x935, 0x93e, 0x930, 0x3b, 0x917, 0x941, 0x930, 0x941, 0x935, 0x93e, 0x930, 0x3b, 0x936, 0x941, 0x915, 0x94d, 0x930, 0x935,
-0x93e, 0x930, 0x3b, 0x936, 0x928, 0x93f, 0x935, 0x93e, 0x930, 0x3b, 0x41d, 0x44f, 0x3b, 0x414, 0x430, 0x3b, 0x41c, 0x44f, 0x3b, 0x41b,
-0x445, 0x3b, 0x41f, 0x4af, 0x3b, 0x411, 0x430, 0x3b, 0x411, 0x44f, 0x3b, 0x41d, 0x44f, 0x43c, 0x3b, 0x414, 0x430, 0x432, 0x430, 0x430,
-0x3b, 0x41c, 0x44f, 0x433, 0x43c, 0x430, 0x440, 0x3b, 0x41b, 0x445, 0x430, 0x433, 0x432, 0x430, 0x3b, 0x41f, 0x4af, 0x440, 0x44d, 0x432,
-0x3b, 0x411, 0x430, 0x430, 0x441, 0x430, 0x43d, 0x3b, 0x411, 0x44f, 0x43c, 0x431, 0x430, 0x3b, 0x43d, 0x44f, 0x43c, 0x3b, 0x434, 0x430,
-0x432, 0x430, 0x430, 0x3b, 0x43c, 0x44f, 0x433, 0x43c, 0x430, 0x440, 0x3b, 0x43b, 0x445, 0x430, 0x433, 0x432, 0x430, 0x3b, 0x43f, 0x4af,
-0x440, 0x44d, 0x432, 0x3b, 0x431, 0x430, 0x430, 0x441, 0x430, 0x43d, 0x3b, 0x431, 0x44f, 0x43c, 0x431, 0x430, 0x3b, 0x906, 0x907, 0x924,
-0x3b, 0x938, 0x94b, 0x92e, 0x3b, 0x92e, 0x919, 0x94d, 0x917, 0x932, 0x3b, 0x92c, 0x941, 0x927, 0x3b, 0x92c, 0x93f, 0x939, 0x93f, 0x3b,
-0x936, 0x941, 0x915, 0x94d, 0x930, 0x3b, 0x936, 0x928, 0x93f, 0x3b, 0x906, 0x907, 0x924, 0x92c, 0x93e, 0x930, 0x3b, 0x938, 0x94b, 0x92e,
-0x92c, 0x93e, 0x930, 0x3b, 0x92e, 0x919, 0x94d, 0x917, 0x932, 0x92c, 0x93e, 0x930, 0x3b, 0x92c, 0x941, 0x927, 0x92c, 0x93e, 0x930, 0x3b,
-0x92c, 0x93f, 0x939, 0x93f, 0x92c, 0x93e, 0x930, 0x3b, 0x936, 0x941, 0x915, 0x94d, 0x930, 0x92c, 0x93e, 0x930, 0x3b, 0x936, 0x928, 0x93f,
-0x92c, 0x93e, 0x930, 0x3b, 0x906, 0x3b, 0x938, 0x94b, 0x3b, 0x92e, 0x3b, 0x92c, 0x941, 0x3b, 0x92c, 0x93f, 0x3b, 0x936, 0x941, 0x3b,
-0x936, 0x3b, 0xb30, 0xb2c, 0xb3f, 0x3b, 0xb38, 0xb4b, 0xb2e, 0x3b, 0xb2e, 0xb19, 0xb4d, 0xb17, 0xb33, 0x3b, 0xb2c, 0xb41, 0xb27, 0x3b,
-0xb17, 0xb41, 0xb30, 0xb41, 0x3b, 0xb36, 0xb41, 0xb15, 0xb4d, 0xb30, 0x3b, 0xb36, 0xb28, 0xb3f, 0x3b, 0xb30, 0xb2c, 0xb3f, 0xb2c, 0xb3e,
-0xb30, 0x3b, 0xb38, 0xb4b, 0xb2e, 0xb2c, 0xb3e, 0xb30, 0x3b, 0xb2e, 0xb19, 0xb4d, 0xb17, 0xb33, 0xb2c, 0xb3e, 0xb30, 0x3b, 0xb2c, 0xb41,
-0xb27, 0xb2c, 0xb3e, 0xb30, 0x3b, 0xb17, 0xb41, 0xb30, 0xb41, 0xb2c, 0xb3e, 0xb30, 0x3b, 0xb36, 0xb41, 0xb15, 0xb4d, 0xb30, 0xb2c, 0xb3e,
-0xb30, 0x3b, 0xb36, 0xb28, 0xb3f, 0xb2c, 0xb3e, 0xb30, 0x3b, 0xb30, 0x3b, 0xb38, 0xb4b, 0x3b, 0xb2e, 0x3b, 0xb2c, 0xb41, 0x3b, 0xb17,
-0xb41, 0x3b, 0xb36, 0xb41, 0x3b, 0xb36, 0x3b, 0x64a, 0x648, 0x646, 0x6cd, 0x3b, 0x62f, 0x648, 0x646, 0x6cd, 0x3b, 0x62f, 0x631, 0x6d0,
-0x646, 0x6cd, 0x3b, 0x685, 0x644, 0x631, 0x646, 0x6cd, 0x3b, 0x67e, 0x64a, 0x646, 0x681, 0x646, 0x6cd, 0x3b, 0x62c, 0x645, 0x639, 0x647,
-0x3b, 0x627, 0x648, 0x646, 0x6cd, 0x3b, 0x6cc, 0x6a9, 0x634, 0x646, 0x628, 0x647, 0x3b, 0x62f, 0x648, 0x634, 0x646, 0x628, 0x647, 0x3b,
-0x633, 0x647, 0x200c, 0x634, 0x646, 0x628, 0x647, 0x3b, 0x686, 0x647, 0x627, 0x631, 0x634, 0x646, 0x628, 0x647, 0x3b, 0x67e, 0x646, 0x62c,
-0x634, 0x646, 0x628, 0x647, 0x3b, 0x62c, 0x645, 0x639, 0x647, 0x3b, 0x634, 0x646, 0x628, 0x647, 0x3b, 0x6cc, 0x3b, 0x62f, 0x3b, 0x633,
-0x3b, 0x686, 0x3b, 0x67e, 0x3b, 0x62c, 0x3b, 0x634, 0x3b, 0x6e, 0x69, 0x65, 0x64, 0x7a, 0x2e, 0x3b, 0x70, 0x6f, 0x6e, 0x2e,
-0x3b, 0x77, 0x74, 0x2e, 0x3b, 0x15b, 0x72, 0x2e, 0x3b, 0x63, 0x7a, 0x77, 0x2e, 0x3b, 0x70, 0x74, 0x2e, 0x3b, 0x73, 0x6f,
-0x62, 0x2e, 0x3b, 0x6e, 0x69, 0x65, 0x64, 0x7a, 0x69, 0x65, 0x6c, 0x61, 0x3b, 0x70, 0x6f, 0x6e, 0x69, 0x65, 0x64, 0x7a,
-0x69, 0x61, 0x142, 0x65, 0x6b, 0x3b, 0x77, 0x74, 0x6f, 0x72, 0x65, 0x6b, 0x3b, 0x15b, 0x72, 0x6f, 0x64, 0x61, 0x3b, 0x63,
-0x7a, 0x77, 0x61, 0x72, 0x74, 0x65, 0x6b, 0x3b, 0x70, 0x69, 0x105, 0x74, 0x65, 0x6b, 0x3b, 0x73, 0x6f, 0x62, 0x6f, 0x74,
-0x61, 0x3b, 0x4e, 0x3b, 0x50, 0x3b, 0x57, 0x3b, 0x15a, 0x3b, 0x43, 0x3b, 0x50, 0x3b, 0x53, 0x3b, 0x6e, 0x3b, 0x70, 0x3b,
-0x77, 0x3b, 0x15b, 0x3b, 0x63, 0x3b, 0x70, 0x3b, 0x73, 0x3b, 0x64, 0x6f, 0x6d, 0x3b, 0x73, 0x65, 0x67, 0x3b, 0x74, 0x65,
-0x72, 0x3b, 0x71, 0x75, 0x61, 0x3b, 0x71, 0x75, 0x69, 0x3b, 0x73, 0x65, 0x78, 0x3b, 0x73, 0xe1, 0x62, 0x3b, 0x64, 0x6f,
-0x6d, 0x69, 0x6e, 0x67, 0x6f, 0x3b, 0x73, 0x65, 0x67, 0x75, 0x6e, 0x64, 0x61, 0x2d, 0x66, 0x65, 0x69, 0x72, 0x61, 0x3b,
-0x74, 0x65, 0x72, 0xe7, 0x61, 0x2d, 0x66, 0x65, 0x69, 0x72, 0x61, 0x3b, 0x71, 0x75, 0x61, 0x72, 0x74, 0x61, 0x2d, 0x66,
-0x65, 0x69, 0x72, 0x61, 0x3b, 0x71, 0x75, 0x69, 0x6e, 0x74, 0x61, 0x2d, 0x66, 0x65, 0x69, 0x72, 0x61, 0x3b, 0x73, 0x65,
-0x78, 0x74, 0x61, 0x2d, 0x66, 0x65, 0x69, 0x72, 0x61, 0x3b, 0x73, 0xe1, 0x62, 0x61, 0x64, 0x6f, 0x3b, 0x44, 0x3b, 0x53,
-0x3b, 0x54, 0x3b, 0x51, 0x3b, 0x51, 0x3b, 0x53, 0x3b, 0x53, 0x3b, 0x64, 0x6f, 0x6d, 0x69, 0x6e, 0x67, 0x6f, 0x3b, 0x73,
-0x65, 0x67, 0x75, 0x6e, 0x64, 0x61, 0x3b, 0x74, 0x65, 0x72, 0xe7, 0x61, 0x3b, 0x71, 0x75, 0x61, 0x72, 0x74, 0x61, 0x3b,
-0x71, 0x75, 0x69, 0x6e, 0x74, 0x61, 0x3b, 0x73, 0x65, 0x78, 0x74, 0x61, 0x3b, 0x73, 0xe1, 0x62, 0x61, 0x64, 0x6f, 0x3b,
-0xa10, 0xa24, 0x3b, 0xa38, 0xa4b, 0xa2e, 0x3b, 0xa2e, 0xa70, 0xa17, 0xa32, 0x3b, 0xa2c, 0xa41, 0xa71, 0xa27, 0x3b, 0xa35, 0xa40, 0xa30,
-0x3b, 0xa38, 0xa3c, 0xa41, 0xa71, 0xa15, 0xa30, 0x3b, 0xa38, 0xa3c, 0xa28, 0xa3f, 0xa71, 0xa1a, 0xa30, 0x3b, 0xa10, 0xa24, 0xa35, 0xa3e,
-0xa30, 0x3b, 0xa38, 0xa4b, 0xa2e, 0xa35, 0xa3e, 0xa30, 0x3b, 0xa2e, 0xa70, 0xa17, 0xa32, 0xa35, 0xa3e, 0xa30, 0x3b, 0xa2c, 0xa41, 0xa71,
-0xa27, 0xa35, 0xa3e, 0xa30, 0x3b, 0xa35, 0xa40, 0xa30, 0xa35, 0xa3e, 0xa30, 0x3b, 0xa38, 0xa3c, 0xa41, 0xa71, 0xa15, 0xa30, 0xa35, 0xa3e,
-0xa30, 0x3b, 0xa38, 0xa3c, 0xa28, 0xa3f, 0xa71, 0xa1a, 0xa30, 0xa35, 0xa3e, 0xa30, 0x3b, 0xa10, 0x3b, 0xa38, 0xa4b, 0x3b, 0xa2e, 0xa70,
-0x3b, 0xa2c, 0xa41, 0xa71, 0x3b, 0xa35, 0xa40, 0x3b, 0xa38, 0xa3c, 0xa41, 0xa71, 0x3b, 0xa38, 0xa3c, 0x3b, 0x627, 0x62a, 0x648, 0x627,
-0x631, 0x3b, 0x67e, 0x6cc, 0x631, 0x3b, 0x645, 0x646, 0x6af, 0x644, 0x3b, 0x628, 0x64f, 0x62f, 0x6be, 0x3b, 0x62c, 0x645, 0x639, 0x631,
-0x627, 0x62a, 0x3b, 0x62c, 0x645, 0x639, 0x6c1, 0x3b, 0x6c1, 0x641, 0x62a, 0x6c1, 0x3b, 0x44, 0x6f, 0x6d, 0x3b, 0x4c, 0x75, 0x6e,
-0x3b, 0x4d, 0x61, 0x72, 0x3b, 0x4d, 0x69, 0xe9, 0x3b, 0x4a, 0x75, 0x65, 0x3b, 0x56, 0x69, 0x65, 0x3b, 0x53, 0x61, 0x62,
-0x3b, 0x44, 0x6f, 0x6d, 0x69, 0x6e, 0x67, 0x6f, 0x3b, 0x4c, 0x75, 0x6e, 0x65, 0x73, 0x3b, 0x4d, 0x61, 0x72, 0x74, 0x65,
-0x73, 0x3b, 0x4d, 0x69, 0xe9, 0x72, 0x63, 0x6f, 0x6c, 0x65, 0x73, 0x3b, 0x4a, 0x75, 0x65, 0x76, 0x65, 0x73, 0x3b, 0x56,
-0x69, 0x65, 0x72, 0x6e, 0x65, 0x73, 0x3b, 0x53, 0xe1, 0x62, 0x61, 0x64, 0x6f, 0x3b, 0x44, 0x3b, 0x4c, 0x3b, 0x4d, 0x3b,
-0x58, 0x3b, 0x4a, 0x3b, 0x56, 0x3b, 0x53, 0x3b, 0x64, 0x75, 0x3b, 0x67, 0x6c, 0x69, 0x3b, 0x6d, 0x61, 0x3b, 0x6d, 0x65,
-0x3b, 0x67, 0x69, 0x65, 0x3b, 0x76, 0x65, 0x3b, 0x73, 0x6f, 0x3b, 0x64, 0x75, 0x6d, 0x65, 0x6e, 0x67, 0x69, 0x61, 0x3b,
-0x67, 0x6c, 0x69, 0x6e, 0x64, 0x65, 0x73, 0x64, 0x69, 0x3b, 0x6d, 0x61, 0x72, 0x64, 0x69, 0x3b, 0x6d, 0x65, 0x73, 0x65,
-0x6d, 0x6e, 0x61, 0x3b, 0x67, 0x69, 0x65, 0x76, 0x67, 0x69, 0x61, 0x3b, 0x76, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x64, 0x69,
-0x3b, 0x73, 0x6f, 0x6e, 0x64, 0x61, 0x3b, 0x44, 0x3b, 0x47, 0x3b, 0x4d, 0x3b, 0x4d, 0x3b, 0x47, 0x3b, 0x56, 0x3b, 0x53,
-0x3b, 0x64, 0x75, 0x6d, 0x2e, 0x3b, 0x6c, 0x75, 0x6e, 0x2e, 0x3b, 0x6d, 0x61, 0x72, 0x2e, 0x3b, 0x6d, 0x69, 0x65, 0x2e,
-0x3b, 0x6a, 0x6f, 0x69, 0x3b, 0x76, 0x69, 0x6e, 0x2e, 0x3b, 0x73, 0xe2, 0x6d, 0x2e, 0x3b, 0x64, 0x75, 0x6d, 0x69, 0x6e,
-0x69, 0x63, 0x103, 0x3b, 0x6c, 0x75, 0x6e, 0x69, 0x3b, 0x6d, 0x61, 0x72, 0x21b, 0x69, 0x3b, 0x6d, 0x69, 0x65, 0x72, 0x63,
-0x75, 0x72, 0x69, 0x3b, 0x6a, 0x6f, 0x69, 0x3b, 0x76, 0x69, 0x6e, 0x65, 0x72, 0x69, 0x3b, 0x73, 0xe2, 0x6d, 0x62, 0x103,
-0x74, 0x103, 0x3b, 0x44, 0x75, 0x6d, 0x3b, 0x4c, 0x75, 0x6e, 0x3b, 0x4d, 0x61, 0x72, 0x3b, 0x4d, 0x69, 0x65, 0x3b, 0x4a,
-0x6f, 0x69, 0x3b, 0x56, 0x69, 0x6e, 0x3b, 0x53, 0xe2, 0x6d, 0x3b, 0x44, 0x3b, 0x4c, 0x3b, 0x4d, 0x61, 0x3b, 0x4d, 0x69,
-0x3b, 0x4a, 0x3b, 0x56, 0x3b, 0x53, 0x3b, 0x432, 0x441, 0x3b, 0x43f, 0x43d, 0x3b, 0x432, 0x442, 0x3b, 0x441, 0x440, 0x3b, 0x447,
-0x442, 0x3b, 0x43f, 0x442, 0x3b, 0x441, 0x431, 0x3b, 0x432, 0x43e, 0x441, 0x43a, 0x440, 0x435, 0x441, 0x435, 0x43d, 0x44c, 0x435, 0x3b,
-0x43f, 0x43e, 0x43d, 0x435, 0x434, 0x435, 0x43b, 0x44c, 0x43d, 0x438, 0x43a, 0x3b, 0x432, 0x442, 0x43e, 0x440, 0x43d, 0x438, 0x43a, 0x3b,
-0x441, 0x440, 0x435, 0x434, 0x430, 0x3b, 0x447, 0x435, 0x442, 0x432, 0x435, 0x440, 0x433, 0x3b, 0x43f, 0x44f, 0x442, 0x43d, 0x438, 0x446,
-0x430, 0x3b, 0x441, 0x443, 0x431, 0x431, 0x43e, 0x442, 0x430, 0x3b, 0x412, 0x3b, 0x41f, 0x3b, 0x412, 0x3b, 0x421, 0x3b, 0x427, 0x3b,
-0x41f, 0x3b, 0x421, 0x3b, 0x42, 0x6b, 0x31, 0x3b, 0x42, 0x6b, 0x32, 0x3b, 0x42, 0x6b, 0x33, 0x3b, 0x42, 0x6b, 0x34, 0x3b,
-0x42, 0x6b, 0x35, 0x3b, 0x4c, 0xe2, 0x70, 0x3b, 0x4c, 0xe2, 0x79, 0x3b, 0x42, 0x69, 0x6b, 0x75, 0x61, 0x2d, 0xf4, 0x6b,
-0x6f, 0x3b, 0x42, 0xef, 0x6b, 0x75, 0x61, 0x2d, 0xfb, 0x73, 0x65, 0x3b, 0x42, 0xef, 0x6b, 0x75, 0x61, 0x2d, 0x70, 0x74,
-0xe2, 0x3b, 0x42, 0xef, 0x6b, 0x75, 0x61, 0x2d, 0x75, 0x73, 0xef, 0xf6, 0x3b, 0x42, 0xef, 0x6b, 0x75, 0x61, 0x2d, 0x6f,
-0x6b, 0xfc, 0x3b, 0x4c, 0xe2, 0x70, 0xf4, 0x73, 0xf6, 0x3b, 0x4c, 0xe2, 0x79, 0x65, 0x6e, 0x67, 0x61, 0x3b, 0x4b, 0x3b,
-0x53, 0x3b, 0x54, 0x3b, 0x53, 0x3b, 0x4b, 0x3b, 0x50, 0x3b, 0x59, 0x3b, 0x43d, 0x435, 0x434, 0x3b, 0x43f, 0x43e, 0x43d, 0x3b,
-0x443, 0x442, 0x43e, 0x3b, 0x441, 0x440, 0x435, 0x3b, 0x447, 0x435, 0x442, 0x3b, 0x43f, 0x435, 0x442, 0x3b, 0x441, 0x443, 0x431, 0x3b,
-0x43d, 0x435, 0x434, 0x435, 0x459, 0x430, 0x3b, 0x43f, 0x43e, 0x43d, 0x435, 0x434, 0x435, 0x459, 0x430, 0x43a, 0x3b, 0x443, 0x442, 0x43e,
-0x440, 0x430, 0x43a, 0x3b, 0x441, 0x440, 0x435, 0x434, 0x430, 0x3b, 0x447, 0x435, 0x442, 0x432, 0x440, 0x442, 0x430, 0x43a, 0x3b, 0x43f,
-0x435, 0x442, 0x430, 0x43a, 0x3b, 0x441, 0x443, 0x431, 0x43e, 0x442, 0x430, 0x3b, 0x43d, 0x3b, 0x43f, 0x3b, 0x443, 0x3b, 0x441, 0x3b,
-0x447, 0x3b, 0x43f, 0x3b, 0x441, 0x3b, 0x6e, 0x65, 0x64, 0x3b, 0x70, 0x6f, 0x6e, 0x3b, 0x75, 0x74, 0x3b, 0x73, 0x72, 0x3b,
-0x10d, 0x65, 0x74, 0x3b, 0x70, 0x65, 0x74, 0x3b, 0x73, 0x75, 0x62, 0x3b, 0x6e, 0x65, 0x64, 0x6a, 0x65, 0x6c, 0x6a, 0x61,
-0x3b, 0x70, 0x6f, 0x6e, 0x65, 0x64, 0x65, 0x6c, 0x6a, 0x61, 0x6b, 0x3b, 0x75, 0x74, 0x6f, 0x72, 0x61, 0x6b, 0x3b, 0x73,
-0x72, 0x69, 0x6a, 0x65, 0x64, 0x61, 0x3b, 0x10d, 0x65, 0x74, 0x76, 0x72, 0x74, 0x61, 0x6b, 0x3b, 0x70, 0x65, 0x74, 0x61,
-0x6b, 0x3b, 0x73, 0x75, 0x62, 0x6f, 0x74, 0x61, 0x3b, 0x6e, 0x65, 0x64, 0x2e, 0x3b, 0x70, 0x6f, 0x6e, 0x2e, 0x3b, 0x75,
-0x74, 0x2e, 0x3b, 0x73, 0x72, 0x2e, 0x3b, 0x10d, 0x65, 0x74, 0x2e, 0x3b, 0x70, 0x65, 0x74, 0x2e, 0x3b, 0x73, 0x75, 0x62,
-0x2e, 0x3b, 0x6e, 0x65, 0x64, 0x3b, 0x70, 0x6f, 0x6e, 0x3b, 0x75, 0x74, 0x6f, 0x3b, 0x73, 0x72, 0x65, 0x3b, 0x10d, 0x65,
-0x74, 0x3b, 0x70, 0x65, 0x74, 0x3b, 0x73, 0x75, 0x62, 0x3b, 0x6e, 0x65, 0x64, 0x65, 0x6c, 0x6a, 0x61, 0x3b, 0x70, 0x6f,
-0x6e, 0x65, 0x64, 0x65, 0x6c, 0x6a, 0x61, 0x6b, 0x3b, 0x75, 0x74, 0x6f, 0x72, 0x61, 0x6b, 0x3b, 0x73, 0x72, 0x65, 0x64,
-0x61, 0x3b, 0x10d, 0x65, 0x74, 0x76, 0x72, 0x74, 0x61, 0x6b, 0x3b, 0x70, 0x65, 0x74, 0x61, 0x6b, 0x3b, 0x73, 0x75, 0x62,
-0x6f, 0x74, 0x61, 0x3b, 0x43d, 0x435, 0x434, 0x3b, 0x43f, 0x43e, 0x43d, 0x3b, 0x443, 0x442, 0x3b, 0x441, 0x440, 0x3b, 0x447, 0x435,
-0x442, 0x3b, 0x43f, 0x435, 0x442, 0x3b, 0x441, 0x443, 0x431, 0x3b, 0x43d, 0x435, 0x434, 0x458, 0x435, 0x459, 0x430, 0x3b, 0x43f, 0x43e,
-0x43d, 0x435, 0x434, 0x435, 0x459, 0x430, 0x43a, 0x3b, 0x443, 0x442, 0x43e, 0x440, 0x430, 0x43a, 0x3b, 0x441, 0x440, 0x438, 0x458, 0x435,
-0x434, 0x430, 0x3b, 0x447, 0x435, 0x442, 0x432, 0x440, 0x442, 0x430, 0x43a, 0x3b, 0x43f, 0x435, 0x442, 0x430, 0x43a, 0x3b, 0x441, 0x443,
-0x431, 0x43e, 0x442, 0x430, 0x3b, 0x425, 0x446, 0x431, 0x3b, 0x41a, 0x440, 0x441, 0x3b, 0x414, 0x446, 0x433, 0x3b, 0x4d4, 0x440, 0x442,
-0x3b, 0x426, 0x43f, 0x440, 0x3b, 0x41c, 0x440, 0x431, 0x3b, 0x421, 0x431, 0x442, 0x3b, 0x425, 0x443, 0x44b, 0x446, 0x430, 0x443, 0x431,
-0x43e, 0x43d, 0x3b, 0x41a, 0x44a, 0x443, 0x44b, 0x440, 0x438, 0x441, 0x4d5, 0x440, 0x3b, 0x414, 0x44b, 0x446, 0x446, 0x4d5, 0x433, 0x3b,
-0x4d4, 0x440, 0x442, 0x44b, 0x446, 0x446, 0x4d5, 0x433, 0x3b, 0x426, 0x44b, 0x43f, 0x43f, 0x4d5, 0x440, 0x4d5, 0x43c, 0x3b, 0x41c, 0x430,
-0x439, 0x440, 0x4d5, 0x43c, 0x431, 0x43e, 0x43d, 0x3b, 0x421, 0x430, 0x431, 0x430, 0x442, 0x3b, 0x425, 0x3b, 0x41a, 0x3b, 0x414, 0x3b,
-0x4d4, 0x3b, 0x426, 0x3b, 0x41c, 0x3b, 0x421, 0x3b, 0x445, 0x446, 0x431, 0x3b, 0x43a, 0x440, 0x441, 0x3b, 0x434, 0x446, 0x433, 0x3b,
-0x4d5, 0x440, 0x442, 0x3b, 0x446, 0x43f, 0x440, 0x3b, 0x43c, 0x440, 0x431, 0x3b, 0x441, 0x431, 0x442, 0x3b, 0x445, 0x443, 0x44b, 0x446,
-0x430, 0x443, 0x431, 0x43e, 0x43d, 0x3b, 0x43a, 0x44a, 0x443, 0x44b, 0x440, 0x438, 0x441, 0x4d5, 0x440, 0x3b, 0x434, 0x44b, 0x446, 0x446,
-0x4d5, 0x433, 0x3b, 0x4d5, 0x440, 0x442, 0x44b, 0x446, 0x446, 0x4d5, 0x433, 0x3b, 0x446, 0x44b, 0x43f, 0x43f, 0x4d5, 0x440, 0x4d5, 0x43c,
-0x3b, 0x43c, 0x430, 0x439, 0x440, 0x4d5, 0x43c, 0x431, 0x43e, 0x43d, 0x3b, 0x441, 0x430, 0x431, 0x430, 0x442, 0x3b, 0x53, 0x76, 0x6f,
-0x3b, 0x4d, 0x75, 0x76, 0x3b, 0x43, 0x68, 0x70, 0x3b, 0x43, 0x68, 0x74, 0x3b, 0x43, 0x68, 0x6e, 0x3b, 0x43, 0x68, 0x73,
-0x3b, 0x4d, 0x75, 0x67, 0x3b, 0x53, 0x76, 0x6f, 0x6e, 0x64, 0x6f, 0x3b, 0x4d, 0x75, 0x76, 0x68, 0x75, 0x72, 0x6f, 0x3b,
-0x43, 0x68, 0x69, 0x70, 0x69, 0x72, 0x69, 0x3b, 0x43, 0x68, 0x69, 0x74, 0x61, 0x74, 0x75, 0x3b, 0x43, 0x68, 0x69, 0x6e,
-0x61, 0x3b, 0x43, 0x68, 0x69, 0x73, 0x68, 0x61, 0x6e, 0x75, 0x3b, 0x4d, 0x75, 0x67, 0x6f, 0x76, 0x65, 0x72, 0x61, 0x3b,
-0x53, 0x3b, 0x4d, 0x3b, 0x43, 0x3b, 0x43, 0x3b, 0x43, 0x3b, 0x43, 0x3b, 0x4d, 0x3b, 0x622, 0x686, 0x631, 0x3b, 0x633, 0x648,
-0x645, 0x631, 0x3b, 0x627, 0x6b1, 0x627, 0x631, 0x648, 0x3b, 0x627, 0x631, 0x628, 0x639, 0x3b, 0x62e, 0x645, 0x64a, 0x633, 0x3b, 0x62c,
-0x645, 0x639, 0x648, 0x3b, 0x687, 0x646, 0x687, 0x631, 0x3b, 0x622, 0x686, 0x631, 0x3b, 0x633, 0x648, 0x3b, 0x627, 0x6b1, 0x627, 0x631,
-0x648, 0x3b, 0x627, 0x631, 0x628, 0x639, 0x3b, 0x62e, 0x645, 0x3b, 0x62c, 0x645, 0x639, 0x648, 0x3b, 0x687, 0x646, 0x687, 0x631, 0x3b,
-0xd89, 0xdbb, 0xdd2, 0xdaf, 0xdcf, 0x3b, 0xdc3, 0xdb3, 0xdd4, 0xdaf, 0xdcf, 0x3b, 0xd85, 0xd9f, 0xdc4, 0x3b, 0xdb6, 0xdaf, 0xdcf, 0xdaf,
-0xdcf, 0x3b, 0xdb6, 0xdca, 0x200d, 0xdbb, 0xdc4, 0xdc3, 0xdca, 0x3b, 0xdc3, 0xdd2, 0xd9a, 0xdd4, 0x3b, 0xdc3, 0xdd9, 0xdb1, 0x3b, 0xd89,
-0xdbb, 0xdd2, 0xdaf, 0xdcf, 0x3b, 0xdc3, 0xdb3, 0xdd4, 0xdaf, 0xdcf, 0x3b, 0xd85, 0xd9f, 0xdc4, 0xdbb, 0xdd4, 0xdc0, 0xdcf, 0xdaf, 0xdcf,
-0x3b, 0xdb6, 0xdaf, 0xdcf, 0xdaf, 0xdcf, 0x3b, 0xdb6, 0xdca, 0x200d, 0xdbb, 0xdc4, 0xdc3, 0xdca, 0xdb4, 0xdad, 0xdd2, 0xdb1, 0xdca, 0xdaf,
-0xdcf, 0x3b, 0xdc3, 0xdd2, 0xd9a, 0xdd4, 0xdbb, 0xdcf, 0xdaf, 0xdcf, 0x3b, 0xdc3, 0xdd9, 0xdb1, 0xdc3, 0xdd4, 0xdbb, 0xdcf, 0xdaf, 0xdcf,
-0x3b, 0xd89, 0x3b, 0xdc3, 0x3b, 0xd85, 0x3b, 0xdb6, 0x3b, 0xdb6, 0xdca, 0x200d, 0xdbb, 0x3b, 0xdc3, 0xdd2, 0x3b, 0xdc3, 0xdd9, 0x3b,
-0x6e, 0x65, 0x3b, 0x70, 0x6f, 0x3b, 0x75, 0x74, 0x3b, 0x73, 0x74, 0x3b, 0x161, 0x74, 0x3b, 0x70, 0x69, 0x3b, 0x73, 0x6f,
-0x3b, 0x6e, 0x65, 0x64, 0x65, 0x13e, 0x61, 0x3b, 0x70, 0x6f, 0x6e, 0x64, 0x65, 0x6c, 0x6f, 0x6b, 0x3b, 0x75, 0x74, 0x6f,
-0x72, 0x6f, 0x6b, 0x3b, 0x73, 0x74, 0x72, 0x65, 0x64, 0x61, 0x3b, 0x161, 0x74, 0x76, 0x72, 0x74, 0x6f, 0x6b, 0x3b, 0x70,
-0x69, 0x61, 0x74, 0x6f, 0x6b, 0x3b, 0x73, 0x6f, 0x62, 0x6f, 0x74, 0x61, 0x3b, 0x6e, 0x3b, 0x70, 0x3b, 0x75, 0x3b, 0x73,
-0x3b, 0x161, 0x3b, 0x70, 0x3b, 0x73, 0x3b, 0x6e, 0x65, 0x64, 0x2e, 0x3b, 0x70, 0x6f, 0x6e, 0x2e, 0x3b, 0x74, 0x6f, 0x72,
-0x2e, 0x3b, 0x73, 0x72, 0x65, 0x2e, 0x3b, 0x10d, 0x65, 0x74, 0x2e, 0x3b, 0x70, 0x65, 0x74, 0x2e, 0x3b, 0x73, 0x6f, 0x62,
-0x2e, 0x3b, 0x6e, 0x65, 0x64, 0x65, 0x6c, 0x6a, 0x61, 0x3b, 0x70, 0x6f, 0x6e, 0x65, 0x64, 0x65, 0x6c, 0x6a, 0x65, 0x6b,
-0x3b, 0x74, 0x6f, 0x72, 0x65, 0x6b, 0x3b, 0x73, 0x72, 0x65, 0x64, 0x61, 0x3b, 0x10d, 0x65, 0x74, 0x72, 0x74, 0x65, 0x6b,
-0x3b, 0x70, 0x65, 0x74, 0x65, 0x6b, 0x3b, 0x73, 0x6f, 0x62, 0x6f, 0x74, 0x61, 0x3b, 0x6e, 0x3b, 0x70, 0x3b, 0x74, 0x3b,
-0x73, 0x3b, 0x10d, 0x3b, 0x70, 0x3b, 0x73, 0x3b, 0x41, 0x78, 0x64, 0x3b, 0x49, 0x73, 0x6e, 0x3b, 0x53, 0x6c, 0x73, 0x61,
-0x3b, 0x41, 0x72, 0x62, 0x63, 0x3b, 0x4b, 0x68, 0x6d, 0x73, 0x3b, 0x4a, 0x6d, 0x63, 0x3b, 0x53, 0x62, 0x74, 0x69, 0x3b,
-0x41, 0x78, 0x61, 0x64, 0x3b, 0x49, 0x73, 0x6e, 0x69, 0x69, 0x6e, 0x3b, 0x53, 0x61, 0x6c, 0x61, 0x61, 0x73, 0x61, 0x3b,
-0x41, 0x72, 0x62, 0x61, 0x63, 0x61, 0x3b, 0x4b, 0x68, 0x61, 0x6d, 0x69, 0x69, 0x73, 0x3b, 0x4a, 0x69, 0x6d, 0x63, 0x65,
-0x3b, 0x53, 0x61, 0x62, 0x74, 0x69, 0x3b, 0x41, 0x3b, 0x49, 0x3b, 0x53, 0x3b, 0x41, 0x3b, 0x4b, 0x68, 0x3b, 0x4a, 0x3b,
-0x53, 0x3b, 0x64, 0x6f, 0x6d, 0x2e, 0x3b, 0x6c, 0x75, 0x6e, 0x2e, 0x3b, 0x6d, 0x61, 0x72, 0x2e, 0x3b, 0x6d, 0x69, 0xe9,
-0x2e, 0x3b, 0x6a, 0x75, 0x65, 0x2e, 0x3b, 0x76, 0x69, 0x65, 0x2e, 0x3b, 0x73, 0xe1, 0x62, 0x2e, 0x3b, 0x64, 0x6f, 0x6d,
-0x69, 0x6e, 0x67, 0x6f, 0x3b, 0x6c, 0x75, 0x6e, 0x65, 0x73, 0x3b, 0x6d, 0x61, 0x72, 0x74, 0x65, 0x73, 0x3b, 0x6d, 0x69,
-0xe9, 0x72, 0x63, 0x6f, 0x6c, 0x65, 0x73, 0x3b, 0x6a, 0x75, 0x65, 0x76, 0x65, 0x73, 0x3b, 0x76, 0x69, 0x65, 0x72, 0x6e,
-0x65, 0x73, 0x3b, 0x73, 0xe1, 0x62, 0x61, 0x64, 0x6f, 0x3b, 0x4a, 0x75, 0x6d, 0x61, 0x70, 0x69, 0x6c, 0x69, 0x3b, 0x4a,
-0x75, 0x6d, 0x61, 0x74, 0x61, 0x74, 0x75, 0x3b, 0x4a, 0x75, 0x6d, 0x61, 0x6e, 0x6e, 0x65, 0x3b, 0x4a, 0x75, 0x6d, 0x61,
-0x74, 0x61, 0x6e, 0x6f, 0x3b, 0x41, 0x6c, 0x68, 0x61, 0x6d, 0x69, 0x73, 0x69, 0x3b, 0x49, 0x6a, 0x75, 0x6d, 0x61, 0x61,
-0x3b, 0x4a, 0x75, 0x6d, 0x61, 0x6d, 0x6f, 0x73, 0x69, 0x3b, 0x73, 0xf6, 0x6e, 0x3b, 0x6d, 0xe5, 0x6e, 0x3b, 0x74, 0x69,
-0x73, 0x3b, 0x6f, 0x6e, 0x73, 0x3b, 0x74, 0x6f, 0x72, 0x73, 0x3b, 0x66, 0x72, 0x65, 0x3b, 0x6c, 0xf6, 0x72, 0x3b, 0x73,
-0xf6, 0x6e, 0x64, 0x61, 0x67, 0x3b, 0x6d, 0xe5, 0x6e, 0x64, 0x61, 0x67, 0x3b, 0x74, 0x69, 0x73, 0x64, 0x61, 0x67, 0x3b,
-0x6f, 0x6e, 0x73, 0x64, 0x61, 0x67, 0x3b, 0x74, 0x6f, 0x72, 0x73, 0x64, 0x61, 0x67, 0x3b, 0x66, 0x72, 0x65, 0x64, 0x61,
-0x67, 0x3b, 0x6c, 0xf6, 0x72, 0x64, 0x61, 0x67, 0x3b, 0x42f, 0x448, 0x431, 0x3b, 0x414, 0x448, 0x431, 0x3b, 0x421, 0x448, 0x431,
-0x3b, 0x427, 0x448, 0x431, 0x3b, 0x41f, 0x448, 0x431, 0x3b, 0x4b6, 0x43c, 0x44a, 0x3b, 0x428, 0x43d, 0x431, 0x3b, 0x42f, 0x43a, 0x448,
-0x430, 0x43d, 0x431, 0x435, 0x3b, 0x414, 0x443, 0x448, 0x430, 0x43d, 0x431, 0x435, 0x3b, 0x421, 0x435, 0x448, 0x430, 0x43d, 0x431, 0x435,
-0x3b, 0x427, 0x43e, 0x440, 0x448, 0x430, 0x43d, 0x431, 0x435, 0x3b, 0x41f, 0x430, 0x43d, 0x4b7, 0x448, 0x430, 0x43d, 0x431, 0x435, 0x3b,
-0x4b6, 0x443, 0x43c, 0x44a, 0x430, 0x3b, 0x428, 0x430, 0x43d, 0x431, 0x435, 0x3b, 0x42f, 0x3b, 0x414, 0x3b, 0x421, 0x3b, 0x427, 0x3b,
-0x41f, 0x3b, 0x4b6, 0x3b, 0x428, 0x3b, 0xb9e, 0xbbe, 0xbaf, 0xbbf, 0x2e, 0x3b, 0xba4, 0xbbf, 0xb99, 0xbcd, 0x2e, 0x3b, 0xb9a, 0xbc6,
-0xbb5, 0xbcd, 0x2e, 0x3b, 0xbaa, 0xbc1, 0xba4, 0x2e, 0x3b, 0xbb5, 0xbbf, 0xbaf, 0xbbe, 0x2e, 0x3b, 0xbb5, 0xbc6, 0xbb3, 0xbcd, 0x2e,
-0x3b, 0xb9a, 0xba9, 0xbbf, 0x3b, 0xb9e, 0xbbe, 0xbaf, 0xbbf, 0xbb1, 0xbc1, 0x3b, 0xba4, 0xbbf, 0xb99, 0xbcd, 0xb95, 0xbb3, 0xbcd, 0x3b,
-0xb9a, 0xbc6, 0xbb5, 0xbcd, 0xbb5, 0xbbe, 0xbaf, 0xbcd, 0x3b, 0xbaa, 0xbc1, 0xba4, 0xba9, 0xbcd, 0x3b, 0xbb5, 0xbbf, 0xbaf, 0xbbe, 0xbb4,
-0xba9, 0xbcd, 0x3b, 0xbb5, 0xbc6, 0xbb3, 0xbcd, 0xbb3, 0xbbf, 0x3b, 0xb9a, 0xba9, 0xbbf, 0x3b, 0xb9e, 0xbbe, 0x3b, 0xba4, 0xbbf, 0x3b,
-0xb9a, 0xbc6, 0x3b, 0xbaa, 0xbc1, 0x3b, 0xbb5, 0xbbf, 0x3b, 0xbb5, 0xbc6, 0x3b, 0xb9a, 0x3b, 0x44f, 0x43a, 0x448, 0x2e, 0x3b, 0x434,
-0x4af, 0x448, 0x2e, 0x3b, 0x441, 0x438, 0x448, 0x2e, 0x3b, 0x447, 0x4d9, 0x440, 0x2e, 0x3b, 0x43f, 0x4d9, 0x43d, 0x497, 0x2e, 0x3b,
-0x497, 0x43e, 0x43c, 0x2e, 0x3b, 0x448, 0x438, 0x43c, 0x2e, 0x3b, 0x44f, 0x43a, 0x448, 0x4d9, 0x43c, 0x431, 0x435, 0x3b, 0x434, 0x4af,
-0x448, 0x4d9, 0x43c, 0x431, 0x435, 0x3b, 0x441, 0x438, 0x448, 0x4d9, 0x43c, 0x431, 0x435, 0x3b, 0x447, 0x4d9, 0x440, 0x448, 0x4d9, 0x43c,
-0x431, 0x435, 0x3b, 0x43f, 0x4d9, 0x43d, 0x497, 0x435, 0x448, 0x4d9, 0x43c, 0x431, 0x435, 0x3b, 0x497, 0x43e, 0x43c, 0x433, 0x430, 0x3b,
-0x448, 0x438, 0x43c, 0x431, 0x4d9, 0x3b, 0x42f, 0x3b, 0x414, 0x3b, 0x421, 0x3b, 0x427, 0x3b, 0x41f, 0x3b, 0x496, 0x3b, 0x428, 0x3b,
-0xc06, 0xc26, 0xc3f, 0x3b, 0xc38, 0xc4b, 0xc2e, 0x3b, 0xc2e, 0xc02, 0xc17, 0xc33, 0x3b, 0xc2c, 0xc41, 0xc27, 0x3b, 0xc17, 0xc41, 0xc30,
-0xc41, 0x3b, 0xc36, 0xc41, 0xc15, 0xc4d, 0xc30, 0x3b, 0xc36, 0xc28, 0xc3f, 0x3b, 0xc06, 0xc26, 0xc3f, 0xc35, 0xc3e, 0xc30, 0xc02, 0x3b,
-0xc38, 0xc4b, 0xc2e, 0xc35, 0xc3e, 0xc30, 0xc02, 0x3b, 0xc2e, 0xc02, 0xc17, 0xc33, 0xc35, 0xc3e, 0xc30, 0xc02, 0x3b, 0xc2c, 0xc41, 0xc27,
-0xc35, 0xc3e, 0xc30, 0xc02, 0x3b, 0xc17, 0xc41, 0xc30, 0xc41, 0xc35, 0xc3e, 0xc30, 0xc02, 0x3b, 0xc36, 0xc41, 0xc15, 0xc4d, 0xc30, 0xc35,
-0xc3e, 0xc30, 0xc02, 0x3b, 0xc36, 0xc28, 0xc3f, 0xc35, 0xc3e, 0xc30, 0xc02, 0x3b, 0xc06, 0x3b, 0xc38, 0xc4b, 0x3b, 0xc2e, 0x3b, 0xc2c,
-0xc41, 0x3b, 0xc17, 0xc41, 0x3b, 0xc36, 0xc41, 0x3b, 0xc36, 0x3b, 0xe2d, 0xe32, 0x2e, 0x3b, 0xe08, 0x2e, 0x3b, 0xe2d, 0x2e, 0x3b,
-0xe1e, 0x2e, 0x3b, 0xe1e, 0xe24, 0x2e, 0x3b, 0xe28, 0x2e, 0x3b, 0xe2a, 0x2e, 0x3b, 0xe27, 0xe31, 0xe19, 0xe2d, 0xe32, 0xe17, 0xe34,
-0xe15, 0xe22, 0xe4c, 0x3b, 0xe27, 0xe31, 0xe19, 0xe08, 0xe31, 0xe19, 0xe17, 0xe23, 0xe4c, 0x3b, 0xe27, 0xe31, 0xe19, 0xe2d, 0xe31, 0xe07,
-0xe04, 0xe32, 0xe23, 0x3b, 0xe27, 0xe31, 0xe19, 0xe1e, 0xe38, 0xe18, 0x3b, 0xe27, 0xe31, 0xe19, 0xe1e, 0xe24, 0xe2b, 0xe31, 0xe2a, 0xe1a,
-0xe14, 0xe35, 0x3b, 0xe27, 0xe31, 0xe19, 0xe28, 0xe38, 0xe01, 0xe23, 0xe4c, 0x3b, 0xe27, 0xe31, 0xe19, 0xe40, 0xe2a, 0xe32, 0xe23, 0xe4c,
-0x3b, 0xe2d, 0xe32, 0x3b, 0xe08, 0x3b, 0xe2d, 0x3b, 0xe1e, 0x3b, 0xe1e, 0xe24, 0x3b, 0xe28, 0x3b, 0xe2a, 0x3b, 0xf49, 0xf72, 0xf0b,
-0xf58, 0xf0b, 0x3b, 0xf5f, 0xfb3, 0xf0b, 0xf56, 0xf0b, 0x3b, 0xf58, 0xf72, 0xf42, 0xf0b, 0xf51, 0xf58, 0xf62, 0xf0b, 0x3b, 0xf63, 0xfb7,
-0xf42, 0xf0b, 0xf54, 0xf0b, 0x3b, 0xf55, 0xf74, 0xf62, 0xf0b, 0xf56, 0xf74, 0xf0b, 0x3b, 0xf54, 0xf0b, 0xf66, 0xf44, 0xf66, 0xf0b, 0x3b,
-0xf66, 0xfa4, 0xf7a, 0xf53, 0xf0b, 0xf54, 0xf0b, 0x3b, 0xf42, 0xf5f, 0xf60, 0xf0b, 0xf49, 0xf72, 0xf0b, 0xf58, 0xf0b, 0x3b, 0xf42, 0xf5f,
-0xf60, 0xf0b, 0xf5f, 0xfb3, 0xf0b, 0xf56, 0xf0b, 0x3b, 0xf42, 0xf5f, 0xf60, 0xf0b, 0xf58, 0xf72, 0xf42, 0xf0b, 0xf51, 0xf58, 0xf62, 0xf0b,
-0x3b, 0xf42, 0xf5f, 0xf60, 0xf0b, 0xf63, 0xfb7, 0xf42, 0xf0b, 0xf54, 0xf0b, 0x3b, 0xf42, 0xf5f, 0xf60, 0xf0b, 0xf55, 0xf74, 0xf62, 0xf0b,
-0xf56, 0xf74, 0xf0b, 0x3b, 0xf42, 0xf5f, 0xf60, 0xf0b, 0xf54, 0xf0b, 0xf66, 0xf44, 0xf66, 0xf0b, 0x3b, 0xf42, 0xf5f, 0xf60, 0xf0b, 0xf66,
-0xfa4, 0xf7a, 0xf53, 0xf0b, 0xf54, 0xf0b, 0x3b, 0xf49, 0xf72, 0x3b, 0xf5f, 0xfb3, 0x3b, 0xf58, 0xf72, 0xf42, 0x3b, 0xf63, 0xfb7, 0xf42,
-0x3b, 0xf55, 0xf74, 0xf62, 0x3b, 0xf66, 0xf44, 0xf66, 0x3b, 0xf66, 0xfa4, 0xf7a, 0xf53, 0x3b, 0x1230, 0x1295, 0x3b, 0x1230, 0x1291, 0x3b,
-0x1230, 0x1209, 0x3b, 0x1228, 0x1261, 0x3b, 0x1213, 0x1219, 0x3b, 0x12d3, 0x122d, 0x3b, 0x1240, 0x12f3, 0x3b, 0x1230, 0x1295, 0x1260, 0x1275, 0x3b,
-0x1230, 0x1291, 0x12ed, 0x3b, 0x1220, 0x1209, 0x1235, 0x3b, 0x1228, 0x1261, 0x12d5, 0x3b, 0x1283, 0x1219, 0x1235, 0x3b, 0x12d3, 0x122d, 0x1262, 0x3b,
-0x1240, 0x12f3, 0x121d, 0x3b, 0x1230, 0x3b, 0x1230, 0x3b, 0x1220, 0x3b, 0x1228, 0x3b, 0x1213, 0x3b, 0x12d3, 0x3b, 0x1240, 0x3b, 0x1230, 0x3b,
-0x1230, 0x3b, 0x1230, 0x3b, 0x1228, 0x3b, 0x1213, 0x3b, 0x12d3, 0x3b, 0x1240, 0x3b, 0x53, 0x101, 0x70, 0x3b, 0x4d, 0x14d, 0x6e, 0x3b,
-0x54, 0x16b, 0x73, 0x3b, 0x50, 0x75, 0x6c, 0x3b, 0x54, 0x75, 0x2bb, 0x61, 0x3b, 0x46, 0x61, 0x6c, 0x3b, 0x54, 0x6f, 0x6b,
-0x3b, 0x53, 0x101, 0x70, 0x61, 0x74, 0x65, 0x3b, 0x4d, 0x14d, 0x6e, 0x69, 0x74, 0x65, 0x3b, 0x54, 0x16b, 0x73, 0x69, 0x74,
-0x65, 0x3b, 0x50, 0x75, 0x6c, 0x65, 0x6c, 0x75, 0x6c, 0x75, 0x3b, 0x54, 0x75, 0x2bb, 0x61, 0x70, 0x75, 0x6c, 0x65, 0x6c,
-0x75, 0x6c, 0x75, 0x3b, 0x46, 0x61, 0x6c, 0x61, 0x69, 0x74, 0x65, 0x3b, 0x54, 0x6f, 0x6b, 0x6f, 0x6e, 0x61, 0x6b, 0x69,
-0x3b, 0x53, 0x3b, 0x4d, 0x3b, 0x54, 0x3b, 0x50, 0x3b, 0x54, 0x3b, 0x46, 0x3b, 0x54, 0x3b, 0x50, 0x61, 0x7a, 0x3b, 0x50,
-0x7a, 0x74, 0x3b, 0x53, 0x61, 0x6c, 0x3b, 0xc7, 0x61, 0x72, 0x3b, 0x50, 0x65, 0x72, 0x3b, 0x43, 0x75, 0x6d, 0x3b, 0x43,
-0x6d, 0x74, 0x3b, 0x50, 0x61, 0x7a, 0x61, 0x72, 0x3b, 0x50, 0x61, 0x7a, 0x61, 0x72, 0x74, 0x65, 0x73, 0x69, 0x3b, 0x53,
-0x61, 0x6c, 0x131, 0x3b, 0xc7, 0x61, 0x72, 0x15f, 0x61, 0x6d, 0x62, 0x61, 0x3b, 0x50, 0x65, 0x72, 0x15f, 0x65, 0x6d, 0x62,
-0x65, 0x3b, 0x43, 0x75, 0x6d, 0x61, 0x3b, 0x43, 0x75, 0x6d, 0x61, 0x72, 0x74, 0x65, 0x73, 0x69, 0x3b, 0x50, 0x3b, 0x50,
-0x3b, 0x53, 0x3b, 0xc7, 0x3b, 0x50, 0x3b, 0x43, 0x3b, 0x43, 0x3b, 0xdd, 0x65, 0x6b, 0x3b, 0x44, 0x75, 0x15f, 0x3b, 0x53,
-0x69, 0x15f, 0x3b, 0xc7, 0x61, 0x72, 0x3b, 0x50, 0x65, 0x6e, 0x3b, 0x41, 0x6e, 0x6e, 0x3b, 0x15e, 0x65, 0x6e, 0x3b, 0xdd,
-0x65, 0x6b, 0x15f, 0x65, 0x6e, 0x62, 0x65, 0x3b, 0x44, 0x75, 0x15f, 0x65, 0x6e, 0x62, 0x65, 0x3b, 0x53, 0x69, 0x15f, 0x65,
-0x6e, 0x62, 0x65, 0x3b, 0xc7, 0x61, 0x72, 0x15f, 0x65, 0x6e, 0x62, 0x65, 0x3b, 0x50, 0x65, 0x6e, 0x15f, 0x65, 0x6e, 0x62,
-0x65, 0x3b, 0x41, 0x6e, 0x6e, 0x61, 0x3b, 0x15e, 0x65, 0x6e, 0x62, 0x65, 0x3b, 0xdd, 0x3b, 0x44, 0x3b, 0x53, 0x3b, 0xc7,
-0x3b, 0x50, 0x3b, 0x41, 0x3b, 0x15e, 0x3b, 0xfd, 0x65, 0x6b, 0x3b, 0x64, 0x75, 0x15f, 0x3b, 0x73, 0x69, 0x15f, 0x3b, 0xe7,
-0x61, 0x72, 0x3b, 0x70, 0x65, 0x6e, 0x3b, 0x61, 0x6e, 0x6e, 0x3b, 0x15f, 0x65, 0x6e, 0x3b, 0xfd, 0x65, 0x6b, 0x15f, 0x65,
-0x6e, 0x62, 0x65, 0x3b, 0x64, 0x75, 0x15f, 0x65, 0x6e, 0x62, 0x65, 0x3b, 0x73, 0x69, 0x15f, 0x65, 0x6e, 0x62, 0x65, 0x3b,
-0xe7, 0x61, 0x72, 0x15f, 0x65, 0x6e, 0x62, 0x65, 0x3b, 0x70, 0x65, 0x6e, 0x15f, 0x65, 0x6e, 0x62, 0x65, 0x3b, 0x61, 0x6e,
-0x6e, 0x61, 0x3b, 0x15f, 0x65, 0x6e, 0x62, 0x65, 0x3b, 0x64a, 0x6d5, 0x3b, 0x62f, 0x6c8, 0x3b, 0x633, 0x6d5, 0x3b, 0x686, 0x627,
-0x3b, 0x67e, 0x6d5, 0x3b, 0x62c, 0x6c8, 0x3b, 0x634, 0x6d5, 0x3b, 0x64a, 0x6d5, 0x643, 0x634, 0x6d5, 0x646, 0x628, 0x6d5, 0x3b, 0x62f,
-0x6c8, 0x634, 0x6d5, 0x646, 0x628, 0x6d5, 0x3b, 0x633, 0x6d5, 0x64a, 0x634, 0x6d5, 0x646, 0x628, 0x6d5, 0x3b, 0x686, 0x627, 0x631, 0x634,
-0x6d5, 0x646, 0x628, 0x6d5, 0x3b, 0x67e, 0x6d5, 0x64a, 0x634, 0x6d5, 0x646, 0x628, 0x6d5, 0x3b, 0x62c, 0x6c8, 0x645, 0x6d5, 0x3b, 0x634,
-0x6d5, 0x646, 0x628, 0x6d5, 0x3b, 0x64a, 0x3b, 0x62f, 0x3b, 0x633, 0x3b, 0x686, 0x3b, 0x67e, 0x3b, 0x62c, 0x3b, 0x634, 0x3b, 0x43d,
-0x435, 0x434, 0x456, 0x43b, 0x44f, 0x3b, 0x43f, 0x43e, 0x43d, 0x435, 0x434, 0x456, 0x43b, 0x43e, 0x43a, 0x3b, 0x432, 0x456, 0x432, 0x442,
-0x43e, 0x440, 0x43e, 0x43a, 0x3b, 0x441, 0x435, 0x440, 0x435, 0x434, 0x430, 0x3b, 0x447, 0x435, 0x442, 0x432, 0x435, 0x440, 0x3b, 0x43f,
-0x2bc, 0x44f, 0x442, 0x43d, 0x438, 0x446, 0x44f, 0x3b, 0x441, 0x443, 0x431, 0x43e, 0x442, 0x430, 0x3b, 0x41d, 0x3b, 0x41f, 0x3b, 0x412,
-0x3b, 0x421, 0x3b, 0x427, 0x3b, 0x41f, 0x3b, 0x421, 0x3b, 0x627, 0x62a, 0x648, 0x627, 0x631, 0x3b, 0x67e, 0x6cc, 0x631, 0x3b, 0x645,
-0x646, 0x6af, 0x644, 0x3b, 0x628, 0x62f, 0x6be, 0x3b, 0x62c, 0x645, 0x639, 0x631, 0x627, 0x62a, 0x3b, 0x62c, 0x645, 0x639, 0x6c1, 0x3b,
-0x6c1, 0x641, 0x62a, 0x6c1, 0x3b, 0x59, 0x61, 0x6b, 0x3b, 0x44, 0x75, 0x73, 0x68, 0x3b, 0x53, 0x65, 0x73, 0x68, 0x3b, 0x43,
-0x68, 0x6f, 0x72, 0x3b, 0x50, 0x61, 0x79, 0x3b, 0x4a, 0x75, 0x6d, 0x3b, 0x53, 0x68, 0x61, 0x6e, 0x3b, 0x79, 0x61, 0x6b,
-0x73, 0x68, 0x61, 0x6e, 0x62, 0x61, 0x3b, 0x64, 0x75, 0x73, 0x68, 0x61, 0x6e, 0x62, 0x61, 0x3b, 0x73, 0x65, 0x73, 0x68,
-0x61, 0x6e, 0x62, 0x61, 0x3b, 0x63, 0x68, 0x6f, 0x72, 0x73, 0x68, 0x61, 0x6e, 0x62, 0x61, 0x3b, 0x70, 0x61, 0x79, 0x73,
-0x68, 0x61, 0x6e, 0x62, 0x61, 0x3b, 0x6a, 0x75, 0x6d, 0x61, 0x3b, 0x73, 0x68, 0x61, 0x6e, 0x62, 0x61, 0x3b, 0x59, 0x3b,
-0x44, 0x3b, 0x53, 0x3b, 0x43, 0x3b, 0x50, 0x3b, 0x4a, 0x3b, 0x53, 0x3b, 0x6cc, 0x2e, 0x3b, 0x62f, 0x2e, 0x3b, 0x633, 0x2e,
-0x3b, 0x686, 0x2e, 0x3b, 0x67e, 0x2e, 0x3b, 0x62c, 0x2e, 0x3b, 0x634, 0x2e, 0x3b, 0x44f, 0x43a, 0x448, 0x3b, 0x434, 0x443, 0x448,
-0x3b, 0x441, 0x435, 0x448, 0x3b, 0x447, 0x43e, 0x440, 0x3b, 0x43f, 0x430, 0x439, 0x3b, 0x436, 0x443, 0x43c, 0x3b, 0x448, 0x430, 0x43d,
-0x3b, 0x44f, 0x43a, 0x448, 0x430, 0x43d, 0x431, 0x430, 0x3b, 0x434, 0x443, 0x448, 0x430, 0x43d, 0x431, 0x430, 0x3b, 0x441, 0x435, 0x448,
-0x430, 0x43d, 0x431, 0x430, 0x3b, 0x447, 0x43e, 0x440, 0x448, 0x430, 0x43d, 0x431, 0x430, 0x3b, 0x43f, 0x430, 0x439, 0x448, 0x430, 0x43d,
-0x431, 0x430, 0x3b, 0x436, 0x443, 0x43c, 0x430, 0x3b, 0x448, 0x430, 0x43d, 0x431, 0x430, 0x3b, 0x42f, 0x3b, 0x414, 0x3b, 0x421, 0x3b,
-0x427, 0x3b, 0x41f, 0x3b, 0x416, 0x3b, 0x428, 0x3b, 0x43, 0x4e, 0x3b, 0x54, 0x68, 0x20, 0x32, 0x3b, 0x54, 0x68, 0x20, 0x33,
-0x3b, 0x54, 0x68, 0x20, 0x34, 0x3b, 0x54, 0x68, 0x20, 0x35, 0x3b, 0x54, 0x68, 0x20, 0x36, 0x3b, 0x54, 0x68, 0x20, 0x37,
-0x3b, 0x43, 0x68, 0x1ee7, 0x20, 0x4e, 0x68, 0x1ead, 0x74, 0x3b, 0x54, 0x68, 0x1ee9, 0x20, 0x48, 0x61, 0x69, 0x3b, 0x54, 0x68,
-0x1ee9, 0x20, 0x42, 0x61, 0x3b, 0x54, 0x68, 0x1ee9, 0x20, 0x54, 0x1b0, 0x3b, 0x54, 0x68, 0x1ee9, 0x20, 0x4e, 0x103, 0x6d, 0x3b,
-0x54, 0x68, 0x1ee9, 0x20, 0x53, 0xe1, 0x75, 0x3b, 0x54, 0x68, 0x1ee9, 0x20, 0x42, 0x1ea3, 0x79, 0x3b, 0x43, 0x4e, 0x3b, 0x54,
-0x32, 0x3b, 0x54, 0x33, 0x3b, 0x54, 0x34, 0x3b, 0x54, 0x35, 0x3b, 0x54, 0x36, 0x3b, 0x54, 0x37, 0x3b, 0x53, 0x75, 0x3b,
-0x4d, 0x75, 0x3b, 0x54, 0x75, 0x3b, 0x56, 0x65, 0x3b, 0x44, 0xf6, 0x3b, 0x46, 0x72, 0x3b, 0x5a, 0xe4, 0x3b, 0x73, 0x75,
-0x64, 0x65, 0x6c, 0x3b, 0x6d, 0x75, 0x64, 0x65, 0x6c, 0x3b, 0x74, 0x75, 0x64, 0x65, 0x6c, 0x3b, 0x76, 0x65, 0x64, 0x65,
-0x6c, 0x3b, 0x64, 0xf6, 0x64, 0x65, 0x6c, 0x3b, 0x66, 0x72, 0x69, 0x64, 0x65, 0x6c, 0x3b, 0x7a, 0xe4, 0x64, 0x65, 0x6c,
-0x3b, 0x53, 0x3b, 0x4d, 0x3b, 0x54, 0x3b, 0x56, 0x3b, 0x44, 0x3b, 0x46, 0x3b, 0x5a, 0x3b, 0x73, 0x75, 0x2e, 0x3b, 0x6d,
-0x75, 0x2e, 0x3b, 0x74, 0x75, 0x2e, 0x3b, 0x76, 0x65, 0x2e, 0x3b, 0x64, 0xf6, 0x2e, 0x3b, 0x66, 0x72, 0x2e, 0x3b, 0x7a,
-0xe4, 0x2e, 0x3b, 0x53, 0x75, 0x6c, 0x3b, 0x4c, 0x6c, 0x75, 0x6e, 0x3b, 0x4d, 0x61, 0x77, 0x3b, 0x4d, 0x65, 0x72, 0x3b,
-0x49, 0x61, 0x75, 0x3b, 0x47, 0x77, 0x65, 0x3b, 0x53, 0x61, 0x64, 0x3b, 0x44, 0x79, 0x64, 0x64, 0x20, 0x53, 0x75, 0x6c,
-0x3b, 0x44, 0x79, 0x64, 0x64, 0x20, 0x4c, 0x6c, 0x75, 0x6e, 0x3b, 0x44, 0x79, 0x64, 0x64, 0x20, 0x4d, 0x61, 0x77, 0x72,
-0x74, 0x68, 0x3b, 0x44, 0x79, 0x64, 0x64, 0x20, 0x4d, 0x65, 0x72, 0x63, 0x68, 0x65, 0x72, 0x3b, 0x44, 0x79, 0x64, 0x64,
-0x20, 0x49, 0x61, 0x75, 0x3b, 0x44, 0x79, 0x64, 0x64, 0x20, 0x47, 0x77, 0x65, 0x6e, 0x65, 0x72, 0x3b, 0x44, 0x79, 0x64,
-0x64, 0x20, 0x53, 0x61, 0x64, 0x77, 0x72, 0x6e, 0x3b, 0x53, 0x3b, 0x4c, 0x6c, 0x3b, 0x4d, 0x3b, 0x4d, 0x3b, 0x49, 0x3b,
-0x47, 0x3b, 0x53, 0x3b, 0x53, 0x75, 0x6c, 0x3b, 0x4c, 0x6c, 0x75, 0x6e, 0x3b, 0x4d, 0x61, 0x77, 0x3b, 0x4d, 0x65, 0x72,
-0x3b, 0x49, 0x61, 0x75, 0x3b, 0x47, 0x77, 0x65, 0x6e, 0x3b, 0x53, 0x61, 0x64, 0x3b, 0x44, 0x69, 0x62, 0x3b, 0x41, 0x6c,
-0x74, 0x3b, 0x54, 0x61, 0x6c, 0x3b, 0xc0, 0x6c, 0x61, 0x3b, 0x41, 0x6c, 0x78, 0x3b, 0xc0, 0x6a, 0x6a, 0x3b, 0x41, 0x73,
-0x65, 0x3b, 0x44, 0x69, 0x62, 0xe9, 0x65, 0x72, 0x3b, 0x41, 0x6c, 0x74, 0x69, 0x6e, 0x65, 0x3b, 0x54, 0x61, 0x6c, 0x61,
-0x61, 0x74, 0x61, 0x3b, 0xc0, 0x6c, 0x61, 0x72, 0x62, 0x61, 0x3b, 0x41, 0x6c, 0x78, 0x61, 0x6d, 0x69, 0x73, 0x3b, 0xc0,
-0x6a, 0x6a, 0x75, 0x6d, 0x61, 0x3b, 0x41, 0x73, 0x65, 0x65, 0x72, 0x3b, 0x43, 0x61, 0x77, 0x3b, 0x4d, 0x76, 0x75, 0x3b,
-0x42, 0x69, 0x6e, 0x3b, 0x54, 0x68, 0x61, 0x3b, 0x53, 0x69, 0x6e, 0x3b, 0x48, 0x6c, 0x61, 0x3b, 0x4d, 0x67, 0x71, 0x3b,
-0x43, 0x61, 0x77, 0x65, 0x3b, 0x4d, 0x76, 0x75, 0x6c, 0x6f, 0x3b, 0x4c, 0x77, 0x65, 0x73, 0x69, 0x62, 0x69, 0x6e, 0x69,
-0x3b, 0x4c, 0x77, 0x65, 0x73, 0x69, 0x74, 0x68, 0x61, 0x74, 0x68, 0x75, 0x3b, 0x4c, 0x77, 0x65, 0x73, 0x69, 0x6e, 0x65,
-0x3b, 0x4c, 0x77, 0x65, 0x73, 0x69, 0x68, 0x6c, 0x61, 0x6e, 0x75, 0x3b, 0x4d, 0x67, 0x71, 0x69, 0x62, 0x65, 0x6c, 0x6f,
-0x3b, 0x5d6, 0x5d5, 0x5e0, 0x5d8, 0x5d9, 0x5e7, 0x3b, 0x5de, 0x5d0, 0x5b8, 0x5e0, 0x5d8, 0x5d9, 0x5e7, 0x3b, 0x5d3, 0x5d9, 0x5e0, 0x5e1,
-0x5d8, 0x5d9, 0x5e7, 0x3b, 0x5de, 0x5d9, 0x5d8, 0x5d5, 0x5d5, 0x5d0, 0x5da, 0x3b, 0x5d3, 0x5d0, 0x5e0, 0x5e2, 0x5e8, 0x5e9, 0x5d8, 0x5d9,
-0x5e7, 0x3b, 0x5e4, 0x5bf, 0x5e8, 0x5f2, 0x5b7, 0x5d8, 0x5d9, 0x5e7, 0x3b, 0x5e9, 0x5d1, 0x5ea, 0x3b, 0xc0, 0xec, 0x6b, 0x3b, 0x41,
-0x6a, 0x3b, 0xcc, 0x73, 0x1eb9, 0x301, 0x67, 0x3b, 0x1ecc, 0x6a, 0x1ecd, 0x301, 0x72, 0x3b, 0x1ecc, 0x6a, 0x1ecd, 0x301, 0x62, 0x3b,
-0x1eb8, 0x74, 0x3b, 0xc0, 0x62, 0xe1, 0x6d, 0x3b, 0xc0, 0xec, 0x6b, 0xfa, 0x3b, 0x41, 0x6a, 0xe9, 0x3b, 0xcc, 0x73, 0x1eb9,
-0x301, 0x67, 0x75, 0x6e, 0x3b, 0x1ecc, 0x6a, 0x1ecd, 0x301, 0x72, 0xfa, 0x3b, 0x1ecc, 0x6a, 0x1ecd, 0x301, 0x62, 0x1ecd, 0x3b, 0x1eb8,
-0x74, 0xec, 0x3b, 0xc0, 0x62, 0xe1, 0x6d, 0x1eb9, 0x301, 0x74, 0x61, 0x3b, 0xc0, 0x3b, 0x41, 0x3b, 0xcc, 0x3b, 0x1ecc, 0x3b,
-0x1ecc, 0x3b, 0x1eb8, 0x3b, 0xc0, 0x3b, 0x1ecc, 0x6a, 0x1ecd, 0x301, 0x20, 0xc0, 0xec, 0x6b, 0xfa, 0x3b, 0x1ecc, 0x6a, 0x1ecd, 0x301,
-0x20, 0x41, 0x6a, 0xe9, 0x3b, 0x1ecc, 0x6a, 0x1ecd, 0x301, 0x20, 0xcc, 0x73, 0x1eb9, 0x301, 0x67, 0x75, 0x6e, 0x3b, 0x1ecc, 0x6a,
-0x1ecd, 0x301, 0x72, 0xfa, 0x3b, 0x1ecc, 0x6a, 0x1ecd, 0x301, 0x62, 0x1ecd, 0x3b, 0x1ecc, 0x6a, 0x1ecd, 0x301, 0x20, 0x1eb8, 0x74, 0xec,
-0x3b, 0x1ecc, 0x6a, 0x1ecd, 0x301, 0x20, 0xc0, 0x62, 0xe1, 0x6d, 0x1eb9, 0x301, 0x74, 0x61, 0x3b, 0xc0, 0xec, 0x6b, 0x3b, 0x41,
-0x6a, 0x3b, 0xcc, 0x73, 0x25b, 0x301, 0x67, 0x3b, 0x186, 0x6a, 0x254, 0x301, 0x72, 0x3b, 0x186, 0x6a, 0x254, 0x301, 0x62, 0x3b,
-0x190, 0x74, 0x3b, 0xc0, 0x62, 0xe1, 0x6d, 0x3b, 0xc0, 0xec, 0x6b, 0xfa, 0x3b, 0x41, 0x6a, 0xe9, 0x3b, 0xcc, 0x73, 0x25b,
-0x301, 0x67, 0x75, 0x6e, 0x3b, 0x186, 0x6a, 0x254, 0x301, 0x72, 0xfa, 0x3b, 0x186, 0x6a, 0x254, 0x301, 0x62, 0x254, 0x3b, 0x190,
-0x74, 0xec, 0x3b, 0xc0, 0x62, 0xe1, 0x6d, 0x25b, 0x301, 0x74, 0x61, 0x3b, 0xc0, 0x3b, 0x41, 0x3b, 0xcc, 0x3b, 0x186, 0x3b,
-0x186, 0x3b, 0x190, 0x3b, 0xc0, 0x3b, 0x186, 0x6a, 0x254, 0x301, 0x20, 0xc0, 0xec, 0x6b, 0xfa, 0x3b, 0x186, 0x6a, 0x254, 0x301,
-0x20, 0x41, 0x6a, 0xe9, 0x3b, 0x186, 0x6a, 0x254, 0x301, 0x20, 0xcc, 0x73, 0x25b, 0x301, 0x67, 0x75, 0x6e, 0x3b, 0x186, 0x6a,
-0x254, 0x301, 0x72, 0xfa, 0x3b, 0x186, 0x6a, 0x254, 0x301, 0x62, 0x254, 0x3b, 0x186, 0x6a, 0x254, 0x301, 0x20, 0x190, 0x74, 0xec,
-0x3b, 0x186, 0x6a, 0x254, 0x301, 0x20, 0xc0, 0x62, 0xe1, 0x6d, 0x25b, 0x301, 0x74, 0x61, 0x3b, 0x53, 0x6f, 0x6e, 0x3b, 0x4d,
-0x73, 0x6f, 0x3b, 0x42, 0x69, 0x6c, 0x3b, 0x54, 0x68, 0x61, 0x3b, 0x53, 0x69, 0x6e, 0x3b, 0x48, 0x6c, 0x61, 0x3b, 0x4d,
-0x67, 0x71, 0x3b, 0x49, 0x53, 0x6f, 0x6e, 0x74, 0x6f, 0x3b, 0x55, 0x4d, 0x73, 0x6f, 0x6d, 0x62, 0x75, 0x6c, 0x75, 0x6b,
-0x6f, 0x3b, 0x55, 0x4c, 0x77, 0x65, 0x73, 0x69, 0x62, 0x69, 0x6c, 0x69, 0x3b, 0x55, 0x4c, 0x77, 0x65, 0x73, 0x69, 0x74,
-0x68, 0x61, 0x74, 0x68, 0x75, 0x3b, 0x55, 0x4c, 0x77, 0x65, 0x73, 0x69, 0x6e, 0x65, 0x3b, 0x55, 0x4c, 0x77, 0x65, 0x73,
-0x69, 0x68, 0x6c, 0x61, 0x6e, 0x75, 0x3b, 0x55, 0x4d, 0x67, 0x71, 0x69, 0x62, 0x65, 0x6c, 0x6f, 0x3b, 0x53, 0x3b, 0x4d,
-0x3b, 0x42, 0x3b, 0x54, 0x3b, 0x53, 0x3b, 0x48, 0x3b, 0x4d, 0x3b, 0x73, 0xf8, 0x6e, 0x3b, 0x6d, 0xe5, 0x6e, 0x3b, 0x74,
-0x79, 0x73, 0x3b, 0x6f, 0x6e, 0x73, 0x3b, 0x74, 0x6f, 0x72, 0x3b, 0x66, 0x72, 0x65, 0x3b, 0x6c, 0x61, 0x75, 0x3b, 0x73,
-0xf8, 0x6e, 0x64, 0x61, 0x67, 0x3b, 0x6d, 0xe5, 0x6e, 0x64, 0x61, 0x67, 0x3b, 0x74, 0x79, 0x73, 0x64, 0x61, 0x67, 0x3b,
-0x6f, 0x6e, 0x73, 0x64, 0x61, 0x67, 0x3b, 0x74, 0x6f, 0x72, 0x73, 0x64, 0x61, 0x67, 0x3b, 0x66, 0x72, 0x65, 0x64, 0x61,
-0x67, 0x3b, 0x6c, 0x61, 0x75, 0x72, 0x64, 0x61, 0x67, 0x3b, 0x73, 0xf8, 0x2e, 0x3b, 0x6d, 0xe5, 0x2e, 0x3b, 0x74, 0x79,
-0x2e, 0x3b, 0x6f, 0x6e, 0x2e, 0x3b, 0x74, 0x6f, 0x2e, 0x3b, 0x66, 0x72, 0x2e, 0x3b, 0x6c, 0x61, 0x2e, 0x3b, 0x43d, 0x435,
-0x434, 0x3b, 0x43f, 0x43e, 0x43d, 0x3b, 0x443, 0x442, 0x43e, 0x3b, 0x441, 0x440, 0x438, 0x3b, 0x447, 0x435, 0x442, 0x3b, 0x43f, 0x435,
-0x442, 0x3b, 0x441, 0x443, 0x431, 0x3b, 0x43d, 0x435, 0x434, 0x458, 0x435, 0x459, 0x430, 0x3b, 0x43f, 0x43e, 0x43d, 0x435, 0x434, 0x458,
-0x435, 0x459, 0x430, 0x43a, 0x3b, 0x443, 0x442, 0x43e, 0x440, 0x430, 0x43a, 0x3b, 0x441, 0x440, 0x438, 0x458, 0x435, 0x434, 0x430, 0x3b,
-0x447, 0x435, 0x442, 0x432, 0x440, 0x442, 0x430, 0x43a, 0x3b, 0x43f, 0x435, 0x442, 0x430, 0x43a, 0x3b, 0x441, 0x443, 0x431, 0x43e, 0x442,
-0x430, 0x3b, 0x4a, 0x65, 0x64, 0x3b, 0x4a, 0x65, 0x6c, 0x3b, 0x4a, 0x65, 0x6d, 0x3b, 0x4a, 0x65, 0x72, 0x63, 0x3b, 0x4a,
-0x65, 0x72, 0x64, 0x3b, 0x4a, 0x65, 0x68, 0x3b, 0x4a, 0x65, 0x73, 0x3b, 0x4a, 0x65, 0x64, 0x6f, 0x6f, 0x6e, 0x65, 0x65,
-0x3b, 0x4a, 0x65, 0x6c, 0x68, 0x65, 0x69, 0x6e, 0x3b, 0x4a, 0x65, 0x6d, 0x61, 0x79, 0x72, 0x74, 0x3b, 0x4a, 0x65, 0x72,
-0x63, 0x65, 0x61, 0x6e, 0x3b, 0x4a, 0x65, 0x72, 0x64, 0x65, 0x69, 0x6e, 0x3b, 0x4a, 0x65, 0x68, 0x65, 0x69, 0x6e, 0x65,
-0x79, 0x3b, 0x4a, 0x65, 0x73, 0x61, 0x72, 0x6e, 0x3b, 0x53, 0x75, 0x6c, 0x3b, 0x4c, 0x75, 0x6e, 0x3b, 0x4d, 0x74, 0x68,
-0x3b, 0x4d, 0x68, 0x72, 0x3b, 0x59, 0x6f, 0x77, 0x3b, 0x47, 0x77, 0x65, 0x3b, 0x53, 0x61, 0x64, 0x3b, 0x64, 0x79, 0x20,
-0x53, 0x75, 0x6c, 0x3b, 0x64, 0x79, 0x20, 0x4c, 0x75, 0x6e, 0x3b, 0x64, 0x79, 0x20, 0x4d, 0x65, 0x75, 0x72, 0x74, 0x68,
-0x3b, 0x64, 0x79, 0x20, 0x4d, 0x65, 0x72, 0x68, 0x65, 0x72, 0x3b, 0x64, 0x79, 0x20, 0x59, 0x6f, 0x77, 0x3b, 0x64, 0x79,
-0x20, 0x47, 0x77, 0x65, 0x6e, 0x65, 0x72, 0x3b, 0x64, 0x79, 0x20, 0x53, 0x61, 0x64, 0x6f, 0x72, 0x6e, 0x3b, 0x4b, 0x77,
-0x65, 0x3b, 0x44, 0x77, 0x6f, 0x3b, 0x42, 0x65, 0x6e, 0x3b, 0x57, 0x75, 0x6b, 0x3b, 0x59, 0x61, 0x77, 0x3b, 0x46, 0x69,
-0x61, 0x3b, 0x4d, 0x65, 0x6d, 0x3b, 0x4b, 0x77, 0x65, 0x73, 0x69, 0x64, 0x61, 0x3b, 0x44, 0x77, 0x6f, 0x77, 0x64, 0x61,
-0x3b, 0x42, 0x65, 0x6e, 0x61, 0x64, 0x61, 0x3b, 0x57, 0x75, 0x6b, 0x75, 0x64, 0x61, 0x3b, 0x59, 0x61, 0x77, 0x64, 0x61,
-0x3b, 0x46, 0x69, 0x64, 0x61, 0x3b, 0x4d, 0x65, 0x6d, 0x65, 0x6e, 0x65, 0x64, 0x61, 0x3b, 0x4b, 0x3b, 0x44, 0x3b, 0x42,
-0x3b, 0x57, 0x3b, 0x59, 0x3b, 0x46, 0x3b, 0x4d, 0x3b, 0x906, 0x92f, 0x924, 0x93e, 0x930, 0x3b, 0x938, 0x94b, 0x92e, 0x93e, 0x930,
-0x3b, 0x92e, 0x902, 0x917, 0x933, 0x93e, 0x930, 0x3b, 0x92c, 0x941, 0x927, 0x935, 0x93e, 0x930, 0x3b, 0x917, 0x941, 0x930, 0x941, 0x935,
-0x93e, 0x930, 0x3b, 0x936, 0x941, 0x915, 0x94d, 0x930, 0x93e, 0x930, 0x3b, 0x936, 0x947, 0x928, 0x935, 0x93e, 0x930, 0x3b, 0x906, 0x3b,
-0x938, 0x94b, 0x3b, 0x92e, 0x902, 0x3b, 0x92c, 0x941, 0x3b, 0x917, 0x941, 0x3b, 0x936, 0x941, 0x3b, 0x936, 0x947, 0x3b, 0x1ee4, 0x6b,
-0x61, 0x3b, 0x4d, 0x1ecd, 0x6e, 0x3b, 0x54, 0x69, 0x75, 0x3b, 0x57, 0x65, 0x6e, 0x3b, 0x54, 0x1ecd, 0x1ecd, 0x3b, 0x46, 0x72,
-0x61, 0x1ecb, 0x3b, 0x53, 0x61, 0x74, 0x1ecd, 0x64, 0x65, 0x65, 0x3b, 0x1ee4, 0x62, 0x1ecd, 0x63, 0x68, 0x1ecb, 0x20, 0x1ee4, 0x6b,
-0x61, 0x3b, 0x4d, 0x1ecd, 0x6e, 0x64, 0x65, 0x3b, 0x54, 0x69, 0x75, 0x7a, 0x64, 0x65, 0x65, 0x3b, 0x57, 0x65, 0x6e, 0x65,
-0x7a, 0x64, 0x65, 0x65, 0x3b, 0x54, 0x1ecd, 0x1ecd, 0x7a, 0x64, 0x65, 0x65, 0x3b, 0x46, 0x72, 0x61, 0x1ecb, 0x64, 0x65, 0x65,
-0x3b, 0x53, 0x61, 0x74, 0x1ecd, 0x64, 0x65, 0x65, 0x3b, 0x57, 0x6b, 0x79, 0x3b, 0x57, 0x6b, 0x77, 0x3b, 0x57, 0x6b, 0x6c,
-0x3b, 0x57, 0x74, 0x169, 0x3b, 0x57, 0x6b, 0x6e, 0x3b, 0x57, 0x74, 0x6e, 0x3b, 0x57, 0x74, 0x68, 0x3b, 0x57, 0x61, 0x20,
-0x6b, 0x79, 0x75, 0x6d, 0x77, 0x61, 0x3b, 0x57, 0x61, 0x20, 0x6b, 0x77, 0x61, 0x6d, 0x62, 0x129, 0x6c, 0x129, 0x6c, 0x79,
-0x61, 0x3b, 0x57, 0x61, 0x20, 0x6b, 0x65, 0x6c, 0x129, 0x3b, 0x57, 0x61, 0x20, 0x6b, 0x61, 0x74, 0x61, 0x74, 0x169, 0x3b,
-0x57, 0x61, 0x20, 0x6b, 0x61, 0x6e, 0x61, 0x3b, 0x57, 0x61, 0x20, 0x6b, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x3b, 0x57, 0x61,
-0x20, 0x74, 0x68, 0x61, 0x6e, 0x74, 0x68, 0x61, 0x74, 0x169, 0x3b, 0x59, 0x3b, 0x57, 0x3b, 0x45, 0x3b, 0x41, 0x3b, 0x41,
-0x3b, 0x41, 0x3b, 0x41, 0x3b, 0x64, 0x6f, 0x6d, 0x3b, 0x6c, 0x75, 0x6e, 0x3b, 0x6d, 0x61, 0x72, 0x3b, 0x6d, 0x69, 0x65,
-0x3b, 0x6a, 0x6f, 0x69, 0x3b, 0x76, 0x69, 0x6e, 0x3b, 0x73, 0x61, 0x62, 0x3b, 0x64, 0x6f, 0x6d, 0x65, 0x6e, 0x69, 0x65,
-0x3b, 0x6c, 0x75, 0x6e, 0x69, 0x73, 0x3b, 0x6d, 0x61, 0x72, 0x74, 0x61, 0x72, 0x73, 0x3b, 0x6d, 0x69, 0x65, 0x72, 0x63,
-0x75, 0x73, 0x3b, 0x6a, 0x6f, 0x69, 0x62, 0x65, 0x3b, 0x76, 0x69, 0x6e, 0x61, 0x72, 0x73, 0x3b, 0x73, 0x61, 0x62, 0x69,
-0x64, 0x65, 0x3b, 0x6b, 0x254, 0x73, 0x3b, 0x64, 0x7a, 0x6f, 0x3b, 0x62, 0x6c, 0x61, 0x3b, 0x6b, 0x75, 0x256, 0x3b, 0x79,
-0x61, 0x77, 0x3b, 0x66, 0x69, 0x256, 0x3b, 0x6d, 0x65, 0x6d, 0x3b, 0x6b, 0x254, 0x73, 0x69, 0x256, 0x61, 0x3b, 0x64, 0x7a,
-0x6f, 0x256, 0x61, 0x3b, 0x62, 0x6c, 0x61, 0x256, 0x61, 0x3b, 0x6b, 0x75, 0x256, 0x61, 0x3b, 0x79, 0x61, 0x77, 0x6f, 0x256,
-0x61, 0x3b, 0x66, 0x69, 0x256, 0x61, 0x3b, 0x6d, 0x65, 0x6d, 0x6c, 0x65, 0x256, 0x61, 0x3b, 0x6b, 0x3b, 0x64, 0x3b, 0x62,
-0x3b, 0x6b, 0x3b, 0x79, 0x3b, 0x66, 0x3b, 0x6d, 0x3b, 0x4c, 0x50, 0x3b, 0x50, 0x31, 0x3b, 0x50, 0x32, 0x3b, 0x50, 0x33,
-0x3b, 0x50, 0x34, 0x3b, 0x50, 0x35, 0x3b, 0x50, 0x36, 0x3b, 0x4c, 0x101, 0x70, 0x75, 0x6c, 0x65, 0x3b, 0x50, 0x6f, 0x2bb,
-0x61, 0x6b, 0x61, 0x68, 0x69, 0x3b, 0x50, 0x6f, 0x2bb, 0x61, 0x6c, 0x75, 0x61, 0x3b, 0x50, 0x6f, 0x2bb, 0x61, 0x6b, 0x6f,
-0x6c, 0x75, 0x3b, 0x50, 0x6f, 0x2bb, 0x61, 0x68, 0x101, 0x3b, 0x50, 0x6f, 0x2bb, 0x61, 0x6c, 0x69, 0x6d, 0x61, 0x3b, 0x50,
-0x6f, 0x2bb, 0x61, 0x6f, 0x6e, 0x6f, 0x3b, 0x4c, 0x69, 0x6e, 0x3b, 0x4c, 0x75, 0x6e, 0x3b, 0x4d, 0x61, 0x72, 0x3b, 0x4d,
-0x69, 0x79, 0x3b, 0x48, 0x75, 0x77, 0x3b, 0x42, 0x69, 0x79, 0x3b, 0x53, 0x61, 0x62, 0x3b, 0x4c, 0x69, 0x6e, 0x67, 0x67,
-0x6f, 0x3b, 0x4c, 0x75, 0x6e, 0x65, 0x73, 0x3b, 0x4d, 0x61, 0x72, 0x74, 0x65, 0x73, 0x3b, 0x4d, 0x69, 0x79, 0x65, 0x72,
-0x6b, 0x75, 0x6c, 0x65, 0x73, 0x3b, 0x48, 0x75, 0x77, 0x65, 0x62, 0x65, 0x73, 0x3b, 0x42, 0x69, 0x79, 0x65, 0x72, 0x6e,
-0x65, 0x73, 0x3b, 0x53, 0x61, 0x62, 0x61, 0x64, 0x6f, 0x3b, 0x53, 0x75, 0x2e, 0x3b, 0x4d, 0xe4, 0x2e, 0x3b, 0x5a, 0x69,
-0x2e, 0x3b, 0x4d, 0x69, 0x2e, 0x3b, 0x44, 0x75, 0x2e, 0x3b, 0x46, 0x72, 0x2e, 0x3b, 0x53, 0x61, 0x2e, 0x3b, 0x53, 0x75,
-0x6e, 0x6e, 0x74, 0x69, 0x67, 0x3b, 0x4d, 0xe4, 0xe4, 0x6e, 0x74, 0x69, 0x67, 0x3b, 0x5a, 0x69, 0x69, 0x73, 0x63, 0x68,
-0x74, 0x69, 0x67, 0x3b, 0x4d, 0x69, 0x74, 0x74, 0x77, 0x75, 0x63, 0x68, 0x3b, 0x44, 0x75, 0x6e, 0x73, 0x63, 0x68, 0x74,
-0x69, 0x67, 0x3b, 0x46, 0x72, 0x69, 0x69, 0x74, 0x69, 0x67, 0x3b, 0x53, 0x61, 0x6d, 0x73, 0x63, 0x68, 0x74, 0x69, 0x67,
-0x3b, 0xa46d, 0xa18f, 0x3b, 0xa18f, 0xa2cd, 0x3b, 0xa18f, 0xa44d, 0x3b, 0xa18f, 0xa315, 0x3b, 0xa18f, 0xa1d6, 0x3b, 0xa18f, 0xa26c, 0x3b, 0xa18f,
-0xa0d8, 0x3b, 0xa46d, 0xa18f, 0xa44d, 0x3b, 0xa18f, 0xa282, 0xa2cd, 0x3b, 0xa18f, 0xa282, 0xa44d, 0x3b, 0xa18f, 0xa282, 0xa315, 0x3b, 0xa18f, 0xa282,
-0xa1d6, 0x3b, 0xa18f, 0xa282, 0xa26c, 0x3b, 0xa18f, 0xa282, 0xa0d8, 0x3b, 0xa18f, 0x3b, 0xa2cd, 0x3b, 0xa44d, 0x3b, 0xa315, 0x3b, 0xa1d6, 0x3b,
-0xa26c, 0x3b, 0xa0d8, 0x3b, 0x53, 0xfc, 0x2e, 0x3b, 0x4d, 0x61, 0x2e, 0x3b, 0x44, 0x69, 0x2e, 0x3b, 0x4d, 0x69, 0x2e, 0x3b,
-0x44, 0x75, 0x2e, 0x3b, 0x46, 0x72, 0x2e, 0x3b, 0x53, 0x61, 0x2e, 0x3b, 0x53, 0xfc, 0x6e, 0x6e, 0x64, 0x61, 0x67, 0x3b,
-0x4d, 0x61, 0x61, 0x6e, 0x64, 0x61, 0x67, 0x3b, 0x44, 0x69, 0x6e, 0x67, 0x73, 0x64, 0x61, 0x67, 0x3b, 0x4d, 0x69, 0x64,
-0x64, 0x65, 0x77, 0x65, 0x6b, 0x65, 0x6e, 0x3b, 0x44, 0x75, 0x6e, 0x6e, 0x65, 0x72, 0x73, 0x64, 0x61, 0x67, 0x3b, 0x46,
-0x72, 0x65, 0x65, 0x64, 0x61, 0x67, 0x3b, 0x53, 0xfc, 0x6e, 0x6e, 0x61, 0x76, 0x65, 0x6e, 0x64, 0x3b, 0x73, 0x6f, 0x74,
-0x6e, 0x3b, 0x76, 0x75, 0x6f, 0x73, 0x3b, 0x6d, 0x61, 0x14b, 0x3b, 0x67, 0x61, 0x73, 0x6b, 0x3b, 0x64, 0x75, 0x6f, 0x72,
-0x3b, 0x62, 0x65, 0x61, 0x72, 0x3b, 0x6c, 0xe1, 0x76, 0x3b, 0x73, 0x6f, 0x74, 0x6e, 0x61, 0x62, 0x65, 0x61, 0x69, 0x76,
-0x69, 0x3b, 0x76, 0x75, 0x6f, 0x73, 0x73, 0xe1, 0x72, 0x67, 0x61, 0x3b, 0x6d, 0x61, 0x14b, 0x14b, 0x65, 0x62, 0xe1, 0x72,
-0x67, 0x61, 0x3b, 0x67, 0x61, 0x73, 0x6b, 0x61, 0x76, 0x61, 0x68, 0x6b, 0x6b, 0x75, 0x3b, 0x64, 0x75, 0x6f, 0x72, 0x61,
-0x73, 0x64, 0x61, 0x74, 0x3b, 0x62, 0x65, 0x61, 0x72, 0x6a, 0x61, 0x64, 0x61, 0x74, 0x3b, 0x6c, 0xe1, 0x76, 0x76, 0x61,
-0x72, 0x64, 0x61, 0x74, 0x3b, 0x53, 0x3b, 0x56, 0x3b, 0x4d, 0x3b, 0x47, 0x3b, 0x44, 0x3b, 0x42, 0x3b, 0x4c, 0x3b, 0x73,
-0x6f, 0x3b, 0x6d, 0xe1, 0x3b, 0x64, 0x69, 0x3b, 0x67, 0x61, 0x3b, 0x64, 0x75, 0x3b, 0x62, 0x65, 0x3b, 0x6c, 0xe1, 0x3b,
-0x73, 0x6f, 0x74, 0x6e, 0x61, 0x62, 0x65, 0x61, 0x69, 0x76, 0x69, 0x3b, 0x6d, 0xe1, 0x6e, 0x6e, 0x6f, 0x64, 0x61, 0x74,
-0x3b, 0x64, 0x69, 0x73, 0x64, 0x61, 0x74, 0x3b, 0x67, 0x61, 0x73, 0x6b, 0x61, 0x76, 0x61, 0x68, 0x6b, 0x6b, 0x75, 0x3b,
-0x64, 0x75, 0x6f, 0x72, 0x61, 0x73, 0x74, 0x61, 0x74, 0x3b, 0x62, 0x65, 0x61, 0x72, 0x6a, 0x61, 0x64, 0x61, 0x74, 0x3b,
-0x6c, 0xe1, 0x76, 0x76, 0x6f, 0x72, 0x64, 0x61, 0x74, 0x3b, 0x53, 0x3b, 0x4d, 0x3b, 0x44, 0x3b, 0x47, 0x3b, 0x44, 0x3b,
-0x42, 0x3b, 0x4c, 0x3b, 0x43, 0x70, 0x72, 0x3b, 0x43, 0x74, 0x74, 0x3b, 0x43, 0x6d, 0x6e, 0x3b, 0x43, 0x6d, 0x74, 0x3b,
-0x41, 0x72, 0x73, 0x3b, 0x49, 0x63, 0x6d, 0x3b, 0x45, 0x73, 0x74, 0x3b, 0x43, 0x68, 0x75, 0x6d, 0x61, 0x70, 0x69, 0x72,
-0x69, 0x3b, 0x43, 0x68, 0x75, 0x6d, 0x61, 0x74, 0x61, 0x74, 0x6f, 0x3b, 0x43, 0x68, 0x75, 0x6d, 0x61, 0x69, 0x6e, 0x65,
-0x3b, 0x43, 0x68, 0x75, 0x6d, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x3b, 0x41, 0x72, 0x61, 0x6d, 0x69, 0x73, 0x69, 0x3b, 0x49,
-0x63, 0x68, 0x75, 0x6d, 0x61, 0x3b, 0x45, 0x73, 0x61, 0x62, 0x61, 0x74, 0x6f, 0x3b, 0x43, 0x3b, 0x43, 0x3b, 0x43, 0x3b,
-0x43, 0x3b, 0x41, 0x3b, 0x49, 0x3b, 0x45, 0x3b, 0x4a, 0x75, 0x6d, 0x3b, 0x4a, 0x69, 0x6d, 0x3b, 0x4b, 0x61, 0x77, 0x3b,
-0x4b, 0x61, 0x64, 0x3b, 0x4b, 0x61, 0x6e, 0x3b, 0x4b, 0x61, 0x73, 0x3b, 0x4e, 0x67, 0x75, 0x3b, 0x49, 0x74, 0x75, 0x6b,
-0x75, 0x20, 0x6a, 0x61, 0x20, 0x6a, 0x75, 0x6d, 0x77, 0x61, 0x3b, 0x4b, 0x75, 0x72, 0x61, 0x6d, 0x75, 0x6b, 0x61, 0x20,
-0x6a, 0x69, 0x6d, 0x77, 0x65, 0x72, 0x69, 0x3b, 0x4b, 0x75, 0x72, 0x61, 0x6d, 0x75, 0x6b, 0x61, 0x20, 0x6b, 0x61, 0x77,
-0x69, 0x3b, 0x4b, 0x75, 0x72, 0x61, 0x6d, 0x75, 0x6b, 0x61, 0x20, 0x6b, 0x61, 0x64, 0x61, 0x64, 0x75, 0x3b, 0x4b, 0x75,
-0x72, 0x61, 0x6d, 0x75, 0x6b, 0x61, 0x20, 0x6b, 0x61, 0x6e, 0x61, 0x3b, 0x4b, 0x75, 0x72, 0x61, 0x6d, 0x75, 0x6b, 0x61,
-0x20, 0x6b, 0x61, 0x73, 0x61, 0x6e, 0x75, 0x3b, 0x4b, 0x69, 0x66, 0x75, 0x6c, 0x61, 0x20, 0x6e, 0x67, 0x75, 0x77, 0x6f,
-0x3b, 0x4a, 0x3b, 0x4a, 0x3b, 0x4b, 0x3b, 0x4b, 0x3b, 0x4b, 0x3b, 0x4b, 0x3b, 0x4e, 0x3b, 0x64, 0x65, 0x77, 0x3b, 0x61,
-0x61, 0x253, 0x3b, 0x6d, 0x61, 0x77, 0x3b, 0x6e, 0x6a, 0x65, 0x3b, 0x6e, 0x61, 0x61, 0x3b, 0x6d, 0x77, 0x64, 0x3b, 0x68,
-0x62, 0x69, 0x3b, 0x64, 0x65, 0x77, 0x6f, 0x3b, 0x61, 0x61, 0x253, 0x6e, 0x64, 0x65, 0x3b, 0x6d, 0x61, 0x77, 0x62, 0x61,
-0x61, 0x72, 0x65, 0x3b, 0x6e, 0x6a, 0x65, 0x73, 0x6c, 0x61, 0x61, 0x72, 0x65, 0x3b, 0x6e, 0x61, 0x61, 0x73, 0x61, 0x61,
-0x6e, 0x64, 0x65, 0x3b, 0x6d, 0x61, 0x77, 0x6e, 0x64, 0x65, 0x3b, 0x68, 0x6f, 0x6f, 0x72, 0x65, 0x2d, 0x62, 0x69, 0x69,
-0x72, 0x3b, 0x64, 0x3b, 0x61, 0x3b, 0x6d, 0x3b, 0x6e, 0x3b, 0x6e, 0x3b, 0x6d, 0x3b, 0x68, 0x3b, 0x4b, 0x4d, 0x41, 0x3b,
-0x4e, 0x54, 0x54, 0x3b, 0x4e, 0x4d, 0x4e, 0x3b, 0x4e, 0x4d, 0x54, 0x3b, 0x41, 0x52, 0x54, 0x3b, 0x4e, 0x4d, 0x41, 0x3b,
-0x4e, 0x4d, 0x4d, 0x3b, 0x4b, 0x69, 0x75, 0x6d, 0x69, 0x61, 0x3b, 0x4e, 0x6a, 0x75, 0x6d, 0x61, 0x74, 0x61, 0x74, 0x169,
-0x3b, 0x4e, 0x6a, 0x75, 0x6d, 0x61, 0x69, 0x6e, 0x65, 0x3b, 0x4e, 0x6a, 0x75, 0x6d, 0x61, 0x74, 0x61, 0x6e, 0x61, 0x3b,
-0x41, 0x72, 0x61, 0x6d, 0x69, 0x74, 0x68, 0x69, 0x3b, 0x4e, 0x6a, 0x75, 0x6d, 0x61, 0x61, 0x3b, 0x4e, 0x6a, 0x75, 0x6d,
-0x61, 0x6d, 0x6f, 0x74, 0x68, 0x69, 0x3b, 0x4b, 0x3b, 0x4e, 0x3b, 0x4e, 0x3b, 0x4e, 0x3b, 0x41, 0x3b, 0x4e, 0x3b, 0x4e,
-0x3b, 0x41, 0x72, 0x65, 0x3b, 0x4b, 0x75, 0x6e, 0x3b, 0x4f, 0x6e, 0x67, 0x3b, 0x49, 0x6e, 0x65, 0x3b, 0x49, 0x6c, 0x65,
-0x3b, 0x53, 0x61, 0x70, 0x3b, 0x4b, 0x77, 0x65, 0x3b, 0x4d, 0x64, 0x65, 0x72, 0x6f, 0x74, 0x20, 0x65, 0x65, 0x20, 0x61,
-0x72, 0x65, 0x3b, 0x4d, 0x64, 0x65, 0x72, 0x6f, 0x74, 0x20, 0x65, 0x65, 0x20, 0x6b, 0x75, 0x6e, 0x69, 0x3b, 0x4d, 0x64,
-0x65, 0x72, 0x6f, 0x74, 0x20, 0x65, 0x65, 0x20, 0x6f, 0x6e, 0x67, 0x2019, 0x77, 0x61, 0x6e, 0x3b, 0x4d, 0x64, 0x65, 0x72,
-0x6f, 0x74, 0x20, 0x65, 0x65, 0x20, 0x69, 0x6e, 0x65, 0x74, 0x3b, 0x4d, 0x64, 0x65, 0x72, 0x6f, 0x74, 0x20, 0x65, 0x65,
-0x20, 0x69, 0x6c, 0x65, 0x3b, 0x4d, 0x64, 0x65, 0x72, 0x6f, 0x74, 0x20, 0x65, 0x65, 0x20, 0x73, 0x61, 0x70, 0x61, 0x3b,
-0x4d, 0x64, 0x65, 0x72, 0x6f, 0x74, 0x20, 0x65, 0x65, 0x20, 0x6b, 0x77, 0x65, 0x3b, 0x41, 0x3b, 0x4b, 0x3b, 0x4f, 0x3b,
-0x49, 0x3b, 0x49, 0x3b, 0x53, 0x3b, 0x4b, 0x3b, 0x44, 0x69, 0x6d, 0x3b, 0x50, 0x6f, 0x73, 0x3b, 0x50, 0x69, 0x72, 0x3b,
-0x54, 0x61, 0x74, 0x3b, 0x4e, 0x61, 0x69, 0x3b, 0x53, 0x68, 0x61, 0x3b, 0x53, 0x61, 0x62, 0x3b, 0x44, 0x69, 0x6d, 0x69,
-0x6e, 0x67, 0x75, 0x3b, 0x43, 0x68, 0x69, 0x70, 0x6f, 0x73, 0x69, 0x3b, 0x43, 0x68, 0x69, 0x70, 0x69, 0x72, 0x69, 0x3b,
-0x43, 0x68, 0x69, 0x74, 0x61, 0x74, 0x75, 0x3b, 0x43, 0x68, 0x69, 0x6e, 0x61, 0x69, 0x3b, 0x43, 0x68, 0x69, 0x73, 0x68,
-0x61, 0x6e, 0x75, 0x3b, 0x53, 0x61, 0x62, 0x75, 0x64, 0x75, 0x3b, 0x44, 0x3b, 0x50, 0x3b, 0x43, 0x3b, 0x54, 0x3b, 0x4e,
-0x3b, 0x53, 0x3b, 0x53, 0x3b, 0x53, 0x6f, 0x6e, 0x3b, 0x4d, 0x76, 0x75, 0x3b, 0x53, 0x69, 0x62, 0x3b, 0x53, 0x69, 0x74,
-0x3b, 0x53, 0x69, 0x6e, 0x3b, 0x53, 0x69, 0x68, 0x3b, 0x4d, 0x67, 0x71, 0x3b, 0x53, 0x6f, 0x6e, 0x74, 0x6f, 0x3b, 0x4d,
-0x76, 0x75, 0x6c, 0x6f, 0x3b, 0x53, 0x69, 0x62, 0x69, 0x6c, 0x69, 0x3b, 0x53, 0x69, 0x74, 0x68, 0x61, 0x74, 0x68, 0x75,
-0x3b, 0x53, 0x69, 0x6e, 0x65, 0x3b, 0x53, 0x69, 0x68, 0x6c, 0x61, 0x6e, 0x75, 0x3b, 0x4d, 0x67, 0x71, 0x69, 0x62, 0x65,
-0x6c, 0x6f, 0x3b, 0x53, 0x3b, 0x4d, 0x3b, 0x53, 0x3b, 0x53, 0x3b, 0x53, 0x3b, 0x53, 0x3b, 0x4d, 0x3b, 0x49, 0x6a, 0x70,
-0x3b, 0x49, 0x6a, 0x74, 0x3b, 0x49, 0x6a, 0x6e, 0x3b, 0x49, 0x6a, 0x74, 0x6e, 0x3b, 0x41, 0x6c, 0x68, 0x3b, 0x49, 0x6a,
-0x75, 0x3b, 0x49, 0x6a, 0x6d, 0x3b, 0x49, 0x6a, 0x75, 0x6d, 0x61, 0x70, 0x69, 0x6c, 0x69, 0x3b, 0x49, 0x6a, 0x75, 0x6d,
-0x61, 0x74, 0x61, 0x74, 0x75, 0x3b, 0x49, 0x6a, 0x75, 0x6d, 0x61, 0x6e, 0x6e, 0x65, 0x3b, 0x49, 0x6a, 0x75, 0x6d, 0x61,
-0x74, 0x61, 0x6e, 0x6f, 0x3b, 0x41, 0x6c, 0x68, 0x61, 0x6d, 0x69, 0x73, 0x69, 0x3b, 0x49, 0x6a, 0x75, 0x6d, 0x61, 0x61,
-0x3b, 0x49, 0x6a, 0x75, 0x6d, 0x61, 0x6d, 0x6f, 0x73, 0x69, 0x3b, 0x32, 0x3b, 0x33, 0x3b, 0x34, 0x3b, 0x35, 0x3b, 0x36,
-0x3b, 0x37, 0x3b, 0x31, 0x3b, 0x2d30, 0x2d59, 0x2d30, 0x3b, 0x2d30, 0x2d62, 0x2d4f, 0x3b, 0x2d30, 0x2d59, 0x2d49, 0x3b, 0x2d30, 0x2d3d, 0x2d55,
-0x3b, 0x2d30, 0x2d3d, 0x2d61, 0x3b, 0x2d30, 0x2d59, 0x2d49, 0x2d4e, 0x3b, 0x2d30, 0x2d59, 0x2d49, 0x2d39, 0x3b, 0x2d30, 0x2d59, 0x2d30, 0x2d4e, 0x2d30,
-0x2d59, 0x3b, 0x2d30, 0x2d62, 0x2d4f, 0x2d30, 0x2d59, 0x3b, 0x2d30, 0x2d59, 0x2d49, 0x2d4f, 0x2d30, 0x2d59, 0x3b, 0x2d30, 0x2d3d, 0x2d55, 0x2d30, 0x2d59,
-0x3b, 0x2d30, 0x2d3d, 0x2d61, 0x2d30, 0x2d59, 0x3b, 0x2d59, 0x2d49, 0x2d4e, 0x2d61, 0x2d30, 0x2d59, 0x3b, 0x2d30, 0x2d59, 0x2d49, 0x2d39, 0x2d62, 0x2d30,
-0x2d59, 0x3b, 0x61, 0x73, 0x61, 0x3b, 0x61, 0x79, 0x6e, 0x3b, 0x61, 0x73, 0x69, 0x3b, 0x61, 0x6b, 0x1e5b, 0x3b, 0x61, 0x6b,
-0x77, 0x3b, 0x61, 0x73, 0x69, 0x6d, 0x3b, 0x61, 0x73, 0x69, 0x1e0d, 0x3b, 0x61, 0x73, 0x61, 0x6d, 0x61, 0x73, 0x3b, 0x61,
-0x79, 0x6e, 0x61, 0x73, 0x3b, 0x61, 0x73, 0x69, 0x6e, 0x61, 0x73, 0x3b, 0x61, 0x6b, 0x1e5b, 0x61, 0x73, 0x3b, 0x61, 0x6b,
-0x77, 0x61, 0x73, 0x3b, 0x61, 0x73, 0x69, 0x6d, 0x77, 0x61, 0x73, 0x3b, 0x61, 0x73, 0x69, 0x1e0d, 0x79, 0x61, 0x73, 0x3b,
-0x41, 0x63, 0x65, 0x3b, 0x41, 0x72, 0x69, 0x3b, 0x41, 0x72, 0x61, 0x3b, 0x41, 0x68, 0x61, 0x3b, 0x41, 0x6d, 0x68, 0x3b,
-0x53, 0x65, 0x6d, 0x3b, 0x53, 0x65, 0x64, 0x3b, 0x41, 0x63, 0x65, 0x72, 0x3b, 0x41, 0x72, 0x69, 0x6d, 0x3b, 0x41, 0x72,
-0x61, 0x6d, 0x3b, 0x41, 0x68, 0x61, 0x64, 0x3b, 0x41, 0x6d, 0x68, 0x61, 0x64, 0x3b, 0x53, 0x65, 0x6d, 0x3b, 0x53, 0x65,
-0x64, 0x3b, 0x59, 0x3b, 0x53, 0x3b, 0x4b, 0x3b, 0x4b, 0x3b, 0x53, 0x3b, 0x53, 0x3b, 0x53, 0x3b, 0x59, 0x61, 0x6e, 0x3b,
-0x53, 0x61, 0x6e, 0x3b, 0x4b, 0x72, 0x61, 0x1e0d, 0x3b, 0x4b, 0x75, 0x1e93, 0x3b, 0x53, 0x61, 0x6d, 0x3b, 0x53, 0x1e0d, 0x69,
-0x73, 0x3b, 0x53, 0x61, 0x79, 0x3b, 0x59, 0x61, 0x6e, 0x61, 0x73, 0x73, 0x3b, 0x53, 0x61, 0x6e, 0x61, 0x73, 0x73, 0x3b,
-0x4b, 0x72, 0x61, 0x1e0d, 0x61, 0x73, 0x73, 0x3b, 0x4b, 0x75, 0x1e93, 0x61, 0x73, 0x73, 0x3b, 0x53, 0x61, 0x6d, 0x61, 0x73,
-0x73, 0x3b, 0x53, 0x1e0d, 0x69, 0x73, 0x61, 0x73, 0x73, 0x3b, 0x53, 0x61, 0x79, 0x61, 0x73, 0x73, 0x3b, 0x43, 0x3b, 0x52,
-0x3b, 0x41, 0x3b, 0x48, 0x3b, 0x4d, 0x3b, 0x53, 0x3b, 0x44, 0x3b, 0x53, 0x41, 0x4e, 0x3b, 0x4f, 0x52, 0x4b, 0x3b, 0x4f,
-0x4b, 0x42, 0x3b, 0x4f, 0x4b, 0x53, 0x3b, 0x4f, 0x4b, 0x4e, 0x3b, 0x4f, 0x4b, 0x54, 0x3b, 0x4f, 0x4d, 0x4b, 0x3b, 0x53,
-0x61, 0x6e, 0x64, 0x65, 0x3b, 0x4f, 0x72, 0x77, 0x6f, 0x6b, 0x75, 0x62, 0x61, 0x6e, 0x7a, 0x61, 0x3b, 0x4f, 0x72, 0x77,
-0x61, 0x6b, 0x61, 0x62, 0x69, 0x72, 0x69, 0x3b, 0x4f, 0x72, 0x77, 0x61, 0x6b, 0x61, 0x73, 0x68, 0x61, 0x74, 0x75, 0x3b,
-0x4f, 0x72, 0x77, 0x61, 0x6b, 0x61, 0x6e, 0x61, 0x3b, 0x4f, 0x72, 0x77, 0x61, 0x6b, 0x61, 0x74, 0x61, 0x61, 0x6e, 0x6f,
-0x3b, 0x4f, 0x72, 0x77, 0x61, 0x6d, 0x75, 0x6b, 0x61, 0x61, 0x67, 0x61, 0x3b, 0x53, 0x3b, 0x4b, 0x3b, 0x52, 0x3b, 0x53,
-0x3b, 0x4e, 0x3b, 0x54, 0x3b, 0x4d, 0x3b, 0x4d, 0x75, 0x6c, 0x3b, 0x56, 0x69, 0x6c, 0x3b, 0x48, 0x69, 0x76, 0x3b, 0x48,
-0x69, 0x64, 0x3b, 0x48, 0x69, 0x74, 0x3b, 0x48, 0x69, 0x68, 0x3b, 0x4c, 0x65, 0x6d, 0x3b, 0x70, 0x61, 0x20, 0x6d, 0x75,
-0x6c, 0x75, 0x6e, 0x67, 0x75, 0x3b, 0x70, 0x61, 0x20, 0x73, 0x68, 0x61, 0x68, 0x75, 0x76, 0x69, 0x6c, 0x75, 0x68, 0x61,
-0x3b, 0x70, 0x61, 0x20, 0x68, 0x69, 0x76, 0x69, 0x6c, 0x69, 0x3b, 0x70, 0x61, 0x20, 0x68, 0x69, 0x64, 0x61, 0x74, 0x75,
-0x3b, 0x70, 0x61, 0x20, 0x68, 0x69, 0x74, 0x61, 0x79, 0x69, 0x3b, 0x70, 0x61, 0x20, 0x68, 0x69, 0x68, 0x61, 0x6e, 0x75,
-0x3b, 0x70, 0x61, 0x20, 0x73, 0x68, 0x61, 0x68, 0x75, 0x6c, 0x65, 0x6d, 0x62, 0x65, 0x6c, 0x61, 0x3b, 0x4d, 0x3b, 0x4a,
-0x3b, 0x48, 0x3b, 0x48, 0x3b, 0x48, 0x3b, 0x57, 0x3b, 0x4a, 0x3b, 0x4a, 0x70, 0x69, 0x3b, 0x4a, 0x74, 0x74, 0x3b, 0x4a,
-0x6e, 0x6e, 0x3b, 0x4a, 0x74, 0x6e, 0x3b, 0x41, 0x6c, 0x68, 0x3b, 0x49, 0x6a, 0x75, 0x3b, 0x4a, 0x6d, 0x6f, 0x3b, 0x4a,
-0x75, 0x6d, 0x61, 0x70, 0x69, 0x6c, 0x79, 0x69, 0x3b, 0x4a, 0x75, 0x6d, 0x61, 0x74, 0x61, 0x74, 0x75, 0x75, 0x3b, 0x4a,
-0x75, 0x6d, 0x61, 0x6e, 0x6e, 0x65, 0x3b, 0x4a, 0x75, 0x6d, 0x61, 0x74, 0x61, 0x6e, 0x75, 0x3b, 0x41, 0x6c, 0x68, 0x61,
-0x6d, 0x69, 0x73, 0x69, 0x3b, 0x49, 0x6a, 0x75, 0x6d, 0x61, 0x61, 0x3b, 0x4a, 0x75, 0x6d, 0x61, 0x6d, 0x6f, 0x73, 0x69,
-0x3b, 0x4a, 0x3b, 0x4a, 0x3b, 0x4a, 0x3b, 0x4a, 0x3b, 0x41, 0x3b, 0x49, 0x3b, 0x4a, 0x3b, 0x6b, 0x61, 0x72, 0x3b, 0x6e,
-0x74, 0x25b, 0x3b, 0x74, 0x61, 0x72, 0x3b, 0x61, 0x72, 0x61, 0x3b, 0x61, 0x6c, 0x61, 0x3b, 0x6a, 0x75, 0x6d, 0x3b, 0x73,
-0x69, 0x62, 0x3b, 0x6b, 0x61, 0x72, 0x69, 0x3b, 0x6e, 0x74, 0x25b, 0x6e, 0x25b, 0x3b, 0x74, 0x61, 0x72, 0x61, 0x74, 0x61,
-0x3b, 0x61, 0x72, 0x61, 0x62, 0x61, 0x3b, 0x61, 0x6c, 0x61, 0x6d, 0x69, 0x73, 0x61, 0x3b, 0x6a, 0x75, 0x6d, 0x61, 0x3b,
-0x73, 0x69, 0x62, 0x69, 0x72, 0x69, 0x3b, 0x4b, 0x3b, 0x4e, 0x3b, 0x54, 0x3b, 0x41, 0x3b, 0x41, 0x3b, 0x4a, 0x3b, 0x53,
-0x3b, 0x4b, 0x6d, 0x61, 0x3b, 0x54, 0x61, 0x74, 0x3b, 0x49, 0x6e, 0x65, 0x3b, 0x54, 0x61, 0x6e, 0x3b, 0x41, 0x72, 0x6d,
-0x3b, 0x4d, 0x61, 0x61, 0x3b, 0x4e, 0x4d, 0x4d, 0x3b, 0x4b, 0x69, 0x75, 0x6d, 0x69, 0x61, 0x3b, 0x4e, 0x6a, 0x75, 0x6d,
-0x61, 0x74, 0x61, 0x74, 0x75, 0x3b, 0x4e, 0x6a, 0x75, 0x6d, 0x61, 0x69, 0x6e, 0x65, 0x3b, 0x4e, 0x6a, 0x75, 0x6d, 0x61,
-0x74, 0x61, 0x6e, 0x6f, 0x3b, 0x41, 0x72, 0x61, 0x6d, 0x69, 0x74, 0x68, 0x69, 0x3b, 0x4e, 0x6a, 0x75, 0x6d, 0x61, 0x61,
-0x3b, 0x4e, 0x4a, 0x75, 0x6d, 0x61, 0x6d, 0x6f, 0x74, 0x68, 0x69, 0x69, 0x3b, 0x4b, 0x3b, 0x4e, 0x3b, 0x4e, 0x3b, 0x4e,
-0x3b, 0x41, 0x3b, 0x4d, 0x3b, 0x4e, 0x3b, 0x13c6, 0x13cd, 0x13ac, 0x3b, 0x13c9, 0x13c5, 0x13af, 0x3b, 0x13d4, 0x13b5, 0x13c1, 0x3b, 0x13e6,
-0x13a2, 0x13c1, 0x3b, 0x13c5, 0x13a9, 0x13c1, 0x3b, 0x13e7, 0x13be, 0x13a9, 0x3b, 0x13c8, 0x13d5, 0x13be, 0x3b, 0x13a4, 0x13be, 0x13d9, 0x13d3, 0x13c6,
-0x13cd, 0x13ac, 0x3b, 0x13a4, 0x13be, 0x13d9, 0x13d3, 0x13c9, 0x13c5, 0x13af, 0x3b, 0x13d4, 0x13b5, 0x13c1, 0x13a2, 0x13a6, 0x3b, 0x13e6, 0x13a2, 0x13c1,
-0x13a2, 0x13a6, 0x3b, 0x13c5, 0x13a9, 0x13c1, 0x13a2, 0x13a6, 0x3b, 0x13e7, 0x13be, 0x13a9, 0x13b6, 0x13cd, 0x13d7, 0x3b, 0x13a4, 0x13be, 0x13d9, 0x13d3,
-0x13c8, 0x13d5, 0x13be, 0x3b, 0x13c6, 0x3b, 0x13c9, 0x3b, 0x13d4, 0x3b, 0x13e6, 0x3b, 0x13c5, 0x3b, 0x13e7, 0x3b, 0x13a4, 0x3b, 0x64, 0x69,
-0x6d, 0x3b, 0x6c, 0x69, 0x6e, 0x3b, 0x6d, 0x61, 0x72, 0x3b, 0x6d, 0x65, 0x72, 0x3b, 0x7a, 0x65, 0x3b, 0x76, 0x61, 0x6e,
-0x3b, 0x73, 0x61, 0x6d, 0x3b, 0x64, 0x69, 0x6d, 0x61, 0x6e, 0x73, 0x3b, 0x6c, 0x69, 0x6e, 0x64, 0x69, 0x3b, 0x6d, 0x61,
-0x72, 0x64, 0x69, 0x3b, 0x6d, 0x65, 0x72, 0x6b, 0x72, 0x65, 0x64, 0x69, 0x3b, 0x7a, 0x65, 0x64, 0x69, 0x3b, 0x76, 0x61,
-0x6e, 0x64, 0x72, 0x65, 0x64, 0x69, 0x3b, 0x73, 0x61, 0x6d, 0x64, 0x69, 0x3b, 0x64, 0x3b, 0x6c, 0x3b, 0x6d, 0x3b, 0x6d,
-0x3b, 0x7a, 0x3b, 0x76, 0x3b, 0x73, 0x3b, 0x4c, 0x6c, 0x32, 0x3b, 0x4c, 0x6c, 0x33, 0x3b, 0x4c, 0x6c, 0x34, 0x3b, 0x4c,
-0x6c, 0x35, 0x3b, 0x4c, 0x6c, 0x36, 0x3b, 0x4c, 0x6c, 0x37, 0x3b, 0x4c, 0x6c, 0x31, 0x3b, 0x4c, 0x69, 0x64, 0x75, 0x76,
-0x61, 0x20, 0x6c, 0x79, 0x61, 0x70, 0x69, 0x6c, 0x69, 0x3b, 0x4c, 0x69, 0x64, 0x75, 0x76, 0x61, 0x20, 0x6c, 0x79, 0x61,
-0x74, 0x61, 0x74, 0x75, 0x3b, 0x4c, 0x69, 0x64, 0x75, 0x76, 0x61, 0x20, 0x6c, 0x79, 0x61, 0x6e, 0x63, 0x68, 0x65, 0x63,
-0x68, 0x69, 0x3b, 0x4c, 0x69, 0x64, 0x75, 0x76, 0x61, 0x20, 0x6c, 0x79, 0x61, 0x6e, 0x6e, 0x79, 0x61, 0x6e, 0x6f, 0x3b,
-0x4c, 0x69, 0x64, 0x75, 0x76, 0x61, 0x20, 0x6c, 0x79, 0x61, 0x6e, 0x6e, 0x79, 0x61, 0x6e, 0x6f, 0x20, 0x6e, 0x61, 0x20,
-0x6c, 0x69, 0x6e, 0x6a, 0x69, 0x3b, 0x4c, 0x69, 0x64, 0x75, 0x76, 0x61, 0x20, 0x6c, 0x79, 0x61, 0x6e, 0x6e, 0x79, 0x61,
-0x6e, 0x6f, 0x20, 0x6e, 0x61, 0x20, 0x6d, 0x61, 0x76, 0x69, 0x6c, 0x69, 0x3b, 0x4c, 0x69, 0x64, 0x75, 0x76, 0x61, 0x20,
-0x6c, 0x69, 0x74, 0x61, 0x6e, 0x64, 0x69, 0x3b, 0x50, 0xed, 0x69, 0x6c, 0x69, 0x3b, 0x54, 0xe1, 0x61, 0x74, 0x75, 0x3b,
-0xcd, 0x6e, 0x65, 0x3b, 0x54, 0xe1, 0x61, 0x6e, 0x6f, 0x3b, 0x41, 0x6c, 0x68, 0x3b, 0x49, 0x6a, 0x6d, 0x3b, 0x4d, 0xf3,
-0x6f, 0x73, 0x69, 0x3b, 0x4a, 0x75, 0x6d, 0x61, 0x70, 0xed, 0x69, 0x72, 0x69, 0x3b, 0x4a, 0x75, 0x6d, 0x61, 0x74, 0xe1,
-0x74, 0x75, 0x3b, 0x4a, 0x75, 0x6d, 0x61, 0xed, 0x6e, 0x65, 0x3b, 0x4a, 0x75, 0x6d, 0x61, 0x74, 0xe1, 0x61, 0x6e, 0x6f,
-0x3b, 0x41, 0x6c, 0x61, 0x6d, 0xed, 0x69, 0x73, 0x69, 0x3b, 0x49, 0x6a, 0x75, 0x6d, 0xe1, 0x61, 0x3b, 0x4a, 0x75, 0x6d,
-0x61, 0x6d, 0xf3, 0x6f, 0x73, 0x69, 0x3b, 0x50, 0x3b, 0x54, 0x3b, 0x45, 0x3b, 0x4f, 0x3b, 0x41, 0x3b, 0x49, 0x3b, 0x4d,
-0x3b, 0x53, 0x61, 0x62, 0x3b, 0x42, 0x61, 0x6c, 0x3b, 0x4c, 0x77, 0x32, 0x3b, 0x4c, 0x77, 0x33, 0x3b, 0x4c, 0x77, 0x34,
-0x3b, 0x4c, 0x77, 0x35, 0x3b, 0x4c, 0x77, 0x36, 0x3b, 0x53, 0x61, 0x62, 0x62, 0x69, 0x69, 0x74, 0x69, 0x3b, 0x42, 0x61,
-0x6c, 0x61, 0x7a, 0x61, 0x3b, 0x4c, 0x77, 0x61, 0x6b, 0x75, 0x62, 0x69, 0x72, 0x69, 0x3b, 0x4c, 0x77, 0x61, 0x6b, 0x75,
-0x73, 0x61, 0x74, 0x75, 0x3b, 0x4c, 0x77, 0x61, 0x6b, 0x75, 0x6e, 0x61, 0x3b, 0x4c, 0x77, 0x61, 0x6b, 0x75, 0x74, 0x61,
-0x61, 0x6e, 0x6f, 0x3b, 0x4c, 0x77, 0x61, 0x6d, 0x75, 0x6b, 0x61, 0x61, 0x67, 0x61, 0x3b, 0x53, 0x3b, 0x42, 0x3b, 0x4c,
-0x3b, 0x4c, 0x3b, 0x4c, 0x3b, 0x4c, 0x3b, 0x4c, 0x3b, 0x50, 0x61, 0x20, 0x4d, 0x75, 0x6c, 0x75, 0x6e, 0x67, 0x75, 0x3b,
-0x50, 0x61, 0x6c, 0x69, 0x63, 0x68, 0x69, 0x6d, 0x6f, 0x3b, 0x50, 0x61, 0x6c, 0x69, 0x63, 0x68, 0x69, 0x62, 0x75, 0x6c,
-0x69, 0x3b, 0x50, 0x61, 0x6c, 0x69, 0x63, 0x68, 0x69, 0x74, 0x61, 0x74, 0x75, 0x3b, 0x50, 0x61, 0x6c, 0x69, 0x63, 0x68,
-0x69, 0x6e, 0x65, 0x3b, 0x50, 0x61, 0x6c, 0x69, 0x63, 0x68, 0x69, 0x73, 0x61, 0x6e, 0x6f, 0x3b, 0x50, 0x61, 0x63, 0x68,
-0x69, 0x62, 0x65, 0x6c, 0x75, 0x73, 0x68, 0x69, 0x3b, 0x64, 0x75, 0x6d, 0x3b, 0x73, 0x69, 0x67, 0x3b, 0x74, 0x65, 0x72,
-0x3b, 0x6b, 0x75, 0x61, 0x3b, 0x6b, 0x69, 0x6e, 0x3b, 0x73, 0x65, 0x73, 0x3b, 0x73, 0x61, 0x62, 0x3b, 0x64, 0x75, 0x6d,
-0x69, 0x6e, 0x67, 0x75, 0x3b, 0x73, 0x69, 0x67, 0x75, 0x6e, 0x64, 0x61, 0x2d, 0x66, 0x65, 0x72, 0x61, 0x3b, 0x74, 0x65,
-0x72, 0x73, 0x61, 0x2d, 0x66, 0x65, 0x72, 0x61, 0x3b, 0x6b, 0x75, 0x61, 0x72, 0x74, 0x61, 0x2d, 0x66, 0x65, 0x72, 0x61,
-0x3b, 0x6b, 0x69, 0x6e, 0x74, 0x61, 0x2d, 0x66, 0x65, 0x72, 0x61, 0x3b, 0x73, 0x65, 0x73, 0x74, 0x61, 0x2d, 0x66, 0x65,
-0x72, 0x61, 0x3b, 0x73, 0xe1, 0x62, 0x61, 0x64, 0x75, 0x3b, 0x44, 0x3b, 0x53, 0x3b, 0x54, 0x3b, 0x4b, 0x3b, 0x4b, 0x3b,
-0x53, 0x3b, 0x53, 0x3b, 0x64, 0x75, 0x6d, 0x69, 0x6e, 0x67, 0x75, 0x3b, 0x73, 0x69, 0x67, 0x75, 0x6e, 0x64, 0x61, 0x2d,
-0x66, 0x65, 0x72, 0x61, 0x3b, 0x74, 0x65, 0x72, 0x73, 0x61, 0x2d, 0x66, 0x65, 0x72, 0x61, 0x3b, 0x6b, 0x75, 0x61, 0x72,
-0x74, 0x61, 0x2d, 0x66, 0x65, 0x72, 0x61, 0x3b, 0x6b, 0x69, 0x6e, 0x74, 0x61, 0x2d, 0x66, 0x65, 0x72, 0x61, 0x3b, 0x73,
-0x65, 0x73, 0x74, 0x61, 0x2d, 0x66, 0x65, 0x72, 0x61, 0x3b, 0x73, 0x61, 0x62, 0x61, 0x64, 0x75, 0x3b, 0x4b, 0x49, 0x55,
-0x3b, 0x4d, 0x52, 0x41, 0x3b, 0x57, 0x41, 0x49, 0x3b, 0x57, 0x45, 0x54, 0x3b, 0x57, 0x45, 0x4e, 0x3b, 0x57, 0x54, 0x4e,
-0x3b, 0x4a, 0x55, 0x4d, 0x3b, 0x4b, 0x69, 0x75, 0x6d, 0x69, 0x61, 0x3b, 0x4d, 0x75, 0x72, 0x61, 0x6d, 0x75, 0x6b, 0x6f,
-0x3b, 0x57, 0x61, 0x69, 0x72, 0x69, 0x3b, 0x57, 0x65, 0x74, 0x68, 0x61, 0x74, 0x75, 0x3b, 0x57, 0x65, 0x6e, 0x61, 0x3b,
-0x57, 0x65, 0x74, 0x61, 0x6e, 0x6f, 0x3b, 0x4a, 0x75, 0x6d, 0x61, 0x6d, 0x6f, 0x73, 0x69, 0x3b, 0x4b, 0x3b, 0x4d, 0x3b,
-0x57, 0x3b, 0x57, 0x3b, 0x57, 0x3b, 0x57, 0x3b, 0x4a, 0x3b, 0x4b, 0x74, 0x73, 0x3b, 0x4b, 0x6f, 0x74, 0x3b, 0x4b, 0x6f,
-0x6f, 0x3b, 0x4b, 0x6f, 0x73, 0x3b, 0x4b, 0x6f, 0x61, 0x3b, 0x4b, 0x6f, 0x6d, 0x3b, 0x4b, 0x6f, 0x6c, 0x3b, 0x4b, 0x6f,
-0x74, 0x69, 0x73, 0x61, 0x70, 0x3b, 0x4b, 0x6f, 0x74, 0x61, 0x61, 0x69, 0x3b, 0x4b, 0x6f, 0x61, 0x65, 0x6e, 0x67, 0x2019,
-0x3b, 0x4b, 0x6f, 0x73, 0x6f, 0x6d, 0x6f, 0x6b, 0x3b, 0x4b, 0x6f, 0x61, 0x6e, 0x67, 0x2019, 0x77, 0x61, 0x6e, 0x3b, 0x4b,
-0x6f, 0x6d, 0x75, 0x75, 0x74, 0x3b, 0x4b, 0x6f, 0x6c, 0x6f, 0x3b, 0x54, 0x3b, 0x54, 0x3b, 0x4f, 0x3b, 0x53, 0x3b, 0x41,
-0x3b, 0x4d, 0x3b, 0x4c, 0x3b, 0x53, 0x6f, 0x6e, 0x3b, 0x4d, 0x61, 0x3b, 0x44, 0x65, 0x3b, 0x57, 0x75, 0x3b, 0x44, 0x6f,
-0x3b, 0x46, 0x72, 0x3b, 0x53, 0x61, 0x74, 0x3b, 0x53, 0x6f, 0x6e, 0x74, 0x61, 0x78, 0x74, 0x73, 0x65, 0x65, 0x73, 0x3b,
-0x4d, 0x61, 0x6e, 0x74, 0x61, 0x78, 0x74, 0x73, 0x65, 0x65, 0x73, 0x3b, 0x44, 0x65, 0x6e, 0x73, 0x74, 0x61, 0x78, 0x74,
-0x73, 0x65, 0x65, 0x73, 0x3b, 0x57, 0x75, 0x6e, 0x73, 0x74, 0x61, 0x78, 0x74, 0x73, 0x65, 0x65, 0x73, 0x3b, 0x44, 0x6f,
-0x6e, 0x64, 0x65, 0x72, 0x74, 0x61, 0x78, 0x74, 0x73, 0x65, 0x65, 0x73, 0x3b, 0x46, 0x72, 0x61, 0x69, 0x74, 0x61, 0x78,
-0x74, 0x73, 0x65, 0x65, 0x73, 0x3b, 0x53, 0x61, 0x74, 0x65, 0x72, 0x74, 0x61, 0x78, 0x74, 0x73, 0x65, 0x65, 0x73, 0x3b,
-0x53, 0x3b, 0x4d, 0x3b, 0x45, 0x3b, 0x57, 0x3b, 0x44, 0x3b, 0x46, 0x3b, 0x41, 0x3b, 0x53, 0x75, 0x2e, 0x3b, 0x4d, 0x6f,
-0x2e, 0x3b, 0x44, 0x69, 0x2e, 0x3b, 0x4d, 0x65, 0x2e, 0x3b, 0x44, 0x75, 0x2e, 0x3b, 0x46, 0x72, 0x2e, 0x3b, 0x53, 0x61,
-0x2e, 0x3b, 0x53, 0x75, 0x6e, 0x6e, 0x64, 0x61, 0x61, 0x63, 0x68, 0x3b, 0x4d, 0x6f, 0x68, 0x6e, 0x64, 0x61, 0x61, 0x63,
-0x68, 0x3b, 0x44, 0x69, 0x6e, 0x6e, 0x73, 0x64, 0x61, 0x61, 0x63, 0x68, 0x3b, 0x4d, 0x65, 0x74, 0x77, 0x6f, 0x63, 0x68,
-0x3b, 0x44, 0x75, 0x6e, 0x6e, 0x65, 0x72, 0x73, 0x64, 0x61, 0x61, 0x63, 0x68, 0x3b, 0x46, 0x72, 0x69, 0x69, 0x64, 0x61,
-0x61, 0x63, 0x68, 0x3b, 0x53, 0x61, 0x6d, 0x73, 0x64, 0x61, 0x61, 0x63, 0x68, 0x3b, 0x4a, 0x75, 0x6d, 0x61, 0x70, 0xed,
-0x6c, 0xed, 0x3b, 0x4a, 0x75, 0x6d, 0x61, 0x74, 0xe1, 0x74, 0x75, 0x3b, 0x4a, 0x75, 0x6d, 0x61, 0x6e, 0x65, 0x3b, 0x4a,
-0x75, 0x6d, 0x61, 0x74, 0xe1, 0x6e, 0x254, 0x3b, 0x41, 0x6c, 0x61, 0xe1, 0x6d, 0x69, 0x73, 0x69, 0x3b, 0x4a, 0x75, 0x6d,
-0xe1, 0x61, 0x3b, 0x4a, 0x75, 0x6d, 0x61, 0x6d, 0xf3, 0x73, 0x69, 0x3b, 0x53, 0x61, 0x62, 0x69, 0x3b, 0x42, 0x61, 0x6c,
-0x61, 0x3b, 0x4b, 0x75, 0x62, 0x69, 0x3b, 0x4b, 0x75, 0x73, 0x61, 0x3b, 0x4b, 0x75, 0x6e, 0x61, 0x3b, 0x4b, 0x75, 0x74,
-0x61, 0x3b, 0x4d, 0x75, 0x6b, 0x61, 0x3b, 0x53, 0x61, 0x62, 0x69, 0x69, 0x74, 0x69, 0x3b, 0x42, 0x61, 0x6c, 0x61, 0x7a,
-0x61, 0x3b, 0x4f, 0x77, 0x6f, 0x6b, 0x75, 0x62, 0x69, 0x6c, 0x69, 0x3b, 0x4f, 0x77, 0x6f, 0x6b, 0x75, 0x73, 0x61, 0x74,
-0x75, 0x3b, 0x4f, 0x6c, 0x6f, 0x6b, 0x75, 0x6e, 0x61, 0x3b, 0x4f, 0x6c, 0x6f, 0x6b, 0x75, 0x74, 0x61, 0x61, 0x6e, 0x75,
-0x3b, 0x4f, 0x6c, 0x6f, 0x6d, 0x75, 0x6b, 0x61, 0x61, 0x67, 0x61, 0x3b, 0x53, 0x3b, 0x42, 0x3b, 0x42, 0x3b, 0x53, 0x3b,
-0x4b, 0x3b, 0x4b, 0x3b, 0x4d, 0x3b, 0x4a, 0x32, 0x3b, 0x4a, 0x33, 0x3b, 0x4a, 0x34, 0x3b, 0x4a, 0x35, 0x3b, 0x41, 0x6c,
-0x3b, 0x49, 0x6a, 0x3b, 0x4a, 0x31, 0x3b, 0x4a, 0x75, 0x6d, 0x61, 0x70, 0x69, 0x72, 0x69, 0x3b, 0x4a, 0x75, 0x6d, 0x61,
-0x74, 0x61, 0x74, 0x75, 0x3b, 0x4a, 0x75, 0x6d, 0x61, 0x6e, 0x6e, 0x65, 0x3b, 0x4a, 0x75, 0x6d, 0x61, 0x74, 0x61, 0x6e,
-0x6f, 0x3b, 0x4d, 0x75, 0x72, 0x77, 0x61, 0x20, 0x77, 0x61, 0x20, 0x4b, 0x61, 0x6e, 0x6e, 0x65, 0x3b, 0x4d, 0x75, 0x72,
-0x77, 0x61, 0x20, 0x77, 0x61, 0x20, 0x4b, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x3b, 0x4a, 0x75, 0x6d, 0x61, 0x6d, 0x6f, 0x73,
-0x69, 0x3b, 0x4a, 0x70, 0x69, 0x3b, 0x4a, 0x74, 0x74, 0x3b, 0x4a, 0x6e, 0x6e, 0x3b, 0x4a, 0x74, 0x6e, 0x3b, 0x41, 0x6c,
-0x68, 0x3b, 0x49, 0x6a, 0x6d, 0x3b, 0x4a, 0x6d, 0x6f, 0x3b, 0x4a, 0x75, 0x6d, 0x3b, 0x42, 0x61, 0x72, 0x3b, 0x41, 0x61,
-0x72, 0x3b, 0x55, 0x6e, 0x69, 0x3b, 0x55, 0x6e, 0x67, 0x3b, 0x4b, 0x61, 0x6e, 0x3b, 0x53, 0x61, 0x62, 0x3b, 0x4e, 0x61,
-0x6b, 0x61, 0x65, 0x6a, 0x75, 0x6d, 0x61, 0x3b, 0x4e, 0x61, 0x6b, 0x61, 0x65, 0x62, 0x61, 0x72, 0x61, 0x73, 0x61, 0x3b,
-0x4e, 0x61, 0x6b, 0x61, 0x61, 0x72, 0x65, 0x3b, 0x4e, 0x61, 0x6b, 0x61, 0x75, 0x6e, 0x69, 0x3b, 0x4e, 0x61, 0x6b, 0x61,
-0x75, 0x6e, 0x67, 0x2019, 0x6f, 0x6e, 0x3b, 0x4e, 0x61, 0x6b, 0x61, 0x6b, 0x61, 0x6e, 0x79, 0x3b, 0x4e, 0x61, 0x6b, 0x61,
-0x73, 0x61, 0x62, 0x69, 0x74, 0x69, 0x3b, 0x4a, 0x3b, 0x42, 0x3b, 0x41, 0x3b, 0x55, 0x3b, 0x55, 0x3b, 0x4b, 0x3b, 0x53,
-0x3b, 0x41, 0x6c, 0x68, 0x3b, 0x41, 0x74, 0x69, 0x3b, 0x41, 0x74, 0x61, 0x3b, 0x41, 0x6c, 0x61, 0x3b, 0x41, 0x6c, 0x6d,
-0x3b, 0x41, 0x6c, 0x6a, 0x3b, 0x41, 0x73, 0x73, 0x3b, 0x41, 0x6c, 0x68, 0x61, 0x64, 0x69, 0x3b, 0x41, 0x74, 0x69, 0x6e,
-0x69, 0x3b, 0x41, 0x74, 0x61, 0x6c, 0x61, 0x74, 0x61, 0x3b, 0x41, 0x6c, 0x61, 0x72, 0x62, 0x61, 0x3b, 0x41, 0x6c, 0x68,
-0x61, 0x6d, 0x69, 0x69, 0x73, 0x61, 0x3b, 0x41, 0x6c, 0x6a, 0x75, 0x6d, 0x61, 0x3b, 0x41, 0x73, 0x73, 0x61, 0x62, 0x64,
-0x75, 0x3b, 0x48, 0x3b, 0x54, 0x3b, 0x54, 0x3b, 0x4c, 0x3b, 0x4c, 0x3b, 0x4c, 0x3b, 0x53, 0x3b, 0x4a, 0x4d, 0x50, 0x3b,
-0x57, 0x55, 0x54, 0x3b, 0x54, 0x41, 0x52, 0x3b, 0x54, 0x41, 0x44, 0x3b, 0x54, 0x41, 0x4e, 0x3b, 0x54, 0x41, 0x42, 0x3b,
-0x4e, 0x47, 0x53, 0x3b, 0x4a, 0x75, 0x6d, 0x61, 0x70, 0x69, 0x6c, 0x3b, 0x57, 0x75, 0x6f, 0x6b, 0x20, 0x54, 0x69, 0x63,
-0x68, 0x3b, 0x54, 0x69, 0x63, 0x68, 0x20, 0x41, 0x72, 0x69, 0x79, 0x6f, 0x3b, 0x54, 0x69, 0x63, 0x68, 0x20, 0x41, 0x64,
-0x65, 0x6b, 0x3b, 0x54, 0x69, 0x63, 0x68, 0x20, 0x41, 0x6e, 0x67, 0x2019, 0x77, 0x65, 0x6e, 0x3b, 0x54, 0x69, 0x63, 0x68,
-0x20, 0x41, 0x62, 0x69, 0x63, 0x68, 0x3b, 0x4e, 0x67, 0x65, 0x73, 0x6f, 0x3b, 0x4a, 0x3b, 0x57, 0x3b, 0x54, 0x3b, 0x54,
-0x3b, 0x54, 0x3b, 0x54, 0x3b, 0x4e, 0x3b, 0x41, 0x73, 0x61, 0x3b, 0x41, 0x79, 0x6e, 0x3b, 0x41, 0x73, 0x6e, 0x3b, 0x41,
-0x6b, 0x72, 0x3b, 0x41, 0x6b, 0x77, 0x3b, 0x41, 0x73, 0x6d, 0x3b, 0x41, 0x73, 0x1e0d, 0x3b, 0x41, 0x73, 0x61, 0x6d, 0x61,
-0x73, 0x3b, 0x41, 0x79, 0x6e, 0x61, 0x73, 0x3b, 0x41, 0x73, 0x69, 0x6e, 0x61, 0x73, 0x3b, 0x41, 0x6b, 0x72, 0x61, 0x73,
-0x3b, 0x41, 0x6b, 0x77, 0x61, 0x73, 0x3b, 0x41, 0x73, 0x69, 0x6d, 0x77, 0x61, 0x73, 0x3b, 0x41, 0x73, 0x69, 0x1e0d, 0x79,
-0x61, 0x73, 0x3b, 0x41, 0x3b, 0x41, 0x3b, 0x41, 0x3b, 0x41, 0x3b, 0x41, 0x3b, 0x41, 0x3b, 0x41, 0x3b, 0x41, 0x6c, 0x68,
-0x3b, 0x41, 0x74, 0x69, 0x3b, 0x41, 0x74, 0x61, 0x3b, 0x41, 0x6c, 0x61, 0x3b, 0x41, 0x6c, 0x6d, 0x3b, 0x41, 0x6c, 0x7a,
-0x3b, 0x41, 0x73, 0x69, 0x3b, 0x41, 0x6c, 0x68, 0x61, 0x64, 0x69, 0x3b, 0x41, 0x74, 0x69, 0x6e, 0x6e, 0x69, 0x3b, 0x41,
-0x74, 0x61, 0x6c, 0x61, 0x61, 0x74, 0x61, 0x3b, 0x41, 0x6c, 0x61, 0x72, 0x62, 0x61, 0x3b, 0x41, 0x6c, 0x68, 0x61, 0x6d,
-0x69, 0x69, 0x73, 0x61, 0x3b, 0x41, 0x6c, 0x7a, 0x75, 0x6d, 0x61, 0x3b, 0x41, 0x73, 0x69, 0x62, 0x74, 0x69, 0x3b, 0x4a,
-0x70, 0x69, 0x3b, 0x4a, 0x74, 0x74, 0x3b, 0x4a, 0x6d, 0x6e, 0x3b, 0x4a, 0x74, 0x6e, 0x3b, 0x41, 0x6c, 0x68, 0x3b, 0x49,
-0x6a, 0x75, 0x3b, 0x4a, 0x6d, 0x6f, 0x3b, 0x4a, 0x75, 0x6d, 0x61, 0x61, 0x70, 0x69, 0x69, 0x3b, 0x4a, 0x75, 0x6d, 0x61,
-0x61, 0x74, 0x61, 0x74, 0x75, 0x3b, 0x4a, 0x75, 0x6d, 0x61, 0x61, 0x6e, 0x65, 0x3b, 0x4a, 0x75, 0x6d, 0x61, 0x61, 0x74,
-0x61, 0x6e, 0x6f, 0x3b, 0x41, 0x6c, 0x68, 0x61, 0x6d, 0x69, 0x73, 0x69, 0x3b, 0x49, 0x6a, 0x75, 0x6d, 0x61, 0x61, 0x3b,
-0x4a, 0x75, 0x6d, 0x61, 0x61, 0x6d, 0x6f, 0x73, 0x69, 0x3b, 0x32, 0x3b, 0x33, 0x3b, 0x34, 0x3b, 0x35, 0x3b, 0x41, 0x3b,
-0x49, 0x3b, 0x31, 0x3b, 0x930, 0x92c, 0x93f, 0x3b, 0x938, 0x92e, 0x3b, 0x92e, 0x902, 0x917, 0x932, 0x3b, 0x92c, 0x941, 0x926, 0x3b,
-0x92c, 0x93f, 0x938, 0x925, 0x93f, 0x3b, 0x938, 0x941, 0x916, 0x941, 0x930, 0x3b, 0x938, 0x941, 0x928, 0x93f, 0x3b, 0x930, 0x92c, 0x93f,
-0x92c, 0x93e, 0x930, 0x3b, 0x938, 0x92e, 0x92c, 0x93e, 0x930, 0x3b, 0x92e, 0x902, 0x917, 0x932, 0x92c, 0x93e, 0x930, 0x3b, 0x92c, 0x941,
-0x926, 0x92c, 0x93e, 0x930, 0x3b, 0x92c, 0x93f, 0x938, 0x925, 0x93f, 0x92c, 0x93e, 0x930, 0x3b, 0x938, 0x941, 0x916, 0x941, 0x930, 0x92c,
-0x93e, 0x930, 0x3b, 0x938, 0x941, 0x928, 0x93f, 0x92c, 0x93e, 0x930, 0x3b, 0x930, 0x3b, 0x938, 0x3b, 0x92e, 0x902, 0x3b, 0x92c, 0x941,
-0x3b, 0x92c, 0x93f, 0x3b, 0x938, 0x941, 0x3b, 0x938, 0x941, 0x3b, 0x43a, 0x4c0, 0x438, 0x3b, 0x43e, 0x440, 0x3b, 0x448, 0x438, 0x3b,
-0x43a, 0x445, 0x430, 0x3b, 0x435, 0x430, 0x3b, 0x43f, 0x4c0, 0x435, 0x3b, 0x448, 0x443, 0x43e, 0x3b, 0x43a, 0x4c0, 0x438, 0x440, 0x430,
-0x3b, 0x43e, 0x440, 0x448, 0x43e, 0x442, 0x3b, 0x448, 0x438, 0x43d, 0x430, 0x440, 0x430, 0x3b, 0x43a, 0x445, 0x430, 0x430, 0x440, 0x430,
-0x3b, 0x435, 0x430, 0x440, 0x430, 0x3b, 0x43f, 0x4c0, 0x435, 0x440, 0x430, 0x441, 0x43a, 0x430, 0x3b, 0x448, 0x443, 0x43e, 0x442, 0x3b,
-0x43a, 0x4c0, 0x3b, 0x43e, 0x3b, 0x448, 0x3b, 0x43a, 0x445, 0x3b, 0x435, 0x3b, 0x43f, 0x4c0, 0x3b, 0x448, 0x3b, 0x43d, 0x434, 0x2de7,
-0x487, 0x467, 0x3b, 0x43f, 0x43d, 0x2de3, 0x435, 0x3b, 0x432, 0x442, 0x43e, 0x2dec, 0x487, 0x3b, 0x441, 0x440, 0x2de3, 0x435, 0x3b, 0x447,
-0x435, 0x2de6, 0x487, 0x3b, 0x43f, 0x467, 0x2de6, 0x487, 0x3b, 0x441, 0xa64b, 0x2de0, 0x487, 0x3b, 0x43d, 0x435, 0x434, 0x463, 0x301, 0x43b,
-0x467, 0x3b, 0x43f, 0x43e, 0x43d, 0x435, 0x434, 0x463, 0x301, 0x43b, 0x44c, 0x43d, 0x438, 0x43a, 0x44a, 0x3b, 0x432, 0x442, 0x43e, 0x301,
-0x440, 0x43d, 0x438, 0x43a, 0x44a, 0x3b, 0x441, 0x440, 0x435, 0x434, 0x430, 0x300, 0x3b, 0x447, 0x435, 0x442, 0x432, 0x435, 0x440, 0x442,
-0x43e, 0x301, 0x43a, 0x44a, 0x3b, 0x43f, 0x467, 0x442, 0x43e, 0x301, 0x43a, 0x44a, 0x3b, 0x441, 0xa64b, 0x431, 0x431, 0x461, 0x301, 0x442,
-0x430, 0x3b, 0x4c, 0x75, 0x6d, 0x3b, 0x4e, 0x6b, 0x6f, 0x3b, 0x4e, 0x64, 0x79, 0x3b, 0x4e, 0x64, 0x67, 0x3b, 0x4e, 0x6a,
-0x77, 0x3b, 0x4e, 0x67, 0x76, 0x3b, 0x4c, 0x75, 0x62, 0x3b, 0x4c, 0x75, 0x6d, 0x69, 0x6e, 0x67, 0x75, 0x3b, 0x4e, 0x6b,
-0x6f, 0x64, 0x79, 0x61, 0x3b, 0x4e, 0x64, 0xe0, 0x61, 0x79, 0xe0, 0x3b, 0x4e, 0x64, 0x61, 0x6e, 0x67, 0xf9, 0x3b, 0x4e,
-0x6a, 0xf2, 0x77, 0x61, 0x3b, 0x4e, 0x67, 0xf2, 0x76, 0x79, 0x61, 0x3b, 0x4c, 0x75, 0x62, 0x69, 0x6e, 0x67, 0x75, 0x3b,
-0x4c, 0x3b, 0x4e, 0x3b, 0x4e, 0x3b, 0x4e, 0x3b, 0x4e, 0x3b, 0x4e, 0x3b, 0x4c, 0x3b, 0x53, 0x6f, 0x6e, 0x3b, 0x4d, 0xe9,
-0x69, 0x3b, 0x44, 0xeb, 0x6e, 0x3b, 0x4d, 0xeb, 0x74, 0x3b, 0x44, 0x6f, 0x6e, 0x3b, 0x46, 0x72, 0x65, 0x3b, 0x53, 0x61,
-0x6d, 0x3b, 0x53, 0x6f, 0x6e, 0x6e, 0x64, 0x65, 0x67, 0x3b, 0x4d, 0xe9, 0x69, 0x6e, 0x64, 0x65, 0x67, 0x3b, 0x44, 0xeb,
-0x6e, 0x73, 0x63, 0x68, 0x64, 0x65, 0x67, 0x3b, 0x4d, 0xeb, 0x74, 0x74, 0x77, 0x6f, 0x63, 0x68, 0x3b, 0x44, 0x6f, 0x6e,
-0x6e, 0x65, 0x73, 0x63, 0x68, 0x64, 0x65, 0x67, 0x3b, 0x46, 0x72, 0x65, 0x69, 0x64, 0x65, 0x67, 0x3b, 0x53, 0x61, 0x6d,
-0x73, 0x63, 0x68, 0x64, 0x65, 0x67, 0x3b, 0x53, 0x6f, 0x6e, 0x2e, 0x3b, 0x4d, 0xe9, 0x69, 0x2e, 0x3b, 0x44, 0xeb, 0x6e,
-0x2e, 0x3b, 0x4d, 0xeb, 0x74, 0x2e, 0x3b, 0x44, 0x6f, 0x6e, 0x2e, 0x3b, 0x46, 0x72, 0x65, 0x2e, 0x3b, 0x53, 0x61, 0x6d,
-0x2e, 0x3b, 0x6e, 0x74, 0x73, 0x3b, 0x6b, 0x70, 0x61, 0x3b, 0x67, 0x68, 0x254, 0x3b, 0x74, 0x254, 0x6d, 0x3b, 0x75, 0x6d,
-0x65, 0x3b, 0x67, 0x68, 0x268, 0x3b, 0x64, 0x7a, 0x6b, 0x3b, 0x74, 0x73, 0x75, 0x294, 0x6e, 0x74, 0x73, 0x268, 0x3b, 0x74,
-0x73, 0x75, 0x294, 0x75, 0x6b, 0x70, 0xe0, 0x3b, 0x74, 0x73, 0x75, 0x294, 0x75, 0x67, 0x68, 0x254, 0x65, 0x3b, 0x74, 0x73,
-0x75, 0x294, 0x75, 0x74, 0x254, 0x300, 0x6d, 0x6c, 0xf2, 0x3b, 0x74, 0x73, 0x75, 0x294, 0x75, 0x6d, 0xe8, 0x3b, 0x74, 0x73,
-0x75, 0x294, 0x75, 0x67, 0x68, 0x268, 0x302, 0x6d, 0x3b, 0x74, 0x73, 0x75, 0x294, 0x6e, 0x64, 0x7a, 0x268, 0x6b, 0x254, 0x294,
-0x254, 0x3b, 0x6e, 0x3b, 0x6b, 0x3b, 0x67, 0x3b, 0x74, 0x3b, 0x75, 0x3b, 0x67, 0x3b, 0x64, 0x3b, 0x6e, 0x254, 0x79, 0x3b,
-0x6e, 0x6a, 0x61, 0x3b, 0x75, 0x75, 0x6d, 0x3b, 0x14b, 0x67, 0x65, 0x3b, 0x6d, 0x62, 0x254, 0x3b, 0x6b, 0x254, 0x254, 0x3b,
-0x6a, 0x6f, 0x6e, 0x3b, 0x14b, 0x67, 0x77, 0xe0, 0x20, 0x6e, 0x254, 0x302, 0x79, 0x3b, 0x14b, 0x67, 0x77, 0xe0, 0x20, 0x6e,
-0x6a, 0x61, 0x14b, 0x67, 0x75, 0x6d, 0x62, 0x61, 0x3b, 0x14b, 0x67, 0x77, 0xe0, 0x20, 0xfb, 0x6d, 0x3b, 0x14b, 0x67, 0x77,
-0xe0, 0x20, 0x14b, 0x67, 0xea, 0x3b, 0x14b, 0x67, 0x77, 0xe0, 0x20, 0x6d, 0x62, 0x254, 0x6b, 0x3b, 0x14b, 0x67, 0x77, 0xe0,
-0x20, 0x6b, 0x254, 0x254, 0x3b, 0x14b, 0x67, 0x77, 0xe0, 0x20, 0x6a, 0xf4, 0x6e, 0x3b, 0x6e, 0x3b, 0x6e, 0x3b, 0x75, 0x3b,
-0x14b, 0x3b, 0x6d, 0x3b, 0x6b, 0x3b, 0x6a, 0x3b, 0x41, 0x6c, 0x68, 0x61, 0x64, 0x69, 0x3b, 0x41, 0x74, 0x69, 0x6e, 0x6e,
-0x69, 0x3b, 0x41, 0x74, 0x61, 0x6c, 0x61, 0x61, 0x74, 0x61, 0x3b, 0x41, 0x6c, 0x61, 0x72, 0x62, 0x61, 0x3b, 0x41, 0x6c,
-0x68, 0x61, 0x6d, 0x69, 0x73, 0x69, 0x3b, 0x41, 0x6c, 0x7a, 0x75, 0x6d, 0x61, 0x3b, 0x41, 0x73, 0x69, 0x62, 0x74, 0x69,
-0x3b, 0x48, 0x3b, 0x54, 0x3b, 0x54, 0x3b, 0x4c, 0x3b, 0x4d, 0x3b, 0x5a, 0x3b, 0x53, 0x3b, 0xe9, 0x74, 0x3b, 0x6d, 0x254,
-0x301, 0x73, 0x3b, 0x6b, 0x77, 0x61, 0x3b, 0x6d, 0x75, 0x6b, 0x3b, 0x14b, 0x67, 0x69, 0x3b, 0x257, 0xf3, 0x6e, 0x3b, 0x65,
-0x73, 0x61, 0x3b, 0xe9, 0x74, 0x69, 0x3b, 0x6d, 0x254, 0x301, 0x73, 0xfa, 0x3b, 0x6b, 0x77, 0x61, 0x73, 0xfa, 0x3b, 0x6d,
-0x75, 0x6b, 0x254, 0x301, 0x73, 0xfa, 0x3b, 0x14b, 0x67, 0x69, 0x73, 0xfa, 0x3b, 0x257, 0xf3, 0x6e, 0x25b, 0x73, 0xfa, 0x3b,
-0x65, 0x73, 0x61, 0x253, 0x61, 0x73, 0xfa, 0x3b, 0x65, 0x3b, 0x6d, 0x3b, 0x6b, 0x3b, 0x6d, 0x3b, 0x14b, 0x3b, 0x257, 0x3b,
-0x65, 0x3b, 0x44, 0x69, 0x6d, 0x3b, 0x54, 0x65, 0x6e, 0x3b, 0x54, 0x61, 0x6c, 0x3b, 0x41, 0x6c, 0x61, 0x3b, 0x41, 0x72,
-0x61, 0x3b, 0x41, 0x72, 0x6a, 0x3b, 0x53, 0x69, 0x62, 0x3b, 0x44, 0x69, 0x6d, 0x61, 0x73, 0x3b, 0x54, 0x65, 0x6e, 0x65,
-0x14b, 0x3b, 0x54, 0x61, 0x6c, 0x61, 0x74, 0x61, 0x3b, 0x41, 0x6c, 0x61, 0x72, 0x62, 0x61, 0x79, 0x3b, 0x41, 0x72, 0x61,
-0x6d, 0x69, 0x73, 0x61, 0x79, 0x3b, 0x41, 0x72, 0x6a, 0x75, 0x6d, 0x61, 0x3b, 0x53, 0x69, 0x62, 0x69, 0x74, 0x69, 0x3b,
-0x44, 0x3b, 0x54, 0x3b, 0x54, 0x3b, 0x41, 0x3b, 0x41, 0x3b, 0x41, 0x3b, 0x53, 0x3b, 0x73, 0x254, 0x301, 0x6e, 0x3b, 0x6d,
-0x254, 0x301, 0x6e, 0x3b, 0x73, 0x6d, 0x62, 0x3b, 0x73, 0x6d, 0x6c, 0x3b, 0x73, 0x6d, 0x6e, 0x3b, 0x66, 0xfa, 0x6c, 0x3b,
-0x73, 0xe9, 0x72, 0x3b, 0x73, 0x254, 0x301, 0x6e, 0x64, 0x254, 0x3b, 0x6d, 0x254, 0x301, 0x6e, 0x64, 0x69, 0x3b, 0x73, 0x254,
-0x301, 0x6e, 0x64, 0x254, 0x20, 0x6d, 0x259, 0x6c, 0xfa, 0x20, 0x6d, 0x259, 0x301, 0x62, 0x25b, 0x30c, 0x3b, 0x73, 0x254, 0x301,
-0x6e, 0x64, 0x254, 0x20, 0x6d, 0x259, 0x6c, 0xfa, 0x20, 0x6d, 0x259, 0x301, 0x6c, 0x25b, 0x301, 0x3b, 0x73, 0x254, 0x301, 0x6e,
-0x64, 0x254, 0x20, 0x6d, 0x259, 0x6c, 0xfa, 0x20, 0x6d, 0x259, 0x301, 0x6e, 0x79, 0x69, 0x3b, 0x66, 0xfa, 0x6c, 0x61, 0x64,
-0xe9, 0x3b, 0x73, 0xe9, 0x72, 0x61, 0x64, 0xe9, 0x3b, 0x73, 0x3b, 0x6d, 0x3b, 0x73, 0x3b, 0x73, 0x3b, 0x73, 0x3b, 0x66,
-0x3b, 0x73, 0x3b, 0x73, 0x254, 0x301, 0x6e, 0x3b, 0x6c, 0x1dd, 0x6e, 0x3b, 0x6d, 0x61, 0x61, 0x3b, 0x6d, 0x25b, 0x6b, 0x3b,
-0x6a, 0x1dd, 0x1dd, 0x3b, 0x6a, 0xfa, 0x6d, 0x3b, 0x73, 0x61, 0x6d, 0x3b, 0x73, 0x254, 0x301, 0x6e, 0x64, 0x1dd, 0x3b, 0x6c,
-0x1dd, 0x6e, 0x64, 0xed, 0x3b, 0x6d, 0x61, 0x61, 0x64, 0xed, 0x3b, 0x6d, 0x25b, 0x6b, 0x72, 0x25b, 0x64, 0xed, 0x3b, 0x6a,
-0x1dd, 0x1dd, 0x64, 0xed, 0x3b, 0x6a, 0xfa, 0x6d, 0x62, 0xe1, 0x3b, 0x73, 0x61, 0x6d, 0x64, 0xed, 0x3b, 0x73, 0x3b, 0x6c,
-0x3b, 0x6d, 0x3b, 0x6d, 0x3b, 0x6a, 0x3b, 0x6a, 0x3b, 0x73, 0x3b, 0x53, 0x61, 0x62, 0x3b, 0x4a, 0x74, 0x74, 0x3b, 0x4a,
-0x6e, 0x6e, 0x3b, 0x4a, 0x74, 0x6e, 0x3b, 0x41, 0x72, 0x61, 0x3b, 0x49, 0x6a, 0x75, 0x3b, 0x4a, 0x6d, 0x6f, 0x3b, 0x53,
-0x61, 0x62, 0x61, 0x74, 0x6f, 0x3b, 0x4a, 0x75, 0x6d, 0x61, 0x74, 0x61, 0x74, 0x75, 0x3b, 0x4a, 0x75, 0x6d, 0x61, 0x6e,
-0x6e, 0x65, 0x3b, 0x4a, 0x75, 0x6d, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x3b, 0x41, 0x72, 0x61, 0x68, 0x61, 0x6d, 0x69, 0x73,
-0x69, 0x3b, 0x49, 0x6a, 0x75, 0x6d, 0x61, 0x61, 0x3b, 0x4a, 0x75, 0x6d, 0x61, 0x6d, 0x6f, 0x73, 0x69, 0x3b, 0x53, 0x3b,
-0x4a, 0x3b, 0x4a, 0x3b, 0x4a, 0x3b, 0x41, 0x3b, 0x49, 0x3b, 0x4a, 0x3b, 0x43, 0x79, 0x61, 0x3b, 0x43, 0x6c, 0x61, 0x3b,
-0x43, 0x7a, 0x69, 0x3b, 0x43, 0x6b, 0x6f, 0x3b, 0x43, 0x6b, 0x61, 0x3b, 0x43, 0x67, 0x61, 0x3b, 0x43, 0x7a, 0x65, 0x3b,
-0x43, 0x6f, 0x6d, 0x2019, 0x79, 0x61, 0x6b, 0x6b, 0x65, 0x3b, 0x43, 0x6f, 0x6d, 0x6c, 0x61, 0x61, 0x257, 0x69, 0x69, 0x3b,
-0x43, 0x6f, 0x6d, 0x7a, 0x79, 0x69, 0x69, 0x257, 0x69, 0x69, 0x3b, 0x43, 0x6f, 0x6d, 0x6b, 0x6f, 0x6c, 0x6c, 0x65, 0x3b,
-0x43, 0x6f, 0x6d, 0x6b, 0x61, 0x6c, 0x64, 0x1dd, 0x253, 0x6c, 0x69, 0x69, 0x3b, 0x43, 0x6f, 0x6d, 0x67, 0x61, 0x69, 0x73,
-0x75, 0x75, 0x3b, 0x43, 0x6f, 0x6d, 0x7a, 0x79, 0x65, 0x253, 0x73, 0x75, 0x75, 0x3b, 0x59, 0x3b, 0x4c, 0x3b, 0x5a, 0x3b,
-0x4f, 0x3b, 0x41, 0x3b, 0x47, 0x3b, 0x45, 0x3b, 0x73, 0x254, 0x301, 0x6e, 0x3b, 0x6d, 0x254, 0x301, 0x6e, 0x3b, 0x73, 0x6d,
-0x62, 0x3b, 0x73, 0x6d, 0x6c, 0x3b, 0x73, 0x6d, 0x6e, 0x3b, 0x6d, 0x62, 0x73, 0x3b, 0x73, 0x61, 0x73, 0x3b, 0x73, 0x254,
-0x301, 0x6e, 0x64, 0x254, 0x3b, 0x6d, 0x254, 0x301, 0x6e, 0x64, 0x254, 0x3b, 0x73, 0x254, 0x301, 0x6e, 0x64, 0x254, 0x20, 0x6d,
-0x61, 0x66, 0xfa, 0x20, 0x6d, 0xe1, 0x62, 0x61, 0x3b, 0x73, 0x254, 0x301, 0x6e, 0x64, 0x254, 0x20, 0x6d, 0x61, 0x66, 0xfa,
-0x20, 0x6d, 0xe1, 0x6c, 0x61, 0x6c, 0x3b, 0x73, 0x254, 0x301, 0x6e, 0x64, 0x254, 0x20, 0x6d, 0x61, 0x66, 0xfa, 0x20, 0x6d,
-0xe1, 0x6e, 0x61, 0x3b, 0x6d, 0x61, 0x62, 0xe1, 0x67, 0xe1, 0x20, 0x6d, 0xe1, 0x20, 0x73, 0x75, 0x6b, 0x75, 0x6c, 0x3b,
-0x73, 0xe1, 0x73, 0x61, 0x64, 0x69, 0x3b, 0x73, 0x3b, 0x6d, 0x3b, 0x73, 0x3b, 0x73, 0x3b, 0x73, 0x3b, 0x6d, 0x3b, 0x73,
-0x3b, 0x43, 0xe4, 0x14b, 0x3b, 0x4a, 0x69, 0x65, 0x63, 0x3b, 0x52, 0x25b, 0x77, 0x3b, 0x44, 0x69, 0x254, 0x331, 0x6b, 0x3b,
-0x14a, 0x75, 0x61, 0x61, 0x6e, 0x3b, 0x44, 0x68, 0x69, 0x65, 0x65, 0x63, 0x3b, 0x42, 0xe4, 0x6b, 0x25b, 0x6c, 0x3b, 0x43,
-0xe4, 0x14b, 0x20, 0x6b, 0x75, 0x254, 0x74, 0x68, 0x3b, 0x4a, 0x69, 0x65, 0x63, 0x20, 0x6c, 0x61, 0x331, 0x74, 0x3b, 0x52,
-0x25b, 0x77, 0x20, 0x6c, 0xe4, 0x74, 0x6e, 0x69, 0x3b, 0x44, 0x69, 0x254, 0x331, 0x6b, 0x20, 0x6c, 0xe4, 0x74, 0x6e, 0x69,
-0x3b, 0x14a, 0x75, 0x61, 0x61, 0x6e, 0x20, 0x6c, 0xe4, 0x74, 0x6e, 0x69, 0x3b, 0x44, 0x68, 0x69, 0x65, 0x65, 0x63, 0x20,
-0x6c, 0xe4, 0x74, 0x6e, 0x69, 0x3b, 0x42, 0xe4, 0x6b, 0x25b, 0x6c, 0x20, 0x6c, 0xe4, 0x74, 0x6e, 0x69, 0x3b, 0x43, 0x3b,
-0x4a, 0x3b, 0x52, 0x3b, 0x44, 0x3b, 0x14a, 0x3b, 0x44, 0x3b, 0x42, 0x3b, 0x431, 0x441, 0x3b, 0x431, 0x43d, 0x3b, 0x43e, 0x43f,
-0x3b, 0x441, 0x44d, 0x3b, 0x447, 0x43f, 0x3b, 0x431, 0x44d, 0x3b, 0x441, 0x431, 0x3b, 0x431, 0x430, 0x441, 0x43a, 0x44b, 0x4bb, 0x44b,
-0x430, 0x43d, 0x43d, 0x44c, 0x430, 0x3b, 0x431, 0x44d, 0x43d, 0x438, 0x434, 0x438, 0x44d, 0x43d, 0x43d, 0x44c, 0x438, 0x43a, 0x3b, 0x43e,
-0x43f, 0x442, 0x443, 0x43e, 0x440, 0x443, 0x43d, 0x43d, 0x44c, 0x443, 0x43a, 0x3b, 0x441, 0x44d, 0x440, 0x44d, 0x434, 0x44d, 0x3b, 0x447,
-0x44d, 0x43f, 0x43f, 0x438, 0x44d, 0x440, 0x3b, 0x411, 0x44d, 0x44d, 0x442, 0x438, 0x4a5, 0x441, 0x44d, 0x3b, 0x441, 0x443, 0x431, 0x443,
-0x43e, 0x442, 0x430, 0x3b, 0x411, 0x3b, 0x411, 0x3b, 0x41e, 0x3b, 0x421, 0x3b, 0x427, 0x3b, 0x411, 0x3b, 0x421, 0x3b, 0x4d, 0x75,
-0x6c, 0x3b, 0x4a, 0x74, 0x74, 0x3b, 0x4a, 0x6e, 0x6e, 0x3b, 0x4a, 0x74, 0x6e, 0x3b, 0x41, 0x6c, 0x68, 0x3b, 0x49, 0x6a,
-0x75, 0x3b, 0x4a, 0x6d, 0x6f, 0x3b, 0x4d, 0x75, 0x6c, 0x75, 0x6e, 0x67, 0x75, 0x3b, 0x4a, 0x75, 0x6d, 0x61, 0x74, 0x61,
-0x74, 0x75, 0x3b, 0x4a, 0x75, 0x6d, 0x61, 0x6e, 0x6e, 0x65, 0x3b, 0x4a, 0x75, 0x6d, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x3b,
-0x41, 0x6c, 0x61, 0x68, 0x61, 0x6d, 0x69, 0x73, 0x69, 0x3b, 0x49, 0x6a, 0x75, 0x6d, 0x61, 0x61, 0x3b, 0x4a, 0x75, 0x6d,
-0x61, 0x6d, 0x6f, 0x73, 0x69, 0x3b, 0x4d, 0x3b, 0x4a, 0x3b, 0x4a, 0x3b, 0x4a, 0x3b, 0x41, 0x3b, 0x49, 0x3b, 0x4a, 0x3b,
-0xa55e, 0xa54c, 0xa535, 0x3b, 0xa5f3, 0xa5e1, 0xa609, 0x3b, 0xa55a, 0xa55e, 0xa55a, 0x3b, 0xa549, 0xa55e, 0xa552, 0x3b, 0xa549, 0xa524, 0xa546, 0xa562,
-0x3b, 0xa549, 0xa524, 0xa540, 0xa56e, 0x3b, 0xa53b, 0xa52c, 0xa533, 0x3b, 0x6c, 0x61, 0x68, 0x61, 0x64, 0x69, 0x3b, 0x74, 0x25b, 0x25b,
-0x6e, 0x25b, 0x25b, 0x3b, 0x74, 0x61, 0x6c, 0x61, 0x74, 0x61, 0x3b, 0x61, 0x6c, 0x61, 0x62, 0x61, 0x3b, 0x61, 0x69, 0x6d,
-0x69, 0x73, 0x61, 0x3b, 0x61, 0x69, 0x6a, 0x69, 0x6d, 0x61, 0x3b, 0x73, 0x69, 0x253, 0x69, 0x74, 0x69, 0x3b, 0x53, 0x75,
-0x6e, 0x3b, 0x4d, 0xe4, 0x6e, 0x3b, 0x5a, 0x69, 0x161, 0x3b, 0x4d, 0x69, 0x74, 0x3b, 0x46, 0x72, 0xf3, 0x3b, 0x46, 0x72,
-0x69, 0x3b, 0x53, 0x61, 0x6d, 0x3b, 0x53, 0x75, 0x6e, 0x6e, 0x74, 0x61, 0x67, 0x3b, 0x4d, 0xe4, 0x6e, 0x74, 0x61, 0x67,
-0x3b, 0x5a, 0x69, 0x161, 0x74, 0x61, 0x67, 0x3b, 0x4d, 0x69, 0x74, 0x74, 0x77, 0x75, 0x10d, 0x3b, 0x46, 0x72, 0xf3, 0x6e,
-0x74, 0x61, 0x67, 0x3b, 0x46, 0x72, 0x69, 0x74, 0x61, 0x67, 0x3b, 0x53, 0x61, 0x6d, 0x161, 0x74, 0x61, 0x67, 0x3b, 0x53,
-0x3b, 0x4d, 0x3b, 0x5a, 0x3b, 0x4d, 0x3b, 0x46, 0x3b, 0x46, 0x3b, 0x53, 0x3b, 0x73, 0x64, 0x3b, 0x6d, 0x64, 0x3b, 0x6d,
-0x77, 0x3b, 0x65, 0x74, 0x3b, 0x6b, 0x6c, 0x3b, 0x66, 0x6c, 0x3b, 0x73, 0x73, 0x3b, 0x73, 0x254, 0x301, 0x6e, 0x64, 0x69,
-0x25b, 0x3b, 0x6d, 0xf3, 0x6e, 0x64, 0x69, 0x65, 0x3b, 0x6d, 0x75, 0xe1, 0x6e, 0x79, 0xe1, 0x14b, 0x6d, 0xf3, 0x6e, 0x64,
-0x69, 0x65, 0x3b, 0x6d, 0x65, 0x74, 0xfa, 0x6b, 0x70, 0xed, 0xe1, 0x70, 0x25b, 0x3b, 0x6b, 0xfa, 0x70, 0xe9, 0x6c, 0x69,
-0x6d, 0x65, 0x74, 0xfa, 0x6b, 0x70, 0x69, 0x61, 0x70, 0x25b, 0x3b, 0x66, 0x65, 0x6c, 0xe9, 0x74, 0x65, 0x3b, 0x73, 0xe9,
-0x73, 0x65, 0x6c, 0xe9, 0x3b, 0x73, 0x3b, 0x6d, 0x3b, 0x6d, 0x3b, 0x65, 0x3b, 0x6b, 0x3b, 0x66, 0x3b, 0x73, 0x3b, 0x64,
-0x6f, 0x6d, 0x3b, 0x6c, 0x6c, 0x75, 0x3b, 0x6d, 0x61, 0x72, 0x3b, 0x6d, 0x69, 0xe9, 0x3b, 0x78, 0x75, 0x65, 0x3b, 0x76,
-0x69, 0x65, 0x3b, 0x73, 0xe1, 0x62, 0x3b, 0x64, 0x6f, 0x6d, 0x69, 0x6e, 0x67, 0x75, 0x3b, 0x6c, 0x6c, 0x75, 0x6e, 0x65,
-0x73, 0x3b, 0x6d, 0x61, 0x72, 0x74, 0x65, 0x73, 0x3b, 0x6d, 0x69, 0xe9, 0x72, 0x63, 0x6f, 0x6c, 0x65, 0x73, 0x3b, 0x78,
-0x75, 0x65, 0x76, 0x65, 0x73, 0x3b, 0x76, 0x69, 0x65, 0x6e, 0x72, 0x65, 0x73, 0x3b, 0x73, 0xe1, 0x62, 0x61, 0x64, 0x75,
-0x3b, 0x53, 0x254, 0x301, 0x6e, 0x64, 0x69, 0x3b, 0x4d, 0x254, 0x301, 0x6e, 0x64, 0x69, 0x3b, 0xc1, 0x70, 0x74, 0x61, 0x20,
-0x4d, 0x254, 0x301, 0x6e, 0x64, 0x69, 0x3b, 0x57, 0x25b, 0x301, 0x6e, 0x25b, 0x73, 0x25b, 0x64, 0x25b, 0x3b, 0x54, 0x254, 0x301,
-0x73, 0x25b, 0x64, 0x25b, 0x3b, 0x46, 0x25b, 0x6c, 0xe2, 0x79, 0x25b, 0x64, 0x25b, 0x3b, 0x53, 0xe1, 0x73, 0x69, 0x64, 0x25b,
-0x3b, 0x53, 0x254, 0x301, 0x3b, 0x4d, 0x254, 0x301, 0x3b, 0xc1, 0x4d, 0x3b, 0x57, 0x25b, 0x301, 0x3b, 0x54, 0x254, 0x301, 0x3b,
-0x46, 0x25b, 0x3b, 0x53, 0xe1, 0x3b, 0x73, 0x254, 0x6e, 0x64, 0x69, 0x3b, 0x6c, 0x75, 0x6e, 0x64, 0x69, 0x3b, 0x6d, 0x61,
-0x72, 0x64, 0x69, 0x3b, 0x6d, 0x25b, 0x72, 0x6b, 0x25b, 0x72, 0x25b, 0x64, 0x69, 0x3b, 0x79, 0x65, 0x64, 0x69, 0x3b, 0x76,
-0x61, 0x14b, 0x64, 0x25b, 0x72, 0x25b, 0x64, 0x69, 0x3b, 0x6d, 0x254, 0x6e, 0x254, 0x20, 0x73, 0x254, 0x6e, 0x64, 0x69, 0x3b,
-0x73, 0x6f, 0x3b, 0x6c, 0x75, 0x3b, 0x6d, 0x61, 0x3b, 0x6d, 0x25b, 0x3b, 0x79, 0x65, 0x3b, 0x76, 0x61, 0x3b, 0x6d, 0x73,
-0x3b, 0x41, 0x6e, 0x65, 0x67, 0x20, 0x31, 0x3b, 0x41, 0x6e, 0x65, 0x67, 0x20, 0x32, 0x3b, 0x41, 0x6e, 0x65, 0x67, 0x20,
-0x33, 0x3b, 0x41, 0x6e, 0x65, 0x67, 0x20, 0x34, 0x3b, 0x41, 0x6e, 0x65, 0x67, 0x20, 0x35, 0x3b, 0x41, 0x6e, 0x65, 0x67,
-0x20, 0x36, 0x3b, 0x41, 0x6e, 0x65, 0x67, 0x20, 0x37, 0x3b, 0x41, 0x31, 0x3b, 0x41, 0x32, 0x3b, 0x41, 0x33, 0x3b, 0x41,
-0x34, 0x3b, 0x41, 0x35, 0x3b, 0x41, 0x36, 0x3b, 0x41, 0x37, 0x3b, 0x6c, 0x79, 0x25b, 0x2bc, 0x25b, 0x301, 0x20, 0x73, 0x1e85,
-0xed, 0x14b, 0x74, 0xe8, 0x3b, 0x6d, 0x76, 0x66, 0xf2, 0x20, 0x6c, 0x79, 0x25b, 0x30c, 0x2bc, 0x3b, 0x6d, 0x62, 0x254, 0x301,
-0x254, 0x6e, 0x74, 0xe8, 0x20, 0x6d, 0x76, 0x66, 0xf2, 0x20, 0x6c, 0x79, 0x25b, 0x30c, 0x2bc, 0x3b, 0x74, 0x73, 0xe8, 0x74,
-0x73, 0x25b, 0x300, 0x25b, 0x20, 0x6c, 0x79, 0x25b, 0x30c, 0x2bc, 0x3b, 0x6d, 0x62, 0x254, 0x301, 0x254, 0x6e, 0x74, 0xe8, 0x20,
-0x74, 0x73, 0x65, 0x74, 0x73, 0x25b, 0x300, 0x25b, 0x20, 0x6c, 0x79, 0x25b, 0x30c, 0x2bc, 0x3b, 0x6d, 0x76, 0x66, 0xf2, 0x20,
-0x6d, 0xe0, 0x67, 0x61, 0x20, 0x6c, 0x79, 0x25b, 0x30c, 0x2bc, 0x3b, 0x6d, 0xe0, 0x67, 0x61, 0x20, 0x6c, 0x79, 0x25b, 0x30c,
-0x2bc, 0x3b, 0x41, 0x14b, 0x70, 0xe9, 0x74, 0x75, 0x77, 0x61, 0x6b, 0x21f, 0x61, 0x14b, 0x3b, 0x41, 0x14b, 0x70, 0xe9, 0x74,
-0x75, 0x77, 0x61, 0x14b, 0x17e, 0x69, 0x3b, 0x41, 0x14b, 0x70, 0xe9, 0x74, 0x75, 0x6e, 0x75, 0x14b, 0x70, 0x61, 0x3b, 0x41,
-0x14b, 0x70, 0xe9, 0x74, 0x75, 0x79, 0x61, 0x6d, 0x6e, 0x69, 0x3b, 0x41, 0x14b, 0x70, 0xe9, 0x74, 0x75, 0x74, 0x6f, 0x70,
-0x61, 0x3b, 0x41, 0x14b, 0x70, 0xe9, 0x74, 0x75, 0x7a, 0x61, 0x70, 0x74, 0x61, 0x14b, 0x3b, 0x4f, 0x77, 0xe1, 0x14b, 0x67,
-0x79, 0x75, 0x17e, 0x61, 0x17e, 0x61, 0x70, 0x69, 0x3b, 0x41, 0x3b, 0x57, 0x3b, 0x4e, 0x3b, 0x59, 0x3b, 0x54, 0x3b, 0x5a,
-0x3b, 0x4f, 0x3b, 0x2d30, 0x2d59, 0x2d30, 0x2d4e, 0x2d30, 0x2d59, 0x3b, 0x2d30, 0x2d62, 0x2d4f, 0x2d30, 0x2d59, 0x3b, 0x2d30, 0x2d59, 0x2d49, 0x2d4f,
-0x2d30, 0x2d59, 0x3b, 0x2d30, 0x2d3d, 0x2d55, 0x2d30, 0x2d59, 0x3b, 0x2d30, 0x2d3d, 0x2d61, 0x2d30, 0x2d59, 0x3b, 0x2d30, 0x2d59, 0x2d49, 0x2d4e, 0x2d61,
-0x2d30, 0x2d59, 0x3b, 0x2d30, 0x2d59, 0x2d49, 0x2d39, 0x2d62, 0x2d30, 0x2d59, 0x3b, 0x6cc, 0x6d5, 0x6a9, 0x634, 0x6d5, 0x645, 0x645, 0x6d5, 0x3b,
-0x62f, 0x648, 0x648, 0x634, 0x6d5, 0x645, 0x645, 0x6d5, 0x3b, 0x633, 0x6ce, 0x634, 0x6d5, 0x645, 0x645, 0x6d5, 0x3b, 0x686, 0x648, 0x627,
-0x631, 0x634, 0x6d5, 0x645, 0x645, 0x6d5, 0x3b, 0x67e, 0x6ce, 0x646, 0x62c, 0x634, 0x6d5, 0x645, 0x645, 0x6d5, 0x3b, 0x6be, 0x6d5, 0x6cc,
-0x646, 0x6cc, 0x3b, 0x634, 0x6d5, 0x645, 0x645, 0x6d5, 0x3b, 0x6cc, 0x3b, 0x62f, 0x3b, 0x633, 0x3b, 0x686, 0x3b, 0x67e, 0x3b, 0x6be,
-0x3b, 0x634, 0x3b, 0x6e, 0x6a, 0x65, 0x3b, 0x70, 0xf3, 0x6e, 0x3b, 0x77, 0x61, 0x142, 0x3b, 0x73, 0x72, 0x6a, 0x3b, 0x73,
-0x74, 0x77, 0x3b, 0x70, 0x11b, 0x74, 0x3b, 0x73, 0x6f, 0x62, 0x3b, 0x6e, 0x6a, 0x65, 0x17a, 0x65, 0x6c, 0x61, 0x3b, 0x70,
-0xf3, 0x6e, 0x6a, 0x65, 0x17a, 0x65, 0x6c, 0x65, 0x3b, 0x77, 0x61, 0x142, 0x74, 0x6f, 0x72, 0x61, 0x3b, 0x73, 0x72, 0x6a,
-0x6f, 0x64, 0x61, 0x3b, 0x73, 0x74, 0x77, 0xf3, 0x72, 0x74, 0x6b, 0x3b, 0x70, 0x11b, 0x74, 0x6b, 0x3b, 0x73, 0x6f, 0x62,
-0x6f, 0x74, 0x61, 0x3b, 0x6e, 0x3b, 0x70, 0x3b, 0x77, 0x3b, 0x73, 0x3b, 0x73, 0x3b, 0x70, 0x3b, 0x73, 0x3b, 0x6e, 0x6a,
-0x65, 0x3b, 0x70, 0xf3, 0x6e, 0x3b, 0x77, 0x75, 0x74, 0x3b, 0x73, 0x72, 0x6a, 0x3b, 0x161, 0x74, 0x77, 0x3b, 0x70, 0x6a,
-0x61, 0x3b, 0x73, 0x6f, 0x62, 0x3b, 0x6e, 0x6a, 0x65, 0x64, 0x17a, 0x65, 0x6c, 0x61, 0x3b, 0x70, 0xf3, 0x6e, 0x64, 0x17a,
-0x65, 0x6c, 0x61, 0x3b, 0x77, 0x75, 0x74, 0x6f, 0x72, 0x61, 0x3b, 0x73, 0x72, 0x6a, 0x65, 0x64, 0x61, 0x3b, 0x161, 0x74,
-0x77, 0xf3, 0x72, 0x74, 0x6b, 0x3b, 0x70, 0x6a, 0x61, 0x74, 0x6b, 0x3b, 0x73, 0x6f, 0x62, 0x6f, 0x74, 0x61, 0x3b, 0x6e,
-0x3b, 0x70, 0x3b, 0x77, 0x3b, 0x73, 0x3b, 0x161, 0x3b, 0x70, 0x3b, 0x73, 0x3b, 0x6e, 0x61, 0x64, 0x3b, 0x70, 0x61, 0x6e,
-0x3b, 0x77, 0x69, 0x73, 0x3b, 0x70, 0x75, 0x73, 0x3b, 0x6b, 0x65, 0x74, 0x3b, 0x70, 0x113, 0x6e, 0x3b, 0x73, 0x61, 0x62,
-0x3b, 0x6e, 0x61, 0x64, 0x12b, 0x6c, 0x69, 0x3b, 0x70, 0x61, 0x6e, 0x61, 0x64, 0x12b, 0x6c, 0x69, 0x3b, 0x77, 0x69, 0x73,
-0x61, 0x73, 0x12b, 0x64, 0x69, 0x73, 0x3b, 0x70, 0x75, 0x73, 0x73, 0x69, 0x73, 0x61, 0x77, 0x61, 0x69, 0x74, 0x69, 0x3b,
-0x6b, 0x65, 0x74, 0x77, 0x69, 0x72, 0x74, 0x69, 0x6b, 0x73, 0x3b, 0x70, 0x113, 0x6e, 0x74, 0x6e, 0x69, 0x6b, 0x73, 0x3b,
-0x73, 0x61, 0x62, 0x61, 0x74, 0x74, 0x69, 0x6b, 0x61, 0x3b, 0x4e, 0x3b, 0x50, 0x3b, 0x57, 0x3b, 0x50, 0x3b, 0x4b, 0x3b,
-0x50, 0x3b, 0x53, 0x3b, 0x70, 0x61, 0x73, 0x3b, 0x76, 0x75, 0x6f, 0x3b, 0x6d, 0x61, 0x6a, 0x3b, 0x6b, 0x6f, 0x73, 0x3b,
-0x74, 0x75, 0x6f, 0x3b, 0x76, 0xe1, 0x73, 0x3b, 0x6c, 0xe1, 0x76, 0x3b, 0x70, 0x61, 0x73, 0x65, 0x70, 0x65, 0x69, 0x76,
-0x69, 0x3b, 0x76, 0x75, 0x6f, 0x73, 0x73, 0x61, 0x72, 0x67, 0xe2, 0x3b, 0x6d, 0x61, 0x6a, 0x65, 0x62, 0x61, 0x72, 0x67,
-0xe2, 0x3b, 0x6b, 0x6f, 0x73, 0x6b, 0x6f, 0x6b, 0x6b, 0x6f, 0x3b, 0x74, 0x75, 0x6f, 0x72, 0xe2, 0x73, 0x74, 0xe2, 0x68,
-0x3b, 0x76, 0xe1, 0x73, 0x74, 0x75, 0x70, 0x70, 0x65, 0x69, 0x76, 0x69, 0x3b, 0x6c, 0xe1, 0x76, 0x75, 0x72, 0x64, 0xe2,
-0x68, 0x3b, 0x70, 0x61, 0x73, 0x65, 0x70, 0x65, 0x65, 0x69, 0x76, 0x69, 0x3b, 0x76, 0x75, 0x6f, 0x73, 0x73, 0x61, 0x61,
-0x72, 0x67, 0xe2, 0x3b, 0x6d, 0x61, 0x6a, 0x65, 0x62, 0x61, 0x61, 0x72, 0x67, 0xe2, 0x3b, 0x6b, 0x6f, 0x73, 0x6b, 0x6f,
-0x68, 0x6f, 0x3b, 0x74, 0x75, 0x6f, 0x72, 0xe2, 0x73, 0x74, 0x75, 0x76, 0x3b, 0x76, 0xe1, 0x73, 0x74, 0x75, 0x70, 0x70,
-0x65, 0x65, 0x69, 0x76, 0x69, 0x3b, 0x6c, 0xe1, 0x76, 0x75, 0x72, 0x64, 0x75, 0x76, 0x3b, 0x70, 0x3b, 0x56, 0x3b, 0x4d,
-0x3b, 0x4b, 0x3b, 0x54, 0x3b, 0x56, 0x3b, 0x4c, 0x3b
-};
-
-static const ushort byte_unit_data[] = {
-0x62, 0x79, 0x74, 0x65, 0x73, 0x6b, 0x42, 0x3b, 0x4d, 0x42, 0x3b, 0x47, 0x42, 0x3b, 0x54, 0x42, 0x3b, 0x50, 0x42, 0x3b,
-0x45, 0x42, 0x4b, 0x69, 0x42, 0x3b, 0x4d, 0x69, 0x42, 0x3b, 0x47, 0x69, 0x42, 0x3b, 0x54, 0x69, 0x42, 0x3b, 0x50, 0x69,
-0x42, 0x3b, 0x45, 0x69, 0x42, 0x62, 0x79, 0x74, 0x65, 0x67, 0x72, 0x65, 0x70, 0x65, 0x62, 0x61, 0x6a, 0x74, 0x1263, 0x12ed,
-0x1275, 0x12aa, 0x1263, 0x3b, 0x121c, 0x130b, 0x1263, 0x12ed, 0x1275, 0x3b, 0x130a, 0x1263, 0x3b, 0x1274, 0x122b, 0x1263, 0x12ed, 0x1275, 0x3b, 0x1354,
-0x1263, 0x3b, 0x45, 0x42, 0x628, 0x627, 0x64a, 0x62a, 0x643, 0x64a, 0x644, 0x648, 0x628, 0x627, 0x64a, 0x62a, 0x3b, 0x645, 0x64a, 0x63a,
-0x627, 0x628, 0x627, 0x64a, 0x62a, 0x3b, 0x63a, 0x64a, 0x63a, 0x627, 0x628, 0x627, 0x64a, 0x62a, 0x3b, 0x62a, 0x64a, 0x631, 0x627, 0x628,
-0x627, 0x64a, 0x62a, 0x3b, 0x628, 0x64a, 0x62a, 0x627, 0x628, 0x627, 0x64a, 0x62a, 0x3b, 0x45, 0x42, 0x562, 0x561, 0x575, 0x569, 0x565,
-0x580, 0x56f, 0x532, 0x3b, 0x544, 0x532, 0x3b, 0x533, 0x532, 0x3b, 0x54f, 0x532, 0x3b, 0x54a, 0x532, 0x3b, 0x45, 0x42, 0x9ac, 0x9be,
-0x987, 0x99f, 0x995, 0x9bf, 0x983, 0x20, 0x9ac, 0x9be, 0x983, 0x3b, 0x9ae, 0x9c7, 0x983, 0x20, 0x9ac, 0x9be, 0x983, 0x3b, 0x997, 0x9bf,
-0x983, 0x20, 0x9ac, 0x9be, 0x983, 0x3b, 0x99f, 0x9c7, 0x983, 0x20, 0x9ac, 0x9be, 0x983, 0x3b, 0x50, 0x42, 0x3b, 0x45, 0x42, 0x62,
-0x61, 0x79, 0x74, 0x62, 0x79, 0x74, 0x65, 0x2d, 0x61, 0x6b, 0x6f, 0x6b, 0x74, 0x65, 0x64, 0x6f, 0xf9, 0x6b, 0x6f, 0x3b,
-0x4d, 0x6f, 0x3b, 0x47, 0x6f, 0x3b, 0x54, 0x6f, 0x3b, 0x50, 0x42, 0x3b, 0x45, 0x42, 0x431, 0x430, 0x439, 0x442, 0x43e, 0x432,
-0x435, 0x1018, 0x102d, 0x102f, 0x1000, 0x103a, 0x431, 0x430, 0x439, 0x442, 0x44b, 0x41a, 0x411, 0x3b, 0x41c, 0x411, 0x3b, 0x413, 0x411, 0x3b,
-0x422, 0x411, 0x3b, 0x41f, 0x411, 0x3b, 0x45, 0x42, 0x1794, 0x17c3, 0x5b57, 0x8282, 0x5343, 0x5b57, 0x8282, 0x3b, 0x5146, 0x5b57, 0x8282, 0x3b,
-0x5409, 0x5b57, 0x8282, 0x3b, 0x592a, 0x5b57, 0x8282, 0x3b, 0x50, 0x42, 0x3b, 0x45, 0x42, 0x4f4d, 0x5143, 0x7d44, 0x62, 0x61, 0x6a, 0x74,
-0x6f, 0x76, 0x69, 0x62, 0x61, 0x6a, 0x74, 0x79, 0x62, 0x61, 0x6a, 0x74, 0x6f, 0x6a, 0x62, 0x61, 0x69, 0x64, 0x69, 0x64,
-0x62, 0xfd, 0x74, 0x74, 0x61, 0x76, 0x75, 0x74, 0x6b, 0x74, 0x3b, 0x4d, 0x74, 0x3b, 0x47, 0x74, 0x3b, 0x54, 0x74, 0x3b,
-0x50, 0x74, 0x3b, 0x45, 0x74, 0x4b, 0x69, 0x74, 0x3b, 0x4d, 0x69, 0x74, 0x3b, 0x47, 0x69, 0x74, 0x3b, 0x54, 0x69, 0x74,
-0x3b, 0x50, 0x69, 0x74, 0x3b, 0x45, 0x69, 0x74, 0x6f, 0x63, 0x74, 0x65, 0x74, 0x73, 0x6b, 0x6f, 0x3b, 0x4d, 0x6f, 0x3b,
-0x47, 0x6f, 0x3b, 0x54, 0x6f, 0x3b, 0x50, 0x6f, 0x3b, 0x45, 0x6f, 0x4b, 0x69, 0x6f, 0x3b, 0x4d, 0x69, 0x6f, 0x3b, 0x47,
-0x69, 0x6f, 0x3b, 0x54, 0x69, 0x6f, 0x3b, 0x50, 0x69, 0x6f, 0x3b, 0x45, 0x69, 0x6f, 0x62, 0x61, 0x69, 0x64, 0x68, 0x74,
-0x10d1, 0x10d0, 0x10d8, 0x10e2, 0x10d8, 0x10d9, 0x10d1, 0x10d0, 0x10d8, 0x10e2, 0x10d8, 0x3b, 0x10db, 0x10d1, 0x10d0, 0x10d8, 0x10e2, 0x10d8, 0x3b, 0x10d2,
-0x10d1, 0x10d0, 0x10d8, 0x10e2, 0x10d8, 0x3b, 0x10e2, 0x10d1, 0x10d0, 0x10d8, 0x10e2, 0x10d8, 0x3b, 0x10de, 0x10d1, 0x10d0, 0x10d8, 0x10e2, 0x10d8, 0x3b,
-0x45, 0x42, 0x42, 0x79, 0x74, 0x65, 0x73, 0xaac, 0xabe, 0xa87, 0xa9f, 0x6b, 0x42, 0x3b, 0x4d, 0x42, 0x3b, 0x47, 0x42, 0x3b,
-0x54, 0x42, 0x3b, 0xaaa, 0xac0, 0xaac, 0xac0, 0x3b, 0x45, 0x42, 0x5d1, 0x5d9, 0x5d9, 0x5d8, 0x92c, 0x93e, 0x907, 0x91f, 0x62, 0xe1,
-0x6a, 0x74, 0x62, 0xe6, 0x74, 0x69, 0x62, 0x65, 0x61, 0x72, 0x74, 0x61, 0x30d0, 0x30a4, 0x30c8, 0x62, 0x69, 0x74, 0x65, 0xcac,
-0xcc8, 0xc9f, 0xccd, 0x200c, 0xc97, 0xcb3, 0xcc1, 0xc95, 0xcbf, 0x2e, 0xcac, 0xcc8, 0x2e, 0x3b, 0xcae, 0xcc6, 0x2e, 0xcac, 0xcc8, 0x2e,
-0x3b, 0xc97, 0xcbf, 0x2e, 0xcac, 0xcc8, 0x2e, 0x3b, 0xc9f, 0xcc6, 0x2e, 0xcac, 0xcc8, 0x2e, 0x3b, 0xcaa, 0xcc6, 0xcac, 0xcc8, 0x3b,
-0x45, 0x42, 0x431, 0x430, 0x439, 0x442, 0x43a, 0x411, 0x3b, 0x4d, 0x411, 0x3b, 0x413, 0x411, 0x3b, 0x54, 0x411, 0x3b, 0x41f, 0x411,
-0x3b, 0x45, 0x411, 0x4b, 0x69, 0x411, 0x3b, 0x4d, 0x69, 0x411, 0x3b, 0x47, 0x69, 0x411, 0x3b, 0x54, 0x69, 0x411, 0x3b, 0x50,
-0x69, 0x411, 0x3b, 0x45, 0x69, 0x411, 0x43a, 0x411, 0x3b, 0x41c, 0x411, 0x3b, 0x413, 0x411, 0x3b, 0x422, 0x411, 0x3b, 0x41f, 0x442,
-0x431, 0x3b, 0x45, 0x42, 0xbc14, 0xc774, 0xd2b8, 0x62, 0x61, 0x69, 0x74, 0x69, 0x62, 0x61, 0x69, 0x74, 0x61, 0x69, 0x431, 0x430,
-0x458, 0x442, 0x438, 0x62, 0x61, 0x69, 0x74, 0xd2c, 0xd48, 0xd31, 0xd4d, 0xd31, 0xd4d, 0xd15, 0xd46, 0xd2c, 0xd3f, 0x3b, 0xd0e, 0xd02,
-0xd2c, 0xd3f, 0x3b, 0xd1c, 0xd3f, 0xd2c, 0xd3f, 0x3b, 0xd1f, 0xd3f, 0xd2c, 0xd3f, 0x3b, 0xd2a, 0xd3f, 0xd2c, 0xd3f, 0x3b, 0x45, 0x42,
-0x43a, 0x411, 0x3b, 0x41c, 0x411, 0x3b, 0x413, 0x411, 0x3b, 0x422, 0x411, 0x3b, 0x41f, 0x411, 0x3b, 0x45, 0x42, 0x6b, 0x42, 0x3b,
-0x4d, 0x42, 0x3b, 0x47, 0x42, 0x3b, 0x54, 0x42, 0x3b, 0x92a, 0x93f, 0x91f, 0x93e, 0x3b, 0x45, 0x42, 0xb2c, 0xb3e, 0xb07, 0xb1f,
-0xb4d, 0x628, 0x627, 0x64a, 0x67c, 0x633, 0x628, 0x627, 0x6cc, 0x62a, 0x6a9, 0x6cc, 0x644, 0x648, 0x628, 0x627, 0x6cc, 0x62a, 0x3b, 0x645,
-0x6af, 0x627, 0x628, 0x627, 0x6cc, 0x62a, 0x3b, 0x6af, 0x6cc, 0x6af, 0x627, 0x628, 0x627, 0x6cc, 0x62a, 0x3b, 0x62a, 0x631, 0x627, 0x628,
-0x627, 0x6cc, 0x62a, 0x3b, 0x67e, 0x62a, 0x627, 0x628, 0x627, 0x6cc, 0x62a, 0x3b, 0x45, 0x42, 0xa2c, 0xa3e, 0xa07, 0xa1f, 0x62, 0x79,
-0x21b, 0x69, 0x431, 0x430, 0x458, 0x442, 0x43e, 0x432, 0x438, 0x628, 0x627, 0x626, 0x64a, 0x67d, 0x632, 0x6aa, 0x644, 0x648, 0x20, 0x628,
-0x627, 0x626, 0x64a, 0x67d, 0x632, 0x3b, 0x645, 0x64a, 0x6af, 0x627, 0x20, 0x628, 0x627, 0x626, 0x64a, 0x67d, 0x632, 0x3b, 0x6af, 0x64a,
-0x6af, 0x627, 0x20, 0x628, 0x627, 0x626, 0x64a, 0x67d, 0x632, 0x3b, 0x67d, 0x64a, 0x631, 0x627, 0x20, 0x628, 0x627, 0x626, 0x64a, 0x67d,
-0x632, 0x3b, 0x67e, 0x64a, 0x631, 0x627, 0x20, 0x628, 0x627, 0x626, 0x64a, 0x67d, 0x633, 0x3b, 0x45, 0x42, 0xdb6, 0xdba, 0xdd2, 0xda7,
-0xdca, 0xd9a, 0xdd2, 0xdb6, 0x20, 0x7b, 0x30, 0x7d, 0x3b, 0xdb8, 0xdd9, 0xdb6, 0x20, 0x7b, 0x30, 0x7d, 0x3b, 0xd9c, 0xdd2, 0xdb6,
-0x20, 0x7b, 0x30, 0x7d, 0x3b, 0xda7, 0xdd9, 0xdb6, 0x20, 0x7b, 0x30, 0x7d, 0x3b, 0xdb4, 0xdd9, 0xdb6, 0x20, 0x7b, 0x30, 0x7d,
-0x3b, 0x45, 0x42, 0x62, 0x65, 0x79, 0x74, 0x69, 0x73, 0x6b, 0x42, 0x3b, 0x4d, 0x42, 0x3b, 0x47, 0x42, 0x3b, 0x54, 0x42,
-0x3b, 0x42, 0x42, 0x3b, 0x45, 0x42, 0x6b, 0x69, 0x6c, 0x6f, 0x62, 0x61, 0x69, 0x74, 0x69, 0x20, 0x7b, 0x30, 0x7d, 0x3b,
-0x4d, 0x42, 0x20, 0x7b, 0x30, 0x7d, 0x3b, 0x47, 0x42, 0x20, 0x7b, 0x30, 0x7d, 0x3b, 0x74, 0x65, 0x72, 0x61, 0x62, 0x61,
-0x69, 0x74, 0x69, 0x20, 0x7b, 0x30, 0x7d, 0x3b, 0x50, 0x42, 0x20, 0x7b, 0x30, 0x7d, 0x3b, 0x45, 0x42, 0xbaa, 0xbc8, 0xb9f,
-0xbcd, 0xb95, 0xbb3, 0xbcd, 0xc2c, 0xc48, 0xc1f, 0xc4d, 0x200c, 0xc32, 0xc41, 0xc15, 0xc47, 0xc2c, 0xc40, 0x3b, 0xc0e, 0xc2e, 0xc4d, 0x200c,
-0xc2c, 0xc3f, 0x3b, 0xc1c, 0xc40, 0xc2c, 0xc40, 0x3b, 0xc1f, 0xc40, 0xc2c, 0xc40, 0x3b, 0xc2a, 0xc40, 0xc2c, 0xc40, 0x3b, 0x45, 0x42,
-0xe44, 0xe1a, 0xe15, 0xe4c, 0x70, 0x61, 0x69, 0x74, 0x69, 0x6b, 0x42, 0x20, 0x2bb, 0x65, 0x20, 0x7b, 0x30, 0x7d, 0x3b, 0x4d,
-0x42, 0x20, 0x2bb, 0x65, 0x20, 0x7b, 0x30, 0x7d, 0x3b, 0x47, 0x42, 0x20, 0x2bb, 0x65, 0x20, 0x7b, 0x30, 0x7d, 0x3b, 0x54,
-0x42, 0x20, 0x2bb, 0x65, 0x20, 0x7b, 0x30, 0x7d, 0x3b, 0x50, 0x42, 0x20, 0x2bb, 0x65, 0x20, 0x7b, 0x30, 0x7d, 0x3b, 0x45,
-0x42, 0x20, 0x2bb, 0x65, 0x20, 0x7b, 0x30, 0x7d, 0x4b, 0x69, 0x42, 0x20, 0x2bb, 0x65, 0x20, 0x7b, 0x30, 0x7d, 0x3b, 0x4d,
-0x69, 0x42, 0x20, 0x2bb, 0x65, 0x20, 0x7b, 0x30, 0x7d, 0x3b, 0x47, 0x69, 0x42, 0x20, 0x2bb, 0x65, 0x20, 0x7b, 0x30, 0x7d,
-0x3b, 0x54, 0x69, 0x42, 0x20, 0x2bb, 0x65, 0x20, 0x7b, 0x30, 0x7d, 0x3b, 0x50, 0x69, 0x42, 0x20, 0x2bb, 0x65, 0x20, 0x7b,
-0x30, 0x7d, 0x3b, 0x45, 0x69, 0x42, 0x20, 0x2bb, 0x65, 0x20, 0x7b, 0x30, 0x7d, 0x62, 0x61, 0xfd, 0x74, 0x431, 0x430, 0x439,
-0x442, 0x438, 0x628, 0x627, 0x626, 0x679, 0x6b, 0x42, 0x3b, 0x4d, 0x42, 0x3b, 0x47, 0x42, 0x3b, 0x54, 0x42, 0x3b, 0x67e, 0x6cc,
-0x20, 0x628, 0x6cc, 0x3b, 0x45, 0x42, 0x62, 0x65, 0x69, 0x74, 0x69, 0x61, 0x75, 0x61, 0x1e6d, 0x61, 0x6d, 0x1e0d, 0x61, 0x6e,
-0x6b, 0x41, 0x1e6c, 0x3b, 0x4d, 0x41, 0x1e6c, 0x3b, 0x47, 0x41, 0x1e6c, 0x3b, 0x54, 0x41, 0x1e6c, 0x3b, 0x50, 0x42, 0x3b, 0x45,
-0x42, 0x13d7, 0x13d3, 0x13cd, 0x13a6, 0x13b5, 0x13a9, 0x431, 0x430, 0x430, 0x439, 0x442, 0x43a, 0x411, 0x3b, 0x41c, 0x411, 0x3b, 0x47, 0x42,
-0x3b, 0x54, 0x42, 0x3b, 0x50, 0x42, 0x3b, 0x45, 0x42, 0x62, 0x79, 0x74, 0x65, 0x79, 0x6a9, 0x6cc, 0x644, 0x648, 0x628, 0x627,
-0x6cc, 0x62a, 0x3b, 0x645, 0x6af, 0x627, 0x628, 0x627, 0x6cc, 0x62a, 0x3b, 0x6af, 0x6cc, 0x6af, 0x627, 0x628, 0x627, 0x6cc, 0x62a, 0x3b,
-0x62a, 0x631, 0x627, 0x628, 0x627, 0x6cc, 0x62a, 0x3b, 0x50, 0x42, 0x3b, 0x45, 0x42
-};
-
-static const ushort am_data[] = {
-0x41, 0x4d, 0x57, 0x44, 0x76, 0x6d, 0x2e, 0x65, 0x20, 0x70, 0x61, 0x72, 0x61, 0x64, 0x69, 0x74, 0x65, 0x73, 0x1325, 0x12cb,
-0x1275, 0x635, 0x9aa, 0x9c2, 0x9f0, 0x9cd, 0x9ac, 0x9be, 0x9b9, 0x9cd, 0x9a8, 0x410, 0x41c, 0xf66, 0xf94, 0xf0b, 0xf46, 0xf0b, 0x41, 0x2e,
-0x4d, 0x2e, 0x43f, 0x440, 0x2e, 0x43e, 0x431, 0x2e, 0x1014, 0x1036, 0x1014, 0x1000, 0x103a, 0x61, 0x2e, 0xa0, 0x6d, 0x2e, 0x4e0a, 0x5348,
-0x64, 0x6f, 0x70, 0x2e, 0x61, 0x2e, 0x6d, 0x2e, 0x61, 0x6d, 0x61, 0x74, 0x6d, 0x61, 0x70, 0x2e, 0x6d, 0x61, 0x74, 0x69,
-0x6e, 0x6d, 0x3c0, 0x2e, 0x3bc, 0x2e, 0x53, 0x61, 0x66, 0x69, 0x79, 0x61, 0x5dc, 0x5e4, 0x5e0, 0x5d4, 0x5f4, 0x5e6, 0x64, 0x65,
-0x2e, 0x66, 0x2e, 0x68, 0x2e, 0x72, 0x2e, 0x6e, 0x2e, 0x5348, 0x524d, 0x49, 0x73, 0x75, 0x6b, 0xcaa, 0xcc2, 0xcb0, 0xccd, 0xcb5,
-0xcbe, 0xcb9, 0xccd, 0xca8, 0x442, 0x430, 0x4a3, 0x43a, 0x44b, 0xc624, 0xc804, 0x5a, 0x2e, 0x4d, 0x55, 0x2e, 0xe81, 0xec8, 0xead, 0xe99,
-0xe97, 0xec8, 0xebd, 0xe87, 0x70, 0x72, 0x69, 0x65, 0x6b, 0x161, 0x70, 0x75, 0x73, 0x64, 0x69, 0x65, 0x6e, 0x101, 0x6e, 0x74,
-0x254, 0x301, 0x6e, 0x67, 0x254, 0x301, 0x70, 0x72, 0x69, 0x65, 0x161, 0x70, 0x69, 0x65, 0x74, 0x43f, 0x440, 0x435, 0x442, 0x43f,
-0x43b, 0x430, 0x434, 0x43d, 0x435, 0x50, 0x47, 0x92e, 0x2e, 0x92a, 0x942, 0x2e, 0x4af, 0x2e, 0x4e9, 0x2e, 0x92a, 0x942, 0x930, 0x94d,
-0x935, 0x93e, 0x939, 0x94d, 0x928, 0x63a, 0x2e, 0x645, 0x2e, 0x642, 0x628, 0x644, 0x200c, 0x627, 0x632, 0x638, 0x647, 0x631, 0x64, 0x61,
-0x20, 0x6d, 0x61, 0x6e, 0x68, 0xe3, 0xa2a, 0xa42, 0x2e, 0xa26, 0xa41, 0x2e, 0x4e, 0x44, 0x43f, 0x440, 0x435, 0x20, 0x43f, 0x43e,
-0x434, 0x43d, 0x435, 0x70, 0x72, 0x69, 0x6a, 0x65, 0x20, 0x70, 0x6f, 0x64, 0x6e, 0x65, 0x70, 0x72, 0x65, 0x20, 0x70, 0x6f,
-0x64, 0x6e, 0x65, 0x43f, 0x440, 0x438, 0x458, 0x435, 0x20, 0x43f, 0x43e, 0x434, 0x43d, 0x435, 0x4d5, 0x43c, 0x431, 0x438, 0x441, 0x431,
-0x43e, 0x43d, 0x44b, 0x20, 0x440, 0x430, 0x437, 0x43c, 0x4d5, 0x635, 0x628, 0x62d, 0x60c, 0x20, 0x645, 0x646, 0x62c, 0x647, 0x646, 0x62f,
-0xdb4, 0xdd9, 0x2e, 0xdc0, 0x2e, 0x47, 0x48, 0x66, 0x6d, 0x43f, 0x435, 0x2e, 0xa0, 0x447, 0x43e, 0x2e, 0xbae, 0xbc1, 0xbb1, 0xbcd,
-0xbaa, 0xb95, 0xbb2, 0xbcd, 0xe01, 0xe48, 0xe2d, 0xe19, 0xe40, 0xe17, 0xe35, 0xe48, 0xe22, 0xe07, 0xf66, 0xf94, 0xf0b, 0xf51, 0xfb2, 0xf7c,
-0xf0b, 0x1295, 0x1309, 0x1206, 0x20, 0x1230, 0x12d3, 0x1270, 0x68, 0x65, 0x6e, 0x67, 0x69, 0x68, 0x65, 0x6e, 0x67, 0x69, 0xd6, 0xd6,
-0x67, 0xfc, 0x6e, 0x6f, 0x72, 0x74, 0x61, 0x64, 0x61, 0x6e, 0x20, 0xf6, 0x148, 0x686, 0x6c8, 0x634, 0x62a, 0x649, 0x646, 0x20,
-0x628, 0x6c7, 0x631, 0x6c7, 0x646, 0x434, 0x43f, 0x54, 0x4f, 0x422, 0x41e, 0x53, 0x41, 0x79, 0x62, 0x53, 0x75, 0x62, 0x5e4, 0x5bf,
-0x5d0, 0x5b7, 0x5e8, 0x5de, 0x5d9, 0x5d8, 0x5d0, 0x5b8, 0x5d2, 0xc0, 0xe1, 0x72, 0x1ecd, 0x300, 0xc0, 0xe1, 0x72, 0x254, 0x300, 0x66,
-0x6f, 0x72, 0x6d, 0x69, 0x64, 0x64, 0x61, 0x67, 0x70, 0x72, 0x69, 0x6a, 0x65, 0x70, 0x6f, 0x64, 0x6e, 0x65, 0x41, 0x4e,
-0x4e, 0x2019, 0x1ee5, 0x74, 0x1ee5, 0x74, 0x1ee5, 0x128, 0x79, 0x61, 0x6b, 0x77, 0x61, 0x6b, 0x79, 0x61, 0x61, 0x2e, 0x14b, 0x64,
-0x69, 0x61, 0x6d, 0x20, 0x56, 0x6f, 0x72, 0x6d, 0x69, 0x74, 0x74, 0x61, 0x67, 0xa3b8, 0xa111, 0x69, 0x111, 0x69, 0x74, 0x62,
-0x65, 0x61, 0x69, 0x76, 0x65, 0x74, 0x69, 0x62, 0x4d, 0x61, 0x6d, 0x62, 0x69, 0x61, 0x4c, 0x75, 0x6d, 0x61, 0x20, 0x6c,
-0x77, 0x61, 0x20, 0x4b, 0x73, 0x75, 0x62, 0x61, 0x6b, 0x61, 0x4b, 0x69, 0x72, 0x6f, 0x6b, 0x6f, 0x54, 0x65, 0x73, 0x69,
-0x72, 0x61, 0x6e, 0x6b, 0x61, 0x6e, 0x67, 0x2019, 0x61, 0x6d, 0x61, 0x2d5c, 0x2d49, 0x2d3c, 0x2d30, 0x2d61, 0x2d5c, 0x74, 0x69, 0x66,
-0x61, 0x77, 0x74, 0x6e, 0x20, 0x74, 0x75, 0x66, 0x61, 0x74, 0x70, 0x61, 0x6d, 0x69, 0x6c, 0x61, 0x75, 0x75, 0x74, 0x75,
-0x6b, 0x6f, 0x4b, 0x49, 0x13cc, 0x13be, 0x13b4, 0x4d, 0x75, 0x68, 0x69, 0x54, 0x4f, 0x4f, 0x75, 0x6c, 0x75, 0x63, 0x68, 0x65,
-0x6c, 0x6f, 0x52, 0x168, 0x6b, 0x61, 0x72, 0x6f, 0x6f, 0x6e, 0x1c1, 0x67, 0x6f, 0x61, 0x67, 0x61, 0x73, 0x55, 0x68, 0x72,
-0x20, 0x76, 0xf6, 0x72, 0x6d, 0x69, 0x64, 0x64, 0x61, 0x61, 0x63, 0x68, 0x73, 0x190, 0x6e, 0x6b, 0x61, 0x6b, 0x25b, 0x6e,
-0x79, 0xe1, 0x4d, 0x75, 0x6e, 0x6b, 0x79, 0x6f, 0x69, 0x63, 0x68, 0x65, 0x68, 0x65, 0x61, 0x76, 0x6f, 0x54, 0x61, 0x70,
-0x61, 0x72, 0x61, 0x63, 0x68, 0x75, 0x41, 0x64, 0x64, 0x75, 0x68, 0x61, 0x4f, 0x44, 0x5a, 0x64, 0x61, 0x74, 0x20, 0x61,
-0x7a, 0x61, 0x6c, 0x6d, 0x61, 0x6b, 0x65, 0x6f, 0x92b, 0x941, 0x902, 0x44, 0x69, 0x6e, 0x64, 0x61, 0x6d, 0x6f, 0x69, 0x65,
-0x73, 0x61, 0x2e, 0x67, 0x49, 0x20, 0x62, 0x69, 0x6b, 0x25b, 0x302, 0x67, 0x6c, 0xe0, 0x53, 0x75, 0x62, 0x62, 0x61, 0x61,
-0x68, 0x69, 0x69, 0x64, 0x69, 0x253, 0x61, 0x6b, 0xed, 0x6b, 0xed, 0x72, 0xed, 0x67, 0x73, 0xe1, 0x72, 0xfa, 0x77, 0xe1,
-0x77, 0x69, 0x63, 0x68, 0x69, 0x73, 0x68, 0x75, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6d, 0x61, 0x6e, 0xe1, 0x52, 0x57, 0x42d,
-0x418, 0x4c, 0x77, 0x61, 0x6d, 0x69, 0x6c, 0x61, 0x77, 0x75, 0x6b, 0x69, 0x25b, 0x6d, 0x25b, 0x301, 0x25b, 0x6d, 0x64, 0x65,
-0x20, 0x6c, 0x61, 0x20, 0x6d, 0x61, 0xf1, 0x61, 0x6e, 0x61, 0x6d, 0x62, 0x61, 0xa78c, 0x6d, 0x62, 0x61, 0xa78c, 0x6d, 0x62,
-0x61, 0x2bc, 0xe1, 0x6d, 0x62, 0x61, 0x2bc, 0x628, 0x2e, 0x646, 0x64, 0x6f, 0x70, 0x6f, 0x142, 0x64, 0x6e, 0x6a, 0x61, 0x69,
-0x70, 0x2e
-};
-
-static const ushort pm_data[] = {
-0x50, 0x4d, 0x57, 0x42, 0x6e, 0x6d, 0x2e, 0x65, 0x20, 0x70, 0x61, 0x73, 0x64, 0x69, 0x74, 0x65, 0x73, 0x12a8, 0x1230, 0x12d3,
-0x1275, 0x645, 0x985, 0x9aa, 0x9f0, 0x9be, 0x9b9, 0x9cd, 0x9a8, 0x41f, 0x41c, 0xf55, 0xfb1, 0xf72, 0xf0b, 0xf46, 0xf0b, 0x47, 0x2e, 0x4d,
-0x2e, 0x441, 0x43b, 0x2e, 0x43e, 0x431, 0x2e, 0x100a, 0x1014, 0x1031, 0x70, 0x2e, 0xa0, 0x6d, 0x2e, 0x4e0b, 0x5348, 0x6f, 0x64, 0x70,
-0x2e, 0x70, 0x2e, 0x6d, 0x2e, 0x70, 0x6d, 0x70, 0x74, 0x6d, 0x69, 0x70, 0x2e, 0x73, 0x6f, 0x69, 0x72, 0x66, 0x3bc, 0x2e,
-0x3bc, 0x2e, 0x59, 0x61, 0x6d, 0x6d, 0x61, 0x5d0, 0x5d7, 0x5d4, 0x5f4, 0x5e6, 0x64, 0x75, 0x2e, 0x65, 0x2e, 0x68, 0x2e, 0x69,
-0x2e, 0x6e, 0x2e, 0x5348, 0x5f8c, 0x57, 0x65, 0x6e, 0x67, 0x69, 0xc85, 0xcaa, 0xcb0, 0xcbe, 0xcb9, 0xccd, 0xca8, 0x442, 0x4af, 0x448,
-0x442, 0x4e9, 0x43d, 0x20, 0x43a, 0x438, 0x439, 0x438, 0x43d, 0x43a, 0x438, 0xc624, 0xd6c4, 0x5a, 0x2e, 0x4d, 0x57, 0x2e, 0xeab, 0xebc,
-0xeb1, 0xe87, 0xe97, 0xec8, 0xebd, 0xe87, 0x70, 0x113, 0x63, 0x70, 0x75, 0x73, 0x64, 0x69, 0x65, 0x6e, 0x101, 0x6d, 0x70, 0xf3,
-0x6b, 0x77, 0x61, 0x70, 0x6f, 0x70, 0x69, 0x65, 0x74, 0x43f, 0x43e, 0x43f, 0x43b, 0x430, 0x434, 0x43d, 0x435, 0x50, 0x54, 0x47,
-0x92e, 0x2e, 0x909, 0x2e, 0x4af, 0x2e, 0x445, 0x2e, 0x905, 0x92a, 0x930, 0x93e, 0x939, 0x94d, 0x928, 0x63a, 0x2e, 0x648, 0x2e, 0x628,
-0x639, 0x62f, 0x627, 0x632, 0x638, 0x647, 0x631, 0x64, 0x61, 0x20, 0x74, 0x61, 0x72, 0x64, 0x65, 0xa2c, 0xa3e, 0x2e, 0xa26, 0xa41,
-0x2e, 0x4c, 0x4b, 0x43f, 0x43e, 0x20, 0x43f, 0x43e, 0x434, 0x43d, 0x435, 0x70, 0x6f, 0x20, 0x70, 0x6f, 0x64, 0x6e, 0x65, 0x4d5,
-0x43c, 0x431, 0x438, 0x441, 0x431, 0x43e, 0x43d, 0x44b, 0x20, 0x444, 0x4d5, 0x441, 0x442, 0x4d5, 0x645, 0x646, 0x62c, 0x647, 0x646, 0x62f,
-0x60c, 0x20, 0x634, 0x627, 0x645, 0xdb4, 0x2e, 0xdc0, 0x2e, 0x70, 0x6f, 0x70, 0x2e, 0x47, 0x44, 0x65, 0x6d, 0x43f, 0x430, 0x2e,
-0xa0, 0x447, 0x43e, 0x2e, 0xbaa, 0xbbf, 0xbb1, 0xbcd, 0xbaa, 0xb95, 0xbb2, 0xbcd, 0xe2b, 0xe25, 0xe31, 0xe07, 0xe40, 0xe17, 0xe35, 0xe48,
-0xe22, 0xe07, 0xf55, 0xfb1, 0xf72, 0xf0b, 0xf51, 0xfb2, 0xf7c, 0xf0b, 0x12f5, 0x1215, 0x122d, 0x20, 0x1230, 0x12d3, 0x1275, 0x65, 0x66, 0x69,
-0x61, 0x66, 0x69, 0xd6, 0x53, 0x67, 0xfc, 0x6e, 0x6f, 0x72, 0x74, 0x61, 0x64, 0x61, 0x6e, 0x20, 0x73, 0x6f, 0x148, 0x686,
-0x6c8, 0x634, 0x62a, 0x649, 0x646, 0x20, 0x643, 0x6d0, 0x64a, 0x649, 0x646, 0x43f, 0x43f, 0x54, 0x4b, 0x422, 0x41a, 0x43, 0x48, 0x79,
-0x68, 0x4e, 0x67, 0x6f, 0x5e0, 0x5d0, 0x5b8, 0x5db, 0x5de, 0x5d9, 0x5d8, 0x5d0, 0x5b8, 0x5d2, 0x1ecc, 0x300, 0x73, 0xe1, 0x6e, 0x186,
-0x300, 0x73, 0xe1, 0x6e, 0x65, 0x74, 0x74, 0x65, 0x72, 0x6d, 0x69, 0x64, 0x64, 0x61, 0x67, 0x70, 0x6f, 0x70, 0x6f, 0x64,
-0x6e, 0x65, 0x43f, 0x43e, 0x43f, 0x43e, 0x434, 0x43d, 0x435, 0x45, 0x57, 0x92e, 0x2e, 0x928, 0x902, 0x2e, 0x4e, 0x2019, 0x61, 0x62,
-0x61, 0x6c, 0x69, 0x128, 0x79, 0x61, 0x77, 0x129, 0x6f, 0x6f, 0x70, 0x2e, 0x263, 0x65, 0x74, 0x72, 0x254, 0x61, 0x6d, 0x20,
-0x4e, 0x61, 0x6d, 0x69, 0x74, 0x74, 0x61, 0x67, 0xa06f, 0xa2d2, 0x65, 0x61, 0x68, 0x6b, 0x65, 0x74, 0x62, 0x65, 0x61, 0x69,
-0x76, 0x65, 0x74, 0x65, 0x62, 0x4d, 0x6f, 0x67, 0x6c, 0x75, 0x6d, 0x61, 0x20, 0x6c, 0x77, 0x61, 0x20, 0x70, 0x6b, 0x69,
-0x6b, 0x69, 0x69, 0x257, 0x65, 0x48, 0x77, 0x61, 0x129, 0x2d, 0x69, 0x6e, 0x129, 0x54, 0x65, 0x69, 0x70, 0x61, 0x6b, 0x69,
-0x6e, 0x67, 0x6f, 0x74, 0x6f, 0x2d5c, 0x2d30, 0x2d37, 0x2d33, 0x2d33, 0x2d6f, 0x2d30, 0x2d5c, 0x74, 0x61, 0x64, 0x67, 0x67, 0x2b7, 0x61,
-0x74, 0x6e, 0x20, 0x74, 0x6d, 0x65, 0x64, 0x64, 0x69, 0x74, 0x70, 0x61, 0x6d, 0x75, 0x6e, 0x79, 0x69, 0x6b, 0x79, 0x69,
-0x75, 0x6b, 0x6f, 0x6e, 0x79, 0x69, 0x55, 0x54, 0x13d2, 0x13af, 0x13f1, 0x13a2, 0x13d7, 0x13e2, 0x43, 0x68, 0x69, 0x6c, 0x6f, 0x4d,
-0x55, 0x55, 0x61, 0x6b, 0x61, 0x73, 0x75, 0x62, 0x61, 0x168, 0x47, 0x6b, 0x6f, 0x6f, 0x73, 0x6b, 0x6f, 0x6c, 0x69, 0x6e,
-0x79, 0x1c3, 0x75, 0x69, 0x61, 0x73, 0x55, 0x68, 0x72, 0x20, 0x6e, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x61, 0x63,
-0x68, 0x73, 0x190, 0x6e, 0x64, 0xe1, 0x6d, 0xe2, 0x45, 0x69, 0x67, 0x75, 0x6c, 0x6f, 0x69, 0x63, 0x68, 0x61, 0x6d, 0x74,
-0x68, 0x69, 0x45, 0x62, 0x6f, 0x6e, 0x67, 0x69, 0x41, 0x6c, 0x75, 0x75, 0x6c, 0x61, 0x4f, 0x54, 0x1e0c, 0x65, 0x66, 0x66,
-0x69, 0x72, 0x20, 0x61, 0x7a, 0x61, 0x6e, 0x79, 0x69, 0x61, 0x67, 0x68, 0x75, 0x6f, 0x92c, 0x947, 0x932, 0x93e, 0x938, 0x947,
-0x44, 0x69, 0x6c, 0x6f, 0x6c, 0x6f, 0x6e, 0x6f, 0x6d, 0xeb, 0x74, 0x74, 0x65, 0x73, 0x61, 0x2e, 0x6b, 0x49, 0x20, 0x253,
-0x75, 0x67, 0x61, 0x6a, 0x254, 0x70, 0x5a, 0x61, 0x61, 0x72, 0x69, 0x6b, 0x61, 0x79, 0x20, 0x62, 0x65, 0x62, 0x79, 0xe1,
-0x6d, 0x75, 0x6e, 0x67, 0x259, 0x67, 0xf3, 0x67, 0x259, 0x6c, 0x65, 0x63, 0x25b, 0x25b, 0x301, 0x6e, 0x6b, 0x6f, 0x6d, 0x63,
-0x68, 0x6f, 0x63, 0x68, 0x69, 0x6c, 0x2019, 0x6c, 0x6c, 0x69, 0x6c, 0x6c, 0x69, 0x6b, 0x75, 0x67, 0xfa, 0x54, 0x14a, 0x42d,
-0x41a, 0x50, 0x61, 0x73, 0x68, 0x61, 0x6d, 0x69, 0x68, 0x65, 0x6b, 0x69, 0x73, 0x25b, 0x301, 0x6e, 0x64, 0x25b, 0x64, 0x65,
-0x20, 0x6c, 0x61, 0x20, 0x74, 0x61, 0x72, 0x64, 0x65, 0x14b, 0x6b, 0x61, 0x20, 0x6d, 0x62, 0x254, 0x301, 0x74, 0x20, 0x6e,
-0x6a, 0x69, 0x6e, 0x63, 0x77, 0xf2, 0x6e, 0x7a, 0xe9, 0x6d, 0x62f, 0x2e, 0x646, 0x77, 0xf3, 0x74, 0x70, 0x6f, 0x142, 0x64,
-0x6e, 0x6a, 0x61, 0x70, 0x6f, 0x70, 0x6f, 0x142, 0x64, 0x6e, 0x6a, 0x75, 0x65, 0x70, 0x2e
-};
-
-static const ushort currency_symbol_data[] = {
-0x42, 0x72, 0x4b, 0x73, 0x68, 0x52, 0x24, 0x4c, 0x65, 0x6b, 0xeb, 0x64, 0x65, 0x6e, 0x20ac, 0x1265, 0x122d, 0x62c, 0x2e, 0x645,
-0x2e, 0x200f, 0x62f, 0x2e, 0x62c, 0x2e, 0x200f, 0x62f, 0x2e, 0x628, 0x2e, 0x200f, 0x46, 0x43, 0x46, 0x41, 0x43, 0x46, 0x46, 0x64,
-0x6a, 0x4e, 0x66, 0x6b, 0x62f, 0x2e, 0x639, 0x2e, 0x200f, 0x20aa, 0x62f, 0x2e, 0x623, 0x2e, 0x200f, 0x62f, 0x2e, 0x643, 0x2e, 0x200f,
-0x644, 0x2e, 0x644, 0x2e, 0x200f, 0x62f, 0x2e, 0x644, 0x2e, 0x200f, 0x623, 0x2e, 0x645, 0x2e, 0x62f, 0x2e, 0x645, 0x2e, 0x200f, 0x631,
-0x2e, 0x639, 0x2e, 0x200f, 0x631, 0x2e, 0x642, 0x2e, 0x200f, 0x631, 0x2e, 0x633, 0x2e, 0x200f, 0x53, 0x62c, 0x2e, 0x633, 0x2e, 0x644,
-0x2e, 0x633, 0x2e, 0x200f, 0x62f, 0x2e, 0x62a, 0x2e, 0x200f, 0x62f, 0x2e, 0x625, 0x2e, 0x200f, 0x631, 0x2e, 0x64a, 0x2e, 0x200f, 0xa3,
-0x58f, 0x20b9, 0x20bc, 0x20bd, 0x9f3, 0x4e, 0x75, 0x2e, 0x43b, 0x432, 0x2e, 0x4b, 0x17db, 0xffe5, 0x4d, 0x4f, 0x50, 0x24, 0x6b, 0x6e,
-0x4b, 0x4d, 0x4b, 0x10d, 0x6b, 0x72, 0x2e, 0x41, 0x66, 0x6c, 0x2e, 0x4e, 0x41, 0x66, 0x2e, 0x55, 0x53, 0x24, 0x50, 0x46,
-0x42, 0x75, 0x44, 0x47, 0x48, 0x20b5, 0x48, 0x4b, 0x24, 0x41, 0x72, 0x4d, 0x4b, 0x52, 0x4d, 0x52, 0x73, 0x20a6, 0x20b1, 0x52,
-0x46, 0x57, 0x53, 0x24, 0x53, 0x52, 0x4c, 0x65, 0x45, 0x6b, 0x72, 0x54, 0x53, 0x68, 0x54, 0x24, 0x55, 0x53, 0x68, 0x41,
-0x45, 0x44, 0x56, 0x54, 0x44, 0x41, 0x43, 0x46, 0x41, 0x46, 0x43, 0x46, 0x43, 0x46, 0x50, 0x46, 0x47, 0x47, 0x55, 0x4d,
-0x4c, 0x53, 0x44, 0x54, 0x20be, 0x43, 0x48, 0x46, 0x20b2, 0x46, 0x74, 0x52, 0x70, 0x43, 0x41, 0x24, 0x20b8, 0x441, 0x43e, 0x43c,
-0x20a9, 0x20ba, 0x20ad, 0x4b, 0x7a, 0x434, 0x435, 0x43d, 0x20ae, 0x43, 0x4e, 0xa5, 0x928, 0x947, 0x930, 0x942, 0x60b, 0x631, 0x6cc, 0x627,
-0x644, 0x7a, 0x142, 0x52, 0x24, 0x200b, 0x4d, 0x54, 0x6e, 0x44, 0x62, 0x631, 0x53, 0x2f, 0x42, 0x73, 0x6c, 0x65, 0x69, 0x4c,
-0x20b4, 0x41a, 0x41c, 0xdbb, 0xdd4, 0x2e, 0x20a1, 0x52, 0x44, 0x24, 0x51, 0x43, 0x24, 0x42, 0x2f, 0x2e, 0x47, 0x73, 0x2e, 0x42,
-0x73, 0x2e, 0x53, 0x441, 0x43e, 0x43c, 0x2e, 0x52, 0x73, 0x2e, 0xe3f, 0xa5, 0x54, 0x4d, 0x54, 0x73, 0x6f, 0x2bb, 0x6d, 0x441,
-0x45e, 0x43c, 0x20ab, 0x4e, 0x54, 0x24, 0x41, 0x24, 0x49, 0x52, 0x52
-};
-
-static const ushort currency_display_name_data[] = {
-0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x49, 0x74, 0x6f, 0x6f, 0x70, 0x68, 0x69, 0x79, 0x61, 0x61, 0x20, 0x42, 0x69,
-0x72, 0x72, 0x69, 0x69, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x53, 0x75, 0x69, 0x64, 0x2d, 0x41, 0x66, 0x72, 0x69,
-0x6b, 0x61, 0x61, 0x6e, 0x73, 0x65, 0x20, 0x72, 0x61, 0x6e, 0x64, 0x3b, 0x3b, 0x53, 0x75, 0x69, 0x64, 0x2d, 0x41, 0x66,
-0x72, 0x69, 0x6b, 0x61, 0x61, 0x6e, 0x73, 0x65, 0x20, 0x72, 0x61, 0x6e, 0x64, 0x3b, 0x3b, 0x3b, 0x3b, 0x53, 0x75, 0x69,
-0x64, 0x2d, 0x41, 0x66, 0x72, 0x69, 0x6b, 0x61, 0x61, 0x6e, 0x73, 0x65, 0x20, 0x72, 0x61, 0x6e, 0x64, 0x3b, 0x4e, 0x61,
-0x6d, 0x69, 0x62, 0x69, 0x65, 0x73, 0x65, 0x20, 0x64, 0x6f, 0x6c, 0x6c, 0x61, 0x72, 0x3b, 0x3b, 0x4e, 0x61, 0x6d, 0x69,
-0x62, 0x69, 0x65, 0x73, 0x65, 0x20, 0x64, 0x6f, 0x6c, 0x6c, 0x61, 0x72, 0x3b, 0x3b, 0x3b, 0x3b, 0x4e, 0x61, 0x6d, 0x69,
-0x62, 0x69, 0x65, 0x73, 0x65, 0x20, 0x64, 0x6f, 0x6c, 0x6c, 0x61, 0x72, 0x3b, 0x4c, 0x65, 0x6b, 0x75, 0x20, 0x73, 0x68,
-0x71, 0x69, 0x70, 0x74, 0x61, 0x72, 0x3b, 0x3b, 0x6c, 0x65, 0x6b, 0x20, 0x73, 0x68, 0x71, 0x69, 0x70, 0x74, 0x61, 0x72,
-0x3b, 0x3b, 0x3b, 0x3b, 0x6c, 0x65, 0x6b, 0xeb, 0x20, 0x73, 0x68, 0x71, 0x69, 0x70, 0x74, 0x61, 0x72, 0x3b, 0x44, 0x65,
-0x6e, 0x61, 0x72, 0x69, 0x20, 0x6d, 0x61, 0x71, 0x65, 0x64, 0x6f, 0x6e, 0x61, 0x73, 0x3b, 0x3b, 0x64, 0x65, 0x6e, 0x61,
-0x72, 0x20, 0x6d, 0x61, 0x71, 0x65, 0x64, 0x6f, 0x6e, 0x61, 0x73, 0x3b, 0x3b, 0x3b, 0x3b, 0x64, 0x65, 0x6e, 0x61, 0x72,
-0xeb, 0x20, 0x6d, 0x61, 0x71, 0x65, 0x64, 0x6f, 0x6e, 0x61, 0x73, 0x3b, 0x45, 0x75, 0x72, 0x6f, 0x6a, 0x61, 0x3b, 0x3b,
-0x65, 0x75, 0x72, 0x6f, 0x3b, 0x3b, 0x3b, 0x3b, 0x65, 0x75, 0x72, 0x6f, 0x3b, 0x12e8, 0x12a2, 0x1275, 0x12ee, 0x1335, 0x12eb, 0x20,
-0x1265, 0x122d, 0x3b, 0x3b, 0x12e8, 0x12a2, 0x1275, 0x12ee, 0x1335, 0x12eb, 0x20, 0x1265, 0x122d, 0x3b, 0x3b, 0x3b, 0x3b, 0x12e8, 0x12a2, 0x1275,
-0x12ee, 0x1335, 0x12eb, 0x20, 0x1265, 0x122d, 0x3b, 0x62c, 0x646, 0x64a, 0x647, 0x20, 0x645, 0x635, 0x631, 0x64a, 0x3b, 0x62c, 0x646, 0x64a,
-0x647, 0x20, 0x645, 0x635, 0x631, 0x64a, 0x3b, 0x62c, 0x646, 0x64a, 0x647, 0x20, 0x645, 0x635, 0x631, 0x64a, 0x3b, 0x62c, 0x646, 0x64a,
-0x647, 0x627, 0x646, 0x20, 0x645, 0x635, 0x631, 0x64a, 0x627, 0x646, 0x3b, 0x62c, 0x646, 0x64a, 0x647, 0x627, 0x62a, 0x20, 0x645, 0x635,
-0x631, 0x64a, 0x629, 0x3b, 0x62c, 0x646, 0x64a, 0x647, 0x64b, 0x627, 0x20, 0x645, 0x635, 0x631, 0x64a, 0x64b, 0x627, 0x3b, 0x62c, 0x646,
-0x64a, 0x647, 0x20, 0x645, 0x635, 0x631, 0x64a, 0x3b, 0x62f, 0x64a, 0x646, 0x627, 0x631, 0x20, 0x62c, 0x632, 0x627, 0x626, 0x631, 0x64a,
-0x3b, 0x62f, 0x64a, 0x646, 0x627, 0x631, 0x20, 0x62c, 0x632, 0x627, 0x626, 0x631, 0x64a, 0x3b, 0x62f, 0x64a, 0x646, 0x627, 0x631, 0x20,
-0x62c, 0x632, 0x627, 0x626, 0x631, 0x64a, 0x3b, 0x62f, 0x64a, 0x646, 0x627, 0x631, 0x627, 0x646, 0x20, 0x62c, 0x632, 0x627, 0x626, 0x631,
-0x64a, 0x627, 0x646, 0x3b, 0x62f, 0x64a, 0x646, 0x627, 0x631, 0x627, 0x62a, 0x20, 0x62c, 0x632, 0x627, 0x626, 0x631, 0x64a, 0x629, 0x3b,
-0x62f, 0x64a, 0x646, 0x627, 0x631, 0x64b, 0x627, 0x20, 0x62c, 0x632, 0x627, 0x626, 0x631, 0x64a, 0x64b, 0x627, 0x3b, 0x62f, 0x64a, 0x646,
-0x627, 0x631, 0x20, 0x62c, 0x632, 0x627, 0x626, 0x631, 0x64a, 0x3b, 0x62f, 0x64a, 0x646, 0x627, 0x631, 0x20, 0x628, 0x62d, 0x631, 0x64a,
-0x646, 0x64a, 0x3b, 0x62f, 0x64a, 0x646, 0x627, 0x631, 0x20, 0x628, 0x62d, 0x631, 0x64a, 0x646, 0x64a, 0x3b, 0x62f, 0x64a, 0x646, 0x627,
-0x631, 0x20, 0x628, 0x62d, 0x631, 0x64a, 0x646, 0x64a, 0x3b, 0x62f, 0x64a, 0x646, 0x627, 0x631, 0x20, 0x628, 0x62d, 0x631, 0x64a, 0x646,
-0x64a, 0x3b, 0x62f, 0x64a, 0x646, 0x627, 0x631, 0x20, 0x628, 0x62d, 0x631, 0x64a, 0x646, 0x64a, 0x3b, 0x62f, 0x64a, 0x646, 0x627, 0x631,
-0x20, 0x628, 0x62d, 0x631, 0x64a, 0x646, 0x64a, 0x3b, 0x62f, 0x64a, 0x646, 0x627, 0x631, 0x20, 0x628, 0x62d, 0x631, 0x64a, 0x646, 0x64a,
-0x3b, 0x641, 0x631, 0x646, 0x643, 0x20, 0x648, 0x633, 0x637, 0x20, 0x623, 0x641, 0x631, 0x64a, 0x642, 0x64a, 0x3b, 0x641, 0x631, 0x646,
-0x643, 0x20, 0x648, 0x633, 0x637, 0x20, 0x623, 0x641, 0x631, 0x64a, 0x642, 0x64a, 0x3b, 0x641, 0x631, 0x646, 0x643, 0x20, 0x648, 0x633,
-0x637, 0x20, 0x623, 0x641, 0x631, 0x64a, 0x642, 0x64a, 0x3b, 0x641, 0x631, 0x646, 0x643, 0x20, 0x648, 0x633, 0x637, 0x20, 0x623, 0x641,
-0x631, 0x64a, 0x642, 0x64a, 0x3b, 0x641, 0x631, 0x646, 0x643, 0x20, 0x648, 0x633, 0x637, 0x20, 0x623, 0x641, 0x631, 0x64a, 0x642, 0x64a,
-0x3b, 0x641, 0x631, 0x646, 0x643, 0x20, 0x648, 0x633, 0x637, 0x20, 0x623, 0x641, 0x631, 0x64a, 0x642, 0x64a, 0x3b, 0x641, 0x631, 0x646,
-0x643, 0x20, 0x648, 0x633, 0x637, 0x20, 0x623, 0x641, 0x631, 0x64a, 0x642, 0x64a, 0x3b, 0x641, 0x631, 0x646, 0x643, 0x20, 0x62c, 0x632,
-0x631, 0x20, 0x627, 0x644, 0x642, 0x645, 0x631, 0x3b, 0x641, 0x631, 0x646, 0x643, 0x20, 0x62c, 0x632, 0x631, 0x20, 0x627, 0x644, 0x642,
-0x645, 0x631, 0x3b, 0x641, 0x631, 0x646, 0x643, 0x20, 0x62c, 0x632, 0x631, 0x20, 0x627, 0x644, 0x642, 0x645, 0x631, 0x3b, 0x641, 0x631,
-0x646, 0x643, 0x20, 0x62c, 0x632, 0x631, 0x20, 0x627, 0x644, 0x642, 0x645, 0x631, 0x3b, 0x641, 0x631, 0x646, 0x643, 0x20, 0x62c, 0x632,
-0x631, 0x20, 0x627, 0x644, 0x642, 0x645, 0x631, 0x3b, 0x641, 0x631, 0x646, 0x643, 0x20, 0x62c, 0x632, 0x631, 0x20, 0x627, 0x644, 0x642,
-0x645, 0x631, 0x3b, 0x641, 0x631, 0x646, 0x643, 0x20, 0x62c, 0x632, 0x631, 0x20, 0x627, 0x644, 0x642, 0x645, 0x631, 0x3b, 0x641, 0x631,
-0x646, 0x643, 0x20, 0x62c, 0x64a, 0x628, 0x648, 0x62a, 0x64a, 0x3b, 0x641, 0x631, 0x646, 0x643, 0x20, 0x62c, 0x64a, 0x628, 0x648, 0x62a,
-0x64a, 0x3b, 0x641, 0x631, 0x646, 0x643, 0x20, 0x62c, 0x64a, 0x628, 0x648, 0x62a, 0x64a, 0x3b, 0x641, 0x631, 0x646, 0x643, 0x20, 0x62c,
-0x64a, 0x628, 0x648, 0x62a, 0x64a, 0x3b, 0x641, 0x631, 0x646, 0x643, 0x20, 0x62c, 0x64a, 0x628, 0x648, 0x62a, 0x64a, 0x3b, 0x641, 0x631,
-0x646, 0x643, 0x20, 0x62c, 0x64a, 0x628, 0x648, 0x62a, 0x64a, 0x3b, 0x641, 0x631, 0x646, 0x643, 0x20, 0x62c, 0x64a, 0x628, 0x648, 0x62a,
-0x64a, 0x3b, 0x646, 0x627, 0x643, 0x641, 0x627, 0x20, 0x623, 0x631, 0x64a, 0x62a, 0x631, 0x64a, 0x3b, 0x646, 0x627, 0x643, 0x641, 0x627,
-0x20, 0x623, 0x631, 0x64a, 0x62a, 0x631, 0x64a, 0x3b, 0x646, 0x627, 0x643, 0x641, 0x627, 0x20, 0x623, 0x631, 0x64a, 0x62a, 0x631, 0x64a,
-0x3b, 0x646, 0x627, 0x643, 0x641, 0x627, 0x20, 0x623, 0x631, 0x64a, 0x62a, 0x631, 0x64a, 0x3b, 0x646, 0x627, 0x643, 0x641, 0x627, 0x20,
-0x623, 0x631, 0x64a, 0x62a, 0x631, 0x64a, 0x3b, 0x646, 0x627, 0x643, 0x641, 0x627, 0x20, 0x623, 0x631, 0x64a, 0x62a, 0x631, 0x64a, 0x3b,
-0x646, 0x627, 0x643, 0x641, 0x627, 0x20, 0x623, 0x631, 0x64a, 0x62a, 0x631, 0x64a, 0x3b, 0x62f, 0x64a, 0x646, 0x627, 0x631, 0x20, 0x639,
-0x631, 0x627, 0x642, 0x64a, 0x3b, 0x62f, 0x64a, 0x646, 0x627, 0x631, 0x20, 0x639, 0x631, 0x627, 0x642, 0x64a, 0x3b, 0x62f, 0x64a, 0x646,
-0x627, 0x631, 0x20, 0x639, 0x631, 0x627, 0x642, 0x64a, 0x3b, 0x62f, 0x64a, 0x646, 0x627, 0x631, 0x20, 0x639, 0x631, 0x627, 0x642, 0x64a,
-0x3b, 0x62f, 0x64a, 0x646, 0x627, 0x631, 0x20, 0x639, 0x631, 0x627, 0x642, 0x64a, 0x3b, 0x62f, 0x64a, 0x646, 0x627, 0x631, 0x20, 0x639,
-0x631, 0x627, 0x642, 0x64a, 0x3b, 0x62f, 0x64a, 0x646, 0x627, 0x631, 0x20, 0x639, 0x631, 0x627, 0x642, 0x64a, 0x3b, 0x634, 0x64a, 0x643,
-0x644, 0x20, 0x625, 0x633, 0x631, 0x627, 0x626, 0x64a, 0x644, 0x64a, 0x20, 0x62c, 0x62f, 0x64a, 0x62f, 0x3b, 0x634, 0x64a, 0x643, 0x644,
-0x20, 0x625, 0x633, 0x631, 0x627, 0x626, 0x64a, 0x644, 0x64a, 0x20, 0x62c, 0x62f, 0x64a, 0x62f, 0x3b, 0x634, 0x64a, 0x643, 0x644, 0x20,
-0x625, 0x633, 0x631, 0x627, 0x626, 0x64a, 0x644, 0x64a, 0x20, 0x62c, 0x62f, 0x64a, 0x62f, 0x3b, 0x634, 0x64a, 0x643, 0x644, 0x20, 0x625,
-0x633, 0x631, 0x627, 0x626, 0x64a, 0x644, 0x64a, 0x20, 0x62c, 0x62f, 0x64a, 0x62f, 0x3b, 0x634, 0x64a, 0x643, 0x644, 0x20, 0x625, 0x633,
-0x631, 0x627, 0x626, 0x64a, 0x644, 0x64a, 0x20, 0x62c, 0x62f, 0x64a, 0x62f, 0x3b, 0x634, 0x64a, 0x643, 0x644, 0x20, 0x625, 0x633, 0x631,
-0x627, 0x626, 0x64a, 0x644, 0x64a, 0x20, 0x62c, 0x62f, 0x64a, 0x62f, 0x3b, 0x634, 0x64a, 0x643, 0x644, 0x20, 0x625, 0x633, 0x631, 0x627,
-0x626, 0x64a, 0x644, 0x64a, 0x20, 0x62c, 0x62f, 0x64a, 0x62f, 0x3b, 0x62f, 0x64a, 0x646, 0x627, 0x631, 0x20, 0x623, 0x631, 0x62f, 0x646,
-0x64a, 0x3b, 0x62f, 0x64a, 0x646, 0x627, 0x631, 0x20, 0x623, 0x631, 0x62f, 0x646, 0x64a, 0x3b, 0x62f, 0x64a, 0x646, 0x627, 0x631, 0x20,
-0x623, 0x631, 0x62f, 0x646, 0x64a, 0x3b, 0x62f, 0x64a, 0x646, 0x627, 0x631, 0x20, 0x623, 0x631, 0x62f, 0x646, 0x64a, 0x3b, 0x62f, 0x64a,
-0x646, 0x627, 0x631, 0x20, 0x623, 0x631, 0x62f, 0x646, 0x64a, 0x3b, 0x62f, 0x64a, 0x646, 0x627, 0x631, 0x20, 0x623, 0x631, 0x62f, 0x646,
-0x64a, 0x3b, 0x62f, 0x64a, 0x646, 0x627, 0x631, 0x20, 0x623, 0x631, 0x62f, 0x646, 0x64a, 0x3b, 0x62f, 0x64a, 0x646, 0x627, 0x631, 0x20,
-0x643, 0x648, 0x64a, 0x62a, 0x64a, 0x3b, 0x62f, 0x64a, 0x646, 0x627, 0x631, 0x20, 0x643, 0x648, 0x64a, 0x62a, 0x64a, 0x3b, 0x62f, 0x64a,
-0x646, 0x627, 0x631, 0x20, 0x643, 0x648, 0x64a, 0x62a, 0x64a, 0x3b, 0x62f, 0x64a, 0x646, 0x627, 0x631, 0x20, 0x643, 0x648, 0x64a, 0x62a,
-0x64a, 0x3b, 0x62f, 0x64a, 0x646, 0x627, 0x631, 0x20, 0x643, 0x648, 0x64a, 0x62a, 0x64a, 0x3b, 0x62f, 0x64a, 0x646, 0x627, 0x631, 0x20,
-0x643, 0x648, 0x64a, 0x62a, 0x64a, 0x3b, 0x62f, 0x64a, 0x646, 0x627, 0x631, 0x20, 0x643, 0x648, 0x64a, 0x62a, 0x64a, 0x3b, 0x62c, 0x646,
-0x64a, 0x647, 0x20, 0x644, 0x628, 0x646, 0x627, 0x646, 0x64a, 0x3b, 0x62c, 0x646, 0x64a, 0x647, 0x20, 0x644, 0x628, 0x646, 0x627, 0x646,
-0x64a, 0x3b, 0x62c, 0x646, 0x64a, 0x647, 0x20, 0x644, 0x628, 0x646, 0x627, 0x646, 0x64a, 0x3b, 0x62c, 0x646, 0x64a, 0x647, 0x20, 0x644,
-0x628, 0x646, 0x627, 0x646, 0x64a, 0x3b, 0x62c, 0x646, 0x64a, 0x647, 0x20, 0x644, 0x628, 0x646, 0x627, 0x646, 0x64a, 0x3b, 0x62c, 0x646,
-0x64a, 0x647, 0x20, 0x644, 0x628, 0x646, 0x627, 0x646, 0x64a, 0x3b, 0x62c, 0x646, 0x64a, 0x647, 0x20, 0x644, 0x628, 0x646, 0x627, 0x646,
-0x64a, 0x3b, 0x62f, 0x64a, 0x646, 0x627, 0x631, 0x20, 0x644, 0x64a, 0x628, 0x64a, 0x3b, 0x62f, 0x64a, 0x646, 0x627, 0x631, 0x20, 0x644,
-0x64a, 0x628, 0x64a, 0x3b, 0x62f, 0x64a, 0x646, 0x627, 0x631, 0x20, 0x644, 0x64a, 0x628, 0x64a, 0x3b, 0x62f, 0x64a, 0x646, 0x627, 0x631,
-0x627, 0x646, 0x20, 0x644, 0x64a, 0x628, 0x64a, 0x627, 0x646, 0x3b, 0x62f, 0x64a, 0x646, 0x627, 0x631, 0x627, 0x62a, 0x20, 0x644, 0x64a,
-0x628, 0x64a, 0x629, 0x3b, 0x62f, 0x64a, 0x646, 0x627, 0x631, 0x64b, 0x627, 0x20, 0x644, 0x64a, 0x628, 0x64a, 0x64b, 0x627, 0x3b, 0x62f,
-0x64a, 0x646, 0x627, 0x631, 0x20, 0x644, 0x64a, 0x628, 0x64a, 0x3b, 0x623, 0x648, 0x642, 0x64a, 0x629, 0x20, 0x645, 0x648, 0x631, 0x64a,
-0x62a, 0x627, 0x646, 0x64a, 0x629, 0x3b, 0x623, 0x648, 0x642, 0x64a, 0x629, 0x20, 0x645, 0x648, 0x631, 0x64a, 0x62a, 0x627, 0x646, 0x64a,
-0x629, 0x3b, 0x623, 0x648, 0x642, 0x64a, 0x629, 0x20, 0x645, 0x648, 0x631, 0x64a, 0x62a, 0x627, 0x646, 0x64a, 0x629, 0x3b, 0x623, 0x648,
-0x642, 0x64a, 0x629, 0x20, 0x645, 0x648, 0x631, 0x64a, 0x62a, 0x627, 0x646, 0x64a, 0x629, 0x3b, 0x623, 0x648, 0x642, 0x64a, 0x629, 0x20,
-0x645, 0x648, 0x631, 0x64a, 0x62a, 0x627, 0x646, 0x64a, 0x629, 0x3b, 0x623, 0x648, 0x642, 0x64a, 0x629, 0x20, 0x645, 0x648, 0x631, 0x64a,
-0x62a, 0x627, 0x646, 0x64a, 0x629, 0x3b, 0x623, 0x648, 0x642, 0x64a, 0x629, 0x20, 0x645, 0x648, 0x631, 0x64a, 0x62a, 0x627, 0x646, 0x64a,
-0x629, 0x3b, 0x62f, 0x631, 0x647, 0x645, 0x20, 0x645, 0x63a, 0x631, 0x628, 0x64a, 0x3b, 0x62f, 0x631, 0x647, 0x645, 0x20, 0x645, 0x63a,
-0x631, 0x628, 0x64a, 0x3b, 0x62f, 0x631, 0x647, 0x645, 0x20, 0x645, 0x63a, 0x631, 0x628, 0x64a, 0x3b, 0x62f, 0x631, 0x647, 0x645, 0x627,
-0x646, 0x20, 0x645, 0x63a, 0x631, 0x628, 0x64a, 0x627, 0x646, 0x3b, 0x62f, 0x631, 0x627, 0x647, 0x645, 0x20, 0x645, 0x63a, 0x631, 0x628,
-0x64a, 0x629, 0x3b, 0x62f, 0x631, 0x647, 0x645, 0x64b, 0x627, 0x20, 0x645, 0x63a, 0x631, 0x628, 0x64a, 0x64b, 0x627, 0x3b, 0x62f, 0x631,
-0x647, 0x645, 0x20, 0x645, 0x63a, 0x631, 0x628, 0x64a, 0x3b, 0x631, 0x64a, 0x627, 0x644, 0x20, 0x639, 0x645, 0x627, 0x646, 0x64a, 0x3b,
-0x631, 0x64a, 0x627, 0x644, 0x20, 0x639, 0x645, 0x627, 0x646, 0x64a, 0x3b, 0x631, 0x64a, 0x627, 0x644, 0x20, 0x639, 0x645, 0x627, 0x646,
-0x64a, 0x3b, 0x631, 0x64a, 0x627, 0x644, 0x20, 0x639, 0x645, 0x627, 0x646, 0x64a, 0x3b, 0x631, 0x64a, 0x627, 0x644, 0x20, 0x639, 0x645,
-0x627, 0x646, 0x64a, 0x3b, 0x631, 0x64a, 0x627, 0x644, 0x20, 0x639, 0x645, 0x627, 0x646, 0x64a, 0x3b, 0x631, 0x64a, 0x627, 0x644, 0x20,
-0x639, 0x645, 0x627, 0x646, 0x64a, 0x3b, 0x631, 0x64a, 0x627, 0x644, 0x20, 0x642, 0x637, 0x631, 0x64a, 0x3b, 0x631, 0x64a, 0x627, 0x644,
-0x20, 0x642, 0x637, 0x631, 0x64a, 0x3b, 0x631, 0x64a, 0x627, 0x644, 0x20, 0x642, 0x637, 0x631, 0x64a, 0x3b, 0x631, 0x64a, 0x627, 0x644,
-0x20, 0x642, 0x637, 0x631, 0x64a, 0x3b, 0x631, 0x64a, 0x627, 0x644, 0x20, 0x642, 0x637, 0x631, 0x64a, 0x3b, 0x631, 0x64a, 0x627, 0x644,
-0x20, 0x642, 0x637, 0x631, 0x64a, 0x3b, 0x631, 0x64a, 0x627, 0x644, 0x20, 0x642, 0x637, 0x631, 0x64a, 0x3b, 0x631, 0x64a, 0x627, 0x644,
-0x20, 0x633, 0x639, 0x648, 0x62f, 0x64a, 0x3b, 0x631, 0x64a, 0x627, 0x644, 0x20, 0x633, 0x639, 0x648, 0x62f, 0x64a, 0x3b, 0x631, 0x64a,
-0x627, 0x644, 0x20, 0x633, 0x639, 0x648, 0x62f, 0x64a, 0x3b, 0x631, 0x64a, 0x627, 0x644, 0x20, 0x633, 0x639, 0x648, 0x62f, 0x64a, 0x3b,
-0x631, 0x64a, 0x627, 0x644, 0x20, 0x633, 0x639, 0x648, 0x62f, 0x64a, 0x3b, 0x631, 0x64a, 0x627, 0x644, 0x20, 0x633, 0x639, 0x648, 0x62f,
-0x64a, 0x3b, 0x631, 0x64a, 0x627, 0x644, 0x20, 0x633, 0x639, 0x648, 0x62f, 0x64a, 0x3b, 0x634, 0x644, 0x646, 0x20, 0x635, 0x648, 0x645,
-0x627, 0x644, 0x64a, 0x3b, 0x634, 0x644, 0x646, 0x20, 0x635, 0x648, 0x645, 0x627, 0x644, 0x64a, 0x3b, 0x634, 0x644, 0x646, 0x20, 0x635,
-0x648, 0x645, 0x627, 0x644, 0x64a, 0x3b, 0x634, 0x644, 0x646, 0x20, 0x635, 0x648, 0x645, 0x627, 0x644, 0x64a, 0x3b, 0x634, 0x644, 0x646,
-0x20, 0x635, 0x648, 0x645, 0x627, 0x644, 0x64a, 0x3b, 0x634, 0x644, 0x646, 0x20, 0x635, 0x648, 0x645, 0x627, 0x644, 0x64a, 0x3b, 0x634,
-0x644, 0x646, 0x20, 0x635, 0x648, 0x645, 0x627, 0x644, 0x64a, 0x3b, 0x62c, 0x646, 0x64a, 0x647, 0x20, 0x633, 0x648, 0x62f, 0x627, 0x646,
-0x64a, 0x3b, 0x62c, 0x646, 0x64a, 0x647, 0x20, 0x633, 0x648, 0x62f, 0x627, 0x646, 0x64a, 0x3b, 0x62c, 0x646, 0x64a, 0x647, 0x20, 0x633,
-0x648, 0x62f, 0x627, 0x646, 0x64a, 0x3b, 0x62c, 0x646, 0x64a, 0x647, 0x20, 0x633, 0x648, 0x62f, 0x627, 0x646, 0x64a, 0x3b, 0x62c, 0x646,
-0x64a, 0x647, 0x627, 0x62a, 0x20, 0x633, 0x648, 0x62f, 0x627, 0x646, 0x64a, 0x629, 0x3b, 0x62c, 0x646, 0x64a, 0x647, 0x64b, 0x627, 0x20,
-0x633, 0x648, 0x62f, 0x627, 0x646, 0x64a, 0x64b, 0x627, 0x3b, 0x62c, 0x646, 0x64a, 0x647, 0x20, 0x633, 0x648, 0x62f, 0x627, 0x646, 0x64a,
-0x3b, 0x644, 0x64a, 0x631, 0x629, 0x20, 0x633, 0x648, 0x631, 0x64a, 0x629, 0x3b, 0x644, 0x64a, 0x631, 0x629, 0x20, 0x633, 0x648, 0x631,
-0x64a, 0x629, 0x3b, 0x644, 0x64a, 0x631, 0x629, 0x20, 0x633, 0x648, 0x631, 0x64a, 0x629, 0x3b, 0x644, 0x64a, 0x631, 0x629, 0x20, 0x633,
-0x648, 0x631, 0x64a, 0x629, 0x3b, 0x644, 0x64a, 0x631, 0x629, 0x20, 0x633, 0x648, 0x631, 0x64a, 0x629, 0x3b, 0x644, 0x64a, 0x631, 0x629,
-0x20, 0x633, 0x648, 0x631, 0x64a, 0x629, 0x3b, 0x644, 0x64a, 0x631, 0x629, 0x20, 0x633, 0x648, 0x631, 0x64a, 0x629, 0x3b, 0x62f, 0x64a,
-0x646, 0x627, 0x631, 0x20, 0x62a, 0x648, 0x646, 0x633, 0x64a, 0x3b, 0x62f, 0x64a, 0x646, 0x627, 0x631, 0x20, 0x62a, 0x648, 0x646, 0x633,
-0x64a, 0x3b, 0x62f, 0x64a, 0x646, 0x627, 0x631, 0x20, 0x62a, 0x648, 0x646, 0x633, 0x64a, 0x3b, 0x62f, 0x64a, 0x646, 0x627, 0x631, 0x627,
-0x646, 0x20, 0x62a, 0x648, 0x646, 0x633, 0x64a, 0x627, 0x646, 0x3b, 0x62f, 0x64a, 0x646, 0x627, 0x631, 0x627, 0x62a, 0x20, 0x62a, 0x648,
-0x646, 0x633, 0x64a, 0x629, 0x3b, 0x62f, 0x64a, 0x646, 0x627, 0x631, 0x64b, 0x627, 0x20, 0x62a, 0x648, 0x646, 0x633, 0x64a, 0x64b, 0x627,
-0x3b, 0x62f, 0x64a, 0x646, 0x627, 0x631, 0x20, 0x62a, 0x648, 0x646, 0x633, 0x64a, 0x3b, 0x62f, 0x631, 0x647, 0x645, 0x20, 0x625, 0x645,
-0x627, 0x631, 0x627, 0x62a, 0x64a, 0x3b, 0x62f, 0x631, 0x647, 0x645, 0x20, 0x625, 0x645, 0x627, 0x631, 0x627, 0x62a, 0x64a, 0x3b, 0x62f,
-0x631, 0x647, 0x645, 0x20, 0x625, 0x645, 0x627, 0x631, 0x627, 0x62a, 0x64a, 0x3b, 0x62f, 0x631, 0x647, 0x645, 0x20, 0x625, 0x645, 0x627,
-0x631, 0x627, 0x62a, 0x64a, 0x3b, 0x62f, 0x631, 0x647, 0x645, 0x20, 0x625, 0x645, 0x627, 0x631, 0x627, 0x62a, 0x64a, 0x3b, 0x62f, 0x631,
-0x647, 0x645, 0x20, 0x625, 0x645, 0x627, 0x631, 0x627, 0x62a, 0x64a, 0x3b, 0x62f, 0x631, 0x647, 0x645, 0x20, 0x625, 0x645, 0x627, 0x631,
-0x627, 0x62a, 0x64a, 0x3b, 0x631, 0x64a, 0x627, 0x644, 0x20, 0x64a, 0x645, 0x646, 0x64a, 0x3b, 0x631, 0x64a, 0x627, 0x644, 0x20, 0x64a,
-0x645, 0x646, 0x64a, 0x3b, 0x631, 0x64a, 0x627, 0x644, 0x20, 0x64a, 0x645, 0x646, 0x64a, 0x3b, 0x631, 0x64a, 0x627, 0x644, 0x20, 0x64a,
-0x645, 0x646, 0x64a, 0x3b, 0x631, 0x64a, 0x627, 0x644, 0x20, 0x64a, 0x645, 0x646, 0x64a, 0x3b, 0x631, 0x64a, 0x627, 0x644, 0x20, 0x64a,
-0x645, 0x646, 0x64a, 0x3b, 0x631, 0x64a, 0x627, 0x644, 0x20, 0x64a, 0x645, 0x646, 0x64a, 0x3b, 0x62c, 0x646, 0x64a, 0x647, 0x20, 0x62c,
-0x646, 0x648, 0x628, 0x20, 0x627, 0x644, 0x633, 0x648, 0x62f, 0x627, 0x646, 0x3b, 0x62c, 0x646, 0x64a, 0x647, 0x20, 0x62c, 0x646, 0x648,
-0x628, 0x20, 0x627, 0x644, 0x633, 0x648, 0x62f, 0x627, 0x646, 0x3b, 0x62c, 0x646, 0x64a, 0x647, 0x20, 0x62c, 0x646, 0x648, 0x628, 0x20,
-0x627, 0x644, 0x633, 0x648, 0x62f, 0x627, 0x646, 0x3b, 0x62c, 0x646, 0x64a, 0x647, 0x627, 0x646, 0x20, 0x62c, 0x646, 0x648, 0x628, 0x20,
-0x627, 0x644, 0x633, 0x648, 0x62f, 0x627, 0x646, 0x3b, 0x62c, 0x646, 0x64a, 0x647, 0x627, 0x62a, 0x20, 0x62c, 0x646, 0x648, 0x628, 0x20,
-0x627, 0x644, 0x633, 0x648, 0x62f, 0x627, 0x646, 0x3b, 0x62c, 0x646, 0x64a, 0x647, 0x64b, 0x627, 0x20, 0x62c, 0x646, 0x648, 0x628, 0x20,
-0x627, 0x644, 0x633, 0x648, 0x62f, 0x627, 0x646, 0x3b, 0x62c, 0x646, 0x64a, 0x647, 0x20, 0x62c, 0x646, 0x648, 0x628, 0x20, 0x627, 0x644,
-0x633, 0x648, 0x62f, 0x627, 0x646, 0x3b, 0x570, 0x561, 0x575, 0x56f, 0x561, 0x56f, 0x561, 0x576, 0x20, 0x564, 0x580, 0x561, 0x574, 0x3b,
-0x3b, 0x570, 0x561, 0x575, 0x56f, 0x561, 0x56f, 0x561, 0x576, 0x20, 0x564, 0x580, 0x561, 0x574, 0x3b, 0x3b, 0x3b, 0x3b, 0x570, 0x561,
-0x575, 0x56f, 0x561, 0x56f, 0x561, 0x576, 0x20, 0x564, 0x580, 0x561, 0x574, 0x3b, 0x9ad, 0x9be, 0x9f0, 0x9a4, 0x9c0, 0x9af, 0x9bc, 0x20,
-0x9f0, 0x9c1, 0x9aa, 0x9c0, 0x3b, 0x3b, 0x9ad, 0x9be, 0x9f0, 0x9a4, 0x9c0, 0x9af, 0x9bc, 0x20, 0x9f0, 0x9c1, 0x9aa, 0x9c0, 0x3b, 0x3b,
-0x3b, 0x3b, 0x9ad, 0x9be, 0x9f0, 0x9a4, 0x9c0, 0x9af, 0x9bc, 0x20, 0x9f0, 0x9c1, 0x9aa, 0x9c0, 0x3b, 0x41, 0x7a, 0x259, 0x72, 0x62,
-0x61, 0x79, 0x63, 0x61, 0x6e, 0x20, 0x4d, 0x61, 0x6e, 0x61, 0x74, 0x131, 0x3b, 0x3b, 0x41, 0x7a, 0x259, 0x72, 0x62, 0x61,
-0x79, 0x63, 0x61, 0x6e, 0x20, 0x6d, 0x61, 0x6e, 0x61, 0x74, 0x131, 0x3b, 0x3b, 0x3b, 0x3b, 0x41, 0x7a, 0x259, 0x72, 0x62,
-0x61, 0x79, 0x63, 0x61, 0x6e, 0x20, 0x6d, 0x61, 0x6e, 0x61, 0x74, 0x131, 0x3b, 0x43c, 0x430, 0x43d, 0x430, 0x442, 0x3b, 0x3b,
-0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x65, 0x75, 0x72, 0x6f, 0x61, 0x3b, 0x3b, 0x65, 0x75, 0x72, 0x6f, 0x3b, 0x3b, 0x3b, 0x3b,
-0x65, 0x75, 0x72, 0x6f, 0x3b, 0x9ac, 0x9be, 0x982, 0x9b2, 0x9be, 0x9a6, 0x9c7, 0x9b6, 0x9c0, 0x20, 0x99f, 0x9be, 0x995, 0x9be, 0x3b,
-0x3b, 0x9ac, 0x9be, 0x982, 0x9b2, 0x9be, 0x9a6, 0x9c7, 0x9b6, 0x9c0, 0x20, 0x99f, 0x9be, 0x995, 0x9be, 0x3b, 0x3b, 0x3b, 0x3b, 0x9ac,
-0x9be, 0x982, 0x9b2, 0x9be, 0x9a6, 0x9c7, 0x9b6, 0x9c0, 0x20, 0x99f, 0x9be, 0x995, 0x9be, 0x3b, 0x9ad, 0x9be, 0x9b0, 0x9a4, 0x9c0, 0x9af,
-0x9bc, 0x20, 0x9b0, 0x9c1, 0x9aa, 0x9bf, 0x3b, 0x3b, 0x9ad, 0x9be, 0x9b0, 0x9a4, 0x9c0, 0x9af, 0x9bc, 0x20, 0x9b0, 0x9c1, 0x9aa, 0x9bf,
-0x3b, 0x3b, 0x3b, 0x3b, 0x9ad, 0x9be, 0x9b0, 0x9a4, 0x9c0, 0x9af, 0x9bc, 0x20, 0x9b0, 0x9c1, 0x9aa, 0x9bf, 0x3b, 0xf51, 0xf44, 0xf74,
-0xf63, 0xf0b, 0xf40, 0xfb2, 0xf58, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x65, 0x75, 0x72, 0x6f, 0x3b, 0x3b, 0x65, 0x75,
-0x72, 0x6f, 0x3b, 0x65, 0x75, 0x72, 0x6f, 0x3b, 0x65, 0x75, 0x72, 0x6f, 0x3b, 0x61, 0x20, 0x65, 0x75, 0x72, 0x6f, 0x69,
-0x6f, 0xf9, 0x3b, 0x65, 0x75, 0x72, 0x6f, 0x3b, 0x411, 0x44a, 0x43b, 0x433, 0x430, 0x440, 0x441, 0x43a, 0x438, 0x20, 0x43b, 0x435,
-0x432, 0x3b, 0x3b, 0x431, 0x44a, 0x43b, 0x433, 0x430, 0x440, 0x441, 0x43a, 0x438, 0x20, 0x43b, 0x435, 0x432, 0x3b, 0x3b, 0x3b, 0x3b,
-0x431, 0x44a, 0x43b, 0x433, 0x430, 0x440, 0x441, 0x43a, 0x438, 0x20, 0x43b, 0x435, 0x432, 0x430, 0x3b, 0x1019, 0x103c, 0x1014, 0x103a, 0x1019,
-0x102c, 0x20, 0x1000, 0x103b, 0x1015, 0x103a, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x1019, 0x103c, 0x1014, 0x103a, 0x1019, 0x102c, 0x20, 0x1000,
-0x103b, 0x1015, 0x103a, 0x3b, 0x431, 0x435, 0x43b, 0x430, 0x440, 0x443, 0x441, 0x43a, 0x456, 0x20, 0x440, 0x443, 0x431, 0x435, 0x43b, 0x44c,
-0x3b, 0x3b, 0x431, 0x435, 0x43b, 0x430, 0x440, 0x443, 0x441, 0x43a, 0x456, 0x20, 0x440, 0x443, 0x431, 0x435, 0x43b, 0x44c, 0x3b, 0x3b,
-0x431, 0x435, 0x43b, 0x430, 0x440, 0x443, 0x441, 0x43a, 0x456, 0x44f, 0x20, 0x440, 0x443, 0x431, 0x43b, 0x456, 0x3b, 0x431, 0x435, 0x43b,
-0x430, 0x440, 0x443, 0x441, 0x43a, 0x456, 0x445, 0x20, 0x440, 0x443, 0x431, 0x43b, 0x451, 0x45e, 0x3b, 0x431, 0x435, 0x43b, 0x430, 0x440,
-0x443, 0x441, 0x43a, 0x430, 0x433, 0x430, 0x20, 0x440, 0x443, 0x431, 0x43b, 0x44f, 0x3b, 0x179a, 0x17c0, 0x179b, 0x200b, 0x1780, 0x1798, 0x17d2,
-0x1796, 0x17bb, 0x1787, 0x17b6, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x179a, 0x17c0, 0x179b, 0x200b, 0x1780, 0x1798, 0x17d2, 0x1796, 0x17bb, 0x1787,
-0x17b6, 0x3b, 0x65, 0x75, 0x72, 0x6f, 0x3b, 0x3b, 0x65, 0x75, 0x72, 0x6f, 0x3b, 0x3b, 0x3b, 0x3b, 0x65, 0x75, 0x72, 0x6f,
-0x73, 0x3b, 0x4eba, 0x6c11, 0x5e01, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x4eba, 0x6c11, 0x5e01, 0x3b, 0x6e2f, 0x5143, 0x3b, 0x3b, 0x3b,
-0x3b, 0x3b, 0x3b, 0x6e2f, 0x5143, 0x3b, 0x6fb3, 0x95e8, 0x5e01, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x6fb3, 0x95e8, 0x5143, 0x3b, 0x65b0,
-0x52a0, 0x5761, 0x5143, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x65b0, 0x52a0, 0x5761, 0x5143, 0x3b, 0x6fb3, 0x9580, 0x5143, 0x3b, 0x3b, 0x3b,
-0x3b, 0x3b, 0x3b, 0x6fb3, 0x9580, 0x5143, 0x3b, 0x65b0, 0x53f0, 0x5e63, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x65b0, 0x53f0, 0x5e63, 0x3b,
-0x68, 0x72, 0x76, 0x61, 0x74, 0x73, 0x6b, 0x61, 0x20, 0x6b, 0x75, 0x6e, 0x61, 0x3b, 0x3b, 0x68, 0x72, 0x76, 0x61, 0x74,
-0x73, 0x6b, 0x61, 0x20, 0x6b, 0x75, 0x6e, 0x61, 0x3b, 0x3b, 0x68, 0x72, 0x76, 0x61, 0x74, 0x73, 0x6b, 0x65, 0x20, 0x6b,
-0x75, 0x6e, 0x65, 0x3b, 0x3b, 0x68, 0x72, 0x76, 0x61, 0x74, 0x73, 0x6b, 0x69, 0x68, 0x20, 0x6b, 0x75, 0x6e, 0x61, 0x3b,
-0x6b, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x74, 0x69, 0x62, 0x69, 0x6c, 0x6e, 0x61, 0x20, 0x6d, 0x61, 0x72, 0x6b, 0x61, 0x3b,
-0x3b, 0x6b, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x74, 0x69, 0x62, 0x69, 0x6c, 0x6e, 0x61, 0x20, 0x6d, 0x61, 0x72, 0x6b, 0x61,
-0x3b, 0x3b, 0x6b, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x74, 0x69, 0x62, 0x69, 0x6c, 0x6e, 0x65, 0x20, 0x6d, 0x61, 0x72, 0x6b,
-0x65, 0x3b, 0x3b, 0x6b, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x74, 0x69, 0x62, 0x69, 0x6c, 0x6e, 0x69, 0x68, 0x20, 0x6d, 0x61,
-0x72, 0x61, 0x6b, 0x61, 0x3b, 0x10d, 0x65, 0x73, 0x6b, 0xe1, 0x20, 0x6b, 0x6f, 0x72, 0x75, 0x6e, 0x61, 0x3b, 0x3b, 0x10d,
-0x65, 0x73, 0x6b, 0xe1, 0x20, 0x6b, 0x6f, 0x72, 0x75, 0x6e, 0x61, 0x3b, 0x3b, 0x10d, 0x65, 0x73, 0x6b, 0xe9, 0x20, 0x6b,
-0x6f, 0x72, 0x75, 0x6e, 0x79, 0x3b, 0x10d, 0x65, 0x73, 0x6b, 0xe9, 0x20, 0x6b, 0x6f, 0x72, 0x75, 0x6e, 0x79, 0x3b, 0x10d,
-0x65, 0x73, 0x6b, 0xfd, 0x63, 0x68, 0x20, 0x6b, 0x6f, 0x72, 0x75, 0x6e, 0x3b, 0x64, 0x61, 0x6e, 0x73, 0x6b, 0x20, 0x6b,
-0x72, 0x6f, 0x6e, 0x65, 0x3b, 0x3b, 0x64, 0x61, 0x6e, 0x73, 0x6b, 0x20, 0x6b, 0x72, 0x6f, 0x6e, 0x65, 0x3b, 0x3b, 0x3b,
-0x3b, 0x64, 0x61, 0x6e, 0x73, 0x6b, 0x65, 0x20, 0x6b, 0x72, 0x6f, 0x6e, 0x65, 0x72, 0x3b, 0x45, 0x75, 0x72, 0x6f, 0x3b,
-0x3b, 0x65, 0x75, 0x72, 0x6f, 0x3b, 0x3b, 0x3b, 0x3b, 0x65, 0x75, 0x72, 0x6f, 0x3b, 0x41, 0x72, 0x75, 0x62, 0x61, 0x61,
-0x6e, 0x73, 0x65, 0x20, 0x67, 0x75, 0x6c, 0x64, 0x65, 0x6e, 0x3b, 0x3b, 0x41, 0x72, 0x75, 0x62, 0x61, 0x61, 0x6e, 0x73,
-0x65, 0x20, 0x67, 0x75, 0x6c, 0x64, 0x65, 0x6e, 0x3b, 0x3b, 0x3b, 0x3b, 0x41, 0x72, 0x75, 0x62, 0x61, 0x61, 0x6e, 0x73,
-0x65, 0x20, 0x67, 0x75, 0x6c, 0x64, 0x65, 0x6e, 0x3b, 0x4e, 0x65, 0x64, 0x65, 0x72, 0x6c, 0x61, 0x6e, 0x64, 0x73, 0x2d,
-0x41, 0x6e, 0x74, 0x69, 0x6c, 0x6c, 0x69, 0x61, 0x61, 0x6e, 0x73, 0x65, 0x20, 0x67, 0x75, 0x6c, 0x64, 0x65, 0x6e, 0x3b,
-0x3b, 0x4e, 0x65, 0x64, 0x65, 0x72, 0x6c, 0x61, 0x6e, 0x64, 0x73, 0x2d, 0x41, 0x6e, 0x74, 0x69, 0x6c, 0x6c, 0x69, 0x61,
-0x61, 0x6e, 0x73, 0x65, 0x20, 0x67, 0x75, 0x6c, 0x64, 0x65, 0x6e, 0x3b, 0x3b, 0x3b, 0x3b, 0x4e, 0x65, 0x64, 0x65, 0x72,
-0x6c, 0x61, 0x6e, 0x64, 0x73, 0x2d, 0x41, 0x6e, 0x74, 0x69, 0x6c, 0x6c, 0x69, 0x61, 0x61, 0x6e, 0x73, 0x65, 0x20, 0x67,
-0x75, 0x6c, 0x64, 0x65, 0x6e, 0x3b, 0x53, 0x75, 0x72, 0x69, 0x6e, 0x61, 0x61, 0x6d, 0x73, 0x65, 0x20, 0x64, 0x6f, 0x6c,
-0x6c, 0x61, 0x72, 0x3b, 0x3b, 0x53, 0x75, 0x72, 0x69, 0x6e, 0x61, 0x61, 0x6d, 0x73, 0x65, 0x20, 0x64, 0x6f, 0x6c, 0x6c,
-0x61, 0x72, 0x3b, 0x3b, 0x3b, 0x3b, 0x53, 0x75, 0x72, 0x69, 0x6e, 0x61, 0x61, 0x6d, 0x73, 0x65, 0x20, 0x64, 0x6f, 0x6c,
-0x6c, 0x61, 0x72, 0x3b, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x6b, 0x61, 0x61, 0x6e, 0x73, 0x65, 0x20, 0x64, 0x6f, 0x6c, 0x6c,
-0x61, 0x72, 0x3b, 0x3b, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x6b, 0x61, 0x61, 0x6e, 0x73, 0x65, 0x20, 0x64, 0x6f, 0x6c, 0x6c,
-0x61, 0x72, 0x3b, 0x3b, 0x3b, 0x3b, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x6b, 0x61, 0x61, 0x6e, 0x73, 0x65, 0x20, 0x64, 0x6f,
-0x6c, 0x6c, 0x61, 0x72, 0x3b, 0x55, 0x53, 0x20, 0x44, 0x6f, 0x6c, 0x6c, 0x61, 0x72, 0x3b, 0x3b, 0x55, 0x53, 0x20, 0x64,
-0x6f, 0x6c, 0x6c, 0x61, 0x72, 0x3b, 0x3b, 0x3b, 0x3b, 0x55, 0x53, 0x20, 0x64, 0x6f, 0x6c, 0x6c, 0x61, 0x72, 0x73, 0x3b,
-0x45, 0x61, 0x73, 0x74, 0x20, 0x43, 0x61, 0x72, 0x69, 0x62, 0x62, 0x65, 0x61, 0x6e, 0x20, 0x44, 0x6f, 0x6c, 0x6c, 0x61,
-0x72, 0x3b, 0x3b, 0x45, 0x61, 0x73, 0x74, 0x20, 0x43, 0x61, 0x72, 0x69, 0x62, 0x62, 0x65, 0x61, 0x6e, 0x20, 0x64, 0x6f,
-0x6c, 0x6c, 0x61, 0x72, 0x3b, 0x3b, 0x3b, 0x3b, 0x45, 0x61, 0x73, 0x74, 0x20, 0x43, 0x61, 0x72, 0x69, 0x62, 0x62, 0x65,
-0x61, 0x6e, 0x20, 0x64, 0x6f, 0x6c, 0x6c, 0x61, 0x72, 0x73, 0x3b, 0x41, 0x75, 0x73, 0x74, 0x72, 0x61, 0x6c, 0x69, 0x61,
-0x6e, 0x20, 0x44, 0x6f, 0x6c, 0x6c, 0x61, 0x72, 0x3b, 0x3b, 0x41, 0x75, 0x73, 0x74, 0x72, 0x61, 0x6c, 0x69, 0x61, 0x6e,
-0x20, 0x64, 0x6f, 0x6c, 0x6c, 0x61, 0x72, 0x3b, 0x3b, 0x3b, 0x3b, 0x41, 0x75, 0x73, 0x74, 0x72, 0x61, 0x6c, 0x69, 0x61,
-0x6e, 0x20, 0x64, 0x6f, 0x6c, 0x6c, 0x61, 0x72, 0x73, 0x3b, 0x45, 0x75, 0x72, 0x6f, 0x3b, 0x3b, 0x65, 0x75, 0x72, 0x6f,
-0x3b, 0x3b, 0x3b, 0x3b, 0x65, 0x75, 0x72, 0x6f, 0x73, 0x3b, 0x42, 0x61, 0x68, 0x61, 0x6d, 0x69, 0x61, 0x6e, 0x20, 0x44,
-0x6f, 0x6c, 0x6c, 0x61, 0x72, 0x3b, 0x3b, 0x42, 0x61, 0x68, 0x61, 0x6d, 0x69, 0x61, 0x6e, 0x20, 0x64, 0x6f, 0x6c, 0x6c,
-0x61, 0x72, 0x3b, 0x3b, 0x3b, 0x3b, 0x42, 0x61, 0x68, 0x61, 0x6d, 0x69, 0x61, 0x6e, 0x20, 0x64, 0x6f, 0x6c, 0x6c, 0x61,
-0x72, 0x73, 0x3b, 0x42, 0x61, 0x72, 0x62, 0x61, 0x64, 0x69, 0x61, 0x6e, 0x20, 0x44, 0x6f, 0x6c, 0x6c, 0x61, 0x72, 0x3b,
-0x3b, 0x42, 0x61, 0x72, 0x62, 0x61, 0x64, 0x69, 0x61, 0x6e, 0x20, 0x64, 0x6f, 0x6c, 0x6c, 0x61, 0x72, 0x3b, 0x3b, 0x3b,
-0x3b, 0x42, 0x61, 0x72, 0x62, 0x61, 0x64, 0x69, 0x61, 0x6e, 0x20, 0x64, 0x6f, 0x6c, 0x6c, 0x61, 0x72, 0x73, 0x3b, 0x42,
-0x65, 0x6c, 0x69, 0x7a, 0x65, 0x20, 0x44, 0x6f, 0x6c, 0x6c, 0x61, 0x72, 0x3b, 0x3b, 0x42, 0x65, 0x6c, 0x69, 0x7a, 0x65,
-0x20, 0x64, 0x6f, 0x6c, 0x6c, 0x61, 0x72, 0x3b, 0x3b, 0x3b, 0x3b, 0x42, 0x65, 0x6c, 0x69, 0x7a, 0x65, 0x20, 0x64, 0x6f,
-0x6c, 0x6c, 0x61, 0x72, 0x73, 0x3b, 0x42, 0x65, 0x72, 0x6d, 0x75, 0x64, 0x61, 0x6e, 0x20, 0x44, 0x6f, 0x6c, 0x6c, 0x61,
-0x72, 0x3b, 0x3b, 0x42, 0x65, 0x72, 0x6d, 0x75, 0x64, 0x61, 0x6e, 0x20, 0x64, 0x6f, 0x6c, 0x6c, 0x61, 0x72, 0x3b, 0x3b,
-0x3b, 0x3b, 0x42, 0x65, 0x72, 0x6d, 0x75, 0x64, 0x61, 0x6e, 0x20, 0x64, 0x6f, 0x6c, 0x6c, 0x61, 0x72, 0x73, 0x3b, 0x42,
-0x6f, 0x74, 0x73, 0x77, 0x61, 0x6e, 0x61, 0x6e, 0x20, 0x50, 0x75, 0x6c, 0x61, 0x3b, 0x3b, 0x42, 0x6f, 0x74, 0x73, 0x77,
-0x61, 0x6e, 0x61, 0x6e, 0x20, 0x70, 0x75, 0x6c, 0x61, 0x3b, 0x3b, 0x3b, 0x3b, 0x42, 0x6f, 0x74, 0x73, 0x77, 0x61, 0x6e,
-0x61, 0x6e, 0x20, 0x70, 0x75, 0x6c, 0x61, 0x73, 0x3b, 0x42, 0x75, 0x72, 0x75, 0x6e, 0x64, 0x69, 0x61, 0x6e, 0x20, 0x46,
-0x72, 0x61, 0x6e, 0x63, 0x3b, 0x3b, 0x42, 0x75, 0x72, 0x75, 0x6e, 0x64, 0x69, 0x61, 0x6e, 0x20, 0x66, 0x72, 0x61, 0x6e,
-0x63, 0x3b, 0x3b, 0x3b, 0x3b, 0x42, 0x75, 0x72, 0x75, 0x6e, 0x64, 0x69, 0x61, 0x6e, 0x20, 0x66, 0x72, 0x61, 0x6e, 0x63,
-0x73, 0x3b, 0x43, 0x65, 0x6e, 0x74, 0x72, 0x61, 0x6c, 0x20, 0x41, 0x66, 0x72, 0x69, 0x63, 0x61, 0x6e, 0x20, 0x43, 0x46,
-0x41, 0x20, 0x46, 0x72, 0x61, 0x6e, 0x63, 0x3b, 0x3b, 0x43, 0x65, 0x6e, 0x74, 0x72, 0x61, 0x6c, 0x20, 0x41, 0x66, 0x72,
-0x69, 0x63, 0x61, 0x6e, 0x20, 0x43, 0x46, 0x41, 0x20, 0x66, 0x72, 0x61, 0x6e, 0x63, 0x3b, 0x3b, 0x3b, 0x3b, 0x43, 0x65,
-0x6e, 0x74, 0x72, 0x61, 0x6c, 0x20, 0x41, 0x66, 0x72, 0x69, 0x63, 0x61, 0x6e, 0x20, 0x43, 0x46, 0x41, 0x20, 0x66, 0x72,
-0x61, 0x6e, 0x63, 0x73, 0x3b, 0x43, 0x61, 0x6e, 0x61, 0x64, 0x69, 0x61, 0x6e, 0x20, 0x44, 0x6f, 0x6c, 0x6c, 0x61, 0x72,
-0x3b, 0x3b, 0x43, 0x61, 0x6e, 0x61, 0x64, 0x69, 0x61, 0x6e, 0x20, 0x64, 0x6f, 0x6c, 0x6c, 0x61, 0x72, 0x3b, 0x3b, 0x3b,
-0x3b, 0x43, 0x61, 0x6e, 0x61, 0x64, 0x69, 0x61, 0x6e, 0x20, 0x64, 0x6f, 0x6c, 0x6c, 0x61, 0x72, 0x73, 0x3b, 0x43, 0x61,
-0x79, 0x6d, 0x61, 0x6e, 0x20, 0x49, 0x73, 0x6c, 0x61, 0x6e, 0x64, 0x73, 0x20, 0x44, 0x6f, 0x6c, 0x6c, 0x61, 0x72, 0x3b,
-0x3b, 0x43, 0x61, 0x79, 0x6d, 0x61, 0x6e, 0x20, 0x49, 0x73, 0x6c, 0x61, 0x6e, 0x64, 0x73, 0x20, 0x64, 0x6f, 0x6c, 0x6c,
-0x61, 0x72, 0x3b, 0x3b, 0x3b, 0x3b, 0x43, 0x61, 0x79, 0x6d, 0x61, 0x6e, 0x20, 0x49, 0x73, 0x6c, 0x61, 0x6e, 0x64, 0x73,
-0x20, 0x64, 0x6f, 0x6c, 0x6c, 0x61, 0x72, 0x73, 0x3b, 0x4e, 0x65, 0x77, 0x20, 0x5a, 0x65, 0x61, 0x6c, 0x61, 0x6e, 0x64,
-0x20, 0x44, 0x6f, 0x6c, 0x6c, 0x61, 0x72, 0x3b, 0x3b, 0x4e, 0x65, 0x77, 0x20, 0x5a, 0x65, 0x61, 0x6c, 0x61, 0x6e, 0x64,
-0x20, 0x64, 0x6f, 0x6c, 0x6c, 0x61, 0x72, 0x3b, 0x3b, 0x3b, 0x3b, 0x4e, 0x65, 0x77, 0x20, 0x5a, 0x65, 0x61, 0x6c, 0x61,
-0x6e, 0x64, 0x20, 0x64, 0x6f, 0x6c, 0x6c, 0x61, 0x72, 0x73, 0x3b, 0x44, 0x61, 0x6e, 0x69, 0x73, 0x68, 0x20, 0x4b, 0x72,
-0x6f, 0x6e, 0x65, 0x3b, 0x3b, 0x44, 0x61, 0x6e, 0x69, 0x73, 0x68, 0x20, 0x6b, 0x72, 0x6f, 0x6e, 0x65, 0x3b, 0x3b, 0x3b,
-0x3b, 0x44, 0x61, 0x6e, 0x69, 0x73, 0x68, 0x20, 0x6b, 0x72, 0x6f, 0x6e, 0x65, 0x72, 0x3b, 0x45, 0x72, 0x69, 0x74, 0x72,
-0x65, 0x61, 0x6e, 0x20, 0x4e, 0x61, 0x6b, 0x66, 0x61, 0x3b, 0x3b, 0x45, 0x72, 0x69, 0x74, 0x72, 0x65, 0x61, 0x6e, 0x20,
-0x6e, 0x61, 0x6b, 0x66, 0x61, 0x3b, 0x3b, 0x3b, 0x3b, 0x45, 0x72, 0x69, 0x74, 0x72, 0x65, 0x61, 0x6e, 0x20, 0x6e, 0x61,
-0x6b, 0x66, 0x61, 0x73, 0x3b, 0x46, 0x61, 0x6c, 0x6b, 0x6c, 0x61, 0x6e, 0x64, 0x20, 0x49, 0x73, 0x6c, 0x61, 0x6e, 0x64,
-0x73, 0x20, 0x50, 0x6f, 0x75, 0x6e, 0x64, 0x3b, 0x3b, 0x46, 0x61, 0x6c, 0x6b, 0x6c, 0x61, 0x6e, 0x64, 0x20, 0x49, 0x73,
-0x6c, 0x61, 0x6e, 0x64, 0x73, 0x20, 0x70, 0x6f, 0x75, 0x6e, 0x64, 0x3b, 0x3b, 0x3b, 0x3b, 0x46, 0x61, 0x6c, 0x6b, 0x6c,
-0x61, 0x6e, 0x64, 0x20, 0x49, 0x73, 0x6c, 0x61, 0x6e, 0x64, 0x73, 0x20, 0x70, 0x6f, 0x75, 0x6e, 0x64, 0x73, 0x3b, 0x46,
-0x69, 0x6a, 0x69, 0x61, 0x6e, 0x20, 0x44, 0x6f, 0x6c, 0x6c, 0x61, 0x72, 0x3b, 0x3b, 0x46, 0x69, 0x6a, 0x69, 0x61, 0x6e,
-0x20, 0x64, 0x6f, 0x6c, 0x6c, 0x61, 0x72, 0x3b, 0x3b, 0x3b, 0x3b, 0x46, 0x69, 0x6a, 0x69, 0x61, 0x6e, 0x20, 0x64, 0x6f,
-0x6c, 0x6c, 0x61, 0x72, 0x73, 0x3b, 0x55, 0x4b, 0x20, 0x50, 0x6f, 0x75, 0x6e, 0x64, 0x3b, 0x3b, 0x55, 0x4b, 0x20, 0x70,
-0x6f, 0x75, 0x6e, 0x64, 0x3b, 0x3b, 0x3b, 0x3b, 0x55, 0x4b, 0x20, 0x70, 0x6f, 0x75, 0x6e, 0x64, 0x73, 0x3b, 0x47, 0x61,
-0x6d, 0x62, 0x69, 0x61, 0x6e, 0x20, 0x44, 0x61, 0x6c, 0x61, 0x73, 0x69, 0x3b, 0x3b, 0x47, 0x61, 0x6d, 0x62, 0x69, 0x61,
-0x6e, 0x20, 0x64, 0x61, 0x6c, 0x61, 0x73, 0x69, 0x3b, 0x3b, 0x3b, 0x3b, 0x47, 0x61, 0x6d, 0x62, 0x69, 0x61, 0x6e, 0x20,
-0x64, 0x61, 0x6c, 0x61, 0x73, 0x69, 0x73, 0x3b, 0x47, 0x68, 0x61, 0x6e, 0x61, 0x69, 0x61, 0x6e, 0x20, 0x43, 0x65, 0x64,
-0x69, 0x3b, 0x3b, 0x47, 0x68, 0x61, 0x6e, 0x61, 0x69, 0x61, 0x6e, 0x20, 0x63, 0x65, 0x64, 0x69, 0x3b, 0x3b, 0x3b, 0x3b,
-0x47, 0x68, 0x61, 0x6e, 0x61, 0x69, 0x61, 0x6e, 0x20, 0x63, 0x65, 0x64, 0x69, 0x73, 0x3b, 0x47, 0x69, 0x62, 0x72, 0x61,
-0x6c, 0x74, 0x61, 0x72, 0x20, 0x50, 0x6f, 0x75, 0x6e, 0x64, 0x3b, 0x3b, 0x47, 0x69, 0x62, 0x72, 0x61, 0x6c, 0x74, 0x61,
-0x72, 0x20, 0x70, 0x6f, 0x75, 0x6e, 0x64, 0x3b, 0x3b, 0x3b, 0x3b, 0x47, 0x69, 0x62, 0x72, 0x61, 0x6c, 0x74, 0x61, 0x72,
-0x20, 0x70, 0x6f, 0x75, 0x6e, 0x64, 0x73, 0x3b, 0x47, 0x75, 0x79, 0x61, 0x6e, 0x61, 0x65, 0x73, 0x65, 0x20, 0x44, 0x6f,
-0x6c, 0x6c, 0x61, 0x72, 0x3b, 0x3b, 0x47, 0x75, 0x79, 0x61, 0x6e, 0x61, 0x65, 0x73, 0x65, 0x20, 0x64, 0x6f, 0x6c, 0x6c,
-0x61, 0x72, 0x3b, 0x3b, 0x3b, 0x3b, 0x47, 0x75, 0x79, 0x61, 0x6e, 0x61, 0x65, 0x73, 0x65, 0x20, 0x64, 0x6f, 0x6c, 0x6c,
-0x61, 0x72, 0x73, 0x3b, 0x48, 0x6f, 0x6e, 0x67, 0x20, 0x4b, 0x6f, 0x6e, 0x67, 0x20, 0x44, 0x6f, 0x6c, 0x6c, 0x61, 0x72,
-0x3b, 0x3b, 0x48, 0x6f, 0x6e, 0x67, 0x20, 0x4b, 0x6f, 0x6e, 0x67, 0x20, 0x64, 0x6f, 0x6c, 0x6c, 0x61, 0x72, 0x3b, 0x3b,
-0x3b, 0x3b, 0x48, 0x6f, 0x6e, 0x67, 0x20, 0x4b, 0x6f, 0x6e, 0x67, 0x20, 0x64, 0x6f, 0x6c, 0x6c, 0x61, 0x72, 0x73, 0x3b,
-0x49, 0x6e, 0x64, 0x69, 0x61, 0x6e, 0x20, 0x52, 0x75, 0x70, 0x65, 0x65, 0x3b, 0x3b, 0x49, 0x6e, 0x64, 0x69, 0x61, 0x6e,
-0x20, 0x72, 0x75, 0x70, 0x65, 0x65, 0x3b, 0x3b, 0x3b, 0x3b, 0x49, 0x6e, 0x64, 0x69, 0x61, 0x6e, 0x20, 0x72, 0x75, 0x70,
-0x65, 0x65, 0x73, 0x3b, 0x49, 0x73, 0x72, 0x61, 0x65, 0x6c, 0x69, 0x20, 0x4e, 0x65, 0x77, 0x20, 0x53, 0x68, 0x65, 0x6b,
-0x65, 0x6c, 0x3b, 0x3b, 0x49, 0x73, 0x72, 0x61, 0x65, 0x6c, 0x69, 0x20, 0x6e, 0x65, 0x77, 0x20, 0x73, 0x68, 0x65, 0x6b,
-0x65, 0x6c, 0x3b, 0x3b, 0x3b, 0x3b, 0x49, 0x73, 0x72, 0x61, 0x65, 0x6c, 0x69, 0x20, 0x6e, 0x65, 0x77, 0x20, 0x73, 0x68,
-0x65, 0x6b, 0x65, 0x6c, 0x73, 0x3b, 0x4a, 0x61, 0x6d, 0x61, 0x69, 0x63, 0x61, 0x6e, 0x20, 0x44, 0x6f, 0x6c, 0x6c, 0x61,
-0x72, 0x3b, 0x3b, 0x4a, 0x61, 0x6d, 0x61, 0x69, 0x63, 0x61, 0x6e, 0x20, 0x64, 0x6f, 0x6c, 0x6c, 0x61, 0x72, 0x3b, 0x3b,
-0x3b, 0x3b, 0x4a, 0x61, 0x6d, 0x61, 0x69, 0x63, 0x61, 0x6e, 0x20, 0x64, 0x6f, 0x6c, 0x6c, 0x61, 0x72, 0x73, 0x3b, 0x4b,
-0x65, 0x6e, 0x79, 0x61, 0x6e, 0x20, 0x53, 0x68, 0x69, 0x6c, 0x6c, 0x69, 0x6e, 0x67, 0x3b, 0x3b, 0x4b, 0x65, 0x6e, 0x79,
-0x61, 0x6e, 0x20, 0x73, 0x68, 0x69, 0x6c, 0x6c, 0x69, 0x6e, 0x67, 0x3b, 0x3b, 0x3b, 0x3b, 0x4b, 0x65, 0x6e, 0x79, 0x61,
-0x6e, 0x20, 0x73, 0x68, 0x69, 0x6c, 0x6c, 0x69, 0x6e, 0x67, 0x73, 0x3b, 0x53, 0x6f, 0x75, 0x74, 0x68, 0x20, 0x41, 0x66,
-0x72, 0x69, 0x63, 0x61, 0x6e, 0x20, 0x52, 0x61, 0x6e, 0x64, 0x3b, 0x3b, 0x53, 0x6f, 0x75, 0x74, 0x68, 0x20, 0x41, 0x66,
-0x72, 0x69, 0x63, 0x61, 0x6e, 0x20, 0x72, 0x61, 0x6e, 0x64, 0x3b, 0x3b, 0x3b, 0x3b, 0x53, 0x6f, 0x75, 0x74, 0x68, 0x20,
-0x41, 0x66, 0x72, 0x69, 0x63, 0x61, 0x6e, 0x20, 0x72, 0x61, 0x6e, 0x64, 0x3b, 0x4c, 0x69, 0x62, 0x65, 0x72, 0x69, 0x61,
-0x6e, 0x20, 0x44, 0x6f, 0x6c, 0x6c, 0x61, 0x72, 0x3b, 0x3b, 0x4c, 0x69, 0x62, 0x65, 0x72, 0x69, 0x61, 0x6e, 0x20, 0x64,
-0x6f, 0x6c, 0x6c, 0x61, 0x72, 0x3b, 0x3b, 0x3b, 0x3b, 0x4c, 0x69, 0x62, 0x65, 0x72, 0x69, 0x61, 0x6e, 0x20, 0x64, 0x6f,
-0x6c, 0x6c, 0x61, 0x72, 0x73, 0x3b, 0x4d, 0x61, 0x63, 0x61, 0x6e, 0x65, 0x73, 0x65, 0x20, 0x50, 0x61, 0x74, 0x61, 0x63,
-0x61, 0x3b, 0x3b, 0x4d, 0x61, 0x63, 0x61, 0x6e, 0x65, 0x73, 0x65, 0x20, 0x70, 0x61, 0x74, 0x61, 0x63, 0x61, 0x3b, 0x3b,
-0x3b, 0x3b, 0x4d, 0x61, 0x63, 0x61, 0x6e, 0x65, 0x73, 0x65, 0x20, 0x70, 0x61, 0x74, 0x61, 0x63, 0x61, 0x73, 0x3b, 0x4d,
-0x61, 0x6c, 0x61, 0x67, 0x61, 0x73, 0x79, 0x20, 0x41, 0x72, 0x69, 0x61, 0x72, 0x79, 0x3b, 0x3b, 0x4d, 0x61, 0x6c, 0x61,
-0x67, 0x61, 0x73, 0x79, 0x20, 0x61, 0x72, 0x69, 0x61, 0x72, 0x79, 0x3b, 0x3b, 0x3b, 0x3b, 0x4d, 0x61, 0x6c, 0x61, 0x67,
-0x61, 0x73, 0x79, 0x20, 0x61, 0x72, 0x69, 0x61, 0x72, 0x69, 0x65, 0x73, 0x3b, 0x4d, 0x61, 0x6c, 0x61, 0x77, 0x69, 0x61,
-0x6e, 0x20, 0x4b, 0x77, 0x61, 0x63, 0x68, 0x61, 0x3b, 0x3b, 0x4d, 0x61, 0x6c, 0x61, 0x77, 0x69, 0x61, 0x6e, 0x20, 0x6b,
-0x77, 0x61, 0x63, 0x68, 0x61, 0x3b, 0x3b, 0x3b, 0x3b, 0x4d, 0x61, 0x6c, 0x61, 0x77, 0x69, 0x61, 0x6e, 0x20, 0x6b, 0x77,
-0x61, 0x63, 0x68, 0x61, 0x73, 0x3b, 0x4d, 0x61, 0x6c, 0x61, 0x79, 0x73, 0x69, 0x61, 0x6e, 0x20, 0x52, 0x69, 0x6e, 0x67,
-0x67, 0x69, 0x74, 0x3b, 0x3b, 0x4d, 0x61, 0x6c, 0x61, 0x79, 0x73, 0x69, 0x61, 0x6e, 0x20, 0x72, 0x69, 0x6e, 0x67, 0x67,
-0x69, 0x74, 0x3b, 0x3b, 0x3b, 0x3b, 0x4d, 0x61, 0x6c, 0x61, 0x79, 0x73, 0x69, 0x61, 0x6e, 0x20, 0x72, 0x69, 0x6e, 0x67,
-0x67, 0x69, 0x74, 0x73, 0x3b, 0x4d, 0x61, 0x75, 0x72, 0x69, 0x74, 0x69, 0x61, 0x6e, 0x20, 0x52, 0x75, 0x70, 0x65, 0x65,
-0x3b, 0x3b, 0x4d, 0x61, 0x75, 0x72, 0x69, 0x74, 0x69, 0x61, 0x6e, 0x20, 0x72, 0x75, 0x70, 0x65, 0x65, 0x3b, 0x3b, 0x3b,
-0x3b, 0x4d, 0x61, 0x75, 0x72, 0x69, 0x74, 0x69, 0x61, 0x6e, 0x20, 0x72, 0x75, 0x70, 0x65, 0x65, 0x73, 0x3b, 0x4e, 0x61,
-0x6d, 0x69, 0x62, 0x69, 0x61, 0x6e, 0x20, 0x44, 0x6f, 0x6c, 0x6c, 0x61, 0x72, 0x3b, 0x3b, 0x4e, 0x61, 0x6d, 0x69, 0x62,
-0x69, 0x61, 0x6e, 0x20, 0x64, 0x6f, 0x6c, 0x6c, 0x61, 0x72, 0x3b, 0x3b, 0x3b, 0x3b, 0x4e, 0x61, 0x6d, 0x69, 0x62, 0x69,
-0x61, 0x6e, 0x20, 0x64, 0x6f, 0x6c, 0x6c, 0x61, 0x72, 0x73, 0x3b, 0x4e, 0x69, 0x67, 0x65, 0x72, 0x69, 0x61, 0x6e, 0x20,
-0x4e, 0x61, 0x69, 0x72, 0x61, 0x3b, 0x3b, 0x4e, 0x69, 0x67, 0x65, 0x72, 0x69, 0x61, 0x6e, 0x20, 0x6e, 0x61, 0x69, 0x72,
-0x61, 0x3b, 0x3b, 0x3b, 0x3b, 0x4e, 0x69, 0x67, 0x65, 0x72, 0x69, 0x61, 0x6e, 0x20, 0x6e, 0x61, 0x69, 0x72, 0x61, 0x73,
-0x3b, 0x50, 0x61, 0x6b, 0x69, 0x73, 0x74, 0x61, 0x6e, 0x69, 0x20, 0x52, 0x75, 0x70, 0x65, 0x65, 0x3b, 0x3b, 0x50, 0x61,
-0x6b, 0x69, 0x73, 0x74, 0x61, 0x6e, 0x69, 0x20, 0x72, 0x75, 0x70, 0x65, 0x65, 0x3b, 0x3b, 0x3b, 0x3b, 0x50, 0x61, 0x6b,
-0x69, 0x73, 0x74, 0x61, 0x6e, 0x69, 0x20, 0x72, 0x75, 0x70, 0x65, 0x65, 0x73, 0x3b, 0x50, 0x61, 0x70, 0x75, 0x61, 0x20,
-0x4e, 0x65, 0x77, 0x20, 0x47, 0x75, 0x69, 0x6e, 0x65, 0x61, 0x6e, 0x20, 0x4b, 0x69, 0x6e, 0x61, 0x3b, 0x3b, 0x50, 0x61,
-0x70, 0x75, 0x61, 0x20, 0x4e, 0x65, 0x77, 0x20, 0x47, 0x75, 0x69, 0x6e, 0x65, 0x61, 0x6e, 0x20, 0x6b, 0x69, 0x6e, 0x61,
-0x3b, 0x3b, 0x3b, 0x3b, 0x50, 0x61, 0x70, 0x75, 0x61, 0x20, 0x4e, 0x65, 0x77, 0x20, 0x47, 0x75, 0x69, 0x6e, 0x65, 0x61,
-0x6e, 0x20, 0x6b, 0x69, 0x6e, 0x61, 0x3b, 0x50, 0x68, 0x69, 0x6c, 0x69, 0x70, 0x70, 0x69, 0x6e, 0x65, 0x20, 0x50, 0x69,
-0x73, 0x6f, 0x3b, 0x3b, 0x50, 0x68, 0x69, 0x6c, 0x69, 0x70, 0x70, 0x69, 0x6e, 0x65, 0x20, 0x70, 0x69, 0x73, 0x6f, 0x3b,
-0x3b, 0x3b, 0x3b, 0x50, 0x68, 0x69, 0x6c, 0x69, 0x70, 0x70, 0x69, 0x6e, 0x65, 0x20, 0x70, 0x69, 0x73, 0x6f, 0x73, 0x3b,
-0x52, 0x77, 0x61, 0x6e, 0x64, 0x61, 0x6e, 0x20, 0x46, 0x72, 0x61, 0x6e, 0x63, 0x3b, 0x3b, 0x52, 0x77, 0x61, 0x6e, 0x64,
-0x61, 0x6e, 0x20, 0x66, 0x72, 0x61, 0x6e, 0x63, 0x3b, 0x3b, 0x3b, 0x3b, 0x52, 0x77, 0x61, 0x6e, 0x64, 0x61, 0x6e, 0x20,
-0x66, 0x72, 0x61, 0x6e, 0x63, 0x73, 0x3b, 0x53, 0x61, 0x6d, 0x6f, 0x61, 0x6e, 0x20, 0x54, 0x61, 0x6c, 0x61, 0x3b, 0x3b,
-0x53, 0x61, 0x6d, 0x6f, 0x61, 0x6e, 0x20, 0x74, 0x61, 0x6c, 0x61, 0x3b, 0x3b, 0x3b, 0x3b, 0x53, 0x61, 0x6d, 0x6f, 0x61,
-0x6e, 0x20, 0x74, 0x61, 0x6c, 0x61, 0x3b, 0x53, 0x65, 0x79, 0x63, 0x68, 0x65, 0x6c, 0x6c, 0x6f, 0x69, 0x73, 0x20, 0x52,
-0x75, 0x70, 0x65, 0x65, 0x3b, 0x3b, 0x53, 0x65, 0x79, 0x63, 0x68, 0x65, 0x6c, 0x6c, 0x6f, 0x69, 0x73, 0x20, 0x72, 0x75,
-0x70, 0x65, 0x65, 0x3b, 0x3b, 0x3b, 0x3b, 0x53, 0x65, 0x79, 0x63, 0x68, 0x65, 0x6c, 0x6c, 0x6f, 0x69, 0x73, 0x20, 0x72,
-0x75, 0x70, 0x65, 0x65, 0x73, 0x3b, 0x53, 0x69, 0x65, 0x72, 0x72, 0x61, 0x20, 0x4c, 0x65, 0x6f, 0x6e, 0x65, 0x61, 0x6e,
-0x20, 0x4c, 0x65, 0x6f, 0x6e, 0x65, 0x3b, 0x3b, 0x53, 0x69, 0x65, 0x72, 0x72, 0x61, 0x20, 0x4c, 0x65, 0x6f, 0x6e, 0x65,
-0x61, 0x6e, 0x20, 0x6c, 0x65, 0x6f, 0x6e, 0x65, 0x3b, 0x3b, 0x3b, 0x3b, 0x53, 0x69, 0x65, 0x72, 0x72, 0x61, 0x20, 0x4c,
-0x65, 0x6f, 0x6e, 0x65, 0x61, 0x6e, 0x20, 0x6c, 0x65, 0x6f, 0x6e, 0x65, 0x73, 0x3b, 0x53, 0x69, 0x6e, 0x67, 0x61, 0x70,
-0x6f, 0x72, 0x65, 0x20, 0x44, 0x6f, 0x6c, 0x6c, 0x61, 0x72, 0x3b, 0x3b, 0x53, 0x69, 0x6e, 0x67, 0x61, 0x70, 0x6f, 0x72,
-0x65, 0x20, 0x64, 0x6f, 0x6c, 0x6c, 0x61, 0x72, 0x3b, 0x3b, 0x3b, 0x3b, 0x53, 0x69, 0x6e, 0x67, 0x61, 0x70, 0x6f, 0x72,
-0x65, 0x20, 0x64, 0x6f, 0x6c, 0x6c, 0x61, 0x72, 0x73, 0x3b, 0x53, 0x6f, 0x6c, 0x6f, 0x6d, 0x6f, 0x6e, 0x20, 0x49, 0x73,
-0x6c, 0x61, 0x6e, 0x64, 0x73, 0x20, 0x44, 0x6f, 0x6c, 0x6c, 0x61, 0x72, 0x3b, 0x3b, 0x53, 0x6f, 0x6c, 0x6f, 0x6d, 0x6f,
-0x6e, 0x20, 0x49, 0x73, 0x6c, 0x61, 0x6e, 0x64, 0x73, 0x20, 0x64, 0x6f, 0x6c, 0x6c, 0x61, 0x72, 0x3b, 0x3b, 0x3b, 0x3b,
-0x53, 0x6f, 0x6c, 0x6f, 0x6d, 0x6f, 0x6e, 0x20, 0x49, 0x73, 0x6c, 0x61, 0x6e, 0x64, 0x73, 0x20, 0x64, 0x6f, 0x6c, 0x6c,
-0x61, 0x72, 0x73, 0x3b, 0x53, 0x74, 0x2e, 0x20, 0x48, 0x65, 0x6c, 0x65, 0x6e, 0x61, 0x20, 0x50, 0x6f, 0x75, 0x6e, 0x64,
-0x3b, 0x3b, 0x53, 0x74, 0x2e, 0x20, 0x48, 0x65, 0x6c, 0x65, 0x6e, 0x61, 0x20, 0x70, 0x6f, 0x75, 0x6e, 0x64, 0x3b, 0x3b,
-0x3b, 0x3b, 0x53, 0x74, 0x2e, 0x20, 0x48, 0x65, 0x6c, 0x65, 0x6e, 0x61, 0x20, 0x70, 0x6f, 0x75, 0x6e, 0x64, 0x73, 0x3b,
-0x53, 0x75, 0x64, 0x61, 0x6e, 0x65, 0x73, 0x65, 0x20, 0x50, 0x6f, 0x75, 0x6e, 0x64, 0x3b, 0x3b, 0x53, 0x75, 0x64, 0x61,
-0x6e, 0x65, 0x73, 0x65, 0x20, 0x70, 0x6f, 0x75, 0x6e, 0x64, 0x3b, 0x3b, 0x3b, 0x3b, 0x53, 0x75, 0x64, 0x61, 0x6e, 0x65,
-0x73, 0x65, 0x20, 0x70, 0x6f, 0x75, 0x6e, 0x64, 0x73, 0x3b, 0x53, 0x77, 0x61, 0x7a, 0x69, 0x20, 0x4c, 0x69, 0x6c, 0x61,
-0x6e, 0x67, 0x65, 0x6e, 0x69, 0x3b, 0x3b, 0x53, 0x77, 0x61, 0x7a, 0x69, 0x20, 0x6c, 0x69, 0x6c, 0x61, 0x6e, 0x67, 0x65,
-0x6e, 0x69, 0x3b, 0x3b, 0x3b, 0x3b, 0x53, 0x77, 0x61, 0x7a, 0x69, 0x20, 0x65, 0x6d, 0x61, 0x6c, 0x61, 0x6e, 0x67, 0x65,
-0x6e, 0x69, 0x3b, 0x53, 0x77, 0x65, 0x64, 0x69, 0x73, 0x68, 0x20, 0x4b, 0x72, 0x6f, 0x6e, 0x61, 0x3b, 0x3b, 0x53, 0x77,
-0x65, 0x64, 0x69, 0x73, 0x68, 0x20, 0x6b, 0x72, 0x6f, 0x6e, 0x61, 0x3b, 0x3b, 0x3b, 0x3b, 0x53, 0x77, 0x65, 0x64, 0x69,
-0x73, 0x68, 0x20, 0x6b, 0x72, 0x6f, 0x6e, 0x6f, 0x72, 0x3b, 0x53, 0x77, 0x69, 0x73, 0x73, 0x20, 0x46, 0x72, 0x61, 0x6e,
-0x63, 0x3b, 0x3b, 0x53, 0x77, 0x69, 0x73, 0x73, 0x20, 0x66, 0x72, 0x61, 0x6e, 0x63, 0x3b, 0x3b, 0x3b, 0x3b, 0x53, 0x77,
-0x69, 0x73, 0x73, 0x20, 0x66, 0x72, 0x61, 0x6e, 0x63, 0x73, 0x3b, 0x54, 0x61, 0x6e, 0x7a, 0x61, 0x6e, 0x69, 0x61, 0x6e,
-0x20, 0x53, 0x68, 0x69, 0x6c, 0x6c, 0x69, 0x6e, 0x67, 0x3b, 0x3b, 0x54, 0x61, 0x6e, 0x7a, 0x61, 0x6e, 0x69, 0x61, 0x6e,
-0x20, 0x73, 0x68, 0x69, 0x6c, 0x6c, 0x69, 0x6e, 0x67, 0x3b, 0x3b, 0x3b, 0x3b, 0x54, 0x61, 0x6e, 0x7a, 0x61, 0x6e, 0x69,
-0x61, 0x6e, 0x20, 0x73, 0x68, 0x69, 0x6c, 0x6c, 0x69, 0x6e, 0x67, 0x73, 0x3b, 0x54, 0x6f, 0x6e, 0x67, 0x61, 0x6e, 0x20,
-0x50, 0x61, 0x2bb, 0x61, 0x6e, 0x67, 0x61, 0x3b, 0x3b, 0x54, 0x6f, 0x6e, 0x67, 0x61, 0x6e, 0x20, 0x70, 0x61, 0x2bb, 0x61,
-0x6e, 0x67, 0x61, 0x3b, 0x3b, 0x3b, 0x3b, 0x54, 0x6f, 0x6e, 0x67, 0x61, 0x6e, 0x20, 0x70, 0x61, 0x2bb, 0x61, 0x6e, 0x67,
-0x61, 0x3b, 0x54, 0x72, 0x69, 0x6e, 0x69, 0x64, 0x61, 0x64, 0x20, 0x26, 0x20, 0x54, 0x6f, 0x62, 0x61, 0x67, 0x6f, 0x20,
-0x44, 0x6f, 0x6c, 0x6c, 0x61, 0x72, 0x3b, 0x3b, 0x54, 0x72, 0x69, 0x6e, 0x69, 0x64, 0x61, 0x64, 0x20, 0x26, 0x20, 0x54,
-0x6f, 0x62, 0x61, 0x67, 0x6f, 0x20, 0x64, 0x6f, 0x6c, 0x6c, 0x61, 0x72, 0x3b, 0x3b, 0x3b, 0x3b, 0x54, 0x72, 0x69, 0x6e,
-0x69, 0x64, 0x61, 0x64, 0x20, 0x26, 0x20, 0x54, 0x6f, 0x62, 0x61, 0x67, 0x6f, 0x20, 0x64, 0x6f, 0x6c, 0x6c, 0x61, 0x72,
-0x73, 0x3b, 0x55, 0x67, 0x61, 0x6e, 0x64, 0x61, 0x6e, 0x20, 0x53, 0x68, 0x69, 0x6c, 0x6c, 0x69, 0x6e, 0x67, 0x3b, 0x3b,
-0x55, 0x67, 0x61, 0x6e, 0x64, 0x61, 0x6e, 0x20, 0x73, 0x68, 0x69, 0x6c, 0x6c, 0x69, 0x6e, 0x67, 0x3b, 0x3b, 0x3b, 0x3b,
-0x55, 0x67, 0x61, 0x6e, 0x64, 0x61, 0x6e, 0x20, 0x73, 0x68, 0x69, 0x6c, 0x6c, 0x69, 0x6e, 0x67, 0x73, 0x3b, 0x55, 0x6e,
-0x69, 0x74, 0x65, 0x64, 0x20, 0x41, 0x72, 0x61, 0x62, 0x20, 0x45, 0x6d, 0x69, 0x72, 0x61, 0x74, 0x65, 0x73, 0x20, 0x44,
-0x69, 0x72, 0x68, 0x61, 0x6d, 0x3b, 0x3b, 0x55, 0x41, 0x45, 0x20, 0x64, 0x69, 0x72, 0x68, 0x61, 0x6d, 0x3b, 0x3b, 0x3b,
-0x3b, 0x55, 0x41, 0x45, 0x20, 0x64, 0x69, 0x72, 0x68, 0x61, 0x6d, 0x73, 0x3b, 0x42, 0x72, 0x69, 0x74, 0x69, 0x73, 0x68,
-0x20, 0x50, 0x6f, 0x75, 0x6e, 0x64, 0x3b, 0x3b, 0x42, 0x72, 0x69, 0x74, 0x69, 0x73, 0x68, 0x20, 0x70, 0x6f, 0x75, 0x6e,
-0x64, 0x3b, 0x3b, 0x3b, 0x3b, 0x42, 0x72, 0x69, 0x74, 0x69, 0x73, 0x68, 0x20, 0x70, 0x6f, 0x75, 0x6e, 0x64, 0x73, 0x3b,
-0x56, 0x61, 0x6e, 0x75, 0x61, 0x74, 0x75, 0x20, 0x56, 0x61, 0x74, 0x75, 0x3b, 0x3b, 0x56, 0x61, 0x6e, 0x75, 0x61, 0x74,
-0x75, 0x20, 0x76, 0x61, 0x74, 0x75, 0x3b, 0x3b, 0x3b, 0x3b, 0x56, 0x61, 0x6e, 0x75, 0x61, 0x74, 0x75, 0x20, 0x76, 0x61,
-0x74, 0x75, 0x73, 0x3b, 0x5a, 0x61, 0x6d, 0x62, 0x69, 0x61, 0x6e, 0x20, 0x4b, 0x77, 0x61, 0x63, 0x68, 0x61, 0x3b, 0x3b,
-0x5a, 0x61, 0x6d, 0x62, 0x69, 0x61, 0x6e, 0x20, 0x6b, 0x77, 0x61, 0x63, 0x68, 0x61, 0x3b, 0x3b, 0x3b, 0x3b, 0x5a, 0x61,
-0x6d, 0x62, 0x69, 0x61, 0x6e, 0x20, 0x6b, 0x77, 0x61, 0x63, 0x68, 0x61, 0x73, 0x3b, 0x53, 0x6f, 0x75, 0x74, 0x68, 0x20,
-0x53, 0x75, 0x64, 0x61, 0x6e, 0x65, 0x73, 0x65, 0x20, 0x50, 0x6f, 0x75, 0x6e, 0x64, 0x3b, 0x3b, 0x53, 0x6f, 0x75, 0x74,
-0x68, 0x20, 0x53, 0x75, 0x64, 0x61, 0x6e, 0x65, 0x73, 0x65, 0x20, 0x70, 0x6f, 0x75, 0x6e, 0x64, 0x3b, 0x3b, 0x3b, 0x3b,
-0x53, 0x6f, 0x75, 0x74, 0x68, 0x20, 0x53, 0x75, 0x64, 0x61, 0x6e, 0x65, 0x73, 0x65, 0x20, 0x70, 0x6f, 0x75, 0x6e, 0x64,
-0x73, 0x3b, 0x4e, 0x65, 0x74, 0x68, 0x65, 0x72, 0x6c, 0x61, 0x6e, 0x64, 0x73, 0x20, 0x41, 0x6e, 0x74, 0x69, 0x6c, 0x6c,
-0x65, 0x61, 0x6e, 0x20, 0x47, 0x75, 0x69, 0x6c, 0x64, 0x65, 0x72, 0x3b, 0x3b, 0x4e, 0x65, 0x74, 0x68, 0x65, 0x72, 0x6c,
-0x61, 0x6e, 0x64, 0x73, 0x20, 0x41, 0x6e, 0x74, 0x69, 0x6c, 0x6c, 0x65, 0x61, 0x6e, 0x20, 0x67, 0x75, 0x69, 0x6c, 0x64,
-0x65, 0x72, 0x3b, 0x3b, 0x3b, 0x3b, 0x4e, 0x65, 0x74, 0x68, 0x65, 0x72, 0x6c, 0x61, 0x6e, 0x64, 0x73, 0x20, 0x41, 0x6e,
-0x74, 0x69, 0x6c, 0x6c, 0x65, 0x61, 0x6e, 0x20, 0x67, 0x75, 0x69, 0x6c, 0x64, 0x65, 0x72, 0x73, 0x3b, 0x65, 0x75, 0x72,
-0x6f, 0x3b, 0x3b, 0x65, 0x75, 0x72, 0x6f, 0x3b, 0x3b, 0x3b, 0x3b, 0x65, 0x75, 0x72, 0x6f, 0x74, 0x3b, 0x64, 0x6f, 0x6e,
-0x73, 0x6b, 0x20, 0x6b, 0x72, 0xf3, 0x6e, 0x61, 0x3b, 0x3b, 0x64, 0x6f, 0x6e, 0x73, 0x6b, 0x20, 0x6b, 0x72, 0xf3, 0x6e,
-0x61, 0x3b, 0x3b, 0x3b, 0x3b, 0x64, 0x61, 0x6e, 0x73, 0x6b, 0x61, 0x72, 0x20, 0x6b, 0x72, 0xf3, 0x6e, 0x75, 0x72, 0x3b,
-0x65, 0x75, 0x72, 0x6f, 0x3b, 0x3b, 0x65, 0x75, 0x72, 0x6f, 0x3b, 0x3b, 0x3b, 0x3b, 0x65, 0x75, 0x72, 0x6f, 0x61, 0x3b,
-0x64, 0x69, 0x6e, 0x61, 0x72, 0x20, 0x61, 0x6c, 0x67, 0xe9, 0x72, 0x69, 0x65, 0x6e, 0x3b, 0x3b, 0x64, 0x69, 0x6e, 0x61,
-0x72, 0x20, 0x61, 0x6c, 0x67, 0xe9, 0x72, 0x69, 0x65, 0x6e, 0x3b, 0x3b, 0x3b, 0x3b, 0x64, 0x69, 0x6e, 0x61, 0x72, 0x73,
-0x20, 0x61, 0x6c, 0x67, 0xe9, 0x72, 0x69, 0x65, 0x6e, 0x73, 0x3b, 0x66, 0x72, 0x61, 0x6e, 0x63, 0x20, 0x43, 0x46, 0x41,
-0x20, 0x28, 0x42, 0x43, 0x45, 0x41, 0x4f, 0x29, 0x3b, 0x3b, 0x66, 0x72, 0x61, 0x6e, 0x63, 0x20, 0x43, 0x46, 0x41, 0x20,
-0x28, 0x42, 0x43, 0x45, 0x41, 0x4f, 0x29, 0x3b, 0x3b, 0x3b, 0x3b, 0x66, 0x72, 0x61, 0x6e, 0x63, 0x73, 0x20, 0x43, 0x46,
-0x41, 0x20, 0x28, 0x42, 0x43, 0x45, 0x41, 0x4f, 0x29, 0x3b, 0x66, 0x72, 0x61, 0x6e, 0x63, 0x20, 0x62, 0x75, 0x72, 0x75,
-0x6e, 0x64, 0x61, 0x69, 0x73, 0x3b, 0x3b, 0x66, 0x72, 0x61, 0x6e, 0x63, 0x20, 0x62, 0x75, 0x72, 0x75, 0x6e, 0x64, 0x61,
-0x69, 0x73, 0x3b, 0x3b, 0x3b, 0x3b, 0x66, 0x72, 0x61, 0x6e, 0x63, 0x73, 0x20, 0x62, 0x75, 0x72, 0x75, 0x6e, 0x64, 0x61,
-0x69, 0x73, 0x3b, 0x66, 0x72, 0x61, 0x6e, 0x63, 0x20, 0x43, 0x46, 0x41, 0x20, 0x28, 0x42, 0x45, 0x41, 0x43, 0x29, 0x3b,
-0x3b, 0x66, 0x72, 0x61, 0x6e, 0x63, 0x20, 0x43, 0x46, 0x41, 0x20, 0x28, 0x42, 0x45, 0x41, 0x43, 0x29, 0x3b, 0x3b, 0x3b,
-0x3b, 0x66, 0x72, 0x61, 0x6e, 0x63, 0x73, 0x20, 0x43, 0x46, 0x41, 0x20, 0x28, 0x42, 0x45, 0x41, 0x43, 0x29, 0x3b, 0x64,
-0x6f, 0x6c, 0x6c, 0x61, 0x72, 0x20, 0x63, 0x61, 0x6e, 0x61, 0x64, 0x69, 0x65, 0x6e, 0x3b, 0x3b, 0x64, 0x6f, 0x6c, 0x6c,
-0x61, 0x72, 0x20, 0x63, 0x61, 0x6e, 0x61, 0x64, 0x69, 0x65, 0x6e, 0x3b, 0x3b, 0x3b, 0x3b, 0x64, 0x6f, 0x6c, 0x6c, 0x61,
-0x72, 0x73, 0x20, 0x63, 0x61, 0x6e, 0x61, 0x64, 0x69, 0x65, 0x6e, 0x73, 0x3b, 0x66, 0x72, 0x61, 0x6e, 0x63, 0x20, 0x63,
-0x6f, 0x6d, 0x6f, 0x72, 0x69, 0x65, 0x6e, 0x3b, 0x3b, 0x66, 0x72, 0x61, 0x6e, 0x63, 0x20, 0x63, 0x6f, 0x6d, 0x6f, 0x72,
-0x69, 0x65, 0x6e, 0x3b, 0x3b, 0x3b, 0x3b, 0x66, 0x72, 0x61, 0x6e, 0x63, 0x73, 0x20, 0x63, 0x6f, 0x6d, 0x6f, 0x72, 0x69,
-0x65, 0x6e, 0x73, 0x3b, 0x66, 0x72, 0x61, 0x6e, 0x63, 0x20, 0x63, 0x6f, 0x6e, 0x67, 0x6f, 0x6c, 0x61, 0x69, 0x73, 0x3b,
-0x3b, 0x66, 0x72, 0x61, 0x6e, 0x63, 0x20, 0x63, 0x6f, 0x6e, 0x67, 0x6f, 0x6c, 0x61, 0x69, 0x73, 0x3b, 0x3b, 0x3b, 0x3b,
-0x66, 0x72, 0x61, 0x6e, 0x63, 0x73, 0x20, 0x63, 0x6f, 0x6e, 0x67, 0x6f, 0x6c, 0x61, 0x69, 0x73, 0x3b, 0x66, 0x72, 0x61,
-0x6e, 0x63, 0x20, 0x64, 0x6a, 0x69, 0x62, 0x6f, 0x75, 0x74, 0x69, 0x65, 0x6e, 0x3b, 0x3b, 0x66, 0x72, 0x61, 0x6e, 0x63,
-0x20, 0x64, 0x6a, 0x69, 0x62, 0x6f, 0x75, 0x74, 0x69, 0x65, 0x6e, 0x3b, 0x3b, 0x3b, 0x3b, 0x66, 0x72, 0x61, 0x6e, 0x63,
-0x73, 0x20, 0x64, 0x6a, 0x69, 0x62, 0x6f, 0x75, 0x74, 0x69, 0x65, 0x6e, 0x73, 0x3b, 0x66, 0x72, 0x61, 0x6e, 0x63, 0x20,
-0x43, 0x46, 0x50, 0x3b, 0x3b, 0x66, 0x72, 0x61, 0x6e, 0x63, 0x20, 0x43, 0x46, 0x50, 0x3b, 0x3b, 0x3b, 0x3b, 0x66, 0x72,
-0x61, 0x6e, 0x63, 0x73, 0x20, 0x43, 0x46, 0x50, 0x3b, 0x66, 0x72, 0x61, 0x6e, 0x63, 0x20, 0x67, 0x75, 0x69, 0x6e, 0xe9,
-0x65, 0x6e, 0x3b, 0x3b, 0x66, 0x72, 0x61, 0x6e, 0x63, 0x20, 0x67, 0x75, 0x69, 0x6e, 0xe9, 0x65, 0x6e, 0x3b, 0x3b, 0x3b,
-0x3b, 0x66, 0x72, 0x61, 0x6e, 0x63, 0x73, 0x20, 0x67, 0x75, 0x69, 0x6e, 0xe9, 0x65, 0x6e, 0x73, 0x3b, 0x67, 0x6f, 0x75,
-0x72, 0x64, 0x65, 0x20, 0x68, 0x61, 0xef, 0x74, 0x69, 0x65, 0x6e, 0x6e, 0x65, 0x3b, 0x3b, 0x67, 0x6f, 0x75, 0x72, 0x64,
-0x65, 0x20, 0x68, 0x61, 0xef, 0x74, 0x69, 0x65, 0x6e, 0x6e, 0x65, 0x3b, 0x3b, 0x3b, 0x3b, 0x67, 0x6f, 0x75, 0x72, 0x64,
-0x65, 0x73, 0x20, 0x68, 0x61, 0xef, 0x74, 0x69, 0x65, 0x6e, 0x6e, 0x65, 0x73, 0x3b, 0x61, 0x72, 0x69, 0x61, 0x72, 0x79,
-0x20, 0x6d, 0x61, 0x6c, 0x67, 0x61, 0x63, 0x68, 0x65, 0x3b, 0x3b, 0x61, 0x72, 0x69, 0x61, 0x72, 0x79, 0x20, 0x6d, 0x61,
-0x6c, 0x67, 0x61, 0x63, 0x68, 0x65, 0x3b, 0x3b, 0x3b, 0x3b, 0x61, 0x72, 0x69, 0x61, 0x72, 0x79, 0x73, 0x20, 0x6d, 0x61,
-0x6c, 0x67, 0x61, 0x63, 0x68, 0x65, 0x73, 0x3b, 0x6f, 0x75, 0x67, 0x75, 0x69, 0x79, 0x61, 0x20, 0x6d, 0x61, 0x75, 0x72,
-0x69, 0x74, 0x61, 0x6e, 0x69, 0x65, 0x6e, 0x3b, 0x3b, 0x6f, 0x75, 0x67, 0x75, 0x69, 0x79, 0x61, 0x20, 0x6d, 0x61, 0x75,
-0x72, 0x69, 0x74, 0x61, 0x6e, 0x69, 0x65, 0x6e, 0x3b, 0x3b, 0x3b, 0x3b, 0x6f, 0x75, 0x67, 0x75, 0x69, 0x79, 0x61, 0x73,
-0x20, 0x6d, 0x61, 0x75, 0x72, 0x69, 0x74, 0x61, 0x6e, 0x69, 0x65, 0x6e, 0x73, 0x3b, 0x72, 0x6f, 0x75, 0x70, 0x69, 0x65,
-0x20, 0x6d, 0x61, 0x75, 0x72, 0x69, 0x63, 0x69, 0x65, 0x6e, 0x6e, 0x65, 0x3b, 0x3b, 0x72, 0x6f, 0x75, 0x70, 0x69, 0x65,
-0x20, 0x6d, 0x61, 0x75, 0x72, 0x69, 0x63, 0x69, 0x65, 0x6e, 0x6e, 0x65, 0x3b, 0x3b, 0x3b, 0x3b, 0x72, 0x6f, 0x75, 0x70,
-0x69, 0x65, 0x73, 0x20, 0x6d, 0x61, 0x75, 0x72, 0x69, 0x63, 0x69, 0x65, 0x6e, 0x6e, 0x65, 0x73, 0x3b, 0x64, 0x69, 0x72,
-0x68, 0x61, 0x6d, 0x20, 0x6d, 0x61, 0x72, 0x6f, 0x63, 0x61, 0x69, 0x6e, 0x3b, 0x3b, 0x64, 0x69, 0x72, 0x68, 0x61, 0x6d,
-0x20, 0x6d, 0x61, 0x72, 0x6f, 0x63, 0x61, 0x69, 0x6e, 0x3b, 0x3b, 0x3b, 0x3b, 0x64, 0x69, 0x72, 0x68, 0x61, 0x6d, 0x73,
-0x20, 0x6d, 0x61, 0x72, 0x6f, 0x63, 0x61, 0x69, 0x6e, 0x73, 0x3b, 0x66, 0x72, 0x61, 0x6e, 0x63, 0x20, 0x72, 0x77, 0x61,
-0x6e, 0x64, 0x61, 0x69, 0x73, 0x3b, 0x3b, 0x66, 0x72, 0x61, 0x6e, 0x63, 0x20, 0x72, 0x77, 0x61, 0x6e, 0x64, 0x61, 0x69,
-0x73, 0x3b, 0x3b, 0x3b, 0x3b, 0x66, 0x72, 0x61, 0x6e, 0x63, 0x73, 0x20, 0x72, 0x77, 0x61, 0x6e, 0x64, 0x61, 0x69, 0x73,
-0x3b, 0x72, 0x6f, 0x75, 0x70, 0x69, 0x65, 0x20, 0x64, 0x65, 0x73, 0x20, 0x53, 0x65, 0x79, 0x63, 0x68, 0x65, 0x6c, 0x6c,
-0x65, 0x73, 0x3b, 0x3b, 0x72, 0x6f, 0x75, 0x70, 0x69, 0x65, 0x20, 0x64, 0x65, 0x73, 0x20, 0x53, 0x65, 0x79, 0x63, 0x68,
-0x65, 0x6c, 0x6c, 0x65, 0x73, 0x3b, 0x3b, 0x3b, 0x3b, 0x72, 0x6f, 0x75, 0x70, 0x69, 0x65, 0x73, 0x20, 0x64, 0x65, 0x73,
-0x20, 0x53, 0x65, 0x79, 0x63, 0x68, 0x65, 0x6c, 0x6c, 0x65, 0x73, 0x3b, 0x66, 0x72, 0x61, 0x6e, 0x63, 0x20, 0x73, 0x75,
-0x69, 0x73, 0x73, 0x65, 0x3b, 0x3b, 0x66, 0x72, 0x61, 0x6e, 0x63, 0x20, 0x73, 0x75, 0x69, 0x73, 0x73, 0x65, 0x3b, 0x3b,
-0x3b, 0x3b, 0x66, 0x72, 0x61, 0x6e, 0x63, 0x73, 0x20, 0x73, 0x75, 0x69, 0x73, 0x73, 0x65, 0x73, 0x3b, 0x6c, 0x69, 0x76,
-0x72, 0x65, 0x20, 0x73, 0x79, 0x72, 0x69, 0x65, 0x6e, 0x6e, 0x65, 0x3b, 0x3b, 0x6c, 0x69, 0x76, 0x72, 0x65, 0x20, 0x73,
-0x79, 0x72, 0x69, 0x65, 0x6e, 0x6e, 0x65, 0x3b, 0x3b, 0x3b, 0x3b, 0x6c, 0x69, 0x76, 0x72, 0x65, 0x73, 0x20, 0x73, 0x79,
-0x72, 0x69, 0x65, 0x6e, 0x6e, 0x65, 0x73, 0x3b, 0x64, 0x69, 0x6e, 0x61, 0x72, 0x20, 0x74, 0x75, 0x6e, 0x69, 0x73, 0x69,
-0x65, 0x6e, 0x3b, 0x3b, 0x64, 0x69, 0x6e, 0x61, 0x72, 0x20, 0x74, 0x75, 0x6e, 0x69, 0x73, 0x69, 0x65, 0x6e, 0x3b, 0x3b,
-0x3b, 0x3b, 0x64, 0x69, 0x6e, 0x61, 0x72, 0x73, 0x20, 0x74, 0x75, 0x6e, 0x69, 0x73, 0x69, 0x65, 0x6e, 0x73, 0x3b, 0x76,
-0x61, 0x74, 0x75, 0x20, 0x76, 0x61, 0x6e, 0x75, 0x61, 0x74, 0x75, 0x61, 0x6e, 0x3b, 0x3b, 0x76, 0x61, 0x74, 0x75, 0x20,
-0x76, 0x61, 0x6e, 0x75, 0x61, 0x74, 0x75, 0x61, 0x6e, 0x3b, 0x3b, 0x3b, 0x3b, 0x76, 0x61, 0x74, 0x75, 0x73, 0x20, 0x76,
-0x61, 0x6e, 0x75, 0x61, 0x74, 0x75, 0x61, 0x6e, 0x73, 0x3b, 0x50, 0x75, 0x6e, 0x6e, 0x64, 0x20, 0x53, 0x61, 0x73, 0x61,
-0x6e, 0x6e, 0x61, 0x63, 0x68, 0x3b, 0x3b, 0x70, 0x68, 0x75, 0x6e, 0x6e, 0x64, 0x20, 0x53, 0x61, 0x73, 0x61, 0x6e, 0x6e,
-0x61, 0x63, 0x68, 0x3b, 0x70, 0x68, 0x75, 0x6e, 0x6e, 0x64, 0x20, 0x53, 0x61, 0x73, 0x61, 0x6e, 0x6e, 0x61, 0x63, 0x68,
-0x3b, 0x70, 0x75, 0x69, 0x6e, 0x6e, 0x64, 0x20, 0x53, 0x68, 0x61, 0x73, 0x61, 0x6e, 0x6e, 0x61, 0x63, 0x68, 0x3b, 0x3b,
-0x70, 0x75, 0x6e, 0x6e, 0x64, 0x20, 0x53, 0x61, 0x73, 0x61, 0x6e, 0x6e, 0x61, 0x63, 0x68, 0x3b, 0x10e5, 0x10d0, 0x10e0, 0x10d7,
-0x10e3, 0x10da, 0x10d8, 0x20, 0x10da, 0x10d0, 0x10e0, 0x10d8, 0x3b, 0x3b, 0x10e5, 0x10d0, 0x10e0, 0x10d7, 0x10e3, 0x10da, 0x10d8, 0x20, 0x10da, 0x10d0,
-0x10e0, 0x10d8, 0x3b, 0x3b, 0x3b, 0x3b, 0x10e5, 0x10d0, 0x10e0, 0x10d7, 0x10e3, 0x10da, 0x10d8, 0x20, 0x10da, 0x10d0, 0x10e0, 0x10d8, 0x3b, 0x45,
-0x75, 0x72, 0x6f, 0x3b, 0x3b, 0x45, 0x75, 0x72, 0x6f, 0x3b, 0x3b, 0x3b, 0x3b, 0x45, 0x75, 0x72, 0x6f, 0x3b, 0x53, 0x63,
-0x68, 0x77, 0x65, 0x69, 0x7a, 0x65, 0x72, 0x20, 0x46, 0x72, 0x61, 0x6e, 0x6b, 0x65, 0x6e, 0x3b, 0x3b, 0x53, 0x63, 0x68,
-0x77, 0x65, 0x69, 0x7a, 0x65, 0x72, 0x20, 0x46, 0x72, 0x61, 0x6e, 0x6b, 0x65, 0x6e, 0x3b, 0x3b, 0x3b, 0x3b, 0x53, 0x63,
-0x68, 0x77, 0x65, 0x69, 0x7a, 0x65, 0x72, 0x20, 0x46, 0x72, 0x61, 0x6e, 0x6b, 0x65, 0x6e, 0x3b, 0x395, 0x3c5, 0x3c1, 0x3ce,
-0x3b, 0x3b, 0x3b5, 0x3c5, 0x3c1, 0x3ce, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b5, 0x3c5, 0x3c1, 0x3ce, 0x3b, 0x64, 0x61, 0x6e, 0x6d, 0x61,
-0x72, 0x6b, 0x69, 0x6d, 0x75, 0x74, 0x20, 0x6b, 0x6f, 0x72, 0x75, 0x75, 0x6e, 0x69, 0x3b, 0x3b, 0x64, 0x61, 0x6e, 0x73,
-0x6b, 0x69, 0x6e, 0x75, 0x74, 0x20, 0x6b, 0x6f, 0x72, 0x75, 0x75, 0x6e, 0x69, 0x3b, 0x3b, 0x3b, 0x3b, 0x64, 0x61, 0x6e,
-0x6d, 0x61, 0x72, 0x6b, 0x69, 0x6d, 0x75, 0x74, 0x20, 0x6b, 0x6f, 0x72, 0x75, 0x75, 0x6e, 0x69, 0x3b, 0xaad, 0xabe, 0xab0,
-0xaa4, 0xac0, 0xaaf, 0x20, 0xab0, 0xac2, 0xaaa, 0xabf, 0xaaf, 0xabe, 0x3b, 0x3b, 0xaad, 0xabe, 0xab0, 0xaa4, 0xac0, 0xaaf, 0x20, 0xab0,
-0xac2, 0xaaa, 0xabf, 0xaaf, 0xabe, 0x3b, 0x3b, 0x3b, 0x3b, 0xaad, 0xabe, 0xab0, 0xaa4, 0xac0, 0xaaf, 0x20, 0xab0, 0xac2, 0xaaa, 0xabf,
-0xaaf, 0xabe, 0x3b, 0x4e, 0x61, 0x69, 0x72, 0x61, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x4b, 0x75, 0x257, 0x69, 0x6e,
-0x20, 0x53, 0x65, 0x66, 0x61, 0x20, 0x6e, 0x61, 0x20, 0x41, 0x66, 0x69, 0x72, 0x6b, 0x61, 0x20, 0x54, 0x61, 0x20, 0x59,
-0x61, 0x6d, 0x6d, 0x61, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x5e9, 0x5e7, 0x5dc, 0x20, 0x5d7, 0x5d3, 0x5e9, 0x3b, 0x3b,
-0x5e9, 0x5e7, 0x5dc, 0x20, 0x5d7, 0x5d3, 0x5e9, 0x3b, 0x5e9, 0x5e7, 0x5dc, 0x5d9, 0x5dd, 0x20, 0x5d7, 0x5d3, 0x5e9, 0x5d9, 0x5dd, 0x3b,
-0x3b, 0x5e9, 0x5e7, 0x5dc, 0x5d9, 0x5dd, 0x20, 0x5d7, 0x5d3, 0x5e9, 0x5d9, 0x5dd, 0x3b, 0x5e9, 0x5e7, 0x5dc, 0x5d9, 0x5dd, 0x20, 0x5d7,
-0x5d3, 0x5e9, 0x5d9, 0x5dd, 0x3b, 0x92d, 0x93e, 0x930, 0x924, 0x940, 0x92f, 0x20, 0x930, 0x941, 0x92a, 0x92f, 0x93e, 0x3b, 0x3b, 0x92d,
-0x93e, 0x930, 0x924, 0x940, 0x92f, 0x20, 0x930, 0x941, 0x92a, 0x92f, 0x93e, 0x3b, 0x3b, 0x3b, 0x3b, 0x92d, 0x93e, 0x930, 0x924, 0x940,
-0x92f, 0x20, 0x930, 0x942, 0x92a, 0x90f, 0x3b, 0x6d, 0x61, 0x67, 0x79, 0x61, 0x72, 0x20, 0x66, 0x6f, 0x72, 0x69, 0x6e, 0x74,
-0x3b, 0x3b, 0x6d, 0x61, 0x67, 0x79, 0x61, 0x72, 0x20, 0x66, 0x6f, 0x72, 0x69, 0x6e, 0x74, 0x3b, 0x3b, 0x3b, 0x3b, 0x6d,
-0x61, 0x67, 0x79, 0x61, 0x72, 0x20, 0x66, 0x6f, 0x72, 0x69, 0x6e, 0x74, 0x3b, 0xed, 0x73, 0x6c, 0x65, 0x6e, 0x73, 0x6b,
-0x20, 0x6b, 0x72, 0xf3, 0x6e, 0x61, 0x3b, 0x3b, 0xed, 0x73, 0x6c, 0x65, 0x6e, 0x73, 0x6b, 0x20, 0x6b, 0x72, 0xf3, 0x6e,
-0x61, 0x3b, 0x3b, 0x3b, 0x3b, 0xed, 0x73, 0x6c, 0x65, 0x6e, 0x73, 0x6b, 0x61, 0x72, 0x20, 0x6b, 0x72, 0xf3, 0x6e, 0x75,
-0x72, 0x3b, 0x52, 0x75, 0x70, 0x69, 0x61, 0x68, 0x20, 0x49, 0x6e, 0x64, 0x6f, 0x6e, 0x65, 0x73, 0x69, 0x61, 0x3b, 0x3b,
-0x3b, 0x3b, 0x3b, 0x3b, 0x52, 0x75, 0x70, 0x69, 0x61, 0x68, 0x20, 0x49, 0x6e, 0x64, 0x6f, 0x6e, 0x65, 0x73, 0x69, 0x61,
-0x3b, 0x45, 0x75, 0x72, 0x6f, 0x3b, 0x3b, 0x65, 0x75, 0x72, 0x6f, 0x3b, 0x65, 0x75, 0x72, 0x6f, 0x3b, 0x65, 0x75, 0x72,
-0x6f, 0x3b, 0x65, 0x75, 0x72, 0x6f, 0x3b, 0x65, 0x75, 0x72, 0x6f, 0x3b, 0x65, 0x75, 0x72, 0x6f, 0x3b, 0x3b, 0x65, 0x75,
-0x72, 0x6f, 0x3b, 0x3b, 0x3b, 0x3b, 0x65, 0x75, 0x72, 0x6f, 0x3b, 0x66, 0x72, 0x61, 0x6e, 0x63, 0x6f, 0x20, 0x73, 0x76,
-0x69, 0x7a, 0x7a, 0x65, 0x72, 0x6f, 0x3b, 0x3b, 0x66, 0x72, 0x61, 0x6e, 0x63, 0x6f, 0x20, 0x73, 0x76, 0x69, 0x7a, 0x7a,
-0x65, 0x72, 0x6f, 0x3b, 0x3b, 0x3b, 0x3b, 0x66, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x69, 0x20, 0x73, 0x76, 0x69, 0x7a, 0x7a,
-0x65, 0x72, 0x69, 0x3b, 0x65e5, 0x672c, 0x5186, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x5186, 0x3b, 0xcad, 0xcbe, 0xcb0, 0xca4, 0xcc0,
-0xcaf, 0x20, 0xcb0, 0xcc2, 0xcaa, 0xcbe, 0xcaf, 0xcbf, 0x3b, 0x3b, 0xcad, 0xcbe, 0xcb0, 0xca4, 0xcc0, 0xcaf, 0x20, 0xcb0, 0xcc2, 0xcaa,
-0xcbe, 0xcaf, 0xcbf, 0x3b, 0x3b, 0x3b, 0x3b, 0xcad, 0xcbe, 0xcb0, 0xca4, 0xcc0, 0xcaf, 0x20, 0xcb0, 0xcc2, 0xcaa, 0xcbe, 0xcaf, 0xcbf,
-0xc97, 0xcb3, 0xcc1, 0x3b, 0x6c1, 0x650, 0x646, 0x62f, 0x64f, 0x633, 0x62a, 0x672, 0x646, 0x6cd, 0x20, 0x631, 0x6c4, 0x67e, 0x64e, 0x6d2,
-0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x49a, 0x430, 0x437, 0x430, 0x49b, 0x441, 0x442, 0x430, 0x43d, 0x20, 0x442, 0x435, 0x4a3,
-0x433, 0x435, 0x441, 0x456, 0x3b, 0x3b, 0x49a, 0x430, 0x437, 0x430, 0x49b, 0x441, 0x442, 0x430, 0x43d, 0x20, 0x442, 0x435, 0x4a3, 0x433,
-0x435, 0x441, 0x456, 0x3b, 0x3b, 0x3b, 0x3b, 0x49a, 0x430, 0x437, 0x430, 0x49b, 0x441, 0x442, 0x430, 0x43d, 0x20, 0x442, 0x435, 0x4a3,
-0x433, 0x435, 0x441, 0x456, 0x3b, 0x41a, 0x44b, 0x440, 0x433, 0x44b, 0x437, 0x441, 0x442, 0x430, 0x43d, 0x20, 0x441, 0x43e, 0x43c, 0x443,
-0x3b, 0x3b, 0x41a, 0x44b, 0x440, 0x433, 0x44b, 0x437, 0x441, 0x442, 0x430, 0x43d, 0x20, 0x441, 0x43e, 0x43c, 0x443, 0x3b, 0x3b, 0x3b,
-0x3b, 0x41a, 0x44b, 0x440, 0x433, 0x44b, 0x437, 0x441, 0x442, 0x430, 0x43d, 0x20, 0x441, 0x43e, 0x43c, 0x443, 0x3b, 0xb300, 0xd55c, 0xbbfc,
-0xad6d, 0x20, 0xc6d0, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0xb300, 0xd55c, 0xbbfc, 0xad6d, 0x20, 0xc6d0, 0x3b, 0xc870, 0xc120, 0x20, 0xbbfc,
-0xc8fc, 0xc8fc, 0xc758, 0x20, 0xc778, 0xbbfc, 0x20, 0xacf5, 0xd654, 0xad6d, 0x20, 0xc6d0, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0xc870, 0xc120,
-0x20, 0xbbfc, 0xc8fc, 0xc8fc, 0xc758, 0x20, 0xc778, 0xbbfc, 0x20, 0xacf5, 0xd654, 0xad6d, 0x20, 0xc6d0, 0x3b, 0x49, 0x66, 0x61, 0x72, 0x61,
-0x6e, 0x67, 0x61, 0x20, 0x72, 0x79, 0x2019, 0x55, 0x62, 0x75, 0x72, 0x75, 0x6e, 0x64, 0x69, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b,
-0x3b, 0x3b, 0xea5, 0xeb2, 0xea7, 0x20, 0xe81, 0xeb5, 0xe9a, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0xea5, 0xeb2, 0xea7, 0x20, 0xe81,
-0xeb5, 0xe9a, 0x3b, 0x65, 0x69, 0x72, 0x6f, 0x3b, 0x65, 0x69, 0x72, 0x6f, 0x3b, 0x65, 0x69, 0x72, 0x6f, 0x3b, 0x3b, 0x3b,
-0x3b, 0x65, 0x69, 0x72, 0x6f, 0x3b, 0x46, 0x61, 0x6c, 0xe1, 0x6e, 0x67, 0x61, 0x20, 0x79, 0x61, 0x20, 0x4b, 0x6f, 0x6e,
-0x67, 0xf3, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x4b, 0x77, 0x61, 0x6e, 0x7a, 0x61, 0x20, 0x79, 0x61, 0x20, 0x41,
-0x6e, 0x67, 0xf3, 0x6c, 0x61, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x46, 0x61, 0x6c, 0xe1, 0x6e, 0x67, 0x61, 0x20,
-0x43, 0x46, 0x41, 0x20, 0x42, 0x45, 0x41, 0x43, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x45, 0x75, 0x72, 0x61, 0x73,
-0x3b, 0x3b, 0x65, 0x75, 0x72, 0x61, 0x73, 0x3b, 0x3b, 0x65, 0x75, 0x72, 0x61, 0x69, 0x3b, 0x65, 0x75, 0x72, 0x6f, 0x3b,
-0x65, 0x75, 0x72, 0x173, 0x3b, 0x41c, 0x430, 0x43a, 0x435, 0x434, 0x43e, 0x43d, 0x441, 0x43a, 0x438, 0x20, 0x434, 0x435, 0x43d, 0x430,
-0x440, 0x3b, 0x3b, 0x41c, 0x430, 0x43a, 0x435, 0x434, 0x43e, 0x43d, 0x441, 0x43a, 0x438, 0x20, 0x434, 0x435, 0x43d, 0x430, 0x440, 0x3b,
-0x3b, 0x3b, 0x3b, 0x41c, 0x430, 0x43a, 0x435, 0x434, 0x43e, 0x43d, 0x441, 0x43a, 0x438, 0x20, 0x434, 0x435, 0x43d, 0x430, 0x440, 0x438,
-0x3b, 0x41, 0x72, 0x69, 0x61, 0x72, 0x79, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x52, 0x69, 0x6e, 0x67, 0x67, 0x69,
-0x74, 0x20, 0x4d, 0x61, 0x6c, 0x61, 0x79, 0x73, 0x69, 0x61, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x52, 0x69, 0x6e, 0x67,
-0x67, 0x69, 0x74, 0x20, 0x4d, 0x61, 0x6c, 0x61, 0x79, 0x73, 0x69, 0x61, 0x3b, 0x44, 0x6f, 0x6c, 0x61, 0x72, 0x20, 0x42,
-0x72, 0x75, 0x6e, 0x65, 0x69, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x44, 0x6f, 0x6c, 0x61, 0x72, 0x20, 0x42, 0x72, 0x75,
-0x6e, 0x65, 0x69, 0x3b, 0x44, 0x6f, 0x6c, 0x61, 0x72, 0x20, 0x53, 0x69, 0x6e, 0x67, 0x61, 0x70, 0x75, 0x72, 0x61, 0x3b,
-0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x44, 0x6f, 0x6c, 0x61, 0x72, 0x20, 0x53, 0x69, 0x6e, 0x67, 0x61, 0x70, 0x75, 0x72, 0x61,
-0x3b, 0xd07, 0xd28, 0xd4d, 0xd24, 0xd4d, 0xd2f, 0xd7b, 0x20, 0xd30, 0xd42, 0xd2a, 0x3b, 0x3b, 0xd07, 0xd28, 0xd4d, 0xd24, 0xd4d, 0xd2f,
-0xd7b, 0x20, 0xd30, 0xd42, 0xd2a, 0x3b, 0x3b, 0x3b, 0x3b, 0xd07, 0xd28, 0xd4d, 0xd24, 0xd4d, 0xd2f, 0xd7b, 0x20, 0xd30, 0xd42, 0xd2a,
-0x3b, 0x65, 0x77, 0x72, 0x6f, 0x3b, 0x3b, 0x65, 0x77, 0x72, 0x6f, 0x3b, 0x3b, 0x65, 0x77, 0x72, 0x6f, 0x3b, 0x65, 0x77,
-0x72, 0x6f, 0x3b, 0x65, 0x77, 0x72, 0x6f, 0x3b, 0x54, 0x101, 0x72, 0x61, 0x20, 0x6f, 0x20, 0x41, 0x6f, 0x74, 0x65, 0x61,
-0x72, 0x6f, 0x61, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x4e, 0x67, 0x101, 0x20, 0x74, 0x101, 0x72, 0x61, 0x20, 0x6f, 0x20,
-0x41, 0x6f, 0x74, 0x65, 0x61, 0x72, 0x6f, 0x61, 0x3b, 0x92d, 0x93e, 0x930, 0x924, 0x940, 0x92f, 0x20, 0x930, 0x941, 0x92a, 0x92f,
-0x93e, 0x3b, 0x3b, 0x92d, 0x93e, 0x930, 0x924, 0x940, 0x92f, 0x20, 0x930, 0x941, 0x92a, 0x92f, 0x93e, 0x3b, 0x3b, 0x3b, 0x3b, 0x92d,
-0x93e, 0x930, 0x924, 0x940, 0x92f, 0x20, 0x930, 0x941, 0x92a, 0x92f, 0x947, 0x3b, 0x442, 0x4e9, 0x433, 0x440, 0x4e9, 0x433, 0x3b, 0x3b,
-0x442, 0x4e9, 0x433, 0x440, 0x4e9, 0x433, 0x3b, 0x3b, 0x3b, 0x3b, 0x442, 0x4e9, 0x433, 0x440, 0x4e9, 0x433, 0x3b, 0x928, 0x947, 0x92a,
-0x93e, 0x932, 0x940, 0x20, 0x930, 0x942, 0x92a, 0x948, 0x92f, 0x93e, 0x901, 0x3b, 0x3b, 0x928, 0x947, 0x92a, 0x93e, 0x932, 0x940, 0x20,
-0x930, 0x942, 0x92a, 0x948, 0x92f, 0x93e, 0x901, 0x3b, 0x3b, 0x3b, 0x3b, 0x928, 0x947, 0x92a, 0x93e, 0x932, 0x940, 0x20, 0x930, 0x942,
-0x92a, 0x948, 0x92f, 0x93e, 0x901, 0x3b, 0x92d, 0x93e, 0x930, 0x924, 0x940, 0x92f, 0x20, 0x930, 0x942, 0x92a, 0x93f, 0x901, 0x92f, 0x93e,
-0x3b, 0x3b, 0x92d, 0x93e, 0x930, 0x924, 0x940, 0x92f, 0x20, 0x930, 0x942, 0x92a, 0x93f, 0x901, 0x92f, 0x93e, 0x3b, 0x3b, 0x3b, 0x3b,
-0x92d, 0x93e, 0x930, 0x924, 0x940, 0x92f, 0x20, 0x930, 0x942, 0x92a, 0x93f, 0x901, 0x92f, 0x93e, 0x3b, 0x6e, 0x6f, 0x72, 0x73, 0x6b,
-0x65, 0x20, 0x6b, 0x72, 0x6f, 0x6e, 0x65, 0x72, 0x3b, 0x3b, 0x6e, 0x6f, 0x72, 0x73, 0x6b, 0x20, 0x6b, 0x72, 0x6f, 0x6e,
-0x65, 0x3b, 0x3b, 0x3b, 0x3b, 0x6e, 0x6f, 0x72, 0x73, 0x6b, 0x65, 0x20, 0x6b, 0x72, 0x6f, 0x6e, 0x65, 0x72, 0x3b, 0xb2d,
-0xb3e, 0xb30, 0xb24, 0xb40, 0xb5f, 0x20, 0xb1f, 0xb19, 0xb4d, 0xb15, 0xb3e, 0x3b, 0x3b, 0xb2d, 0xb3e, 0xb30, 0xb24, 0xb40, 0xb5f, 0x20,
-0xb1f, 0xb19, 0xb4d, 0xb15, 0xb3e, 0x3b, 0x3b, 0x3b, 0x3b, 0xb2d, 0xb3e, 0xb30, 0xb24, 0xb40, 0xb5f, 0x20, 0xb1f, 0xb19, 0xb4d, 0xb15,
-0xb3e, 0x3b, 0x627, 0x641, 0x63a, 0x627, 0x646, 0x6cd, 0x3b, 0x3b, 0x627, 0x641, 0x63a, 0x627, 0x646, 0x6cd, 0x3b, 0x3b, 0x3b, 0x3b,
-0x627, 0x641, 0x63a, 0x627, 0x646, 0x6cd, 0x3b, 0x67e, 0x627, 0x6a9, 0x633, 0x62a, 0x627, 0x646, 0x6cd, 0x20, 0x6a9, 0x644, 0x62f, 0x627,
-0x631, 0x647, 0x3b, 0x3b, 0x67e, 0x627, 0x6a9, 0x633, 0x62a, 0x627, 0x646, 0x6cd, 0x20, 0x6a9, 0x644, 0x62f, 0x627, 0x631, 0x647, 0x3b,
-0x3b, 0x3b, 0x3b, 0x67e, 0x627, 0x6a9, 0x633, 0x62a, 0x627, 0x646, 0x6cd, 0x20, 0x6a9, 0x644, 0x62f, 0x627, 0x631, 0x6d2, 0x3b, 0x631,
-0x6cc, 0x627, 0x644, 0x20, 0x627, 0x6cc, 0x631, 0x627, 0x646, 0x3b, 0x3b, 0x631, 0x6cc, 0x627, 0x644, 0x20, 0x627, 0x6cc, 0x631, 0x627,
-0x646, 0x3b, 0x3b, 0x3b, 0x3b, 0x631, 0x6cc, 0x627, 0x644, 0x20, 0x627, 0x6cc, 0x631, 0x627, 0x646, 0x3b, 0x627, 0x641, 0x63a, 0x627,
-0x646, 0x6cc, 0x20, 0x627, 0x641, 0x63a, 0x627, 0x646, 0x633, 0x62a, 0x627, 0x646, 0x3b, 0x3b, 0x627, 0x641, 0x63a, 0x627, 0x646, 0x6cc,
-0x20, 0x627, 0x641, 0x63a, 0x627, 0x646, 0x633, 0x62a, 0x627, 0x646, 0x3b, 0x3b, 0x3b, 0x3b, 0x627, 0x641, 0x63a, 0x627, 0x646, 0x6cc,
-0x20, 0x627, 0x641, 0x63a, 0x627, 0x646, 0x633, 0x62a, 0x627, 0x646, 0x3b, 0x7a, 0x142, 0x6f, 0x74, 0x79, 0x20, 0x70, 0x6f, 0x6c,
-0x73, 0x6b, 0x69, 0x3b, 0x3b, 0x7a, 0x142, 0x6f, 0x74, 0x79, 0x20, 0x70, 0x6f, 0x6c, 0x73, 0x6b, 0x69, 0x3b, 0x3b, 0x7a,
-0x142, 0x6f, 0x74, 0x65, 0x20, 0x70, 0x6f, 0x6c, 0x73, 0x6b, 0x69, 0x65, 0x3b, 0x7a, 0x142, 0x6f, 0x74, 0x79, 0x63, 0x68,
-0x20, 0x70, 0x6f, 0x6c, 0x73, 0x6b, 0x69, 0x63, 0x68, 0x3b, 0x7a, 0x142, 0x6f, 0x74, 0x65, 0x67, 0x6f, 0x20, 0x70, 0x6f,
-0x6c, 0x73, 0x6b, 0x69, 0x65, 0x67, 0x6f, 0x3b, 0x52, 0x65, 0x61, 0x6c, 0x20, 0x62, 0x72, 0x61, 0x73, 0x69, 0x6c, 0x65,
-0x69, 0x72, 0x6f, 0x3b, 0x3b, 0x52, 0x65, 0x61, 0x6c, 0x20, 0x62, 0x72, 0x61, 0x73, 0x69, 0x6c, 0x65, 0x69, 0x72, 0x6f,
-0x3b, 0x3b, 0x3b, 0x3b, 0x52, 0x65, 0x61, 0x69, 0x73, 0x20, 0x62, 0x72, 0x61, 0x73, 0x69, 0x6c, 0x65, 0x69, 0x72, 0x6f,
-0x73, 0x3b, 0x6b, 0x77, 0x61, 0x6e, 0x7a, 0x61, 0x20, 0x61, 0x6e, 0x67, 0x6f, 0x6c, 0x61, 0x6e, 0x6f, 0x3b, 0x3b, 0x6b,
-0x77, 0x61, 0x6e, 0x7a, 0x61, 0x20, 0x61, 0x6e, 0x67, 0x6f, 0x6c, 0x61, 0x6e, 0x6f, 0x3b, 0x3b, 0x3b, 0x3b, 0x6b, 0x77,
-0x61, 0x6e, 0x7a, 0x61, 0x73, 0x20, 0x61, 0x6e, 0x67, 0x6f, 0x6c, 0x61, 0x6e, 0x6f, 0x73, 0x3b, 0x65, 0x73, 0x63, 0x75,
-0x64, 0x6f, 0x20, 0x63, 0x61, 0x62, 0x6f, 0x2d, 0x76, 0x65, 0x72, 0x64, 0x69, 0x61, 0x6e, 0x6f, 0x3b, 0x3b, 0x65, 0x73,
-0x63, 0x75, 0x64, 0x6f, 0x20, 0x63, 0x61, 0x62, 0x6f, 0x2d, 0x76, 0x65, 0x72, 0x64, 0x69, 0x61, 0x6e, 0x6f, 0x3b, 0x3b,
-0x3b, 0x3b, 0x65, 0x73, 0x63, 0x75, 0x64, 0x6f, 0x73, 0x20, 0x63, 0x61, 0x62, 0x6f, 0x2d, 0x76, 0x65, 0x72, 0x64, 0x69,
-0x61, 0x6e, 0x6f, 0x73, 0x3b, 0x64, 0xf3, 0x6c, 0x61, 0x72, 0x20, 0x64, 0x6f, 0x73, 0x20, 0x45, 0x73, 0x74, 0x61, 0x64,
-0x6f, 0x73, 0x20, 0x55, 0x6e, 0x69, 0x64, 0x6f, 0x73, 0x3b, 0x3b, 0x64, 0xf3, 0x6c, 0x61, 0x72, 0x20, 0x64, 0x6f, 0x73,
-0x20, 0x45, 0x73, 0x74, 0x61, 0x64, 0x6f, 0x73, 0x20, 0x55, 0x6e, 0x69, 0x64, 0x6f, 0x73, 0x3b, 0x3b, 0x3b, 0x3b, 0x64,
-0xf3, 0x6c, 0x61, 0x72, 0x65, 0x73, 0x20, 0x64, 0x6f, 0x73, 0x20, 0x45, 0x73, 0x74, 0x61, 0x64, 0x6f, 0x73, 0x20, 0x55,
-0x6e, 0x69, 0x64, 0x6f, 0x73, 0x3b, 0x66, 0x72, 0x61, 0x6e, 0x63, 0x6f, 0x20, 0x43, 0x46, 0x41, 0x20, 0x28, 0x42, 0x45,
-0x41, 0x43, 0x29, 0x3b, 0x3b, 0x66, 0x72, 0x61, 0x6e, 0x63, 0x6f, 0x20, 0x43, 0x46, 0x41, 0x20, 0x28, 0x42, 0x45, 0x41,
-0x43, 0x29, 0x3b, 0x3b, 0x3b, 0x3b, 0x66, 0x72, 0x61, 0x6e, 0x63, 0x6f, 0x73, 0x20, 0x43, 0x46, 0x41, 0x20, 0x28, 0x42,
-0x45, 0x41, 0x43, 0x29, 0x3b, 0x66, 0x72, 0x61, 0x6e, 0x63, 0x6f, 0x20, 0x43, 0x46, 0x41, 0x20, 0x28, 0x42, 0x43, 0x45,
-0x41, 0x4f, 0x29, 0x3b, 0x3b, 0x66, 0x72, 0x61, 0x6e, 0x63, 0x6f, 0x20, 0x43, 0x46, 0x41, 0x20, 0x28, 0x42, 0x43, 0x45,
-0x41, 0x4f, 0x29, 0x3b, 0x3b, 0x3b, 0x3b, 0x66, 0x72, 0x61, 0x6e, 0x63, 0x6f, 0x73, 0x20, 0x43, 0x46, 0x41, 0x20, 0x28,
-0x42, 0x43, 0x45, 0x41, 0x4f, 0x29, 0x3b, 0x50, 0x61, 0x74, 0x61, 0x63, 0x61, 0x20, 0x64, 0x65, 0x20, 0x4d, 0x61, 0x63,
-0x61, 0x75, 0x3b, 0x3b, 0x50, 0x61, 0x74, 0x61, 0x63, 0x61, 0x20, 0x64, 0x65, 0x20, 0x4d, 0x61, 0x63, 0x61, 0x75, 0x3b,
-0x3b, 0x3b, 0x3b, 0x50, 0x61, 0x74, 0x61, 0x63, 0x61, 0x73, 0x20, 0x64, 0x65, 0x20, 0x4d, 0x61, 0x63, 0x61, 0x75, 0x3b,
-0x6d, 0x65, 0x74, 0x69, 0x63, 0x61, 0x6c, 0x20, 0x6d, 0x6f, 0xe7, 0x61, 0x6d, 0x62, 0x69, 0x63, 0x61, 0x6e, 0x6f, 0x3b,
-0x3b, 0x6d, 0x65, 0x74, 0x69, 0x63, 0x61, 0x6c, 0x20, 0x6d, 0x6f, 0xe7, 0x61, 0x6d, 0x62, 0x69, 0x63, 0x61, 0x6e, 0x6f,
-0x3b, 0x3b, 0x3b, 0x3b, 0x6d, 0x65, 0x74, 0x69, 0x63, 0x61, 0x69, 0x73, 0x20, 0x6d, 0x6f, 0xe7, 0x61, 0x6d, 0x62, 0x69,
-0x63, 0x61, 0x6e, 0x6f, 0x73, 0x3b, 0x64, 0x6f, 0x62, 0x72, 0x61, 0x20, 0x64, 0x65, 0x20, 0x53, 0xe3, 0x6f, 0x20, 0x54,
-0x6f, 0x6d, 0xe9, 0x20, 0x65, 0x20, 0x50, 0x72, 0xed, 0x6e, 0x63, 0x69, 0x70, 0x65, 0x3b, 0x3b, 0x64, 0x6f, 0x62, 0x72,
-0x61, 0x20, 0x64, 0x65, 0x20, 0x53, 0xe3, 0x6f, 0x20, 0x54, 0x6f, 0x6d, 0xe9, 0x20, 0x65, 0x20, 0x50, 0x72, 0xed, 0x6e,
-0x63, 0x69, 0x70, 0x65, 0x3b, 0x3b, 0x3b, 0x3b, 0x64, 0x6f, 0x62, 0x72, 0x61, 0x73, 0x20, 0x64, 0x65, 0x20, 0x53, 0xe3,
-0x6f, 0x20, 0x54, 0x6f, 0x6d, 0xe9, 0x20, 0x65, 0x20, 0x50, 0x72, 0xed, 0x6e, 0x63, 0x69, 0x70, 0x65, 0x3b, 0x66, 0x72,
-0x61, 0x6e, 0x63, 0x6f, 0x20, 0x73, 0x75, 0xed, 0xe7, 0x6f, 0x3b, 0x3b, 0x66, 0x72, 0x61, 0x6e, 0x63, 0x6f, 0x20, 0x73,
-0x75, 0xed, 0xe7, 0x6f, 0x3b, 0x3b, 0x3b, 0x3b, 0x66, 0x72, 0x61, 0x6e, 0x63, 0x6f, 0x73, 0x20, 0x73, 0x75, 0xed, 0xe7,
-0x6f, 0x73, 0x3b, 0xa2d, 0xa3e, 0xa30, 0xa24, 0xa40, 0x20, 0xa30, 0xa41, 0xa2a, 0xa07, 0xa06, 0x3b, 0x3b, 0xa2d, 0xa3e, 0xa30, 0xa24,
-0xa40, 0x20, 0xa30, 0xa41, 0xa2a, 0xa07, 0xa06, 0x3b, 0x3b, 0x3b, 0x3b, 0xa2d, 0xa3e, 0xa30, 0xa24, 0xa40, 0x20, 0xa30, 0xa41, 0xa2a,
-0xa0f, 0x3b, 0x631, 0x648, 0x67e, 0x626, 0x6cc, 0x6c1, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x66, 0x72, 0x61, 0x6e, 0x63,
-0x20, 0x73, 0x76, 0x69, 0x7a, 0x7a, 0x65, 0x72, 0x3b, 0x3b, 0x66, 0x72, 0x61, 0x6e, 0x63, 0x20, 0x73, 0x76, 0x69, 0x7a,
-0x7a, 0x65, 0x72, 0x3b, 0x3b, 0x3b, 0x3b, 0x66, 0x72, 0x61, 0x6e, 0x63, 0x20, 0x73, 0x76, 0x69, 0x7a, 0x7a, 0x65, 0x72,
-0x3b, 0x6c, 0x65, 0x75, 0x20, 0x72, 0x6f, 0x6d, 0xe2, 0x6e, 0x65, 0x73, 0x63, 0x3b, 0x3b, 0x6c, 0x65, 0x75, 0x20, 0x72,
-0x6f, 0x6d, 0xe2, 0x6e, 0x65, 0x73, 0x63, 0x3b, 0x3b, 0x6c, 0x65, 0x69, 0x20, 0x72, 0x6f, 0x6d, 0xe2, 0x6e, 0x65, 0x219,
-0x74, 0x69, 0x3b, 0x3b, 0x6c, 0x65, 0x69, 0x20, 0x72, 0x6f, 0x6d, 0xe2, 0x6e, 0x65, 0x219, 0x74, 0x69, 0x3b, 0x6c, 0x65,
-0x75, 0x20, 0x6d, 0x6f, 0x6c, 0x64, 0x6f, 0x76, 0x65, 0x6e, 0x65, 0x73, 0x63, 0x3b, 0x3b, 0x6c, 0x65, 0x75, 0x20, 0x6d,
-0x6f, 0x6c, 0x64, 0x6f, 0x76, 0x65, 0x6e, 0x65, 0x73, 0x63, 0x3b, 0x3b, 0x6c, 0x65, 0x69, 0x20, 0x6d, 0x6f, 0x6c, 0x64,
-0x6f, 0x76, 0x65, 0x6e, 0x65, 0x219, 0x74, 0x69, 0x3b, 0x3b, 0x6c, 0x65, 0x69, 0x20, 0x6d, 0x6f, 0x6c, 0x64, 0x6f, 0x76,
-0x65, 0x6e, 0x65, 0x219, 0x74, 0x69, 0x3b, 0x440, 0x43e, 0x441, 0x441, 0x438, 0x439, 0x441, 0x43a, 0x438, 0x439, 0x20, 0x440, 0x443,
-0x431, 0x43b, 0x44c, 0x3b, 0x3b, 0x440, 0x43e, 0x441, 0x441, 0x438, 0x439, 0x441, 0x43a, 0x438, 0x439, 0x20, 0x440, 0x443, 0x431, 0x43b,
-0x44c, 0x3b, 0x3b, 0x440, 0x43e, 0x441, 0x441, 0x438, 0x439, 0x441, 0x43a, 0x438, 0x445, 0x20, 0x440, 0x443, 0x431, 0x43b, 0x44f, 0x3b,
-0x440, 0x43e, 0x441, 0x441, 0x438, 0x439, 0x441, 0x43a, 0x438, 0x445, 0x20, 0x440, 0x443, 0x431, 0x43b, 0x435, 0x439, 0x3b, 0x440, 0x43e,
-0x441, 0x441, 0x438, 0x439, 0x441, 0x43a, 0x43e, 0x433, 0x43e, 0x20, 0x440, 0x443, 0x431, 0x43b, 0x44f, 0x3b, 0x431, 0x435, 0x43b, 0x43e,
-0x440, 0x443, 0x441, 0x441, 0x43a, 0x438, 0x439, 0x20, 0x440, 0x443, 0x431, 0x43b, 0x44c, 0x3b, 0x3b, 0x431, 0x435, 0x43b, 0x43e, 0x440,
-0x443, 0x441, 0x441, 0x43a, 0x438, 0x439, 0x20, 0x440, 0x443, 0x431, 0x43b, 0x44c, 0x3b, 0x3b, 0x431, 0x435, 0x43b, 0x43e, 0x440, 0x443,
-0x441, 0x441, 0x43a, 0x438, 0x445, 0x20, 0x440, 0x443, 0x431, 0x43b, 0x44f, 0x3b, 0x431, 0x435, 0x43b, 0x43e, 0x440, 0x443, 0x441, 0x441,
-0x43a, 0x438, 0x445, 0x20, 0x440, 0x443, 0x431, 0x43b, 0x435, 0x439, 0x3b, 0x431, 0x435, 0x43b, 0x43e, 0x440, 0x443, 0x441, 0x441, 0x43a,
-0x43e, 0x433, 0x43e, 0x20, 0x440, 0x443, 0x431, 0x43b, 0x44f, 0x3b, 0x43a, 0x430, 0x437, 0x430, 0x445, 0x441, 0x43a, 0x438, 0x439, 0x20,
-0x442, 0x435, 0x43d, 0x433, 0x435, 0x3b, 0x3b, 0x43a, 0x430, 0x437, 0x430, 0x445, 0x441, 0x43a, 0x438, 0x439, 0x20, 0x442, 0x435, 0x43d,
-0x433, 0x435, 0x3b, 0x3b, 0x43a, 0x430, 0x437, 0x430, 0x445, 0x441, 0x43a, 0x438, 0x445, 0x20, 0x442, 0x435, 0x43d, 0x433, 0x435, 0x3b,
-0x43a, 0x430, 0x437, 0x430, 0x445, 0x441, 0x43a, 0x438, 0x445, 0x20, 0x442, 0x435, 0x43d, 0x433, 0x435, 0x3b, 0x43a, 0x430, 0x437, 0x430,
-0x445, 0x441, 0x43a, 0x43e, 0x433, 0x43e, 0x20, 0x442, 0x435, 0x43d, 0x433, 0x435, 0x3b, 0x43a, 0x438, 0x440, 0x433, 0x438, 0x437, 0x441,
-0x43a, 0x438, 0x439, 0x20, 0x441, 0x43e, 0x43c, 0x3b, 0x3b, 0x43a, 0x438, 0x440, 0x433, 0x438, 0x437, 0x441, 0x43a, 0x438, 0x439, 0x20,
-0x441, 0x43e, 0x43c, 0x3b, 0x3b, 0x43a, 0x438, 0x440, 0x433, 0x438, 0x437, 0x441, 0x43a, 0x438, 0x445, 0x20, 0x441, 0x43e, 0x43c, 0x430,
-0x3b, 0x43a, 0x438, 0x440, 0x433, 0x438, 0x437, 0x441, 0x43a, 0x438, 0x445, 0x20, 0x441, 0x43e, 0x43c, 0x43e, 0x432, 0x3b, 0x43a, 0x438,
-0x440, 0x433, 0x438, 0x437, 0x441, 0x43a, 0x43e, 0x433, 0x43e, 0x20, 0x441, 0x43e, 0x43c, 0x430, 0x3b, 0x43c, 0x43e, 0x43b, 0x434, 0x430,
-0x432, 0x441, 0x43a, 0x438, 0x439, 0x20, 0x43b, 0x435, 0x439, 0x3b, 0x3b, 0x43c, 0x43e, 0x43b, 0x434, 0x430, 0x432, 0x441, 0x43a, 0x438,
-0x439, 0x20, 0x43b, 0x435, 0x439, 0x3b, 0x3b, 0x43c, 0x43e, 0x43b, 0x434, 0x430, 0x432, 0x441, 0x43a, 0x438, 0x445, 0x20, 0x43b, 0x435,
-0x44f, 0x3b, 0x43c, 0x43e, 0x43b, 0x434, 0x430, 0x432, 0x441, 0x43a, 0x438, 0x445, 0x20, 0x43b, 0x435, 0x435, 0x432, 0x3b, 0x43c, 0x43e,
-0x43b, 0x434, 0x430, 0x432, 0x441, 0x43a, 0x43e, 0x433, 0x43e, 0x20, 0x43b, 0x435, 0x44f, 0x3b, 0x443, 0x43a, 0x440, 0x430, 0x438, 0x43d,
-0x441, 0x43a, 0x430, 0x44f, 0x20, 0x433, 0x440, 0x438, 0x432, 0x43d, 0x430, 0x3b, 0x3b, 0x443, 0x43a, 0x440, 0x430, 0x438, 0x43d, 0x441,
-0x43a, 0x430, 0x44f, 0x20, 0x433, 0x440, 0x438, 0x432, 0x43d, 0x430, 0x3b, 0x3b, 0x443, 0x43a, 0x440, 0x430, 0x438, 0x43d, 0x441, 0x43a,
-0x438, 0x435, 0x20, 0x433, 0x440, 0x438, 0x432, 0x43d, 0x44b, 0x3b, 0x443, 0x43a, 0x440, 0x430, 0x438, 0x43d, 0x441, 0x43a, 0x438, 0x445,
-0x20, 0x433, 0x440, 0x438, 0x432, 0x435, 0x43d, 0x3b, 0x443, 0x43a, 0x440, 0x430, 0x438, 0x43d, 0x441, 0x43a, 0x43e, 0x439, 0x20, 0x433,
-0x440, 0x438, 0x432, 0x43d, 0x44b, 0x3b, 0x66, 0x61, 0x72, 0xe2, 0x6e, 0x67, 0x61, 0x20, 0x43, 0x46, 0x41, 0x20, 0x28, 0x42,
-0x45, 0x41, 0x43, 0x29, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x421, 0x440, 0x43f, 0x441, 0x43a, 0x438, 0x20, 0x434, 0x438,
-0x43d, 0x430, 0x440, 0x3b, 0x3b, 0x441, 0x440, 0x43f, 0x441, 0x43a, 0x438, 0x20, 0x434, 0x438, 0x43d, 0x430, 0x440, 0x3b, 0x3b, 0x441,
-0x440, 0x43f, 0x441, 0x43a, 0x430, 0x20, 0x434, 0x438, 0x43d, 0x430, 0x440, 0x430, 0x3b, 0x3b, 0x441, 0x440, 0x43f, 0x441, 0x43a, 0x438,
-0x445, 0x20, 0x434, 0x438, 0x43d, 0x430, 0x440, 0x430, 0x3b, 0x42, 0x6f, 0x73, 0x61, 0x6e, 0x73, 0x6b, 0x6f, 0x2d, 0x68, 0x65,
-0x72, 0x63, 0x65, 0x67, 0x6f, 0x76, 0x61, 0x10d, 0x6b, 0x61, 0x20, 0x6b, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x74, 0x69, 0x62,
-0x69, 0x6c, 0x6e, 0x61, 0x20, 0x6d, 0x61, 0x72, 0x6b, 0x61, 0x3b, 0x3b, 0x62, 0x6f, 0x73, 0x61, 0x6e, 0x73, 0x6b, 0x6f,
-0x2d, 0x68, 0x65, 0x72, 0x63, 0x65, 0x67, 0x6f, 0x76, 0x61, 0x10d, 0x6b, 0x61, 0x20, 0x6b, 0x6f, 0x6e, 0x76, 0x65, 0x72,
-0x74, 0x69, 0x62, 0x69, 0x6c, 0x6e, 0x61, 0x20, 0x6d, 0x61, 0x72, 0x6b, 0x61, 0x3b, 0x3b, 0x62, 0x6f, 0x73, 0x61, 0x6e,
-0x73, 0x6b, 0x6f, 0x2d, 0x68, 0x65, 0x72, 0x63, 0x65, 0x67, 0x6f, 0x76, 0x61, 0x10d, 0x6b, 0x65, 0x20, 0x6b, 0x6f, 0x6e,
-0x76, 0x65, 0x72, 0x74, 0x69, 0x62, 0x69, 0x6c, 0x6e, 0x65, 0x20, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x3b, 0x3b, 0x62, 0x6f,
-0x73, 0x61, 0x6e, 0x73, 0x6b, 0x6f, 0x2d, 0x68, 0x65, 0x72, 0x63, 0x65, 0x67, 0x6f, 0x76, 0x61, 0x10d, 0x6b, 0x69, 0x68,
-0x20, 0x6b, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x74, 0x69, 0x62, 0x69, 0x6c, 0x6e, 0x69, 0x68, 0x20, 0x6d, 0x61, 0x72, 0x61,
-0x6b, 0x61, 0x3b, 0x45, 0x76, 0x72, 0x6f, 0x3b, 0x3b, 0x65, 0x76, 0x72, 0x6f, 0x3b, 0x3b, 0x65, 0x76, 0x72, 0x61, 0x3b,
-0x3b, 0x65, 0x76, 0x72, 0x61, 0x3b, 0x53, 0x72, 0x70, 0x73, 0x6b, 0x69, 0x20, 0x64, 0x69, 0x6e, 0x61, 0x72, 0x3b, 0x3b,
-0x73, 0x72, 0x70, 0x73, 0x6b, 0x69, 0x20, 0x64, 0x69, 0x6e, 0x61, 0x72, 0x3b, 0x3b, 0x73, 0x72, 0x70, 0x73, 0x6b, 0x61,
-0x20, 0x64, 0x69, 0x6e, 0x61, 0x72, 0x61, 0x3b, 0x3b, 0x73, 0x72, 0x70, 0x73, 0x6b, 0x69, 0x68, 0x20, 0x64, 0x69, 0x6e,
-0x61, 0x72, 0x61, 0x3b, 0x411, 0x43e, 0x441, 0x430, 0x43d, 0x441, 0x43a, 0x43e, 0x2d, 0x445, 0x435, 0x440, 0x446, 0x435, 0x433, 0x43e,
-0x432, 0x430, 0x447, 0x43a, 0x430, 0x20, 0x43a, 0x43e, 0x43d, 0x432, 0x435, 0x440, 0x442, 0x438, 0x431, 0x438, 0x43b, 0x43d, 0x430, 0x20,
-0x43c, 0x430, 0x440, 0x43a, 0x430, 0x3b, 0x3b, 0x431, 0x43e, 0x441, 0x430, 0x43d, 0x441, 0x43a, 0x43e, 0x2d, 0x445, 0x435, 0x440, 0x446,
-0x435, 0x433, 0x43e, 0x432, 0x430, 0x447, 0x43a, 0x430, 0x20, 0x43a, 0x43e, 0x43d, 0x432, 0x435, 0x440, 0x442, 0x438, 0x431, 0x438, 0x43b,
-0x43d, 0x430, 0x20, 0x43c, 0x430, 0x440, 0x43a, 0x430, 0x3b, 0x3b, 0x431, 0x43e, 0x441, 0x430, 0x43d, 0x441, 0x43a, 0x43e, 0x2d, 0x445,
-0x435, 0x440, 0x446, 0x435, 0x433, 0x43e, 0x432, 0x430, 0x447, 0x43a, 0x435, 0x20, 0x43a, 0x43e, 0x43d, 0x432, 0x435, 0x440, 0x442, 0x438,
-0x431, 0x438, 0x43b, 0x43d, 0x435, 0x20, 0x43c, 0x430, 0x440, 0x43a, 0x65, 0x3b, 0x3b, 0x431, 0x43e, 0x441, 0x430, 0x43d, 0x441, 0x43a,
-0x43e, 0x2d, 0x445, 0x435, 0x440, 0x446, 0x435, 0x433, 0x43e, 0x432, 0x430, 0x447, 0x43a, 0x438, 0x445, 0x20, 0x43a, 0x43e, 0x43d, 0x432,
-0x435, 0x440, 0x442, 0x438, 0x431, 0x438, 0x43b, 0x43d, 0x438, 0x445, 0x20, 0x43c, 0x430, 0x440, 0x430, 0x43a, 0x430, 0x3b, 0x415, 0x432,
-0x440, 0x43e, 0x3b, 0x3b, 0x435, 0x432, 0x440, 0x43e, 0x3b, 0x3b, 0x435, 0x432, 0x440, 0x430, 0x3b, 0x3b, 0x435, 0x432, 0x440, 0x430,
-0x3b, 0x41b, 0x430, 0x440, 0x3b, 0x3b, 0x43b, 0x430, 0x440, 0x3b, 0x3b, 0x3b, 0x3b, 0x43b, 0x430, 0x440, 0x44b, 0x3b, 0x421, 0x43e,
-0x43c, 0x3b, 0x3b, 0x441, 0x43e, 0x43c, 0x3b, 0x3b, 0x3b, 0x3b, 0x441, 0x43e, 0x43c, 0x44b, 0x3b, 0x44, 0x6f, 0x72, 0x61, 0x20,
-0x72, 0x65, 0x20, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x6b, 0x61, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x67e, 0x627, 0x6aa,
-0x633, 0x62a, 0x627, 0x646, 0x64a, 0x20, 0x631, 0x67e, 0x64a, 0x3b, 0x3b, 0x67e, 0x627, 0x6aa, 0x633, 0x62a, 0x627, 0x646, 0x64a, 0x20,
-0x631, 0x67e, 0x64a, 0x3b, 0x3b, 0x3b, 0x3b, 0x67e, 0x627, 0x6aa, 0x633, 0x62a, 0x627, 0x646, 0x64a, 0x20, 0x631, 0x67e, 0x64a, 0x3b,
-0xdc1, 0xdca, 0x200d, 0xdbb, 0xdd3, 0x20, 0xdbd, 0xd82, 0xd9a, 0xdcf, 0x20, 0xdbb, 0xdd4, 0xdb4, 0xdd2, 0xdba, 0xdbd, 0x3b, 0x3b, 0xdc1,
-0xdca, 0x200d, 0xdbb, 0xdd3, 0x20, 0xdbd, 0xd82, 0xd9a, 0xdcf, 0x20, 0xdbb, 0xdd4, 0xdb4, 0xdd2, 0xdba, 0xdbd, 0x3b, 0x3b, 0x3b, 0x3b,
-0xdc1, 0xdca, 0x200d, 0xdbb, 0xdd3, 0x20, 0xdbd, 0xd82, 0xd9a, 0xdcf, 0x20, 0xdbb, 0xdd4, 0xdb4, 0xdd2, 0xdba, 0xdbd, 0x3b, 0x65, 0x75,
-0x72, 0x6f, 0x3b, 0x3b, 0x65, 0x75, 0x72, 0x6f, 0x3b, 0x3b, 0x65, 0x75, 0x72, 0xe1, 0x3b, 0x65, 0x75, 0x72, 0x61, 0x3b,
-0x65, 0x75, 0x72, 0x3b, 0x65, 0x76, 0x72, 0x6f, 0x3b, 0x3b, 0x65, 0x76, 0x72, 0x6f, 0x3b, 0x65, 0x76, 0x72, 0x61, 0x3b,
-0x65, 0x76, 0x72, 0x69, 0x3b, 0x3b, 0x65, 0x76, 0x72, 0x6f, 0x76, 0x3b, 0x53, 0x68, 0x69, 0x6c, 0x69, 0x6e, 0x67, 0x6b,
-0x61, 0x20, 0x53, 0x6f, 0x6f, 0x6d, 0x61, 0x61, 0x6c, 0x69, 0x79, 0x61, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x46,
-0x61, 0x72, 0x61, 0x6e, 0x20, 0x4a, 0x61, 0x62, 0x75, 0x75, 0x74, 0x69, 0x3b, 0x3b, 0x66, 0x61, 0x72, 0x61, 0x6e, 0x6b,
-0x61, 0x20, 0x4a, 0x61, 0x62, 0x75, 0x75, 0x74, 0x69, 0x3b, 0x3b, 0x3b, 0x3b, 0x66, 0x61, 0x72, 0x61, 0x6e, 0x6b, 0x61,
-0x20, 0x4a, 0x61, 0x62, 0x75, 0x75, 0x74, 0x69, 0x3b, 0x42, 0x69, 0x72, 0x74, 0x61, 0x20, 0x49, 0x74, 0x6f, 0x6f, 0x62,
-0x62, 0x69, 0x79, 0x61, 0x3b, 0x3b, 0x62, 0x69, 0x72, 0x74, 0x61, 0x20, 0x49, 0x74, 0x6f, 0x6f, 0x62, 0x62, 0x69, 0x79,
-0x61, 0x3b, 0x3b, 0x3b, 0x3b, 0x62, 0x69, 0x72, 0x74, 0x61, 0x20, 0x49, 0x74, 0x6f, 0x6f, 0x62, 0x62, 0x69, 0x79, 0x61,
-0x3b, 0x53, 0x68, 0x69, 0x6c, 0x69, 0x6e, 0x67, 0x6b, 0x61, 0x20, 0x4b, 0x65, 0x6e, 0x79, 0x61, 0x3b, 0x3b, 0x73, 0x68,
-0x69, 0x6c, 0x69, 0x6e, 0x67, 0x6b, 0x61, 0x20, 0x4b, 0x65, 0x6e, 0x79, 0x61, 0x3b, 0x3b, 0x3b, 0x3b, 0x73, 0x68, 0x69,
-0x6c, 0x69, 0x6e, 0x67, 0x6b, 0x61, 0x20, 0x4b, 0x65, 0x6e, 0x79, 0x61, 0x3b, 0x70, 0x65, 0x73, 0x6f, 0x20, 0x61, 0x72,
-0x67, 0x65, 0x6e, 0x74, 0x69, 0x6e, 0x6f, 0x3b, 0x3b, 0x70, 0x65, 0x73, 0x6f, 0x20, 0x61, 0x72, 0x67, 0x65, 0x6e, 0x74,
-0x69, 0x6e, 0x6f, 0x3b, 0x3b, 0x3b, 0x3b, 0x70, 0x65, 0x73, 0x6f, 0x73, 0x20, 0x61, 0x72, 0x67, 0x65, 0x6e, 0x74, 0x69,
-0x6e, 0x6f, 0x73, 0x3b, 0x64, 0xf3, 0x6c, 0x61, 0x72, 0x20, 0x62, 0x65, 0x6c, 0x69, 0x63, 0x65, 0xf1, 0x6f, 0x3b, 0x3b,
-0x64, 0xf3, 0x6c, 0x61, 0x72, 0x20, 0x62, 0x65, 0x6c, 0x69, 0x63, 0x65, 0xf1, 0x6f, 0x3b, 0x3b, 0x3b, 0x3b, 0x64, 0xf3,
-0x6c, 0x61, 0x72, 0x65, 0x73, 0x20, 0x62, 0x65, 0x6c, 0x69, 0x63, 0x65, 0xf1, 0x6f, 0x73, 0x3b, 0x62, 0x6f, 0x6c, 0x69,
-0x76, 0x69, 0x61, 0x6e, 0x6f, 0x3b, 0x3b, 0x62, 0x6f, 0x6c, 0x69, 0x76, 0x69, 0x61, 0x6e, 0x6f, 0x3b, 0x3b, 0x3b, 0x3b,
-0x62, 0x6f, 0x6c, 0x69, 0x76, 0x69, 0x61, 0x6e, 0x6f, 0x73, 0x3b, 0x72, 0x65, 0x61, 0x6c, 0x20, 0x62, 0x72, 0x61, 0x73,
-0x69, 0x6c, 0x65, 0xf1, 0x6f, 0x3b, 0x3b, 0x72, 0x65, 0x61, 0x6c, 0x20, 0x62, 0x72, 0x61, 0x73, 0x69, 0x6c, 0x65, 0xf1,
-0x6f, 0x3b, 0x3b, 0x3b, 0x3b, 0x72, 0x65, 0x61, 0x6c, 0x65, 0x73, 0x20, 0x62, 0x72, 0x61, 0x73, 0x69, 0x6c, 0x65, 0xf1,
-0x6f, 0x73, 0x3b, 0x50, 0x65, 0x73, 0x6f, 0x20, 0x63, 0x68, 0x69, 0x6c, 0x65, 0x6e, 0x6f, 0x3b, 0x3b, 0x70, 0x65, 0x73,
-0x6f, 0x20, 0x63, 0x68, 0x69, 0x6c, 0x65, 0x6e, 0x6f, 0x3b, 0x3b, 0x3b, 0x3b, 0x70, 0x65, 0x73, 0x6f, 0x73, 0x20, 0x63,
-0x68, 0x69, 0x6c, 0x65, 0x6e, 0x6f, 0x73, 0x3b, 0x70, 0x65, 0x73, 0x6f, 0x20, 0x63, 0x6f, 0x6c, 0x6f, 0x6d, 0x62, 0x69,
-0x61, 0x6e, 0x6f, 0x3b, 0x3b, 0x70, 0x65, 0x73, 0x6f, 0x20, 0x63, 0x6f, 0x6c, 0x6f, 0x6d, 0x62, 0x69, 0x61, 0x6e, 0x6f,
-0x3b, 0x3b, 0x3b, 0x3b, 0x70, 0x65, 0x73, 0x6f, 0x73, 0x20, 0x63, 0x6f, 0x6c, 0x6f, 0x6d, 0x62, 0x69, 0x61, 0x6e, 0x6f,
-0x73, 0x3b, 0x63, 0x6f, 0x6c, 0xf3, 0x6e, 0x20, 0x63, 0x6f, 0x73, 0x74, 0x61, 0x72, 0x72, 0x69, 0x63, 0x65, 0x6e, 0x73,
-0x65, 0x3b, 0x3b, 0x63, 0x6f, 0x6c, 0xf3, 0x6e, 0x20, 0x63, 0x6f, 0x73, 0x74, 0x61, 0x72, 0x72, 0x69, 0x63, 0x65, 0x6e,
-0x73, 0x65, 0x3b, 0x3b, 0x3b, 0x3b, 0x63, 0x6f, 0x6c, 0x6f, 0x6e, 0x65, 0x73, 0x20, 0x63, 0x6f, 0x73, 0x74, 0x61, 0x72,
-0x72, 0x69, 0x63, 0x65, 0x6e, 0x73, 0x65, 0x73, 0x3b, 0x70, 0x65, 0x73, 0x6f, 0x20, 0x63, 0x75, 0x62, 0x61, 0x6e, 0x6f,
-0x3b, 0x3b, 0x70, 0x65, 0x73, 0x6f, 0x20, 0x63, 0x75, 0x62, 0x61, 0x6e, 0x6f, 0x3b, 0x3b, 0x3b, 0x3b, 0x70, 0x65, 0x73,
-0x6f, 0x73, 0x20, 0x63, 0x75, 0x62, 0x61, 0x6e, 0x6f, 0x73, 0x3b, 0x70, 0x65, 0x73, 0x6f, 0x20, 0x64, 0x6f, 0x6d, 0x69,
-0x6e, 0x69, 0x63, 0x61, 0x6e, 0x6f, 0x3b, 0x3b, 0x70, 0x65, 0x73, 0x6f, 0x20, 0x64, 0x6f, 0x6d, 0x69, 0x6e, 0x69, 0x63,
-0x61, 0x6e, 0x6f, 0x3b, 0x3b, 0x3b, 0x3b, 0x70, 0x65, 0x73, 0x6f, 0x73, 0x20, 0x64, 0x6f, 0x6d, 0x69, 0x6e, 0x69, 0x63,
-0x61, 0x6e, 0x6f, 0x73, 0x3b, 0x64, 0xf3, 0x6c, 0x61, 0x72, 0x20, 0x65, 0x73, 0x74, 0x61, 0x64, 0x6f, 0x75, 0x6e, 0x69,
-0x64, 0x65, 0x6e, 0x73, 0x65, 0x3b, 0x3b, 0x64, 0xf3, 0x6c, 0x61, 0x72, 0x20, 0x65, 0x73, 0x74, 0x61, 0x64, 0x6f, 0x75,
-0x6e, 0x69, 0x64, 0x65, 0x6e, 0x73, 0x65, 0x3b, 0x3b, 0x3b, 0x3b, 0x64, 0xf3, 0x6c, 0x61, 0x72, 0x65, 0x73, 0x20, 0x65,
-0x73, 0x74, 0x61, 0x64, 0x6f, 0x75, 0x6e, 0x69, 0x64, 0x65, 0x6e, 0x73, 0x65, 0x73, 0x3b, 0x66, 0x72, 0x61, 0x6e, 0x63,
-0x6f, 0x20, 0x43, 0x46, 0x41, 0x20, 0x64, 0x65, 0x20, 0xc1, 0x66, 0x72, 0x69, 0x63, 0x61, 0x20, 0x43, 0x65, 0x6e, 0x74,
-0x72, 0x61, 0x6c, 0x3b, 0x3b, 0x66, 0x72, 0x61, 0x6e, 0x63, 0x6f, 0x20, 0x43, 0x46, 0x41, 0x20, 0x64, 0x65, 0x20, 0xc1,
-0x66, 0x72, 0x69, 0x63, 0x61, 0x20, 0x43, 0x65, 0x6e, 0x74, 0x72, 0x61, 0x6c, 0x3b, 0x3b, 0x3b, 0x3b, 0x66, 0x72, 0x61,
-0x6e, 0x63, 0x6f, 0x73, 0x20, 0x43, 0x46, 0x41, 0x20, 0x64, 0x65, 0x20, 0xc1, 0x66, 0x72, 0x69, 0x63, 0x61, 0x20, 0x43,
-0x65, 0x6e, 0x74, 0x72, 0x61, 0x6c, 0x3b, 0x71, 0x75, 0x65, 0x74, 0x7a, 0x61, 0x6c, 0x3b, 0x3b, 0x71, 0x75, 0x65, 0x74,
-0x7a, 0x61, 0x6c, 0x3b, 0x3b, 0x3b, 0x3b, 0x71, 0x75, 0x65, 0x74, 0x7a, 0x61, 0x6c, 0x65, 0x73, 0x3b, 0x6c, 0x65, 0x6d,
-0x70, 0x69, 0x72, 0x61, 0x20, 0x68, 0x6f, 0x6e, 0x64, 0x75, 0x72, 0x65, 0xf1, 0x6f, 0x3b, 0x3b, 0x6c, 0x65, 0x6d, 0x70,
-0x69, 0x72, 0x61, 0x20, 0x68, 0x6f, 0x6e, 0x64, 0x75, 0x72, 0x65, 0xf1, 0x6f, 0x3b, 0x3b, 0x3b, 0x3b, 0x6c, 0x65, 0x6d,
-0x70, 0x69, 0x72, 0x61, 0x73, 0x20, 0x68, 0x6f, 0x6e, 0x64, 0x75, 0x72, 0x65, 0xf1, 0x6f, 0x73, 0x3b, 0x70, 0x65, 0x73,
-0x6f, 0x20, 0x6d, 0x65, 0x78, 0x69, 0x63, 0x61, 0x6e, 0x6f, 0x3b, 0x3b, 0x70, 0x65, 0x73, 0x6f, 0x20, 0x6d, 0x65, 0x78,
-0x69, 0x63, 0x61, 0x6e, 0x6f, 0x3b, 0x3b, 0x3b, 0x3b, 0x70, 0x65, 0x73, 0x6f, 0x73, 0x20, 0x6d, 0x65, 0x78, 0x69, 0x63,
-0x61, 0x6e, 0x6f, 0x73, 0x3b, 0x63, 0xf3, 0x72, 0x64, 0x6f, 0x62, 0x61, 0x20, 0x6e, 0x69, 0x63, 0x61, 0x72, 0x61, 0x67,
-0xfc, 0x65, 0x6e, 0x73, 0x65, 0x3b, 0x3b, 0x63, 0xf3, 0x72, 0x64, 0x6f, 0x62, 0x61, 0x20, 0x6e, 0x69, 0x63, 0x61, 0x72,
-0x61, 0x67, 0xfc, 0x65, 0x6e, 0x73, 0x65, 0x3b, 0x3b, 0x3b, 0x3b, 0x63, 0xf3, 0x72, 0x64, 0x6f, 0x62, 0x61, 0x73, 0x20,
-0x6e, 0x69, 0x63, 0x61, 0x72, 0x61, 0x67, 0xfc, 0x65, 0x6e, 0x73, 0x65, 0x73, 0x3b, 0x62, 0x61, 0x6c, 0x62, 0x6f, 0x61,
-0x20, 0x70, 0x61, 0x6e, 0x61, 0x6d, 0x65, 0xf1, 0x6f, 0x3b, 0x3b, 0x62, 0x61, 0x6c, 0x62, 0x6f, 0x61, 0x20, 0x70, 0x61,
-0x6e, 0x61, 0x6d, 0x65, 0xf1, 0x6f, 0x3b, 0x3b, 0x3b, 0x3b, 0x62, 0x61, 0x6c, 0x62, 0x6f, 0x61, 0x73, 0x20, 0x70, 0x61,
-0x6e, 0x61, 0x6d, 0x65, 0xf1, 0x6f, 0x73, 0x3b, 0x67, 0x75, 0x61, 0x72, 0x61, 0x6e, 0xed, 0x20, 0x70, 0x61, 0x72, 0x61,
-0x67, 0x75, 0x61, 0x79, 0x6f, 0x3b, 0x3b, 0x67, 0x75, 0x61, 0x72, 0x61, 0x6e, 0xed, 0x20, 0x70, 0x61, 0x72, 0x61, 0x67,
-0x75, 0x61, 0x79, 0x6f, 0x3b, 0x3b, 0x3b, 0x3b, 0x67, 0x75, 0x61, 0x72, 0x61, 0x6e, 0xed, 0x65, 0x73, 0x20, 0x70, 0x61,
-0x72, 0x61, 0x67, 0x75, 0x61, 0x79, 0x6f, 0x73, 0x3b, 0x73, 0x6f, 0x6c, 0x20, 0x70, 0x65, 0x72, 0x75, 0x61, 0x6e, 0x6f,
-0x3b, 0x3b, 0x73, 0x6f, 0x6c, 0x20, 0x70, 0x65, 0x72, 0x75, 0x61, 0x6e, 0x6f, 0x3b, 0x3b, 0x3b, 0x3b, 0x73, 0x6f, 0x6c,
-0x65, 0x73, 0x20, 0x70, 0x65, 0x72, 0x75, 0x61, 0x6e, 0x6f, 0x73, 0x3b, 0x70, 0x65, 0x73, 0x6f, 0x20, 0x66, 0x69, 0x6c,
-0x69, 0x70, 0x69, 0x6e, 0x6f, 0x3b, 0x3b, 0x70, 0x65, 0x73, 0x6f, 0x20, 0x66, 0x69, 0x6c, 0x69, 0x70, 0x69, 0x6e, 0x6f,
-0x3b, 0x3b, 0x3b, 0x3b, 0x70, 0x65, 0x73, 0x6f, 0x73, 0x20, 0x66, 0x69, 0x6c, 0x69, 0x70, 0x69, 0x6e, 0x6f, 0x73, 0x3b,
-0x70, 0x65, 0x73, 0x6f, 0x20, 0x75, 0x72, 0x75, 0x67, 0x75, 0x61, 0x79, 0x6f, 0x3b, 0x3b, 0x70, 0x65, 0x73, 0x6f, 0x20,
-0x75, 0x72, 0x75, 0x67, 0x75, 0x61, 0x79, 0x6f, 0x3b, 0x3b, 0x3b, 0x3b, 0x70, 0x65, 0x73, 0x6f, 0x73, 0x20, 0x75, 0x72,
-0x75, 0x67, 0x75, 0x61, 0x79, 0x6f, 0x73, 0x3b, 0x62, 0x6f, 0x6c, 0xed, 0x76, 0x61, 0x72, 0x20, 0x73, 0x6f, 0x62, 0x65,
-0x72, 0x61, 0x6e, 0x6f, 0x3b, 0x3b, 0x62, 0x6f, 0x6c, 0xed, 0x76, 0x61, 0x72, 0x20, 0x73, 0x6f, 0x62, 0x65, 0x72, 0x61,
-0x6e, 0x6f, 0x3b, 0x3b, 0x3b, 0x3b, 0x62, 0x6f, 0x6c, 0xed, 0x76, 0x61, 0x72, 0x65, 0x73, 0x20, 0x73, 0x6f, 0x62, 0x65,
-0x72, 0x61, 0x6e, 0x6f, 0x73, 0x3b, 0x53, 0x68, 0x69, 0x6c, 0x69, 0x6e, 0x67, 0x69, 0x20, 0x79, 0x61, 0x20, 0x54, 0x61,
-0x6e, 0x7a, 0x61, 0x6e, 0x69, 0x61, 0x3b, 0x3b, 0x73, 0x68, 0x69, 0x6c, 0x69, 0x6e, 0x67, 0x69, 0x20, 0x79, 0x61, 0x20,
-0x54, 0x61, 0x6e, 0x7a, 0x61, 0x6e, 0x69, 0x61, 0x3b, 0x3b, 0x3b, 0x3b, 0x73, 0x68, 0x69, 0x6c, 0x69, 0x6e, 0x67, 0x69,
-0x20, 0x7a, 0x61, 0x20, 0x54, 0x61, 0x6e, 0x7a, 0x61, 0x6e, 0x69, 0x61, 0x3b, 0x46, 0x61, 0x72, 0x61, 0x6e, 0x67, 0x61,
-0x20, 0x79, 0x61, 0x20, 0x4b, 0x6f, 0x6e, 0x67, 0x6f, 0x3b, 0x3b, 0x66, 0x61, 0x72, 0x61, 0x6e, 0x67, 0x61, 0x20, 0x79,
-0x61, 0x20, 0x4b, 0x6f, 0x6e, 0x67, 0x6f, 0x3b, 0x3b, 0x3b, 0x3b, 0x66, 0x61, 0x72, 0x61, 0x6e, 0x67, 0x61, 0x20, 0x7a,
-0x61, 0x20, 0x4b, 0x6f, 0x6e, 0x67, 0x6f, 0x3b, 0x53, 0x68, 0x69, 0x6c, 0x69, 0x6e, 0x67, 0x69, 0x20, 0x79, 0x61, 0x20,
-0x4b, 0x65, 0x6e, 0x79, 0x61, 0x3b, 0x3b, 0x73, 0x68, 0x69, 0x6c, 0x69, 0x6e, 0x67, 0x69, 0x20, 0x79, 0x61, 0x20, 0x4b,
-0x65, 0x6e, 0x79, 0x61, 0x3b, 0x3b, 0x3b, 0x3b, 0x73, 0x68, 0x69, 0x6c, 0x69, 0x6e, 0x67, 0x69, 0x20, 0x7a, 0x61, 0x20,
-0x4b, 0x65, 0x6e, 0x79, 0x61, 0x3b, 0x53, 0x68, 0x69, 0x6c, 0x69, 0x6e, 0x67, 0x69, 0x20, 0x79, 0x61, 0x20, 0x55, 0x67,
-0x61, 0x6e, 0x64, 0x61, 0x3b, 0x3b, 0x73, 0x68, 0x69, 0x6c, 0x69, 0x6e, 0x67, 0x69, 0x20, 0x79, 0x61, 0x20, 0x55, 0x67,
-0x61, 0x6e, 0x64, 0x61, 0x3b, 0x3b, 0x3b, 0x3b, 0x73, 0x68, 0x69, 0x6c, 0x69, 0x6e, 0x67, 0x69, 0x20, 0x7a, 0x61, 0x20,
-0x55, 0x67, 0x61, 0x6e, 0x64, 0x61, 0x3b, 0x73, 0x76, 0x65, 0x6e, 0x73, 0x6b, 0x20, 0x6b, 0x72, 0x6f, 0x6e, 0x61, 0x3b,
-0x3b, 0x73, 0x76, 0x65, 0x6e, 0x73, 0x6b, 0x20, 0x6b, 0x72, 0x6f, 0x6e, 0x61, 0x3b, 0x3b, 0x3b, 0x3b, 0x73, 0x76, 0x65,
-0x6e, 0x73, 0x6b, 0x61, 0x20, 0x6b, 0x72, 0x6f, 0x6e, 0x6f, 0x72, 0x3b, 0x421, 0x43e, 0x43c, 0x43e, 0x43d, 0x4e3, 0x3b, 0x3b,
-0x3b, 0x3b, 0x3b, 0x3b, 0x421, 0x43e, 0x43c, 0x43e, 0x43d, 0x4e3, 0x3b, 0xb87, 0xba8, 0xbcd, 0xba4, 0xbbf, 0xbaf, 0x20, 0xbb0, 0xbc2,
-0xbaa, 0xbbe, 0xbaf, 0xbcd, 0x3b, 0x3b, 0xb87, 0xba8, 0xbcd, 0xba4, 0xbbf, 0xbaf, 0x20, 0xbb0, 0xbc2, 0xbaa, 0xbbe, 0xbaf, 0xbcd, 0x3b,
-0x3b, 0x3b, 0x3b, 0xb87, 0xba8, 0xbcd, 0xba4, 0xbbf, 0xbaf, 0x20, 0xbb0, 0xbc2, 0xbaa, 0xbbe, 0xbaf, 0xbcd, 0xb95, 0xbb3, 0xbcd, 0x3b,
-0xbae, 0xbb2, 0xbc7, 0xbb7, 0xbbf, 0xbaf, 0xba9, 0xbcd, 0x20, 0xbb0, 0xbbf, 0xb99, 0xbcd, 0xb95, 0xbbf, 0xb9f, 0xbcd, 0x3b, 0x3b, 0xbae,
-0xbb2, 0xbc7, 0xbb7, 0xbbf, 0xbaf, 0xba9, 0xbcd, 0x20, 0xbb0, 0xbbf, 0xb99, 0xbcd, 0xb95, 0xbbf, 0xb9f, 0xbcd, 0x3b, 0x3b, 0x3b, 0x3b,
-0xbae, 0xbb2, 0xbc7, 0xbb7, 0xbbf, 0xbaf, 0xba9, 0xbcd, 0x20, 0xbb0, 0xbbf, 0xb99, 0xbcd, 0xb95, 0xbbf, 0xb9f, 0xbcd, 0xb95, 0xbb3, 0xbcd,
-0x3b, 0xb9a, 0xbbf, 0xb99, 0xbcd, 0xb95, 0xbaa, 0xbcd, 0xbaa, 0xbc2, 0xbb0, 0xbcd, 0x20, 0xb9f, 0xbbe, 0xbb2, 0xbb0, 0xbcd, 0x3b, 0x3b,
-0xb9a, 0xbbf, 0xb99, 0xbcd, 0xb95, 0xbaa, 0xbcd, 0xbaa, 0xbc2, 0xbb0, 0xbcd, 0x20, 0xb9f, 0xbbe, 0xbb2, 0xbb0, 0xbcd, 0x3b, 0x3b, 0x3b,
-0x3b, 0xb9a, 0xbbf, 0xb99, 0xbcd, 0xb95, 0xbaa, 0xbcd, 0xbaa, 0xbc2, 0xbb0, 0xbcd, 0x20, 0xb9f, 0xbbe, 0xbb2, 0xbb0, 0xbcd, 0xb95, 0xbb3,
-0xbcd, 0x3b, 0xb87, 0xbb2, 0xb99, 0xbcd, 0xb95, 0xbc8, 0x20, 0xbb0, 0xbc2, 0xbaa, 0xbbe, 0xbaf, 0xbcd, 0x3b, 0x3b, 0xb87, 0xbb2, 0xb99,
-0xbcd, 0xb95, 0xbc8, 0x20, 0xbb0, 0xbc2, 0xbaa, 0xbbe, 0xbaf, 0xbcd, 0x3b, 0x3b, 0x3b, 0x3b, 0xb87, 0xbb2, 0xb99, 0xbcd, 0xb95, 0xbc8,
-0x20, 0xbb0, 0xbc2, 0xbaa, 0xbbe, 0xbaf, 0xbcd, 0xb95, 0xbb3, 0xbcd, 0x3b, 0x420, 0x43e, 0x441, 0x441, 0x438, 0x44f, 0x20, 0x441, 0x443,
-0x43c, 0x44b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x441, 0x443, 0x43c, 0x3b, 0xc30, 0xc42, 0xc2a, 0xc3e, 0xc2f, 0xc3f, 0x3b, 0x3b,
-0xc30, 0xc42, 0xc2a, 0xc3e, 0xc2f, 0xc3f, 0x3b, 0x3b, 0x3b, 0x3b, 0xc30, 0xc42, 0xc2a, 0xc3e, 0xc2f, 0xc32, 0xc41, 0x3b, 0xe1a, 0xe32,
-0xe17, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0xe1a, 0xe32, 0xe17, 0xe44, 0xe17, 0xe22, 0x3b, 0xf61, 0xf74, 0xf0b, 0xf68, 0xf53, 0xf0b,
-0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0xf62, 0xf92, 0xfb1, 0xf0b, 0xf42, 0xf62, 0xf0b, 0xf66, 0xf92, 0xf7c, 0xf62, 0xf0b, 0x3b,
-0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x12e8, 0x12a2, 0x1275, 0x12ee, 0x1335, 0x12eb, 0x20, 0x1265, 0x122d, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b,
-0x3b, 0x3b, 0x50, 0x61, 0x2bb, 0x61, 0x6e, 0x67, 0x61, 0x20, 0x66, 0x61, 0x6b, 0x61, 0x74, 0x6f, 0x6e, 0x67, 0x61, 0x3b,
-0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x50, 0x61, 0x2bb, 0x61, 0x6e, 0x67, 0x61, 0x20, 0x66, 0x61, 0x6b, 0x61, 0x74, 0x6f, 0x6e,
-0x67, 0x61, 0x3b, 0x54, 0xfc, 0x72, 0x6b, 0x20, 0x4c, 0x69, 0x72, 0x61, 0x73, 0x131, 0x3b, 0x3b, 0x54, 0xfc, 0x72, 0x6b,
-0x20, 0x6c, 0x69, 0x72, 0x61, 0x73, 0x131, 0x3b, 0x3b, 0x3b, 0x3b, 0x54, 0xfc, 0x72, 0x6b, 0x20, 0x6c, 0x69, 0x72, 0x61,
-0x73, 0x131, 0x3b, 0x54, 0xfc, 0x72, 0x6b, 0x6d, 0x65, 0x6e, 0x20, 0x6d, 0x61, 0x6e, 0x61, 0x64, 0x79, 0x3b, 0x3b, 0x74,
-0xfc, 0x72, 0x6b, 0x6d, 0x65, 0x6e, 0x20, 0x6d, 0x61, 0x6e, 0x61, 0x64, 0x79, 0x3b, 0x3b, 0x3b, 0x3b, 0x74, 0xfc, 0x72,
-0x6b, 0x6d, 0x65, 0x6e, 0x20, 0x6d, 0x61, 0x6e, 0x61, 0x64, 0x79, 0x3b, 0x62c, 0x6c7, 0x6ad, 0x6af, 0x648, 0x20, 0x64a, 0x6c8,
-0x6d5, 0x646, 0x649, 0x3b, 0x3b, 0x62c, 0x6c7, 0x6ad, 0x6af, 0x648, 0x20, 0x64a, 0x6c8, 0x6d5, 0x646, 0x649, 0x3b, 0x3b, 0x3b, 0x3b,
-0x62c, 0x6c7, 0x6ad, 0x6af, 0x648, 0x20, 0x64a, 0x6c8, 0x6d5, 0x646, 0x649, 0x3b, 0x443, 0x43a, 0x440, 0x430, 0x457, 0x43d, 0x441, 0x44c,
-0x43a, 0x430, 0x20, 0x433, 0x440, 0x438, 0x432, 0x43d, 0x44f, 0x3b, 0x3b, 0x433, 0x440, 0x438, 0x432, 0x43d, 0x44f, 0x3b, 0x3b, 0x433,
-0x440, 0x438, 0x432, 0x43d, 0x456, 0x3b, 0x433, 0x440, 0x438, 0x432, 0x435, 0x43d, 0x44c, 0x3b, 0x433, 0x440, 0x438, 0x432, 0x43d, 0x456,
-0x3b, 0x67e, 0x627, 0x6a9, 0x633, 0x62a, 0x627, 0x646, 0x6cc, 0x20, 0x631, 0x648, 0x67e, 0x6cc, 0x6c1, 0x3b, 0x3b, 0x67e, 0x627, 0x6a9,
-0x633, 0x62a, 0x627, 0x646, 0x6cc, 0x20, 0x631, 0x648, 0x67e, 0x6cc, 0x6c1, 0x3b, 0x3b, 0x3b, 0x3b, 0x67e, 0x627, 0x6a9, 0x633, 0x62a,
-0x627, 0x646, 0x6cc, 0x20, 0x631, 0x648, 0x67e, 0x6cc, 0x6c1, 0x3b, 0x628, 0x6be, 0x627, 0x631, 0x62a, 0x6cc, 0x20, 0x631, 0x648, 0x67e,
-0x6cc, 0x6c1, 0x3b, 0x3b, 0x628, 0x6be, 0x627, 0x631, 0x62a, 0x6cc, 0x20, 0x631, 0x648, 0x67e, 0x6cc, 0x6c1, 0x3b, 0x3b, 0x3b, 0x3b,
-0x628, 0x6be, 0x627, 0x631, 0x62a, 0x6cc, 0x20, 0x631, 0x648, 0x67e, 0x6d2, 0x3b, 0x4f, 0x2018, 0x7a, 0x62, 0x65, 0x6b, 0x69, 0x73,
-0x74, 0x6f, 0x6e, 0x20, 0x73, 0x6f, 0x2018, 0x6d, 0x69, 0x3b, 0x3b, 0x4f, 0x2018, 0x7a, 0x62, 0x65, 0x6b, 0x69, 0x73, 0x74,
-0x6f, 0x6e, 0x20, 0x73, 0x6f, 0x2018, 0x6d, 0x69, 0x3b, 0x3b, 0x3b, 0x3b, 0x4f, 0x2018, 0x7a, 0x62, 0x65, 0x6b, 0x69, 0x73,
-0x74, 0x6f, 0x6e, 0x20, 0x73, 0x6f, 0x2018, 0x6d, 0x69, 0x3b, 0x627, 0x641, 0x63a, 0x627, 0x646, 0x6cc, 0x3b, 0x3b, 0x3b, 0x3b,
-0x3b, 0x3b, 0x3b, 0x40e, 0x437, 0x431, 0x435, 0x43a, 0x438, 0x441, 0x442, 0x43e, 0x43d, 0x20, 0x441, 0x45e, 0x43c, 0x3b, 0x3b, 0x40e,
-0x437, 0x431, 0x435, 0x43a, 0x438, 0x441, 0x442, 0x43e, 0x43d, 0x20, 0x441, 0x45e, 0x43c, 0x3b, 0x3b, 0x3b, 0x3b, 0x40e, 0x437, 0x431,
-0x435, 0x43a, 0x438, 0x441, 0x442, 0x43e, 0x43d, 0x20, 0x441, 0x45e, 0x43c, 0x3b, 0x110, 0x1ed3, 0x6e, 0x67, 0x20, 0x56, 0x69, 0x1ec7,
-0x74, 0x20, 0x4e, 0x61, 0x6d, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x110, 0x1ed3, 0x6e, 0x67, 0x20, 0x56, 0x69, 0x1ec7, 0x74,
-0x20, 0x4e, 0x61, 0x6d, 0x3b, 0x50, 0x75, 0x6e, 0x74, 0x20, 0x50, 0x72, 0x79, 0x64, 0x61, 0x69, 0x6e, 0x3b, 0x70, 0x75,
-0x6e, 0x74, 0x20, 0x50, 0x72, 0x79, 0x64, 0x61, 0x69, 0x6e, 0x3b, 0x62, 0x75, 0x6e, 0x74, 0x20, 0x50, 0x72, 0x79, 0x64,
-0x61, 0x69, 0x6e, 0x3b, 0x62, 0x75, 0x6e, 0x74, 0x20, 0x50, 0x72, 0x79, 0x64, 0x61, 0x69, 0x6e, 0x3b, 0x70, 0x75, 0x6e,
-0x74, 0x20, 0x50, 0x72, 0x79, 0x64, 0x61, 0x69, 0x6e, 0x3b, 0x70, 0x68, 0x75, 0x6e, 0x74, 0x20, 0x50, 0x72, 0x79, 0x64,
-0x61, 0x69, 0x6e, 0x3b, 0x70, 0x75, 0x6e, 0x74, 0x20, 0x50, 0x72, 0x79, 0x64, 0x61, 0x69, 0x6e, 0x3b, 0x46, 0x72, 0x61,
-0x6e, 0x63, 0x20, 0x43, 0x46, 0x41, 0x20, 0x62, 0x75, 0x20, 0x41, 0x66, 0x72, 0x69, 0x6b, 0x20, 0x53, 0x6f, 0x77, 0x77,
-0x75, 0x2d, 0x6a, 0x61, 0x6e, 0x74, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x46, 0x72, 0x61, 0x6e, 0x63, 0x20, 0x43, 0x46,
-0x41, 0x20, 0x79, 0x75, 0x20, 0x41, 0x66, 0x72, 0x69, 0x6b, 0x20, 0x53, 0x6f, 0x77, 0x77, 0x75, 0x2d, 0x6a, 0x61, 0x6e,
-0x74, 0x3b, 0x69, 0x52, 0x61, 0x6e, 0x64, 0x69, 0x20, 0x79, 0x61, 0x73, 0x65, 0x4d, 0x7a, 0x61, 0x6e, 0x7a, 0x69, 0x20,
-0x41, 0x66, 0x72, 0x69, 0x6b, 0x61, 0x3b, 0x3b, 0x69, 0x52, 0x61, 0x6e, 0x64, 0x69, 0x20, 0x59, 0x61, 0x73, 0x65, 0x4d,
-0x7a, 0x61, 0x6e, 0x7a, 0x69, 0x20, 0x41, 0x66, 0x72, 0x69, 0x6b, 0x61, 0x3b, 0x3b, 0x3b, 0x3b, 0x69, 0x52, 0x61, 0x6e,
-0x64, 0x69, 0x20, 0x79, 0x61, 0x73, 0x65, 0x4d, 0x7a, 0x61, 0x6e, 0x7a, 0x69, 0x20, 0x41, 0x66, 0x72, 0x69, 0x6b, 0x61,
-0x3b, 0x4e, 0xe1, 0xec, 0x72, 0xe0, 0x20, 0x74, 0x69, 0x20, 0x4f, 0x72, 0xed, 0x6c, 0x1eb9, 0x300, 0x2d, 0xe8, 0x64, 0xe8,
-0x20, 0x4e, 0xe0, 0xec, 0x6a, 0xed, 0x72, 0xed, 0xe0, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x46, 0x61, 0x72, 0x61,
-0x6e, 0x73, 0x69, 0x20, 0x74, 0x69, 0x20, 0x4f, 0x72, 0xed, 0x6c, 0x25b, 0x301, 0xe8, 0x64, 0x65, 0x20, 0x42, 0x49, 0x4b,
-0x45, 0x41, 0x4f, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x69, 0x2d, 0x53, 0x6f, 0x75, 0x74, 0x68, 0x20, 0x41, 0x66,
-0x72, 0x69, 0x63, 0x61, 0x6e, 0x20, 0x52, 0x61, 0x6e, 0x64, 0x3b, 0x3b, 0x69, 0x2d, 0x53, 0x6f, 0x75, 0x74, 0x68, 0x20,
-0x41, 0x66, 0x72, 0x69, 0x63, 0x61, 0x6e, 0x20, 0x52, 0x61, 0x6e, 0x64, 0x3b, 0x3b, 0x3b, 0x3b, 0x69, 0x2d, 0x53, 0x6f,
-0x75, 0x74, 0x68, 0x20, 0x41, 0x66, 0x72, 0x69, 0x63, 0x61, 0x6e, 0x20, 0x52, 0x61, 0x6e, 0x64, 0x3b, 0x42, 0x6f, 0x73,
-0x61, 0x6e, 0x73, 0x6b, 0x6f, 0x68, 0x65, 0x72, 0x63, 0x65, 0x67, 0x6f, 0x76, 0x61, 0x10d, 0x6b, 0x61, 0x20, 0x6b, 0x6f,
-0x6e, 0x76, 0x65, 0x72, 0x74, 0x69, 0x62, 0x69, 0x6c, 0x6e, 0x61, 0x20, 0x6d, 0x61, 0x72, 0x6b, 0x61, 0x3b, 0x3b, 0x62,
-0x6f, 0x73, 0x61, 0x6e, 0x73, 0x6b, 0x6f, 0x68, 0x65, 0x72, 0x63, 0x65, 0x67, 0x6f, 0x76, 0x61, 0x10d, 0x6b, 0x61, 0x20,
-0x6b, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x74, 0x69, 0x62, 0x69, 0x6c, 0x6e, 0x61, 0x20, 0x6d, 0x61, 0x72, 0x6b, 0x61, 0x3b,
-0x3b, 0x62, 0x6f, 0x73, 0x61, 0x6e, 0x73, 0x6b, 0x6f, 0x68, 0x65, 0x72, 0x63, 0x65, 0x67, 0x6f, 0x76, 0x61, 0x10d, 0x6b,
-0x65, 0x20, 0x6b, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x74, 0x69, 0x62, 0x69, 0x6c, 0x6e, 0x65, 0x20, 0x6d, 0x61, 0x72, 0x6b,
-0x65, 0x3b, 0x3b, 0x62, 0x6f, 0x73, 0x61, 0x6e, 0x73, 0x6b, 0x6f, 0x68, 0x65, 0x72, 0x63, 0x65, 0x67, 0x6f, 0x76, 0x61,
-0x10d, 0x6b, 0x69, 0x68, 0x20, 0x6b, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x74, 0x69, 0x62, 0x69, 0x6c, 0x6e, 0x69, 0x68, 0x20,
-0x6d, 0x61, 0x72, 0x61, 0x6b, 0x61, 0x3b, 0x41a, 0x43e, 0x43d, 0x432, 0x435, 0x440, 0x442, 0x438, 0x431, 0x438, 0x43b, 0x43d, 0x430,
-0x20, 0x43c, 0x430, 0x440, 0x43a, 0x430, 0x3b, 0x3b, 0x431, 0x43e, 0x441, 0x430, 0x43d, 0x441, 0x43a, 0x43e, 0x2d, 0x445, 0x435, 0x440,
-0x446, 0x435, 0x433, 0x43e, 0x432, 0x430, 0x447, 0x43a, 0x430, 0x20, 0x43a, 0x43e, 0x43d, 0x432, 0x435, 0x440, 0x442, 0x438, 0x431, 0x438,
-0x43b, 0x43d, 0x430, 0x20, 0x43c, 0x430, 0x440, 0x43a, 0x430, 0x3b, 0x3b, 0x431, 0x43e, 0x441, 0x430, 0x43d, 0x441, 0x43a, 0x43e, 0x2d,
-0x445, 0x435, 0x440, 0x446, 0x435, 0x433, 0x43e, 0x432, 0x430, 0x447, 0x43a, 0x435, 0x20, 0x43a, 0x43e, 0x43d, 0x432, 0x435, 0x440, 0x442,
-0x438, 0x431, 0x438, 0x43b, 0x43d, 0x435, 0x20, 0x43c, 0x430, 0x440, 0x43a, 0x3b, 0x3b, 0x431, 0x43e, 0x441, 0x430, 0x43d, 0x441, 0x43a,
-0x43e, 0x2d, 0x445, 0x435, 0x440, 0x446, 0x435, 0x433, 0x43e, 0x432, 0x430, 0x447, 0x43a, 0x438, 0x445, 0x20, 0x43a, 0x43e, 0x43d, 0x432,
-0x435, 0x440, 0x442, 0x438, 0x431, 0x438, 0x43b, 0x43d, 0x438, 0x445, 0x20, 0x43c, 0x430, 0x440, 0x430, 0x43a, 0x430, 0x3b, 0x47, 0x68,
-0x61, 0x6e, 0x61, 0x20, 0x53, 0x69, 0x64, 0x69, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x49, 0x4e, 0x52, 0x3b, 0x3b,
-0x3b, 0x3b, 0x3b, 0x3b, 0x49, 0x4e, 0x52, 0x3b, 0x4e, 0x61, 0x1ecb, 0x72, 0x61, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b,
-0x53, 0x69, 0x6c, 0x69, 0x6e, 0x67, 0x69, 0x20, 0x79, 0x61, 0x20, 0x4b, 0x65, 0x6e, 0x79, 0x61, 0x3b, 0x3b, 0x3b, 0x3b,
-0x3b, 0x3b, 0x3b, 0x67, 0x68, 0x61, 0x6e, 0x61, 0x20, 0x73, 0x69, 0x256, 0x69, 0x3b, 0x3b, 0x67, 0x68, 0x61, 0x6e, 0x61,
-0x20, 0x73, 0x69, 0x256, 0x69, 0x3b, 0x3b, 0x3b, 0x3b, 0x67, 0x68, 0x61, 0x6e, 0x61, 0x20, 0x73, 0x69, 0x256, 0x69, 0x3b,
-0x263, 0x65, 0x74, 0x6f, 0x256, 0x6f, 0x66, 0x65, 0x20, 0x61, 0x66, 0x72, 0x69, 0x6b, 0x61, 0x67, 0x61, 0x20, 0x43, 0x46,
-0x41, 0x20, 0x66, 0x72, 0x61, 0x6e, 0x63, 0x20, 0x42, 0x43, 0x45, 0x41, 0x4f, 0x3b, 0x3b, 0x263, 0x65, 0x74, 0x6f, 0x256,
-0x6f, 0x66, 0x65, 0x20, 0x61, 0x66, 0x72, 0x69, 0x6b, 0x61, 0x67, 0x61, 0x20, 0x43, 0x46, 0x41, 0x20, 0x66, 0x72, 0x61,
-0x6e, 0x63, 0x20, 0x42, 0x43, 0x45, 0x41, 0x4f, 0x3b, 0x3b, 0x3b, 0x3b, 0x263, 0x65, 0x74, 0x6f, 0x256, 0x6f, 0x66, 0x65,
-0x20, 0x61, 0x66, 0x72, 0x69, 0x6b, 0x61, 0x67, 0x61, 0x20, 0x43, 0x46, 0x41, 0x20, 0x66, 0x72, 0x61, 0x6e, 0x63, 0x20,
-0x42, 0x43, 0x45, 0x41, 0x4f, 0x3b, 0x50, 0x69, 0x73, 0x6f, 0x20, 0x6e, 0x67, 0x20, 0x50, 0x69, 0x6c, 0x69, 0x70, 0x69,
-0x6e, 0x61, 0x73, 0x3b, 0x3b, 0x70, 0x69, 0x73, 0x6f, 0x20, 0x6e, 0x67, 0x20, 0x50, 0x69, 0x6c, 0x69, 0x70, 0x69, 0x6e,
-0x61, 0x73, 0x3b, 0x3b, 0x3b, 0x3b, 0x70, 0x69, 0x73, 0x6f, 0x20, 0x6e, 0x67, 0x20, 0x50, 0x69, 0x6c, 0x69, 0x70, 0x69,
-0x6e, 0x61, 0x73, 0x3b, 0x53, 0x63, 0x68, 0x77, 0x69, 0x69, 0x7a, 0x65, 0x72, 0x20, 0x46, 0x72, 0x61, 0x6e, 0x6b, 0x65,
-0x3b, 0x3b, 0x53, 0x63, 0x68, 0x77, 0x69, 0x69, 0x7a, 0x65, 0x72, 0x20, 0x46, 0x72, 0x61, 0x6e, 0x6b, 0x65, 0x3b, 0x3b,
-0x3b, 0x3b, 0x53, 0x63, 0x68, 0x77, 0x69, 0x69, 0x7a, 0x65, 0x72, 0x20, 0x46, 0x72, 0x61, 0x6e, 0x6b, 0x65, 0x3b, 0x45,
-0x75, 0x72, 0x6f, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x45, 0x75, 0x72, 0x6f, 0x3b, 0x6e, 0x6f, 0x72, 0x67, 0x67, 0x61,
-0x20, 0x6b, 0x72, 0x75, 0x76, 0x64, 0x6e, 0x6f, 0x3b, 0x3b, 0x6e, 0x6f, 0x72, 0x67, 0x67, 0x61, 0x20, 0x6b, 0x72, 0x75,
-0x76, 0x64, 0x6e, 0x6f, 0x3b, 0x6e, 0x6f, 0x72, 0x67, 0x67, 0x61, 0x20, 0x6b, 0x72, 0x75, 0x76, 0x64, 0x6e, 0x6f, 0x3b,
-0x3b, 0x3b, 0x6e, 0x6f, 0x72, 0x67, 0x67, 0x61, 0x20, 0x6b, 0x72, 0x75, 0x76, 0x64, 0x6e, 0x6f, 0x3b, 0x65, 0x75, 0x72,
-0x6f, 0x3b, 0x3b, 0x65, 0x75, 0x72, 0x6f, 0x3b, 0x65, 0x75, 0x72, 0x6f, 0x3b, 0x3b, 0x3b, 0x65, 0x75, 0x72, 0x6f, 0x3b,
-0x72, 0x75, 0x6f, 0x167, 0x167, 0x61, 0x20, 0x6b, 0x72, 0x75, 0x76, 0x64, 0x6e, 0x6f, 0x3b, 0x3b, 0x72, 0x75, 0x6f, 0x167,
-0x167, 0x61, 0x20, 0x6b, 0x72, 0x75, 0x76, 0x64, 0x6e, 0x6f, 0x3b, 0x72, 0x75, 0x6f, 0x167, 0x167, 0x61, 0x20, 0x6b, 0x72,
-0x75, 0x76, 0x64, 0x6e, 0x6f, 0x3b, 0x3b, 0x3b, 0x72, 0x75, 0x6f, 0x167, 0x167, 0x61, 0x20, 0x6b, 0x72, 0x75, 0x76, 0x64,
-0x6e, 0x6f, 0x3b, 0x53, 0x68, 0x69, 0x6c, 0x69, 0x6e, 0x67, 0x69, 0x20, 0x79, 0x61, 0x20, 0x4b, 0x65, 0x6e, 0x79, 0x61,
-0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x4d, 0x62, 0x75, 0x75, 0x257, 0x75, 0x20, 0x53, 0x65, 0x65, 0x66, 0x61, 0x61,
-0x20, 0x42, 0x43, 0x45, 0x41, 0x4f, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x4d, 0x62, 0x75, 0x75, 0x257, 0x69, 0x20,
-0x53, 0x65, 0x65, 0x66, 0x61, 0x61, 0x20, 0x42, 0x45, 0x41, 0x43, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x44, 0x61,
-0x6c, 0x61, 0x73, 0x69, 0x20, 0x47, 0x61, 0x6d, 0x6d, 0x62, 0x69, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x44, 0x6f,
-0x6c, 0x61, 0x61, 0x72, 0x20, 0x4c, 0x69, 0x62, 0x65, 0x72, 0x69, 0x79, 0x61, 0x61, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b,
-0x3b, 0x55, 0x67, 0x69, 0x79, 0x79, 0x61, 0x20, 0x4d, 0x75, 0x72, 0x69, 0x74, 0x61, 0x6e, 0x69, 0x3b, 0x3b, 0x3b, 0x3b,
-0x3b, 0x3b, 0x3b, 0x4e, 0x61, 0x79, 0x72, 0x61, 0x61, 0x20, 0x4e, 0x69, 0x6a, 0x65, 0x72, 0x69, 0x79, 0x61, 0x61, 0x3b,
-0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x4c, 0x65, 0x77, 0x6f, 0x6f, 0x6e, 0x20, 0x53, 0x65, 0x72, 0x61, 0x61, 0x20, 0x4c,
-0x69, 0x79, 0x6f, 0x6e, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x43, 0x69, 0x72, 0x69, 0x6e, 0x67, 0x69, 0x20, 0x79,
-0x61, 0x20, 0x4b, 0x65, 0x6e, 0x79, 0x61, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x4e, 0x6a, 0x69, 0x6c, 0x69, 0x6e,
-0x67, 0x69, 0x20, 0x65, 0x65, 0x6c, 0x20, 0x4b, 0x65, 0x6e, 0x79, 0x61, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x4d,
-0x65, 0x74, 0x69, 0x63, 0x61, 0x6c, 0x20, 0x64, 0x65, 0x20, 0x4d, 0x6f, 0xe7, 0x61, 0x6d, 0x62, 0x69, 0x71, 0x75, 0x65,
-0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x44, 0x6f, 0x6c, 0x61, 0x20, 0x79, 0x61, 0x73, 0x65, 0x20, 0x41, 0x6d, 0x65,
-0x6c, 0x69, 0x6b, 0x61, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x68, 0x65, 0x6c, 0x65, 0x72, 0x69, 0x20, 0x73, 0x61,
-0x20, 0x54, 0x61, 0x6e, 0x7a, 0x61, 0x6e, 0x69, 0x61, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x2d30, 0x2d37, 0x2d54, 0x2d49,
-0x2d4e, 0x20, 0x2d4f, 0x20, 0x2d4d, 0x2d4e, 0x2d56, 0x2d54, 0x2d49, 0x2d31, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x61, 0x64, 0x72,
-0x69, 0x6d, 0x20, 0x6e, 0x20, 0x6c, 0x6d, 0x263, 0x72, 0x69, 0x62, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x41, 0x64,
-0x69, 0x6e, 0x61, 0x72, 0x20, 0x41, 0x7a, 0x7a, 0x61, 0x79, 0x72, 0x69, 0x3b, 0x3b, 0x41, 0x64, 0x69, 0x6e, 0x61, 0x72,
-0x20, 0x6e, 0x20, 0x5a, 0x7a, 0x61, 0x79, 0x65, 0x72, 0x3b, 0x3b, 0x3b, 0x3b, 0x49, 0x64, 0x69, 0x6e, 0x61, 0x72, 0x65,
-0x6e, 0x20, 0x6e, 0x20, 0x5a, 0x7a, 0x61, 0x79, 0x65, 0x72, 0x3b, 0x45, 0x73, 0x68, 0x69, 0x72, 0x69, 0x6e, 0x67, 0x69,
-0x20, 0x79, 0x61, 0x20, 0x55, 0x67, 0x61, 0x6e, 0x64, 0x61, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x53, 0x68, 0x69,
-0x6c, 0x69, 0x6e, 0x67, 0x69, 0x20, 0x79, 0x61, 0x20, 0x48, 0x75, 0x74, 0x61, 0x6e, 0x7a, 0x61, 0x6e, 0x69, 0x61, 0x3b,
-0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x53, 0x68, 0x69, 0x6c, 0x69, 0x6e, 0x67, 0x69, 0x20, 0x79, 0x61, 0x20, 0x54, 0x61,
-0x6e, 0x7a, 0x61, 0x6e, 0x69, 0x61, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x73, 0x65, 0x66, 0x61, 0x20, 0x46, 0x72,
-0x61, 0x14b, 0x20, 0x28, 0x42, 0x43, 0x45, 0x41, 0x4f, 0x29, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x55, 0x53, 0x20,
-0x13a0, 0x13d5, 0x13b3, 0x3b, 0x3b, 0x55, 0x53, 0x20, 0x13a0, 0x13d5, 0x13b3, 0x3b, 0x3b, 0x3b, 0x3b, 0x55, 0x53, 0x20, 0x13a0, 0x13d5,
-0x13b3, 0x3b, 0x72, 0x6f, 0x75, 0x70, 0x69, 0x20, 0x6d, 0x6f, 0x72, 0x69, 0x73, 0x69, 0x65, 0x6e, 0x3b, 0x3b, 0x3b, 0x3b,
-0x3b, 0x3b, 0x3b, 0x53, 0x68, 0x69, 0x6c, 0xed, 0x69, 0x6e, 0x67, 0x69, 0x20, 0x79, 0x61, 0x20, 0x54, 0x61, 0x61, 0x6e,
-0x73, 0x61, 0x6e, 0xed, 0x61, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x53, 0x69, 0x6c, 0x69, 0x6e, 0x67, 0x69, 0x20,
-0x65, 0x79, 0x61, 0x20, 0x59, 0x75, 0x67, 0x61, 0x6e, 0x64, 0x61, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x53, 0x6b,
-0x75, 0x64, 0x75, 0x20, 0x4b, 0x61, 0x62, 0x75, 0x76, 0x65, 0x72, 0x64, 0x69, 0x61, 0x6e, 0x75, 0x3b, 0x3b, 0x3b, 0x3b,
-0x3b, 0x3b, 0x53, 0x6b, 0x75, 0x64, 0x75, 0x20, 0x4b, 0x61, 0x62, 0x75, 0x76, 0x65, 0x72, 0x64, 0x69, 0x61, 0x6e, 0x75,
-0x3b, 0x53, 0x69, 0x6c, 0x69, 0x6e, 0x67, 0x69, 0x74, 0x61, 0x62, 0x20, 0x79, 0x61, 0x20, 0x4b, 0x65, 0x6e, 0x79, 0x61,
-0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x4e, 0x61, 0x6d, 0x69, 0x62, 0x69, 0x61, 0x20, 0x44, 0x6f, 0x6c, 0x6c, 0x61,
-0x72, 0x69, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x45, 0x75, 0x72, 0x6f, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b,
-0x49, 0x72, 0x6f, 0x70, 0x69, 0x79, 0x69, 0x61, 0x6e, 0xed, 0x20, 0x65, 0x20, 0x4b, 0x65, 0x6e, 0x79, 0x61, 0x3b, 0x3b,
-0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x49, 0x72, 0x6f, 0x70, 0x69, 0x79, 0x69, 0x61, 0x6e, 0xed, 0x20, 0x65, 0x20, 0x54, 0x61,
-0x6e, 0x7a, 0x61, 0x6e, 0x69, 0x61, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x53, 0x69, 0x72, 0x69, 0x6e, 0x6a, 0x69,
-0x20, 0x79, 0x61, 0x20, 0x4b, 0x65, 0x6e, 0x79, 0x61, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x73, 0x68, 0x69, 0x6c,
-0x69, 0x6e, 0x67, 0x69, 0x20, 0x79, 0x61, 0x20, 0x54, 0x61, 0x6e, 0x64, 0x68, 0x61, 0x6e, 0x69, 0x61, 0x3b, 0x3b, 0x3b,
-0x3b, 0x3b, 0x3b, 0x3b, 0x41, 0x6e, 0x67, 0x6f, 0x2019, 0x6f, 0x74, 0x6f, 0x6c, 0x20, 0x6c, 0x6f, 0x6b, 0x2019, 0x20, 0x55,
-0x67, 0x61, 0x6e, 0x64, 0x61, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x41, 0x6e, 0x67, 0x6f, 0x2019, 0x6f, 0x74, 0x6f,
-0x6c, 0x20, 0x6c, 0x6f, 0x6b, 0x2019, 0x20, 0x4b, 0x65, 0x6e, 0x79, 0x61, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x43,
-0x46, 0x41, 0x20, 0x46, 0x72, 0x61, 0x14b, 0x20, 0x28, 0x42, 0x43, 0x45, 0x41, 0x4f, 0x29, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b,
-0x3b, 0x3b, 0x53, 0x69, 0x6c, 0x69, 0x6e, 0x67, 0x20, 0x6d, 0x61, 0x72, 0x20, 0x4b, 0x65, 0x6e, 0x79, 0x61, 0x3b, 0x3b,
-0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x44, 0x65, 0x72, 0x68, 0x65, 0x6d, 0x20, 0x55, 0x6d, 0x65, 0x1e5b, 0x1e5b, 0x75, 0x6b, 0x69,
-0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x73, 0x68, 0x69, 0x6c, 0x69, 0x6e, 0x67, 0x69, 0x20, 0x79, 0x61, 0x20, 0x54,
-0x61, 0x6e, 0x7a, 0x61, 0x6e, 0x69, 0x61, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x930, 0x93e, 0x902, 0x3b, 0x3b, 0x3b,
-0x3b, 0x3b, 0x3b, 0x3b, 0x420, 0x43e, 0x441, 0x441, 0x438, 0x439, 0x43d, 0x20, 0x441, 0x43e, 0x43c, 0x3b, 0x3b, 0x420, 0x43e, 0x441,
-0x441, 0x438, 0x439, 0x43d, 0x20, 0x441, 0x43e, 0x43c, 0x3b, 0x3b, 0x3b, 0x3b, 0x420, 0x43e, 0x441, 0x441, 0x438, 0x439, 0x43d, 0x20,
-0x441, 0x43e, 0x44c, 0x43c, 0x430, 0x448, 0x3b, 0x440, 0x461, 0x441, 0x441, 0x456, 0x301, 0x439, 0x441, 0x43a, 0x457, 0x439, 0x20, 0x440,
-0xa64b, 0x301, 0x431, 0x43b, 0x44c, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x440, 0x461, 0x441, 0x441, 0x456, 0x301, 0x439, 0x441, 0x43a,
-0x430, 0x433, 0x461, 0x20, 0x440, 0xa64b, 0x431, 0x43b, 0x467, 0x300, 0x3b, 0x4e, 0x66, 0x61, 0x6c, 0x61, 0x6e, 0x67, 0x61, 0x20,
-0x77, 0x61, 0x20, 0x4b, 0x6f, 0x6e, 0x67, 0x75, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x43, 0x46, 0x41, 0x20, 0x46,
-0xe0, 0x6c, 0xe2, 0x14b, 0x20, 0x42, 0x45, 0x41, 0x43, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x46, 0x72, 0x1ce, 0x14b,
-0x20, 0x43, 0x46, 0x41, 0x20, 0x28, 0x42, 0x45, 0x41, 0x43, 0x29, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x73, 0x65,
-0x65, 0x66, 0x61, 0x20, 0x79, 0x61, 0x74, 0x69, 0x20, 0x42, 0x43, 0x45, 0x41, 0x4f, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b,
-0x3b, 0x46, 0x259, 0x6c, 0xe1, 0x14b, 0x20, 0x43, 0x46, 0x41, 0x20, 0x28, 0x42, 0x45, 0x41, 0x43, 0x29, 0x3b, 0x3b, 0x3b,
-0x3b, 0x3b, 0x3b, 0x3b, 0x66, 0x72, 0xe1, 0x14b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x73, 0x6f, 0x6c, 0x61, 0x69,
-0x20, 0x42, 0x45, 0x41, 0x43, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x46, 0x72, 0x61, 0x14b, 0x20, 0x43, 0x46, 0x41,
-0x20, 0x42, 0x45, 0x41, 0x43, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x410, 0x440, 0x430, 0x441, 0x441, 0x44b, 0x44b, 0x439,
-0x430, 0x20, 0x441, 0x43e, 0x43b, 0x43a, 0x443, 0x43e, 0x431, 0x430, 0x439, 0x430, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x410, 0x440,
-0x430, 0x441, 0x441, 0x44b, 0x44b, 0x439, 0x430, 0x20, 0x441, 0x43e, 0x43b, 0x43a, 0x443, 0x43e, 0x431, 0x430, 0x439, 0x430, 0x3b, 0x49,
-0x68, 0x65, 0x6c, 0x61, 0x20, 0x79, 0x61, 0x20, 0x54, 0x61, 0x6e, 0x73, 0x61, 0x6e, 0x69, 0x79, 0x61, 0x3b, 0x3b, 0x3b,
-0x3b, 0x3b, 0x3b, 0x3b, 0xa55e, 0xa524, 0xa52b, 0xa569, 0x20, 0xa55c, 0xa55e, 0xa54c, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x4c,
-0x61, 0x69, 0x62, 0x68, 0x69, 0x79, 0x61, 0x20, 0x44, 0x61, 0x6c, 0x61, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x46,
-0x25b, 0x6c, 0xe2, 0x14b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x46, 0x72, 0x61, 0x6e, 0x63, 0x20, 0x43, 0x46, 0x41,
-0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x73, 0x68, 0x69, 0x72, 0xe8, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x66,
-0x65, 0x6c, 0xe1, 0x14b, 0x20, 0x43, 0x46, 0x41, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x62f, 0x6cc, 0x646, 0x627, 0x631,
-0x6cc, 0x20, 0x639, 0x6ce, 0x631, 0x627, 0x642, 0x6cc, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x695, 0x6cc, 0x627, 0x6b5, 0x6cc,
-0x20, 0x626, 0x6ce, 0x631, 0x627, 0x646, 0x6cc, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x65, 0x75, 0x72, 0x6f, 0x3b, 0x3b,
-0x65, 0x75, 0x72, 0x6f, 0x3b, 0x65, 0x75, 0x72, 0x6f, 0x3b, 0x65, 0x75, 0x72, 0x6f, 0x3b, 0x3b, 0x65, 0x75, 0x72, 0x6f,
-0x3b, 0x65, 0x75, 0x72, 0x6f, 0x3b, 0x3b, 0x65, 0x75, 0x72, 0x6f, 0x3b, 0x65, 0x75, 0x72, 0x61, 0x6a, 0x3b, 0x65, 0x75,
-0x72, 0x61, 0x3b, 0x3b, 0x65, 0x75, 0x72, 0x6f, 0x77, 0x3b, 0x65, 0x75, 0x72, 0x6f, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b,
-0x3b, 0x627, 0x6cc, 0x631, 0x627, 0x646, 0x20, 0x631, 0x6cc, 0x627, 0x644, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x627, 0x6cc, 0x631,
-0x627, 0x646, 0x20, 0x631, 0x6cc, 0x627, 0x644, 0x3b, 0x6e2f, 0x5e63, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x6e2f, 0x5e63, 0x3b
-};
-
-static const ushort currency_format_data[] = {
-0x25, 0x31, 0x25, 0x32, 0x25, 0x32, 0x25, 0x31, 0x25, 0x32, 0xa0, 0x25, 0x31, 0x25, 0x31, 0xa0, 0x25, 0x32, 0x25, 0x32,
-0x25, 0x31, 0x4b, 0x25, 0x32, 0xa0, 0x2d, 0x25, 0x31, 0x28, 0x25, 0x31, 0xa0, 0x25, 0x32, 0x29, 0x25, 0x32, 0x2d, 0x25,
-0x31, 0x25, 0x32, 0xa0, 0x25, 0x31, 0x4b, 0x25, 0x31, 0xa0, 0x6b, 0x25, 0x32, 0x25, 0x32, 0xa0, 0x25, 0x31, 0x2d, 0x25,
-0x32, 0x2212, 0x25, 0x31, 0x200f, 0x25, 0x31, 0xa0, 0x25, 0x32, 0x200f, 0x200e, 0x2d, 0x25, 0x31, 0xa0, 0x25, 0x32, 0x200e, 0x25,
-0x32, 0x25, 0x31, 0x28, 0x25, 0x32, 0x25, 0x31, 0x29, 0x25, 0x31, 0xa0, 0x4b, 0xa0, 0x25, 0x32, 0x25, 0x32, 0x2d, 0xa0,
-0x25, 0x31
-};
-
-static const ushort endonyms_data[] = {
-0x4f, 0x72, 0x6f, 0x6d, 0x6f, 0x6f, 0x49, 0x74, 0x6f, 0x6f, 0x70, 0x68, 0x69, 0x79, 0x61, 0x61, 0x4b, 0x65, 0x65, 0x6e,
-0x69, 0x79, 0x61, 0x61, 0x41, 0x66, 0x72, 0x69, 0x6b, 0x61, 0x61, 0x6e, 0x73, 0x53, 0x75, 0x69, 0x64, 0x2d, 0x41, 0x66,
-0x72, 0x69, 0x6b, 0x61, 0x4e, 0x61, 0x6d, 0x69, 0x62, 0x69, 0xeb, 0x73, 0x68, 0x71, 0x69, 0x70, 0x53, 0x68, 0x71, 0x69,
-0x70, 0xeb, 0x72, 0x69, 0x4d, 0x61, 0x71, 0x65, 0x64, 0x6f, 0x6e, 0x69, 0x61, 0x20, 0x65, 0x20, 0x56, 0x65, 0x72, 0x69,
-0x75, 0x74, 0x4b, 0x6f, 0x73, 0x6f, 0x76, 0xeb, 0x12a0, 0x121b, 0x122d, 0x129b, 0x12a2, 0x1275, 0x12ee, 0x1335, 0x12eb, 0x627, 0x644, 0x639,
-0x631, 0x628, 0x64a, 0x629, 0x645, 0x635, 0x631, 0x627, 0x644, 0x62c, 0x632, 0x627, 0x626, 0x631, 0x627, 0x644, 0x628, 0x62d, 0x631, 0x64a,
-0x646, 0x62a, 0x634, 0x627, 0x62f, 0x62c, 0x632, 0x631, 0x20, 0x627, 0x644, 0x642, 0x645, 0x631, 0x62c, 0x64a, 0x628, 0x648, 0x62a, 0x64a,
-0x625, 0x631, 0x64a, 0x62a, 0x631, 0x64a, 0x627, 0x627, 0x644, 0x639, 0x631, 0x627, 0x642, 0x625, 0x633, 0x631, 0x627, 0x626, 0x64a, 0x644,
-0x627, 0x644, 0x623, 0x631, 0x62f, 0x646, 0x627, 0x644, 0x643, 0x648, 0x64a, 0x62a, 0x644, 0x628, 0x646, 0x627, 0x646, 0x644, 0x64a, 0x628,
-0x64a, 0x627, 0x645, 0x648, 0x631, 0x64a, 0x62a, 0x627, 0x646, 0x64a, 0x627, 0x627, 0x644, 0x645, 0x63a, 0x631, 0x628, 0x639, 0x64f, 0x645,
-0x627, 0x646, 0x627, 0x644, 0x623, 0x631, 0x627, 0x636, 0x64a, 0x20, 0x627, 0x644, 0x641, 0x644, 0x633, 0x637, 0x64a, 0x646, 0x64a, 0x629,
-0x642, 0x637, 0x631, 0x627, 0x644, 0x645, 0x645, 0x644, 0x643, 0x629, 0x20, 0x627, 0x644, 0x639, 0x631, 0x628, 0x64a, 0x629, 0x20, 0x627,
-0x644, 0x633, 0x639, 0x648, 0x62f, 0x64a, 0x629, 0x627, 0x644, 0x635, 0x648, 0x645, 0x627, 0x644, 0x627, 0x644, 0x633, 0x648, 0x62f, 0x627,
-0x646, 0x633, 0x648, 0x631, 0x64a, 0x627, 0x62a, 0x648, 0x646, 0x633, 0x627, 0x644, 0x625, 0x645, 0x627, 0x631, 0x627, 0x62a, 0x20, 0x627,
-0x644, 0x639, 0x631, 0x628, 0x64a, 0x629, 0x20, 0x627, 0x644, 0x645, 0x62a, 0x62d, 0x62f, 0x629, 0x627, 0x644, 0x635, 0x62d, 0x631, 0x627,
-0x621, 0x20, 0x627, 0x644, 0x63a, 0x631, 0x628, 0x64a, 0x629, 0x627, 0x644, 0x64a, 0x645, 0x646, 0x62c, 0x646, 0x648, 0x628, 0x20, 0x627,
-0x644, 0x633, 0x648, 0x62f, 0x627, 0x646, 0x627, 0x644, 0x639, 0x631, 0x628, 0x64a, 0x629, 0x20, 0x627, 0x644, 0x631, 0x633, 0x645, 0x64a,
-0x629, 0x20, 0x627, 0x644, 0x62d, 0x62f, 0x64a, 0x62b, 0x629, 0x627, 0x644, 0x639, 0x627, 0x644, 0x645, 0x570, 0x561, 0x575, 0x565, 0x580,
-0x565, 0x576, 0x540, 0x561, 0x575, 0x561, 0x57d, 0x57f, 0x561, 0x576, 0x985, 0x9b8, 0x9ae, 0x9c0, 0x9af, 0x9bc, 0x9be, 0x9ad, 0x9be, 0x9f0,
-0x9a4, 0x61, 0x7a, 0x259, 0x72, 0x62, 0x61, 0x79, 0x63, 0x61, 0x6e, 0x41, 0x7a, 0x259, 0x72, 0x62, 0x61, 0x79, 0x63, 0x61,
-0x6e, 0x430, 0x437, 0x4d9, 0x440, 0x431, 0x430, 0x458, 0x4b9, 0x430, 0x43d, 0x410, 0x437, 0x4d9, 0x440, 0x431, 0x430, 0x458, 0x4b9, 0x430,
-0x43d, 0x65, 0x75, 0x73, 0x6b, 0x61, 0x72, 0x61, 0x45, 0x73, 0x70, 0x61, 0x69, 0x6e, 0x69, 0x61, 0x9ac, 0x9be, 0x982, 0x9b2,
-0x9be, 0x9ac, 0x9be, 0x982, 0x9b2, 0x9be, 0x9a6, 0x9c7, 0x9b6, 0x9ad, 0x9be, 0x9b0, 0x9a4, 0xf62, 0xfab, 0xf7c, 0xf44, 0xf0b, 0xf41, 0xf60,
-0xf56, 0xfb2, 0xf74, 0xf42, 0x62, 0x72, 0x65, 0x7a, 0x68, 0x6f, 0x6e, 0x65, 0x67, 0x46, 0x72, 0x61, 0xf1, 0x73, 0x431, 0x44a,
-0x43b, 0x433, 0x430, 0x440, 0x441, 0x43a, 0x438, 0x411, 0x44a, 0x43b, 0x433, 0x430, 0x440, 0x438, 0x44f, 0x1019, 0x103c, 0x1014, 0x103a, 0x1019,
-0x102c, 0x431, 0x435, 0x43b, 0x430, 0x440, 0x443, 0x441, 0x43a, 0x430, 0x44f, 0x411, 0x435, 0x43b, 0x430, 0x440, 0x443, 0x441, 0x44c, 0x1781,
-0x17d2, 0x1798, 0x17c2, 0x179a, 0x1780, 0x1798, 0x17d2, 0x1796, 0x17bb, 0x1787, 0x17b6, 0x63, 0x61, 0x74, 0x61, 0x6c, 0xe0, 0x45, 0x73, 0x70,
-0x61, 0x6e, 0x79, 0x61, 0x41, 0x6e, 0x64, 0x6f, 0x72, 0x72, 0x61, 0x46, 0x72, 0x61, 0x6e, 0xe7, 0x61, 0x49, 0x74, 0xe0,
-0x6c, 0x69, 0x61, 0x7b80, 0x4f53, 0x4e2d, 0x6587, 0x4e2d, 0x56fd, 0x4e2d, 0x56fd, 0x9999, 0x6e2f, 0x7279, 0x522b, 0x884c, 0x653f, 0x533a, 0x4e2d, 0x56fd,
-0x6fb3, 0x95e8, 0x7279, 0x522b, 0x884c, 0x653f, 0x533a, 0x65b0, 0x52a0, 0x5761, 0x7e41, 0x9ad4, 0x4e2d, 0x6587, 0x4e2d, 0x570b, 0x9999, 0x6e2f, 0x7279, 0x5225,
-0x884c, 0x653f, 0x5340, 0x4e2d, 0x570b, 0x6fb3, 0x9580, 0x7279, 0x5225, 0x884c, 0x653f, 0x5340, 0x53f0, 0x7063, 0x68, 0x72, 0x76, 0x61, 0x74, 0x73,
-0x6b, 0x69, 0x48, 0x72, 0x76, 0x61, 0x74, 0x73, 0x6b, 0x61, 0x42, 0x6f, 0x73, 0x6e, 0x61, 0x20, 0x69, 0x20, 0x48, 0x65,
-0x72, 0x63, 0x65, 0x67, 0x6f, 0x76, 0x69, 0x6e, 0x61, 0x10d, 0x65, 0x161, 0x74, 0x69, 0x6e, 0x61, 0x10c, 0x65, 0x73, 0x6b,
-0x6f, 0x64, 0x61, 0x6e, 0x73, 0x6b, 0x44, 0x61, 0x6e, 0x6d, 0x61, 0x72, 0x6b, 0x47, 0x72, 0xf8, 0x6e, 0x6c, 0x61, 0x6e,
-0x64, 0x4e, 0x65, 0x64, 0x65, 0x72, 0x6c, 0x61, 0x6e, 0x64, 0x73, 0x4e, 0x65, 0x64, 0x65, 0x72, 0x6c, 0x61, 0x6e, 0x64,
-0x41, 0x72, 0x75, 0x62, 0x61, 0x42, 0x65, 0x6c, 0x67, 0x69, 0xeb, 0x43, 0x75, 0x72, 0x61, 0xe7, 0x61, 0x6f, 0x53, 0x75,
-0x72, 0x69, 0x6e, 0x61, 0x6d, 0x65, 0x43, 0x61, 0x72, 0x69, 0x62, 0x69, 0x73, 0x63, 0x68, 0x20, 0x4e, 0x65, 0x64, 0x65,
-0x72, 0x6c, 0x61, 0x6e, 0x64, 0x53, 0x69, 0x6e, 0x74, 0x2d, 0x4d, 0x61, 0x61, 0x72, 0x74, 0x65, 0x6e, 0x41, 0x6d, 0x65,
-0x72, 0x69, 0x63, 0x61, 0x6e, 0x20, 0x45, 0x6e, 0x67, 0x6c, 0x69, 0x73, 0x68, 0x55, 0x6e, 0x69, 0x74, 0x65, 0x64, 0x20,
-0x53, 0x74, 0x61, 0x74, 0x65, 0x73, 0x45, 0x6e, 0x67, 0x6c, 0x69, 0x73, 0x68, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61,
-0x6e, 0x20, 0x53, 0x61, 0x6d, 0x6f, 0x61, 0x41, 0x6e, 0x67, 0x75, 0x69, 0x6c, 0x6c, 0x61, 0x41, 0x6e, 0x74, 0x69, 0x67,
-0x75, 0x61, 0x20, 0x26, 0x20, 0x42, 0x61, 0x72, 0x62, 0x75, 0x64, 0x61, 0x41, 0x75, 0x73, 0x74, 0x72, 0x61, 0x6c, 0x69,
-0x61, 0x6e, 0x20, 0x45, 0x6e, 0x67, 0x6c, 0x69, 0x73, 0x68, 0x41, 0x75, 0x73, 0x74, 0x72, 0x61, 0x6c, 0x69, 0x61, 0x41,
-0x75, 0x73, 0x74, 0x72, 0x69, 0x61, 0x42, 0x61, 0x68, 0x61, 0x6d, 0x61, 0x73, 0x42, 0x61, 0x72, 0x62, 0x61, 0x64, 0x6f,
-0x73, 0x42, 0x65, 0x6c, 0x67, 0x69, 0x75, 0x6d, 0x42, 0x65, 0x6c, 0x69, 0x7a, 0x65, 0x42, 0x65, 0x72, 0x6d, 0x75, 0x64,
-0x61, 0x42, 0x6f, 0x74, 0x73, 0x77, 0x61, 0x6e, 0x61, 0x42, 0x72, 0x69, 0x74, 0x69, 0x73, 0x68, 0x20, 0x49, 0x6e, 0x64,
-0x69, 0x61, 0x6e, 0x20, 0x4f, 0x63, 0x65, 0x61, 0x6e, 0x20, 0x54, 0x65, 0x72, 0x72, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x42,
-0x75, 0x72, 0x75, 0x6e, 0x64, 0x69, 0x43, 0x61, 0x6d, 0x65, 0x72, 0x6f, 0x6f, 0x6e, 0x43, 0x61, 0x6e, 0x61, 0x64, 0x69,
-0x61, 0x6e, 0x20, 0x45, 0x6e, 0x67, 0x6c, 0x69, 0x73, 0x68, 0x43, 0x61, 0x6e, 0x61, 0x64, 0x61, 0x43, 0x61, 0x79, 0x6d,
-0x61, 0x6e, 0x20, 0x49, 0x73, 0x6c, 0x61, 0x6e, 0x64, 0x73, 0x43, 0x68, 0x72, 0x69, 0x73, 0x74, 0x6d, 0x61, 0x73, 0x20,
-0x49, 0x73, 0x6c, 0x61, 0x6e, 0x64, 0x43, 0x6f, 0x63, 0x6f, 0x73, 0x20, 0x28, 0x4b, 0x65, 0x65, 0x6c, 0x69, 0x6e, 0x67,
-0x29, 0x20, 0x49, 0x73, 0x6c, 0x61, 0x6e, 0x64, 0x73, 0x43, 0x6f, 0x6f, 0x6b, 0x20, 0x49, 0x73, 0x6c, 0x61, 0x6e, 0x64,
-0x73, 0x43, 0x79, 0x70, 0x72, 0x75, 0x73, 0x44, 0x65, 0x6e, 0x6d, 0x61, 0x72, 0x6b, 0x44, 0x6f, 0x6d, 0x69, 0x6e, 0x69,
-0x63, 0x61, 0x45, 0x72, 0x69, 0x74, 0x72, 0x65, 0x61, 0x46, 0x61, 0x6c, 0x6b, 0x6c, 0x61, 0x6e, 0x64, 0x20, 0x49, 0x73,
-0x6c, 0x61, 0x6e, 0x64, 0x73, 0x46, 0x69, 0x6a, 0x69, 0x46, 0x69, 0x6e, 0x6c, 0x61, 0x6e, 0x64, 0x47, 0x75, 0x65, 0x72,
-0x6e, 0x73, 0x65, 0x79, 0x47, 0x61, 0x6d, 0x62, 0x69, 0x61, 0x47, 0x65, 0x72, 0x6d, 0x61, 0x6e, 0x79, 0x47, 0x68, 0x61,
-0x6e, 0x61, 0x47, 0x69, 0x62, 0x72, 0x61, 0x6c, 0x74, 0x61, 0x72, 0x47, 0x72, 0x65, 0x6e, 0x61, 0x64, 0x61, 0x47, 0x75,
-0x61, 0x6d, 0x47, 0x75, 0x79, 0x61, 0x6e, 0x61, 0x48, 0x6f, 0x6e, 0x67, 0x20, 0x4b, 0x6f, 0x6e, 0x67, 0x20, 0x53, 0x41,
-0x52, 0x20, 0x43, 0x68, 0x69, 0x6e, 0x61, 0x49, 0x6e, 0x64, 0x69, 0x61, 0x49, 0x72, 0x65, 0x6c, 0x61, 0x6e, 0x64, 0x49,
-0x73, 0x72, 0x61, 0x65, 0x6c, 0x4a, 0x61, 0x6d, 0x61, 0x69, 0x63, 0x61, 0x4b, 0x65, 0x6e, 0x79, 0x61, 0x4b, 0x69, 0x72,
-0x69, 0x62, 0x61, 0x74, 0x69, 0x4c, 0x65, 0x73, 0x6f, 0x74, 0x68, 0x6f, 0x4c, 0x69, 0x62, 0x65, 0x72, 0x69, 0x61, 0x4d,
-0x61, 0x63, 0x61, 0x6f, 0x20, 0x53, 0x41, 0x52, 0x20, 0x43, 0x68, 0x69, 0x6e, 0x61, 0x4d, 0x61, 0x64, 0x61, 0x67, 0x61,
-0x73, 0x63, 0x61, 0x72, 0x4d, 0x61, 0x6c, 0x61, 0x77, 0x69, 0x4d, 0x61, 0x6c, 0x61, 0x79, 0x73, 0x69, 0x61, 0x4d, 0x61,
-0x6c, 0x74, 0x61, 0x4d, 0x61, 0x72, 0x73, 0x68, 0x61, 0x6c, 0x6c, 0x20, 0x49, 0x73, 0x6c, 0x61, 0x6e, 0x64, 0x73, 0x4d,
-0x61, 0x75, 0x72, 0x69, 0x74, 0x69, 0x75, 0x73, 0x4d, 0x69, 0x63, 0x72, 0x6f, 0x6e, 0x65, 0x73, 0x69, 0x61, 0x4d, 0x6f,
-0x6e, 0x74, 0x73, 0x65, 0x72, 0x72, 0x61, 0x74, 0x4e, 0x61, 0x6d, 0x69, 0x62, 0x69, 0x61, 0x4e, 0x61, 0x75, 0x72, 0x75,
-0x4e, 0x65, 0x74, 0x68, 0x65, 0x72, 0x6c, 0x61, 0x6e, 0x64, 0x73, 0x4e, 0x65, 0x77, 0x20, 0x5a, 0x65, 0x61, 0x6c, 0x61,
-0x6e, 0x64, 0x4e, 0x69, 0x67, 0x65, 0x72, 0x69, 0x61, 0x4e, 0x69, 0x75, 0x65, 0x4e, 0x6f, 0x72, 0x66, 0x6f, 0x6c, 0x6b,
-0x20, 0x49, 0x73, 0x6c, 0x61, 0x6e, 0x64, 0x4e, 0x6f, 0x72, 0x74, 0x68, 0x65, 0x72, 0x6e, 0x20, 0x4d, 0x61, 0x72, 0x69,
-0x61, 0x6e, 0x61, 0x20, 0x49, 0x73, 0x6c, 0x61, 0x6e, 0x64, 0x73, 0x50, 0x61, 0x6b, 0x69, 0x73, 0x74, 0x61, 0x6e, 0x50,
-0x61, 0x6c, 0x61, 0x75, 0x50, 0x61, 0x70, 0x75, 0x61, 0x20, 0x4e, 0x65, 0x77, 0x20, 0x47, 0x75, 0x69, 0x6e, 0x65, 0x61,
-0x50, 0x68, 0x69, 0x6c, 0x69, 0x70, 0x70, 0x69, 0x6e, 0x65, 0x73, 0x50, 0x69, 0x74, 0x63, 0x61, 0x69, 0x72, 0x6e, 0x20,
-0x49, 0x73, 0x6c, 0x61, 0x6e, 0x64, 0x73, 0x50, 0x75, 0x65, 0x72, 0x74, 0x6f, 0x20, 0x52, 0x69, 0x63, 0x6f, 0x52, 0x77,
-0x61, 0x6e, 0x64, 0x61, 0x53, 0x74, 0x2e, 0x20, 0x4b, 0x69, 0x74, 0x74, 0x73, 0x20, 0x26, 0x20, 0x4e, 0x65, 0x76, 0x69,
-0x73, 0x53, 0x74, 0x2e, 0x20, 0x4c, 0x75, 0x63, 0x69, 0x61, 0x53, 0x74, 0x2e, 0x20, 0x56, 0x69, 0x6e, 0x63, 0x65, 0x6e,
-0x74, 0x20, 0x26, 0x20, 0x47, 0x72, 0x65, 0x6e, 0x61, 0x64, 0x69, 0x6e, 0x65, 0x73, 0x53, 0x61, 0x6d, 0x6f, 0x61, 0x53,
-0x65, 0x79, 0x63, 0x68, 0x65, 0x6c, 0x6c, 0x65, 0x73, 0x53, 0x69, 0x65, 0x72, 0x72, 0x61, 0x20, 0x4c, 0x65, 0x6f, 0x6e,
-0x65, 0x53, 0x69, 0x6e, 0x67, 0x61, 0x70, 0x6f, 0x72, 0x65, 0x53, 0x6c, 0x6f, 0x76, 0x65, 0x6e, 0x69, 0x61, 0x53, 0x6f,
-0x6c, 0x6f, 0x6d, 0x6f, 0x6e, 0x20, 0x49, 0x73, 0x6c, 0x61, 0x6e, 0x64, 0x73, 0x53, 0x6f, 0x75, 0x74, 0x68, 0x20, 0x41,
-0x66, 0x72, 0x69, 0x63, 0x61, 0x53, 0x74, 0x2e, 0x20, 0x48, 0x65, 0x6c, 0x65, 0x6e, 0x61, 0x53, 0x75, 0x64, 0x61, 0x6e,
-0x45, 0x73, 0x77, 0x61, 0x74, 0x69, 0x6e, 0x69, 0x53, 0x77, 0x65, 0x64, 0x65, 0x6e, 0x53, 0x77, 0x69, 0x74, 0x7a, 0x65,
-0x72, 0x6c, 0x61, 0x6e, 0x64, 0x54, 0x61, 0x6e, 0x7a, 0x61, 0x6e, 0x69, 0x61, 0x54, 0x6f, 0x6b, 0x65, 0x6c, 0x61, 0x75,
-0x54, 0x6f, 0x6e, 0x67, 0x61, 0x54, 0x72, 0x69, 0x6e, 0x69, 0x64, 0x61, 0x64, 0x20, 0x26, 0x20, 0x54, 0x6f, 0x62, 0x61,
-0x67, 0x6f, 0x54, 0x75, 0x72, 0x6b, 0x73, 0x20, 0x26, 0x20, 0x43, 0x61, 0x69, 0x63, 0x6f, 0x73, 0x20, 0x49, 0x73, 0x6c,
-0x61, 0x6e, 0x64, 0x73, 0x54, 0x75, 0x76, 0x61, 0x6c, 0x75, 0x55, 0x67, 0x61, 0x6e, 0x64, 0x61, 0x55, 0x6e, 0x69, 0x74,
-0x65, 0x64, 0x20, 0x41, 0x72, 0x61, 0x62, 0x20, 0x45, 0x6d, 0x69, 0x72, 0x61, 0x74, 0x65, 0x73, 0x42, 0x72, 0x69, 0x74,
-0x69, 0x73, 0x68, 0x20, 0x45, 0x6e, 0x67, 0x6c, 0x69, 0x73, 0x68, 0x55, 0x6e, 0x69, 0x74, 0x65, 0x64, 0x20, 0x4b, 0x69,
-0x6e, 0x67, 0x64, 0x6f, 0x6d, 0x55, 0x2e, 0x53, 0x2e, 0x20, 0x4f, 0x75, 0x74, 0x6c, 0x79, 0x69, 0x6e, 0x67, 0x20, 0x49,
-0x73, 0x6c, 0x61, 0x6e, 0x64, 0x73, 0x56, 0x61, 0x6e, 0x75, 0x61, 0x74, 0x75, 0x42, 0x72, 0x69, 0x74, 0x69, 0x73, 0x68,
-0x20, 0x56, 0x69, 0x72, 0x67, 0x69, 0x6e, 0x20, 0x49, 0x73, 0x6c, 0x61, 0x6e, 0x64, 0x73, 0x55, 0x2e, 0x53, 0x2e, 0x20,
-0x56, 0x69, 0x72, 0x67, 0x69, 0x6e, 0x20, 0x49, 0x73, 0x6c, 0x61, 0x6e, 0x64, 0x73, 0x5a, 0x61, 0x6d, 0x62, 0x69, 0x61,
-0x5a, 0x69, 0x6d, 0x62, 0x61, 0x62, 0x77, 0x65, 0x44, 0x69, 0x65, 0x67, 0x6f, 0x20, 0x47, 0x61, 0x72, 0x63, 0x69, 0x61,
-0x49, 0x73, 0x6c, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x4d, 0x61, 0x6e, 0x4a, 0x65, 0x72, 0x73, 0x65, 0x79, 0x53, 0x6f, 0x75,
-0x74, 0x68, 0x20, 0x53, 0x75, 0x64, 0x61, 0x6e, 0x53, 0x69, 0x6e, 0x74, 0x20, 0x4d, 0x61, 0x61, 0x72, 0x74, 0x65, 0x6e,
-0x57, 0x6f, 0x72, 0x6c, 0x64, 0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x65, 0x73, 0x70, 0x65, 0x72, 0x61, 0x6e, 0x74, 0x6f,
-0x4d, 0x6f, 0x6e, 0x64, 0x6f, 0x65, 0x65, 0x73, 0x74, 0x69, 0x45, 0x65, 0x73, 0x74, 0x69, 0x66, 0xf8, 0x72, 0x6f, 0x79,
-0x73, 0x6b, 0x74, 0x46, 0xf8, 0x72, 0x6f, 0x79, 0x61, 0x72, 0x73, 0x75, 0x6f, 0x6d, 0x69, 0x53, 0x75, 0x6f, 0x6d, 0x69,
-0x66, 0x72, 0x61, 0x6e, 0xe7, 0x61, 0x69, 0x73, 0x46, 0x72, 0x61, 0x6e, 0x63, 0x65, 0x41, 0x6c, 0x67, 0xe9, 0x72, 0x69,
-0x65, 0x42, 0x65, 0x6c, 0x67, 0x69, 0x71, 0x75, 0x65, 0x42, 0xe9, 0x6e, 0x69, 0x6e, 0x42, 0x75, 0x72, 0x6b, 0x69, 0x6e,
-0x61, 0x20, 0x46, 0x61, 0x73, 0x6f, 0x43, 0x61, 0x6d, 0x65, 0x72, 0x6f, 0x75, 0x6e, 0x66, 0x72, 0x61, 0x6e, 0xe7, 0x61,
-0x69, 0x73, 0x20, 0x63, 0x61, 0x6e, 0x61, 0x64, 0x69, 0x65, 0x6e, 0x52, 0xe9, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x71, 0x75,
-0x65, 0x20, 0x63, 0x65, 0x6e, 0x74, 0x72, 0x61, 0x66, 0x72, 0x69, 0x63, 0x61, 0x69, 0x6e, 0x65, 0x54, 0x63, 0x68, 0x61,
-0x64, 0x43, 0x6f, 0x6d, 0x6f, 0x72, 0x65, 0x73, 0x43, 0x6f, 0x6e, 0x67, 0x6f, 0x2d, 0x4b, 0x69, 0x6e, 0x73, 0x68, 0x61,
-0x73, 0x61, 0x43, 0x6f, 0x6e, 0x67, 0x6f, 0x2d, 0x42, 0x72, 0x61, 0x7a, 0x7a, 0x61, 0x76, 0x69, 0x6c, 0x6c, 0x65, 0x43,
-0xf4, 0x74, 0x65, 0x20, 0x64, 0x2019, 0x49, 0x76, 0x6f, 0x69, 0x72, 0x65, 0x44, 0x6a, 0x69, 0x62, 0x6f, 0x75, 0x74, 0x69,
-0x47, 0x75, 0x69, 0x6e, 0xe9, 0x65, 0x20, 0xe9, 0x71, 0x75, 0x61, 0x74, 0x6f, 0x72, 0x69, 0x61, 0x6c, 0x65, 0x47, 0x75,
-0x79, 0x61, 0x6e, 0x65, 0x20, 0x66, 0x72, 0x61, 0x6e, 0xe7, 0x61, 0x69, 0x73, 0x65, 0x50, 0x6f, 0x6c, 0x79, 0x6e, 0xe9,
-0x73, 0x69, 0x65, 0x20, 0x66, 0x72, 0x61, 0x6e, 0xe7, 0x61, 0x69, 0x73, 0x65, 0x47, 0x61, 0x62, 0x6f, 0x6e, 0x47, 0x75,
-0x61, 0x64, 0x65, 0x6c, 0x6f, 0x75, 0x70, 0x65, 0x47, 0x75, 0x69, 0x6e, 0xe9, 0x65, 0x48, 0x61, 0xef, 0x74, 0x69, 0x4c,
-0x75, 0x78, 0x65, 0x6d, 0x62, 0x6f, 0x75, 0x72, 0x67, 0x4d, 0x61, 0x6c, 0x69, 0x4d, 0x61, 0x72, 0x74, 0x69, 0x6e, 0x69,
-0x71, 0x75, 0x65, 0x4d, 0x61, 0x75, 0x72, 0x69, 0x74, 0x61, 0x6e, 0x69, 0x65, 0x4d, 0x61, 0x75, 0x72, 0x69, 0x63, 0x65,
-0x4d, 0x61, 0x79, 0x6f, 0x74, 0x74, 0x65, 0x4d, 0x6f, 0x6e, 0x61, 0x63, 0x6f, 0x4d, 0x61, 0x72, 0x6f, 0x63, 0x4e, 0x6f,
-0x75, 0x76, 0x65, 0x6c, 0x6c, 0x65, 0x2d, 0x43, 0x61, 0x6c, 0xe9, 0x64, 0x6f, 0x6e, 0x69, 0x65, 0x4e, 0x69, 0x67, 0x65,
-0x72, 0x4c, 0x61, 0x20, 0x52, 0xe9, 0x75, 0x6e, 0x69, 0x6f, 0x6e, 0x53, 0xe9, 0x6e, 0xe9, 0x67, 0x61, 0x6c, 0x53, 0x61,
-0x69, 0x6e, 0x74, 0x2d, 0x50, 0x69, 0x65, 0x72, 0x72, 0x65, 0x2d, 0x65, 0x74, 0x2d, 0x4d, 0x69, 0x71, 0x75, 0x65, 0x6c,
-0x6f, 0x6e, 0x66, 0x72, 0x61, 0x6e, 0xe7, 0x61, 0x69, 0x73, 0x20, 0x73, 0x75, 0x69, 0x73, 0x73, 0x65, 0x53, 0x75, 0x69,
-0x73, 0x73, 0x65, 0x53, 0x79, 0x72, 0x69, 0x65, 0x54, 0x6f, 0x67, 0x6f, 0x54, 0x75, 0x6e, 0x69, 0x73, 0x69, 0x65, 0x57,
-0x61, 0x6c, 0x6c, 0x69, 0x73, 0x2d, 0x65, 0x74, 0x2d, 0x46, 0x75, 0x74, 0x75, 0x6e, 0x61, 0x53, 0x61, 0x69, 0x6e, 0x74,
-0x2d, 0x42, 0x61, 0x72, 0x74, 0x68, 0xe9, 0x6c, 0x65, 0x6d, 0x79, 0x53, 0x61, 0x69, 0x6e, 0x74, 0x2d, 0x4d, 0x61, 0x72,
-0x74, 0x69, 0x6e, 0x46, 0x72, 0x79, 0x73, 0x6b, 0x4e, 0x65, 0x64, 0x65, 0x72, 0x6c, 0xe2, 0x6e, 0x47, 0xe0, 0x69, 0x64,
-0x68, 0x6c, 0x69, 0x67, 0x41, 0x6e, 0x20, 0x52, 0xec, 0x6f, 0x67, 0x68, 0x61, 0x63, 0x68, 0x64, 0x20, 0x41, 0x6f, 0x6e,
-0x61, 0x69, 0x63, 0x68, 0x74, 0x65, 0x67, 0x61, 0x6c, 0x65, 0x67, 0x6f, 0x45, 0x73, 0x70, 0x61, 0xf1, 0x61, 0x10e5, 0x10d0,
-0x10e0, 0x10d7, 0x10e3, 0x10da, 0x10d8, 0x10e1, 0x10d0, 0x10e5, 0x10d0, 0x10e0, 0x10d7, 0x10d5, 0x10d4, 0x10da, 0x10dd, 0x44, 0x65, 0x75, 0x74, 0x73,
-0x63, 0x68, 0x44, 0x65, 0x75, 0x74, 0x73, 0x63, 0x68, 0x6c, 0x61, 0x6e, 0x64, 0xd6, 0x73, 0x74, 0x65, 0x72, 0x72, 0x65,
-0x69, 0x63, 0x68, 0x69, 0x73, 0x63, 0x68, 0x65, 0x73, 0x20, 0x44, 0x65, 0x75, 0x74, 0x73, 0x63, 0x68, 0xd6, 0x73, 0x74,
-0x65, 0x72, 0x72, 0x65, 0x69, 0x63, 0x68, 0x42, 0x65, 0x6c, 0x67, 0x69, 0x65, 0x6e, 0x49, 0x74, 0x61, 0x6c, 0x69, 0x65,
-0x6e, 0x4c, 0x69, 0x65, 0x63, 0x68, 0x74, 0x65, 0x6e, 0x73, 0x74, 0x65, 0x69, 0x6e, 0x4c, 0x75, 0x78, 0x65, 0x6d, 0x62,
-0x75, 0x72, 0x67, 0x53, 0x63, 0x68, 0x77, 0x65, 0x69, 0x7a, 0x65, 0x72, 0x20, 0x48, 0x6f, 0x63, 0x68, 0x64, 0x65, 0x75,
-0x74, 0x73, 0x63, 0x68, 0x53, 0x63, 0x68, 0x77, 0x65, 0x69, 0x7a, 0x395, 0x3bb, 0x3bb, 0x3b7, 0x3bd, 0x3b9, 0x3ba, 0x3ac, 0x395,
-0x3bb, 0x3bb, 0x3ac, 0x3b4, 0x3b1, 0x39a, 0x3cd, 0x3c0, 0x3c1, 0x3bf, 0x3c2, 0x6b, 0x61, 0x6c, 0x61, 0x61, 0x6c, 0x6c, 0x69, 0x73,
-0x75, 0x74, 0x4b, 0x61, 0x6c, 0x61, 0x61, 0x6c, 0x6c, 0x69, 0x74, 0x20, 0x4e, 0x75, 0x6e, 0x61, 0x61, 0x74, 0xa97, 0xac1,
-0xa9c, 0xab0, 0xabe, 0xaa4, 0xac0, 0xaad, 0xabe, 0xab0, 0xaa4, 0x48, 0x61, 0x75, 0x73, 0x61, 0x4e, 0x61, 0x6a, 0x65, 0x72, 0x69,
-0x79, 0x61, 0x47, 0x61, 0x6e, 0x61, 0x4e, 0x69, 0x6a, 0x61, 0x72, 0x5e2, 0x5d1, 0x5e8, 0x5d9, 0x5ea, 0x5d9, 0x5e9, 0x5e8, 0x5d0,
-0x5dc, 0x939, 0x93f, 0x928, 0x94d, 0x926, 0x940, 0x92d, 0x93e, 0x930, 0x924, 0x6d, 0x61, 0x67, 0x79, 0x61, 0x72, 0x4d, 0x61, 0x67,
-0x79, 0x61, 0x72, 0x6f, 0x72, 0x73, 0x7a, 0xe1, 0x67, 0xed, 0x73, 0x6c, 0x65, 0x6e, 0x73, 0x6b, 0x61, 0xcd, 0x73, 0x6c,
-0x61, 0x6e, 0x64, 0x49, 0x6e, 0x64, 0x6f, 0x6e, 0x65, 0x73, 0x69, 0x61, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6c, 0x69, 0x6e,
-0x67, 0x75, 0x61, 0x4d, 0x75, 0x6e, 0x64, 0x6f, 0x47, 0x61, 0x65, 0x69, 0x6c, 0x67, 0x65, 0xc9, 0x69, 0x72, 0x65, 0x69,
-0x74, 0x61, 0x6c, 0x69, 0x61, 0x6e, 0x6f, 0x49, 0x74, 0x61, 0x6c, 0x69, 0x61, 0x53, 0x61, 0x6e, 0x20, 0x4d, 0x61, 0x72,
-0x69, 0x6e, 0x6f, 0x53, 0x76, 0x69, 0x7a, 0x7a, 0x65, 0x72, 0x61, 0x43, 0x69, 0x74, 0x74, 0xe0, 0x20, 0x64, 0x65, 0x6c,
-0x20, 0x56, 0x61, 0x74, 0x69, 0x63, 0x61, 0x6e, 0x6f, 0x65e5, 0x672c, 0x8a9e, 0x65e5, 0x672c, 0x4a, 0x61, 0x77, 0x61, 0x49, 0x6e,
-0x64, 0x6f, 0x6e, 0xe9, 0x73, 0x69, 0x61, 0xc95, 0xca8, 0xccd, 0xca8, 0xca1, 0xcad, 0xcbe, 0xcb0, 0xca4, 0x6a9, 0x672, 0x634, 0x64f,
-0x631, 0x6c1, 0x650, 0x646, 0x62f, 0x648, 0x633, 0x62a, 0x627, 0x646, 0x49b, 0x430, 0x437, 0x430, 0x49b, 0x20, 0x442, 0x456, 0x43b, 0x456,
-0x49a, 0x430, 0x437, 0x430, 0x49b, 0x441, 0x442, 0x430, 0x43d, 0x4b, 0x69, 0x6e, 0x79, 0x61, 0x72, 0x77, 0x61, 0x6e, 0x64, 0x61,
-0x55, 0x20, 0x52, 0x77, 0x61, 0x6e, 0x64, 0x61, 0x43a, 0x44b, 0x440, 0x433, 0x44b, 0x437, 0x447, 0x430, 0x41a, 0x44b, 0x440, 0x433,
-0x44b, 0x437, 0x441, 0x442, 0x430, 0x43d, 0xd55c, 0xad6d, 0xc5b4, 0xb300, 0xd55c, 0xbbfc, 0xad6d, 0xc870, 0xc120, 0xbbfc, 0xc8fc, 0xc8fc, 0xc758, 0xc778,
-0xbbfc, 0xacf5, 0xd654, 0xad6d, 0x6b, 0x75, 0x72, 0x64, 0xee, 0x54, 0x69, 0x72, 0x6b, 0x69, 0x79, 0x65, 0x49, 0x6b, 0x69, 0x72,
-0x75, 0x6e, 0x64, 0x69, 0x55, 0x62, 0x75, 0x72, 0x75, 0x6e, 0x64, 0x69, 0xea5, 0xeb2, 0xea7, 0x6c, 0x61, 0x74, 0x76, 0x69,
-0x65, 0x161, 0x75, 0x4c, 0x61, 0x74, 0x76, 0x69, 0x6a, 0x61, 0x6c, 0x69, 0x6e, 0x67, 0xe1, 0x6c, 0x61, 0x52, 0x65, 0x70,
-0x75, 0x62, 0x6c, 0xed, 0x6b, 0x69, 0x20, 0x79, 0x61, 0x20, 0x4b, 0x6f, 0x6e, 0x67, 0xf3, 0x20, 0x44, 0x65, 0x6d, 0x6f,
-0x6b, 0x72, 0x61, 0x74, 0xed, 0x6b, 0x69, 0x41, 0x6e, 0x67, 0xf3, 0x6c, 0x61, 0x52, 0x65, 0x70, 0x69, 0x62, 0x69, 0x6b,
-0x69, 0x20, 0x79, 0x61, 0x20, 0x41, 0x66, 0x72, 0xed, 0x6b, 0x61, 0x20, 0x79, 0x61, 0x20, 0x4b, 0xe1, 0x74, 0x69, 0x4b,
-0x6f, 0x6e, 0x67, 0x6f, 0x6c, 0x69, 0x65, 0x74, 0x75, 0x76, 0x69, 0x173, 0x4c, 0x69, 0x65, 0x74, 0x75, 0x76, 0x61, 0x43c,
-0x430, 0x43a, 0x435, 0x434, 0x43e, 0x43d, 0x441, 0x43a, 0x438, 0x421, 0x435, 0x432, 0x435, 0x440, 0x43d, 0x430, 0x20, 0x41c, 0x430, 0x43a,
-0x435, 0x434, 0x43e, 0x43d, 0x438, 0x458, 0x430, 0x4d, 0x61, 0x6c, 0x61, 0x67, 0x61, 0x73, 0x79, 0x4d, 0x61, 0x64, 0x61, 0x67,
-0x61, 0x73, 0x69, 0x6b, 0x61, 0x72, 0x61, 0x4d, 0x65, 0x6c, 0x61, 0x79, 0x75, 0x42, 0x72, 0x75, 0x6e, 0x65, 0x69, 0x53,
-0x69, 0x6e, 0x67, 0x61, 0x70, 0x75, 0x72, 0x61, 0xd2e, 0xd32, 0xd2f, 0xd3e, 0xd33, 0xd02, 0xd07, 0xd28, 0xd4d, 0xd24, 0xd4d, 0xd2f,
-0x4d, 0x61, 0x6c, 0x74, 0x69, 0x4d, 0x101, 0x6f, 0x72, 0x69, 0x41, 0x6f, 0x74, 0x65, 0x61, 0x72, 0x6f, 0x61, 0x92e, 0x930,
-0x93e, 0x920, 0x940, 0x43c, 0x43e, 0x43d, 0x433, 0x43e, 0x43b, 0x41c, 0x43e, 0x43d, 0x433, 0x43e, 0x43b, 0x928, 0x947, 0x92a, 0x93e, 0x932,
-0x940, 0x928, 0x947, 0x92a, 0x93e, 0x932, 0x6e, 0x6f, 0x72, 0x73, 0x6b, 0x20, 0x62, 0x6f, 0x6b, 0x6d, 0xe5, 0x6c, 0x4e, 0x6f,
-0x72, 0x67, 0x65, 0x53, 0x76, 0x61, 0x6c, 0x62, 0x61, 0x72, 0x64, 0x20, 0x6f, 0x67, 0x20, 0x4a, 0x61, 0x6e, 0x20, 0x4d,
-0x61, 0x79, 0x65, 0x6e, 0xb13, 0xb21, 0xb3c, 0xb3f, 0xb06, 0xb2d, 0xb3e, 0xb30, 0xb24, 0x67e, 0x69a, 0x62a, 0x648, 0x627, 0x641, 0x63a,
-0x627, 0x646, 0x633, 0x62a, 0x627, 0x646, 0x67e, 0x627, 0x6a9, 0x633, 0x62a, 0x627, 0x646, 0x641, 0x627, 0x631, 0x633, 0x6cc, 0x627, 0x6cc,
-0x631, 0x627, 0x646, 0x62f, 0x631, 0x6cc, 0x70, 0x6f, 0x6c, 0x73, 0x6b, 0x69, 0x50, 0x6f, 0x6c, 0x73, 0x6b, 0x61, 0x70, 0x6f,
-0x72, 0x74, 0x75, 0x67, 0x75, 0xea, 0x73, 0x42, 0x72, 0x61, 0x73, 0x69, 0x6c, 0x41, 0x6e, 0x67, 0x6f, 0x6c, 0x61, 0x43,
-0x61, 0x62, 0x6f, 0x20, 0x56, 0x65, 0x72, 0x64, 0x65, 0x54, 0x69, 0x6d, 0x6f, 0x72, 0x2d, 0x4c, 0x65, 0x73, 0x74, 0x65,
-0x47, 0x75, 0x69, 0x6e, 0xe9, 0x20, 0x45, 0x71, 0x75, 0x61, 0x74, 0x6f, 0x72, 0x69, 0x61, 0x6c, 0x47, 0x75, 0x69, 0x6e,
-0xe9, 0x2d, 0x42, 0x69, 0x73, 0x73, 0x61, 0x75, 0x4c, 0x75, 0x78, 0x65, 0x6d, 0x62, 0x75, 0x72, 0x67, 0x6f, 0x4d, 0x61,
-0x63, 0x61, 0x75, 0x2c, 0x20, 0x52, 0x41, 0x45, 0x20, 0x64, 0x61, 0x20, 0x43, 0x68, 0x69, 0x6e, 0x61, 0x4d, 0x6f, 0xe7,
-0x61, 0x6d, 0x62, 0x69, 0x71, 0x75, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x75, 0x67, 0x75, 0xea, 0x73, 0x20, 0x65, 0x75, 0x72,
-0x6f, 0x70, 0x65, 0x75, 0x50, 0x6f, 0x72, 0x74, 0x75, 0x67, 0x61, 0x6c, 0x53, 0xe3, 0x6f, 0x20, 0x54, 0x6f, 0x6d, 0xe9,
-0x20, 0x65, 0x20, 0x50, 0x72, 0xed, 0x6e, 0x63, 0x69, 0x70, 0x65, 0x53, 0x75, 0xed, 0xe7, 0x61, 0xa2a, 0xa70, 0xa1c, 0xa3e,
-0xa2c, 0xa40, 0xa2d, 0xa3e, 0xa30, 0xa24, 0x67e, 0x646, 0x62c, 0x627, 0x628, 0x6cc, 0x52, 0x75, 0x6e, 0x61, 0x73, 0x69, 0x6d, 0x69,
-0x50, 0x65, 0x72, 0xfa, 0x42, 0x6f, 0x6c, 0x69, 0x76, 0x69, 0x61, 0x45, 0x63, 0x75, 0x61, 0x64, 0x6f, 0x72, 0x72, 0x75,
-0x6d, 0x61, 0x6e, 0x74, 0x73, 0x63, 0x68, 0x53, 0x76, 0x69, 0x7a, 0x72, 0x61, 0x72, 0x6f, 0x6d, 0xe2, 0x6e, 0x103, 0x52,
-0x6f, 0x6d, 0xe2, 0x6e, 0x69, 0x61, 0x52, 0x65, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x61, 0x20, 0x4d, 0x6f, 0x6c, 0x64,
-0x6f, 0x76, 0x61, 0x440, 0x443, 0x441, 0x441, 0x43a, 0x438, 0x439, 0x420, 0x43e, 0x441, 0x441, 0x438, 0x44f, 0x41a, 0x430, 0x437, 0x430,
-0x445, 0x441, 0x442, 0x430, 0x43d, 0x41a, 0x438, 0x440, 0x433, 0x438, 0x437, 0x438, 0x44f, 0x41c, 0x43e, 0x43b, 0x434, 0x43e, 0x432, 0x430,
-0x423, 0x43a, 0x440, 0x430, 0x438, 0x43d, 0x430, 0x53, 0xe4, 0x6e, 0x67, 0xf6, 0x4b, 0xf6, 0x64, 0xf6, 0x72, 0xf6, 0x73, 0xea,
-0x73, 0x65, 0x20, 0x74, 0xee, 0x20, 0x42, 0xea, 0x61, 0x66, 0x72, 0xee, 0x6b, 0x61, 0x441, 0x440, 0x43f, 0x441, 0x43a, 0x438,
-0x421, 0x440, 0x431, 0x438, 0x458, 0x430, 0x73, 0x72, 0x70, 0x73, 0x6b, 0x69, 0x43, 0x72, 0x6e, 0x61, 0x20, 0x47, 0x6f, 0x72,
-0x61, 0x53, 0x72, 0x62, 0x69, 0x6a, 0x61, 0x411, 0x43e, 0x441, 0x43d, 0x430, 0x20, 0x438, 0x20, 0x425, 0x435, 0x440, 0x446, 0x435,
-0x433, 0x43e, 0x432, 0x438, 0x43d, 0x430, 0x426, 0x440, 0x43d, 0x430, 0x20, 0x413, 0x43e, 0x440, 0x430, 0x41a, 0x43e, 0x441, 0x43e, 0x432,
-0x43e, 0x4b, 0x6f, 0x73, 0x6f, 0x76, 0x6f, 0x438, 0x440, 0x43e, 0x43d, 0x413, 0x443, 0x44b, 0x440, 0x434, 0x437, 0x44b, 0x441, 0x442,
-0x43e, 0x43d, 0x423, 0x4d5, 0x440, 0x4d5, 0x441, 0x435, 0x63, 0x68, 0x69, 0x53, 0x68, 0x6f, 0x6e, 0x61, 0x633, 0x646, 0x68c, 0x64a,
-0x67e, 0x627, 0x6aa, 0x633, 0x62a, 0x627, 0x646, 0xdc3, 0xdd2, 0xd82, 0xdc4, 0xdbd, 0xdc1, 0xdca, 0x200d, 0xdbb, 0xdd3, 0x20, 0xdbd, 0xd82,
-0xd9a, 0xdcf, 0xdc0, 0x73, 0x6c, 0x6f, 0x76, 0x65, 0x6e, 0x10d, 0x69, 0x6e, 0x61, 0x53, 0x6c, 0x6f, 0x76, 0x65, 0x6e, 0x73,
-0x6b, 0x6f, 0x73, 0x6c, 0x6f, 0x76, 0x65, 0x6e, 0x161, 0x10d, 0x69, 0x6e, 0x61, 0x53, 0x6c, 0x6f, 0x76, 0x65, 0x6e, 0x69,
-0x6a, 0x61, 0x53, 0x6f, 0x6f, 0x6d, 0x61, 0x61, 0x6c, 0x69, 0x53, 0x6f, 0x6f, 0x6d, 0x61, 0x61, 0x6c, 0x69, 0x79, 0x61,
-0x4a, 0x61, 0x62, 0x75, 0x75, 0x74, 0x69, 0x49, 0x74, 0x6f, 0x6f, 0x62, 0x69, 0x79, 0x61, 0x65, 0x73, 0x70, 0x61, 0xf1,
-0x6f, 0x6c, 0x20, 0x64, 0x65, 0x20, 0x45, 0x73, 0x70, 0x61, 0xf1, 0x61, 0x65, 0x73, 0x70, 0x61, 0xf1, 0x6f, 0x6c, 0x41,
-0x72, 0x67, 0x65, 0x6e, 0x74, 0x69, 0x6e, 0x61, 0x42, 0x65, 0x6c, 0x69, 0x63, 0x65, 0x43, 0x68, 0x69, 0x6c, 0x65, 0x43,
-0x6f, 0x6c, 0x6f, 0x6d, 0x62, 0x69, 0x61, 0x43, 0x6f, 0x73, 0x74, 0x61, 0x20, 0x52, 0x69, 0x63, 0x61, 0x43, 0x75, 0x62,
-0x61, 0x52, 0x65, 0x70, 0xfa, 0x62, 0x6c, 0x69, 0x63, 0x61, 0x20, 0x44, 0x6f, 0x6d, 0x69, 0x6e, 0x69, 0x63, 0x61, 0x6e,
-0x61, 0x45, 0x6c, 0x20, 0x53, 0x61, 0x6c, 0x76, 0x61, 0x64, 0x6f, 0x72, 0x47, 0x75, 0x69, 0x6e, 0x65, 0x61, 0x20, 0x45,
-0x63, 0x75, 0x61, 0x74, 0x6f, 0x72, 0x69, 0x61, 0x6c, 0x47, 0x75, 0x61, 0x74, 0x65, 0x6d, 0x61, 0x6c, 0x61, 0x48, 0x6f,
-0x6e, 0x64, 0x75, 0x72, 0x61, 0x73, 0x65, 0x73, 0x70, 0x61, 0xf1, 0x6f, 0x6c, 0x20, 0x64, 0x65, 0x20, 0x4d, 0xe9, 0x78,
-0x69, 0x63, 0x6f, 0x4d, 0xe9, 0x78, 0x69, 0x63, 0x6f, 0x4e, 0x69, 0x63, 0x61, 0x72, 0x61, 0x67, 0x75, 0x61, 0x50, 0x61,
-0x6e, 0x61, 0x6d, 0xe1, 0x50, 0x61, 0x72, 0x61, 0x67, 0x75, 0x61, 0x79, 0x46, 0x69, 0x6c, 0x69, 0x70, 0x69, 0x6e, 0x61,
-0x73, 0x45, 0x73, 0x74, 0x61, 0x64, 0x6f, 0x73, 0x20, 0x55, 0x6e, 0x69, 0x64, 0x6f, 0x73, 0x55, 0x72, 0x75, 0x67, 0x75,
-0x61, 0x79, 0x56, 0x65, 0x6e, 0x65, 0x7a, 0x75, 0x65, 0x6c, 0x61, 0x43, 0x61, 0x6e, 0x61, 0x72, 0x69, 0x61, 0x73, 0x65,
-0x73, 0x70, 0x61, 0xf1, 0x6f, 0x6c, 0x20, 0x6c, 0x61, 0x74, 0x69, 0x6e, 0x6f, 0x61, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61,
-0x6e, 0x6f, 0x4c, 0x61, 0x74, 0x69, 0x6e, 0x6f, 0x61, 0x6d, 0xe9, 0x72, 0x69, 0x63, 0x61, 0x43, 0x65, 0x75, 0x74, 0x61,
-0x20, 0x79, 0x20, 0x4d, 0x65, 0x6c, 0x69, 0x6c, 0x6c, 0x61, 0x4b, 0x69, 0x73, 0x77, 0x61, 0x68, 0x69, 0x6c, 0x69, 0x4a,
-0x61, 0x6d, 0x68, 0x75, 0x72, 0x69, 0x20, 0x79, 0x61, 0x20, 0x4b, 0x69, 0x64, 0x65, 0x6d, 0x6f, 0x6b, 0x72, 0x61, 0x73,
-0x69, 0x61, 0x20, 0x79, 0x61, 0x20, 0x4b, 0x6f, 0x6e, 0x67, 0x6f, 0x73, 0x76, 0x65, 0x6e, 0x73, 0x6b, 0x61, 0x53, 0x76,
-0x65, 0x72, 0x69, 0x67, 0x65, 0xc5, 0x6c, 0x61, 0x6e, 0x64, 0x442, 0x43e, 0x4b7, 0x438, 0x43a, 0x4e3, 0x422, 0x43e, 0x4b7, 0x438,
-0x43a, 0x438, 0x441, 0x442, 0x43e, 0x43d, 0xba4, 0xbae, 0xbbf, 0xbb4, 0xbcd, 0xb87, 0xba8, 0xbcd, 0xba4, 0xbbf, 0xbaf, 0xbbe, 0xbae, 0xbb2,
-0xbc7, 0xb9a, 0xbbf, 0xbaf, 0xbbe, 0xb9a, 0xbbf, 0xb99, 0xbcd, 0xb95, 0xbaa, 0xbcd, 0xbaa, 0xbc2, 0xbb0, 0xbcd, 0xb87, 0xbb2, 0xb99, 0xbcd,
-0xb95, 0xbc8, 0x442, 0x430, 0x442, 0x430, 0x440, 0xc24, 0xc46, 0xc32, 0xc41, 0xc17, 0xc41, 0xc2d, 0xc3e, 0xc30, 0xc24, 0xc26, 0xc47, 0xc36,
-0xc02, 0xe44, 0xe17, 0xe22, 0xf56, 0xf7c, 0xf51, 0xf0b, 0xf66, 0xf90, 0xf51, 0xf0b, 0xf62, 0xf92, 0xfb1, 0xf0b, 0xf53, 0xf42, 0xf62, 0xf92,
-0xfb1, 0xf0b, 0xf42, 0xf62, 0xf0b, 0x1275, 0x130d, 0x122d, 0x129b, 0x12a4, 0x122d, 0x1275, 0x122b, 0x6c, 0x65, 0x61, 0x20, 0x66, 0x61, 0x6b,
-0x61, 0x74, 0x6f, 0x6e, 0x67, 0x61, 0x54, 0xfc, 0x72, 0x6b, 0xe7, 0x65, 0x54, 0xfc, 0x72, 0x6b, 0x69, 0x79, 0x65, 0x4b,
-0x131, 0x62, 0x72, 0x131, 0x73, 0x74, 0xfc, 0x72, 0x6b, 0x6d, 0x65, 0x6e, 0x20, 0x64, 0x69, 0x6c, 0x69, 0x54, 0xfc, 0x72,
-0x6b, 0x6d, 0x65, 0x6e, 0x69, 0x73, 0x74, 0x61, 0x6e, 0x626, 0x6c7, 0x64a, 0x63a, 0x6c7, 0x631, 0x686, 0x6d5, 0x62c, 0x6c7, 0x6ad,
-0x6af, 0x648, 0x443, 0x43a, 0x440, 0x430, 0x457, 0x43d, 0x441, 0x44c, 0x43a, 0x430, 0x423, 0x43a, 0x440, 0x430, 0x457, 0x43d, 0x430, 0x627,
-0x631, 0x62f, 0x648, 0x628, 0x6be, 0x627, 0x631, 0x62a, 0x6f, 0x2018, 0x7a, 0x62, 0x65, 0x6b, 0x4f, 0x2bb, 0x7a, 0x62, 0x65, 0x6b,
-0x69, 0x73, 0x74, 0x6f, 0x6e, 0x627, 0x648, 0x632, 0x628, 0x6cc, 0x6a9, 0x45e, 0x437, 0x431, 0x435, 0x43a, 0x447, 0x430, 0x40e, 0x437,
-0x431, 0x435, 0x43a, 0x438, 0x441, 0x442, 0x43e, 0x43d, 0x54, 0x69, 0x1ebf, 0x6e, 0x67, 0x20, 0x56, 0x69, 0x1ec7, 0x74, 0x56, 0x69,
-0x1ec7, 0x74, 0x20, 0x4e, 0x61, 0x6d, 0x56, 0x6f, 0x6c, 0x61, 0x70, 0xfc, 0x6b, 0x43, 0x79, 0x6d, 0x72, 0x61, 0x65, 0x67,
-0x59, 0x20, 0x44, 0x65, 0x79, 0x72, 0x6e, 0x61, 0x73, 0x20, 0x55, 0x6e, 0x65, 0x64, 0x69, 0x67, 0x57, 0x6f, 0x6c, 0x6f,
-0x66, 0x53, 0x65, 0x6e, 0x65, 0x67, 0x61, 0x61, 0x6c, 0x69, 0x73, 0x69, 0x58, 0x68, 0x6f, 0x73, 0x61, 0x65, 0x4d, 0x7a,
-0x61, 0x6e, 0x74, 0x73, 0x69, 0x20, 0x41, 0x66, 0x72, 0x69, 0x6b, 0x61, 0x5d9, 0x5d9, 0x5b4, 0x5d3, 0x5d9, 0x5e9, 0x5d5, 0x5d5,
-0x5e2, 0x5dc, 0x5d8, 0xc8, 0x64, 0xe8, 0x20, 0x59, 0x6f, 0x72, 0xf9, 0x62, 0xe1, 0x4f, 0x72, 0x69, 0x6c, 0x1eb9, 0x300, 0x2d,
-0xe8, 0x64, 0xe8, 0x20, 0x4e, 0xe0, 0xec, 0x6a, 0xed, 0x72, 0xed, 0xe0, 0x4f, 0x72, 0xed, 0x6c, 0x25b, 0x301, 0xe8, 0x64,
-0x65, 0x20, 0x42, 0x25b, 0x300, 0x6e, 0x25b, 0x300, 0x69, 0x73, 0x69, 0x5a, 0x75, 0x6c, 0x75, 0x69, 0x4e, 0x69, 0x6e, 0x67,
-0x69, 0x7a, 0x69, 0x6d, 0x75, 0x20, 0x41, 0x66, 0x72, 0x69, 0x6b, 0x61, 0x6e, 0x79, 0x6e, 0x6f, 0x72, 0x73, 0x6b, 0x4e,
-0x6f, 0x72, 0x65, 0x67, 0x62, 0x6f, 0x73, 0x61, 0x6e, 0x73, 0x6b, 0x69, 0x431, 0x43e, 0x441, 0x430, 0x43d, 0x441, 0x43a, 0x438,
-0x47, 0x61, 0x65, 0x6c, 0x67, 0x45, 0x6c, 0x6c, 0x61, 0x6e, 0x20, 0x56, 0x61, 0x6e, 0x6e, 0x69, 0x6e, 0x6b, 0x65, 0x72,
-0x6e, 0x65, 0x77, 0x65, 0x6b, 0x52, 0x79, 0x77, 0x76, 0x61, 0x6e, 0x65, 0x74, 0x68, 0x20, 0x55, 0x6e, 0x79, 0x73, 0x41,
-0x6b, 0x61, 0x6e, 0x47, 0x61, 0x61, 0x6e, 0x61, 0x915, 0x94b, 0x902, 0x915, 0x923, 0x940, 0x41, 0x73, 0x1ee5, 0x73, 0x1ee5, 0x20,
-0x49, 0x67, 0x62, 0x6f, 0x4e, 0x61, 0x1ecb, 0x6a, 0x1ecb, 0x72, 0x1ecb, 0x61, 0x4b, 0x69, 0x6b, 0x61, 0x6d, 0x62, 0x61, 0x66,
-0x75, 0x72, 0x6c, 0x61, 0x6e, 0x49, 0x74, 0x61, 0x6c, 0x69, 0x65, 0x45, 0x28b, 0x65, 0x67, 0x62, 0x65, 0x47, 0x68, 0x61,
-0x6e, 0x61, 0x20, 0x6e, 0x75, 0x74, 0x6f, 0x6d, 0x65, 0x54, 0x6f, 0x67, 0x6f, 0x20, 0x6e, 0x75, 0x74, 0x6f, 0x6d, 0x65,
-0x2bb, 0x14c, 0x6c, 0x65, 0x6c, 0x6f, 0x20, 0x48, 0x61, 0x77, 0x61, 0x69, 0x2bb, 0x69, 0x2bb, 0x41, 0x6d, 0x65, 0x6c, 0x69,
-0x6b, 0x61, 0x20, 0x48, 0x75, 0x69, 0x20, 0x50, 0x16b, 0x20, 0x2bb, 0x49, 0x61, 0x46, 0x69, 0x6c, 0x69, 0x70, 0x69, 0x6e,
-0x6f, 0x50, 0x69, 0x6c, 0x69, 0x70, 0x69, 0x6e, 0x61, 0x73, 0x53, 0x63, 0x68, 0x77, 0x69, 0x69, 0x7a, 0x65, 0x72, 0x74,
-0xfc, 0xfc, 0x74, 0x73, 0x63, 0x68, 0x53, 0x63, 0x68, 0x77, 0x69, 0x69, 0x7a, 0x46, 0x72, 0x61, 0x6e, 0x6b, 0x72, 0x69,
-0x69, 0x63, 0x68, 0x4c, 0x69, 0xe4, 0x63, 0x68, 0x74, 0x65, 0x73, 0x63, 0x68, 0x74, 0xe4, 0x69, 0xa188, 0xa320, 0xa259, 0xa34f,
-0xa1e9, 0x4e, 0x65, 0x64, 0x64, 0x65, 0x72, 0x73, 0x61, 0x73, 0x73, 0x2019, 0x73, 0x63, 0x68, 0x44, 0xfc, 0xfc, 0x74, 0x73,
-0x63, 0x68, 0x6c, 0x61, 0x6e, 0x64, 0x4e, 0x65, 0x64, 0x64, 0x65, 0x72, 0x6c, 0x61, 0x6e, 0x6e, 0x65, 0x6e, 0x64, 0x61,
-0x76, 0x76, 0x69, 0x73, 0xe1, 0x6d, 0x65, 0x67, 0x69, 0x65, 0x6c, 0x6c, 0x61, 0x4e, 0x6f, 0x72, 0x67, 0x61, 0x53, 0x75,
-0x6f, 0x70, 0x6d, 0x61, 0x52, 0x75, 0x6f, 0x167, 0x167, 0x61, 0x45, 0x6b, 0x65, 0x67, 0x75, 0x73, 0x69, 0x69, 0x4b, 0x69,
-0x74, 0x61, 0x69, 0x74, 0x61, 0x50, 0x75, 0x6c, 0x61, 0x61, 0x72, 0x42, 0x75, 0x72, 0x6b, 0x69, 0x62, 0x61, 0x61, 0x20,
-0x46, 0x61, 0x61, 0x73, 0x6f, 0x4b, 0x61, 0x6d, 0x65, 0x72, 0x75, 0x75, 0x6e, 0x47, 0x61, 0x6d, 0x6d, 0x62, 0x69, 0x47,
-0x61, 0x6e, 0x61, 0x61, 0x47, 0x69, 0x6e, 0x65, 0x47, 0x69, 0x6e, 0x65, 0x2d, 0x42, 0x69, 0x73, 0x61, 0x61, 0x77, 0x6f,
-0x4c, 0x69, 0x62, 0x65, 0x72, 0x69, 0x79, 0x61, 0x61, 0x4d, 0x75, 0x72, 0x69, 0x74, 0x61, 0x6e, 0x69, 0x4e, 0x69, 0x6a,
-0x65, 0x65, 0x72, 0x4e, 0x69, 0x6a, 0x65, 0x72, 0x69, 0x79, 0x61, 0x61, 0x53, 0x65, 0x72, 0x61, 0x61, 0x20, 0x6c, 0x69,
-0x79, 0x6f, 0x6e, 0x47, 0x69, 0x6b, 0x75, 0x79, 0x75, 0x4b, 0x69, 0x73, 0x61, 0x6d, 0x70, 0x75, 0x72, 0x73, 0x65, 0x6e,
-0x61, 0x69, 0x73, 0x69, 0x4e, 0x64, 0x65, 0x62, 0x65, 0x6c, 0x65, 0x4b, 0x69, 0x68, 0x6f, 0x72, 0x6f, 0x6d, 0x62, 0x6f,
-0x2d5c, 0x2d30, 0x2d5b, 0x2d4d, 0x2d43, 0x2d49, 0x2d5c, 0x2d4d, 0x2d4e, 0x2d56, 0x2d54, 0x2d49, 0x2d31, 0x54, 0x61, 0x73, 0x68, 0x65, 0x6c, 0x1e25,
-0x69, 0x79, 0x74, 0x6c, 0x6d, 0x263, 0x72, 0x69, 0x62, 0x54, 0x61, 0x71, 0x62, 0x61, 0x79, 0x6c, 0x69, 0x74, 0x4c, 0x65,
-0x7a, 0x7a, 0x61, 0x79, 0x65, 0x72, 0x52, 0x75, 0x6e, 0x79, 0x61, 0x6e, 0x6b, 0x6f, 0x72, 0x65, 0x48, 0x69, 0x62, 0x65,
-0x6e, 0x61, 0x48, 0x75, 0x74, 0x61, 0x6e, 0x7a, 0x61, 0x6e, 0x69, 0x61, 0x4b, 0x79, 0x69, 0x76, 0x75, 0x6e, 0x6a, 0x6f,
-0x62, 0x61, 0x6d, 0x61, 0x6e, 0x61, 0x6b, 0x61, 0x6e, 0x4b, 0x129, 0x65, 0x6d, 0x62, 0x75, 0x13e3, 0x13b3, 0x13a9, 0x13cc, 0x13ca,
-0x20, 0x13a2, 0x13f3, 0x13be, 0x13b5, 0x13cd, 0x13d4, 0x13c5, 0x20, 0x13cd, 0x13a6, 0x13da, 0x13a9, 0x6b, 0x72, 0x65, 0x6f, 0x6c, 0x20, 0x6d,
-0x6f, 0x72, 0x69, 0x73, 0x69, 0x65, 0x6e, 0x4d, 0x6f, 0x72, 0x69, 0x73, 0x43, 0x68, 0x69, 0x6d, 0x61, 0x6b, 0x6f, 0x6e,
-0x64, 0x65, 0x4b, 0x268, 0x6c, 0x61, 0x61, 0x6e, 0x67, 0x69, 0x54, 0x61, 0x61, 0x6e, 0x73, 0x61, 0x6e, 0xed, 0x61, 0x4c,
-0x75, 0x67, 0x61, 0x6e, 0x64, 0x61, 0x59, 0x75, 0x67, 0x61, 0x6e, 0x64, 0x61, 0x49, 0x63, 0x68, 0x69, 0x62, 0x65, 0x6d,
-0x62, 0x61, 0x6b, 0x61, 0x62, 0x75, 0x76, 0x65, 0x72, 0x64, 0x69, 0x61, 0x6e, 0x75, 0x4b, 0x61, 0x62, 0x75, 0x20, 0x56,
-0x65, 0x72, 0x64, 0x69, 0x4b, 0x129, 0x6d, 0x129, 0x72, 0x169, 0x4b, 0x61, 0x6c, 0x65, 0x6e, 0x6a, 0x69, 0x6e, 0x45, 0x6d,
-0x65, 0x74, 0x61, 0x62, 0x20, 0x4b, 0x65, 0x6e, 0x79, 0x61, 0x4b, 0x68, 0x6f, 0x65, 0x6b, 0x68, 0x6f, 0x65, 0x67, 0x6f,
-0x77, 0x61, 0x62, 0x4e, 0x61, 0x6d, 0x69, 0x62, 0x69, 0x61, 0x62, 0x4b, 0x69, 0x6d, 0x61, 0x63, 0x68, 0x61, 0x6d, 0x65,
-0x4b, 0xf6, 0x6c, 0x73, 0x63, 0x68, 0x44, 0x6f, 0xfc, 0x74, 0x73, 0x63, 0x68, 0x6c, 0x61, 0x6e, 0x64, 0x4d, 0x61, 0x61,
-0x54, 0x61, 0x6e, 0x73, 0x61, 0x6e, 0x69, 0x61, 0x4f, 0x6c, 0x75, 0x73, 0x6f, 0x67, 0x61, 0x4c, 0x75, 0x6c, 0x75, 0x68,
-0x69, 0x61, 0x4b, 0x69, 0x70, 0x61, 0x72, 0x65, 0x54, 0x61, 0x64, 0x68, 0x61, 0x6e, 0x69, 0x61, 0x4b, 0x69, 0x74, 0x65,
-0x73, 0x6f, 0x4b, 0x65, 0x6e, 0x69, 0x61, 0x4b, 0x6f, 0x79, 0x72, 0x61, 0x20, 0x63, 0x69, 0x69, 0x6e, 0x69, 0x4d, 0x61,
-0x61, 0x6c, 0x69, 0x4b, 0x69, 0x72, 0x75, 0x77, 0x61, 0x44, 0x68, 0x6f, 0x6c, 0x75, 0x6f, 0x52, 0x75, 0x6b, 0x69, 0x67,
-0x61, 0x54, 0x61, 0x6d, 0x61, 0x7a, 0x69, 0x263, 0x74, 0x20, 0x6e, 0x20, 0x6c, 0x61, 0x1e6d, 0x6c, 0x61, 0x1e63, 0x4d, 0x65,
-0x1e5b, 0x1e5b, 0x75, 0x6b, 0x4b, 0x6f, 0x79, 0x72, 0x61, 0x62, 0x6f, 0x72, 0x6f, 0x20, 0x73, 0x65, 0x6e, 0x6e, 0x69, 0x4b,
-0x69, 0x73, 0x68, 0x61, 0x6d, 0x62, 0x61, 0x61, 0x92c, 0x921, 0x93c, 0x94b, 0x43d, 0x43e, 0x445, 0x447, 0x438, 0x439, 0x43d, 0x420,
-0x43e, 0x441, 0x441, 0x438, 0x446, 0x435, 0x440, 0x43a, 0x43e, 0x432, 0x43d, 0x43e, 0x441, 0x43b, 0x43e, 0x432, 0x435, 0x301, 0x43d, 0x441,
-0x43a, 0x457, 0x439, 0x440, 0x461, 0x441, 0x441, 0x456, 0x301, 0x430, 0x54, 0x73, 0x68, 0x69, 0x6c, 0x75, 0x62, 0x61, 0x44, 0x69,
-0x74, 0x75, 0x6e, 0x67, 0x61, 0x20, 0x77, 0x61, 0x20, 0x4b, 0x6f, 0x6e, 0x67, 0x75, 0x4c, 0xeb, 0x74, 0x7a, 0x65, 0x62,
-0x75, 0x65, 0x72, 0x67, 0x65, 0x73, 0x63, 0x68, 0x4c, 0xeb, 0x74, 0x7a, 0x65, 0x62, 0x75, 0x65, 0x72, 0x67, 0x41, 0x67,
-0x68, 0x65, 0x6d, 0x4b, 0xe0, 0x6d, 0xe0, 0x6c, 0xfb, 0x14b, 0x181, 0xe0, 0x73, 0xe0, 0x61, 0x4b, 0xe0, 0x6d, 0x25b, 0x300,
-0x72, 0xfb, 0x6e, 0x5a, 0x61, 0x72, 0x6d, 0x61, 0x63, 0x69, 0x69, 0x6e, 0x65, 0x4e, 0x69, 0x17e, 0x65, 0x72, 0x64, 0x75,
-0xe1, 0x6c, 0xe1, 0x6a, 0x6f, 0x6f, 0x6c, 0x61, 0x53, 0x65, 0x6e, 0x65, 0x67, 0x61, 0x6c, 0x65, 0x77, 0x6f, 0x6e, 0x64,
-0x6f, 0x4b, 0x61, 0x6d, 0x259, 0x72, 0xfa, 0x6e, 0x72, 0x69, 0x6b, 0x70, 0x61, 0x6b, 0x61, 0x6d, 0x25b, 0x72, 0xfa, 0x6e,
-0x4d, 0x61, 0x6b, 0x75, 0x61, 0x55, 0x6d, 0x6f, 0x7a, 0x61, 0x6d, 0x62, 0x69, 0x6b, 0x69, 0x4d, 0x55, 0x4e, 0x44, 0x41,
-0x14a, 0x6b, 0x61, 0x6d, 0x65, 0x72, 0x75, 0x14b, 0x4b, 0x77, 0x61, 0x73, 0x69, 0x6f, 0x4b, 0x61, 0x6d, 0x65, 0x72, 0x75,
-0x6e, 0x54, 0x68, 0x6f, 0x6b, 0x20, 0x4e, 0x61, 0x74, 0x68, 0x441, 0x430, 0x445, 0x430, 0x20, 0x442, 0x44b, 0x43b, 0x430, 0x410,
-0x440, 0x430, 0x441, 0x441, 0x44b, 0x44b, 0x439, 0x430, 0x49, 0x73, 0x68, 0x69, 0x73, 0x61, 0x6e, 0x67, 0x75, 0x54, 0x61, 0x6e,
-0x73, 0x61, 0x6e, 0x69, 0x79, 0x61, 0x54, 0x61, 0x73, 0x61, 0x77, 0x61, 0x71, 0x20, 0x73, 0x65, 0x6e, 0x6e, 0x69, 0xa559,
-0xa524, 0xa55e, 0xa524, 0xa52b, 0xa569, 0x56, 0x61, 0x69, 0x4c, 0x61, 0x69, 0x62, 0x68, 0x69, 0x79, 0x61, 0x57, 0x61, 0x6c, 0x73,
-0x65, 0x72, 0x53, 0x63, 0x68, 0x77, 0x69, 0x7a, 0x6e, 0x75, 0x61, 0x73, 0x75, 0x65, 0x4b, 0x65, 0x6d, 0x65, 0x6c, 0xfa,
-0x6e, 0x61, 0x73, 0x74, 0x75, 0x72, 0x69, 0x61, 0x6e, 0x75, 0x4e, 0x64, 0x61, 0xa78c, 0x61, 0x4b, 0x61, 0x6d, 0x25b, 0x6c,
-0xfb, 0x6e, 0x6b, 0x61, 0x6b, 0x254, 0x4b, 0x61, 0x6d, 0x25b, 0x72, 0x75, 0x6e, 0x6d, 0x65, 0x74, 0x61, 0x2bc, 0x4b, 0x61,
-0x6d, 0x61, 0x6c, 0x75, 0x6e, 0x53, 0x68, 0x77, 0xf3, 0x14b, 0xf2, 0x20, 0x6e, 0x67, 0x69, 0x65, 0x6d, 0x62, 0x254, 0x254,
-0x6e, 0x4b, 0xe0, 0x6d, 0x61, 0x6c, 0xfb, 0x6d, 0x4c, 0x61, 0x6b, 0x21f, 0xf3, 0x6c, 0x2bc, 0x69, 0x79, 0x61, 0x70, 0x69,
-0x4d, 0xed, 0x6c, 0x61, 0x68, 0x61, 0x14b, 0x73, 0x6b, 0x61, 0x20, 0x54, 0x21f, 0x61, 0x6d, 0xe1, 0x6b, 0x21f, 0x6f, 0x10d,
-0x68, 0x65, 0x2d5c, 0x2d30, 0x2d4e, 0x2d30, 0x2d63, 0x2d49, 0x2d56, 0x2d5c, 0x6a9, 0x648, 0x631, 0x62f, 0x6cc, 0x6cc, 0x20, 0x646, 0x627, 0x648,
-0x6d5, 0x646, 0x62f, 0x6cc, 0x639, 0x6ce, 0x631, 0x627, 0x642, 0x626, 0x6ce, 0x631, 0x627, 0x646, 0x64, 0x6f, 0x6c, 0x6e, 0x6f, 0x73,
-0x65, 0x72, 0x62, 0x161, 0x107, 0x69, 0x6e, 0x61, 0x4e, 0x69, 0x6d, 0x73, 0x6b, 0x61, 0x68, 0x6f, 0x72, 0x6e, 0x6a, 0x6f,
-0x73, 0x65, 0x72, 0x62, 0x161, 0x107, 0x69, 0x6e, 0x61, 0x4e, 0x11b, 0x6d, 0x73, 0x6b, 0x61, 0x70, 0x72, 0x16b, 0x73, 0x69,
-0x73, 0x6b, 0x61, 0x6e, 0x73, 0x77, 0x12b, 0x74, 0x61, 0x69, 0x61, 0x6e, 0x61, 0x72, 0xe2, 0x161, 0x6b, 0x69, 0x65, 0x6c,
-0xe2, 0x53, 0x75, 0x6f, 0x6d, 0xe2, 0x645, 0x627, 0x632, 0x631, 0x648, 0x646, 0x6cc, 0x644, 0x6ca, 0x631, 0x6cc, 0x20, 0x634, 0x648,
-0x645, 0x627, 0x644, 0x6cc, 0x7cb5, 0x8a9e, 0x4e2d, 0x83ef, 0x4eba, 0x6c11, 0x5171, 0x548c, 0x570b, 0x9999, 0x6e2f, 0x7279, 0x5225, 0x884c, 0x653f, 0x5340,
-0x7ca4, 0x8bed, 0x4e2d, 0x534e, 0x4eba, 0x6c11, 0x5171, 0x548c, 0x56fd
-};
-
-static const char language_name_list[] =
-"Default\0"
-"C\0"
-"Abkhazian\0"
-"Oromo\0"
-"Afar\0"
-"Afrikaans\0"
-"Albanian\0"
-"Amharic\0"
-"Arabic\0"
-"Armenian\0"
-"Assamese\0"
-"Aymara\0"
-"Azerbaijani\0"
-"Bashkir\0"
-"Basque\0"
-"Bengali\0"
-"Dzongkha\0"
-"Bihari\0"
-"Bislama\0"
-"Breton\0"
-"Bulgarian\0"
-"Burmese\0"
-"Belarusian\0"
-"Khmer\0"
-"Catalan\0"
-"Chinese\0"
-"Corsican\0"
-"Croatian\0"
-"Czech\0"
-"Danish\0"
-"Dutch\0"
-"English\0"
-"Esperanto\0"
-"Estonian\0"
-"Faroese\0"
-"Fijian\0"
-"Finnish\0"
-"French\0"
-"Western Frisian\0"
-"Gaelic\0"
-"Galician\0"
-"Georgian\0"
-"German\0"
-"Greek\0"
-"Greenlandic\0"
-"Guarani\0"
-"Gujarati\0"
-"Hausa\0"
-"Hebrew\0"
-"Hindi\0"
-"Hungarian\0"
-"Icelandic\0"
-"Indonesian\0"
-"Interlingua\0"
-"Interlingue\0"
-"Inuktitut\0"
-"Inupiak\0"
-"Irish\0"
-"Italian\0"
-"Japanese\0"
-"Javanese\0"
-"Kannada\0"
-"Kashmiri\0"
-"Kazakh\0"
-"Kinyarwanda\0"
-"Kirghiz\0"
-"Korean\0"
-"Kurdish\0"
-"Rundi\0"
-"Lao\0"
-"Latin\0"
-"Latvian\0"
-"Lingala\0"
-"Lithuanian\0"
-"Macedonian\0"
-"Malagasy\0"
-"Malay\0"
-"Malayalam\0"
-"Maltese\0"
-"Maori\0"
-"Marathi\0"
-"Marshallese\0"
-"Mongolian\0"
-"Nauru\0"
-"Nepali\0"
-"Norwegian Bokmal\0"
-"Occitan\0"
-"Oriya\0"
-"Pashto\0"
-"Persian\0"
-"Polish\0"
-"Portuguese\0"
-"Punjabi\0"
-"Quechua\0"
-"Romansh\0"
-"Romanian\0"
-"Russian\0"
-"Samoan\0"
-"Sango\0"
-"Sanskrit\0"
-"Serbian\0"
-"Ossetic\0"
-"Southern Sotho\0"
-"Tswana\0"
-"Shona\0"
-"Sindhi\0"
-"Sinhala\0"
-"Swati\0"
-"Slovak\0"
-"Slovenian\0"
-"Somali\0"
-"Spanish\0"
-"Sundanese\0"
-"Swahili\0"
-"Swedish\0"
-"Sardinian\0"
-"Tajik\0"
-"Tamil\0"
-"Tatar\0"
-"Telugu\0"
-"Thai\0"
-"Tibetan\0"
-"Tigrinya\0"
-"Tongan\0"
-"Tsonga\0"
-"Turkish\0"
-"Turkmen\0"
-"Tahitian\0"
-"Uighur\0"
-"Ukrainian\0"
-"Urdu\0"
-"Uzbek\0"
-"Vietnamese\0"
-"Volapuk\0"
-"Welsh\0"
-"Wolof\0"
-"Xhosa\0"
-"Yiddish\0"
-"Yoruba\0"
-"Zhuang\0"
-"Zulu\0"
-"Norwegian Nynorsk\0"
-"Bosnian\0"
-"Divehi\0"
-"Manx\0"
-"Cornish\0"
-"Akan\0"
-"Konkani\0"
-"Ga\0"
-"Igbo\0"
-"Kamba\0"
-"Syriac\0"
-"Blin\0"
-"Geez\0"
-"Koro\0"
-"Sidamo\0"
-"Atsam\0"
-"Tigre\0"
-"Jju\0"
-"Friulian\0"
-"Venda\0"
-"Ewe\0"
-"Walamo\0"
-"Hawaiian\0"
-"Tyap\0"
-"Nyanja\0"
-"Filipino\0"
-"Swiss German\0"
-"Sichuan Yi\0"
-"Kpelle\0"
-"Low German\0"
-"South Ndebele\0"
-"Northern Sotho\0"
-"Northern Sami\0"
-"Taroko\0"
-"Gusii\0"
-"Taita\0"
-"Fulah\0"
-"Kikuyu\0"
-"Samburu\0"
-"Sena\0"
-"North Ndebele\0"
-"Rombo\0"
-"Tachelhit\0"
-"Kabyle\0"
-"Nyankole\0"
-"Bena\0"
-"Vunjo\0"
-"Bambara\0"
-"Embu\0"
-"Cherokee\0"
-"Morisyen\0"
-"Makonde\0"
-"Langi\0"
-"Ganda\0"
-"Bemba\0"
-"Kabuverdianu\0"
-"Meru\0"
-"Kalenjin\0"
-"Nama\0"
-"Machame\0"
-"Colognian\0"
-"Masai\0"
-"Soga\0"
-"Luyia\0"
-"Asu\0"
-"Teso\0"
-"Saho\0"
-"Koyra Chiini\0"
-"Rwa\0"
-"Luo\0"
-"Chiga\0"
-"Central Morocco Tamazight\0"
-"Koyraboro Senni\0"
-"Shambala\0"
-"Bodo\0"
-"Avaric\0"
-"Chamorro\0"
-"Chechen\0"
-"Church\0"
-"Chuvash\0"
-"Cree\0"
-"Haitian\0"
-"Herero\0"
-"Hiri Motu\0"
-"Kanuri\0"
-"Komi\0"
-"Kongo\0"
-"Kwanyama\0"
-"Limburgish\0"
-"Luba Katanga\0"
-"Luxembourgish\0"
-"Navaho\0"
-"Ndonga\0"
-"Ojibwa\0"
-"Pali\0"
-"Walloon\0"
-"Aghem\0"
-"Basaa\0"
-"Zarma\0"
-"Duala\0"
-"Jola Fonyi\0"
-"Ewondo\0"
-"Bafia\0"
-"Makhuwa Meetto\0"
-"Mundang\0"
-"Kwasio\0"
-"Nuer\0"
-"Sakha\0"
-"Sangu\0"
-"Congo Swahili\0"
-"Tasawaq\0"
-"Vai\0"
-"Walser\0"
-"Yangben\0"
-"Avestan\0"
-"Asturian\0"
-"Ngomba\0"
-"Kako\0"
-"Meta\0"
-"Ngiemboon\0"
-"Aragonese\0"
-"Akkadian\0"
-"Ancient Egyptian\0"
-"Ancient Greek\0"
-"Aramaic\0"
-"Balinese\0"
-"Bamun\0"
-"Batak Toba\0"
-"Buginese\0"
-"Buhid\0"
-"Carian\0"
-"Chakma\0"
-"Classical Mandaic\0"
-"Coptic\0"
-"Dogri\0"
-"Eastern Cham\0"
-"Eastern Kayah\0"
-"Etruscan\0"
-"Gothic\0"
-"Hanunoo\0"
-"Ingush\0"
-"Large Flowery Miao\0"
-"Lepcha\0"
-"Limbu\0"
-"Lisu\0"
-"Lu\0"
-"Lycian\0"
-"Lydian\0"
-"Mandingo\0"
-"Manipuri\0"
-"Meroitic\0"
-"Northern Thai\0"
-"Old Irish\0"
-"Old Norse\0"
-"Old Persian\0"
-"Old Turkish\0"
-"Pahlavi\0"
-"Parthian\0"
-"Phoenician\0"
-"Prakrit Language\0"
-"Rejang\0"
-"Sabaean\0"
-"Samaritan\0"
-"Santali\0"
-"Saurashtra\0"
-"Sora\0"
-"Sylheti\0"
-"Tagbanwa\0"
-"Tai Dam\0"
-"Tai Nua\0"
-"Ugaritic\0"
-"Akoose\0"
-"Lakota\0"
-"Standard Moroccan Tamazight\0"
-"Mapuche\0"
-"Central Kurdish\0"
-"Lower Sorbian\0"
-"Upper Sorbian\0"
-"Kenyang\0"
-"Mohawk\0"
-"Nko\0"
-"Prussian\0"
-"Kiche\0"
-"Southern Sami\0"
-"Lule Sami\0"
-"Inari Sami\0"
-"Skolt Sami\0"
-"Warlpiri\0"
-"Manichaean Middle Persian\0"
-"Mende\0"
-"Ancient North Arabian\0"
-"Linear A\0"
-"Hmong Njua\0"
-"Ho\0"
-"Lezghian\0"
-"Bassa\0"
-"Mono\0"
-"Tedim Chin\0"
-"Maithili\0"
-"Ahom\0"
-"American Sign Language\0"
-"Ardhamagadhi Prakrit\0"
-"Bhojpuri\0"
-"Hieroglyphic Luwian\0"
-"Literary Chinese\0"
-"Mazanderani\0"
-"Mru\0"
-"Newari\0"
-"Northern Luri\0"
-"Palauan\0"
-"Papiamento\0"
-"Saraiki\0"
-"Tokelau\0"
-"Tok Pisin\0"
-"Tuvalu\0"
-"Uncoded Languages\0"
-"Cantonese\0"
-"Osage\0"
-"Tangut\0"
-"Ido\0"
-"Lojban\0"
-"Sicilian\0"
-"Southern Kurdish\0"
-"Western Balochi\0"
-;
-
-static const quint16 language_name_index[] = {
- 0, // AnyLanguage
- 8, // C
- 10, // Abkhazian
- 20, // Oromo
- 26, // Afar
- 31, // Afrikaans
- 41, // Albanian
- 50, // Amharic
- 58, // Arabic
- 65, // Armenian
- 74, // Assamese
- 83, // Aymara
- 90, // Azerbaijani
- 102, // Bashkir
- 110, // Basque
- 117, // Bengali
- 125, // Dzongkha
- 134, // Bihari
- 141, // Bislama
- 149, // Breton
- 156, // Bulgarian
- 166, // Burmese
- 174, // Belarusian
- 185, // Khmer
- 191, // Catalan
- 199, // Chinese
- 207, // Corsican
- 216, // Croatian
- 225, // Czech
- 231, // Danish
- 238, // Dutch
- 244, // English
- 252, // Esperanto
- 262, // Estonian
- 271, // Faroese
- 279, // Fijian
- 286, // Finnish
- 294, // French
- 301, // Western Frisian
- 317, // Gaelic
- 324, // Galician
- 333, // Georgian
- 342, // German
- 349, // Greek
- 355, // Greenlandic
- 367, // Guarani
- 375, // Gujarati
- 384, // Hausa
- 390, // Hebrew
- 397, // Hindi
- 403, // Hungarian
- 413, // Icelandic
- 423, // Indonesian
- 434, // Interlingua
- 446, // Interlingue
- 458, // Inuktitut
- 468, // Inupiak
- 476, // Irish
- 482, // Italian
- 490, // Japanese
- 499, // Javanese
- 508, // Kannada
- 516, // Kashmiri
- 525, // Kazakh
- 532, // Kinyarwanda
- 544, // Kirghiz
- 552, // Korean
- 559, // Kurdish
- 567, // Rundi
- 573, // Lao
- 577, // Latin
- 583, // Latvian
- 591, // Lingala
- 599, // Lithuanian
- 610, // Macedonian
- 621, // Malagasy
- 630, // Malay
- 636, // Malayalam
- 646, // Maltese
- 654, // Maori
- 660, // Marathi
- 668, // Marshallese
- 680, // Mongolian
- 690, // Nauru
- 696, // Nepali
- 703, // Norwegian Bokmal
- 720, // Occitan
- 728, // Oriya
- 734, // Pashto
- 741, // Persian
- 749, // Polish
- 756, // Portuguese
- 767, // Punjabi
- 775, // Quechua
- 783, // Romansh
- 791, // Romanian
- 800, // Russian
- 808, // Samoan
- 815, // Sango
- 821, // Sanskrit
- 830, // Serbian
- 838, // Ossetic
- 846, // Southern Sotho
- 861, // Tswana
- 868, // Shona
- 874, // Sindhi
- 881, // Sinhala
- 889, // Swati
- 895, // Slovak
- 902, // Slovenian
- 912, // Somali
- 919, // Spanish
- 927, // Sundanese
- 937, // Swahili
- 945, // Swedish
- 953, // Sardinian
- 963, // Tajik
- 969, // Tamil
- 975, // Tatar
- 981, // Telugu
- 988, // Thai
- 993, // Tibetan
- 1001, // Tigrinya
- 1010, // Tongan
- 1017, // Tsonga
- 1024, // Turkish
- 1032, // Turkmen
- 1040, // Tahitian
- 1049, // Uighur
- 1056, // Ukrainian
- 1066, // Urdu
- 1071, // Uzbek
- 1077, // Vietnamese
- 1088, // Volapuk
- 1096, // Welsh
- 1102, // Wolof
- 1108, // Xhosa
- 1114, // Yiddish
- 1122, // Yoruba
- 1129, // Zhuang
- 1136, // Zulu
- 1141, // Norwegian Nynorsk
- 1159, // Bosnian
- 1167, // Divehi
- 1174, // Manx
- 1179, // Cornish
- 1187, // Akan
- 1192, // Konkani
- 1200, // Ga
- 1203, // Igbo
- 1208, // Kamba
- 1214, // Syriac
- 1221, // Blin
- 1226, // Geez
- 1231, // Koro
- 1236, // Sidamo
- 1243, // Atsam
- 1249, // Tigre
- 1255, // Jju
- 1259, // Friulian
- 1268, // Venda
- 1274, // Ewe
- 1278, // Walamo
- 1285, // Hawaiian
- 1294, // Tyap
- 1299, // Nyanja
- 1306, // Filipino
- 1315, // Swiss German
- 1328, // Sichuan Yi
- 1339, // Kpelle
- 1346, // Low German
- 1357, // South Ndebele
- 1371, // Northern Sotho
- 1386, // Northern Sami
- 1400, // Taroko
- 1407, // Gusii
- 1413, // Taita
- 1419, // Fulah
- 1425, // Kikuyu
- 1432, // Samburu
- 1440, // Sena
- 1445, // North Ndebele
- 1459, // Rombo
- 1465, // Tachelhit
- 1475, // Kabyle
- 1482, // Nyankole
- 1491, // Bena
- 1496, // Vunjo
- 1502, // Bambara
- 1510, // Embu
- 1515, // Cherokee
- 1524, // Morisyen
- 1533, // Makonde
- 1541, // Langi
- 1547, // Ganda
- 1553, // Bemba
- 1559, // Kabuverdianu
- 1572, // Meru
- 1577, // Kalenjin
- 1586, // Nama
- 1591, // Machame
- 1599, // Colognian
- 1609, // Masai
- 1615, // Soga
- 1620, // Luyia
- 1626, // Asu
- 1630, // Teso
- 1635, // Saho
- 1640, // Koyra Chiini
- 1653, // Rwa
- 1657, // Luo
- 1661, // Chiga
- 1667, // Central Morocco Tamazight
- 1693, // Koyraboro Senni
- 1709, // Shambala
- 1718, // Bodo
- 1723, // Avaric
- 1730, // Chamorro
- 1739, // Chechen
- 1747, // Church
- 1754, // Chuvash
- 1762, // Cree
- 1767, // Haitian
- 1775, // Herero
- 1782, // Hiri Motu
- 1792, // Kanuri
- 1799, // Komi
- 1804, // Kongo
- 1810, // Kwanyama
- 1819, // Limburgish
- 1830, // Luba Katanga
- 1843, // Luxembourgish
- 1857, // Navaho
- 1864, // Ndonga
- 1871, // Ojibwa
- 1878, // Pali
- 1883, // Walloon
- 1891, // Aghem
- 1897, // Basaa
- 1903, // Zarma
- 1909, // Duala
- 1915, // Jola Fonyi
- 1926, // Ewondo
- 1933, // Bafia
- 1939, // Makhuwa Meetto
- 1954, // Mundang
- 1962, // Kwasio
- 1969, // Nuer
- 1974, // Sakha
- 1980, // Sangu
- 1986, // Congo Swahili
- 2000, // Tasawaq
- 2008, // Vai
- 2012, // Walser
- 2019, // Yangben
- 2027, // Avestan
- 2035, // Asturian
- 2044, // Ngomba
- 2051, // Kako
- 2056, // Meta
- 2061, // Ngiemboon
- 2071, // Aragonese
- 2081, // Akkadian
- 2090, // Ancient Egyptian
- 2107, // Ancient Greek
- 2121, // Aramaic
- 2129, // Balinese
- 2138, // Bamun
- 2144, // Batak Toba
- 2155, // Buginese
- 2164, // Buhid
- 2170, // Carian
- 2177, // Chakma
- 2184, // Classical Mandaic
- 2202, // Coptic
- 2209, // Dogri
- 2215, // Eastern Cham
- 2228, // Eastern Kayah
- 2242, // Etruscan
- 2251, // Gothic
- 2258, // Hanunoo
- 2266, // Ingush
- 2273, // Large Flowery Miao
- 2292, // Lepcha
- 2299, // Limbu
- 2305, // Lisu
- 2310, // Lu
- 2313, // Lycian
- 2320, // Lydian
- 2327, // Mandingo
- 2336, // Manipuri
- 2345, // Meroitic
- 2354, // Northern Thai
- 2368, // Old Irish
- 2378, // Old Norse
- 2388, // Old Persian
- 2400, // Old Turkish
- 2412, // Pahlavi
- 2420, // Parthian
- 2429, // Phoenician
- 2440, // Prakrit Language
- 2457, // Rejang
- 2464, // Sabaean
- 2472, // Samaritan
- 2482, // Santali
- 2490, // Saurashtra
- 2501, // Sora
- 2506, // Sylheti
- 2514, // Tagbanwa
- 2523, // Tai Dam
- 2531, // Tai Nua
- 2539, // Ugaritic
- 2548, // Akoose
- 2555, // Lakota
- 2562, // Standard Moroccan Tamazight
- 2590, // Mapuche
- 2598, // Central Kurdish
- 2614, // Lower Sorbian
- 2628, // Upper Sorbian
- 2642, // Kenyang
- 2650, // Mohawk
- 2657, // Nko
- 2661, // Prussian
- 2670, // Kiche
- 2676, // Southern Sami
- 2690, // Lule Sami
- 2700, // Inari Sami
- 2711, // Skolt Sami
- 2722, // Warlpiri
- 2731, // Manichaean Middle Persian
- 2757, // Mende
- 2763, // Ancient North Arabian
- 2785, // Linear A
- 2794, // Hmong Njua
- 2805, // Ho
- 2808, // Lezghian
- 2817, // Bassa
- 2823, // Mono
- 2828, // Tedim Chin
- 2839, // Maithili
- 2848, // Ahom
- 2853, // American Sign Language
- 2876, // Ardhamagadhi Prakrit
- 2897, // Bhojpuri
- 2906, // Hieroglyphic Luwian
- 2926, // Literary Chinese
- 2943, // Mazanderani
- 2955, // Mru
- 2959, // Newari
- 2966, // Northern Luri
- 2980, // Palauan
- 2988, // Papiamento
- 2999, // Saraiki
- 3007, // Tokelau
- 3015, // Tok Pisin
- 3025, // Tuvalu
- 3032, // Uncoded Languages
- 3050, // Cantonese
- 3060, // Osage
- 3066, // Tangut
- 3073, // Ido
- 3077, // Lojban
- 3084, // Sicilian
- 3093, // Southern Kurdish
- 3110, // Western Balochi
-};
-
-static const char script_name_list[] =
-"Default\0"
-"Arabic\0"
-"Cyrillic\0"
-"Deseret\0"
-"Gurmukhi\0"
-"Simplified Han\0"
-"Traditional Han\0"
-"Latin\0"
-"Mongolian\0"
-"Tifinagh\0"
-"Armenian\0"
-"Bengali\0"
-"Cherokee\0"
-"Devanagari\0"
-"Ethiopic\0"
-"Georgian\0"
-"Greek\0"
-"Gujarati\0"
-"Hebrew\0"
-"Japanese\0"
-"Khmer\0"
-"Kannada\0"
-"Korean\0"
-"Lao\0"
-"Malayalam\0"
-"Myanmar\0"
-"Oriya\0"
-"Tamil\0"
-"Telugu\0"
-"Thaana\0"
-"Thai\0"
-"Tibetan\0"
-"Sinhala\0"
-"Syriac\0"
-"Yi\0"
-"Vai\0"
-"Avestan\0"
-"Balinese\0"
-"Bamum\0"
-"Batak\0"
-"Bopomofo\0"
-"Brahmi\0"
-"Buginese\0"
-"Buhid\0"
-"Canadian Aboriginal\0"
-"Carian\0"
-"Chakma\0"
-"Cham\0"
-"Coptic\0"
-"Cypriot\0"
-"Egyptian Hieroglyphs\0"
-"Fraser\0"
-"Glagolitic\0"
-"Gothic\0"
-"Han\0"
-"Hangul\0"
-"Hanunoo\0"
-"Imperial Aramaic\0"
-"Inscriptional Pahlavi\0"
-"Inscriptional Parthian\0"
-"Javanese\0"
-"Kaithi\0"
-"Katakana\0"
-"Kayah Li\0"
-"Kharoshthi\0"
-"Lanna\0"
-"Lepcha\0"
-"Limbu\0"
-"Linear B\0"
-"Lycian\0"
-"Lydian\0"
-"Mandaean\0"
-"Meitei Mayek\0"
-"Meroitic\0"
-"Meroitic Cursive\0"
-"Nko\0"
-"New Tai Lue\0"
-"Ogham\0"
-"Ol Chiki\0"
-"Old Italic\0"
-"Old Persian\0"
-"Old South Arabian\0"
-"Orkhon\0"
-"Osmanya\0"
-"Phags Pa\0"
-"Phoenician\0"
-"Pollard Phonetic\0"
-"Rejang\0"
-"Runic\0"
-"Samaritan\0"
-"Saurashtra\0"
-"Sharada\0"
-"Shavian\0"
-"Sora Sompeng\0"
-"Cuneiform\0"
-"Sundanese\0"
-"Syloti Nagri\0"
-"Tagalog\0"
-"Tagbanwa\0"
-"Tai Le\0"
-"Tai Viet\0"
-"Takri\0"
-"Ugaritic\0"
-"Braille\0"
-"Hiragana\0"
-"Caucasian Albanian\0"
-"Bassa Vah\0"
-"Duployan\0"
-"Elbasan\0"
-"Grantha\0"
-"Pahawh Hmong\0"
-"Khojki\0"
-"Linear A\0"
-"Mahajani\0"
-"Manichaean\0"
-"Mende Kikakui\0"
-"Modi\0"
-"Mro\0"
-"Old North Arabian\0"
-"Nabataean\0"
-"Palmyrene\0"
-"Pau Cin Hau\0"
-"Old Permic\0"
-"Psalter Pahlavi\0"
-"Siddham\0"
-"Khudawadi\0"
-"Tirhuta\0"
-"Varang Kshiti\0"
-"Ahom\0"
-"Anatolian Hieroglyphs\0"
-"Hatran\0"
-"Multani\0"
-"Old Hungarian\0"
-"Sign Writing\0"
-"Adlam\0"
-"Bhaiksuki\0"
-"Marchen\0"
-"Newa\0"
-"Osage\0"
-"Tangut\0"
-"Han with Bopomofo\0"
-"Jamo\0"
-;
-
-static const quint16 script_name_index[] = {
- 0, // AnyScript
- 8, // Arabic
- 15, // Cyrillic
- 24, // Deseret
- 32, // Gurmukhi
- 41, // Simplified Han
- 56, // Traditional Han
- 72, // Latin
- 78, // Mongolian
- 88, // Tifinagh
- 97, // Armenian
- 106, // Bengali
- 114, // Cherokee
- 123, // Devanagari
- 134, // Ethiopic
- 143, // Georgian
- 152, // Greek
- 158, // Gujarati
- 167, // Hebrew
- 174, // Japanese
- 183, // Khmer
- 189, // Kannada
- 197, // Korean
- 204, // Lao
- 208, // Malayalam
- 218, // Myanmar
- 226, // Oriya
- 232, // Tamil
- 238, // Telugu
- 245, // Thaana
- 252, // Thai
- 257, // Tibetan
- 265, // Sinhala
- 273, // Syriac
- 280, // Yi
- 283, // Vai
- 287, // Avestan
- 295, // Balinese
- 304, // Bamum
- 310, // Batak
- 316, // Bopomofo
- 325, // Brahmi
- 332, // Buginese
- 341, // Buhid
- 347, // Canadian Aboriginal
- 367, // Carian
- 374, // Chakma
- 381, // Cham
- 386, // Coptic
- 393, // Cypriot
- 401, // Egyptian Hieroglyphs
- 422, // Fraser
- 429, // Glagolitic
- 440, // Gothic
- 447, // Han
- 451, // Hangul
- 458, // Hanunoo
- 466, // Imperial Aramaic
- 483, // Inscriptional Pahlavi
- 505, // Inscriptional Parthian
- 528, // Javanese
- 537, // Kaithi
- 544, // Katakana
- 553, // Kayah Li
- 562, // Kharoshthi
- 573, // Lanna
- 579, // Lepcha
- 586, // Limbu
- 592, // Linear B
- 601, // Lycian
- 608, // Lydian
- 615, // Mandaean
- 624, // Meitei Mayek
- 637, // Meroitic
- 646, // Meroitic Cursive
- 663, // Nko
- 667, // New Tai Lue
- 679, // Ogham
- 685, // Ol Chiki
- 694, // Old Italic
- 705, // Old Persian
- 717, // Old South Arabian
- 735, // Orkhon
- 742, // Osmanya
- 750, // Phags Pa
- 759, // Phoenician
- 770, // Pollard Phonetic
- 787, // Rejang
- 794, // Runic
- 800, // Samaritan
- 810, // Saurashtra
- 821, // Sharada
- 829, // Shavian
- 837, // Sora Sompeng
- 850, // Cuneiform
- 860, // Sundanese
- 870, // Syloti Nagri
- 883, // Tagalog
- 891, // Tagbanwa
- 900, // Tai Le
- 907, // Tai Viet
- 916, // Takri
- 922, // Ugaritic
- 931, // Braille
- 939, // Hiragana
- 948, // Caucasian Albanian
- 967, // Bassa Vah
- 977, // Duployan
- 986, // Elbasan
- 994, // Grantha
- 1002, // Pahawh Hmong
- 1015, // Khojki
- 1022, // Linear A
- 1031, // Mahajani
- 1040, // Manichaean
- 1051, // Mende Kikakui
- 1065, // Modi
- 1070, // Mro
- 1074, // Old North Arabian
- 1092, // Nabataean
- 1102, // Palmyrene
- 1112, // Pau Cin Hau
- 1124, // Old Permic
- 1135, // Psalter Pahlavi
- 1151, // Siddham
- 1159, // Khudawadi
- 1169, // Tirhuta
- 1177, // Varang Kshiti
- 1191, // Ahom
- 1196, // Anatolian Hieroglyphs
- 1218, // Hatran
- 1225, // Multani
- 1233, // Old Hungarian
- 1247, // Sign Writing
- 1260, // Adlam
- 1266, // Bhaiksuki
- 1276, // Marchen
- 1284, // Newa
- 1289, // Osage
- 1295, // Tangut
- 1302, // Han with Bopomofo
- 1320, // Jamo
-};
-
-static const char country_name_list[] =
-"Default\0"
-"Afghanistan\0"
-"Albania\0"
-"Algeria\0"
-"American Samoa\0"
-"Andorra\0"
-"Angola\0"
-"Anguilla\0"
-"Antarctica\0"
-"Antigua And Barbuda\0"
-"Argentina\0"
-"Armenia\0"
-"Aruba\0"
-"Australia\0"
-"Austria\0"
-"Azerbaijan\0"
-"Bahamas\0"
-"Bahrain\0"
-"Bangladesh\0"
-"Barbados\0"
-"Belarus\0"
-"Belgium\0"
-"Belize\0"
-"Benin\0"
-"Bermuda\0"
-"Bhutan\0"
-"Bolivia\0"
-"Bosnia And Herzegowina\0"
-"Botswana\0"
-"Bouvet Island\0"
-"Brazil\0"
-"British Indian Ocean Territory\0"
-"Brunei\0"
-"Bulgaria\0"
-"Burkina Faso\0"
-"Burundi\0"
-"Cambodia\0"
-"Cameroon\0"
-"Canada\0"
-"Cape Verde\0"
-"Cayman Islands\0"
-"Central African Republic\0"
-"Chad\0"
-"Chile\0"
-"China\0"
-"Christmas Island\0"
-"Cocos Islands\0"
-"Colombia\0"
-"Comoros\0"
-"Congo Kinshasa\0"
-"Congo Brazzaville\0"
-"Cook Islands\0"
-"Costa Rica\0"
-"Ivory Coast\0"
-"Croatia\0"
-"Cuba\0"
-"Cyprus\0"
-"Czech Republic\0"
-"Denmark\0"
-"Djibouti\0"
-"Dominica\0"
-"Dominican Republic\0"
-"East Timor\0"
-"Ecuador\0"
-"Egypt\0"
-"El Salvador\0"
-"Equatorial Guinea\0"
-"Eritrea\0"
-"Estonia\0"
-"Ethiopia\0"
-"Falkland Islands\0"
-"Faroe Islands\0"
-"Fiji\0"
-"Finland\0"
-"France\0"
-"Guernsey\0"
-"French Guiana\0"
-"French Polynesia\0"
-"French Southern Territories\0"
-"Gabon\0"
-"Gambia\0"
-"Georgia\0"
-"Germany\0"
-"Ghana\0"
-"Gibraltar\0"
-"Greece\0"
-"Greenland\0"
-"Grenada\0"
-"Guadeloupe\0"
-"Guam\0"
-"Guatemala\0"
-"Guinea\0"
-"Guinea Bissau\0"
-"Guyana\0"
-"Haiti\0"
-"Heard And McDonald Islands\0"
-"Honduras\0"
-"Hong Kong\0"
-"Hungary\0"
-"Iceland\0"
-"India\0"
-"Indonesia\0"
-"Iran\0"
-"Iraq\0"
-"Ireland\0"
-"Israel\0"
-"Italy\0"
-"Jamaica\0"
-"Japan\0"
-"Jordan\0"
-"Kazakhstan\0"
-"Kenya\0"
-"Kiribati\0"
-"North Korea\0"
-"South Korea\0"
-"Kuwait\0"
-"Kyrgyzstan\0"
-"Laos\0"
-"Latvia\0"
-"Lebanon\0"
-"Lesotho\0"
-"Liberia\0"
-"Libya\0"
-"Liechtenstein\0"
-"Lithuania\0"
-"Luxembourg\0"
-"Macau\0"
-"Macedonia\0"
-"Madagascar\0"
-"Malawi\0"
-"Malaysia\0"
-"Maldives\0"
-"Mali\0"
-"Malta\0"
-"Marshall Islands\0"
-"Martinique\0"
-"Mauritania\0"
-"Mauritius\0"
-"Mayotte\0"
-"Mexico\0"
-"Micronesia\0"
-"Moldova\0"
-"Monaco\0"
-"Mongolia\0"
-"Montserrat\0"
-"Morocco\0"
-"Mozambique\0"
-"Myanmar\0"
-"Namibia\0"
-"Nauru\0"
-"Nepal\0"
-"Netherlands\0"
-"Cura Sao\0"
-"New Caledonia\0"
-"New Zealand\0"
-"Nicaragua\0"
-"Niger\0"
-"Nigeria\0"
-"Niue\0"
-"Norfolk Island\0"
-"Northern Mariana Islands\0"
-"Norway\0"
-"Oman\0"
-"Pakistan\0"
-"Palau\0"
-"Palestinian Territories\0"
-"Panama\0"
-"Papua New Guinea\0"
-"Paraguay\0"
-"Peru\0"
-"Philippines\0"
-"Pitcairn\0"
-"Poland\0"
-"Portugal\0"
-"Puerto Rico\0"
-"Qatar\0"
-"Reunion\0"
-"Romania\0"
-"Russia\0"
-"Rwanda\0"
-"Saint Kitts And Nevis\0"
-"Saint Lucia\0"
-"Saint Vincent And The Grenadines\0"
-"Samoa\0"
-"San Marino\0"
-"Sao Tome And Principe\0"
-"Saudi Arabia\0"
-"Senegal\0"
-"Seychelles\0"
-"Sierra Leone\0"
-"Singapore\0"
-"Slovakia\0"
-"Slovenia\0"
-"Solomon Islands\0"
-"Somalia\0"
-"South Africa\0"
-"South Georgia And The South Sandwich Islands\0"
-"Spain\0"
-"Sri Lanka\0"
-"Saint Helena\0"
-"Saint Pierre And Miquelon\0"
-"Sudan\0"
-"Suriname\0"
-"Svalbard And Jan Mayen Islands\0"
-"Swaziland\0"
-"Sweden\0"
-"Switzerland\0"
-"Syria\0"
-"Taiwan\0"
-"Tajikistan\0"
-"Tanzania\0"
-"Thailand\0"
-"Togo\0"
-"Tokelau\0"
-"Tonga\0"
-"Trinidad And Tobago\0"
-"Tunisia\0"
-"Turkey\0"
-"Turkmenistan\0"
-"Turks And Caicos Islands\0"
-"Tuvalu\0"
-"Uganda\0"
-"Ukraine\0"
-"United Arab Emirates\0"
-"United Kingdom\0"
-"United States\0"
-"United States Minor Outlying Islands\0"
-"Uruguay\0"
-"Uzbekistan\0"
-"Vanuatu\0"
-"Vatican City State\0"
-"Venezuela\0"
-"Vietnam\0"
-"British Virgin Islands\0"
-"United States Virgin Islands\0"
-"Wallis And Futuna Islands\0"
-"Western Sahara\0"
-"Yemen\0"
-"Canary Islands\0"
-"Zambia\0"
-"Zimbabwe\0"
-"Clipperton Island\0"
-"Montenegro\0"
-"Serbia\0"
-"Saint Barthelemy\0"
-"Saint Martin\0"
-"Latin America\0"
-"Ascension Island\0"
-"Aland Islands\0"
-"Diego Garcia\0"
-"Ceuta And Melilla\0"
-"Isle Of Man\0"
-"Jersey\0"
-"Tristan Da Cunha\0"
-"South Sudan\0"
-"Bonaire\0"
-"Sint Maarten\0"
-"Kosovo\0"
-"European Union\0"
-"Outlying Oceania\0"
-"World\0"
-"Europe\0"
-;
-
-static const quint16 country_name_index[] = {
- 0, // AnyCountry
- 8, // Afghanistan
- 20, // Albania
- 28, // Algeria
- 36, // American Samoa
- 51, // Andorra
- 59, // Angola
- 66, // Anguilla
- 75, // Antarctica
- 86, // Antigua And Barbuda
- 106, // Argentina
- 116, // Armenia
- 124, // Aruba
- 130, // Australia
- 140, // Austria
- 148, // Azerbaijan
- 159, // Bahamas
- 167, // Bahrain
- 175, // Bangladesh
- 186, // Barbados
- 195, // Belarus
- 203, // Belgium
- 211, // Belize
- 218, // Benin
- 224, // Bermuda
- 232, // Bhutan
- 239, // Bolivia
- 247, // Bosnia And Herzegowina
- 270, // Botswana
- 279, // Bouvet Island
- 293, // Brazil
- 300, // British Indian Ocean Territory
- 331, // Brunei
- 338, // Bulgaria
- 347, // Burkina Faso
- 360, // Burundi
- 368, // Cambodia
- 377, // Cameroon
- 386, // Canada
- 393, // Cape Verde
- 404, // Cayman Islands
- 419, // Central African Republic
- 444, // Chad
- 449, // Chile
- 455, // China
- 461, // Christmas Island
- 478, // Cocos Islands
- 492, // Colombia
- 501, // Comoros
- 509, // Congo Kinshasa
- 524, // Congo Brazzaville
- 542, // Cook Islands
- 555, // Costa Rica
- 566, // Ivory Coast
- 578, // Croatia
- 586, // Cuba
- 591, // Cyprus
- 598, // Czech Republic
- 613, // Denmark
- 621, // Djibouti
- 630, // Dominica
- 639, // Dominican Republic
- 658, // East Timor
- 669, // Ecuador
- 677, // Egypt
- 683, // El Salvador
- 695, // Equatorial Guinea
- 713, // Eritrea
- 721, // Estonia
- 729, // Ethiopia
- 738, // Falkland Islands
- 755, // Faroe Islands
- 769, // Fiji
- 774, // Finland
- 782, // France
- 789, // Guernsey
- 798, // French Guiana
- 812, // French Polynesia
- 829, // French Southern Territories
- 857, // Gabon
- 863, // Gambia
- 870, // Georgia
- 878, // Germany
- 886, // Ghana
- 892, // Gibraltar
- 902, // Greece
- 909, // Greenland
- 919, // Grenada
- 927, // Guadeloupe
- 938, // Guam
- 943, // Guatemala
- 953, // Guinea
- 960, // Guinea Bissau
- 974, // Guyana
- 981, // Haiti
- 987, // Heard And McDonald Islands
- 1014, // Honduras
- 1023, // Hong Kong
- 1033, // Hungary
- 1041, // Iceland
- 1049, // India
- 1055, // Indonesia
- 1065, // Iran
- 1070, // Iraq
- 1075, // Ireland
- 1083, // Israel
- 1090, // Italy
- 1096, // Jamaica
- 1104, // Japan
- 1110, // Jordan
- 1117, // Kazakhstan
- 1128, // Kenya
- 1134, // Kiribati
- 1143, // North Korea
- 1155, // South Korea
- 1167, // Kuwait
- 1174, // Kyrgyzstan
- 1185, // Laos
- 1190, // Latvia
- 1197, // Lebanon
- 1205, // Lesotho
- 1213, // Liberia
- 1221, // Libya
- 1227, // Liechtenstein
- 1241, // Lithuania
- 1251, // Luxembourg
- 1262, // Macau
- 1268, // Macedonia
- 1278, // Madagascar
- 1289, // Malawi
- 1296, // Malaysia
- 1305, // Maldives
- 1314, // Mali
- 1319, // Malta
- 1325, // Marshall Islands
- 1342, // Martinique
- 1353, // Mauritania
- 1364, // Mauritius
- 1374, // Mayotte
- 1382, // Mexico
- 1389, // Micronesia
- 1400, // Moldova
- 1408, // Monaco
- 1415, // Mongolia
- 1424, // Montserrat
- 1435, // Morocco
- 1443, // Mozambique
- 1454, // Myanmar
- 1462, // Namibia
- 1470, // Nauru
- 1476, // Nepal
- 1482, // Netherlands
- 1494, // Cura Sao
- 1503, // New Caledonia
- 1517, // New Zealand
- 1529, // Nicaragua
- 1539, // Niger
- 1545, // Nigeria
- 1553, // Niue
- 1558, // Norfolk Island
- 1573, // Northern Mariana Islands
- 1598, // Norway
- 1605, // Oman
- 1610, // Pakistan
- 1619, // Palau
- 1625, // Palestinian Territories
- 1649, // Panama
- 1656, // Papua New Guinea
- 1673, // Paraguay
- 1682, // Peru
- 1687, // Philippines
- 1699, // Pitcairn
- 1708, // Poland
- 1715, // Portugal
- 1724, // Puerto Rico
- 1736, // Qatar
- 1742, // Reunion
- 1750, // Romania
- 1758, // Russia
- 1765, // Rwanda
- 1772, // Saint Kitts And Nevis
- 1794, // Saint Lucia
- 1806, // Saint Vincent And The Grenadines
- 1839, // Samoa
- 1845, // San Marino
- 1856, // Sao Tome And Principe
- 1878, // Saudi Arabia
- 1891, // Senegal
- 1899, // Seychelles
- 1910, // Sierra Leone
- 1923, // Singapore
- 1933, // Slovakia
- 1942, // Slovenia
- 1951, // Solomon Islands
- 1967, // Somalia
- 1975, // South Africa
- 1988, // South Georgia And The South Sandwich Islands
- 2033, // Spain
- 2039, // Sri Lanka
- 2049, // Saint Helena
- 2062, // Saint Pierre And Miquelon
- 2088, // Sudan
- 2094, // Suriname
- 2103, // Svalbard And Jan Mayen Islands
- 2134, // Swaziland
- 2144, // Sweden
- 2151, // Switzerland
- 2163, // Syria
- 2169, // Taiwan
- 2176, // Tajikistan
- 2187, // Tanzania
- 2196, // Thailand
- 2205, // Togo
- 2210, // Tokelau
- 2218, // Tonga
- 2224, // Trinidad And Tobago
- 2244, // Tunisia
- 2252, // Turkey
- 2259, // Turkmenistan
- 2272, // Turks And Caicos Islands
- 2297, // Tuvalu
- 2304, // Uganda
- 2311, // Ukraine
- 2319, // United Arab Emirates
- 2340, // United Kingdom
- 2355, // United States
- 2369, // United States Minor Outlying Islands
- 2406, // Uruguay
- 2414, // Uzbekistan
- 2425, // Vanuatu
- 2433, // Vatican City State
- 2452, // Venezuela
- 2462, // Vietnam
- 2470, // British Virgin Islands
- 2493, // United States Virgin Islands
- 2522, // Wallis And Futuna Islands
- 2548, // Western Sahara
- 2563, // Yemen
- 2569, // Canary Islands
- 2584, // Zambia
- 2591, // Zimbabwe
- 2600, // Clipperton Island
- 2618, // Montenegro
- 2629, // Serbia
- 2636, // Saint Barthelemy
- 2653, // Saint Martin
- 2666, // Latin America
- 2680, // Ascension Island
- 2697, // Aland Islands
- 2711, // Diego Garcia
- 2724, // Ceuta And Melilla
- 2742, // Isle Of Man
- 2754, // Jersey
- 2761, // Tristan Da Cunha
- 2778, // South Sudan
- 2790, // Bonaire
- 2798, // Sint Maarten
- 2811, // Kosovo
- 2818, // European Union
- 2833, // Outlying Oceania
- 2850, // World
- 2856, // Europe
-};
-
-static const unsigned char language_code_list[] =
-" \0" // AnyLanguage
-" \0" // C
-"ab\0" // Abkhazian
-"om\0" // Oromo
-"aa\0" // Afar
-"af\0" // Afrikaans
-"sq\0" // Albanian
-"am\0" // Amharic
-"ar\0" // Arabic
-"hy\0" // Armenian
-"as\0" // Assamese
-"ay\0" // Aymara
-"az\0" // Azerbaijani
-"ba\0" // Bashkir
-"eu\0" // Basque
-"bn\0" // Bengali
-"dz\0" // Dzongkha
-"bh\0" // Bihari
-"bi\0" // Bislama
-"br\0" // Breton
-"bg\0" // Bulgarian
-"my\0" // Burmese
-"be\0" // Belarusian
-"km\0" // Khmer
-"ca\0" // Catalan
-"zh\0" // Chinese
-"co\0" // Corsican
-"hr\0" // Croatian
-"cs\0" // Czech
-"da\0" // Danish
-"nl\0" // Dutch
-"en\0" // English
-"eo\0" // Esperanto
-"et\0" // Estonian
-"fo\0" // Faroese
-"fj\0" // Fijian
-"fi\0" // Finnish
-"fr\0" // French
-"fy\0" // Western Frisian
-"gd\0" // Gaelic
-"gl\0" // Galician
-"ka\0" // Georgian
-"de\0" // German
-"el\0" // Greek
-"kl\0" // Greenlandic
-"gn\0" // Guarani
-"gu\0" // Gujarati
-"ha\0" // Hausa
-"he\0" // Hebrew
-"hi\0" // Hindi
-"hu\0" // Hungarian
-"is\0" // Icelandic
-"id\0" // Indonesian
-"ia\0" // Interlingua
-"ie\0" // Interlingue
-"iu\0" // Inuktitut
-"ik\0" // Inupiak
-"ga\0" // Irish
-"it\0" // Italian
-"ja\0" // Japanese
-"jv\0" // Javanese
-"kn\0" // Kannada
-"ks\0" // Kashmiri
-"kk\0" // Kazakh
-"rw\0" // Kinyarwanda
-"ky\0" // Kirghiz
-"ko\0" // Korean
-"ku\0" // Kurdish
-"rn\0" // Rundi
-"lo\0" // Lao
-"la\0" // Latin
-"lv\0" // Latvian
-"ln\0" // Lingala
-"lt\0" // Lithuanian
-"mk\0" // Macedonian
-"mg\0" // Malagasy
-"ms\0" // Malay
-"ml\0" // Malayalam
-"mt\0" // Maltese
-"mi\0" // Maori
-"mr\0" // Marathi
-"mh\0" // Marshallese
-"mn\0" // Mongolian
-"na\0" // Nauru
-"ne\0" // Nepali
-"nb\0" // Norwegian Bokmal
-"oc\0" // Occitan
-"or\0" // Oriya
-"ps\0" // Pashto
-"fa\0" // Persian
-"pl\0" // Polish
-"pt\0" // Portuguese
-"pa\0" // Punjabi
-"qu\0" // Quechua
-"rm\0" // Romansh
-"ro\0" // Romanian
-"ru\0" // Russian
-"sm\0" // Samoan
-"sg\0" // Sango
-"sa\0" // Sanskrit
-"sr\0" // Serbian
-"os\0" // Ossetic
-"st\0" // Southern Sotho
-"tn\0" // Tswana
-"sn\0" // Shona
-"sd\0" // Sindhi
-"si\0" // Sinhala
-"ss\0" // Swati
-"sk\0" // Slovak
-"sl\0" // Slovenian
-"so\0" // Somali
-"es\0" // Spanish
-"su\0" // Sundanese
-"sw\0" // Swahili
-"sv\0" // Swedish
-"sc\0" // Sardinian
-"tg\0" // Tajik
-"ta\0" // Tamil
-"tt\0" // Tatar
-"te\0" // Telugu
-"th\0" // Thai
-"bo\0" // Tibetan
-"ti\0" // Tigrinya
-"to\0" // Tongan
-"ts\0" // Tsonga
-"tr\0" // Turkish
-"tk\0" // Turkmen
-"ty\0" // Tahitian
-"ug\0" // Uighur
-"uk\0" // Ukrainian
-"ur\0" // Urdu
-"uz\0" // Uzbek
-"vi\0" // Vietnamese
-"vo\0" // Volapuk
-"cy\0" // Welsh
-"wo\0" // Wolof
-"xh\0" // Xhosa
-"yi\0" // Yiddish
-"yo\0" // Yoruba
-"za\0" // Zhuang
-"zu\0" // Zulu
-"nn\0" // Norwegian Nynorsk
-"bs\0" // Bosnian
-"dv\0" // Divehi
-"gv\0" // Manx
-"kw\0" // Cornish
-"ak\0" // Akan
-"kok" // Konkani
-"gaa" // Ga
-"ig\0" // Igbo
-"kam" // Kamba
-"syr" // Syriac
-"byn" // Blin
-"gez" // Geez
-"kfo" // Koro
-"sid" // Sidamo
-"cch" // Atsam
-"tig" // Tigre
-"kaj" // Jju
-"fur" // Friulian
-"ve\0" // Venda
-"ee\0" // Ewe
-"wal" // Walamo
-"haw" // Hawaiian
-"kcg" // Tyap
-"ny\0" // Nyanja
-"fil" // Filipino
-"gsw" // Swiss German
-"ii\0" // Sichuan Yi
-"kpe" // Kpelle
-"nds" // Low German
-"nr\0" // South Ndebele
-"nso" // Northern Sotho
-"se\0" // Northern Sami
-"trv" // Taroko
-"guz" // Gusii
-"dav" // Taita
-"ff\0" // Fulah
-"ki\0" // Kikuyu
-"saq" // Samburu
-"seh" // Sena
-"nd\0" // North Ndebele
-"rof" // Rombo
-"shi" // Tachelhit
-"kab" // Kabyle
-"nyn" // Nyankole
-"bez" // Bena
-"vun" // Vunjo
-"bm\0" // Bambara
-"ebu" // Embu
-"chr" // Cherokee
-"mfe" // Morisyen
-"kde" // Makonde
-"lag" // Langi
-"lg\0" // Ganda
-"bem" // Bemba
-"kea" // Kabuverdianu
-"mer" // Meru
-"kln" // Kalenjin
-"naq" // Nama
-"jmc" // Machame
-"ksh" // Colognian
-"mas" // Masai
-"xog" // Soga
-"luy" // Luyia
-"asa" // Asu
-"teo" // Teso
-"ssy" // Saho
-"khq" // Koyra Chiini
-"rwk" // Rwa
-"luo" // Luo
-"cgg" // Chiga
-"tzm" // Central Morocco Tamazight
-"ses" // Koyraboro Senni
-"ksb" // Shambala
-"brx" // Bodo
-"av\0" // Avaric
-"ch\0" // Chamorro
-"ce\0" // Chechen
-"cu\0" // Church
-"cv\0" // Chuvash
-"cr\0" // Cree
-"ht\0" // Haitian
-"hz\0" // Herero
-"ho\0" // Hiri Motu
-"kr\0" // Kanuri
-"kv\0" // Komi
-"kg\0" // Kongo
-"kj\0" // Kwanyama
-"li\0" // Limburgish
-"lu\0" // Luba Katanga
-"lb\0" // Luxembourgish
-"nv\0" // Navaho
-"ng\0" // Ndonga
-"oj\0" // Ojibwa
-"pi\0" // Pali
-"wa\0" // Walloon
-"agq" // Aghem
-"bas" // Basaa
-"dje" // Zarma
-"dua" // Duala
-"dyo" // Jola Fonyi
-"ewo" // Ewondo
-"ksf" // Bafia
-"mgh" // Makhuwa Meetto
-"mua" // Mundang
-"nmg" // Kwasio
-"nus" // Nuer
-"sah" // Sakha
-"sbp" // Sangu
-"swc" // Congo Swahili
-"twq" // Tasawaq
-"vai" // Vai
-"wae" // Walser
-"yav" // Yangben
-"ae\0" // Avestan
-"ast" // Asturian
-"jgo" // Ngomba
-"kkj" // Kako
-"mgo" // Meta
-"nnh" // Ngiemboon
-"an\0" // Aragonese
-"akk" // Akkadian
-"egy" // Ancient Egyptian
-"grc" // Ancient Greek
-"arc" // Aramaic
-"ban" // Balinese
-"bax" // Bamun
-"bbc" // Batak Toba
-"bug" // Buginese
-"bku" // Buhid
-"xcr" // Carian
-"ccp" // Chakma
-"myz" // Classical Mandaic
-"cop" // Coptic
-"doi" // Dogri
-"cjm" // Eastern Cham
-"eky" // Eastern Kayah
-"ett" // Etruscan
-"got" // Gothic
-"hnn" // Hanunoo
-"inh" // Ingush
-"hmd" // Large Flowery Miao
-"lep" // Lepcha
-"lif" // Limbu
-"lis" // Lisu
-"khb" // Lu
-"xlc" // Lycian
-"xld" // Lydian
-"man" // Mandingo
-"mni" // Manipuri
-"xmr" // Meroitic
-"nod" // Northern Thai
-"sga" // Old Irish
-"non" // Old Norse
-"peo" // Old Persian
-"otk" // Old Turkish
-"pal" // Pahlavi
-"xpr" // Parthian
-"phn" // Phoenician
-"pra" // Prakrit Language
-"rej" // Rejang
-"xsa" // Sabaean
-"smp" // Samaritan
-"sat" // Santali
-"saz" // Saurashtra
-"srb" // Sora
-"syl" // Sylheti
-"tbw" // Tagbanwa
-"blt" // Tai Dam
-"tdd" // Tai Nua
-"uga" // Ugaritic
-"bss" // Akoose
-"lkt" // Lakota
-"zgh" // Standard Moroccan Tamazight
-"arn" // Mapuche
-"ckb" // Central Kurdish
-"dsb" // Lower Sorbian
-"hsb" // Upper Sorbian
-"ken" // Kenyang
-"moh" // Mohawk
-"nqo" // Nko
-"prg" // Prussian
-"quc" // Kiche
-"sma" // Southern Sami
-"smj" // Lule Sami
-"smn" // Inari Sami
-"sms" // Skolt Sami
-"wbp" // Warlpiri
-"xmn" // Manichaean Middle Persian
-"men" // Mende
-"xna" // Ancient North Arabian
-"lab" // Linear A
-"hnj" // Hmong Njua
-"hoc" // Ho
-"lez" // Lezghian
-"bsq" // Bassa
-"mru" // Mono
-"ctd" // Tedim Chin
-"mai" // Maithili
-"aho" // Ahom
-"ase" // American Sign Language
-"pka" // Ardhamagadhi Prakrit
-"bho" // Bhojpuri
-"hlu" // Hieroglyphic Luwian
-"lzh" // Literary Chinese
-"mzn" // Mazanderani
-"mro" // Mru
-"new" // Newari
-"lrc" // Northern Luri
-"pau" // Palauan
-"pap" // Papiamento
-"skr" // Saraiki
-"tkl" // Tokelau
-"tpi" // Tok Pisin
-"tvl" // Tuvalu
-"mis" // Uncoded Languages
-"yue" // Cantonese
-"osa" // Osage
-"txg" // Tangut
-"io\0" // Ido
-"jbo" // Lojban
-"scn" // Sicilian
-"sdh" // Southern Kurdish
-"bgn" // Western Balochi
-;
-
-static const unsigned char script_code_list[] =
-"Zzzz" // AnyScript
-"Arab" // Arabic
-"Cyrl" // Cyrillic
-"Dsrt" // Deseret
-"Guru" // Gurmukhi
-"Hans" // Simplified Han
-"Hant" // Traditional Han
-"Latn" // Latin
-"Mong" // Mongolian
-"Tfng" // Tifinagh
-"Armn" // Armenian
-"Beng" // Bengali
-"Cher" // Cherokee
-"Deva" // Devanagari
-"Ethi" // Ethiopic
-"Geor" // Georgian
-"Grek" // Greek
-"Gujr" // Gujarati
-"Hebr" // Hebrew
-"Jpan" // Japanese
-"Khmr" // Khmer
-"Knda" // Kannada
-"Kore" // Korean
-"Laoo" // Lao
-"Mlym" // Malayalam
-"Mymr" // Myanmar
-"Orya" // Oriya
-"Taml" // Tamil
-"Telu" // Telugu
-"Thaa" // Thaana
-"Thai" // Thai
-"Tibt" // Tibetan
-"Sinh" // Sinhala
-"Syrc" // Syriac
-"Yiii" // Yi
-"Vaii" // Vai
-"Avst" // Avestan
-"Bali" // Balinese
-"Bamu" // Bamum
-"Batk" // Batak
-"Bopo" // Bopomofo
-"Brah" // Brahmi
-"Bugi" // Buginese
-"Buhd" // Buhid
-"Cans" // Canadian Aboriginal
-"Cari" // Carian
-"Cakm" // Chakma
-"Cham" // Cham
-"Copt" // Coptic
-"Cprt" // Cypriot
-"Egyp" // Egyptian Hieroglyphs
-"Lisu" // Fraser
-"Glag" // Glagolitic
-"Goth" // Gothic
-"Hani" // Han
-"Hang" // Hangul
-"Hano" // Hanunoo
-"Armi" // Imperial Aramaic
-"Phli" // Inscriptional Pahlavi
-"Prti" // Inscriptional Parthian
-"Java" // Javanese
-"Kthi" // Kaithi
-"Kana" // Katakana
-"Kali" // Kayah Li
-"Khar" // Kharoshthi
-"Lana" // Lanna
-"Lepc" // Lepcha
-"Limb" // Limbu
-"Linb" // Linear B
-"Lyci" // Lycian
-"Lydi" // Lydian
-"Mand" // Mandaean
-"Mtei" // Meitei Mayek
-"Mero" // Meroitic
-"Merc" // Meroitic Cursive
-"Nkoo" // Nko
-"Talu" // New Tai Lue
-"Ogam" // Ogham
-"Olck" // Ol Chiki
-"Ital" // Old Italic
-"Xpeo" // Old Persian
-"Sarb" // Old South Arabian
-"Orkh" // Orkhon
-"Osma" // Osmanya
-"Phag" // Phags Pa
-"Phnx" // Phoenician
-"Plrd" // Pollard Phonetic
-"Rjng" // Rejang
-"Runr" // Runic
-"Samr" // Samaritan
-"Saur" // Saurashtra
-"Shrd" // Sharada
-"Shaw" // Shavian
-"Sora" // Sora Sompeng
-"Xsux" // Cuneiform
-"Sund" // Sundanese
-"Sylo" // Syloti Nagri
-"Tglg" // Tagalog
-"Tagb" // Tagbanwa
-"Tale" // Tai Le
-"Tavt" // Tai Viet
-"Takr" // Takri
-"Ugar" // Ugaritic
-"Brai" // Braille
-"Hira" // Hiragana
-"Aghb" // Caucasian Albanian
-"Bass" // Bassa Vah
-"Dupl" // Duployan
-"Elba" // Elbasan
-"Gran" // Grantha
-"Hmng" // Pahawh Hmong
-"Khoj" // Khojki
-"Lina" // Linear A
-"Mahj" // Mahajani
-"Mani" // Manichaean
-"Mend" // Mende Kikakui
-"Modi" // Modi
-"Mroo" // Mro
-"Narb" // Old North Arabian
-"Nbat" // Nabataean
-"Palm" // Palmyrene
-"Pauc" // Pau Cin Hau
-"Perm" // Old Permic
-"Phlp" // Psalter Pahlavi
-"Sidd" // Siddham
-"Sind" // Khudawadi
-"Tirh" // Tirhuta
-"Wara" // Varang Kshiti
-"Ahom" // Ahom
-"Hluw" // Anatolian Hieroglyphs
-"Hatr" // Hatran
-"Mult" // Multani
-"Hung" // Old Hungarian
-"Sgnw" // Sign Writing
-"Adlm" // Adlam
-"Bhks" // Bhaiksuki
-"Marc" // Marchen
-"Newa" // Newa
-"Osge" // Osage
-"Tang" // Tangut
-"Hanb" // Han with Bopomofo
-"Jamo" // Jamo
-;
-static const unsigned char country_code_list[] =
-"ZZ\0" // AnyCountry
-"AF\0" // Afghanistan
-"AL\0" // Albania
-"DZ\0" // Algeria
-"AS\0" // American Samoa
-"AD\0" // Andorra
-"AO\0" // Angola
-"AI\0" // Anguilla
-"AQ\0" // Antarctica
-"AG\0" // Antigua And Barbuda
-"AR\0" // Argentina
-"AM\0" // Armenia
-"AW\0" // Aruba
-"AU\0" // Australia
-"AT\0" // Austria
-"AZ\0" // Azerbaijan
-"BS\0" // Bahamas
-"BH\0" // Bahrain
-"BD\0" // Bangladesh
-"BB\0" // Barbados
-"BY\0" // Belarus
-"BE\0" // Belgium
-"BZ\0" // Belize
-"BJ\0" // Benin
-"BM\0" // Bermuda
-"BT\0" // Bhutan
-"BO\0" // Bolivia
-"BA\0" // Bosnia And Herzegowina
-"BW\0" // Botswana
-"BV\0" // Bouvet Island
-"BR\0" // Brazil
-"IO\0" // British Indian Ocean Territory
-"BN\0" // Brunei
-"BG\0" // Bulgaria
-"BF\0" // Burkina Faso
-"BI\0" // Burundi
-"KH\0" // Cambodia
-"CM\0" // Cameroon
-"CA\0" // Canada
-"CV\0" // Cape Verde
-"KY\0" // Cayman Islands
-"CF\0" // Central African Republic
-"TD\0" // Chad
-"CL\0" // Chile
-"CN\0" // China
-"CX\0" // Christmas Island
-"CC\0" // Cocos Islands
-"CO\0" // Colombia
-"KM\0" // Comoros
-"CD\0" // Congo Kinshasa
-"CG\0" // Congo Brazzaville
-"CK\0" // Cook Islands
-"CR\0" // Costa Rica
-"CI\0" // Ivory Coast
-"HR\0" // Croatia
-"CU\0" // Cuba
-"CY\0" // Cyprus
-"CZ\0" // Czech Republic
-"DK\0" // Denmark
-"DJ\0" // Djibouti
-"DM\0" // Dominica
-"DO\0" // Dominican Republic
-"TL\0" // East Timor
-"EC\0" // Ecuador
-"EG\0" // Egypt
-"SV\0" // El Salvador
-"GQ\0" // Equatorial Guinea
-"ER\0" // Eritrea
-"EE\0" // Estonia
-"ET\0" // Ethiopia
-"FK\0" // Falkland Islands
-"FO\0" // Faroe Islands
-"FJ\0" // Fiji
-"FI\0" // Finland
-"FR\0" // France
-"GG\0" // Guernsey
-"GF\0" // French Guiana
-"PF\0" // French Polynesia
-"TF\0" // French Southern Territories
-"GA\0" // Gabon
-"GM\0" // Gambia
-"GE\0" // Georgia
-"DE\0" // Germany
-"GH\0" // Ghana
-"GI\0" // Gibraltar
-"GR\0" // Greece
-"GL\0" // Greenland
-"GD\0" // Grenada
-"GP\0" // Guadeloupe
-"GU\0" // Guam
-"GT\0" // Guatemala
-"GN\0" // Guinea
-"GW\0" // Guinea Bissau
-"GY\0" // Guyana
-"HT\0" // Haiti
-"HM\0" // Heard And McDonald Islands
-"HN\0" // Honduras
-"HK\0" // Hong Kong
-"HU\0" // Hungary
-"IS\0" // Iceland
-"IN\0" // India
-"ID\0" // Indonesia
-"IR\0" // Iran
-"IQ\0" // Iraq
-"IE\0" // Ireland
-"IL\0" // Israel
-"IT\0" // Italy
-"JM\0" // Jamaica
-"JP\0" // Japan
-"JO\0" // Jordan
-"KZ\0" // Kazakhstan
-"KE\0" // Kenya
-"KI\0" // Kiribati
-"KP\0" // North Korea
-"KR\0" // South Korea
-"KW\0" // Kuwait
-"KG\0" // Kyrgyzstan
-"LA\0" // Laos
-"LV\0" // Latvia
-"LB\0" // Lebanon
-"LS\0" // Lesotho
-"LR\0" // Liberia
-"LY\0" // Libya
-"LI\0" // Liechtenstein
-"LT\0" // Lithuania
-"LU\0" // Luxembourg
-"MO\0" // Macau
-"MK\0" // Macedonia
-"MG\0" // Madagascar
-"MW\0" // Malawi
-"MY\0" // Malaysia
-"MV\0" // Maldives
-"ML\0" // Mali
-"MT\0" // Malta
-"MH\0" // Marshall Islands
-"MQ\0" // Martinique
-"MR\0" // Mauritania
-"MU\0" // Mauritius
-"YT\0" // Mayotte
-"MX\0" // Mexico
-"FM\0" // Micronesia
-"MD\0" // Moldova
-"MC\0" // Monaco
-"MN\0" // Mongolia
-"MS\0" // Montserrat
-"MA\0" // Morocco
-"MZ\0" // Mozambique
-"MM\0" // Myanmar
-"NA\0" // Namibia
-"NR\0" // Nauru
-"NP\0" // Nepal
-"NL\0" // Netherlands
-"CW\0" // Cura Sao
-"NC\0" // New Caledonia
-"NZ\0" // New Zealand
-"NI\0" // Nicaragua
-"NE\0" // Niger
-"NG\0" // Nigeria
-"NU\0" // Niue
-"NF\0" // Norfolk Island
-"MP\0" // Northern Mariana Islands
-"NO\0" // Norway
-"OM\0" // Oman
-"PK\0" // Pakistan
-"PW\0" // Palau
-"PS\0" // Palestinian Territories
-"PA\0" // Panama
-"PG\0" // Papua New Guinea
-"PY\0" // Paraguay
-"PE\0" // Peru
-"PH\0" // Philippines
-"PN\0" // Pitcairn
-"PL\0" // Poland
-"PT\0" // Portugal
-"PR\0" // Puerto Rico
-"QA\0" // Qatar
-"RE\0" // Reunion
-"RO\0" // Romania
-"RU\0" // Russia
-"RW\0" // Rwanda
-"KN\0" // Saint Kitts And Nevis
-"LC\0" // Saint Lucia
-"VC\0" // Saint Vincent And The Grenadines
-"WS\0" // Samoa
-"SM\0" // San Marino
-"ST\0" // Sao Tome And Principe
-"SA\0" // Saudi Arabia
-"SN\0" // Senegal
-"SC\0" // Seychelles
-"SL\0" // Sierra Leone
-"SG\0" // Singapore
-"SK\0" // Slovakia
-"SI\0" // Slovenia
-"SB\0" // Solomon Islands
-"SO\0" // Somalia
-"ZA\0" // South Africa
-"GS\0" // South Georgia And The South Sandwich Islands
-"ES\0" // Spain
-"LK\0" // Sri Lanka
-"SH\0" // Saint Helena
-"PM\0" // Saint Pierre And Miquelon
-"SD\0" // Sudan
-"SR\0" // Suriname
-"SJ\0" // Svalbard And Jan Mayen Islands
-"SZ\0" // Swaziland
-"SE\0" // Sweden
-"CH\0" // Switzerland
-"SY\0" // Syria
-"TW\0" // Taiwan
-"TJ\0" // Tajikistan
-"TZ\0" // Tanzania
-"TH\0" // Thailand
-"TG\0" // Togo
-"TK\0" // Tokelau
-"TO\0" // Tonga
-"TT\0" // Trinidad And Tobago
-"TN\0" // Tunisia
-"TR\0" // Turkey
-"TM\0" // Turkmenistan
-"TC\0" // Turks And Caicos Islands
-"TV\0" // Tuvalu
-"UG\0" // Uganda
-"UA\0" // Ukraine
-"AE\0" // United Arab Emirates
-"GB\0" // United Kingdom
-"US\0" // United States
-"UM\0" // United States Minor Outlying Islands
-"UY\0" // Uruguay
-"UZ\0" // Uzbekistan
-"VU\0" // Vanuatu
-"VA\0" // Vatican City State
-"VE\0" // Venezuela
-"VN\0" // Vietnam
-"VG\0" // British Virgin Islands
-"VI\0" // United States Virgin Islands
-"WF\0" // Wallis And Futuna Islands
-"EH\0" // Western Sahara
-"YE\0" // Yemen
-"IC\0" // Canary Islands
-"ZM\0" // Zambia
-"ZW\0" // Zimbabwe
-"CP\0" // Clipperton Island
-"ME\0" // Montenegro
-"RS\0" // Serbia
-"BL\0" // Saint Barthelemy
-"MF\0" // Saint Martin
-"419" // Latin America
-"AC\0" // Ascension Island
-"AX\0" // Aland Islands
-"DG\0" // Diego Garcia
-"EA\0" // Ceuta And Melilla
-"IM\0" // Isle Of Man
-"JE\0" // Jersey
-"TA\0" // Tristan Da Cunha
-"SS\0" // South Sudan
-"BQ\0" // Bonaire
-"SX\0" // Sint Maarten
-"XK\0" // Kosovo
-"EU\0" // European Union
-"QO\0" // Outlying Oceania
-"001" // World
-"150" // Europe
-;
-
-// GENERATED PART ENDS HERE
-
-QT_END_NAMESPACE
-
-#endif
diff --git a/src/corelib/tools/qlocale_icu.cpp b/src/corelib/tools/qlocale_icu.cpp
deleted file mode 100644
index afe0aae583..0000000000
--- a/src/corelib/tools/qlocale_icu.cpp
+++ /dev/null
@@ -1,111 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#include "qglobal.h"
-#include "qdebug.h"
-#include "qlocale_p.h"
-#include "qmutex.h"
-
-#include "unicode/uloc.h"
-#include "unicode/ustring.h"
-
-QT_BEGIN_NAMESPACE
-
-typedef int32_t (*Ptr_u_strToCase)(UChar *dest, int32_t destCapacity, const UChar *src, int32_t srcLength, const char *locale, UErrorCode *pErrorCode);
-
-// caseFunc can either be u_strToUpper or u_strToLower
-static bool qt_u_strToCase(const QString &str, QString *out, const char *localeID, Ptr_u_strToCase caseFunc)
-{
- Q_ASSERT(out);
-
- int32_t size = str.size();
- size += size >> 2; // add 25% for possible expansions
- QString result(size, Qt::Uninitialized);
-
- UErrorCode status = U_ZERO_ERROR;
-
- size = caseFunc(reinterpret_cast<UChar *>(result.data()), result.size(),
- reinterpret_cast<const UChar *>(str.constData()), str.size(),
- localeID, &status);
-
- if (U_FAILURE(status) && status != U_BUFFER_OVERFLOW_ERROR)
- return false;
-
- if (size < result.size()) {
- result.resize(size);
- } else if (size > result.size()) {
- // the resulting string is larger than our source string
- result.resize(size);
-
- status = U_ZERO_ERROR;
- size = caseFunc(reinterpret_cast<UChar *>(result.data()), result.size(),
- reinterpret_cast<const UChar *>(str.constData()), str.size(),
- localeID, &status);
-
- if (U_FAILURE(status))
- return false;
-
- // if the sizes don't match now, we give up.
- if (size != result.size())
- return false;
- }
-
- *out = result;
- return true;
-}
-
-QString QIcu::toUpper(const QByteArray &localeID, const QString &str, bool *ok)
-{
- QString out;
- bool err = qt_u_strToCase(str, &out, localeID, u_strToUpper);
- if (ok)
- *ok = err;
- return out;
-}
-
-QString QIcu::toLower(const QByteArray &localeID, const QString &str, bool *ok)
-{
- QString out;
- bool err = qt_u_strToCase(str, &out, localeID, u_strToLower);
- if (ok)
- *ok = err;
- return out;
-}
-
-QT_END_NAMESPACE
diff --git a/src/corelib/tools/qlocale_mac.mm b/src/corelib/tools/qlocale_mac.mm
deleted file mode 100644
index 574cb0714c..0000000000
--- a/src/corelib/tools/qlocale_mac.mm
+++ /dev/null
@@ -1,510 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#include "qlocale_p.h"
-
-#include "qstringlist.h"
-#include "qvariant.h"
-#include "qdatetime.h"
-
-#ifdef Q_OS_DARWIN
-#include "qtimezone.h"
-#include "private/qcore_mac_p.h"
-#include <CoreFoundation/CoreFoundation.h>
-QT_REQUIRE_CONFIG(timezone);
-#endif
-
-QT_BEGIN_NAMESPACE
-
-/******************************************************************************
-** Wrappers for Mac locale system functions
-*/
-
-static QByteArray envVarLocale()
-{
- static QByteArray lang = 0;
-#ifdef Q_OS_UNIX
- lang = qgetenv("LC_ALL");
- if (lang.isEmpty())
- lang = qgetenv("LC_NUMERIC");
- if (lang.isEmpty())
-#endif
- lang = qgetenv("LANG");
- return lang;
-}
-
-static QByteArray getMacLocaleName()
-{
- QByteArray result = envVarLocale();
-
- QString lang, script, cntry;
- if (result.isEmpty()
- || (result != "C" && !qt_splitLocaleName(QString::fromLocal8Bit(result), lang, script, cntry))) {
- QCFType<CFLocaleRef> l = CFLocaleCopyCurrent();
- CFStringRef locale = CFLocaleGetIdentifier(l);
- result = QString::fromCFString(locale).toUtf8();
- }
- return result;
-}
-
-static QString macMonthName(int month, bool short_format)
-{
- month -= 1;
- if (month < 0 || month > 11)
- return QString();
-
- QCFType<CFDateFormatterRef> formatter
- = CFDateFormatterCreate(0, QCFType<CFLocaleRef>(CFLocaleCopyCurrent()),
- kCFDateFormatterNoStyle, kCFDateFormatterNoStyle);
- QCFType<CFArrayRef> values
- = static_cast<CFArrayRef>(CFDateFormatterCopyProperty(formatter,
- short_format ? kCFDateFormatterShortMonthSymbols
- : kCFDateFormatterMonthSymbols));
- if (values != 0) {
- CFStringRef cfstring = static_cast<CFStringRef>(CFArrayGetValueAtIndex(values, month));
- return QString::fromCFString(cfstring);
- }
- return QString();
-}
-
-static QString macDayName(int day, bool short_format)
-{
- if (day < 1 || day > 7)
- return QString();
-
- QCFType<CFDateFormatterRef> formatter
- = CFDateFormatterCreate(0, QCFType<CFLocaleRef>(CFLocaleCopyCurrent()),
- kCFDateFormatterNoStyle, kCFDateFormatterNoStyle);
- QCFType<CFArrayRef> values = static_cast<CFArrayRef>(CFDateFormatterCopyProperty(formatter,
- short_format ? kCFDateFormatterShortWeekdaySymbols
- : kCFDateFormatterWeekdaySymbols));
- if (values != 0) {
- CFStringRef cfstring = static_cast<CFStringRef>(CFArrayGetValueAtIndex(values, day % 7));
- return QString::fromCFString(cfstring);
- }
- return QString();
-}
-
-static QString macDateToString(const QDate &date, bool short_format)
-{
- QCFType<CFDateRef> myDate = QDateTime(date, QTime()).toCFDate();
- QCFType<CFLocaleRef> mylocale = CFLocaleCopyCurrent();
- CFDateFormatterStyle style = short_format ? kCFDateFormatterShortStyle : kCFDateFormatterLongStyle;
- QCFType<CFDateFormatterRef> myFormatter
- = CFDateFormatterCreate(kCFAllocatorDefault,
- mylocale, style,
- kCFDateFormatterNoStyle);
- return QCFString(CFDateFormatterCreateStringWithDate(0, myFormatter, myDate));
-}
-
-static QString macTimeToString(const QTime &time, bool short_format)
-{
- QCFType<CFDateRef> myDate = QDateTime(QDate::currentDate(), time).toCFDate();
- QCFType<CFLocaleRef> mylocale = CFLocaleCopyCurrent();
- CFDateFormatterStyle style = short_format ? kCFDateFormatterShortStyle : kCFDateFormatterLongStyle;
- QCFType<CFDateFormatterRef> myFormatter = CFDateFormatterCreate(kCFAllocatorDefault,
- mylocale,
- kCFDateFormatterNoStyle,
- style);
- return QCFString(CFDateFormatterCreateStringWithDate(0, myFormatter, myDate));
-}
-
-// Mac uses the Unicode CLDR format codes
-// http://www.unicode.org/reports/tr35/tr35-dates.html#Date_Field_Symbol_Table
-// See also qtbase/util/local_database/dateconverter.py
-// Makes the assumption that input formats are always well formed and consecutive letters
-// never exceed the maximum for the format code.
-static QString macToQtFormat(QStringView sys_fmt)
-{
- QString result;
- int i = 0;
-
- while (i < sys_fmt.size()) {
- if (sys_fmt.at(i).unicode() == '\'') {
- QString text = qt_readEscapedFormatString(sys_fmt, &i);
- if (text == QLatin1String("'"))
- result += QLatin1String("''");
- else
- result += QLatin1Char('\'') + text + QLatin1Char('\'');
- continue;
- }
-
- QChar c = sys_fmt.at(i);
- int repeat = qt_repeatCount(sys_fmt.mid(i));
-
- switch (c.unicode()) {
- // Qt does not support the following options
- case 'G': // Era (1..5): 4 = long, 1..3 = short, 5 = narrow
- case 'Y': // Year of Week (1..n): 1..n = padded number
- case 'U': // Cyclic Year Name (1..5): 4 = long, 1..3 = short, 5 = narrow
- case 'Q': // Quarter (1..4): 4 = long, 3 = short, 1..2 = padded number
- case 'q': // Standalone Quarter (1..4): 4 = long, 3 = short, 1..2 = padded number
- case 'w': // Week of Year (1..2): 1..2 = padded number
- case 'W': // Week of Month (1): 1 = number
- case 'D': // Day of Year (1..3): 1..3 = padded number
- case 'F': // Day of Week in Month (1): 1 = number
- case 'g': // Modified Julian Day (1..n): 1..n = padded number
- case 'A': // Milliseconds in Day (1..n): 1..n = padded number
- break;
-
- case 'y': // Year (1..n): 2 = short year, 1 & 3..n = padded number
- case 'u': // Extended Year (1..n): 2 = short year, 1 & 3..n = padded number
- // Qt only supports long (4) or short (2) year, use long for all others
- if (repeat == 2)
- result += QLatin1String("yy");
- else
- result += QLatin1String("yyyy");
- break;
- case 'M': // Month (1..5): 4 = long, 3 = short, 1..2 = number, 5 = narrow
- case 'L': // Standalone Month (1..5): 4 = long, 3 = short, 1..2 = number, 5 = narrow
- // Qt only supports long, short and number, use short for narrow
- if (repeat == 5)
- result += QLatin1String("MMM");
- else
- result += QString(repeat, QLatin1Char('M'));
- break;
- case 'd': // Day of Month (1..2): 1..2 padded number
- result += QString(repeat, c);
- break;
- case 'E': // Day of Week (1..6): 4 = long, 1..3 = short, 5..6 = narrow
- // Qt only supports long, short and padded number, use short for narrow
- if (repeat == 4)
- result += QLatin1String("dddd");
- else
- result += QLatin1String("ddd");
- break;
- case 'e': // Local Day of Week (1..6): 4 = long, 3 = short, 5..6 = narrow, 1..2 padded number
- case 'c': // Standalone Local Day of Week (1..6): 4 = long, 3 = short, 5..6 = narrow, 1..2 padded number
- // Qt only supports long, short and padded number, use short for narrow
- if (repeat >= 5)
- result += QLatin1String("ddd");
- else
- result += QString(repeat, QLatin1Char('d'));
- break;
- case 'a': // AM/PM (1): 1 = short
- // Translate to Qt uppercase AM/PM
- result += QLatin1String("AP");
- break;
- case 'h': // Hour [1..12] (1..2): 1..2 = padded number
- case 'K': // Hour [0..11] (1..2): 1..2 = padded number
- case 'j': // Local Hour [12 or 24] (1..2): 1..2 = padded number
- // Qt h is local hour
- result += QString(repeat, QLatin1Char('h'));
- break;
- case 'H': // Hour [0..23] (1..2): 1..2 = padded number
- case 'k': // Hour [1..24] (1..2): 1..2 = padded number
- // Qt H is 0..23 hour
- result += QString(repeat, QLatin1Char('H'));
- break;
- case 'm': // Minutes (1..2): 1..2 = padded number
- case 's': // Seconds (1..2): 1..2 = padded number
- result += QString(repeat, c);
- break;
- case 'S': // Fractional second (1..n): 1..n = truncates to decimal places
- // Qt uses msecs either unpadded or padded to 3 places
- if (repeat < 3)
- result += QLatin1Char('z');
- else
- result += QLatin1String("zzz");
- break;
- case 'z': // Time Zone (1..4)
- case 'Z': // Time Zone (1..5)
- case 'O': // Time Zone (1, 4)
- case 'v': // Time Zone (1, 4)
- case 'V': // Time Zone (1..4)
- case 'X': // Time Zone (1..5)
- case 'x': // Time Zone (1..5)
- result += QLatin1Char('t');
- break;
- default:
- // a..z and A..Z are reserved for format codes, so any occurrence of these not
- // already processed are not known and so unsupported formats to be ignored.
- // All other chars are allowed as literals.
- if (c < QLatin1Char('A') || c > QLatin1Char('z') ||
- (c > QLatin1Char('Z') && c < QLatin1Char('a'))) {
- result += QString(repeat, c);
- }
- break;
- }
-
- i += repeat;
- }
-
- return result;
-}
-
-QString getMacDateFormat(CFDateFormatterStyle style)
-{
- QCFType<CFLocaleRef> l = CFLocaleCopyCurrent();
- QCFType<CFDateFormatterRef> formatter = CFDateFormatterCreate(kCFAllocatorDefault,
- l, style, kCFDateFormatterNoStyle);
- return macToQtFormat(QString::fromCFString(CFDateFormatterGetFormat(formatter)));
-}
-
-static QString getMacTimeFormat(CFDateFormatterStyle style)
-{
- QCFType<CFLocaleRef> l = CFLocaleCopyCurrent();
- QCFType<CFDateFormatterRef> formatter = CFDateFormatterCreate(kCFAllocatorDefault,
- l, kCFDateFormatterNoStyle, style);
- return macToQtFormat(QString::fromCFString(CFDateFormatterGetFormat(formatter)));
-}
-
-static QString getCFLocaleValue(CFStringRef key)
-{
- QCFType<CFLocaleRef> locale = CFLocaleCopyCurrent();
- CFTypeRef value = CFLocaleGetValue(locale, key);
- return QString::fromCFString(CFStringRef(static_cast<CFTypeRef>(value)));
-}
-
-static QLocale::MeasurementSystem macMeasurementSystem()
-{
- QCFType<CFLocaleRef> locale = CFLocaleCopyCurrent();
- CFStringRef system = static_cast<CFStringRef>(CFLocaleGetValue(locale, kCFLocaleMeasurementSystem));
- if (QString::fromCFString(system) == QLatin1String("Metric")) {
- return QLocale::MetricSystem;
- } else {
- return QLocale::ImperialSystem;
- }
-}
-
-
-static quint8 macFirstDayOfWeek()
-{
- QCFType<CFCalendarRef> calendar = CFCalendarCopyCurrent();
- quint8 day = static_cast<quint8>(CFCalendarGetFirstWeekday(calendar))-1;
- if (day == 0)
- day = 7;
- return day;
-}
-
-static QString macCurrencySymbol(QLocale::CurrencySymbolFormat format)
-{
- QCFType<CFLocaleRef> locale = CFLocaleCopyCurrent();
- switch (format) {
- case QLocale::CurrencyIsoCode:
- return QString::fromCFString(static_cast<CFStringRef>(CFLocaleGetValue(locale, kCFLocaleCurrencyCode)));
- case QLocale::CurrencySymbol:
- return QString::fromCFString(static_cast<CFStringRef>(CFLocaleGetValue(locale, kCFLocaleCurrencySymbol)));
- case QLocale::CurrencyDisplayName: {
- CFStringRef code = static_cast<CFStringRef>(CFLocaleGetValue(locale, kCFLocaleCurrencyCode));
- QCFType<CFStringRef> value = CFLocaleCopyDisplayNameForPropertyValue(locale, kCFLocaleCurrencyCode, code);
- return QString::fromCFString(value);
- }
- default:
- break;
- }
- return QString();
-}
-
-static QString macZeroDigit()
-{
- QCFType<CFLocaleRef> locale = CFLocaleCopyCurrent();
- QCFType<CFNumberFormatterRef> numberFormatter =
- CFNumberFormatterCreate(nullptr, locale, kCFNumberFormatterNoStyle);
- static const int zeroDigit = 0;
- QCFType<CFStringRef> value = CFNumberFormatterCreateStringWithValue(nullptr, numberFormatter,
- kCFNumberIntType, &zeroDigit);
- return QString::fromCFString(value);
-}
-
-#ifndef QT_NO_SYSTEMLOCALE
-static QString macFormatCurrency(const QSystemLocale::CurrencyToStringArgument &arg)
-{
- QCFType<CFNumberRef> value;
- switch (arg.value.type()) {
- case QVariant::Int:
- case QVariant::UInt: {
- int v = arg.value.toInt();
- value = CFNumberCreate(NULL, kCFNumberIntType, &v);
- break;
- }
- case QVariant::Double: {
- double v = arg.value.toDouble();
- value = CFNumberCreate(NULL, kCFNumberDoubleType, &v);
- break;
- }
- case QVariant::LongLong:
- case QVariant::ULongLong: {
- qint64 v = arg.value.toLongLong();
- value = CFNumberCreate(NULL, kCFNumberLongLongType, &v);
- break;
- }
- default:
- return QString();
- }
-
- QCFType<CFLocaleRef> locale = CFLocaleCopyCurrent();
- QCFType<CFNumberFormatterRef> currencyFormatter =
- CFNumberFormatterCreate(NULL, locale, kCFNumberFormatterCurrencyStyle);
- if (!arg.symbol.isEmpty()) {
- CFNumberFormatterSetProperty(currencyFormatter, kCFNumberFormatterCurrencySymbol,
- arg.symbol.toCFString());
- }
- QCFType<CFStringRef> result = CFNumberFormatterCreateStringWithNumber(NULL, currencyFormatter, value);
- return QString::fromCFString(result);
-}
-
-static QVariant macQuoteString(QSystemLocale::QueryType type, const QStringRef &str)
-{
- QString begin, end;
- QCFType<CFLocaleRef> locale = CFLocaleCopyCurrent();
- switch (type) {
- case QSystemLocale::StringToStandardQuotation:
- begin = QString::fromCFString(static_cast<CFStringRef>(CFLocaleGetValue(locale, kCFLocaleQuotationBeginDelimiterKey)));
- end = QString::fromCFString(static_cast<CFStringRef>(CFLocaleGetValue(locale, kCFLocaleQuotationEndDelimiterKey)));
- return QString(begin % str % end);
- case QSystemLocale::StringToAlternateQuotation:
- begin = QString::fromCFString(static_cast<CFStringRef>(CFLocaleGetValue(locale, kCFLocaleAlternateQuotationBeginDelimiterKey)));
- end = QString::fromCFString(static_cast<CFStringRef>(CFLocaleGetValue(locale, kCFLocaleAlternateQuotationEndDelimiterKey)));
- return QString(begin % str % end);
- default:
- break;
- }
- return QVariant();
-}
-#endif //QT_NO_SYSTEMLOCALE
-
-#ifndef QT_NO_SYSTEMLOCALE
-
-QLocale QSystemLocale::fallbackUiLocale() const
-{
- return QLocale(QString::fromUtf8(getMacLocaleName().constData()));
-}
-
-QVariant QSystemLocale::query(QueryType type, QVariant in = QVariant()) const
-{
- QMacAutoReleasePool pool;
- switch(type) {
-// case Name:
-// return getMacLocaleName();
- case DecimalPoint: {
- QString value = getCFLocaleValue(kCFLocaleDecimalSeparator);
- return value.isEmpty() ? QVariant() : value;
- }
- case GroupSeparator: {
- QString value = getCFLocaleValue(kCFLocaleGroupingSeparator);
- return value.isEmpty() ? QVariant() : value;
- }
- case DateFormatLong:
- case DateFormatShort:
- return getMacDateFormat(type == DateFormatShort
- ? kCFDateFormatterShortStyle
- : kCFDateFormatterLongStyle);
- case TimeFormatLong:
- case TimeFormatShort:
- return getMacTimeFormat(type == TimeFormatShort
- ? kCFDateFormatterShortStyle
- : kCFDateFormatterLongStyle);
- case DayNameLong:
- case DayNameShort:
- return macDayName(in.toInt(), (type == DayNameShort));
- case MonthNameLong:
- case MonthNameShort:
- case StandaloneMonthNameLong:
- case StandaloneMonthNameShort:
- return macMonthName(in.toInt(), (type == MonthNameShort || type == StandaloneMonthNameShort));
- case DateToStringShort:
- case DateToStringLong:
- return macDateToString(in.toDate(), (type == DateToStringShort));
- case TimeToStringShort:
- case TimeToStringLong:
- return macTimeToString(in.toTime(), (type == TimeToStringShort));
-
- case NegativeSign:
- case PositiveSign:
- break;
- case ZeroDigit:
- return QVariant(macZeroDigit());
-
- case MeasurementSystem:
- return QVariant(static_cast<int>(macMeasurementSystem()));
-
- case AMText:
- case PMText: {
- QCFType<CFLocaleRef> locale = CFLocaleCopyCurrent();
- QCFType<CFDateFormatterRef> formatter = CFDateFormatterCreate(NULL, locale, kCFDateFormatterLongStyle, kCFDateFormatterLongStyle);
- QCFType<CFStringRef> value = static_cast<CFStringRef>(CFDateFormatterCopyProperty(formatter,
- (type == AMText ? kCFDateFormatterAMSymbol : kCFDateFormatterPMSymbol)));
- return QString::fromCFString(value);
- }
- case FirstDayOfWeek:
- return QVariant(macFirstDayOfWeek());
- case CurrencySymbol:
- return QVariant(macCurrencySymbol(QLocale::CurrencySymbolFormat(in.toUInt())));
- case CurrencyToString:
- return macFormatCurrency(in.value<QSystemLocale::CurrencyToStringArgument>());
- case UILanguages: {
- QCFType<CFPropertyListRef> languages = CFPreferencesCopyValue(
- CFSTR("AppleLanguages"),
- kCFPreferencesAnyApplication,
- kCFPreferencesCurrentUser,
- kCFPreferencesAnyHost);
- QStringList result;
- if (!languages)
- return QVariant(result);
-
- CFTypeID typeId = CFGetTypeID(languages);
- if (typeId == CFArrayGetTypeID()) {
- const int cnt = CFArrayGetCount(languages.as<CFArrayRef>());
- result.reserve(cnt);
- for (int i = 0; i < cnt; ++i) {
- const QString lang = QString::fromCFString(
- static_cast<CFStringRef>(CFArrayGetValueAtIndex(languages.as<CFArrayRef>(), i)));
- result.append(lang);
- }
- } else if (typeId == CFStringGetTypeID()) {
- result = QStringList(QString::fromCFString(languages.as<CFStringRef>()));
- } else {
- qWarning("QLocale::uiLanguages(): CFPreferencesCopyValue returned unhandled type \"%s\"; please report to http://bugreports.qt.io",
- qPrintable(QString::fromCFString(CFCopyTypeIDDescription(typeId))));
- }
- return QVariant(result);
- }
- case StringToStandardQuotation:
- case StringToAlternateQuotation:
- return macQuoteString(type, in.value<QStringRef>());
- default:
- break;
- }
- return QVariant();
-}
-
-#endif // QT_NO_SYSTEMLOCALE
-
-QT_END_NAMESPACE
diff --git a/src/corelib/tools/qlocale_p.h b/src/corelib/tools/qlocale_p.h
deleted file mode 100644
index 70430beb00..0000000000
--- a/src/corelib/tools/qlocale_p.h
+++ /dev/null
@@ -1,470 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Copyright (C) 2016 Intel Corporation.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#ifndef QLOCALE_P_H
-#define QLOCALE_P_H
-
-//
-// W A R N I N G
-// -------------
-//
-// This file is not part of the Qt API. It exists for the convenience
-// of internal files. This header file may change from version to version
-// without notice, or even be removed.
-//
-// We mean it.
-//
-
-#include <QtCore/private/qglobal_p.h>
-#include "QtCore/qstring.h"
-#include "QtCore/qvarlengtharray.h"
-#include "QtCore/qvariant.h"
-#include "QtCore/qnumeric.h"
-
-#include "qlocale.h"
-
-#include <limits>
-#include <cmath>
-
-QT_BEGIN_NAMESPACE
-
-#ifndef QT_NO_SYSTEMLOCALE
-struct QLocaleData;
-class Q_CORE_EXPORT QSystemLocale
-{
-public:
- QSystemLocale();
- virtual ~QSystemLocale();
-
- struct CurrencyToStringArgument
- {
- CurrencyToStringArgument() { }
- CurrencyToStringArgument(const QVariant &v, const QString &s)
- : value(v), symbol(s) { }
- QVariant value;
- QString symbol;
- };
-
- enum QueryType {
- LanguageId, // uint
- CountryId, // uint
- DecimalPoint, // QString
- GroupSeparator, // QString
- ZeroDigit, // QString
- NegativeSign, // QString
- DateFormatLong, // QString
- DateFormatShort, // QString
- TimeFormatLong, // QString
- TimeFormatShort, // QString
- DayNameLong, // QString, in: int
- DayNameShort, // QString, in: int
- MonthNameLong, // QString, in: int
- MonthNameShort, // QString, in: int
- DateToStringLong, // QString, in: QDate
- DateToStringShort, // QString in: QDate
- TimeToStringLong, // QString in: QTime
- TimeToStringShort, // QString in: QTime
- DateTimeFormatLong, // QString
- DateTimeFormatShort, // QString
- DateTimeToStringLong, // QString in: QDateTime
- DateTimeToStringShort, // QString in: QDateTime
- MeasurementSystem, // uint
- PositiveSign, // QString
- AMText, // QString
- PMText, // QString
- FirstDayOfWeek, // Qt::DayOfWeek
- Weekdays, // QList<Qt::DayOfWeek>
- CurrencySymbol, // QString in: CurrencyToStringArgument
- CurrencyToString, // QString in: qlonglong, qulonglong or double
- UILanguages, // QStringList
- StringToStandardQuotation, // QString in: QStringRef to quote
- StringToAlternateQuotation, // QString in: QStringRef to quote
- ScriptId, // uint
- ListToSeparatedString, // QString
- LocaleChanged, // system locale changed
- NativeLanguageName, // QString
- NativeCountryName, // QString
- StandaloneMonthNameLong, // QString, in: int
- StandaloneMonthNameShort // QString, in: int
- };
- virtual QVariant query(QueryType type, QVariant in) const;
- virtual QLocale fallbackUiLocale() const;
-
- inline const QLocaleData *fallbackUiLocaleData() const;
-private:
- QSystemLocale(bool);
- friend class QSystemLocaleSingleton;
-};
-Q_DECLARE_TYPEINFO(QSystemLocale::QueryType, Q_PRIMITIVE_TYPE);
-Q_DECLARE_TYPEINFO(QSystemLocale::CurrencyToStringArgument, Q_MOVABLE_TYPE);
-#endif
-
-#if QT_CONFIG(icu)
-namespace QIcu {
- QString toUpper(const QByteArray &localeId, const QString &str, bool *ok);
- QString toLower(const QByteArray &localeId, const QString &str, bool *ok);
-}
-#endif
-
-
-struct QLocaleId
-{
- // bypass constructors
- static inline QLocaleId fromIds(ushort language, ushort script, ushort country)
- {
- const QLocaleId localeId = { language, script, country };
- return localeId;
- }
-
- inline bool operator==(QLocaleId other) const
- { return language_id == other.language_id && script_id == other.script_id && country_id == other.country_id; }
- inline bool operator!=(QLocaleId other) const
- { return !operator==(other); }
-
- QLocaleId withLikelySubtagsAdded() const;
- QLocaleId withLikelySubtagsRemoved() const;
-
- QByteArray name(char separator = '-') const;
-
- ushort language_id, script_id, country_id;
-};
-Q_DECLARE_TYPEINFO(QLocaleId, Q_PRIMITIVE_TYPE);
-
-struct QLocaleData
-{
-public:
- static const QLocaleData *findLocaleData(QLocale::Language language,
- QLocale::Script script,
- QLocale::Country country);
- static const QLocaleData *c();
-
- // Maximum number of significant digits needed to represent a double.
- // We cannot use std::numeric_limits here without constexpr.
- static const int DoubleMantissaBits = 53;
- static const int Log10_2_100000 = 30103; // log10(2) * 100000
- // same as C++11 std::numeric_limits<T>::max_digits10
- static const int DoubleMaxSignificant = (DoubleMantissaBits * Log10_2_100000) / 100000 + 2;
-
- // Maximum number of digits before decimal point to represent a double
- // Same as std::numeric_limits<double>::max_exponent10 + 1
- static const int DoubleMaxDigitsBeforeDecimal = 309;
-
- enum DoubleForm {
- DFExponent = 0,
- DFDecimal,
- DFSignificantDigits,
- _DFMax = DFSignificantDigits
- };
-
- enum Flags {
- NoFlags = 0,
- AddTrailingZeroes = 0x01,
- ZeroPadded = 0x02,
- LeftAdjusted = 0x04,
- BlankBeforePositive = 0x08,
- AlwaysShowSign = 0x10,
- ThousandsGroup = 0x20,
- CapitalEorX = 0x40,
-
- ShowBase = 0x80,
- UppercaseBase = 0x100,
- ZeroPadExponent = 0x200,
- ForcePoint = 0x400
- };
-
- enum NumberMode { IntegerMode, DoubleStandardMode, DoubleScientificMode };
-
- typedef QVarLengthArray<char, 256> CharBuff;
-
- static QString doubleToString(const QChar zero, const QChar plus,
- const QChar minus, const QChar exponent,
- const QChar group, const QChar decimal,
- double d, int precision,
- DoubleForm form,
- int width, unsigned flags);
- static QString longLongToString(const QChar zero, const QChar group,
- const QChar plus, const QChar minus,
- qint64 l, int precision, int base,
- int width, unsigned flags);
- static QString unsLongLongToString(const QChar zero, const QChar group,
- const QChar plus,
- quint64 l, int precision,
- int base, int width,
- unsigned flags);
-
- QString doubleToString(double d,
- int precision = -1,
- DoubleForm form = DFSignificantDigits,
- int width = -1,
- unsigned flags = NoFlags) const;
- QString longLongToString(qint64 l, int precision = -1,
- int base = 10,
- int width = -1,
- unsigned flags = NoFlags) const;
- QString unsLongLongToString(quint64 l, int precision = -1,
- int base = 10,
- int width = -1,
- unsigned flags = NoFlags) const;
-
- // this function is meant to be called with the result of stringToDouble or bytearrayToDouble
- static float convertDoubleToFloat(double d, bool *ok)
- {
- if (qIsInf(d))
- return float(d);
- if (std::fabs(d) > std::numeric_limits<float>::max()) {
- if (ok != 0)
- *ok = false;
- const float huge = std::numeric_limits<float>::infinity();
- return d < 0 ? -huge : huge;
- }
- if (d != 0 && float(d) == 0) {
- // Values that underflow double already failed. Match them:
- if (ok != 0)
- *ok = false;
- return 0;
- }
- return float(d);
- }
-
- double stringToDouble(QStringView str, bool *ok, QLocale::NumberOptions options) const;
- qint64 stringToLongLong(QStringView str, int base, bool *ok, QLocale::NumberOptions options) const;
- quint64 stringToUnsLongLong(QStringView str, int base, bool *ok, QLocale::NumberOptions options) const;
-
- static double bytearrayToDouble(const char *num, bool *ok);
- // this function is used in QIntValidator (QtGui)
- Q_CORE_EXPORT static qint64 bytearrayToLongLong(const char *num, int base, bool *ok);
- static quint64 bytearrayToUnsLongLong(const char *num, int base, bool *ok);
-
- bool numberToCLocale(QStringView s, QLocale::NumberOptions number_options,
- CharBuff *result) const;
- inline char digitToCLocale(QChar c) const;
-
- // this function is used in QIntValidator (QtGui)
- Q_CORE_EXPORT bool validateChars(QStringView str, NumberMode numMode, QByteArray *buff, int decDigits = -1,
- QLocale::NumberOptions number_options = QLocale::DefaultNumberOptions) const;
-
-public:
- quint16 m_language_id, m_script_id, m_country_id;
-
- // FIXME QTBUG-69324: not all unicode code-points map to single-token UTF-16 :-(
- quint16 m_decimal, m_group, m_list, m_percent, m_zero, m_minus, m_plus, m_exponential;
- quint16 m_quotation_start, m_quotation_end;
- quint16 m_alternate_quotation_start, m_alternate_quotation_end;
-
- quint16 m_list_pattern_part_start_idx, m_list_pattern_part_start_size;
- quint16 m_list_pattern_part_mid_idx, m_list_pattern_part_mid_size;
- quint16 m_list_pattern_part_end_idx, m_list_pattern_part_end_size;
- quint16 m_list_pattern_part_two_idx, m_list_pattern_part_two_size;
- quint16 m_short_date_format_idx, m_short_date_format_size;
- quint16 m_long_date_format_idx, m_long_date_format_size;
- quint16 m_short_time_format_idx, m_short_time_format_size;
- quint16 m_long_time_format_idx, m_long_time_format_size;
- quint16 m_standalone_short_month_names_idx, m_standalone_short_month_names_size;
- quint16 m_standalone_long_month_names_idx, m_standalone_long_month_names_size;
- quint16 m_standalone_narrow_month_names_idx, m_standalone_narrow_month_names_size;
- quint16 m_short_month_names_idx, m_short_month_names_size;
- quint16 m_long_month_names_idx, m_long_month_names_size;
- quint16 m_narrow_month_names_idx, m_narrow_month_names_size;
- quint16 m_standalone_short_day_names_idx, m_standalone_short_day_names_size;
- quint16 m_standalone_long_day_names_idx, m_standalone_long_day_names_size;
- quint16 m_standalone_narrow_day_names_idx, m_standalone_narrow_day_names_size;
- quint16 m_short_day_names_idx, m_short_day_names_size;
- quint16 m_long_day_names_idx, m_long_day_names_size;
- quint16 m_narrow_day_names_idx, m_narrow_day_names_size;
- quint16 m_am_idx, m_am_size;
- quint16 m_pm_idx, m_pm_size;
- quint16 m_byte_idx, m_byte_size;
- quint16 m_byte_si_quantified_idx, m_byte_si_quantified_size;
- quint16 m_byte_iec_quantified_idx, m_byte_iec_quantified_size;
- char m_currency_iso_code[3];
- quint16 m_currency_symbol_idx, m_currency_symbol_size;
- quint16 m_currency_display_name_idx, m_currency_display_name_size;
- quint8 m_currency_format_idx, m_currency_format_size;
- quint8 m_currency_negative_format_idx, m_currency_negative_format_size;
- quint16 m_language_endonym_idx, m_language_endonym_size;
- quint16 m_country_endonym_idx, m_country_endonym_size;
- quint16 m_currency_digits : 2;
- quint16 m_currency_rounding : 3;
- quint16 m_first_day_of_week : 3;
- quint16 m_weekend_start : 3;
- quint16 m_weekend_end : 3;
-};
-
-class Q_CORE_EXPORT QLocalePrivate
-{
-public:
- static QLocalePrivate *create(
- const QLocaleData *data,
- QLocale::NumberOptions numberOptions = QLocale::DefaultNumberOptions)
- {
- QLocalePrivate *retval = new QLocalePrivate;
- retval->m_data = data;
- retval->ref.store(0);
- retval->m_numberOptions = numberOptions;
- return retval;
- }
-
- static QLocalePrivate *get(QLocale &l) { return l.d; }
- static const QLocalePrivate *get(const QLocale &l) { return l.d; }
-
- QChar decimal() const { return QChar(m_data->m_decimal); }
- QChar group() const { return QChar(m_data->m_group); }
- QChar list() const { return QChar(m_data->m_list); }
- QChar percent() const { return QChar(m_data->m_percent); }
- QChar zero() const { return QChar(m_data->m_zero); }
- QChar plus() const { return QChar(m_data->m_plus); }
- QChar minus() const { return QChar(m_data->m_minus); }
- QChar exponential() const { return QChar(m_data->m_exponential); }
-
- quint16 languageId() const { return m_data->m_language_id; }
- quint16 countryId() const { return m_data->m_country_id; }
-
- QByteArray bcp47Name(char separator = '-') const;
-
- inline QLatin1String languageCode() const { return QLocalePrivate::languageToCode(QLocale::Language(m_data->m_language_id)); }
- inline QLatin1String scriptCode() const { return QLocalePrivate::scriptToCode(QLocale::Script(m_data->m_script_id)); }
- inline QLatin1String countryCode() const { return QLocalePrivate::countryToCode(QLocale::Country(m_data->m_country_id)); }
-
- static QLatin1String languageToCode(QLocale::Language language);
- static QLatin1String scriptToCode(QLocale::Script script);
- static QLatin1String countryToCode(QLocale::Country country);
- static QLocale::Language codeToLanguage(QStringView code) Q_DECL_NOTHROW;
- static QLocale::Script codeToScript(QStringView code) Q_DECL_NOTHROW;
- static QLocale::Country codeToCountry(QStringView code) Q_DECL_NOTHROW;
- static void getLangAndCountry(const QString &name, QLocale::Language &lang,
- QLocale::Script &script, QLocale::Country &cntry);
-
- QLocale::MeasurementSystem measurementSystem() const;
-
- QString dateTimeToString(QStringView format, const QDateTime &datetime,
- const QDate &dateOnly, const QTime &timeOnly,
- const QLocale *q) const;
-
- const QLocaleData *m_data;
- QBasicAtomicInt ref;
- QLocale::NumberOptions m_numberOptions;
-};
-
-#ifndef QT_NO_SYSTEMLOCALE
-const QLocaleData *QSystemLocale::fallbackUiLocaleData() const { return fallbackUiLocale().d->m_data; }
-#endif
-
-template <>
-inline QLocalePrivate *QSharedDataPointer<QLocalePrivate>::clone()
-{
- // cannot use QLocalePrivate's copy constructor
- // since it is deleted in C++11
- return QLocalePrivate::create(d->m_data, d->m_numberOptions);
-}
-
-inline char QLocaleData::digitToCLocale(QChar in) const
-{
- const ushort tenUnicode = m_zero + 10;
-
- if (in.unicode() >= m_zero && in.unicode() < tenUnicode)
- return '0' + in.unicode() - m_zero;
-
- if (in.unicode() >= '0' && in.unicode() <= '9')
- return in.toLatin1();
-
- if (in == m_plus || in == QLatin1Char('+'))
- return '+';
-
- if (in == m_minus || in == QLatin1Char('-') || in == QChar(0x2212))
- return '-';
-
- if (in == m_decimal)
- return '.';
-
- if (in == m_group)
- return ',';
-
- if (in == m_exponential || in == QChar::toUpper(m_exponential))
- return 'e';
-
- // In several languages group() is a non-breaking space (U+00A0) or its thin
- // version (U+202f), which look like spaces. People (and thus some of our
- // tests) use a regular space instead and complain if it doesn't work.
- if ((m_group == 0xA0 || m_group == 0x202f) && in.unicode() == ' ')
- return ',';
-
- return 0;
-}
-
-QString qt_readEscapedFormatString(QStringView format, int *idx);
-bool qt_splitLocaleName(const QString &name, QString &lang, QString &script, QString &cntry);
-int qt_repeatCount(QStringView s);
-
-enum { AsciiSpaceMask = (1u << (' ' - 1)) |
- (1u << ('\t' - 1)) | // 9: HT - horizontal tab
- (1u << ('\n' - 1)) | // 10: LF - line feed
- (1u << ('\v' - 1)) | // 11: VT - vertical tab
- (1u << ('\f' - 1)) | // 12: FF - form feed
- (1u << ('\r' - 1)) }; // 13: CR - carriage return
-Q_DECL_CONSTEXPR inline bool ascii_isspace(uchar c)
-{
- return c >= 1u && c <= 32u && (AsciiSpaceMask >> uint(c - 1)) & 1u;
-}
-
-#if defined(Q_COMPILER_CONSTEXPR)
-Q_STATIC_ASSERT(ascii_isspace(' '));
-Q_STATIC_ASSERT(ascii_isspace('\t'));
-Q_STATIC_ASSERT(ascii_isspace('\n'));
-Q_STATIC_ASSERT(ascii_isspace('\v'));
-Q_STATIC_ASSERT(ascii_isspace('\f'));
-Q_STATIC_ASSERT(ascii_isspace('\r'));
-Q_STATIC_ASSERT(!ascii_isspace('\0'));
-Q_STATIC_ASSERT(!ascii_isspace('\a'));
-Q_STATIC_ASSERT(!ascii_isspace('a'));
-Q_STATIC_ASSERT(!ascii_isspace('\177'));
-Q_STATIC_ASSERT(!ascii_isspace(uchar('\200')));
-Q_STATIC_ASSERT(!ascii_isspace(uchar('\xA0')));
-Q_STATIC_ASSERT(!ascii_isspace(uchar('\377')));
-#endif
-
-QT_END_NAMESPACE
-
-Q_DECLARE_METATYPE(QStringRef)
-Q_DECLARE_METATYPE(QList<Qt::DayOfWeek>)
-#ifndef QT_NO_SYSTEMLOCALE
-Q_DECLARE_METATYPE(QSystemLocale::CurrencyToStringArgument)
-#endif
-
-#endif // QLOCALE_P_H
diff --git a/src/corelib/tools/qlocale_tools.cpp b/src/corelib/tools/qlocale_tools.cpp
deleted file mode 100644
index 53258bec3e..0000000000
--- a/src/corelib/tools/qlocale_tools.cpp
+++ /dev/null
@@ -1,578 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Copyright (C) 2016 Intel Corporation.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#include "qlocale_tools_p.h"
-#include "qdoublescanprint_p.h"
-#include "qlocale_p.h"
-#include "qstring.h"
-
-#include <private/qnumeric_p.h>
-
-#include <ctype.h>
-#include <errno.h>
-#include <float.h>
-#include <limits.h>
-#include <math.h>
-#include <stdlib.h>
-#include <time.h>
-
-#if defined(Q_OS_LINUX) && !defined(__UCLIBC__)
-# include <fenv.h>
-#endif
-
-// Sizes as defined by the ISO C99 standard - fallback
-#ifndef LLONG_MAX
-# define LLONG_MAX Q_INT64_C(0x7fffffffffffffff)
-#endif
-#ifndef LLONG_MIN
-# define LLONG_MIN (-LLONG_MAX - Q_INT64_C(1))
-#endif
-#ifndef ULLONG_MAX
-# define ULLONG_MAX Q_UINT64_C(0xffffffffffffffff)
-#endif
-
-QT_BEGIN_NAMESPACE
-
-#include "../../3rdparty/freebsd/strtoull.c"
-#include "../../3rdparty/freebsd/strtoll.c"
-
-QT_CLOCALE_HOLDER
-
-void qt_doubleToAscii(double d, QLocaleData::DoubleForm form, int precision, char *buf, int bufSize,
- bool &sign, int &length, int &decpt)
-{
- if (bufSize == 0) {
- decpt = 0;
- sign = d < 0;
- length = 0;
- return;
- }
-
- // Detect special numbers (nan, +/-inf)
- // We cannot use the high-level API of libdouble-conversion as we need to apply locale-specific
- // formatting, such as decimal points, thousands-separators, etc. Because of this, we have to
- // check for infinity and NaN before calling DoubleToAscii.
- if (qt_is_inf(d)) {
- sign = d < 0;
- if (bufSize >= 3) {
- buf[0] = 'i';
- buf[1] = 'n';
- buf[2] = 'f';
- length = 3;
- } else {
- length = 0;
- }
- return;
- } else if (qt_is_nan(d)) {
- if (bufSize >= 3) {
- buf[0] = 'n';
- buf[1] = 'a';
- buf[2] = 'n';
- length = 3;
- } else {
- length = 0;
- }
- return;
- }
-
- if (form == QLocaleData::DFSignificantDigits && precision == 0)
- precision = 1; // 0 significant digits is silently converted to 1
-
-#if !defined(QT_NO_DOUBLECONVERSION) && !defined(QT_BOOTSTRAPPED)
- // one digit before the decimal dot, counts as significant digit for DoubleToStringConverter
- if (form == QLocaleData::DFExponent && precision >= 0)
- ++precision;
-
- double_conversion::DoubleToStringConverter::DtoaMode mode;
- if (precision == QLocale::FloatingPointShortest) {
- mode = double_conversion::DoubleToStringConverter::SHORTEST;
- } else if (form == QLocaleData::DFSignificantDigits || form == QLocaleData::DFExponent) {
- mode = double_conversion::DoubleToStringConverter::PRECISION;
- } else {
- mode = double_conversion::DoubleToStringConverter::FIXED;
- }
- double_conversion::DoubleToStringConverter::DoubleToAscii(d, mode, precision, buf, bufSize,
- &sign, &length, &decpt);
-#else // QT_NO_DOUBLECONVERSION || QT_BOOTSTRAPPED
-
- // Cut the precision at 999, to fit it into the format string. We can't get more than 17
- // significant digits, so anything after that is mostly noise. You do get closer to the "middle"
- // of the range covered by the given double with more digits, so to a degree it does make sense
- // to honor higher precisions. We define that at more than 999 digits that is not the case.
- if (precision > 999)
- precision = 999;
- else if (precision == QLocale::FloatingPointShortest)
- precision = QLocaleData::DoubleMaxSignificant; // "shortest" mode not supported by snprintf
-
- if (isZero(d)) {
- // Negative zero is expected as simple "0", not "-0". We cannot do d < 0, though.
- sign = false;
- buf[0] = '0';
- length = 1;
- decpt = 1;
- return;
- } else if (d < 0) {
- sign = true;
- d = -d;
- } else {
- sign = false;
- }
-
- const int formatLength = 7; // '%', '.', 3 digits precision, 'f', '\0'
- char format[formatLength];
- format[formatLength - 1] = '\0';
- format[0] = '%';
- format[1] = '.';
- format[2] = char((precision / 100) % 10) + '0';
- format[3] = char((precision / 10) % 10) + '0';
- format[4] = char(precision % 10) + '0';
- int extraChars;
- switch (form) {
- case QLocaleData::DFDecimal:
- format[formatLength - 2] = 'f';
- // <anything> '.' <precision> '\0' - optimize for numbers smaller than 512k
- extraChars = (d > (1 << 19) ? QLocaleData::DoubleMaxDigitsBeforeDecimal : 6) + 2;
- break;
- case QLocaleData::DFExponent:
- format[formatLength - 2] = 'e';
- // '.', 'e', '-', <exponent> '\0'
- extraChars = 7;
- break;
- case QLocaleData::DFSignificantDigits:
- format[formatLength - 2] = 'g';
-
- // either the same as in the 'e' case, or '.' and '\0'
- // precision covers part before '.'
- extraChars = 7;
- break;
- default:
- Q_UNREACHABLE();
- }
-
- QVarLengthArray<char> target(precision + extraChars);
-
- length = qDoubleSnprintf(target.data(), target.size(), QT_CLOCALE, format, d);
- int firstSignificant = 0;
- int decptInTarget = length;
-
- // Find the first significant digit (not 0), and note any '.' we encounter.
- // There is no '-' at the front of target because we made sure d > 0 above.
- while (firstSignificant < length) {
- if (target[firstSignificant] == '.')
- decptInTarget = firstSignificant;
- else if (target[firstSignificant] != '0')
- break;
- ++firstSignificant;
- }
-
- // If no '.' found so far, search the rest of the target buffer for it.
- if (decptInTarget == length)
- decptInTarget = std::find(target.data() + firstSignificant, target.data() + length, '.') -
- target.data();
-
- int eSign = length;
- if (form != QLocaleData::DFDecimal) {
- // In 'e' or 'g' form, look for the 'e'.
- eSign = std::find(target.data() + firstSignificant, target.data() + length, 'e') -
- target.data();
-
- if (eSign < length) {
- // If 'e' is found, the final decimal point is determined by the number after 'e'.
- // Mind that the final decimal point, decpt, is the offset of the decimal point from the
- // start of the resulting string in buf. It may be negative or larger than bufSize, in
- // which case the missing digits are zeroes. In the 'e' case decptInTarget is always 1,
- // as variants of snprintf always generate numbers with one digit before the '.' then.
- // This is why the final decimal point is offset by 1, relative to the number after 'e'.
- bool ok;
- const char *endptr;
- decpt = qstrtoll(target.data() + eSign + 1, &endptr, 10, &ok) + 1;
- Q_ASSERT(ok);
- Q_ASSERT(endptr - target.data() <= length);
- } else {
- // No 'e' found, so it's the 'f' form. Variants of snprintf generate numbers with
- // potentially multiple digits before the '.', but without decimal exponent then. So we
- // get the final decimal point from the position of the '.'. The '.' itself takes up one
- // character. We adjust by 1 below if that gets in the way.
- decpt = decptInTarget - firstSignificant;
- }
- } else {
- // In 'f' form, there can not be an 'e', so it's enough to look for the '.'
- // (and possibly adjust by 1 below)
- decpt = decptInTarget - firstSignificant;
- }
-
- // Move the actual digits from the snprintf target to the actual buffer.
- if (decptInTarget > firstSignificant) {
- // First move the digits before the '.', if any
- int lengthBeforeDecpt = decptInTarget - firstSignificant;
- memcpy(buf, target.data() + firstSignificant, qMin(lengthBeforeDecpt, bufSize));
- if (eSign > decptInTarget && lengthBeforeDecpt < bufSize) {
- // Then move any remaining digits, until 'e'
- memcpy(buf + lengthBeforeDecpt, target.data() + decptInTarget + 1,
- qMin(eSign - decptInTarget - 1, bufSize - lengthBeforeDecpt));
- // The final length of the output is the distance between the first significant digit
- // and 'e' minus 1, for the '.', except if the buffer is smaller.
- length = qMin(eSign - firstSignificant - 1, bufSize);
- } else {
- // 'e' was before the decpt or things didn't fit. Don't subtract the '.' from the length.
- length = qMin(eSign - firstSignificant, bufSize);
- }
- } else {
- if (eSign > firstSignificant) {
- // If there are any significant digits at all, they are all after the '.' now.
- // Just copy them straight away.
- memcpy(buf, target.data() + firstSignificant, qMin(eSign - firstSignificant, bufSize));
-
- // The decimal point was before the first significant digit, so we were one off above.
- // Consider 0.1 - buf will be just '1', and decpt should be 0. But
- // "decptInTarget - firstSignificant" will yield -1.
- ++decpt;
- length = qMin(eSign - firstSignificant, bufSize);
- } else {
- // No significant digits means the number is just 0.
- buf[0] = '0';
- length = 1;
- decpt = 1;
- }
- }
-#endif // QT_NO_DOUBLECONVERSION || QT_BOOTSTRAPPED
- while (length > 1 && buf[length - 1] == '0') // drop trailing zeroes
- --length;
-}
-
-double qt_asciiToDouble(const char *num, int numLen, bool &ok, int &processed,
- StrayCharacterMode strayCharMode)
-{
- if (*num == '\0') {
- ok = false;
- processed = 0;
- return 0.0;
- }
-
- ok = true;
-
- // We have to catch NaN before because we need NaN as marker for "garbage" in the
- // libdouble-conversion case and, in contrast to libdouble-conversion or sscanf, we don't allow
- // "-nan" or "+nan"
- if (qstrcmp(num, "nan") == 0) {
- processed = 3;
- return qt_snan();
- } else if ((num[0] == '-' || num[0] == '+') && qstrcmp(num + 1, "nan") == 0) {
- processed = 0;
- ok = false;
- return 0.0;
- }
-
- // Infinity values are implementation defined in the sscanf case. In the libdouble-conversion
- // case we need infinity as overflow marker.
- if (qstrcmp(num, "+inf") == 0) {
- processed = 4;
- return qt_inf();
- } else if (qstrcmp(num, "inf") == 0) {
- processed = 3;
- return qt_inf();
- } else if (qstrcmp(num, "-inf") == 0) {
- processed = 4;
- return -qt_inf();
- }
-
- double d = 0.0;
-#if !defined(QT_NO_DOUBLECONVERSION) && !defined(QT_BOOTSTRAPPED)
- int conv_flags = double_conversion::StringToDoubleConverter::NO_FLAGS;
- if (strayCharMode == TrailingJunkAllowed) {
- conv_flags = double_conversion::StringToDoubleConverter::ALLOW_TRAILING_JUNK;
- } else if (strayCharMode == WhitespacesAllowed) {
- conv_flags = double_conversion::StringToDoubleConverter::ALLOW_LEADING_SPACES
- | double_conversion::StringToDoubleConverter::ALLOW_TRAILING_SPACES;
- }
- double_conversion::StringToDoubleConverter conv(conv_flags, 0.0, qt_snan(), 0, 0);
- d = conv.StringToDouble(num, numLen, &processed);
-
- if (!qIsFinite(d)) {
- ok = false;
- if (qIsNaN(d)) {
- // Garbage found. We don't accept it and return 0.
- processed = 0;
- return 0.0;
- } else {
- // Overflow. That's not OK, but we still return infinity.
- return d;
- }
- }
-#else
- if (qDoubleSscanf(num, QT_CLOCALE, "%lf%n", &d, &processed) < 1)
- processed = 0;
-
- if ((strayCharMode == TrailingJunkProhibited && processed != numLen) || qIsNaN(d)) {
- // Implementation defined nan symbol or garbage found. We don't accept it.
- processed = 0;
- ok = false;
- return 0.0;
- }
-
- if (!qIsFinite(d)) {
- // Overflow. Check for implementation-defined infinity symbols and reject them.
- // We assume that any infinity symbol has to contain a character that cannot be part of a
- // "normal" number (that is 0-9, ., -, +, e).
- ok = false;
- for (int i = 0; i < processed; ++i) {
- char c = num[i];
- if ((c < '0' || c > '9') && c != '.' && c != '-' && c != '+' && c != 'e' && c != 'E') {
- // Garbage found
- processed = 0;
- return 0.0;
- }
- }
- return d;
- }
-#endif // !defined(QT_NO_DOUBLECONVERSION) && !defined(QT_BOOTSTRAPPED)
-
- // Otherwise we would have gotten NaN or sorted it out above.
- Q_ASSERT(strayCharMode == TrailingJunkAllowed || processed == numLen);
-
- // Check if underflow has occurred.
- if (isZero(d)) {
- for (int i = 0; i < processed; ++i) {
- if (num[i] >= '1' && num[i] <= '9') {
- // if a digit before any 'e' is not 0, then a non-zero number was intended.
- ok = false;
- return 0.0;
- } else if (num[i] == 'e' || num[i] == 'E') {
- break;
- }
- }
- }
- return d;
-}
-
-unsigned long long
-qstrtoull(const char * nptr, const char **endptr, int base, bool *ok)
-{
- // strtoull accepts negative numbers. We don't.
- // Use a different variable so we pass the original nptr to strtoul
- // (we need that so endptr may be nptr in case of failure)
- const char *begin = nptr;
- while (ascii_isspace(*begin))
- ++begin;
- if (*begin == '-') {
- *ok = false;
- return 0;
- }
-
- *ok = true;
- errno = 0;
- char *endptr2 = 0;
- unsigned long long result = qt_strtoull(nptr, &endptr2, base);
- if (endptr)
- *endptr = endptr2;
- if ((result == 0 || result == std::numeric_limits<unsigned long long>::max())
- && (errno || endptr2 == nptr)) {
- *ok = false;
- return 0;
- }
- return result;
-}
-
-long long
-qstrtoll(const char * nptr, const char **endptr, int base, bool *ok)
-{
- *ok = true;
- errno = 0;
- char *endptr2 = 0;
- long long result = qt_strtoll(nptr, &endptr2, base);
- if (endptr)
- *endptr = endptr2;
- if ((result == 0 || result == std::numeric_limits<long long>::min()
- || result == std::numeric_limits<long long>::max())
- && (errno || nptr == endptr2)) {
- *ok = false;
- return 0;
- }
- return result;
-}
-
-QString qulltoa(qulonglong l, int base, const QChar _zero)
-{
- ushort buff[65]; // length of MAX_ULLONG in base 2
- ushort *p = buff + 65;
-
- if (base != 10 || _zero.unicode() == '0') {
- while (l != 0) {
- int c = l % base;
-
- --p;
-
- if (c < 10)
- *p = '0' + c;
- else
- *p = c - 10 + 'a';
-
- l /= base;
- }
- }
- else {
- while (l != 0) {
- int c = l % base;
-
- *(--p) = _zero.unicode() + c;
-
- l /= base;
- }
- }
-
- return QString(reinterpret_cast<QChar *>(p), 65 - (p - buff));
-}
-
-QString &decimalForm(QChar zero, QChar decimal, QChar group,
- QString &digits, int decpt, int precision,
- PrecisionMode pm,
- bool always_show_decpt,
- bool thousands_group)
-{
- if (decpt < 0) {
- for (int i = 0; i < -decpt; ++i)
- digits.prepend(zero);
- decpt = 0;
- }
- else if (decpt > digits.length()) {
- for (int i = digits.length(); i < decpt; ++i)
- digits.append(zero);
- }
-
- if (pm == PMDecimalDigits) {
- uint decimal_digits = digits.length() - decpt;
- for (int i = decimal_digits; i < precision; ++i)
- digits.append(zero);
- }
- else if (pm == PMSignificantDigits) {
- for (int i = digits.length(); i < precision; ++i)
- digits.append(zero);
- }
- else { // pm == PMChopTrailingZeros
- }
-
- if (always_show_decpt || decpt < digits.length())
- digits.insert(decpt, decimal);
-
- if (thousands_group) {
- for (int i = decpt - 3; i > 0; i -= 3)
- digits.insert(i, group);
- }
-
- if (decpt == 0)
- digits.prepend(zero);
-
- return digits;
-}
-
-QString &exponentForm(QChar zero, QChar decimal, QChar exponential,
- QChar group, QChar plus, QChar minus,
- QString &digits, int decpt, int precision,
- PrecisionMode pm,
- bool always_show_decpt,
- bool leading_zero_in_exponent)
-{
- int exp = decpt - 1;
-
- if (pm == PMDecimalDigits) {
- for (int i = digits.length(); i < precision + 1; ++i)
- digits.append(zero);
- }
- else if (pm == PMSignificantDigits) {
- for (int i = digits.length(); i < precision; ++i)
- digits.append(zero);
- }
- else { // pm == PMChopTrailingZeros
- }
-
- if (always_show_decpt || digits.length() > 1)
- digits.insert(1, decimal);
-
- digits.append(exponential);
- digits.append(QLocaleData::longLongToString(zero, group, plus, minus,
- exp, leading_zero_in_exponent ? 2 : 1, 10, -1, QLocaleData::AlwaysShowSign));
-
- return digits;
-}
-
-double qstrtod(const char *s00, const char **se, bool *ok)
-{
- const int len = static_cast<int>(strlen(s00));
- Q_ASSERT(len >= 0);
- return qstrntod(s00, len, se, ok);
-}
-
-/*!
- \internal
-
- Converts the initial portion of the string pointed to by \a s00 to a double, using the 'C' locale.
- */
-double qstrntod(const char *s00, int len, const char **se, bool *ok)
-{
- int processed = 0;
- bool nonNullOk = false;
- double d = qt_asciiToDouble(s00, len, nonNullOk, processed, TrailingJunkAllowed);
- if (se)
- *se = s00 + processed;
- if (ok)
- *ok = nonNullOk;
- return d;
-}
-
-QString qdtoa(qreal d, int *decpt, int *sign)
-{
- bool nonNullSign = false;
- int nonNullDecpt = 0;
- int length = 0;
-
- // Some versions of libdouble-conversion like an extra digit, probably for '\0'
- char result[QLocaleData::DoubleMaxSignificant + 1];
- qt_doubleToAscii(d, QLocaleData::DFSignificantDigits, QLocale::FloatingPointShortest, result,
- QLocaleData::DoubleMaxSignificant + 1, nonNullSign, length, nonNullDecpt);
-
- if (sign)
- *sign = nonNullSign ? 1 : 0;
- if (decpt)
- *decpt = nonNullDecpt;
-
- return QLatin1String(result, length);
-}
-
-QT_END_NAMESPACE
diff --git a/src/corelib/tools/qlocale_tools_p.h b/src/corelib/tools/qlocale_tools_p.h
deleted file mode 100644
index 594331ae37..0000000000
--- a/src/corelib/tools/qlocale_tools_p.h
+++ /dev/null
@@ -1,124 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#ifndef QLOCALE_TOOLS_P_H
-#define QLOCALE_TOOLS_P_H
-
-//
-// W A R N I N G
-// -------------
-//
-// This file is not part of the Qt API. It exists for the convenience
-// of internal files. This header file may change from version to version
-// without notice, or even be removed.
-//
-// We mean it.
-//
-
-#include "qlocale_p.h"
-#include "qstring.h"
-
-#if !defined(QT_QLOCALE_NEEDS_VOLATILE)
-# if defined(Q_CC_GNU)
-# if __GNUC__ == 4
-# define QT_QLOCALE_NEEDS_VOLATILE
-# elif defined(Q_OS_WIN)
-# define QT_QLOCALE_NEEDS_VOLATILE
-# endif
-# endif
-#endif
-
-#if defined(QT_QLOCALE_NEEDS_VOLATILE)
-# define NEEDS_VOLATILE volatile
-#else
-# define NEEDS_VOLATILE
-#endif
-
-QT_BEGIN_NAMESPACE
-
-enum StrayCharacterMode {
- TrailingJunkProhibited,
- TrailingJunkAllowed,
- WhitespacesAllowed
-};
-
-double qt_asciiToDouble(const char *num, int numLen, bool &ok, int &processed,
- StrayCharacterMode strayCharMode = TrailingJunkProhibited);
-void qt_doubleToAscii(double d, QLocaleData::DoubleForm form, int precision, char *buf, int bufSize,
- bool &sign, int &length, int &decpt);
-
-QString qulltoa(qulonglong l, int base, const QChar _zero);
-Q_CORE_EXPORT QString qdtoa(qreal d, int *decpt, int *sign);
-
-enum PrecisionMode {
- PMDecimalDigits = 0x01,
- PMSignificantDigits = 0x02,
- PMChopTrailingZeros = 0x03
-};
-
-QString &decimalForm(QChar zero, QChar decimal, QChar group,
- QString &digits, int decpt, int precision,
- PrecisionMode pm,
- bool always_show_decpt,
- bool thousands_group);
-QString &exponentForm(QChar zero, QChar decimal, QChar exponential,
- QChar group, QChar plus, QChar minus,
- QString &digits, int decpt, int precision,
- PrecisionMode pm,
- bool always_show_decpt,
- bool leading_zero_in_exponent);
-
-inline bool isZero(double d)
-{
- uchar *ch = (uchar *)&d;
- if (QSysInfo::ByteOrder == QSysInfo::BigEndian) {
- return !(ch[0] & 0x7F || ch[1] || ch[2] || ch[3] || ch[4] || ch[5] || ch[6] || ch[7]);
- } else {
- return !(ch[7] & 0x7F || ch[6] || ch[5] || ch[4] || ch[3] || ch[2] || ch[1] || ch[0]);
- }
-}
-
-Q_CORE_EXPORT double qstrtod(const char *s00, char const **se, bool *ok);
-Q_CORE_EXPORT double qstrntod(const char *s00, int len, char const **se, bool *ok);
-qlonglong qstrtoll(const char *nptr, const char **endptr, int base, bool *ok);
-qulonglong qstrtoull(const char *nptr, const char **endptr, int base, bool *ok);
-
-QT_END_NAMESPACE
-
-#endif
diff --git a/src/corelib/tools/qlocale_unix.cpp b/src/corelib/tools/qlocale_unix.cpp
deleted file mode 100644
index f202082213..0000000000
--- a/src/corelib/tools/qlocale_unix.cpp
+++ /dev/null
@@ -1,294 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#include "qlocale_p.h"
-
-#include "qstringbuilder.h"
-#include "qdatetime.h"
-#include "qstringlist.h"
-#include "qvariant.h"
-#include "qreadwritelock.h"
-
-QT_BEGIN_NAMESPACE
-
-#ifndef QT_NO_SYSTEMLOCALE
-struct QSystemLocaleData
-{
- QSystemLocaleData()
- : lc_numeric(QLocale::C)
- ,lc_time(QLocale::C)
- ,lc_monetary(QLocale::C)
- ,lc_messages(QLocale::C)
- {
- readEnvironment();
- }
-
- void readEnvironment();
-
- QReadWriteLock lock;
-
- QLocale lc_numeric;
- QLocale lc_time;
- QLocale lc_monetary;
- QLocale lc_messages;
- QByteArray lc_messages_var;
- QByteArray lc_measurement_var;
- QStringList uiLanguages;
-};
-
-void QSystemLocaleData::readEnvironment()
-{
- QWriteLocker locker(&lock);
-
- QByteArray all = qgetenv("LC_ALL");
- QByteArray numeric = all.isEmpty() ? qgetenv("LC_NUMERIC") : all;
- QByteArray time = all.isEmpty() ? qgetenv("LC_TIME") : all;
- QByteArray monetary = all.isEmpty() ? qgetenv("LC_MONETARY") : all;
- lc_messages_var = all.isEmpty() ? qgetenv("LC_MESSAGES") : all;
- lc_measurement_var = all.isEmpty() ? qgetenv("LC_MEASUREMENT") : all;
- QByteArray lang = qgetenv("LANG");
- if (lang.isEmpty())
- lang = QByteArray("C");
- if (numeric.isEmpty())
- numeric = lang;
- if (time.isEmpty())
- time = lang;
- if (monetary.isEmpty())
- monetary = lang;
- if (lc_messages_var.isEmpty())
- lc_messages_var = lang;
- if (lc_measurement_var.isEmpty())
- lc_measurement_var = lang;
- lc_numeric = QLocale(QString::fromLatin1(numeric));
- lc_time = QLocale(QString::fromLatin1(time));
- lc_monetary = QLocale(QString::fromLatin1(monetary));
- lc_messages = QLocale(QString::fromLatin1(lc_messages_var));
-}
-
-Q_GLOBAL_STATIC(QSystemLocaleData, qSystemLocaleData)
-
-#endif
-
-#ifndef QT_NO_SYSTEMLOCALE
-
-static bool contradicts(const QString &maybe, const QString &known)
-{
- if (maybe.isEmpty())
- return false;
-
- /*
- If \a known (our current best shot at deciding which language to use)
- provides more information (e.g. script, country) than \a maybe (a
- candidate to replace \a known) and \a maybe agrees with \a known in what
- it does provide, we keep \a known; this happens when \a maybe comes from
- LANGUAGE (usually a simple language code) and LANG includes script and/or
- country. A textual comparison won't do because, for example, bn (Bengali)
- isn't a prefix of ben_IN, but the latter is a refinement of the former.
- (Meanwhile, bn is a prefix of bnt, Bantu; and a prefix of ben is be,
- Belarusian. There are many more such prefixings between two- and
- three-letter codes.)
- */
- QLocale::Language langm, langk;
- QLocale::Script scriptm, scriptk;
- QLocale::Country landm, landk;
- QLocalePrivate::getLangAndCountry(maybe, langm, scriptm, landm);
- QLocalePrivate::getLangAndCountry(known, langk, scriptk, landk);
- return (langm != QLocale::AnyLanguage && langm != langk)
- || (scriptm != QLocale::AnyScript && scriptm != scriptk)
- || (landm != QLocale::AnyCountry && landm != landk);
-}
-
-QLocale QSystemLocale::fallbackUiLocale() const
-{
- // See man 7 locale for precedence - LC_ALL beats LC_MESSAGES beats LANG:
- QString lang = qEnvironmentVariable("LC_ALL");
- if (lang.isEmpty())
- lang = qEnvironmentVariable("LC_MESSAGES");
- if (lang.isEmpty())
- lang = qEnvironmentVariable("LANG");
- // if the locale is the "C" locale, then we can return the language we found here:
- if (lang.isEmpty() || lang == QLatin1String("C") || lang == QLatin1String("POSIX"))
- return QLocale(lang);
-
- // ... otherwise, if the first part of LANGUAGE says more than or
- // contradicts what we have, use that:
- QString language = qEnvironmentVariable("LANGUAGE");
- if (!language.isEmpty()) {
- language = language.split(QLatin1Char(':')).constFirst();
- if (contradicts(language, lang))
- return QLocale(language);
- }
-
- return QLocale(lang);
-}
-
-QVariant QSystemLocale::query(QueryType type, QVariant in) const
-{
- QSystemLocaleData *d = qSystemLocaleData();
-
- if (type == LocaleChanged) {
- d->readEnvironment();
- return QVariant();
- }
-
- QReadLocker locker(&d->lock);
-
- const QLocale &lc_numeric = d->lc_numeric;
- const QLocale &lc_time = d->lc_time;
- const QLocale &lc_monetary = d->lc_monetary;
- const QLocale &lc_messages = d->lc_messages;
-
- switch (type) {
- case DecimalPoint:
- return lc_numeric.decimalPoint();
- case GroupSeparator:
- return lc_numeric.groupSeparator();
- case ZeroDigit:
- return lc_numeric.zeroDigit();
- case NegativeSign:
- return lc_numeric.negativeSign();
- case DateFormatLong:
- return lc_time.dateFormat(QLocale::LongFormat);
- case DateFormatShort:
- return lc_time.dateFormat(QLocale::ShortFormat);
- case TimeFormatLong:
- return lc_time.timeFormat(QLocale::LongFormat);
- case TimeFormatShort:
- return lc_time.timeFormat(QLocale::ShortFormat);
- case DayNameLong:
- return lc_time.dayName(in.toInt(), QLocale::LongFormat);
- case DayNameShort:
- return lc_time.dayName(in.toInt(), QLocale::ShortFormat);
- case MonthNameLong:
- return lc_time.monthName(in.toInt(), QLocale::LongFormat);
- case MonthNameShort:
- return lc_time.monthName(in.toInt(), QLocale::ShortFormat);
- case StandaloneMonthNameLong:
- return lc_time.standaloneMonthName(in.toInt(), QLocale::LongFormat);
- case StandaloneMonthNameShort:
- return lc_time.standaloneMonthName(in.toInt(), QLocale::ShortFormat);
- case DateToStringLong:
- return lc_time.toString(in.toDate(), QLocale::LongFormat);
- case DateToStringShort:
- return lc_time.toString(in.toDate(), QLocale::ShortFormat);
- case TimeToStringLong:
- return lc_time.toString(in.toTime(), QLocale::LongFormat);
- case TimeToStringShort:
- return lc_time.toString(in.toTime(), QLocale::ShortFormat);
- case DateTimeFormatLong:
- return lc_time.dateTimeFormat(QLocale::LongFormat);
- case DateTimeFormatShort:
- return lc_time.dateTimeFormat(QLocale::ShortFormat);
- case DateTimeToStringLong:
- return lc_time.toString(in.toDateTime(), QLocale::LongFormat);
- case DateTimeToStringShort:
- return lc_time.toString(in.toDateTime(), QLocale::ShortFormat);
- case PositiveSign:
- return lc_numeric.positiveSign();
- case AMText:
- return lc_time.amText();
- case PMText:
- return lc_time.pmText();
- case FirstDayOfWeek:
- return lc_time.firstDayOfWeek();
- case CurrencySymbol:
- return lc_monetary.currencySymbol(QLocale::CurrencySymbolFormat(in.toUInt()));
- case CurrencyToString: {
- switch (in.type()) {
- case QVariant::Int:
- return lc_monetary.toCurrencyString(in.toInt());
- case QVariant::UInt:
- return lc_monetary.toCurrencyString(in.toUInt());
- case QVariant::Double:
- return lc_monetary.toCurrencyString(in.toDouble());
- case QVariant::LongLong:
- return lc_monetary.toCurrencyString(in.toLongLong());
- case QVariant::ULongLong:
- return lc_monetary.toCurrencyString(in.toULongLong());
- default:
- break;
- }
- return QString();
- }
- case MeasurementSystem: {
- const QString meas_locale = QString::fromLatin1(d->lc_measurement_var.constData(), d->lc_measurement_var.size());
- if (meas_locale.compare(QLatin1String("Metric"), Qt::CaseInsensitive) == 0)
- return QLocale::MetricSystem;
- if (meas_locale.compare(QLatin1String("Other"), Qt::CaseInsensitive) == 0)
- return QLocale::MetricSystem;
- return QVariant((int)QLocale(meas_locale).measurementSystem());
- }
- case UILanguages: {
- if (!d->uiLanguages.isEmpty())
- return d->uiLanguages;
- QString languages = QString::fromLatin1(qgetenv("LANGUAGE"));
- QStringList lst;
- if (languages.isEmpty())
- lst.append(QString::fromLatin1(d->lc_messages_var));
- else
- lst = languages.split(QLatin1Char(':'));
-
- for (int i = 0; i < lst.size(); ++i) {
- const QString &name = lst.at(i);
- QString lang, script, cntry;
- if (qt_splitLocaleName(name, lang, script, cntry)) {
- if (!cntry.length())
- d->uiLanguages.append(lang);
- else
- d->uiLanguages.append(lang % QLatin1Char('-') % cntry);
- }
- }
- return d->uiLanguages.isEmpty() ? QVariant() : QVariant(d->uiLanguages);
- }
- case StringToStandardQuotation:
- return lc_messages.quoteString(in.value<QStringRef>());
- case StringToAlternateQuotation:
- return lc_messages.quoteString(in.value<QStringRef>(), QLocale::AlternateQuotation);
- case ListToSeparatedString:
- return lc_messages.createSeparatedList(in.toStringList());
- case LocaleChanged:
- Q_ASSERT(false);
- default:
- break;
- }
- return QVariant();
-}
-#endif // QT_NO_SYSTEMLOCALE
-
-QT_END_NAMESPACE
diff --git a/src/corelib/tools/qlocale_win.cpp b/src/corelib/tools/qlocale_win.cpp
deleted file mode 100644
index ebc4430046..0000000000
--- a/src/corelib/tools/qlocale_win.cpp
+++ /dev/null
@@ -1,1135 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Copyright (C) 2016 Intel Corporation.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#include "qlocale_p.h"
-#include "qlocale_tools_p.h"
-
-#include "qstringlist.h"
-#include "qvariant.h"
-#include "qdatetime.h"
-#include "qdebug.h"
-
-#ifdef Q_OS_WIN
-# include <qt_windows.h>
-# include <time.h>
-#endif
-
-#ifdef Q_OS_WINRT
-#include <qfunctions_winrt.h>
-
-#include <wrl.h>
-#include <windows.foundation.h>
-#include <windows.foundation.collections.h>
-#include <windows.system.userprofile.h>
-#endif // Q_OS_WINRT
-
-QT_BEGIN_NAMESPACE
-
-#ifndef Q_OS_WINRT
-static QByteArray getWinLocaleName(LCID id = LOCALE_USER_DEFAULT);
-static QString winIso639LangName(LCID id = LOCALE_USER_DEFAULT);
-static QString winIso3116CtryName(LCID id = LOCALE_USER_DEFAULT);
-#else // !Q_OS_WINRT
-using namespace Microsoft::WRL;
-using namespace Microsoft::WRL::Wrappers;
-using namespace ABI::Windows::Foundation;
-using namespace ABI::Windows::System::UserProfile;
-
-static QByteArray getWinLocaleName(LPWSTR id = LOCALE_NAME_USER_DEFAULT);
-static const char *winLangCodeToIsoName(int code);
-static QString winIso639LangName(LPWSTR id = LOCALE_NAME_USER_DEFAULT);
-static QString winIso3116CtryName(LPWSTR id = LOCALE_NAME_USER_DEFAULT);
-#endif // Q_OS_WINRT
-
-#ifndef QT_NO_SYSTEMLOCALE
-
-#ifndef MUI_LANGUAGE_NAME
-#define MUI_LANGUAGE_NAME 0x8
-#endif
-#ifndef LOCALE_SSHORTESTDAYNAME1
-# define LOCALE_SSHORTESTDAYNAME1 0x0060
-# define LOCALE_SSHORTESTDAYNAME2 0x0061
-# define LOCALE_SSHORTESTDAYNAME3 0x0062
-# define LOCALE_SSHORTESTDAYNAME4 0x0063
-# define LOCALE_SSHORTESTDAYNAME5 0x0064
-# define LOCALE_SSHORTESTDAYNAME6 0x0065
-# define LOCALE_SSHORTESTDAYNAME7 0x0066
-#endif
-#ifndef LOCALE_SNATIVELANGUAGENAME
-# define LOCALE_SNATIVELANGUAGENAME 0x00000004
-#endif
-#ifndef LOCALE_SNATIVECOUNTRYNAME
-# define LOCALE_SNATIVECOUNTRYNAME 0x00000008
-#endif
-#ifndef LOCALE_SSHORTTIME
-# define LOCALE_SSHORTTIME 0x00000079
-#endif
-
-struct QSystemLocalePrivate
-{
- QSystemLocalePrivate();
-
- QChar zeroDigit();
- QChar decimalPoint();
- QChar groupSeparator();
- QChar negativeSign();
- QChar positiveSign();
- QVariant dateFormat(QLocale::FormatType);
- QVariant timeFormat(QLocale::FormatType);
- QVariant dateTimeFormat(QLocale::FormatType);
- QVariant dayName(int, QLocale::FormatType);
- QVariant monthName(int, QLocale::FormatType);
- QVariant toString(const QDate &, QLocale::FormatType);
- QVariant toString(const QTime &, QLocale::FormatType);
- QVariant toString(const QDateTime &, QLocale::FormatType);
- QVariant measurementSystem();
- QVariant amText();
- QVariant pmText();
- QVariant firstDayOfWeek();
- QVariant currencySymbol(QLocale::CurrencySymbolFormat);
- QVariant toCurrencyString(const QSystemLocale::CurrencyToStringArgument &);
- QVariant uiLanguages();
- QVariant nativeLanguageName();
- QVariant nativeCountryName();
-
- void update();
-
-private:
- enum SubstitutionType {
- SUnknown,
- SContext,
- SAlways,
- SNever
- };
-
- // cached values:
-#ifndef Q_OS_WINRT
- LCID lcid;
-#else
- WCHAR lcName[LOCALE_NAME_MAX_LENGTH];
-#endif
- SubstitutionType substitutionType;
- QChar zero;
-
- int getLocaleInfo(LCTYPE type, LPWSTR data, int size);
- QString getLocaleInfo(LCTYPE type, int maxlen = 0);
- int getLocaleInfo_int(LCTYPE type, int maxlen = 0);
- QChar getLocaleInfo_qchar(LCTYPE type);
-
- int getCurrencyFormat(DWORD flags, LPCWSTR value, const CURRENCYFMTW *format, LPWSTR data, int size);
- int getDateFormat(DWORD flags, const SYSTEMTIME * date, LPCWSTR format, LPWSTR data, int size);
- int getTimeFormat(DWORD flags, const SYSTEMTIME *date, LPCWSTR format, LPWSTR data, int size);
-
- SubstitutionType substitution();
- QString &substituteDigits(QString &string);
-
- static QString winToQtFormat(QStringView sys_fmt);
-
-};
-Q_GLOBAL_STATIC(QSystemLocalePrivate, systemLocalePrivate)
-
-QSystemLocalePrivate::QSystemLocalePrivate()
- : substitutionType(SUnknown)
-{
-#ifndef Q_OS_WINRT
- lcid = GetUserDefaultLCID();
-#else
- GetUserDefaultLocaleName(lcName, LOCALE_NAME_MAX_LENGTH);
-#endif
-}
-
-inline int QSystemLocalePrivate::getCurrencyFormat(DWORD flags, LPCWSTR value, const CURRENCYFMTW *format, LPWSTR data, int size)
-{
-#ifndef Q_OS_WINRT
- return GetCurrencyFormat(lcid, flags, value, format, data, size);
-#else
- return GetCurrencyFormatEx(lcName, flags, value, format, data, size);
-#endif
-}
-
-inline int QSystemLocalePrivate::getDateFormat(DWORD flags, const SYSTEMTIME * date, LPCWSTR format, LPWSTR data, int size)
-{
-#ifndef Q_OS_WINRT
- return GetDateFormat(lcid, flags, date, format, data, size);
-#else
- return GetDateFormatEx(lcName, flags, date, format, data, size, NULL);
-#endif
-}
-
-inline int QSystemLocalePrivate::getTimeFormat(DWORD flags, const SYSTEMTIME *date, LPCWSTR format, LPWSTR data, int size)
-{
-#ifndef Q_OS_WINRT
- return GetTimeFormat(lcid, flags, date, format, data, size);
-#else
- return GetTimeFormatEx(lcName, flags, date, format, data, size);
-#endif
-}
-
-inline int QSystemLocalePrivate::getLocaleInfo(LCTYPE type, LPWSTR data, int size)
-{
-#ifndef Q_OS_WINRT
- return GetLocaleInfo(lcid, type, data, size);
-#else
- return GetLocaleInfoEx(lcName, type, data, size);
-#endif
-}
-
-QString QSystemLocalePrivate::getLocaleInfo(LCTYPE type, int maxlen)
-{
- QVarLengthArray<wchar_t, 64> buf(maxlen ? maxlen : 64);
- if (!getLocaleInfo(type, buf.data(), buf.size()))
- return QString();
- if (GetLastError() == ERROR_INSUFFICIENT_BUFFER) {
- int cnt = getLocaleInfo(type, 0, 0);
- if (cnt == 0)
- return QString();
- buf.resize(cnt);
- if (!getLocaleInfo(type, buf.data(), buf.size()))
- return QString();
- }
- return QString::fromWCharArray(buf.data());
-}
-
-int QSystemLocalePrivate::getLocaleInfo_int(LCTYPE type, int maxlen)
-{
- QString str = getLocaleInfo(type, maxlen);
- bool ok = false;
- int v = str.toInt(&ok);
- return ok ? v : 0;
-}
-
-QChar QSystemLocalePrivate::getLocaleInfo_qchar(LCTYPE type)
-{
- QString str = getLocaleInfo(type);
- return str.isEmpty() ? QChar() : str.at(0);
-}
-
-QSystemLocalePrivate::SubstitutionType QSystemLocalePrivate::substitution()
-{
- if (substitutionType == SUnknown) {
- wchar_t buf[8];
- if (!getLocaleInfo(LOCALE_IDIGITSUBSTITUTION, buf, 8)) {
- substitutionType = QSystemLocalePrivate::SNever;
- return substitutionType;
- }
- if (buf[0] == '1')
- substitutionType = QSystemLocalePrivate::SNever;
- else if (buf[0] == '0')
- substitutionType = QSystemLocalePrivate::SContext;
- else if (buf[0] == '2')
- substitutionType = QSystemLocalePrivate::SAlways;
- else {
- wchar_t digits[11];
- if (!getLocaleInfo(LOCALE_SNATIVEDIGITS, digits, 11)) {
- substitutionType = QSystemLocalePrivate::SNever;
- return substitutionType;
- }
- const wchar_t zero = digits[0];
- if (buf[0] == zero + 2)
- substitutionType = QSystemLocalePrivate::SAlways;
- else
- substitutionType = QSystemLocalePrivate::SNever;
- }
- }
- return substitutionType;
-}
-
-QString &QSystemLocalePrivate::substituteDigits(QString &string)
-{
- ushort zero = zeroDigit().unicode();
- ushort *qch = reinterpret_cast<ushort *>(string.data());
- for (ushort *end = qch + string.size(); qch != end; ++qch) {
- if (*qch >= '0' && *qch <= '9')
- *qch = zero + (*qch - '0');
- }
- return string;
-}
-
-QChar QSystemLocalePrivate::zeroDigit()
-{
- if (zero.isNull())
- zero = getLocaleInfo_qchar(LOCALE_SNATIVEDIGITS);
- return zero;
-}
-
-QChar QSystemLocalePrivate::decimalPoint()
-{
- return getLocaleInfo_qchar(LOCALE_SDECIMAL);
-}
-
-QChar QSystemLocalePrivate::groupSeparator()
-{
- return getLocaleInfo_qchar(LOCALE_STHOUSAND);
-}
-
-QChar QSystemLocalePrivate::negativeSign()
-{
- return getLocaleInfo_qchar(LOCALE_SNEGATIVESIGN);
-}
-
-QChar QSystemLocalePrivate::positiveSign()
-{
- return getLocaleInfo_qchar(LOCALE_SPOSITIVESIGN);
-}
-
-QVariant QSystemLocalePrivate::dateFormat(QLocale::FormatType type)
-{
- switch (type) {
- case QLocale::ShortFormat:
- return winToQtFormat(getLocaleInfo(LOCALE_SSHORTDATE));
- case QLocale::LongFormat:
- return winToQtFormat(getLocaleInfo(LOCALE_SLONGDATE));
- case QLocale::NarrowFormat:
- break;
- }
- return QVariant();
-}
-
-QVariant QSystemLocalePrivate::timeFormat(QLocale::FormatType type)
-{
- switch (type) {
- case QLocale::ShortFormat:
- return winToQtFormat(getLocaleInfo(LOCALE_SSHORTTIME));
- case QLocale::LongFormat:
- return winToQtFormat(getLocaleInfo(LOCALE_STIMEFORMAT));
- case QLocale::NarrowFormat:
- break;
- }
- return QVariant();
-}
-
-QVariant QSystemLocalePrivate::dateTimeFormat(QLocale::FormatType type)
-{
- return QString(dateFormat(type).toString() + QLatin1Char(' ') + timeFormat(type).toString());
-}
-
-QVariant QSystemLocalePrivate::dayName(int day, QLocale::FormatType type)
-{
- if (day < 1 || day > 7)
- return QString();
-
- static const LCTYPE short_day_map[]
- = { LOCALE_SABBREVDAYNAME1, LOCALE_SABBREVDAYNAME2,
- LOCALE_SABBREVDAYNAME3, LOCALE_SABBREVDAYNAME4, LOCALE_SABBREVDAYNAME5,
- LOCALE_SABBREVDAYNAME6, LOCALE_SABBREVDAYNAME7 };
-
- static const LCTYPE long_day_map[]
- = { LOCALE_SDAYNAME1, LOCALE_SDAYNAME2,
- LOCALE_SDAYNAME3, LOCALE_SDAYNAME4, LOCALE_SDAYNAME5,
- LOCALE_SDAYNAME6, LOCALE_SDAYNAME7 };
-
- static const LCTYPE narrow_day_map[]
- = { LOCALE_SSHORTESTDAYNAME1, LOCALE_SSHORTESTDAYNAME2,
- LOCALE_SSHORTESTDAYNAME3, LOCALE_SSHORTESTDAYNAME4,
- LOCALE_SSHORTESTDAYNAME5, LOCALE_SSHORTESTDAYNAME6,
- LOCALE_SSHORTESTDAYNAME7 };
-
- day -= 1;
-
- if (type == QLocale::LongFormat)
- return getLocaleInfo(long_day_map[day]);
- if (type == QLocale::NarrowFormat)
- return getLocaleInfo(narrow_day_map[day]);
- return getLocaleInfo(short_day_map[day]);
-}
-
-QVariant QSystemLocalePrivate::monthName(int month, QLocale::FormatType type)
-{
- static const LCTYPE short_month_map[]
- = { LOCALE_SABBREVMONTHNAME1, LOCALE_SABBREVMONTHNAME2, LOCALE_SABBREVMONTHNAME3,
- LOCALE_SABBREVMONTHNAME4, LOCALE_SABBREVMONTHNAME5, LOCALE_SABBREVMONTHNAME6,
- LOCALE_SABBREVMONTHNAME7, LOCALE_SABBREVMONTHNAME8, LOCALE_SABBREVMONTHNAME9,
- LOCALE_SABBREVMONTHNAME10, LOCALE_SABBREVMONTHNAME11, LOCALE_SABBREVMONTHNAME12 };
-
- static const LCTYPE long_month_map[]
- = { LOCALE_SMONTHNAME1, LOCALE_SMONTHNAME2, LOCALE_SMONTHNAME3,
- LOCALE_SMONTHNAME4, LOCALE_SMONTHNAME5, LOCALE_SMONTHNAME6,
- LOCALE_SMONTHNAME7, LOCALE_SMONTHNAME8, LOCALE_SMONTHNAME9,
- LOCALE_SMONTHNAME10, LOCALE_SMONTHNAME11, LOCALE_SMONTHNAME12 };
-
- month -= 1;
- if (month < 0 || month > 11)
- return QString();
-
- LCTYPE lctype = (type == QLocale::ShortFormat || type == QLocale::NarrowFormat)
- ? short_month_map[month] : long_month_map[month];
- return getLocaleInfo(lctype);
-}
-
-QVariant QSystemLocalePrivate::toString(const QDate &date, QLocale::FormatType type)
-{
- SYSTEMTIME st;
- memset(&st, 0, sizeof(SYSTEMTIME));
- st.wYear = date.year();
- st.wMonth = date.month();
- st.wDay = date.day();
-
- DWORD flags = (type == QLocale::LongFormat ? DATE_LONGDATE : DATE_SHORTDATE);
- wchar_t buf[255];
- if (getDateFormat(flags, &st, NULL, buf, 255)) {
- QString format = QString::fromWCharArray(buf);
- if (substitution() == SAlways)
- substituteDigits(format);
- return format;
- }
- return QString();
-}
-
-QVariant QSystemLocalePrivate::toString(const QTime &time, QLocale::FormatType type)
-{
- SYSTEMTIME st;
- memset(&st, 0, sizeof(SYSTEMTIME));
- st.wHour = time.hour();
- st.wMinute = time.minute();
- st.wSecond = time.second();
- st.wMilliseconds = 0;
-
- DWORD flags = 0;
- // keep the same conditional as timeFormat() above
- if (type == QLocale::ShortFormat)
- flags = TIME_NOSECONDS;
-
- wchar_t buf[255];
- if (getTimeFormat(flags, &st, NULL, buf, 255)) {
- QString format = QString::fromWCharArray(buf);
- if (substitution() == SAlways)
- substituteDigits(format);
- return format;
- }
- return QString();
-}
-
-QVariant QSystemLocalePrivate::toString(const QDateTime &dt, QLocale::FormatType type)
-{
- return QString(toString(dt.date(), type).toString() + QLatin1Char(' ') + toString(dt.time(), type).toString());
-}
-
-QVariant QSystemLocalePrivate::measurementSystem()
-{
- wchar_t output[2];
-
- if (getLocaleInfo(LOCALE_IMEASURE, output, 2)) {
- QString iMeasure = QString::fromWCharArray(output);
- if (iMeasure == QLatin1String("1")) {
- return QLocale::ImperialSystem;
- }
- }
-
- return QLocale::MetricSystem;
-}
-
-QVariant QSystemLocalePrivate::amText()
-{
- wchar_t output[15]; // maximum length including terminating zero character for Win2003+
-
- if (getLocaleInfo(LOCALE_S1159, output, 15)) {
- return QString::fromWCharArray(output);
- }
-
- return QVariant();
-}
-
-QVariant QSystemLocalePrivate::pmText()
-{
- wchar_t output[15]; // maximum length including terminating zero character for Win2003+
-
- if (getLocaleInfo(LOCALE_S2359, output, 15)) {
- return QString::fromWCharArray(output);
- }
-
- return QVariant();
-}
-
-QVariant QSystemLocalePrivate::firstDayOfWeek()
-{
- wchar_t output[4]; // maximum length including terminating zero character for Win2003+
-
- if (getLocaleInfo(LOCALE_IFIRSTDAYOFWEEK, output, 4))
- return QString::fromWCharArray(output).toUInt()+1;
-
- return 1;
-}
-
-QVariant QSystemLocalePrivate::currencySymbol(QLocale::CurrencySymbolFormat format)
-{
- wchar_t buf[13];
- switch (format) {
- case QLocale::CurrencySymbol:
- if (getLocaleInfo(LOCALE_SCURRENCY, buf, 13))
- return QString::fromWCharArray(buf);
- break;
- case QLocale::CurrencyIsoCode:
- if (getLocaleInfo(LOCALE_SINTLSYMBOL, buf, 9))
- return QString::fromWCharArray(buf);
- break;
- case QLocale::CurrencyDisplayName: {
- QVarLengthArray<wchar_t, 64> buf(64);
- if (!getLocaleInfo(LOCALE_SNATIVECURRNAME, buf.data(), buf.size())) {
- if (GetLastError() != ERROR_INSUFFICIENT_BUFFER)
- break;
- buf.resize(255); // should be large enough, right?
- if (!getLocaleInfo(LOCALE_SNATIVECURRNAME, buf.data(), buf.size()))
- break;
- }
- return QString::fromWCharArray(buf.data());
- }
- default:
- break;
- }
- return QVariant();
-}
-
-QVariant QSystemLocalePrivate::toCurrencyString(const QSystemLocale::CurrencyToStringArgument &arg)
-{
- QString value;
- switch (arg.value.type()) {
- case QVariant::Int:
- value = QLocaleData::longLongToString(QLatin1Char('0'), QLatin1Char(','), QLatin1Char('+'), QLatin1Char('-'),
- arg.value.toInt(), -1, 10, -1, QLocale::OmitGroupSeparator);
- break;
- case QVariant::UInt:
- value = QLocaleData::unsLongLongToString(QLatin1Char('0'), QLatin1Char(','), QLatin1Char('+'),
- arg.value.toUInt(), -1, 10, -1, QLocale::OmitGroupSeparator);
- break;
- case QVariant::Double:
- value = QLocaleData::doubleToString(QLatin1Char('0'), QLatin1Char('+'), QLatin1Char('-'),
- QLatin1Char(' '), QLatin1Char(','), QLatin1Char('.'),
- arg.value.toDouble(), -1, QLocaleData::DFDecimal, -1, QLocale::OmitGroupSeparator);
- break;
- case QVariant::LongLong:
- value = QLocaleData::longLongToString(QLatin1Char('0'), QLatin1Char(','), QLatin1Char('+'), QLatin1Char('-'),
- arg.value.toLongLong(), -1, 10, -1, QLocale::OmitGroupSeparator);
- break;
- case QVariant::ULongLong:
- value = QLocaleData::unsLongLongToString(QLatin1Char('0'), QLatin1Char(','), QLatin1Char('+'),
- arg.value.toULongLong(), -1, 10, -1, QLocale::OmitGroupSeparator);
- break;
- default:
- return QVariant();
- }
-
- QVarLengthArray<wchar_t, 64> out(64);
-
- QString decimalSep;
- QString thousandSep;
- CURRENCYFMT format;
- CURRENCYFMT *pformat = NULL;
- if (!arg.symbol.isEmpty()) {
- format.NumDigits = getLocaleInfo_int(LOCALE_ICURRDIGITS);
- format.LeadingZero = getLocaleInfo_int(LOCALE_ILZERO);
- decimalSep = getLocaleInfo(LOCALE_SMONDECIMALSEP);
- format.lpDecimalSep = (wchar_t *)decimalSep.utf16();
- thousandSep = getLocaleInfo(LOCALE_SMONTHOUSANDSEP);
- format.lpThousandSep = (wchar_t *)thousandSep.utf16();
- format.NegativeOrder = getLocaleInfo_int(LOCALE_INEGCURR);
- format.PositiveOrder = getLocaleInfo_int(LOCALE_ICURRENCY);
- format.lpCurrencySymbol = (wchar_t *)arg.symbol.utf16();
-
- // grouping is complicated and ugly:
- // int(0) == "123456789.00" == string("0")
- // int(3) == "123,456,789.00" == string("3;0")
- // int(30) == "123456,789.00" == string("3;0;0")
- // int(32) == "12,34,56,789.00" == string("3;2;0")
- // int(320)== "1234,56,789.00" == string("3;2")
- QString groupingStr = getLocaleInfo(LOCALE_SMONGROUPING);
- format.Grouping = groupingStr.remove(QLatin1Char(';')).toInt();
- if (format.Grouping % 10 == 0) // magic
- format.Grouping /= 10;
- else
- format.Grouping *= 10;
- pformat = &format;
- }
-
- int ret = getCurrencyFormat(0, reinterpret_cast<const wchar_t *>(value.utf16()),
- pformat, out.data(), out.size());
- if (ret == 0 && GetLastError() == ERROR_INSUFFICIENT_BUFFER) {
- ret = getCurrencyFormat(0, reinterpret_cast<const wchar_t *>(value.utf16()),
- pformat, out.data(), 0);
- out.resize(ret);
- getCurrencyFormat(0, reinterpret_cast<const wchar_t *>(value.utf16()),
- pformat, out.data(), out.size());
- }
-
- value = QString::fromWCharArray(out.data());
- if (substitution() == SAlways)
- substituteDigits( value);
- return value;
-}
-
-QVariant QSystemLocalePrivate::uiLanguages()
-{
-#ifndef Q_OS_WINRT
- unsigned long cnt = 0;
- QVarLengthArray<wchar_t, 64> buf(64);
-# if !defined(QT_BOOTSTRAPPED) && !defined(QT_BUILD_QMAKE) // Not present in MinGW 4.9/bootstrap builds.
- unsigned long size = buf.size();
- if (!GetUserPreferredUILanguages(MUI_LANGUAGE_NAME, &cnt, buf.data(), &size)) {
- size = 0;
- if (GetLastError() == ERROR_INSUFFICIENT_BUFFER &&
- GetUserPreferredUILanguages(MUI_LANGUAGE_NAME, &cnt, NULL, &size)) {
- buf.resize(size);
- if (!GetUserPreferredUILanguages(MUI_LANGUAGE_NAME, &cnt, buf.data(), &size))
- return QStringList();
- }
- }
-# endif // !QT_BOOTSTRAPPED && !QT_BUILD_QMAKE
- QStringList result;
- result.reserve(cnt);
- const wchar_t *str = buf.constData();
- for (; cnt > 0; --cnt) {
- QString s = QString::fromWCharArray(str);
- if (s.isEmpty())
- break; // something is wrong
- result.append(s);
- str += s.size() + 1;
- }
- return result;
-#else // !Q_OS_WINRT
- QStringList result;
-
- ComPtr<IGlobalizationPreferencesStatics> preferences;
- HRESULT hr = GetActivationFactory(HString::MakeReference(RuntimeClass_Windows_System_UserProfile_GlobalizationPreferences).Get(), &preferences);
- if (FAILED(hr)) {
- qWarning("Could not obtain ApplicationLanguagesStatic");
- return QStringList();
- }
-
- ComPtr<ABI::Windows::Foundation::Collections::IVectorView<HSTRING> > languageList;
- // Languages is a ranked list of "long names" (e.g. en-US) of preferred languages
- hr = preferences->get_Languages(&languageList);
- Q_ASSERT_SUCCEEDED(hr);
- unsigned int size;
- hr = languageList->get_Size(&size);
- Q_ASSERT_SUCCEEDED(hr);
- result.reserve(size);
- for (unsigned int i = 0; i < size; ++i) {
- HString language;
- hr = languageList->GetAt(i, language.GetAddressOf());
- Q_ASSERT_SUCCEEDED(hr);
- UINT32 length;
- PCWSTR rawString = language.GetRawBuffer(&length);
- result << QString::fromWCharArray(rawString, length);
- }
-
- return result;
-#endif // Q_OS_WINRT
-}
-
-QVariant QSystemLocalePrivate::nativeLanguageName()
-{
- return getLocaleInfo(LOCALE_SNATIVELANGUAGENAME);
-}
-
-QVariant QSystemLocalePrivate::nativeCountryName()
-{
- return getLocaleInfo(LOCALE_SNATIVECOUNTRYNAME);
-}
-
-
-void QSystemLocalePrivate::update()
-{
-#ifndef Q_OS_WINRT
- lcid = GetUserDefaultLCID();
-#else
- GetUserDefaultLocaleName(lcName, LOCALE_NAME_MAX_LENGTH);
-#endif
- substitutionType = SUnknown;
- zero = QChar();
-}
-
-QString QSystemLocalePrivate::winToQtFormat(QStringView sys_fmt)
-{
- QString result;
- int i = 0;
-
- while (i < sys_fmt.size()) {
- if (sys_fmt.at(i).unicode() == QLatin1Char('\'')) {
- QString text = qt_readEscapedFormatString(sys_fmt, &i);
- if (text == QLatin1String("'"))
- result += QLatin1String("''");
- else
- result += QLatin1Char('\'') + text + QLatin1Char('\'');
- continue;
- }
-
- QChar c = sys_fmt.at(i);
- int repeat = qt_repeatCount(sys_fmt.mid(i));
-
- switch (c.unicode()) {
- // Date
- case 'y':
- if (repeat > 5)
- repeat = 5;
- else if (repeat == 3)
- repeat = 2;
- switch (repeat) {
- case 1:
- result += QLatin1String("yy"); // "y" unsupported by Qt, use "yy"
- break;
- case 5:
- result += QLatin1String("yyyy"); // "yyyyy" same as "yyyy" on Windows
- break;
- default:
- result += QString(repeat, QLatin1Char('y'));
- break;
- }
- break;
- case 'g':
- if (repeat > 2)
- repeat = 2;
- switch (repeat) {
- case 2:
- break; // no equivalent of "gg" in Qt
- default:
- result += QLatin1Char('g');
- break;
- }
- break;
- case 't':
- if (repeat > 2)
- repeat = 2;
- result += QLatin1String("AP"); // "t" unsupported, use "AP"
- break;
- default:
- result += QString(repeat, c);
- break;
- }
-
- i += repeat;
- }
-
- return result;
-}
-
-QLocale QSystemLocale::fallbackUiLocale() const
-{
- return QLocale(QString::fromLatin1(getWinLocaleName()));
-}
-
-QVariant QSystemLocale::query(QueryType type, QVariant in = QVariant()) const
-{
- QSystemLocalePrivate *d = systemLocalePrivate();
- switch(type) {
- case DecimalPoint:
- return d->decimalPoint();
- case GroupSeparator:
- return d->groupSeparator();
- case NegativeSign:
- return d->negativeSign();
- case PositiveSign:
- return d->positiveSign();
- case DateFormatLong:
- return d->dateFormat(QLocale::LongFormat);
- case DateFormatShort:
- return d->dateFormat(QLocale::ShortFormat);
- case TimeFormatLong:
- return d->timeFormat(QLocale::LongFormat);
- case TimeFormatShort:
- return d->timeFormat(QLocale::ShortFormat);
- case DateTimeFormatLong:
- return d->dateTimeFormat(QLocale::LongFormat);
- case DateTimeFormatShort:
- return d->dateTimeFormat(QLocale::ShortFormat);
- case DayNameLong:
- return d->dayName(in.toInt(), QLocale::LongFormat);
- case DayNameShort:
- return d->dayName(in.toInt(), QLocale::ShortFormat);
- case MonthNameLong:
- case StandaloneMonthNameLong:
- return d->monthName(in.toInt(), QLocale::LongFormat);
- case MonthNameShort:
- case StandaloneMonthNameShort:
- return d->monthName(in.toInt(), QLocale::ShortFormat);
- case DateToStringShort:
- return d->toString(in.toDate(), QLocale::ShortFormat);
- case DateToStringLong:
- return d->toString(in.toDate(), QLocale::LongFormat);
- case TimeToStringShort:
- return d->toString(in.toTime(), QLocale::ShortFormat);
- case TimeToStringLong:
- return d->toString(in.toTime(), QLocale::LongFormat);
- case DateTimeToStringShort:
- return d->toString(in.toDateTime(), QLocale::ShortFormat);
- case DateTimeToStringLong:
- return d->toString(in.toDateTime(), QLocale::LongFormat);
- case ZeroDigit:
- return d->zeroDigit();
- case LanguageId:
- case CountryId: {
- QString locale = QString::fromLatin1(getWinLocaleName());
- QLocale::Language lang;
- QLocale::Script script;
- QLocale::Country cntry;
- QLocalePrivate::getLangAndCountry(locale, lang, script, cntry);
- if (type == LanguageId)
- return lang;
- if (cntry == QLocale::AnyCountry)
- return fallbackUiLocale().country();
- return cntry;
- }
- case ScriptId:
- return QVariant(QLocale::AnyScript);
- case MeasurementSystem:
- return d->measurementSystem();
- case AMText:
- return d->amText();
- case PMText:
- return d->pmText();
- case FirstDayOfWeek:
- return d->firstDayOfWeek();
- case CurrencySymbol:
- return d->currencySymbol(QLocale::CurrencySymbolFormat(in.toUInt()));
- case CurrencyToString:
- return d->toCurrencyString(in.value<QSystemLocale::CurrencyToStringArgument>());
- case UILanguages:
- return d->uiLanguages();
- case LocaleChanged:
- d->update();
- break;
- case NativeLanguageName:
- return d->nativeLanguageName();
- case NativeCountryName:
- return d->nativeCountryName();
- default:
- break;
- }
- return QVariant();
-}
-#endif // QT_NO_SYSTEMLOCALE
-
-struct WindowsToISOListElt {
- ushort windows_code;
- char iso_name[6];
-};
-
-/* NOTE: This array should be sorted by the first column! */
-static const WindowsToISOListElt windows_to_iso_list[] = {
- { 0x0401, "ar_SA" },
- { 0x0402, "bg\0 " },
- { 0x0403, "ca\0 " },
- { 0x0404, "zh_TW" },
- { 0x0405, "cs\0 " },
- { 0x0406, "da\0 " },
- { 0x0407, "de\0 " },
- { 0x0408, "el\0 " },
- { 0x0409, "en_US" },
- { 0x040a, "es\0 " },
- { 0x040b, "fi\0 " },
- { 0x040c, "fr\0 " },
- { 0x040d, "he\0 " },
- { 0x040e, "hu\0 " },
- { 0x040f, "is\0 " },
- { 0x0410, "it\0 " },
- { 0x0411, "ja\0 " },
- { 0x0412, "ko\0 " },
- { 0x0413, "nl\0 " },
- { 0x0414, "no\0 " },
- { 0x0415, "pl\0 " },
- { 0x0416, "pt_BR" },
- { 0x0418, "ro\0 " },
- { 0x0419, "ru\0 " },
- { 0x041a, "hr\0 " },
- { 0x041c, "sq\0 " },
- { 0x041d, "sv\0 " },
- { 0x041e, "th\0 " },
- { 0x041f, "tr\0 " },
- { 0x0420, "ur\0 " },
- { 0x0421, "in\0 " },
- { 0x0422, "uk\0 " },
- { 0x0423, "be\0 " },
- { 0x0425, "et\0 " },
- { 0x0426, "lv\0 " },
- { 0x0427, "lt\0 " },
- { 0x0429, "fa\0 " },
- { 0x042a, "vi\0 " },
- { 0x042d, "eu\0 " },
- { 0x042f, "mk\0 " },
- { 0x0436, "af\0 " },
- { 0x0438, "fo\0 " },
- { 0x0439, "hi\0 " },
- { 0x043e, "ms\0 " },
- { 0x0458, "mt\0 " },
- { 0x0801, "ar_IQ" },
- { 0x0804, "zh_CN" },
- { 0x0807, "de_CH" },
- { 0x0809, "en_GB" },
- { 0x080a, "es_MX" },
- { 0x080c, "fr_BE" },
- { 0x0810, "it_CH" },
- { 0x0812, "ko\0 " },
- { 0x0813, "nl_BE" },
- { 0x0814, "no\0 " },
- { 0x0816, "pt\0 " },
- { 0x081a, "sr\0 " },
- { 0x081d, "sv_FI" },
- { 0x0c01, "ar_EG" },
- { 0x0c04, "zh_HK" },
- { 0x0c07, "de_AT" },
- { 0x0c09, "en_AU" },
- { 0x0c0a, "es\0 " },
- { 0x0c0c, "fr_CA" },
- { 0x0c1a, "sr\0 " },
- { 0x1001, "ar_LY" },
- { 0x1004, "zh_SG" },
- { 0x1007, "de_LU" },
- { 0x1009, "en_CA" },
- { 0x100a, "es_GT" },
- { 0x100c, "fr_CH" },
- { 0x1401, "ar_DZ" },
- { 0x1407, "de_LI" },
- { 0x1409, "en_NZ" },
- { 0x140a, "es_CR" },
- { 0x140c, "fr_LU" },
- { 0x1801, "ar_MA" },
- { 0x1809, "en_IE" },
- { 0x180a, "es_PA" },
- { 0x1c01, "ar_TN" },
- { 0x1c09, "en_ZA" },
- { 0x1c0a, "es_DO" },
- { 0x2001, "ar_OM" },
- { 0x2009, "en_JM" },
- { 0x200a, "es_VE" },
- { 0x2401, "ar_YE" },
- { 0x2409, "en\0 " },
- { 0x240a, "es_CO" },
- { 0x2801, "ar_SY" },
- { 0x2809, "en_BZ" },
- { 0x280a, "es_PE" },
- { 0x2c01, "ar_JO" },
- { 0x2c09, "en_TT" },
- { 0x2c0a, "es_AR" },
- { 0x3001, "ar_LB" },
- { 0x300a, "es_EC" },
- { 0x3401, "ar_KW" },
- { 0x340a, "es_CL" },
- { 0x3801, "ar_AE" },
- { 0x380a, "es_UY" },
- { 0x3c01, "ar_BH" },
- { 0x3c0a, "es_PY" },
- { 0x4001, "ar_QA" },
- { 0x400a, "es_BO" },
- { 0x440a, "es_SV" },
- { 0x480a, "es_HN" },
- { 0x4c0a, "es_NI" },
- { 0x500a, "es_PR" }
-};
-
-static const int windows_to_iso_count
- = sizeof(windows_to_iso_list)/sizeof(WindowsToISOListElt);
-
-static const char *winLangCodeToIsoName(int code)
-{
- int cmp = code - windows_to_iso_list[0].windows_code;
- if (cmp < 0)
- return 0;
-
- if (cmp == 0)
- return windows_to_iso_list[0].iso_name;
-
- int begin = 0;
- int end = windows_to_iso_count;
-
- while (end - begin > 1) {
- uint mid = (begin + end)/2;
-
- const WindowsToISOListElt *elt = windows_to_iso_list + mid;
- int cmp = code - elt->windows_code;
- if (cmp < 0)
- end = mid;
- else if (cmp > 0)
- begin = mid;
- else
- return elt->iso_name;
- }
-
- return 0;
-
-}
-
-LCID qt_inIsoNametoLCID(const char *name)
-{
- // handle norwegian manually, the list above will fail
- if (!strncmp(name, "nb", 2))
- return 0x0414;
- if (!strncmp(name, "nn", 2))
- return 0x0814;
-
- char n[64];
- strncpy(n, name, sizeof(n));
- n[sizeof(n)-1] = 0;
- char *c = n;
- while (*c) {
- if (*c == '-')
- *c = '_';
- ++c;
- }
-
- for (const WindowsToISOListElt &i : windows_to_iso_list) {
- if (!strcmp(n, i.iso_name))
- return i.windows_code;
- }
- return LOCALE_USER_DEFAULT;
-}
-
-
-#ifndef Q_OS_WINRT
-static QString winIso639LangName(LCID id)
-#else
-static QString winIso639LangName(LPWSTR id)
-#endif
-{
- QString result;
-
- // Windows returns the wrong ISO639 for some languages, we need to detect them here using
- // the language code
- QString lang_code;
- wchar_t out[256];
-#ifndef Q_OS_WINRT
- if (GetLocaleInfo(id, LOCALE_ILANGUAGE, out, 255))
-#else
- if (GetLocaleInfoEx(id, LOCALE_ILANGUAGE, out, 255))
-#endif
- lang_code = QString::fromWCharArray(out);
-
- if (!lang_code.isEmpty()) {
- const char *endptr;
- bool ok;
- QByteArray latin1_lang_code = std::move(lang_code).toLatin1();
- int i = qstrtoull(latin1_lang_code, &endptr, 16, &ok);
- if (ok && *endptr == '\0') {
- switch (i) {
- case 0x814:
- result = QLatin1String("nn"); // Nynorsk
- break;
- default:
- break;
- }
- }
- }
-
- if (!result.isEmpty())
- return result;
-
- // not one of the problematic languages - do the usual lookup
-#ifndef Q_OS_WINRT
- if (GetLocaleInfo(id, LOCALE_SISO639LANGNAME, out, 255))
-#else
- if (GetLocaleInfoEx(id, LOCALE_SISO639LANGNAME, out, 255))
-#endif
- result = QString::fromWCharArray(out);
-
- return result;
-}
-
-#ifndef Q_OS_WINRT
-static QString winIso3116CtryName(LCID id)
-#else
-static QString winIso3116CtryName(LPWSTR id)
-#endif
-{
- QString result;
-
- wchar_t out[256];
-#ifndef Q_OS_WINRT
- if (GetLocaleInfo(id, LOCALE_SISO3166CTRYNAME, out, 255))
-#else
- if (GetLocaleInfoEx(id, LOCALE_SISO3166CTRYNAME, out, 255))
-#endif
- result = QString::fromWCharArray(out);
-
- return result;
-}
-
-#ifndef Q_OS_WINRT
-static QByteArray getWinLocaleName(LCID id)
-#else
-static QByteArray getWinLocaleName(LPWSTR id)
-#endif
-{
- QByteArray result;
-#ifndef Q_OS_WINRT
- if (id == LOCALE_USER_DEFAULT) {
-#else
- if (QString::fromWCharArray(id) == QString::fromWCharArray(LOCALE_NAME_USER_DEFAULT)) {
-#endif
- static QByteArray langEnvVar = qgetenv("LANG");
- result = langEnvVar;
- QString lang, script, cntry;
- if ( result == "C" || (!result.isEmpty()
- && qt_splitLocaleName(QString::fromLocal8Bit(result), lang, script, cntry)) ) {
- long id = 0;
- bool ok = false;
- id = qstrtoll(result.data(), 0, 0, &ok);
- if ( !ok || id == 0 || id < INT_MIN || id > INT_MAX )
- return result;
- return winLangCodeToIsoName(int(id));
- }
- }
-
-#ifndef Q_OS_WINRT
- if (id == LOCALE_USER_DEFAULT)
- id = GetUserDefaultLCID();
-#else // !Q_OS_WINRT
- WCHAR lcName[LOCALE_NAME_MAX_LENGTH];
- if (QString::fromWCharArray(id) == QString::fromWCharArray(LOCALE_NAME_USER_DEFAULT)) {
- GetUserDefaultLocaleName(lcName, LOCALE_NAME_MAX_LENGTH);
- id = lcName;
- }
-#endif // Q_OS_WINRT
- QString resultusage = winIso639LangName(id);
- QString country = winIso3116CtryName(id);
- if (!country.isEmpty())
- resultusage += QLatin1Char('_') + country;
-
- return std::move(resultusage).toLatin1();
-}
-
-Q_CORE_EXPORT QLocale qt_localeFromLCID(LCID id)
-{
-#ifndef Q_OS_WINRT
- return QLocale(QString::fromLatin1(getWinLocaleName(id)));
-#else // !Q_OS_WINRT
- WCHAR name[LOCALE_NAME_MAX_LENGTH];
- LCIDToLocaleName(id, name, LOCALE_NAME_MAX_LENGTH, 0);
- return QLocale(QString::fromLatin1(getWinLocaleName(name)));
-#endif // Q_OS_WINRT
-}
-
-QT_END_NAMESPACE
diff --git a/src/corelib/tools/qmap.cpp b/src/corelib/tools/qmap.cpp
index 5f7275c5f8..a0ec372f9a 100644
--- a/src/corelib/tools/qmap.cpp
+++ b/src/corelib/tools/qmap.cpp
@@ -48,7 +48,7 @@
QT_BEGIN_NAMESPACE
-const QMapDataBase QMapDataBase::shared_null = { Q_REFCOUNT_INITIALIZE_STATIC, 0, { 0, 0, 0 }, 0 };
+const QMapDataBase QMapDataBase::shared_null = { Q_REFCOUNT_INITIALIZE_STATIC, 0, { 0, nullptr, nullptr }, nullptr };
const QMapNodeBase *QMapNodeBase::nextNode() const
{
@@ -92,7 +92,7 @@ void QMapDataBase::rotateLeft(QMapNodeBase *x)
QMapNodeBase *&root = header.left;
QMapNodeBase *y = x->right;
x->right = y->left;
- if (y->left != 0)
+ if (y->left != nullptr)
y->left->setParent(x);
y->setParent(x->parent());
if (x == root)
@@ -111,7 +111,7 @@ void QMapDataBase::rotateRight(QMapNodeBase *x)
QMapNodeBase *&root = header.left;
QMapNodeBase *y = x->left;
x->left = y->right;
- if (y->right != 0)
+ if (y->right != nullptr)
y->right->setParent(x);
y->setParent(x->parent());
if (x == root)
@@ -173,7 +173,7 @@ void QMapDataBase::freeNodeAndRebalance(QMapNodeBase *z)
QMapNodeBase *y = z;
QMapNodeBase *x;
QMapNodeBase *x_parent;
- if (y->left == 0) {
+ if (y->left == nullptr) {
x = y->right;
if (y == mostLeftNode) {
if (x)
@@ -182,11 +182,11 @@ void QMapDataBase::freeNodeAndRebalance(QMapNodeBase *z)
mostLeftNode = y->parent();
}
} else {
- if (y->right == 0) {
+ if (y->right == nullptr) {
x = y->left;
} else {
y = y->right;
- while (y->left != 0)
+ while (y->left != nullptr)
y = y->left;
x = y->right;
}
@@ -228,7 +228,7 @@ void QMapDataBase::freeNodeAndRebalance(QMapNodeBase *z)
z->parent()->right = x;
}
if (y->color() != QMapNodeBase::Red) {
- while (x != root && (x == 0 || x->color() == QMapNodeBase::Black)) {
+ while (x != root && (x == nullptr || x->color() == QMapNodeBase::Black)) {
if (x == x_parent->left) {
QMapNodeBase *w = x_parent->right;
if (w->color() == QMapNodeBase::Red) {
@@ -237,13 +237,13 @@ void QMapDataBase::freeNodeAndRebalance(QMapNodeBase *z)
rotateLeft(x_parent);
w = x_parent->right;
}
- if ((w->left == 0 || w->left->color() == QMapNodeBase::Black) &&
- (w->right == 0 || w->right->color() == QMapNodeBase::Black)) {
+ if ((w->left == nullptr || w->left->color() == QMapNodeBase::Black) &&
+ (w->right == nullptr || w->right->color() == QMapNodeBase::Black)) {
w->setColor(QMapNodeBase::Red);
x = x_parent;
x_parent = x_parent->parent();
} else {
- if (w->right == 0 || w->right->color() == QMapNodeBase::Black) {
+ if (w->right == nullptr || w->right->color() == QMapNodeBase::Black) {
if (w->left)
w->left->setColor(QMapNodeBase::Black);
w->setColor(QMapNodeBase::Red);
@@ -265,13 +265,13 @@ void QMapDataBase::freeNodeAndRebalance(QMapNodeBase *z)
rotateRight(x_parent);
w = x_parent->left;
}
- if ((w->right == 0 || w->right->color() == QMapNodeBase::Black) &&
- (w->left == 0 || w->left->color() == QMapNodeBase::Black)) {
+ if ((w->right == nullptr || w->right->color() == QMapNodeBase::Black) &&
+ (w->left == nullptr|| w->left->color() == QMapNodeBase::Black)) {
w->setColor(QMapNodeBase::Red);
x = x_parent;
x_parent = x_parent->parent();
} else {
- if (w->left == 0 || w->left->color() == QMapNodeBase::Black) {
+ if (w->left == nullptr || w->left->color() == QMapNodeBase::Black) {
if (w->right)
w->right->setColor(QMapNodeBase::Black);
w->setColor(QMapNodeBase::Red);
@@ -363,8 +363,8 @@ QMapDataBase *QMapDataBase::createData()
d->size = 0;
d->header.p = 0;
- d->header.left = 0;
- d->header.right = 0;
+ d->header.left = nullptr;
+ d->header.right = nullptr;
d->mostLeftNode = &(d->header);
return d;
diff --git a/src/corelib/tools/qmap.h b/src/corelib/tools/qmap.h
index 1cf9299e26..18c681581f 100644
--- a/src/corelib/tools/qmap.h
+++ b/src/corelib/tools/qmap.h
@@ -49,13 +49,10 @@
#include <QtCore/qdebug.h>
#endif
-#include <map>
-#include <new>
#include <functional>
-
-#ifdef Q_COMPILER_INITIALIZER_LISTS
#include <initializer_list>
-#endif
+#include <map>
+#include <new>
QT_BEGIN_NAMESPACE
@@ -100,10 +97,10 @@ struct Q_CORE_EXPORT QMapNodeBase
template <typename T>
static typename std::enable_if<QTypeInfo<T>::isComplex>::type
- callDestructorIfNecessary(T &t) Q_DECL_NOTHROW { Q_UNUSED(t); t.~T(); } // Q_UNUSED: silence MSVC unused 't' warning
+ callDestructorIfNecessary(T &t) noexcept { Q_UNUSED(t); t.~T(); } // Q_UNUSED: silence MSVC unused 't' warning
template <typename T>
static typename std::enable_if<!QTypeInfo<T>::isComplex>::type
- callDestructorIfNecessary(T &) Q_DECL_NOTHROW {}
+ callDestructorIfNecessary(T &) noexcept {}
};
template <class Key, class T>
@@ -142,7 +139,7 @@ private:
rightNode()->destroySubTree();
}
- QMapNode() Q_DECL_EQ_DELETE;
+ QMapNode() = delete;
Q_DISABLE_COPY(QMapNode)
};
@@ -325,32 +322,28 @@ class QMap
QMapData<Key, T> *d;
public:
- inline QMap() Q_DECL_NOTHROW : d(static_cast<QMapData<Key, T> *>(const_cast<QMapDataBase *>(&QMapDataBase::shared_null))) { }
-#ifdef Q_COMPILER_INITIALIZER_LISTS
+ inline QMap() noexcept : d(static_cast<QMapData<Key, T> *>(const_cast<QMapDataBase *>(&QMapDataBase::shared_null))) { }
inline QMap(std::initializer_list<std::pair<Key,T> > list)
: d(static_cast<QMapData<Key, T> *>(const_cast<QMapDataBase *>(&QMapDataBase::shared_null)))
{
for (typename std::initializer_list<std::pair<Key,T> >::const_iterator it = list.begin(); it != list.end(); ++it)
insert(it->first, it->second);
}
-#endif
QMap(const QMap<Key, T> &other);
inline ~QMap() { if (!d->ref.deref()) d->destroy(); }
QMap<Key, T> &operator=(const QMap<Key, T> &other);
-#ifdef Q_COMPILER_RVALUE_REFS
- inline QMap(QMap<Key, T> &&other) Q_DECL_NOTHROW
+ inline QMap(QMap<Key, T> &&other) noexcept
: d(other.d)
{
other.d = static_cast<QMapData<Key, T> *>(
const_cast<QMapDataBase *>(&QMapDataBase::shared_null));
}
- inline QMap<Key, T> &operator=(QMap<Key, T> &&other) Q_DECL_NOTHROW
+ inline QMap<Key, T> &operator=(QMap<Key, T> &&other) noexcept
{ QMap moved(std::move(other)); swap(moved); return *this; }
-#endif
- inline void swap(QMap<Key, T> &other) Q_DECL_NOTHROW { qSwap(d, other.d); }
+ inline void swap(QMap<Key, T> &other) noexcept { qSwap(d, other.d); }
explicit QMap(const typename std::map<Key, T> &other);
std::map<Key, T> toStdMap() const;
@@ -1187,19 +1180,15 @@ template <class Key, class T>
class QMultiMap : public QMap<Key, T>
{
public:
- QMultiMap() Q_DECL_NOTHROW {}
-#ifdef Q_COMPILER_INITIALIZER_LISTS
+ QMultiMap() noexcept {}
inline QMultiMap(std::initializer_list<std::pair<Key,T> > list)
{
for (typename std::initializer_list<std::pair<Key,T> >::const_iterator it = list.begin(); it != list.end(); ++it)
insert(it->first, it->second);
}
-#endif
QMultiMap(const QMap<Key, T> &other) : QMap<Key, T>(other) {}
-#ifdef Q_COMPILER_RVALUE_REFS
- QMultiMap(QMap<Key, T> &&other) Q_DECL_NOTHROW : QMap<Key, T>(std::move(other)) {}
-#endif
- void swap(QMultiMap<Key, T> &other) Q_DECL_NOTHROW { QMap<Key, T>::swap(other); }
+ QMultiMap(QMap<Key, T> &&other) noexcept : QMap<Key, T>(std::move(other)) {}
+ void swap(QMultiMap<Key, T> &other) noexcept { QMap<Key, T>::swap(other); }
inline typename QMap<Key, T>::iterator replace(const Key &key, const T &value)
{ return QMap<Key, T>::insert(key, value); }
diff --git a/src/corelib/tools/qmargins.h b/src/corelib/tools/qmargins.h
index 0c73235d26..447037daaa 100644
--- a/src/corelib/tools/qmargins.h
+++ b/src/corelib/tools/qmargins.h
@@ -51,28 +51,28 @@ QT_BEGIN_NAMESPACE
class QMargins
{
public:
- Q_DECL_CONSTEXPR QMargins() Q_DECL_NOTHROW;
- Q_DECL_CONSTEXPR QMargins(int left, int top, int right, int bottom) Q_DECL_NOTHROW;
-
- Q_DECL_CONSTEXPR bool isNull() const Q_DECL_NOTHROW;
-
- Q_DECL_CONSTEXPR int left() const Q_DECL_NOTHROW;
- Q_DECL_CONSTEXPR int top() const Q_DECL_NOTHROW;
- Q_DECL_CONSTEXPR int right() const Q_DECL_NOTHROW;
- Q_DECL_CONSTEXPR int bottom() const Q_DECL_NOTHROW;
-
- Q_DECL_RELAXED_CONSTEXPR void setLeft(int left) Q_DECL_NOTHROW;
- Q_DECL_RELAXED_CONSTEXPR void setTop(int top) Q_DECL_NOTHROW;
- Q_DECL_RELAXED_CONSTEXPR void setRight(int right) Q_DECL_NOTHROW;
- Q_DECL_RELAXED_CONSTEXPR void setBottom(int bottom) Q_DECL_NOTHROW;
-
- Q_DECL_RELAXED_CONSTEXPR QMargins &operator+=(const QMargins &margins) Q_DECL_NOTHROW;
- Q_DECL_RELAXED_CONSTEXPR QMargins &operator-=(const QMargins &margins) Q_DECL_NOTHROW;
- Q_DECL_RELAXED_CONSTEXPR QMargins &operator+=(int) Q_DECL_NOTHROW;
- Q_DECL_RELAXED_CONSTEXPR QMargins &operator-=(int) Q_DECL_NOTHROW;
- Q_DECL_RELAXED_CONSTEXPR QMargins &operator*=(int) Q_DECL_NOTHROW;
+ Q_DECL_CONSTEXPR QMargins() noexcept;
+ Q_DECL_CONSTEXPR QMargins(int left, int top, int right, int bottom) noexcept;
+
+ Q_DECL_CONSTEXPR bool isNull() const noexcept;
+
+ Q_DECL_CONSTEXPR int left() const noexcept;
+ Q_DECL_CONSTEXPR int top() const noexcept;
+ Q_DECL_CONSTEXPR int right() const noexcept;
+ Q_DECL_CONSTEXPR int bottom() const noexcept;
+
+ Q_DECL_RELAXED_CONSTEXPR void setLeft(int left) noexcept;
+ Q_DECL_RELAXED_CONSTEXPR void setTop(int top) noexcept;
+ Q_DECL_RELAXED_CONSTEXPR void setRight(int right) noexcept;
+ Q_DECL_RELAXED_CONSTEXPR void setBottom(int bottom) noexcept;
+
+ Q_DECL_RELAXED_CONSTEXPR QMargins &operator+=(const QMargins &margins) noexcept;
+ Q_DECL_RELAXED_CONSTEXPR QMargins &operator-=(const QMargins &margins) noexcept;
+ Q_DECL_RELAXED_CONSTEXPR QMargins &operator+=(int) noexcept;
+ Q_DECL_RELAXED_CONSTEXPR QMargins &operator-=(int) noexcept;
+ Q_DECL_RELAXED_CONSTEXPR QMargins &operator*=(int) noexcept;
Q_DECL_RELAXED_CONSTEXPR QMargins &operator/=(int);
- Q_DECL_RELAXED_CONSTEXPR QMargins &operator*=(qreal) Q_DECL_NOTHROW;
+ Q_DECL_RELAXED_CONSTEXPR QMargins &operator*=(qreal) noexcept;
Q_DECL_RELAXED_CONSTEXPR QMargins &operator/=(qreal);
private:
@@ -81,8 +81,8 @@ private:
int m_right;
int m_bottom;
- friend Q_DECL_CONSTEXPR inline bool operator==(const QMargins &, const QMargins &) Q_DECL_NOTHROW;
- friend Q_DECL_CONSTEXPR inline bool operator!=(const QMargins &, const QMargins &) Q_DECL_NOTHROW;
+ friend Q_DECL_CONSTEXPR inline bool operator==(const QMargins &, const QMargins &) noexcept;
+ friend Q_DECL_CONSTEXPR inline bool operator!=(const QMargins &, const QMargins &) noexcept;
};
Q_DECLARE_TYPEINFO(QMargins, Q_MOVABLE_TYPE);
@@ -99,40 +99,40 @@ Q_CORE_EXPORT QDataStream &operator>>(QDataStream &, QMargins &);
QMargins inline functions
*****************************************************************************/
-Q_DECL_CONSTEXPR inline QMargins::QMargins() Q_DECL_NOTHROW : m_left(0), m_top(0), m_right(0), m_bottom(0) {}
+Q_DECL_CONSTEXPR inline QMargins::QMargins() noexcept : m_left(0), m_top(0), m_right(0), m_bottom(0) {}
-Q_DECL_CONSTEXPR inline QMargins::QMargins(int aleft, int atop, int aright, int abottom) Q_DECL_NOTHROW
+Q_DECL_CONSTEXPR inline QMargins::QMargins(int aleft, int atop, int aright, int abottom) noexcept
: m_left(aleft), m_top(atop), m_right(aright), m_bottom(abottom) {}
-Q_DECL_CONSTEXPR inline bool QMargins::isNull() const Q_DECL_NOTHROW
+Q_DECL_CONSTEXPR inline bool QMargins::isNull() const noexcept
{ return m_left==0 && m_top==0 && m_right==0 && m_bottom==0; }
-Q_DECL_CONSTEXPR inline int QMargins::left() const Q_DECL_NOTHROW
+Q_DECL_CONSTEXPR inline int QMargins::left() const noexcept
{ return m_left; }
-Q_DECL_CONSTEXPR inline int QMargins::top() const Q_DECL_NOTHROW
+Q_DECL_CONSTEXPR inline int QMargins::top() const noexcept
{ return m_top; }
-Q_DECL_CONSTEXPR inline int QMargins::right() const Q_DECL_NOTHROW
+Q_DECL_CONSTEXPR inline int QMargins::right() const noexcept
{ return m_right; }
-Q_DECL_CONSTEXPR inline int QMargins::bottom() const Q_DECL_NOTHROW
+Q_DECL_CONSTEXPR inline int QMargins::bottom() const noexcept
{ return m_bottom; }
-Q_DECL_RELAXED_CONSTEXPR inline void QMargins::setLeft(int aleft) Q_DECL_NOTHROW
+Q_DECL_RELAXED_CONSTEXPR inline void QMargins::setLeft(int aleft) noexcept
{ m_left = aleft; }
-Q_DECL_RELAXED_CONSTEXPR inline void QMargins::setTop(int atop) Q_DECL_NOTHROW
+Q_DECL_RELAXED_CONSTEXPR inline void QMargins::setTop(int atop) noexcept
{ m_top = atop; }
-Q_DECL_RELAXED_CONSTEXPR inline void QMargins::setRight(int aright) Q_DECL_NOTHROW
+Q_DECL_RELAXED_CONSTEXPR inline void QMargins::setRight(int aright) noexcept
{ m_right = aright; }
-Q_DECL_RELAXED_CONSTEXPR inline void QMargins::setBottom(int abottom) Q_DECL_NOTHROW
+Q_DECL_RELAXED_CONSTEXPR inline void QMargins::setBottom(int abottom) noexcept
{ m_bottom = abottom; }
-Q_DECL_CONSTEXPR inline bool operator==(const QMargins &m1, const QMargins &m2) Q_DECL_NOTHROW
+Q_DECL_CONSTEXPR inline bool operator==(const QMargins &m1, const QMargins &m2) noexcept
{
return
m1.m_left == m2.m_left &&
@@ -141,7 +141,7 @@ Q_DECL_CONSTEXPR inline bool operator==(const QMargins &m1, const QMargins &m2)
m1.m_bottom == m2.m_bottom;
}
-Q_DECL_CONSTEXPR inline bool operator!=(const QMargins &m1, const QMargins &m2) Q_DECL_NOTHROW
+Q_DECL_CONSTEXPR inline bool operator!=(const QMargins &m1, const QMargins &m2) noexcept
{
return
m1.m_left != m2.m_left ||
@@ -150,55 +150,55 @@ Q_DECL_CONSTEXPR inline bool operator!=(const QMargins &m1, const QMargins &m2)
m1.m_bottom != m2.m_bottom;
}
-Q_DECL_CONSTEXPR inline QMargins operator+(const QMargins &m1, const QMargins &m2) Q_DECL_NOTHROW
+Q_DECL_CONSTEXPR inline QMargins operator+(const QMargins &m1, const QMargins &m2) noexcept
{
return QMargins(m1.left() + m2.left(), m1.top() + m2.top(),
m1.right() + m2.right(), m1.bottom() + m2.bottom());
}
-Q_DECL_CONSTEXPR inline QMargins operator-(const QMargins &m1, const QMargins &m2) Q_DECL_NOTHROW
+Q_DECL_CONSTEXPR inline QMargins operator-(const QMargins &m1, const QMargins &m2) noexcept
{
return QMargins(m1.left() - m2.left(), m1.top() - m2.top(),
m1.right() - m2.right(), m1.bottom() - m2.bottom());
}
-Q_DECL_CONSTEXPR inline QMargins operator+(const QMargins &lhs, int rhs) Q_DECL_NOTHROW
+Q_DECL_CONSTEXPR inline QMargins operator+(const QMargins &lhs, int rhs) noexcept
{
return QMargins(lhs.left() + rhs, lhs.top() + rhs,
lhs.right() + rhs, lhs.bottom() + rhs);
}
-Q_DECL_CONSTEXPR inline QMargins operator+(int lhs, const QMargins &rhs) Q_DECL_NOTHROW
+Q_DECL_CONSTEXPR inline QMargins operator+(int lhs, const QMargins &rhs) noexcept
{
return QMargins(rhs.left() + lhs, rhs.top() + lhs,
rhs.right() + lhs, rhs.bottom() + lhs);
}
-Q_DECL_CONSTEXPR inline QMargins operator-(const QMargins &lhs, int rhs) Q_DECL_NOTHROW
+Q_DECL_CONSTEXPR inline QMargins operator-(const QMargins &lhs, int rhs) noexcept
{
return QMargins(lhs.left() - rhs, lhs.top() - rhs,
lhs.right() - rhs, lhs.bottom() - rhs);
}
-Q_DECL_CONSTEXPR inline QMargins operator*(const QMargins &margins, int factor) Q_DECL_NOTHROW
+Q_DECL_CONSTEXPR inline QMargins operator*(const QMargins &margins, int factor) noexcept
{
return QMargins(margins.left() * factor, margins.top() * factor,
margins.right() * factor, margins.bottom() * factor);
}
-Q_DECL_CONSTEXPR inline QMargins operator*(int factor, const QMargins &margins) Q_DECL_NOTHROW
+Q_DECL_CONSTEXPR inline QMargins operator*(int factor, const QMargins &margins) noexcept
{
return QMargins(margins.left() * factor, margins.top() * factor,
margins.right() * factor, margins.bottom() * factor);
}
-Q_DECL_CONSTEXPR inline QMargins operator*(const QMargins &margins, qreal factor) Q_DECL_NOTHROW
+Q_DECL_CONSTEXPR inline QMargins operator*(const QMargins &margins, qreal factor) noexcept
{
return QMargins(qRound(margins.left() * factor), qRound(margins.top() * factor),
qRound(margins.right() * factor), qRound(margins.bottom() * factor));
}
-Q_DECL_CONSTEXPR inline QMargins operator*(qreal factor, const QMargins &margins) Q_DECL_NOTHROW
+Q_DECL_CONSTEXPR inline QMargins operator*(qreal factor, const QMargins &margins) noexcept
{
return QMargins(qRound(margins.left() * factor), qRound(margins.top() * factor),
qRound(margins.right() * factor), qRound(margins.bottom() * factor));
@@ -216,17 +216,17 @@ Q_DECL_CONSTEXPR inline QMargins operator/(const QMargins &margins, qreal diviso
qRound(margins.right() / divisor), qRound(margins.bottom() / divisor));
}
-Q_DECL_RELAXED_CONSTEXPR inline QMargins &QMargins::operator+=(const QMargins &margins) Q_DECL_NOTHROW
+Q_DECL_RELAXED_CONSTEXPR inline QMargins &QMargins::operator+=(const QMargins &margins) noexcept
{
return *this = *this + margins;
}
-Q_DECL_RELAXED_CONSTEXPR inline QMargins &QMargins::operator-=(const QMargins &margins) Q_DECL_NOTHROW
+Q_DECL_RELAXED_CONSTEXPR inline QMargins &QMargins::operator-=(const QMargins &margins) noexcept
{
return *this = *this - margins;
}
-Q_DECL_RELAXED_CONSTEXPR inline QMargins &QMargins::operator+=(int margin) Q_DECL_NOTHROW
+Q_DECL_RELAXED_CONSTEXPR inline QMargins &QMargins::operator+=(int margin) noexcept
{
m_left += margin;
m_top += margin;
@@ -235,7 +235,7 @@ Q_DECL_RELAXED_CONSTEXPR inline QMargins &QMargins::operator+=(int margin) Q_DEC
return *this;
}
-Q_DECL_RELAXED_CONSTEXPR inline QMargins &QMargins::operator-=(int margin) Q_DECL_NOTHROW
+Q_DECL_RELAXED_CONSTEXPR inline QMargins &QMargins::operator-=(int margin) noexcept
{
m_left -= margin;
m_top -= margin;
@@ -244,7 +244,7 @@ Q_DECL_RELAXED_CONSTEXPR inline QMargins &QMargins::operator-=(int margin) Q_DEC
return *this;
}
-Q_DECL_RELAXED_CONSTEXPR inline QMargins &QMargins::operator*=(int factor) Q_DECL_NOTHROW
+Q_DECL_RELAXED_CONSTEXPR inline QMargins &QMargins::operator*=(int factor) noexcept
{
return *this = *this * factor;
}
@@ -254,7 +254,7 @@ Q_DECL_RELAXED_CONSTEXPR inline QMargins &QMargins::operator/=(int divisor)
return *this = *this / divisor;
}
-Q_DECL_RELAXED_CONSTEXPR inline QMargins &QMargins::operator*=(qreal factor) Q_DECL_NOTHROW
+Q_DECL_RELAXED_CONSTEXPR inline QMargins &QMargins::operator*=(qreal factor) noexcept
{
return *this = *this * factor;
}
@@ -264,12 +264,12 @@ Q_DECL_RELAXED_CONSTEXPR inline QMargins &QMargins::operator/=(qreal divisor)
return *this = *this / divisor;
}
-Q_DECL_CONSTEXPR inline QMargins operator+(const QMargins &margins) Q_DECL_NOTHROW
+Q_DECL_CONSTEXPR inline QMargins operator+(const QMargins &margins) noexcept
{
return margins;
}
-Q_DECL_CONSTEXPR inline QMargins operator-(const QMargins &margins) Q_DECL_NOTHROW
+Q_DECL_CONSTEXPR inline QMargins operator-(const QMargins &margins) noexcept
{
return QMargins(-margins.left(), -margins.top(), -margins.right(), -margins.bottom());
}
@@ -285,30 +285,30 @@ Q_CORE_EXPORT QDebug operator<<(QDebug, const QMargins &);
class QMarginsF
{
public:
- Q_DECL_CONSTEXPR QMarginsF() Q_DECL_NOTHROW;
- Q_DECL_CONSTEXPR QMarginsF(qreal left, qreal top, qreal right, qreal bottom) Q_DECL_NOTHROW;
- Q_DECL_CONSTEXPR QMarginsF(const QMargins &margins) Q_DECL_NOTHROW;
-
- Q_DECL_CONSTEXPR bool isNull() const Q_DECL_NOTHROW;
-
- Q_DECL_CONSTEXPR qreal left() const Q_DECL_NOTHROW;
- Q_DECL_CONSTEXPR qreal top() const Q_DECL_NOTHROW;
- Q_DECL_CONSTEXPR qreal right() const Q_DECL_NOTHROW;
- Q_DECL_CONSTEXPR qreal bottom() const Q_DECL_NOTHROW;
-
- Q_DECL_RELAXED_CONSTEXPR void setLeft(qreal left) Q_DECL_NOTHROW;
- Q_DECL_RELAXED_CONSTEXPR void setTop(qreal top) Q_DECL_NOTHROW;
- Q_DECL_RELAXED_CONSTEXPR void setRight(qreal right) Q_DECL_NOTHROW;
- Q_DECL_RELAXED_CONSTEXPR void setBottom(qreal bottom) Q_DECL_NOTHROW;
-
- Q_DECL_RELAXED_CONSTEXPR QMarginsF &operator+=(const QMarginsF &margins) Q_DECL_NOTHROW;
- Q_DECL_RELAXED_CONSTEXPR QMarginsF &operator-=(const QMarginsF &margins) Q_DECL_NOTHROW;
- Q_DECL_RELAXED_CONSTEXPR QMarginsF &operator+=(qreal addend) Q_DECL_NOTHROW;
- Q_DECL_RELAXED_CONSTEXPR QMarginsF &operator-=(qreal subtrahend) Q_DECL_NOTHROW;
- Q_DECL_RELAXED_CONSTEXPR QMarginsF &operator*=(qreal factor) Q_DECL_NOTHROW;
+ Q_DECL_CONSTEXPR QMarginsF() noexcept;
+ Q_DECL_CONSTEXPR QMarginsF(qreal left, qreal top, qreal right, qreal bottom) noexcept;
+ Q_DECL_CONSTEXPR QMarginsF(const QMargins &margins) noexcept;
+
+ Q_DECL_CONSTEXPR bool isNull() const noexcept;
+
+ Q_DECL_CONSTEXPR qreal left() const noexcept;
+ Q_DECL_CONSTEXPR qreal top() const noexcept;
+ Q_DECL_CONSTEXPR qreal right() const noexcept;
+ Q_DECL_CONSTEXPR qreal bottom() const noexcept;
+
+ Q_DECL_RELAXED_CONSTEXPR void setLeft(qreal left) noexcept;
+ Q_DECL_RELAXED_CONSTEXPR void setTop(qreal top) noexcept;
+ Q_DECL_RELAXED_CONSTEXPR void setRight(qreal right) noexcept;
+ Q_DECL_RELAXED_CONSTEXPR void setBottom(qreal bottom) noexcept;
+
+ Q_DECL_RELAXED_CONSTEXPR QMarginsF &operator+=(const QMarginsF &margins) noexcept;
+ Q_DECL_RELAXED_CONSTEXPR QMarginsF &operator-=(const QMarginsF &margins) noexcept;
+ Q_DECL_RELAXED_CONSTEXPR QMarginsF &operator+=(qreal addend) noexcept;
+ Q_DECL_RELAXED_CONSTEXPR QMarginsF &operator-=(qreal subtrahend) noexcept;
+ Q_DECL_RELAXED_CONSTEXPR QMarginsF &operator*=(qreal factor) noexcept;
Q_DECL_RELAXED_CONSTEXPR QMarginsF &operator/=(qreal divisor);
- Q_DECL_CONSTEXPR inline QMargins toMargins() const Q_DECL_NOTHROW;
+ Q_DECL_CONSTEXPR inline QMargins toMargins() const noexcept;
private:
qreal m_left;
@@ -332,44 +332,44 @@ Q_CORE_EXPORT QDataStream &operator>>(QDataStream &, QMarginsF &);
QMarginsF inline functions
*****************************************************************************/
-Q_DECL_CONSTEXPR inline QMarginsF::QMarginsF() Q_DECL_NOTHROW
+Q_DECL_CONSTEXPR inline QMarginsF::QMarginsF() noexcept
: m_left(0), m_top(0), m_right(0), m_bottom(0) {}
-Q_DECL_CONSTEXPR inline QMarginsF::QMarginsF(qreal aleft, qreal atop, qreal aright, qreal abottom) Q_DECL_NOTHROW
+Q_DECL_CONSTEXPR inline QMarginsF::QMarginsF(qreal aleft, qreal atop, qreal aright, qreal abottom) noexcept
: m_left(aleft), m_top(atop), m_right(aright), m_bottom(abottom) {}
-Q_DECL_CONSTEXPR inline QMarginsF::QMarginsF(const QMargins &margins) Q_DECL_NOTHROW
+Q_DECL_CONSTEXPR inline QMarginsF::QMarginsF(const QMargins &margins) noexcept
: m_left(margins.left()), m_top(margins.top()), m_right(margins.right()), m_bottom(margins.bottom()) {}
-Q_DECL_CONSTEXPR inline bool QMarginsF::isNull() const Q_DECL_NOTHROW
+Q_DECL_CONSTEXPR inline bool QMarginsF::isNull() const noexcept
{ return qFuzzyIsNull(m_left) && qFuzzyIsNull(m_top) && qFuzzyIsNull(m_right) && qFuzzyIsNull(m_bottom); }
-Q_DECL_CONSTEXPR inline qreal QMarginsF::left() const Q_DECL_NOTHROW
+Q_DECL_CONSTEXPR inline qreal QMarginsF::left() const noexcept
{ return m_left; }
-Q_DECL_CONSTEXPR inline qreal QMarginsF::top() const Q_DECL_NOTHROW
+Q_DECL_CONSTEXPR inline qreal QMarginsF::top() const noexcept
{ return m_top; }
-Q_DECL_CONSTEXPR inline qreal QMarginsF::right() const Q_DECL_NOTHROW
+Q_DECL_CONSTEXPR inline qreal QMarginsF::right() const noexcept
{ return m_right; }
-Q_DECL_CONSTEXPR inline qreal QMarginsF::bottom() const Q_DECL_NOTHROW
+Q_DECL_CONSTEXPR inline qreal QMarginsF::bottom() const noexcept
{ return m_bottom; }
-Q_DECL_RELAXED_CONSTEXPR inline void QMarginsF::setLeft(qreal aleft) Q_DECL_NOTHROW
+Q_DECL_RELAXED_CONSTEXPR inline void QMarginsF::setLeft(qreal aleft) noexcept
{ m_left = aleft; }
-Q_DECL_RELAXED_CONSTEXPR inline void QMarginsF::setTop(qreal atop) Q_DECL_NOTHROW
+Q_DECL_RELAXED_CONSTEXPR inline void QMarginsF::setTop(qreal atop) noexcept
{ m_top = atop; }
-Q_DECL_RELAXED_CONSTEXPR inline void QMarginsF::setRight(qreal aright) Q_DECL_NOTHROW
+Q_DECL_RELAXED_CONSTEXPR inline void QMarginsF::setRight(qreal aright) noexcept
{ m_right = aright; }
-Q_DECL_RELAXED_CONSTEXPR inline void QMarginsF::setBottom(qreal abottom) Q_DECL_NOTHROW
+Q_DECL_RELAXED_CONSTEXPR inline void QMarginsF::setBottom(qreal abottom) noexcept
{ m_bottom = abottom; }
-Q_DECL_CONSTEXPR inline bool operator==(const QMarginsF &lhs, const QMarginsF &rhs) Q_DECL_NOTHROW
+Q_DECL_CONSTEXPR inline bool operator==(const QMarginsF &lhs, const QMarginsF &rhs) noexcept
{
return qFuzzyCompare(lhs.left(), rhs.left())
&& qFuzzyCompare(lhs.top(), rhs.top())
@@ -377,48 +377,48 @@ Q_DECL_CONSTEXPR inline bool operator==(const QMarginsF &lhs, const QMarginsF &r
&& qFuzzyCompare(lhs.bottom(), rhs.bottom());
}
-Q_DECL_CONSTEXPR inline bool operator!=(const QMarginsF &lhs, const QMarginsF &rhs) Q_DECL_NOTHROW
+Q_DECL_CONSTEXPR inline bool operator!=(const QMarginsF &lhs, const QMarginsF &rhs) noexcept
{
return !operator==(lhs, rhs);
}
-Q_DECL_CONSTEXPR inline QMarginsF operator+(const QMarginsF &lhs, const QMarginsF &rhs) Q_DECL_NOTHROW
+Q_DECL_CONSTEXPR inline QMarginsF operator+(const QMarginsF &lhs, const QMarginsF &rhs) noexcept
{
return QMarginsF(lhs.left() + rhs.left(), lhs.top() + rhs.top(),
lhs.right() + rhs.right(), lhs.bottom() + rhs.bottom());
}
-Q_DECL_CONSTEXPR inline QMarginsF operator-(const QMarginsF &lhs, const QMarginsF &rhs) Q_DECL_NOTHROW
+Q_DECL_CONSTEXPR inline QMarginsF operator-(const QMarginsF &lhs, const QMarginsF &rhs) noexcept
{
return QMarginsF(lhs.left() - rhs.left(), lhs.top() - rhs.top(),
lhs.right() - rhs.right(), lhs.bottom() - rhs.bottom());
}
-Q_DECL_CONSTEXPR inline QMarginsF operator+(const QMarginsF &lhs, qreal rhs) Q_DECL_NOTHROW
+Q_DECL_CONSTEXPR inline QMarginsF operator+(const QMarginsF &lhs, qreal rhs) noexcept
{
return QMarginsF(lhs.left() + rhs, lhs.top() + rhs,
lhs.right() + rhs, lhs.bottom() + rhs);
}
-Q_DECL_CONSTEXPR inline QMarginsF operator+(qreal lhs, const QMarginsF &rhs) Q_DECL_NOTHROW
+Q_DECL_CONSTEXPR inline QMarginsF operator+(qreal lhs, const QMarginsF &rhs) noexcept
{
return QMarginsF(rhs.left() + lhs, rhs.top() + lhs,
rhs.right() + lhs, rhs.bottom() + lhs);
}
-Q_DECL_CONSTEXPR inline QMarginsF operator-(const QMarginsF &lhs, qreal rhs) Q_DECL_NOTHROW
+Q_DECL_CONSTEXPR inline QMarginsF operator-(const QMarginsF &lhs, qreal rhs) noexcept
{
return QMarginsF(lhs.left() - rhs, lhs.top() - rhs,
lhs.right() - rhs, lhs.bottom() - rhs);
}
-Q_DECL_CONSTEXPR inline QMarginsF operator*(const QMarginsF &lhs, qreal rhs) Q_DECL_NOTHROW
+Q_DECL_CONSTEXPR inline QMarginsF operator*(const QMarginsF &lhs, qreal rhs) noexcept
{
return QMarginsF(lhs.left() * rhs, lhs.top() * rhs,
lhs.right() * rhs, lhs.bottom() * rhs);
}
-Q_DECL_CONSTEXPR inline QMarginsF operator*(qreal lhs, const QMarginsF &rhs) Q_DECL_NOTHROW
+Q_DECL_CONSTEXPR inline QMarginsF operator*(qreal lhs, const QMarginsF &rhs) noexcept
{
return QMarginsF(rhs.left() * lhs, rhs.top() * lhs,
rhs.right() * lhs, rhs.bottom() * lhs);
@@ -430,17 +430,17 @@ Q_DECL_CONSTEXPR inline QMarginsF operator/(const QMarginsF &lhs, qreal divisor)
lhs.right() / divisor, lhs.bottom() / divisor);
}
-Q_DECL_RELAXED_CONSTEXPR inline QMarginsF &QMarginsF::operator+=(const QMarginsF &margins) Q_DECL_NOTHROW
+Q_DECL_RELAXED_CONSTEXPR inline QMarginsF &QMarginsF::operator+=(const QMarginsF &margins) noexcept
{
return *this = *this + margins;
}
-Q_DECL_RELAXED_CONSTEXPR inline QMarginsF &QMarginsF::operator-=(const QMarginsF &margins) Q_DECL_NOTHROW
+Q_DECL_RELAXED_CONSTEXPR inline QMarginsF &QMarginsF::operator-=(const QMarginsF &margins) noexcept
{
return *this = *this - margins;
}
-Q_DECL_RELAXED_CONSTEXPR inline QMarginsF &QMarginsF::operator+=(qreal addend) Q_DECL_NOTHROW
+Q_DECL_RELAXED_CONSTEXPR inline QMarginsF &QMarginsF::operator+=(qreal addend) noexcept
{
m_left += addend;
m_top += addend;
@@ -449,7 +449,7 @@ Q_DECL_RELAXED_CONSTEXPR inline QMarginsF &QMarginsF::operator+=(qreal addend) Q
return *this;
}
-Q_DECL_RELAXED_CONSTEXPR inline QMarginsF &QMarginsF::operator-=(qreal subtrahend) Q_DECL_NOTHROW
+Q_DECL_RELAXED_CONSTEXPR inline QMarginsF &QMarginsF::operator-=(qreal subtrahend) noexcept
{
m_left -= subtrahend;
m_top -= subtrahend;
@@ -458,7 +458,7 @@ Q_DECL_RELAXED_CONSTEXPR inline QMarginsF &QMarginsF::operator-=(qreal subtrahen
return *this;
}
-Q_DECL_RELAXED_CONSTEXPR inline QMarginsF &QMarginsF::operator*=(qreal factor) Q_DECL_NOTHROW
+Q_DECL_RELAXED_CONSTEXPR inline QMarginsF &QMarginsF::operator*=(qreal factor) noexcept
{
return *this = *this * factor;
}
@@ -468,17 +468,17 @@ Q_DECL_RELAXED_CONSTEXPR inline QMarginsF &QMarginsF::operator/=(qreal divisor)
return *this = *this / divisor;
}
-Q_DECL_CONSTEXPR inline QMarginsF operator+(const QMarginsF &margins) Q_DECL_NOTHROW
+Q_DECL_CONSTEXPR inline QMarginsF operator+(const QMarginsF &margins) noexcept
{
return margins;
}
-Q_DECL_CONSTEXPR inline QMarginsF operator-(const QMarginsF &margins) Q_DECL_NOTHROW
+Q_DECL_CONSTEXPR inline QMarginsF operator-(const QMarginsF &margins) noexcept
{
return QMarginsF(-margins.left(), -margins.top(), -margins.right(), -margins.bottom());
}
-Q_DECL_CONSTEXPR inline QMargins QMarginsF::toMargins() const Q_DECL_NOTHROW
+Q_DECL_CONSTEXPR inline QMargins QMarginsF::toMargins() const noexcept
{
return QMargins(qRound(m_left), qRound(m_top), qRound(m_right), qRound(m_bottom));
}
diff --git a/src/corelib/tools/qpair.h b/src/corelib/tools/qpair.h
index 94977fc826..9ebf88bc8f 100644
--- a/src/corelib/tools/qpair.h
+++ b/src/corelib/tools/qpair.h
@@ -52,41 +52,39 @@ struct QPair
typedef T2 second_type;
Q_DECL_CONSTEXPR QPair()
- Q_DECL_NOEXCEPT_EXPR((std::is_nothrow_default_constructible<T1>::value &&
+ noexcept((std::is_nothrow_default_constructible<T1>::value &&
std::is_nothrow_default_constructible<T2>::value))
: first(), second() {}
Q_DECL_CONSTEXPR QPair(const T1 &t1, const T2 &t2)
- Q_DECL_NOEXCEPT_EXPR((std::is_nothrow_copy_constructible<T1>::value &&
+ noexcept((std::is_nothrow_copy_constructible<T1>::value &&
std::is_nothrow_copy_constructible<T2>::value))
: first(t1), second(t2) {}
// compiler-generated copy/move ctor/assignment operators are fine!
template <typename TT1, typename TT2>
Q_DECL_CONSTEXPR QPair(const QPair<TT1, TT2> &p)
- Q_DECL_NOEXCEPT_EXPR((std::is_nothrow_constructible<T1, TT1&>::value &&
+ noexcept((std::is_nothrow_constructible<T1, TT1&>::value &&
std::is_nothrow_constructible<T2, TT2&>::value))
: first(p.first), second(p.second) {}
template <typename TT1, typename TT2>
Q_DECL_RELAXED_CONSTEXPR QPair &operator=(const QPair<TT1, TT2> &p)
- Q_DECL_NOEXCEPT_EXPR((std::is_nothrow_assignable<T1, TT1&>::value &&
+ noexcept((std::is_nothrow_assignable<T1, TT1&>::value &&
std::is_nothrow_assignable<T2, TT2&>::value))
{ first = p.first; second = p.second; return *this; }
-#ifdef Q_COMPILER_RVALUE_REFS
template <typename TT1, typename TT2>
Q_DECL_CONSTEXPR QPair(QPair<TT1, TT2> &&p)
- Q_DECL_NOEXCEPT_EXPR((std::is_nothrow_constructible<T1, TT1>::value &&
+ noexcept((std::is_nothrow_constructible<T1, TT1>::value &&
std::is_nothrow_constructible<T2, TT2>::value))
// can't use std::move here as it's not constexpr in C++11:
: first(static_cast<TT1 &&>(p.first)), second(static_cast<TT2 &&>(p.second)) {}
template <typename TT1, typename TT2>
Q_DECL_RELAXED_CONSTEXPR QPair &operator=(QPair<TT1, TT2> &&p)
- Q_DECL_NOEXCEPT_EXPR((std::is_nothrow_assignable<T1, TT1>::value &&
+ noexcept((std::is_nothrow_assignable<T1, TT1>::value &&
std::is_nothrow_assignable<T2, TT2>::value))
{ first = std::move(p.first); second = std::move(p.second); return *this; }
-#endif
Q_DECL_RELAXED_CONSTEXPR void swap(QPair &other)
- Q_DECL_NOEXCEPT_EXPR(noexcept(qSwap(other.first, other.first)) && noexcept(qSwap(other.second, other.second)))
+ noexcept(noexcept(qSwap(other.first, other.first)) && noexcept(qSwap(other.second, other.second)))
{
// use qSwap() to pick up ADL swaps automatically:
qSwap(first, other.first);
@@ -97,8 +95,13 @@ struct QPair
T2 second;
};
+#if defined(__cpp_deduction_guides) && __cpp_deduction_guides >= 201606
+template<class T1, class T2>
+QPair(T1, T2) -> QPair<T1, T2>;
+#endif
+
template <typename T1, typename T2>
-void swap(QPair<T1, T2> &lhs, QPair<T1, T2> &rhs) Q_DECL_NOEXCEPT_EXPR(noexcept(lhs.swap(rhs)))
+void swap(QPair<T1, T2> &lhs, QPair<T1, T2> &rhs) noexcept(noexcept(lhs.swap(rhs)))
{ lhs.swap(rhs); }
// mark QPair<T1,T2> as complex/movable/primitive depending on the
@@ -108,45 +111,45 @@ class QTypeInfo<QPair<T1, T2> > : public QTypeInfoMerger<QPair<T1, T2>, T1, T2>
template <class T1, class T2>
Q_DECL_CONSTEXPR Q_INLINE_TEMPLATE bool operator==(const QPair<T1, T2> &p1, const QPair<T1, T2> &p2)
- Q_DECL_NOEXCEPT_EXPR(noexcept(p1.first == p2.first && p1.second == p2.second))
+ noexcept(noexcept(p1.first == p2.first && p1.second == p2.second))
{ return p1.first == p2.first && p1.second == p2.second; }
template <class T1, class T2>
Q_DECL_CONSTEXPR Q_INLINE_TEMPLATE bool operator!=(const QPair<T1, T2> &p1, const QPair<T1, T2> &p2)
- Q_DECL_NOEXCEPT_EXPR(noexcept(!(p1 == p2)))
+ noexcept(noexcept(!(p1 == p2)))
{ return !(p1 == p2); }
template <class T1, class T2>
Q_DECL_CONSTEXPR Q_INLINE_TEMPLATE bool operator<(const QPair<T1, T2> &p1, const QPair<T1, T2> &p2)
- Q_DECL_NOEXCEPT_EXPR(noexcept(p1.first < p2.first || (!(p2.first < p1.first) && p1.second < p2.second)))
+ noexcept(noexcept(p1.first < p2.first || (!(p2.first < p1.first) && p1.second < p2.second)))
{
return p1.first < p2.first || (!(p2.first < p1.first) && p1.second < p2.second);
}
template <class T1, class T2>
Q_DECL_CONSTEXPR Q_INLINE_TEMPLATE bool operator>(const QPair<T1, T2> &p1, const QPair<T1, T2> &p2)
- Q_DECL_NOEXCEPT_EXPR(noexcept(p2 < p1))
+ noexcept(noexcept(p2 < p1))
{
return p2 < p1;
}
template <class T1, class T2>
Q_DECL_CONSTEXPR Q_INLINE_TEMPLATE bool operator<=(const QPair<T1, T2> &p1, const QPair<T1, T2> &p2)
- Q_DECL_NOEXCEPT_EXPR(noexcept(!(p2 < p1)))
+ noexcept(noexcept(!(p2 < p1)))
{
return !(p2 < p1);
}
template <class T1, class T2>
Q_DECL_CONSTEXPR Q_INLINE_TEMPLATE bool operator>=(const QPair<T1, T2> &p1, const QPair<T1, T2> &p2)
- Q_DECL_NOEXCEPT_EXPR(noexcept(!(p1 < p2)))
+ noexcept(noexcept(!(p1 < p2)))
{
return !(p1 < p2);
}
template <class T1, class T2>
Q_DECL_CONSTEXPR Q_OUTOFLINE_TEMPLATE QPair<T1, T2> qMakePair(const T1 &x, const T2 &y)
- Q_DECL_NOEXCEPT_EXPR(noexcept(QPair<T1, T2>(x, y)))
+ noexcept(noexcept(QPair<T1, T2>(x, y)))
{
return QPair<T1, T2>(x, y);
}
diff --git a/src/corelib/tools/qpair.qdoc b/src/corelib/tools/qpair.qdoc
index 59e6931995..65576ef2e6 100644
--- a/src/corelib/tools/qpair.qdoc
+++ b/src/corelib/tools/qpair.qdoc
@@ -28,6 +28,7 @@
/*!
\class QPair
\inmodule QtCore
+ \reentrant
\brief The QPair class is a template class that stores a pair of items.
\ingroup tools
diff --git a/src/corelib/tools/qpoint.cpp b/src/corelib/tools/qpoint.cpp
index e98eaac4fc..432fb33297 100644
--- a/src/corelib/tools/qpoint.cpp
+++ b/src/corelib/tools/qpoint.cpp
@@ -138,6 +138,17 @@ QT_BEGIN_NAMESPACE
\sa y(), setX()
*/
+/*!
+ \fn QPoint::transposed() const
+ \since 5.14
+
+ Returns a point with x and y coordinates exchanged:
+ \code
+ QPoint{1, 2}.transposed() // {2, 1}
+ \endcode
+
+ \sa x(), y(), setX(), setY()
+*/
/*!
\fn int &QPoint::rx()
@@ -583,6 +594,18 @@ QDebug operator<<(QDebug dbg, const QPointF &p)
*/
/*!
+ \fn QPointF::transposed() const
+ \since 5.14
+
+ Returns a point with x and y coordinates exchanged:
+ \code
+ QPointF{1.0, 2.0}.transposed() // {2.0, 1.0}
+ \endcode
+
+ \sa x(), y(), setX(), setY()
+*/
+
+/*!
\fn qreal& QPointF::rx()
Returns a reference to the x coordinate of this point.
diff --git a/src/corelib/tools/qpoint.h b/src/corelib/tools/qpoint.h
index d7323f7707..fe952f95da 100644
--- a/src/corelib/tools/qpoint.h
+++ b/src/corelib/tools/qpoint.h
@@ -64,6 +64,8 @@ public:
Q_DECL_CONSTEXPR inline int manhattanLength() const;
+ Q_DECL_CONSTEXPR QPoint transposed() const noexcept { return {yp, xp}; }
+
Q_DECL_RELAXED_CONSTEXPR inline int &rx();
Q_DECL_RELAXED_CONSTEXPR inline int &ry();
@@ -94,7 +96,7 @@ public:
friend Q_DECL_CONSTEXPR inline const QPoint operator/(const QPoint &, qreal);
#if defined(Q_OS_DARWIN) || defined(Q_QDOC)
- Q_REQUIRED_RESULT CGPoint toCGPoint() const Q_DECL_NOTHROW;
+ Q_REQUIRED_RESULT CGPoint toCGPoint() const noexcept;
#endif
private:
@@ -232,6 +234,8 @@ public:
Q_DECL_RELAXED_CONSTEXPR inline void setX(qreal x);
Q_DECL_RELAXED_CONSTEXPR inline void setY(qreal y);
+ Q_DECL_CONSTEXPR QPointF transposed() const noexcept { return {yp, xp}; }
+
Q_DECL_RELAXED_CONSTEXPR inline qreal &rx();
Q_DECL_RELAXED_CONSTEXPR inline qreal &ry();
@@ -256,8 +260,8 @@ public:
Q_DECL_CONSTEXPR QPoint toPoint() const;
#if defined(Q_OS_DARWIN) || defined(Q_QDOC)
- Q_REQUIRED_RESULT static QPointF fromCGPoint(CGPoint point) Q_DECL_NOTHROW;
- Q_REQUIRED_RESULT CGPoint toCGPoint() const Q_DECL_NOTHROW;
+ Q_REQUIRED_RESULT static QPointF fromCGPoint(CGPoint point) noexcept;
+ Q_REQUIRED_RESULT CGPoint toCGPoint() const noexcept;
#endif
private:
diff --git a/src/corelib/tools/qqueue.h b/src/corelib/tools/qqueue.h
index b55f210577..d5a60ada56 100644
--- a/src/corelib/tools/qqueue.h
+++ b/src/corelib/tools/qqueue.h
@@ -50,11 +50,11 @@ class QQueue : public QList<T>
{
public:
// compiler-generated special member functions are fine!
- inline void swap(QQueue<T> &other) Q_DECL_NOTHROW { QList<T>::swap(other); } // prevent QList<->QQueue swaps
+ inline void swap(QQueue<T> &other) noexcept { QList<T>::swap(other); } // prevent QList<->QQueue swaps
#ifndef Q_QDOC
// bring in QList::swap(int, int). We cannot say using QList<T>::swap,
// because we don't want to make swap(QList&) available.
- inline void swap(int i, int j) { QList<T>::swap(i, j); }
+ Q_DECL_DEPRECATED inline void swap(int i, int j) { QList<T>::swapItemsAt(i, j); }
#endif
inline void enqueue(const T &t) { QList<T>::append(t); }
inline T dequeue() { return QList<T>::takeFirst(); }
diff --git a/src/corelib/tools/qrect.cpp b/src/corelib/tools/qrect.cpp
index c8301e2590..cd20102a2b 100644
--- a/src/corelib/tools/qrect.cpp
+++ b/src/corelib/tools/qrect.cpp
@@ -300,7 +300,7 @@ QT_BEGIN_NAMESPACE
\sa isValid(), isEmpty()
*/
-QRect QRect::normalized() const Q_DECL_NOTHROW
+QRect QRect::normalized() const noexcept
{
QRect r;
if (x2 < x1 - 1) { // swap bad x values
@@ -820,7 +820,7 @@ QRect QRect::normalized() const Q_DECL_NOTHROW
\sa intersects()
*/
-bool QRect::contains(const QPoint &p, bool proper) const Q_DECL_NOTHROW
+bool QRect::contains(const QPoint &p, bool proper) const noexcept
{
int l, r;
if (x2 < x1 - 1) {
@@ -884,7 +884,7 @@ bool QRect::contains(const QPoint &p, bool proper) const Q_DECL_NOTHROW
rectangle (not on the edge).
*/
-bool QRect::contains(const QRect &r, bool proper) const Q_DECL_NOTHROW
+bool QRect::contains(const QRect &r, bool proper) const noexcept
{
if (isNull() || r.isNull())
return false;
@@ -962,7 +962,7 @@ bool QRect::contains(const QRect &r, bool proper) const Q_DECL_NOTHROW
\sa operator|=(), united()
*/
-QRect QRect::operator|(const QRect &r) const Q_DECL_NOTHROW
+QRect QRect::operator|(const QRect &r) const noexcept
{
if (isNull())
return r;
@@ -1033,7 +1033,7 @@ QRect QRect::operator|(const QRect &r) const Q_DECL_NOTHROW
\sa operator&=(), intersected()
*/
-QRect QRect::operator&(const QRect &r) const Q_DECL_NOTHROW
+QRect QRect::operator&(const QRect &r) const noexcept
{
if (isNull() || r.isNull())
return QRect();
@@ -1112,7 +1112,7 @@ QRect QRect::operator&(const QRect &r) const Q_DECL_NOTHROW
\sa contains()
*/
-bool QRect::intersects(const QRect &r) const Q_DECL_NOTHROW
+bool QRect::intersects(const QRect &r) const noexcept
{
if (isNull() || r.isNull())
return false;
@@ -1540,7 +1540,7 @@ QDebug operator<<(QDebug dbg, const QRect &r)
\sa isValid(), isEmpty()
*/
-QRectF QRectF::normalized() const Q_DECL_NOTHROW
+QRectF QRectF::normalized() const noexcept
{
QRectF r = *this;
if (r.w < 0) {
@@ -1964,7 +1964,7 @@ QRectF QRectF::normalized() const Q_DECL_NOTHROW
\sa intersects()
*/
-bool QRectF::contains(const QPointF &p) const Q_DECL_NOTHROW
+bool QRectF::contains(const QPointF &p) const noexcept
{
qreal l = xp;
qreal r = xp;
@@ -2010,7 +2010,7 @@ bool QRectF::contains(const QPointF &p) const Q_DECL_NOTHROW
otherwise returns \c false.
*/
-bool QRectF::contains(const QRectF &r) const Q_DECL_NOTHROW
+bool QRectF::contains(const QRectF &r) const noexcept
{
qreal l1 = xp;
qreal r1 = xp;
@@ -2148,7 +2148,7 @@ bool QRectF::contains(const QRectF &r) const Q_DECL_NOTHROW
\sa united(), operator|=()
*/
-QRectF QRectF::operator|(const QRectF &r) const Q_DECL_NOTHROW
+QRectF QRectF::operator|(const QRectF &r) const noexcept
{
if (isNull())
return r;
@@ -2217,7 +2217,7 @@ QRectF QRectF::operator|(const QRectF &r) const Q_DECL_NOTHROW
\sa operator&=(), intersected()
*/
-QRectF QRectF::operator&(const QRectF &r) const Q_DECL_NOTHROW
+QRectF QRectF::operator&(const QRectF &r) const noexcept
{
qreal l1 = xp;
qreal r1 = xp;
@@ -2302,7 +2302,7 @@ QRectF QRectF::operator&(const QRectF &r) const Q_DECL_NOTHROW
\sa contains()
*/
-bool QRectF::intersects(const QRectF &r) const Q_DECL_NOTHROW
+bool QRectF::intersects(const QRectF &r) const noexcept
{
qreal l1 = xp;
qreal r1 = xp;
@@ -2369,7 +2369,7 @@ bool QRectF::intersects(const QRectF &r) const Q_DECL_NOTHROW
\sa toRect()
*/
-QRect QRectF::toAlignedRect() const Q_DECL_NOTHROW
+QRect QRectF::toAlignedRect() const noexcept
{
int xmin = int(qFloor(xp));
int xmax = int(qCeil(xp + w));
diff --git a/src/corelib/tools/qrect.h b/src/corelib/tools/qrect.h
index 3b40055b5a..7aa2312f38 100644
--- a/src/corelib/tools/qrect.h
+++ b/src/corelib/tools/qrect.h
@@ -57,104 +57,104 @@ QT_BEGIN_NAMESPACE
class Q_CORE_EXPORT QRect
{
public:
- Q_DECL_CONSTEXPR QRect() Q_DECL_NOTHROW : x1(0), y1(0), x2(-1), y2(-1) {}
- Q_DECL_CONSTEXPR QRect(const QPoint &topleft, const QPoint &bottomright) Q_DECL_NOTHROW;
- Q_DECL_CONSTEXPR QRect(const QPoint &topleft, const QSize &size) Q_DECL_NOTHROW;
- Q_DECL_CONSTEXPR QRect(int left, int top, int width, int height) Q_DECL_NOTHROW;
-
- Q_DECL_CONSTEXPR inline bool isNull() const Q_DECL_NOTHROW;
- Q_DECL_CONSTEXPR inline bool isEmpty() const Q_DECL_NOTHROW;
- Q_DECL_CONSTEXPR inline bool isValid() const Q_DECL_NOTHROW;
-
- Q_DECL_CONSTEXPR inline int left() const Q_DECL_NOTHROW;
- Q_DECL_CONSTEXPR inline int top() const Q_DECL_NOTHROW;
- Q_DECL_CONSTEXPR inline int right() const Q_DECL_NOTHROW;
- Q_DECL_CONSTEXPR inline int bottom() const Q_DECL_NOTHROW;
- Q_REQUIRED_RESULT QRect normalized() const Q_DECL_NOTHROW;
-
- Q_DECL_CONSTEXPR inline int x() const Q_DECL_NOTHROW;
- Q_DECL_CONSTEXPR inline int y() const Q_DECL_NOTHROW;
- Q_DECL_RELAXED_CONSTEXPR inline void setLeft(int pos) Q_DECL_NOTHROW;
- Q_DECL_RELAXED_CONSTEXPR inline void setTop(int pos) Q_DECL_NOTHROW;
- Q_DECL_RELAXED_CONSTEXPR inline void setRight(int pos) Q_DECL_NOTHROW;
- Q_DECL_RELAXED_CONSTEXPR inline void setBottom(int pos) Q_DECL_NOTHROW;
- Q_DECL_RELAXED_CONSTEXPR inline void setX(int x) Q_DECL_NOTHROW;
- Q_DECL_RELAXED_CONSTEXPR inline void setY(int y) Q_DECL_NOTHROW;
-
- Q_DECL_RELAXED_CONSTEXPR inline void setTopLeft(const QPoint &p) Q_DECL_NOTHROW;
- Q_DECL_RELAXED_CONSTEXPR inline void setBottomRight(const QPoint &p) Q_DECL_NOTHROW;
- Q_DECL_RELAXED_CONSTEXPR inline void setTopRight(const QPoint &p) Q_DECL_NOTHROW;
- Q_DECL_RELAXED_CONSTEXPR inline void setBottomLeft(const QPoint &p) Q_DECL_NOTHROW;
-
- Q_DECL_CONSTEXPR inline QPoint topLeft() const Q_DECL_NOTHROW;
- Q_DECL_CONSTEXPR inline QPoint bottomRight() const Q_DECL_NOTHROW;
- Q_DECL_CONSTEXPR inline QPoint topRight() const Q_DECL_NOTHROW;
- Q_DECL_CONSTEXPR inline QPoint bottomLeft() const Q_DECL_NOTHROW;
- Q_DECL_CONSTEXPR inline QPoint center() const Q_DECL_NOTHROW;
-
- Q_DECL_RELAXED_CONSTEXPR inline void moveLeft(int pos) Q_DECL_NOTHROW;
- Q_DECL_RELAXED_CONSTEXPR inline void moveTop(int pos) Q_DECL_NOTHROW;
- Q_DECL_RELAXED_CONSTEXPR inline void moveRight(int pos) Q_DECL_NOTHROW;
- Q_DECL_RELAXED_CONSTEXPR inline void moveBottom(int pos) Q_DECL_NOTHROW;
- Q_DECL_RELAXED_CONSTEXPR inline void moveTopLeft(const QPoint &p) Q_DECL_NOTHROW;
- Q_DECL_RELAXED_CONSTEXPR inline void moveBottomRight(const QPoint &p) Q_DECL_NOTHROW;
- Q_DECL_RELAXED_CONSTEXPR inline void moveTopRight(const QPoint &p) Q_DECL_NOTHROW;
- Q_DECL_RELAXED_CONSTEXPR inline void moveBottomLeft(const QPoint &p) Q_DECL_NOTHROW;
- Q_DECL_RELAXED_CONSTEXPR inline void moveCenter(const QPoint &p) Q_DECL_NOTHROW;
-
- Q_DECL_RELAXED_CONSTEXPR inline void translate(int dx, int dy) Q_DECL_NOTHROW;
- Q_DECL_RELAXED_CONSTEXPR inline void translate(const QPoint &p) Q_DECL_NOTHROW;
- Q_REQUIRED_RESULT Q_DECL_CONSTEXPR inline QRect translated(int dx, int dy) const Q_DECL_NOTHROW;
- Q_REQUIRED_RESULT Q_DECL_CONSTEXPR inline QRect translated(const QPoint &p) const Q_DECL_NOTHROW;
- Q_REQUIRED_RESULT Q_DECL_CONSTEXPR inline QRect transposed() const Q_DECL_NOTHROW;
-
- Q_DECL_RELAXED_CONSTEXPR inline void moveTo(int x, int t) Q_DECL_NOTHROW;
- Q_DECL_RELAXED_CONSTEXPR inline void moveTo(const QPoint &p) Q_DECL_NOTHROW;
-
- Q_DECL_RELAXED_CONSTEXPR inline void setRect(int x, int y, int w, int h) Q_DECL_NOTHROW;
+ Q_DECL_CONSTEXPR QRect() noexcept : x1(0), y1(0), x2(-1), y2(-1) {}
+ Q_DECL_CONSTEXPR QRect(const QPoint &topleft, const QPoint &bottomright) noexcept;
+ Q_DECL_CONSTEXPR QRect(const QPoint &topleft, const QSize &size) noexcept;
+ Q_DECL_CONSTEXPR QRect(int left, int top, int width, int height) noexcept;
+
+ Q_DECL_CONSTEXPR inline bool isNull() const noexcept;
+ Q_DECL_CONSTEXPR inline bool isEmpty() const noexcept;
+ Q_DECL_CONSTEXPR inline bool isValid() const noexcept;
+
+ Q_DECL_CONSTEXPR inline int left() const noexcept;
+ Q_DECL_CONSTEXPR inline int top() const noexcept;
+ Q_DECL_CONSTEXPR inline int right() const noexcept;
+ Q_DECL_CONSTEXPR inline int bottom() const noexcept;
+ Q_REQUIRED_RESULT QRect normalized() const noexcept;
+
+ Q_DECL_CONSTEXPR inline int x() const noexcept;
+ Q_DECL_CONSTEXPR inline int y() const noexcept;
+ Q_DECL_RELAXED_CONSTEXPR inline void setLeft(int pos) noexcept;
+ Q_DECL_RELAXED_CONSTEXPR inline void setTop(int pos) noexcept;
+ Q_DECL_RELAXED_CONSTEXPR inline void setRight(int pos) noexcept;
+ Q_DECL_RELAXED_CONSTEXPR inline void setBottom(int pos) noexcept;
+ Q_DECL_RELAXED_CONSTEXPR inline void setX(int x) noexcept;
+ Q_DECL_RELAXED_CONSTEXPR inline void setY(int y) noexcept;
+
+ Q_DECL_RELAXED_CONSTEXPR inline void setTopLeft(const QPoint &p) noexcept;
+ Q_DECL_RELAXED_CONSTEXPR inline void setBottomRight(const QPoint &p) noexcept;
+ Q_DECL_RELAXED_CONSTEXPR inline void setTopRight(const QPoint &p) noexcept;
+ Q_DECL_RELAXED_CONSTEXPR inline void setBottomLeft(const QPoint &p) noexcept;
+
+ Q_DECL_CONSTEXPR inline QPoint topLeft() const noexcept;
+ Q_DECL_CONSTEXPR inline QPoint bottomRight() const noexcept;
+ Q_DECL_CONSTEXPR inline QPoint topRight() const noexcept;
+ Q_DECL_CONSTEXPR inline QPoint bottomLeft() const noexcept;
+ Q_DECL_CONSTEXPR inline QPoint center() const noexcept;
+
+ Q_DECL_RELAXED_CONSTEXPR inline void moveLeft(int pos) noexcept;
+ Q_DECL_RELAXED_CONSTEXPR inline void moveTop(int pos) noexcept;
+ Q_DECL_RELAXED_CONSTEXPR inline void moveRight(int pos) noexcept;
+ Q_DECL_RELAXED_CONSTEXPR inline void moveBottom(int pos) noexcept;
+ Q_DECL_RELAXED_CONSTEXPR inline void moveTopLeft(const QPoint &p) noexcept;
+ Q_DECL_RELAXED_CONSTEXPR inline void moveBottomRight(const QPoint &p) noexcept;
+ Q_DECL_RELAXED_CONSTEXPR inline void moveTopRight(const QPoint &p) noexcept;
+ Q_DECL_RELAXED_CONSTEXPR inline void moveBottomLeft(const QPoint &p) noexcept;
+ Q_DECL_RELAXED_CONSTEXPR inline void moveCenter(const QPoint &p) noexcept;
+
+ Q_DECL_RELAXED_CONSTEXPR inline void translate(int dx, int dy) noexcept;
+ Q_DECL_RELAXED_CONSTEXPR inline void translate(const QPoint &p) noexcept;
+ Q_REQUIRED_RESULT Q_DECL_CONSTEXPR inline QRect translated(int dx, int dy) const noexcept;
+ Q_REQUIRED_RESULT Q_DECL_CONSTEXPR inline QRect translated(const QPoint &p) const noexcept;
+ Q_REQUIRED_RESULT Q_DECL_CONSTEXPR inline QRect transposed() const noexcept;
+
+ Q_DECL_RELAXED_CONSTEXPR inline void moveTo(int x, int t) noexcept;
+ Q_DECL_RELAXED_CONSTEXPR inline void moveTo(const QPoint &p) noexcept;
+
+ Q_DECL_RELAXED_CONSTEXPR inline void setRect(int x, int y, int w, int h) noexcept;
Q_DECL_RELAXED_CONSTEXPR inline void getRect(int *x, int *y, int *w, int *h) const;
- Q_DECL_RELAXED_CONSTEXPR inline void setCoords(int x1, int y1, int x2, int y2) Q_DECL_NOTHROW;
+ Q_DECL_RELAXED_CONSTEXPR inline void setCoords(int x1, int y1, int x2, int y2) noexcept;
Q_DECL_RELAXED_CONSTEXPR inline void getCoords(int *x1, int *y1, int *x2, int *y2) const;
- Q_DECL_RELAXED_CONSTEXPR inline void adjust(int x1, int y1, int x2, int y2) Q_DECL_NOTHROW;
- Q_REQUIRED_RESULT Q_DECL_CONSTEXPR inline QRect adjusted(int x1, int y1, int x2, int y2) const Q_DECL_NOTHROW;
-
- Q_DECL_CONSTEXPR inline QSize size() const Q_DECL_NOTHROW;
- Q_DECL_CONSTEXPR inline int width() const Q_DECL_NOTHROW;
- Q_DECL_CONSTEXPR inline int height() const Q_DECL_NOTHROW;
- Q_DECL_RELAXED_CONSTEXPR inline void setWidth(int w) Q_DECL_NOTHROW;
- Q_DECL_RELAXED_CONSTEXPR inline void setHeight(int h) Q_DECL_NOTHROW;
- Q_DECL_RELAXED_CONSTEXPR inline void setSize(const QSize &s) Q_DECL_NOTHROW;
-
- QRect operator|(const QRect &r) const Q_DECL_NOTHROW;
- QRect operator&(const QRect &r) const Q_DECL_NOTHROW;
- inline QRect& operator|=(const QRect &r) Q_DECL_NOTHROW;
- inline QRect& operator&=(const QRect &r) Q_DECL_NOTHROW;
-
- bool contains(const QRect &r, bool proper = false) const Q_DECL_NOTHROW;
- bool contains(const QPoint &p, bool proper=false) const Q_DECL_NOTHROW;
- inline bool contains(int x, int y) const Q_DECL_NOTHROW;
- inline bool contains(int x, int y, bool proper) const Q_DECL_NOTHROW;
- Q_REQUIRED_RESULT inline QRect united(const QRect &other) const Q_DECL_NOTHROW;
- Q_REQUIRED_RESULT inline QRect intersected(const QRect &other) const Q_DECL_NOTHROW;
- bool intersects(const QRect &r) const Q_DECL_NOTHROW;
-
- Q_DECL_CONSTEXPR inline QRect marginsAdded(const QMargins &margins) const Q_DECL_NOTHROW;
- Q_DECL_CONSTEXPR inline QRect marginsRemoved(const QMargins &margins) const Q_DECL_NOTHROW;
- Q_DECL_RELAXED_CONSTEXPR inline QRect &operator+=(const QMargins &margins) Q_DECL_NOTHROW;
- Q_DECL_RELAXED_CONSTEXPR inline QRect &operator-=(const QMargins &margins) Q_DECL_NOTHROW;
+ Q_DECL_RELAXED_CONSTEXPR inline void adjust(int x1, int y1, int x2, int y2) noexcept;
+ Q_REQUIRED_RESULT Q_DECL_CONSTEXPR inline QRect adjusted(int x1, int y1, int x2, int y2) const noexcept;
+
+ Q_DECL_CONSTEXPR inline QSize size() const noexcept;
+ Q_DECL_CONSTEXPR inline int width() const noexcept;
+ Q_DECL_CONSTEXPR inline int height() const noexcept;
+ Q_DECL_RELAXED_CONSTEXPR inline void setWidth(int w) noexcept;
+ Q_DECL_RELAXED_CONSTEXPR inline void setHeight(int h) noexcept;
+ Q_DECL_RELAXED_CONSTEXPR inline void setSize(const QSize &s) noexcept;
+
+ QRect operator|(const QRect &r) const noexcept;
+ QRect operator&(const QRect &r) const noexcept;
+ inline QRect& operator|=(const QRect &r) noexcept;
+ inline QRect& operator&=(const QRect &r) noexcept;
+
+ bool contains(const QRect &r, bool proper = false) const noexcept;
+ bool contains(const QPoint &p, bool proper=false) const noexcept;
+ inline bool contains(int x, int y) const noexcept;
+ inline bool contains(int x, int y, bool proper) const noexcept;
+ Q_REQUIRED_RESULT inline QRect united(const QRect &other) const noexcept;
+ Q_REQUIRED_RESULT inline QRect intersected(const QRect &other) const noexcept;
+ bool intersects(const QRect &r) const noexcept;
+
+ Q_DECL_CONSTEXPR inline QRect marginsAdded(const QMargins &margins) const noexcept;
+ Q_DECL_CONSTEXPR inline QRect marginsRemoved(const QMargins &margins) const noexcept;
+ Q_DECL_RELAXED_CONSTEXPR inline QRect &operator+=(const QMargins &margins) noexcept;
+ Q_DECL_RELAXED_CONSTEXPR inline QRect &operator-=(const QMargins &margins) noexcept;
#if QT_DEPRECATED_SINCE(5, 0)
- Q_REQUIRED_RESULT QT_DEPRECATED QRect unite(const QRect &r) const Q_DECL_NOTHROW { return united(r); }
- Q_REQUIRED_RESULT QT_DEPRECATED QRect intersect(const QRect &r) const Q_DECL_NOTHROW { return intersected(r); }
+ Q_REQUIRED_RESULT QT_DEPRECATED QRect unite(const QRect &r) const noexcept { return united(r); }
+ Q_REQUIRED_RESULT QT_DEPRECATED QRect intersect(const QRect &r) const noexcept { return intersected(r); }
#endif
- friend Q_DECL_CONSTEXPR inline bool operator==(const QRect &, const QRect &) Q_DECL_NOTHROW;
- friend Q_DECL_CONSTEXPR inline bool operator!=(const QRect &, const QRect &) Q_DECL_NOTHROW;
+ friend Q_DECL_CONSTEXPR inline bool operator==(const QRect &, const QRect &) noexcept;
+ friend Q_DECL_CONSTEXPR inline bool operator!=(const QRect &, const QRect &) noexcept;
#if defined(Q_OS_DARWIN) || defined(Q_QDOC)
- Q_REQUIRED_RESULT CGRect toCGRect() const Q_DECL_NOTHROW;
+ Q_REQUIRED_RESULT CGRect toCGRect() const noexcept;
#endif
private:
@@ -165,8 +165,8 @@ private:
};
Q_DECLARE_TYPEINFO(QRect, Q_MOVABLE_TYPE);
-Q_DECL_CONSTEXPR inline bool operator==(const QRect &, const QRect &) Q_DECL_NOTHROW;
-Q_DECL_CONSTEXPR inline bool operator!=(const QRect &, const QRect &) Q_DECL_NOTHROW;
+Q_DECL_CONSTEXPR inline bool operator==(const QRect &, const QRect &) noexcept;
+Q_DECL_CONSTEXPR inline bool operator!=(const QRect &, const QRect &) noexcept;
/*****************************************************************************
@@ -181,97 +181,97 @@ Q_CORE_EXPORT QDataStream &operator>>(QDataStream &, QRect &);
QRect inline member functions
*****************************************************************************/
-Q_DECL_CONSTEXPR inline QRect::QRect(int aleft, int atop, int awidth, int aheight) Q_DECL_NOTHROW
+Q_DECL_CONSTEXPR inline QRect::QRect(int aleft, int atop, int awidth, int aheight) noexcept
: x1(aleft), y1(atop), x2(aleft + awidth - 1), y2(atop + aheight - 1) {}
-Q_DECL_CONSTEXPR inline QRect::QRect(const QPoint &atopLeft, const QPoint &abottomRight) Q_DECL_NOTHROW
+Q_DECL_CONSTEXPR inline QRect::QRect(const QPoint &atopLeft, const QPoint &abottomRight) noexcept
: x1(atopLeft.x()), y1(atopLeft.y()), x2(abottomRight.x()), y2(abottomRight.y()) {}
-Q_DECL_CONSTEXPR inline QRect::QRect(const QPoint &atopLeft, const QSize &asize) Q_DECL_NOTHROW
+Q_DECL_CONSTEXPR inline QRect::QRect(const QPoint &atopLeft, const QSize &asize) noexcept
: x1(atopLeft.x()), y1(atopLeft.y()), x2(atopLeft.x()+asize.width() - 1), y2(atopLeft.y()+asize.height() - 1) {}
-Q_DECL_CONSTEXPR inline bool QRect::isNull() const Q_DECL_NOTHROW
+Q_DECL_CONSTEXPR inline bool QRect::isNull() const noexcept
{ return x2 == x1 - 1 && y2 == y1 - 1; }
-Q_DECL_CONSTEXPR inline bool QRect::isEmpty() const Q_DECL_NOTHROW
+Q_DECL_CONSTEXPR inline bool QRect::isEmpty() const noexcept
{ return x1 > x2 || y1 > y2; }
-Q_DECL_CONSTEXPR inline bool QRect::isValid() const Q_DECL_NOTHROW
+Q_DECL_CONSTEXPR inline bool QRect::isValid() const noexcept
{ return x1 <= x2 && y1 <= y2; }
-Q_DECL_CONSTEXPR inline int QRect::left() const Q_DECL_NOTHROW
+Q_DECL_CONSTEXPR inline int QRect::left() const noexcept
{ return x1; }
-Q_DECL_CONSTEXPR inline int QRect::top() const Q_DECL_NOTHROW
+Q_DECL_CONSTEXPR inline int QRect::top() const noexcept
{ return y1; }
-Q_DECL_CONSTEXPR inline int QRect::right() const Q_DECL_NOTHROW
+Q_DECL_CONSTEXPR inline int QRect::right() const noexcept
{ return x2; }
-Q_DECL_CONSTEXPR inline int QRect::bottom() const Q_DECL_NOTHROW
+Q_DECL_CONSTEXPR inline int QRect::bottom() const noexcept
{ return y2; }
-Q_DECL_CONSTEXPR inline int QRect::x() const Q_DECL_NOTHROW
+Q_DECL_CONSTEXPR inline int QRect::x() const noexcept
{ return x1; }
-Q_DECL_CONSTEXPR inline int QRect::y() const Q_DECL_NOTHROW
+Q_DECL_CONSTEXPR inline int QRect::y() const noexcept
{ return y1; }
-Q_DECL_RELAXED_CONSTEXPR inline void QRect::setLeft(int pos) Q_DECL_NOTHROW
+Q_DECL_RELAXED_CONSTEXPR inline void QRect::setLeft(int pos) noexcept
{ x1 = pos; }
-Q_DECL_RELAXED_CONSTEXPR inline void QRect::setTop(int pos) Q_DECL_NOTHROW
+Q_DECL_RELAXED_CONSTEXPR inline void QRect::setTop(int pos) noexcept
{ y1 = pos; }
-Q_DECL_RELAXED_CONSTEXPR inline void QRect::setRight(int pos) Q_DECL_NOTHROW
+Q_DECL_RELAXED_CONSTEXPR inline void QRect::setRight(int pos) noexcept
{ x2 = pos; }
-Q_DECL_RELAXED_CONSTEXPR inline void QRect::setBottom(int pos) Q_DECL_NOTHROW
+Q_DECL_RELAXED_CONSTEXPR inline void QRect::setBottom(int pos) noexcept
{ y2 = pos; }
-Q_DECL_RELAXED_CONSTEXPR inline void QRect::setTopLeft(const QPoint &p) Q_DECL_NOTHROW
+Q_DECL_RELAXED_CONSTEXPR inline void QRect::setTopLeft(const QPoint &p) noexcept
{ x1 = p.x(); y1 = p.y(); }
-Q_DECL_RELAXED_CONSTEXPR inline void QRect::setBottomRight(const QPoint &p) Q_DECL_NOTHROW
+Q_DECL_RELAXED_CONSTEXPR inline void QRect::setBottomRight(const QPoint &p) noexcept
{ x2 = p.x(); y2 = p.y(); }
-Q_DECL_RELAXED_CONSTEXPR inline void QRect::setTopRight(const QPoint &p) Q_DECL_NOTHROW
+Q_DECL_RELAXED_CONSTEXPR inline void QRect::setTopRight(const QPoint &p) noexcept
{ x2 = p.x(); y1 = p.y(); }
-Q_DECL_RELAXED_CONSTEXPR inline void QRect::setBottomLeft(const QPoint &p) Q_DECL_NOTHROW
+Q_DECL_RELAXED_CONSTEXPR inline void QRect::setBottomLeft(const QPoint &p) noexcept
{ x1 = p.x(); y2 = p.y(); }
-Q_DECL_RELAXED_CONSTEXPR inline void QRect::setX(int ax) Q_DECL_NOTHROW
+Q_DECL_RELAXED_CONSTEXPR inline void QRect::setX(int ax) noexcept
{ x1 = ax; }
-Q_DECL_RELAXED_CONSTEXPR inline void QRect::setY(int ay) Q_DECL_NOTHROW
+Q_DECL_RELAXED_CONSTEXPR inline void QRect::setY(int ay) noexcept
{ y1 = ay; }
-Q_DECL_CONSTEXPR inline QPoint QRect::topLeft() const Q_DECL_NOTHROW
+Q_DECL_CONSTEXPR inline QPoint QRect::topLeft() const noexcept
{ return QPoint(x1, y1); }
-Q_DECL_CONSTEXPR inline QPoint QRect::bottomRight() const Q_DECL_NOTHROW
+Q_DECL_CONSTEXPR inline QPoint QRect::bottomRight() const noexcept
{ return QPoint(x2, y2); }
-Q_DECL_CONSTEXPR inline QPoint QRect::topRight() const Q_DECL_NOTHROW
+Q_DECL_CONSTEXPR inline QPoint QRect::topRight() const noexcept
{ return QPoint(x2, y1); }
-Q_DECL_CONSTEXPR inline QPoint QRect::bottomLeft() const Q_DECL_NOTHROW
+Q_DECL_CONSTEXPR inline QPoint QRect::bottomLeft() const noexcept
{ return QPoint(x1, y2); }
-Q_DECL_CONSTEXPR inline QPoint QRect::center() const Q_DECL_NOTHROW
+Q_DECL_CONSTEXPR inline QPoint QRect::center() const noexcept
{ return QPoint(int((qint64(x1)+x2)/2), int((qint64(y1)+y2)/2)); } // cast avoids overflow on addition
-Q_DECL_CONSTEXPR inline int QRect::width() const Q_DECL_NOTHROW
+Q_DECL_CONSTEXPR inline int QRect::width() const noexcept
{ return x2 - x1 + 1; }
-Q_DECL_CONSTEXPR inline int QRect::height() const Q_DECL_NOTHROW
+Q_DECL_CONSTEXPR inline int QRect::height() const noexcept
{ return y2 - y1 + 1; }
-Q_DECL_CONSTEXPR inline QSize QRect::size() const Q_DECL_NOTHROW
+Q_DECL_CONSTEXPR inline QSize QRect::size() const noexcept
{ return QSize(width(), height()); }
-Q_DECL_RELAXED_CONSTEXPR inline void QRect::translate(int dx, int dy) Q_DECL_NOTHROW
+Q_DECL_RELAXED_CONSTEXPR inline void QRect::translate(int dx, int dy) noexcept
{
x1 += dx;
y1 += dy;
@@ -279,7 +279,7 @@ Q_DECL_RELAXED_CONSTEXPR inline void QRect::translate(int dx, int dy) Q_DECL_NOT
y2 += dy;
}
-Q_DECL_RELAXED_CONSTEXPR inline void QRect::translate(const QPoint &p) Q_DECL_NOTHROW
+Q_DECL_RELAXED_CONSTEXPR inline void QRect::translate(const QPoint &p) noexcept
{
x1 += p.x();
y1 += p.y();
@@ -287,16 +287,16 @@ Q_DECL_RELAXED_CONSTEXPR inline void QRect::translate(const QPoint &p) Q_DECL_NO
y2 += p.y();
}
-Q_DECL_CONSTEXPR inline QRect QRect::translated(int dx, int dy) const Q_DECL_NOTHROW
+Q_DECL_CONSTEXPR inline QRect QRect::translated(int dx, int dy) const noexcept
{ return QRect(QPoint(x1 + dx, y1 + dy), QPoint(x2 + dx, y2 + dy)); }
-Q_DECL_CONSTEXPR inline QRect QRect::translated(const QPoint &p) const Q_DECL_NOTHROW
+Q_DECL_CONSTEXPR inline QRect QRect::translated(const QPoint &p) const noexcept
{ return QRect(QPoint(x1 + p.x(), y1 + p.y()), QPoint(x2 + p.x(), y2 + p.y())); }
-Q_DECL_CONSTEXPR inline QRect QRect::transposed() const Q_DECL_NOTHROW
+Q_DECL_CONSTEXPR inline QRect QRect::transposed() const noexcept
{ return QRect(topLeft(), size().transposed()); }
-Q_DECL_RELAXED_CONSTEXPR inline void QRect::moveTo(int ax, int ay) Q_DECL_NOTHROW
+Q_DECL_RELAXED_CONSTEXPR inline void QRect::moveTo(int ax, int ay) noexcept
{
x2 += ax - x1;
y2 += ay - y1;
@@ -304,7 +304,7 @@ Q_DECL_RELAXED_CONSTEXPR inline void QRect::moveTo(int ax, int ay) Q_DECL_NOTHRO
y1 = ay;
}
-Q_DECL_RELAXED_CONSTEXPR inline void QRect::moveTo(const QPoint &p) Q_DECL_NOTHROW
+Q_DECL_RELAXED_CONSTEXPR inline void QRect::moveTo(const QPoint &p) noexcept
{
x2 += p.x() - x1;
y2 += p.y() - y1;
@@ -312,49 +312,49 @@ Q_DECL_RELAXED_CONSTEXPR inline void QRect::moveTo(const QPoint &p) Q_DECL_NOTHR
y1 = p.y();
}
-Q_DECL_RELAXED_CONSTEXPR inline void QRect::moveLeft(int pos) Q_DECL_NOTHROW
+Q_DECL_RELAXED_CONSTEXPR inline void QRect::moveLeft(int pos) noexcept
{ x2 += (pos - x1); x1 = pos; }
-Q_DECL_RELAXED_CONSTEXPR inline void QRect::moveTop(int pos) Q_DECL_NOTHROW
+Q_DECL_RELAXED_CONSTEXPR inline void QRect::moveTop(int pos) noexcept
{ y2 += (pos - y1); y1 = pos; }
-Q_DECL_RELAXED_CONSTEXPR inline void QRect::moveRight(int pos) Q_DECL_NOTHROW
+Q_DECL_RELAXED_CONSTEXPR inline void QRect::moveRight(int pos) noexcept
{
x1 += (pos - x2);
x2 = pos;
}
-Q_DECL_RELAXED_CONSTEXPR inline void QRect::moveBottom(int pos) Q_DECL_NOTHROW
+Q_DECL_RELAXED_CONSTEXPR inline void QRect::moveBottom(int pos) noexcept
{
y1 += (pos - y2);
y2 = pos;
}
-Q_DECL_RELAXED_CONSTEXPR inline void QRect::moveTopLeft(const QPoint &p) Q_DECL_NOTHROW
+Q_DECL_RELAXED_CONSTEXPR inline void QRect::moveTopLeft(const QPoint &p) noexcept
{
moveLeft(p.x());
moveTop(p.y());
}
-Q_DECL_RELAXED_CONSTEXPR inline void QRect::moveBottomRight(const QPoint &p) Q_DECL_NOTHROW
+Q_DECL_RELAXED_CONSTEXPR inline void QRect::moveBottomRight(const QPoint &p) noexcept
{
moveRight(p.x());
moveBottom(p.y());
}
-Q_DECL_RELAXED_CONSTEXPR inline void QRect::moveTopRight(const QPoint &p) Q_DECL_NOTHROW
+Q_DECL_RELAXED_CONSTEXPR inline void QRect::moveTopRight(const QPoint &p) noexcept
{
moveRight(p.x());
moveTop(p.y());
}
-Q_DECL_RELAXED_CONSTEXPR inline void QRect::moveBottomLeft(const QPoint &p) Q_DECL_NOTHROW
+Q_DECL_RELAXED_CONSTEXPR inline void QRect::moveBottomLeft(const QPoint &p) noexcept
{
moveLeft(p.x());
moveBottom(p.y());
}
-Q_DECL_RELAXED_CONSTEXPR inline void QRect::moveCenter(const QPoint &p) Q_DECL_NOTHROW
+Q_DECL_RELAXED_CONSTEXPR inline void QRect::moveCenter(const QPoint &p) noexcept
{
int w = x2 - x1;
int h = y2 - y1;
@@ -372,7 +372,7 @@ Q_DECL_RELAXED_CONSTEXPR inline void QRect::getRect(int *ax, int *ay, int *aw, i
*ah = y2 - y1 + 1;
}
-Q_DECL_RELAXED_CONSTEXPR inline void QRect::setRect(int ax, int ay, int aw, int ah) Q_DECL_NOTHROW
+Q_DECL_RELAXED_CONSTEXPR inline void QRect::setRect(int ax, int ay, int aw, int ah) noexcept
{
x1 = ax;
y1 = ay;
@@ -388,7 +388,7 @@ Q_DECL_RELAXED_CONSTEXPR inline void QRect::getCoords(int *xp1, int *yp1, int *x
*yp2 = y2;
}
-Q_DECL_RELAXED_CONSTEXPR inline void QRect::setCoords(int xp1, int yp1, int xp2, int yp2) Q_DECL_NOTHROW
+Q_DECL_RELAXED_CONSTEXPR inline void QRect::setCoords(int xp1, int yp1, int xp2, int yp2) noexcept
{
x1 = xp1;
y1 = yp1;
@@ -396,10 +396,10 @@ Q_DECL_RELAXED_CONSTEXPR inline void QRect::setCoords(int xp1, int yp1, int xp2,
y2 = yp2;
}
-Q_DECL_CONSTEXPR inline QRect QRect::adjusted(int xp1, int yp1, int xp2, int yp2) const Q_DECL_NOTHROW
+Q_DECL_CONSTEXPR inline QRect QRect::adjusted(int xp1, int yp1, int xp2, int yp2) const noexcept
{ return QRect(QPoint(x1 + xp1, y1 + yp1), QPoint(x2 + xp2, y2 + yp2)); }
-Q_DECL_RELAXED_CONSTEXPR inline void QRect::adjust(int dx1, int dy1, int dx2, int dy2) Q_DECL_NOTHROW
+Q_DECL_RELAXED_CONSTEXPR inline void QRect::adjust(int dx1, int dy1, int dx2, int dy2) noexcept
{
x1 += dx1;
y1 += dy1;
@@ -407,97 +407,97 @@ Q_DECL_RELAXED_CONSTEXPR inline void QRect::adjust(int dx1, int dy1, int dx2, in
y2 += dy2;
}
-Q_DECL_RELAXED_CONSTEXPR inline void QRect::setWidth(int w) Q_DECL_NOTHROW
+Q_DECL_RELAXED_CONSTEXPR inline void QRect::setWidth(int w) noexcept
{ x2 = (x1 + w - 1); }
-Q_DECL_RELAXED_CONSTEXPR inline void QRect::setHeight(int h) Q_DECL_NOTHROW
+Q_DECL_RELAXED_CONSTEXPR inline void QRect::setHeight(int h) noexcept
{ y2 = (y1 + h - 1); }
-Q_DECL_RELAXED_CONSTEXPR inline void QRect::setSize(const QSize &s) Q_DECL_NOTHROW
+Q_DECL_RELAXED_CONSTEXPR inline void QRect::setSize(const QSize &s) noexcept
{
x2 = (s.width() + x1 - 1);
y2 = (s.height() + y1 - 1);
}
-inline bool QRect::contains(int ax, int ay, bool aproper) const Q_DECL_NOTHROW
+inline bool QRect::contains(int ax, int ay, bool aproper) const noexcept
{
return contains(QPoint(ax, ay), aproper);
}
-inline bool QRect::contains(int ax, int ay) const Q_DECL_NOTHROW
+inline bool QRect::contains(int ax, int ay) const noexcept
{
return contains(QPoint(ax, ay), false);
}
-inline QRect& QRect::operator|=(const QRect &r) Q_DECL_NOTHROW
+inline QRect& QRect::operator|=(const QRect &r) noexcept
{
*this = *this | r;
return *this;
}
-inline QRect& QRect::operator&=(const QRect &r) Q_DECL_NOTHROW
+inline QRect& QRect::operator&=(const QRect &r) noexcept
{
*this = *this & r;
return *this;
}
-inline QRect QRect::intersected(const QRect &other) const Q_DECL_NOTHROW
+inline QRect QRect::intersected(const QRect &other) const noexcept
{
return *this & other;
}
-inline QRect QRect::united(const QRect &r) const Q_DECL_NOTHROW
+inline QRect QRect::united(const QRect &r) const noexcept
{
return *this | r;
}
-Q_DECL_CONSTEXPR inline bool operator==(const QRect &r1, const QRect &r2) Q_DECL_NOTHROW
+Q_DECL_CONSTEXPR inline bool operator==(const QRect &r1, const QRect &r2) noexcept
{
return r1.x1==r2.x1 && r1.x2==r2.x2 && r1.y1==r2.y1 && r1.y2==r2.y2;
}
-Q_DECL_CONSTEXPR inline bool operator!=(const QRect &r1, const QRect &r2) Q_DECL_NOTHROW
+Q_DECL_CONSTEXPR inline bool operator!=(const QRect &r1, const QRect &r2) noexcept
{
return r1.x1!=r2.x1 || r1.x2!=r2.x2 || r1.y1!=r2.y1 || r1.y2!=r2.y2;
}
-Q_DECL_CONSTEXPR inline QRect operator+(const QRect &rectangle, const QMargins &margins) Q_DECL_NOTHROW
+Q_DECL_CONSTEXPR inline QRect operator+(const QRect &rectangle, const QMargins &margins) noexcept
{
return QRect(QPoint(rectangle.left() - margins.left(), rectangle.top() - margins.top()),
QPoint(rectangle.right() + margins.right(), rectangle.bottom() + margins.bottom()));
}
-Q_DECL_CONSTEXPR inline QRect operator+(const QMargins &margins, const QRect &rectangle) Q_DECL_NOTHROW
+Q_DECL_CONSTEXPR inline QRect operator+(const QMargins &margins, const QRect &rectangle) noexcept
{
return QRect(QPoint(rectangle.left() - margins.left(), rectangle.top() - margins.top()),
QPoint(rectangle.right() + margins.right(), rectangle.bottom() + margins.bottom()));
}
-Q_DECL_CONSTEXPR inline QRect operator-(const QRect &lhs, const QMargins &rhs) Q_DECL_NOTHROW
+Q_DECL_CONSTEXPR inline QRect operator-(const QRect &lhs, const QMargins &rhs) noexcept
{
return QRect(QPoint(lhs.left() + rhs.left(), lhs.top() + rhs.top()),
QPoint(lhs.right() - rhs.right(), lhs.bottom() - rhs.bottom()));
}
-Q_DECL_CONSTEXPR inline QRect QRect::marginsAdded(const QMargins &margins) const Q_DECL_NOTHROW
+Q_DECL_CONSTEXPR inline QRect QRect::marginsAdded(const QMargins &margins) const noexcept
{
return QRect(QPoint(x1 - margins.left(), y1 - margins.top()),
QPoint(x2 + margins.right(), y2 + margins.bottom()));
}
-Q_DECL_CONSTEXPR inline QRect QRect::marginsRemoved(const QMargins &margins) const Q_DECL_NOTHROW
+Q_DECL_CONSTEXPR inline QRect QRect::marginsRemoved(const QMargins &margins) const noexcept
{
return QRect(QPoint(x1 + margins.left(), y1 + margins.top()),
QPoint(x2 - margins.right(), y2 - margins.bottom()));
}
-Q_DECL_RELAXED_CONSTEXPR inline QRect &QRect::operator+=(const QMargins &margins) Q_DECL_NOTHROW
+Q_DECL_RELAXED_CONSTEXPR inline QRect &QRect::operator+=(const QMargins &margins) noexcept
{
*this = marginsAdded(margins);
return *this;
}
-Q_DECL_RELAXED_CONSTEXPR inline QRect &QRect::operator-=(const QMargins &margins) Q_DECL_NOTHROW
+Q_DECL_RELAXED_CONSTEXPR inline QRect &QRect::operator-=(const QMargins &margins) noexcept
{
*this = marginsRemoved(margins);
return *this;
@@ -511,110 +511,110 @@ Q_CORE_EXPORT QDebug operator<<(QDebug, const QRect &);
class Q_CORE_EXPORT QRectF
{
public:
- Q_DECL_CONSTEXPR QRectF() Q_DECL_NOTHROW : xp(0.), yp(0.), w(0.), h(0.) {}
- Q_DECL_CONSTEXPR QRectF(const QPointF &topleft, const QSizeF &size) Q_DECL_NOTHROW;
- Q_DECL_CONSTEXPR QRectF(const QPointF &topleft, const QPointF &bottomRight) Q_DECL_NOTHROW;
- Q_DECL_CONSTEXPR QRectF(qreal left, qreal top, qreal width, qreal height) Q_DECL_NOTHROW;
- Q_DECL_CONSTEXPR QRectF(const QRect &rect) Q_DECL_NOTHROW;
-
- Q_DECL_CONSTEXPR inline bool isNull() const Q_DECL_NOTHROW;
- Q_DECL_CONSTEXPR inline bool isEmpty() const Q_DECL_NOTHROW;
- Q_DECL_CONSTEXPR inline bool isValid() const Q_DECL_NOTHROW;
- Q_REQUIRED_RESULT QRectF normalized() const Q_DECL_NOTHROW;
-
- Q_DECL_CONSTEXPR inline qreal left() const Q_DECL_NOTHROW { return xp; }
- Q_DECL_CONSTEXPR inline qreal top() const Q_DECL_NOTHROW { return yp; }
- Q_DECL_CONSTEXPR inline qreal right() const Q_DECL_NOTHROW { return xp + w; }
- Q_DECL_CONSTEXPR inline qreal bottom() const Q_DECL_NOTHROW { return yp + h; }
-
- Q_DECL_CONSTEXPR inline qreal x() const Q_DECL_NOTHROW;
- Q_DECL_CONSTEXPR inline qreal y() const Q_DECL_NOTHROW;
- Q_DECL_RELAXED_CONSTEXPR inline void setLeft(qreal pos) Q_DECL_NOTHROW;
- Q_DECL_RELAXED_CONSTEXPR inline void setTop(qreal pos) Q_DECL_NOTHROW;
- Q_DECL_RELAXED_CONSTEXPR inline void setRight(qreal pos) Q_DECL_NOTHROW;
- Q_DECL_RELAXED_CONSTEXPR inline void setBottom(qreal pos) Q_DECL_NOTHROW;
- Q_DECL_RELAXED_CONSTEXPR inline void setX(qreal pos) Q_DECL_NOTHROW { setLeft(pos); }
- Q_DECL_RELAXED_CONSTEXPR inline void setY(qreal pos) Q_DECL_NOTHROW { setTop(pos); }
-
- Q_DECL_CONSTEXPR inline QPointF topLeft() const Q_DECL_NOTHROW { return QPointF(xp, yp); }
- Q_DECL_CONSTEXPR inline QPointF bottomRight() const Q_DECL_NOTHROW { return QPointF(xp+w, yp+h); }
- Q_DECL_CONSTEXPR inline QPointF topRight() const Q_DECL_NOTHROW { return QPointF(xp+w, yp); }
- Q_DECL_CONSTEXPR inline QPointF bottomLeft() const Q_DECL_NOTHROW { return QPointF(xp, yp+h); }
- Q_DECL_CONSTEXPR inline QPointF center() const Q_DECL_NOTHROW;
-
- Q_DECL_RELAXED_CONSTEXPR inline void setTopLeft(const QPointF &p) Q_DECL_NOTHROW;
- Q_DECL_RELAXED_CONSTEXPR inline void setBottomRight(const QPointF &p) Q_DECL_NOTHROW;
- Q_DECL_RELAXED_CONSTEXPR inline void setTopRight(const QPointF &p) Q_DECL_NOTHROW;
- Q_DECL_RELAXED_CONSTEXPR inline void setBottomLeft(const QPointF &p) Q_DECL_NOTHROW;
-
- Q_DECL_RELAXED_CONSTEXPR inline void moveLeft(qreal pos) Q_DECL_NOTHROW;
- Q_DECL_RELAXED_CONSTEXPR inline void moveTop(qreal pos) Q_DECL_NOTHROW;
- Q_DECL_RELAXED_CONSTEXPR inline void moveRight(qreal pos) Q_DECL_NOTHROW;
- Q_DECL_RELAXED_CONSTEXPR inline void moveBottom(qreal pos) Q_DECL_NOTHROW;
- Q_DECL_RELAXED_CONSTEXPR inline void moveTopLeft(const QPointF &p) Q_DECL_NOTHROW;
- Q_DECL_RELAXED_CONSTEXPR inline void moveBottomRight(const QPointF &p) Q_DECL_NOTHROW;
- Q_DECL_RELAXED_CONSTEXPR inline void moveTopRight(const QPointF &p) Q_DECL_NOTHROW;
- Q_DECL_RELAXED_CONSTEXPR inline void moveBottomLeft(const QPointF &p) Q_DECL_NOTHROW;
- Q_DECL_RELAXED_CONSTEXPR inline void moveCenter(const QPointF &p) Q_DECL_NOTHROW;
-
- Q_DECL_RELAXED_CONSTEXPR inline void translate(qreal dx, qreal dy) Q_DECL_NOTHROW;
- Q_DECL_RELAXED_CONSTEXPR inline void translate(const QPointF &p) Q_DECL_NOTHROW;
-
- Q_REQUIRED_RESULT Q_DECL_CONSTEXPR inline QRectF translated(qreal dx, qreal dy) const Q_DECL_NOTHROW;
- Q_REQUIRED_RESULT Q_DECL_CONSTEXPR inline QRectF translated(const QPointF &p) const Q_DECL_NOTHROW;
-
- Q_REQUIRED_RESULT Q_DECL_CONSTEXPR inline QRectF transposed() const Q_DECL_NOTHROW;
-
- Q_DECL_RELAXED_CONSTEXPR inline void moveTo(qreal x, qreal y) Q_DECL_NOTHROW;
- Q_DECL_RELAXED_CONSTEXPR inline void moveTo(const QPointF &p) Q_DECL_NOTHROW;
-
- Q_DECL_RELAXED_CONSTEXPR inline void setRect(qreal x, qreal y, qreal w, qreal h) Q_DECL_NOTHROW;
+ Q_DECL_CONSTEXPR QRectF() noexcept : xp(0.), yp(0.), w(0.), h(0.) {}
+ Q_DECL_CONSTEXPR QRectF(const QPointF &topleft, const QSizeF &size) noexcept;
+ Q_DECL_CONSTEXPR QRectF(const QPointF &topleft, const QPointF &bottomRight) noexcept;
+ Q_DECL_CONSTEXPR QRectF(qreal left, qreal top, qreal width, qreal height) noexcept;
+ Q_DECL_CONSTEXPR QRectF(const QRect &rect) noexcept;
+
+ Q_DECL_CONSTEXPR inline bool isNull() const noexcept;
+ Q_DECL_CONSTEXPR inline bool isEmpty() const noexcept;
+ Q_DECL_CONSTEXPR inline bool isValid() const noexcept;
+ Q_REQUIRED_RESULT QRectF normalized() const noexcept;
+
+ Q_DECL_CONSTEXPR inline qreal left() const noexcept { return xp; }
+ Q_DECL_CONSTEXPR inline qreal top() const noexcept { return yp; }
+ Q_DECL_CONSTEXPR inline qreal right() const noexcept { return xp + w; }
+ Q_DECL_CONSTEXPR inline qreal bottom() const noexcept { return yp + h; }
+
+ Q_DECL_CONSTEXPR inline qreal x() const noexcept;
+ Q_DECL_CONSTEXPR inline qreal y() const noexcept;
+ Q_DECL_RELAXED_CONSTEXPR inline void setLeft(qreal pos) noexcept;
+ Q_DECL_RELAXED_CONSTEXPR inline void setTop(qreal pos) noexcept;
+ Q_DECL_RELAXED_CONSTEXPR inline void setRight(qreal pos) noexcept;
+ Q_DECL_RELAXED_CONSTEXPR inline void setBottom(qreal pos) noexcept;
+ Q_DECL_RELAXED_CONSTEXPR inline void setX(qreal pos) noexcept { setLeft(pos); }
+ Q_DECL_RELAXED_CONSTEXPR inline void setY(qreal pos) noexcept { setTop(pos); }
+
+ Q_DECL_CONSTEXPR inline QPointF topLeft() const noexcept { return QPointF(xp, yp); }
+ Q_DECL_CONSTEXPR inline QPointF bottomRight() const noexcept { return QPointF(xp+w, yp+h); }
+ Q_DECL_CONSTEXPR inline QPointF topRight() const noexcept { return QPointF(xp+w, yp); }
+ Q_DECL_CONSTEXPR inline QPointF bottomLeft() const noexcept { return QPointF(xp, yp+h); }
+ Q_DECL_CONSTEXPR inline QPointF center() const noexcept;
+
+ Q_DECL_RELAXED_CONSTEXPR inline void setTopLeft(const QPointF &p) noexcept;
+ Q_DECL_RELAXED_CONSTEXPR inline void setBottomRight(const QPointF &p) noexcept;
+ Q_DECL_RELAXED_CONSTEXPR inline void setTopRight(const QPointF &p) noexcept;
+ Q_DECL_RELAXED_CONSTEXPR inline void setBottomLeft(const QPointF &p) noexcept;
+
+ Q_DECL_RELAXED_CONSTEXPR inline void moveLeft(qreal pos) noexcept;
+ Q_DECL_RELAXED_CONSTEXPR inline void moveTop(qreal pos) noexcept;
+ Q_DECL_RELAXED_CONSTEXPR inline void moveRight(qreal pos) noexcept;
+ Q_DECL_RELAXED_CONSTEXPR inline void moveBottom(qreal pos) noexcept;
+ Q_DECL_RELAXED_CONSTEXPR inline void moveTopLeft(const QPointF &p) noexcept;
+ Q_DECL_RELAXED_CONSTEXPR inline void moveBottomRight(const QPointF &p) noexcept;
+ Q_DECL_RELAXED_CONSTEXPR inline void moveTopRight(const QPointF &p) noexcept;
+ Q_DECL_RELAXED_CONSTEXPR inline void moveBottomLeft(const QPointF &p) noexcept;
+ Q_DECL_RELAXED_CONSTEXPR inline void moveCenter(const QPointF &p) noexcept;
+
+ Q_DECL_RELAXED_CONSTEXPR inline void translate(qreal dx, qreal dy) noexcept;
+ Q_DECL_RELAXED_CONSTEXPR inline void translate(const QPointF &p) noexcept;
+
+ Q_REQUIRED_RESULT Q_DECL_CONSTEXPR inline QRectF translated(qreal dx, qreal dy) const noexcept;
+ Q_REQUIRED_RESULT Q_DECL_CONSTEXPR inline QRectF translated(const QPointF &p) const noexcept;
+
+ Q_REQUIRED_RESULT Q_DECL_CONSTEXPR inline QRectF transposed() const noexcept;
+
+ Q_DECL_RELAXED_CONSTEXPR inline void moveTo(qreal x, qreal y) noexcept;
+ Q_DECL_RELAXED_CONSTEXPR inline void moveTo(const QPointF &p) noexcept;
+
+ Q_DECL_RELAXED_CONSTEXPR inline void setRect(qreal x, qreal y, qreal w, qreal h) noexcept;
Q_DECL_RELAXED_CONSTEXPR inline void getRect(qreal *x, qreal *y, qreal *w, qreal *h) const;
- Q_DECL_RELAXED_CONSTEXPR inline void setCoords(qreal x1, qreal y1, qreal x2, qreal y2) Q_DECL_NOTHROW;
+ Q_DECL_RELAXED_CONSTEXPR inline void setCoords(qreal x1, qreal y1, qreal x2, qreal y2) noexcept;
Q_DECL_RELAXED_CONSTEXPR inline void getCoords(qreal *x1, qreal *y1, qreal *x2, qreal *y2) const;
- Q_DECL_RELAXED_CONSTEXPR inline void adjust(qreal x1, qreal y1, qreal x2, qreal y2) Q_DECL_NOTHROW;
- Q_REQUIRED_RESULT Q_DECL_CONSTEXPR inline QRectF adjusted(qreal x1, qreal y1, qreal x2, qreal y2) const Q_DECL_NOTHROW;
-
- Q_DECL_CONSTEXPR inline QSizeF size() const Q_DECL_NOTHROW;
- Q_DECL_CONSTEXPR inline qreal width() const Q_DECL_NOTHROW;
- Q_DECL_CONSTEXPR inline qreal height() const Q_DECL_NOTHROW;
- Q_DECL_RELAXED_CONSTEXPR inline void setWidth(qreal w) Q_DECL_NOTHROW;
- Q_DECL_RELAXED_CONSTEXPR inline void setHeight(qreal h) Q_DECL_NOTHROW;
- Q_DECL_RELAXED_CONSTEXPR inline void setSize(const QSizeF &s) Q_DECL_NOTHROW;
-
- QRectF operator|(const QRectF &r) const Q_DECL_NOTHROW;
- QRectF operator&(const QRectF &r) const Q_DECL_NOTHROW;
- inline QRectF& operator|=(const QRectF &r) Q_DECL_NOTHROW;
- inline QRectF& operator&=(const QRectF &r) Q_DECL_NOTHROW;
-
- bool contains(const QRectF &r) const Q_DECL_NOTHROW;
- bool contains(const QPointF &p) const Q_DECL_NOTHROW;
- inline bool contains(qreal x, qreal y) const Q_DECL_NOTHROW;
- Q_REQUIRED_RESULT inline QRectF united(const QRectF &other) const Q_DECL_NOTHROW;
- Q_REQUIRED_RESULT inline QRectF intersected(const QRectF &other) const Q_DECL_NOTHROW;
- bool intersects(const QRectF &r) const Q_DECL_NOTHROW;
-
- Q_DECL_CONSTEXPR inline QRectF marginsAdded(const QMarginsF &margins) const Q_DECL_NOTHROW;
- Q_DECL_CONSTEXPR inline QRectF marginsRemoved(const QMarginsF &margins) const Q_DECL_NOTHROW;
- Q_DECL_RELAXED_CONSTEXPR inline QRectF &operator+=(const QMarginsF &margins) Q_DECL_NOTHROW;
- Q_DECL_RELAXED_CONSTEXPR inline QRectF &operator-=(const QMarginsF &margins) Q_DECL_NOTHROW;
+ Q_DECL_RELAXED_CONSTEXPR inline void adjust(qreal x1, qreal y1, qreal x2, qreal y2) noexcept;
+ Q_REQUIRED_RESULT Q_DECL_CONSTEXPR inline QRectF adjusted(qreal x1, qreal y1, qreal x2, qreal y2) const noexcept;
+
+ Q_DECL_CONSTEXPR inline QSizeF size() const noexcept;
+ Q_DECL_CONSTEXPR inline qreal width() const noexcept;
+ Q_DECL_CONSTEXPR inline qreal height() const noexcept;
+ Q_DECL_RELAXED_CONSTEXPR inline void setWidth(qreal w) noexcept;
+ Q_DECL_RELAXED_CONSTEXPR inline void setHeight(qreal h) noexcept;
+ Q_DECL_RELAXED_CONSTEXPR inline void setSize(const QSizeF &s) noexcept;
+
+ QRectF operator|(const QRectF &r) const noexcept;
+ QRectF operator&(const QRectF &r) const noexcept;
+ inline QRectF& operator|=(const QRectF &r) noexcept;
+ inline QRectF& operator&=(const QRectF &r) noexcept;
+
+ bool contains(const QRectF &r) const noexcept;
+ bool contains(const QPointF &p) const noexcept;
+ inline bool contains(qreal x, qreal y) const noexcept;
+ Q_REQUIRED_RESULT inline QRectF united(const QRectF &other) const noexcept;
+ Q_REQUIRED_RESULT inline QRectF intersected(const QRectF &other) const noexcept;
+ bool intersects(const QRectF &r) const noexcept;
+
+ Q_DECL_CONSTEXPR inline QRectF marginsAdded(const QMarginsF &margins) const noexcept;
+ Q_DECL_CONSTEXPR inline QRectF marginsRemoved(const QMarginsF &margins) const noexcept;
+ Q_DECL_RELAXED_CONSTEXPR inline QRectF &operator+=(const QMarginsF &margins) noexcept;
+ Q_DECL_RELAXED_CONSTEXPR inline QRectF &operator-=(const QMarginsF &margins) noexcept;
#if QT_DEPRECATED_SINCE(5, 0)
- Q_REQUIRED_RESULT QT_DEPRECATED QRectF unite(const QRectF &r) const Q_DECL_NOTHROW { return united(r); }
- Q_REQUIRED_RESULT QT_DEPRECATED QRectF intersect(const QRectF &r) const Q_DECL_NOTHROW { return intersected(r); }
+ Q_REQUIRED_RESULT QT_DEPRECATED QRectF unite(const QRectF &r) const noexcept { return united(r); }
+ Q_REQUIRED_RESULT QT_DEPRECATED QRectF intersect(const QRectF &r) const noexcept { return intersected(r); }
#endif
- friend Q_DECL_CONSTEXPR inline bool operator==(const QRectF &, const QRectF &) Q_DECL_NOTHROW;
- friend Q_DECL_CONSTEXPR inline bool operator!=(const QRectF &, const QRectF &) Q_DECL_NOTHROW;
+ friend Q_DECL_CONSTEXPR inline bool operator==(const QRectF &, const QRectF &) noexcept;
+ friend Q_DECL_CONSTEXPR inline bool operator!=(const QRectF &, const QRectF &) noexcept;
- Q_REQUIRED_RESULT Q_DECL_CONSTEXPR inline QRect toRect() const Q_DECL_NOTHROW;
- Q_REQUIRED_RESULT QRect toAlignedRect() const Q_DECL_NOTHROW;
+ Q_REQUIRED_RESULT Q_DECL_CONSTEXPR inline QRect toRect() const noexcept;
+ Q_REQUIRED_RESULT QRect toAlignedRect() const noexcept;
#if defined(Q_OS_DARWIN) || defined(Q_QDOC)
- Q_REQUIRED_RESULT static QRectF fromCGRect(CGRect rect) Q_DECL_NOTHROW;
- Q_REQUIRED_RESULT CGRect toCGRect() const Q_DECL_NOTHROW;
+ Q_REQUIRED_RESULT static QRectF fromCGRect(CGRect rect) noexcept;
+ Q_REQUIRED_RESULT CGRect toCGRect() const noexcept;
#endif
private:
@@ -625,8 +625,8 @@ private:
};
Q_DECLARE_TYPEINFO(QRectF, Q_MOVABLE_TYPE);
-Q_DECL_CONSTEXPR inline bool operator==(const QRectF &, const QRectF &) Q_DECL_NOTHROW;
-Q_DECL_CONSTEXPR inline bool operator!=(const QRectF &, const QRectF &) Q_DECL_NOTHROW;
+Q_DECL_CONSTEXPR inline bool operator==(const QRectF &, const QRectF &) noexcept;
+Q_DECL_CONSTEXPR inline bool operator!=(const QRectF &, const QRectF &) noexcept;
/*****************************************************************************
@@ -641,23 +641,23 @@ Q_CORE_EXPORT QDataStream &operator>>(QDataStream &, QRectF &);
QRectF inline member functions
*****************************************************************************/
-Q_DECL_CONSTEXPR inline QRectF::QRectF(qreal aleft, qreal atop, qreal awidth, qreal aheight) Q_DECL_NOTHROW
+Q_DECL_CONSTEXPR inline QRectF::QRectF(qreal aleft, qreal atop, qreal awidth, qreal aheight) noexcept
: xp(aleft), yp(atop), w(awidth), h(aheight)
{
}
-Q_DECL_CONSTEXPR inline QRectF::QRectF(const QPointF &atopLeft, const QSizeF &asize) Q_DECL_NOTHROW
+Q_DECL_CONSTEXPR inline QRectF::QRectF(const QPointF &atopLeft, const QSizeF &asize) noexcept
: xp(atopLeft.x()), yp(atopLeft.y()), w(asize.width()), h(asize.height())
{
}
-Q_DECL_CONSTEXPR inline QRectF::QRectF(const QPointF &atopLeft, const QPointF &abottomRight) Q_DECL_NOTHROW
+Q_DECL_CONSTEXPR inline QRectF::QRectF(const QPointF &atopLeft, const QPointF &abottomRight) noexcept
: xp(atopLeft.x()), yp(atopLeft.y()), w(abottomRight.x() - atopLeft.x()), h(abottomRight.y() - atopLeft.y())
{
}
-Q_DECL_CONSTEXPR inline QRectF::QRectF(const QRect &r) Q_DECL_NOTHROW
+Q_DECL_CONSTEXPR inline QRectF::QRectF(const QRect &r) noexcept
: xp(r.x()), yp(r.y()), w(r.width()), h(r.height())
{
}
@@ -666,117 +666,117 @@ QT_WARNING_PUSH
QT_WARNING_DISABLE_CLANG("-Wfloat-equal")
QT_WARNING_DISABLE_GCC("-Wfloat-equal")
-Q_DECL_CONSTEXPR inline bool QRectF::isNull() const Q_DECL_NOTHROW
+Q_DECL_CONSTEXPR inline bool QRectF::isNull() const noexcept
{ return w == 0. && h == 0.; }
-Q_DECL_CONSTEXPR inline bool QRectF::isEmpty() const Q_DECL_NOTHROW
+Q_DECL_CONSTEXPR inline bool QRectF::isEmpty() const noexcept
{ return w <= 0. || h <= 0.; }
QT_WARNING_POP
-Q_DECL_CONSTEXPR inline bool QRectF::isValid() const Q_DECL_NOTHROW
+Q_DECL_CONSTEXPR inline bool QRectF::isValid() const noexcept
{ return w > 0. && h > 0.; }
-Q_DECL_CONSTEXPR inline qreal QRectF::x() const Q_DECL_NOTHROW
+Q_DECL_CONSTEXPR inline qreal QRectF::x() const noexcept
{ return xp; }
-Q_DECL_CONSTEXPR inline qreal QRectF::y() const Q_DECL_NOTHROW
+Q_DECL_CONSTEXPR inline qreal QRectF::y() const noexcept
{ return yp; }
-Q_DECL_RELAXED_CONSTEXPR inline void QRectF::setLeft(qreal pos) Q_DECL_NOTHROW
+Q_DECL_RELAXED_CONSTEXPR inline void QRectF::setLeft(qreal pos) noexcept
{ qreal diff = pos - xp; xp += diff; w -= diff; }
-Q_DECL_RELAXED_CONSTEXPR inline void QRectF::setRight(qreal pos) Q_DECL_NOTHROW
+Q_DECL_RELAXED_CONSTEXPR inline void QRectF::setRight(qreal pos) noexcept
{ w = pos - xp; }
-Q_DECL_RELAXED_CONSTEXPR inline void QRectF::setTop(qreal pos) Q_DECL_NOTHROW
+Q_DECL_RELAXED_CONSTEXPR inline void QRectF::setTop(qreal pos) noexcept
{ qreal diff = pos - yp; yp += diff; h -= diff; }
-Q_DECL_RELAXED_CONSTEXPR inline void QRectF::setBottom(qreal pos) Q_DECL_NOTHROW
+Q_DECL_RELAXED_CONSTEXPR inline void QRectF::setBottom(qreal pos) noexcept
{ h = pos - yp; }
-Q_DECL_RELAXED_CONSTEXPR inline void QRectF::setTopLeft(const QPointF &p) Q_DECL_NOTHROW
+Q_DECL_RELAXED_CONSTEXPR inline void QRectF::setTopLeft(const QPointF &p) noexcept
{ setLeft(p.x()); setTop(p.y()); }
-Q_DECL_RELAXED_CONSTEXPR inline void QRectF::setTopRight(const QPointF &p) Q_DECL_NOTHROW
+Q_DECL_RELAXED_CONSTEXPR inline void QRectF::setTopRight(const QPointF &p) noexcept
{ setRight(p.x()); setTop(p.y()); }
-Q_DECL_RELAXED_CONSTEXPR inline void QRectF::setBottomLeft(const QPointF &p) Q_DECL_NOTHROW
+Q_DECL_RELAXED_CONSTEXPR inline void QRectF::setBottomLeft(const QPointF &p) noexcept
{ setLeft(p.x()); setBottom(p.y()); }
-Q_DECL_RELAXED_CONSTEXPR inline void QRectF::setBottomRight(const QPointF &p) Q_DECL_NOTHROW
+Q_DECL_RELAXED_CONSTEXPR inline void QRectF::setBottomRight(const QPointF &p) noexcept
{ setRight(p.x()); setBottom(p.y()); }
-Q_DECL_CONSTEXPR inline QPointF QRectF::center() const Q_DECL_NOTHROW
+Q_DECL_CONSTEXPR inline QPointF QRectF::center() const noexcept
{ return QPointF(xp + w/2, yp + h/2); }
-Q_DECL_RELAXED_CONSTEXPR inline void QRectF::moveLeft(qreal pos) Q_DECL_NOTHROW
+Q_DECL_RELAXED_CONSTEXPR inline void QRectF::moveLeft(qreal pos) noexcept
{ xp = pos; }
-Q_DECL_RELAXED_CONSTEXPR inline void QRectF::moveTop(qreal pos) Q_DECL_NOTHROW
+Q_DECL_RELAXED_CONSTEXPR inline void QRectF::moveTop(qreal pos) noexcept
{ yp = pos; }
-Q_DECL_RELAXED_CONSTEXPR inline void QRectF::moveRight(qreal pos) Q_DECL_NOTHROW
+Q_DECL_RELAXED_CONSTEXPR inline void QRectF::moveRight(qreal pos) noexcept
{ xp = pos - w; }
-Q_DECL_RELAXED_CONSTEXPR inline void QRectF::moveBottom(qreal pos) Q_DECL_NOTHROW
+Q_DECL_RELAXED_CONSTEXPR inline void QRectF::moveBottom(qreal pos) noexcept
{ yp = pos - h; }
-Q_DECL_RELAXED_CONSTEXPR inline void QRectF::moveTopLeft(const QPointF &p) Q_DECL_NOTHROW
+Q_DECL_RELAXED_CONSTEXPR inline void QRectF::moveTopLeft(const QPointF &p) noexcept
{ moveLeft(p.x()); moveTop(p.y()); }
-Q_DECL_RELAXED_CONSTEXPR inline void QRectF::moveTopRight(const QPointF &p) Q_DECL_NOTHROW
+Q_DECL_RELAXED_CONSTEXPR inline void QRectF::moveTopRight(const QPointF &p) noexcept
{ moveRight(p.x()); moveTop(p.y()); }
-Q_DECL_RELAXED_CONSTEXPR inline void QRectF::moveBottomLeft(const QPointF &p) Q_DECL_NOTHROW
+Q_DECL_RELAXED_CONSTEXPR inline void QRectF::moveBottomLeft(const QPointF &p) noexcept
{ moveLeft(p.x()); moveBottom(p.y()); }
-Q_DECL_RELAXED_CONSTEXPR inline void QRectF::moveBottomRight(const QPointF &p) Q_DECL_NOTHROW
+Q_DECL_RELAXED_CONSTEXPR inline void QRectF::moveBottomRight(const QPointF &p) noexcept
{ moveRight(p.x()); moveBottom(p.y()); }
-Q_DECL_RELAXED_CONSTEXPR inline void QRectF::moveCenter(const QPointF &p) Q_DECL_NOTHROW
+Q_DECL_RELAXED_CONSTEXPR inline void QRectF::moveCenter(const QPointF &p) noexcept
{ xp = p.x() - w/2; yp = p.y() - h/2; }
-Q_DECL_CONSTEXPR inline qreal QRectF::width() const Q_DECL_NOTHROW
+Q_DECL_CONSTEXPR inline qreal QRectF::width() const noexcept
{ return w; }
-Q_DECL_CONSTEXPR inline qreal QRectF::height() const Q_DECL_NOTHROW
+Q_DECL_CONSTEXPR inline qreal QRectF::height() const noexcept
{ return h; }
-Q_DECL_CONSTEXPR inline QSizeF QRectF::size() const Q_DECL_NOTHROW
+Q_DECL_CONSTEXPR inline QSizeF QRectF::size() const noexcept
{ return QSizeF(w, h); }
-Q_DECL_RELAXED_CONSTEXPR inline void QRectF::translate(qreal dx, qreal dy) Q_DECL_NOTHROW
+Q_DECL_RELAXED_CONSTEXPR inline void QRectF::translate(qreal dx, qreal dy) noexcept
{
xp += dx;
yp += dy;
}
-Q_DECL_RELAXED_CONSTEXPR inline void QRectF::translate(const QPointF &p) Q_DECL_NOTHROW
+Q_DECL_RELAXED_CONSTEXPR inline void QRectF::translate(const QPointF &p) noexcept
{
xp += p.x();
yp += p.y();
}
-Q_DECL_RELAXED_CONSTEXPR inline void QRectF::moveTo(qreal ax, qreal ay) Q_DECL_NOTHROW
+Q_DECL_RELAXED_CONSTEXPR inline void QRectF::moveTo(qreal ax, qreal ay) noexcept
{
xp = ax;
yp = ay;
}
-Q_DECL_RELAXED_CONSTEXPR inline void QRectF::moveTo(const QPointF &p) Q_DECL_NOTHROW
+Q_DECL_RELAXED_CONSTEXPR inline void QRectF::moveTo(const QPointF &p) noexcept
{
xp = p.x();
yp = p.y();
}
-Q_DECL_CONSTEXPR inline QRectF QRectF::translated(qreal dx, qreal dy) const Q_DECL_NOTHROW
+Q_DECL_CONSTEXPR inline QRectF QRectF::translated(qreal dx, qreal dy) const noexcept
{ return QRectF(xp + dx, yp + dy, w, h); }
-Q_DECL_CONSTEXPR inline QRectF QRectF::translated(const QPointF &p) const Q_DECL_NOTHROW
+Q_DECL_CONSTEXPR inline QRectF QRectF::translated(const QPointF &p) const noexcept
{ return QRectF(xp + p.x(), yp + p.y(), w, h); }
-Q_DECL_CONSTEXPR inline QRectF QRectF::transposed() const Q_DECL_NOTHROW
+Q_DECL_CONSTEXPR inline QRectF QRectF::transposed() const noexcept
{ return QRectF(topLeft(), size().transposed()); }
Q_DECL_RELAXED_CONSTEXPR inline void QRectF::getRect(qreal *ax, qreal *ay, qreal *aaw, qreal *aah) const
@@ -787,7 +787,7 @@ Q_DECL_RELAXED_CONSTEXPR inline void QRectF::getRect(qreal *ax, qreal *ay, qreal
*aah = this->h;
}
-Q_DECL_RELAXED_CONSTEXPR inline void QRectF::setRect(qreal ax, qreal ay, qreal aaw, qreal aah) Q_DECL_NOTHROW
+Q_DECL_RELAXED_CONSTEXPR inline void QRectF::setRect(qreal ax, qreal ay, qreal aaw, qreal aah) noexcept
{
this->xp = ax;
this->yp = ay;
@@ -803,7 +803,7 @@ Q_DECL_RELAXED_CONSTEXPR inline void QRectF::getCoords(qreal *xp1, qreal *yp1, q
*yp2 = yp + h;
}
-Q_DECL_RELAXED_CONSTEXPR inline void QRectF::setCoords(qreal xp1, qreal yp1, qreal xp2, qreal yp2) Q_DECL_NOTHROW
+Q_DECL_RELAXED_CONSTEXPR inline void QRectF::setCoords(qreal xp1, qreal yp1, qreal xp2, qreal yp2) noexcept
{
xp = xp1;
yp = yp1;
@@ -811,105 +811,105 @@ Q_DECL_RELAXED_CONSTEXPR inline void QRectF::setCoords(qreal xp1, qreal yp1, qre
h = yp2 - yp1;
}
-Q_DECL_RELAXED_CONSTEXPR inline void QRectF::adjust(qreal xp1, qreal yp1, qreal xp2, qreal yp2) Q_DECL_NOTHROW
+Q_DECL_RELAXED_CONSTEXPR inline void QRectF::adjust(qreal xp1, qreal yp1, qreal xp2, qreal yp2) noexcept
{ xp += xp1; yp += yp1; w += xp2 - xp1; h += yp2 - yp1; }
-Q_DECL_CONSTEXPR inline QRectF QRectF::adjusted(qreal xp1, qreal yp1, qreal xp2, qreal yp2) const Q_DECL_NOTHROW
+Q_DECL_CONSTEXPR inline QRectF QRectF::adjusted(qreal xp1, qreal yp1, qreal xp2, qreal yp2) const noexcept
{ return QRectF(xp + xp1, yp + yp1, w + xp2 - xp1, h + yp2 - yp1); }
-Q_DECL_RELAXED_CONSTEXPR inline void QRectF::setWidth(qreal aw) Q_DECL_NOTHROW
+Q_DECL_RELAXED_CONSTEXPR inline void QRectF::setWidth(qreal aw) noexcept
{ this->w = aw; }
-Q_DECL_RELAXED_CONSTEXPR inline void QRectF::setHeight(qreal ah) Q_DECL_NOTHROW
+Q_DECL_RELAXED_CONSTEXPR inline void QRectF::setHeight(qreal ah) noexcept
{ this->h = ah; }
-Q_DECL_RELAXED_CONSTEXPR inline void QRectF::setSize(const QSizeF &s) Q_DECL_NOTHROW
+Q_DECL_RELAXED_CONSTEXPR inline void QRectF::setSize(const QSizeF &s) noexcept
{
w = s.width();
h = s.height();
}
-inline bool QRectF::contains(qreal ax, qreal ay) const Q_DECL_NOTHROW
+inline bool QRectF::contains(qreal ax, qreal ay) const noexcept
{
return contains(QPointF(ax, ay));
}
-inline QRectF& QRectF::operator|=(const QRectF &r) Q_DECL_NOTHROW
+inline QRectF& QRectF::operator|=(const QRectF &r) noexcept
{
*this = *this | r;
return *this;
}
-inline QRectF& QRectF::operator&=(const QRectF &r) Q_DECL_NOTHROW
+inline QRectF& QRectF::operator&=(const QRectF &r) noexcept
{
*this = *this & r;
return *this;
}
-inline QRectF QRectF::intersected(const QRectF &r) const Q_DECL_NOTHROW
+inline QRectF QRectF::intersected(const QRectF &r) const noexcept
{
return *this & r;
}
-inline QRectF QRectF::united(const QRectF &r) const Q_DECL_NOTHROW
+inline QRectF QRectF::united(const QRectF &r) const noexcept
{
return *this | r;
}
-Q_DECL_CONSTEXPR inline bool operator==(const QRectF &r1, const QRectF &r2) Q_DECL_NOTHROW
+Q_DECL_CONSTEXPR inline bool operator==(const QRectF &r1, const QRectF &r2) noexcept
{
return qFuzzyCompare(r1.xp, r2.xp) && qFuzzyCompare(r1.yp, r2.yp)
&& qFuzzyCompare(r1.w, r2.w) && qFuzzyCompare(r1.h, r2.h);
}
-Q_DECL_CONSTEXPR inline bool operator!=(const QRectF &r1, const QRectF &r2) Q_DECL_NOTHROW
+Q_DECL_CONSTEXPR inline bool operator!=(const QRectF &r1, const QRectF &r2) noexcept
{
return !qFuzzyCompare(r1.xp, r2.xp) || !qFuzzyCompare(r1.yp, r2.yp)
|| !qFuzzyCompare(r1.w, r2.w) || !qFuzzyCompare(r1.h, r2.h);
}
-Q_DECL_CONSTEXPR inline QRect QRectF::toRect() const Q_DECL_NOTHROW
+Q_DECL_CONSTEXPR inline QRect QRectF::toRect() const noexcept
{
return QRect(QPoint(qRound(xp), qRound(yp)), QPoint(qRound(xp + w) - 1, qRound(yp + h) - 1));
}
-Q_DECL_CONSTEXPR inline QRectF operator+(const QRectF &lhs, const QMarginsF &rhs) Q_DECL_NOTHROW
+Q_DECL_CONSTEXPR inline QRectF operator+(const QRectF &lhs, const QMarginsF &rhs) noexcept
{
return QRectF(QPointF(lhs.left() - rhs.left(), lhs.top() - rhs.top()),
QSizeF(lhs.width() + rhs.left() + rhs.right(), lhs.height() + rhs.top() + rhs.bottom()));
}
-Q_DECL_CONSTEXPR inline QRectF operator+(const QMarginsF &lhs, const QRectF &rhs) Q_DECL_NOTHROW
+Q_DECL_CONSTEXPR inline QRectF operator+(const QMarginsF &lhs, const QRectF &rhs) noexcept
{
return QRectF(QPointF(rhs.left() - lhs.left(), rhs.top() - lhs.top()),
QSizeF(rhs.width() + lhs.left() + lhs.right(), rhs.height() + lhs.top() + lhs.bottom()));
}
-Q_DECL_CONSTEXPR inline QRectF operator-(const QRectF &lhs, const QMarginsF &rhs) Q_DECL_NOTHROW
+Q_DECL_CONSTEXPR inline QRectF operator-(const QRectF &lhs, const QMarginsF &rhs) noexcept
{
return QRectF(QPointF(lhs.left() + rhs.left(), lhs.top() + rhs.top()),
QSizeF(lhs.width() - rhs.left() - rhs.right(), lhs.height() - rhs.top() - rhs.bottom()));
}
-Q_DECL_CONSTEXPR inline QRectF QRectF::marginsAdded(const QMarginsF &margins) const Q_DECL_NOTHROW
+Q_DECL_CONSTEXPR inline QRectF QRectF::marginsAdded(const QMarginsF &margins) const noexcept
{
return QRectF(QPointF(xp - margins.left(), yp - margins.top()),
QSizeF(w + margins.left() + margins.right(), h + margins.top() + margins.bottom()));
}
-Q_DECL_CONSTEXPR inline QRectF QRectF::marginsRemoved(const QMarginsF &margins) const Q_DECL_NOTHROW
+Q_DECL_CONSTEXPR inline QRectF QRectF::marginsRemoved(const QMarginsF &margins) const noexcept
{
return QRectF(QPointF(xp + margins.left(), yp + margins.top()),
QSizeF(w - margins.left() - margins.right(), h - margins.top() - margins.bottom()));
}
-Q_DECL_RELAXED_CONSTEXPR inline QRectF &QRectF::operator+=(const QMarginsF &margins) Q_DECL_NOTHROW
+Q_DECL_RELAXED_CONSTEXPR inline QRectF &QRectF::operator+=(const QMarginsF &margins) noexcept
{
*this = marginsAdded(margins);
return *this;
}
-Q_DECL_RELAXED_CONSTEXPR inline QRectF &QRectF::operator-=(const QMarginsF &margins) Q_DECL_NOTHROW
+Q_DECL_RELAXED_CONSTEXPR inline QRectF &QRectF::operator-=(const QMarginsF &margins) noexcept
{
*this = marginsRemoved(margins);
return *this;
diff --git a/src/corelib/tools/qrefcount.h b/src/corelib/tools/qrefcount.h
index 9586c3a79a..2e5388ad9a 100644
--- a/src/corelib/tools/qrefcount.h
+++ b/src/corelib/tools/qrefcount.h
@@ -51,8 +51,8 @@ namespace QtPrivate
class RefCount
{
public:
- inline bool ref() Q_DECL_NOTHROW {
- int count = atomic.load();
+ inline bool ref() noexcept {
+ int count = atomic.loadRelaxed();
#if !defined(QT_NO_UNSHARABLE_CONTAINERS)
if (count == 0) // !isSharable
return false;
@@ -62,8 +62,8 @@ public:
return true;
}
- inline bool deref() Q_DECL_NOTHROW {
- int count = atomic.load();
+ inline bool deref() noexcept {
+ int count = atomic.loadRelaxed();
#if !defined(QT_NO_UNSHARABLE_CONTAINERS)
if (count == 0) // !isSharable
return false;
@@ -74,7 +74,7 @@ public:
}
#if !defined(QT_NO_UNSHARABLE_CONTAINERS)
- bool setSharable(bool sharable) Q_DECL_NOTHROW
+ bool setSharable(bool sharable) noexcept
{
Q_ASSERT(!isShared());
if (sharable)
@@ -83,27 +83,27 @@ public:
return atomic.testAndSetRelaxed(1, 0);
}
- bool isSharable() const Q_DECL_NOTHROW
+ bool isSharable() const noexcept
{
// Sharable === Shared ownership.
- return atomic.load() != 0;
+ return atomic.loadRelaxed() != 0;
}
#endif
- bool isStatic() const Q_DECL_NOTHROW
+ bool isStatic() const noexcept
{
// Persistent object, never deleted
- return atomic.load() == -1;
+ return atomic.loadRelaxed() == -1;
}
- bool isShared() const Q_DECL_NOTHROW
+ bool isShared() const noexcept
{
- int count = atomic.load();
+ int count = atomic.loadRelaxed();
return (count != 1) && (count != 0);
}
- void initializeOwned() Q_DECL_NOTHROW { atomic.store(1); }
- void initializeUnsharable() Q_DECL_NOTHROW { atomic.store(0); }
+ void initializeOwned() noexcept { atomic.storeRelaxed(1); }
+ void initializeUnsharable() noexcept { atomic.storeRelaxed(0); }
QBasicAtomicInt atomic;
};
diff --git a/src/corelib/tools/qregexp.cpp b/src/corelib/tools/qregexp.cpp
deleted file mode 100644
index adca8624f9..0000000000
--- a/src/corelib/tools/qregexp.cpp
+++ /dev/null
@@ -1,4605 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#include "qregexp.h"
-
-#include "qalgorithms.h"
-#include "qbitarray.h"
-#include "qcache.h"
-#include "qdatastream.h"
-#include "qdebug.h"
-#include "qhashfunctions.h"
-#include "qlist.h"
-#include "qmap.h"
-#include "qmutex.h"
-#include "qstring.h"
-#include "qstringlist.h"
-#include "qstringmatcher.h"
-#include "qvector.h"
-
-#include <limits.h>
-#include <algorithm>
-
-QT_BEGIN_NAMESPACE
-
-int qFindString(const QChar *haystack, int haystackLen, int from,
- const QChar *needle, int needleLen, Qt::CaseSensitivity cs);
-
-// error strings for the regexp parser
-#define RXERR_OK QT_TRANSLATE_NOOP("QRegExp", "no error occurred")
-#define RXERR_DISABLED QT_TRANSLATE_NOOP("QRegExp", "disabled feature used")
-#define RXERR_CHARCLASS QT_TRANSLATE_NOOP("QRegExp", "bad char class syntax")
-#define RXERR_LOOKAHEAD QT_TRANSLATE_NOOP("QRegExp", "bad lookahead syntax")
-#define RXERR_LOOKBEHIND QT_TRANSLATE_NOOP("QRegExp", "lookbehinds not supported, see QTBUG-2371")
-#define RXERR_REPETITION QT_TRANSLATE_NOOP("QRegExp", "bad repetition syntax")
-#define RXERR_OCTAL QT_TRANSLATE_NOOP("QRegExp", "invalid octal value")
-#define RXERR_LEFTDELIM QT_TRANSLATE_NOOP("QRegExp", "missing left delim")
-#define RXERR_END QT_TRANSLATE_NOOP("QRegExp", "unexpected end")
-#define RXERR_LIMIT QT_TRANSLATE_NOOP("QRegExp", "met internal limit")
-#define RXERR_INTERVAL QT_TRANSLATE_NOOP("QRegExp", "invalid interval")
-#define RXERR_CATEGORY QT_TRANSLATE_NOOP("QRegExp", "invalid category")
-
-/*!
- \class QRegExp
- \inmodule QtCore
- \reentrant
- \brief The QRegExp class provides pattern matching using regular expressions.
-
- \ingroup tools
- \ingroup shared
-
- \keyword regular expression
-
- A regular expression, or "regexp", is a pattern for matching
- substrings in a text. This is useful in many contexts, e.g.,
-
- \table
- \row \li Validation
- \li A regexp can test whether a substring meets some criteria,
- e.g. is an integer or contains no whitespace.
- \row \li Searching
- \li A regexp provides more powerful pattern matching than
- simple substring matching, e.g., match one of the words
- \e{mail}, \e{letter} or \e{correspondence}, but none of the
- words \e{email}, \e{mailman}, \e{mailer}, \e{letterbox}, etc.
- \row \li Search and Replace
- \li A regexp can replace all occurrences of a substring with a
- different substring, e.g., replace all occurrences of \e{&}
- with \e{\&amp;} except where the \e{&} is already followed by
- an \e{amp;}.
- \row \li String Splitting
- \li A regexp can be used to identify where a string should be
- split apart, e.g. splitting tab-delimited strings.
- \endtable
-
- A brief introduction to regexps is presented, a description of
- Qt's regexp language, some examples, and the function
- documentation itself. QRegExp is modeled on Perl's regexp
- language. It fully supports Unicode. QRegExp can also be used in a
- simpler, \e{wildcard mode} that is similar to the functionality
- found in command shells. The syntax rules used by QRegExp can be
- changed with setPatternSyntax(). In particular, the pattern syntax
- can be set to QRegExp::FixedString, which means the pattern to be
- matched is interpreted as a plain string, i.e., special characters
- (e.g., backslash) are not escaped.
-
- A good text on regexps is \e {Mastering Regular Expressions}
- (Third Edition) by Jeffrey E. F. Friedl, ISBN 0-596-52812-4.
-
- \note In Qt 5, the new QRegularExpression class provides a Perl
- compatible implementation of regular expressions and is recommended
- in place of QRegExp.
-
- \tableofcontents
-
- \section1 Introduction
-
- Regexps are built up from expressions, quantifiers, and
- assertions. The simplest expression is a character, e.g. \b{x}
- or \b{5}. An expression can also be a set of characters
- enclosed in square brackets. \b{[ABCD]} will match an \b{A}
- or a \b{B} or a \b{C} or a \b{D}. We can write this same
- expression as \b{[A-D]}, and an expression to match any
- capital letter in the English alphabet is written as
- \b{[A-Z]}.
-
- A quantifier specifies the number of occurrences of an expression
- that must be matched. \b{x{1,1}} means match one and only one
- \b{x}. \b{x{1,5}} means match a sequence of \b{x}
- characters that contains at least one \b{x} but no more than
- five.
-
- Note that in general regexps cannot be used to check for balanced
- brackets or tags. For example, a regexp can be written to match an
- opening html \c{<b>} and its closing \c{</b>}, if the \c{<b>} tags
- are not nested, but if the \c{<b>} tags are nested, that same
- regexp will match an opening \c{<b>} tag with the wrong closing
- \c{</b>}. For the fragment \c{<b>bold <b>bolder</b></b>}, the
- first \c{<b>} would be matched with the first \c{</b>}, which is
- not correct. However, it is possible to write a regexp that will
- match nested brackets or tags correctly, but only if the number of
- nesting levels is fixed and known. If the number of nesting levels
- is not fixed and known, it is impossible to write a regexp that
- will not fail.
-
- Suppose we want a regexp to match integers in the range 0 to 99.
- At least one digit is required, so we start with the expression
- \b{[0-9]{1,1}}, which matches a single digit exactly once. This
- regexp matches integers in the range 0 to 9. To match integers up
- to 99, increase the maximum number of occurrences to 2, so the
- regexp becomes \b{[0-9]{1,2}}. This regexp satisfies the
- original requirement to match integers from 0 to 99, but it will
- also match integers that occur in the middle of strings. If we
- want the matched integer to be the whole string, we must use the
- anchor assertions, \b{^} (caret) and \b{$} (dollar). When
- \b{^} is the first character in a regexp, it means the regexp
- must match from the beginning of the string. When \b{$} is the
- last character of the regexp, it means the regexp must match to
- the end of the string. The regexp becomes \b{^[0-9]{1,2}$}.
- Note that assertions, e.g. \b{^} and \b{$}, do not match
- characters but locations in the string.
-
- If you have seen regexps described elsewhere, they may have looked
- different from the ones shown here. This is because some sets of
- characters and some quantifiers are so common that they have been
- given special symbols to represent them. \b{[0-9]} can be
- replaced with the symbol \b{\\d}. The quantifier to match
- exactly one occurrence, \b{{1,1}}, can be replaced with the
- expression itself, i.e. \b{x{1,1}} is the same as \b{x}. So
- our 0 to 99 matcher could be written as \b{^\\d{1,2}$}. It can
- also be written \b{^\\d\\d{0,1}$}, i.e. \e{From the start of
- the string, match a digit, followed immediately by 0 or 1 digits}.
- In practice, it would be written as \b{^\\d\\d?$}. The \b{?}
- is shorthand for the quantifier \b{{0,1}}, i.e. 0 or 1
- occurrences. \b{?} makes an expression optional. The regexp
- \b{^\\d\\d?$} means \e{From the beginning of the string, match
- one digit, followed immediately by 0 or 1 more digit, followed
- immediately by end of string}.
-
- To write a regexp that matches one of the words 'mail' \e or
- 'letter' \e or 'correspondence' but does not match words that
- contain these words, e.g., 'email', 'mailman', 'mailer', and
- 'letterbox', start with a regexp that matches 'mail'. Expressed
- fully, the regexp is \b{m{1,1}a{1,1}i{1,1}l{1,1}}, but because
- a character expression is automatically quantified by
- \b{{1,1}}, we can simplify the regexp to \b{mail}, i.e., an
- 'm' followed by an 'a' followed by an 'i' followed by an 'l'. Now
- we can use the vertical bar \b{|}, which means \b{or}, to
- include the other two words, so our regexp for matching any of the
- three words becomes \b{mail|letter|correspondence}. Match
- 'mail' \b{or} 'letter' \b{or} 'correspondence'. While this
- regexp will match one of the three words we want to match, it will
- also match words we don't want to match, e.g., 'email'. To
- prevent the regexp from matching unwanted words, we must tell it
- to begin and end the match at word boundaries. First we enclose
- our regexp in parentheses, \b{(mail|letter|correspondence)}.
- Parentheses group expressions together, and they identify a part
- of the regexp that we wish to \l{capturing text}{capture}.
- Enclosing the expression in parentheses allows us to use it as a
- component in more complex regexps. It also allows us to examine
- which of the three words was actually matched. To force the match
- to begin and end on word boundaries, we enclose the regexp in
- \b{\\b} \e{word boundary} assertions:
- \b{\\b(mail|letter|correspondence)\\b}. Now the regexp means:
- \e{Match a word boundary, followed by the regexp in parentheses,
- followed by a word boundary}. The \b{\\b} assertion matches a
- \e position in the regexp, not a \e character. A word boundary is
- any non-word character, e.g., a space, newline, or the beginning
- or ending of a string.
-
- If we want to replace ampersand characters with the HTML entity
- \b{\&amp;}, the regexp to match is simply \b{\&}. But this
- regexp will also match ampersands that have already been converted
- to HTML entities. We want to replace only ampersands that are not
- already followed by \b{amp;}. For this, we need the negative
- lookahead assertion, \b{(?!}__\b{)}. The regexp can then be
- written as \b{\&(?!amp;)}, i.e. \e{Match an ampersand that is}
- \b{not} \e{followed by} \b{amp;}.
-
- If we want to count all the occurrences of 'Eric' and 'Eirik' in a
- string, two valid solutions are \b{\\b(Eric|Eirik)\\b} and
- \b{\\bEi?ri[ck]\\b}. The word boundary assertion '\\b' is
- required to avoid matching words that contain either name,
- e.g. 'Ericsson'. Note that the second regexp matches more
- spellings than we want: 'Eric', 'Erik', 'Eiric' and 'Eirik'.
-
- Some of the examples discussed above are implemented in the
- \l{#code-examples}{code examples} section.
-
- \target characters-and-abbreviations-for-sets-of-characters
- \section1 Characters and Abbreviations for Sets of Characters
-
- \table
- \header \li Element \li Meaning
- \row \li \b{c}
- \li A character represents itself unless it has a special
- regexp meaning. e.g. \b{c} matches the character \e c.
- \row \li \b{\\c}
- \li A character that follows a backslash matches the character
- itself, except as specified below. e.g., To match a literal
- caret at the beginning of a string, write \b{\\^}.
- \row \li \b{\\a}
- \li Matches the ASCII bell (BEL, 0x07).
- \row \li \b{\\f}
- \li Matches the ASCII form feed (FF, 0x0C).
- \row \li \b{\\n}
- \li Matches the ASCII line feed (LF, 0x0A, Unix newline).
- \row \li \b{\\r}
- \li Matches the ASCII carriage return (CR, 0x0D).
- \row \li \b{\\t}
- \li Matches the ASCII horizontal tab (HT, 0x09).
- \row \li \b{\\v}
- \li Matches the ASCII vertical tab (VT, 0x0B).
- \row \li \b{\\x\e{hhhh}}
- \li Matches the Unicode character corresponding to the
- hexadecimal number \e{hhhh} (between 0x0000 and 0xFFFF).
- \row \li \b{\\0\e{ooo}} (i.e., \\zero \e{ooo})
- \li matches the ASCII/Latin1 character for the octal number
- \e{ooo} (between 0 and 0377).
- \row \li \b{. (dot)}
- \li Matches any character (including newline).
- \row \li \b{\\d}
- \li Matches a digit (QChar::isDigit()).
- \row \li \b{\\D}
- \li Matches a non-digit.
- \row \li \b{\\s}
- \li Matches a whitespace character (QChar::isSpace()).
- \row \li \b{\\S}
- \li Matches a non-whitespace character.
- \row \li \b{\\w}
- \li Matches a word character (QChar::isLetterOrNumber(), QChar::isMark(), or '_').
- \row \li \b{\\W}
- \li Matches a non-word character.
- \row \li \b{\\\e{n}}
- \li The \e{n}-th backreference, e.g. \\1, \\2, etc.
- \endtable
-
- \b{Note:} The C++ compiler transforms backslashes in strings.
- To include a \b{\\} in a regexp, enter it twice, i.e. \c{\\}.
- To match the backslash character itself, enter it four times, i.e.
- \c{\\\\}.
-
- \target sets-of-characters
- \section1 Sets of Characters
-
- Square brackets mean match any character contained in the square
- brackets. The character set abbreviations described above can
- appear in a character set in square brackets. Except for the
- character set abbreviations and the following two exceptions,
- characters do not have special meanings in square brackets.
-
- \table
- \row \li \b{^}
-
- \li The caret negates the character set if it occurs as the
- first character (i.e. immediately after the opening square
- bracket). \b{[abc]} matches 'a' or 'b' or 'c', but
- \b{[^abc]} matches anything \e but 'a' or 'b' or 'c'.
-
- \row \li \b{-}
-
- \li The dash indicates a range of characters. \b{[W-Z]}
- matches 'W' or 'X' or 'Y' or 'Z'.
-
- \endtable
-
- Using the predefined character set abbreviations is more portable
- than using character ranges across platforms and languages. For
- example, \b{[0-9]} matches a digit in Western alphabets but
- \b{\\d} matches a digit in \e any alphabet.
-
- Note: In other regexp documentation, sets of characters are often
- called "character classes".
-
- \target quantifiers
- \section1 Quantifiers
-
- By default, an expression is automatically quantified by
- \b{{1,1}}, i.e. it should occur exactly once. In the following
- list, \b{\e {E}} stands for expression. An expression is a
- character, or an abbreviation for a set of characters, or a set of
- characters in square brackets, or an expression in parentheses.
-
- \table
- \row \li \b{\e {E}?}
-
- \li Matches zero or one occurrences of \e E. This quantifier
- means \e{The previous expression is optional}, because it
- will match whether or not the expression is found. \b{\e
- {E}?} is the same as \b{\e {E}{0,1}}. e.g., \b{dents?}
- matches 'dent' or 'dents'.
-
- \row \li \b{\e {E}+}
-
- \li Matches one or more occurrences of \e E. \b{\e {E}+} is
- the same as \b{\e {E}{1,}}. e.g., \b{0+} matches '0',
- '00', '000', etc.
-
- \row \li \b{\e {E}*}
-
- \li Matches zero or more occurrences of \e E. It is the same
- as \b{\e {E}{0,}}. The \b{*} quantifier is often used
- in error where \b{+} should be used. For example, if
- \b{\\s*$} is used in an expression to match strings that
- end in whitespace, it will match every string because
- \b{\\s*$} means \e{Match zero or more whitespaces followed
- by end of string}. The correct regexp to match strings that
- have at least one trailing whitespace character is
- \b{\\s+$}.
-
- \row \li \b{\e {E}{n}}
-
- \li Matches exactly \e n occurrences of \e E. \b{\e {E}{n}}
- is the same as repeating \e E \e n times. For example,
- \b{x{5}} is the same as \b{xxxxx}. It is also the same
- as \b{\e {E}{n,n}}, e.g. \b{x{5,5}}.
-
- \row \li \b{\e {E}{n,}}
- \li Matches at least \e n occurrences of \e E.
-
- \row \li \b{\e {E}{,m}}
- \li Matches at most \e m occurrences of \e E. \b{\e {E}{,m}}
- is the same as \b{\e {E}{0,m}}.
-
- \row \li \b{\e {E}{n,m}}
- \li Matches at least \e n and at most \e m occurrences of \e E.
- \endtable
-
- To apply a quantifier to more than just the preceding character,
- use parentheses to group characters together in an expression. For
- example, \b{tag+} matches a 't' followed by an 'a' followed by
- at least one 'g', whereas \b{(tag)+} matches at least one
- occurrence of 'tag'.
-
- Note: Quantifiers are normally "greedy". They always match as much
- text as they can. For example, \b{0+} matches the first zero it
- finds and all the consecutive zeros after the first zero. Applied
- to '20005', it matches '2\underline{000}5'. Quantifiers can be made
- non-greedy, see setMinimal().
-
- \target capturing parentheses
- \target backreferences
- \section1 Capturing Text
-
- Parentheses allow us to group elements together so that we can
- quantify and capture them. For example if we have the expression
- \b{mail|letter|correspondence} that matches a string we know
- that \e one of the words matched but not which one. Using
- parentheses allows us to "capture" whatever is matched within
- their bounds, so if we used \b{(mail|letter|correspondence)}
- and matched this regexp against the string "I sent you some email"
- we can use the cap() or capturedTexts() functions to extract the
- matched characters, in this case 'mail'.
-
- We can use captured text within the regexp itself. To refer to the
- captured text we use \e backreferences which are indexed from 1,
- the same as for cap(). For example we could search for duplicate
- words in a string using \b{\\b(\\w+)\\W+\\1\\b} which means match a
- word boundary followed by one or more word characters followed by
- one or more non-word characters followed by the same text as the
- first parenthesized expression followed by a word boundary.
-
- If we want to use parentheses purely for grouping and not for
- capturing we can use the non-capturing syntax, e.g.
- \b{(?:green|blue)}. Non-capturing parentheses begin '(?:' and
- end ')'. In this example we match either 'green' or 'blue' but we
- do not capture the match so we only know whether or not we matched
- but not which color we actually found. Using non-capturing
- parentheses is more efficient than using capturing parentheses
- since the regexp engine has to do less book-keeping.
-
- Both capturing and non-capturing parentheses may be nested.
-
- \target greedy quantifiers
-
- For historical reasons, quantifiers (e.g. \b{*}) that apply to
- capturing parentheses are more "greedy" than other quantifiers.
- For example, \b{a*(a*)} will match "aaa" with cap(1) == "aaa".
- This behavior is different from what other regexp engines do
- (notably, Perl). To obtain a more intuitive capturing behavior,
- specify QRegExp::RegExp2 to the QRegExp constructor or call
- setPatternSyntax(QRegExp::RegExp2).
-
- \target cap_in_a_loop
-
- When the number of matches cannot be determined in advance, a
- common idiom is to use cap() in a loop. For example:
-
- \snippet code/src_corelib_tools_qregexp.cpp 0
-
- \target assertions
- \section1 Assertions
-
- Assertions make some statement about the text at the point where
- they occur in the regexp but they do not match any characters. In
- the following list \b{\e {E}} stands for any expression.
-
- \table
- \row \li \b{^}
- \li The caret signifies the beginning of the string. If you
- wish to match a literal \c{^} you must escape it by
- writing \c{\\^}. For example, \b{^#include} will only
- match strings which \e begin with the characters '#include'.
- (When the caret is the first character of a character set it
- has a special meaning, see \l{#sets-of-characters}{Sets of Characters}.)
-
- \row \li \b{$}
- \li The dollar signifies the end of the string. For example
- \b{\\d\\s*$} will match strings which end with a digit
- optionally followed by whitespace. If you wish to match a
- literal \c{$} you must escape it by writing
- \c{\\$}.
-
- \row \li \b{\\b}
- \li A word boundary. For example the regexp
- \b{\\bOK\\b} means match immediately after a word
- boundary (e.g. start of string or whitespace) the letter 'O'
- then the letter 'K' immediately before another word boundary
- (e.g. end of string or whitespace). But note that the
- assertion does not actually match any whitespace so if we
- write \b{(\\bOK\\b)} and we have a match it will only
- contain 'OK' even if the string is "It's \underline{OK} now".
-
- \row \li \b{\\B}
- \li A non-word boundary. This assertion is true wherever
- \b{\\b} is false. For example if we searched for
- \b{\\Bon\\B} in "Left on" the match would fail (space
- and end of string aren't non-word boundaries), but it would
- match in "t\underline{on}ne".
-
- \row \li \b{(?=\e E)}
- \li Positive lookahead. This assertion is true if the
- expression matches at this point in the regexp. For example,
- \b{const(?=\\s+char)} matches 'const' whenever it is
- followed by 'char', as in 'static \underline{const} char *'.
- (Compare with \b{const\\s+char}, which matches 'static
- \underline{const char} *'.)
-
- \row \li \b{(?!\e E)}
- \li Negative lookahead. This assertion is true if the
- expression does not match at this point in the regexp. For
- example, \b{const(?!\\s+char)} matches 'const' \e except
- when it is followed by 'char'.
- \endtable
-
- \target QRegExp wildcard matching
- \section1 Wildcard Matching
-
- Most command shells such as \e bash or \e cmd.exe support "file
- globbing", the ability to identify a group of files by using
- wildcards. The setPatternSyntax() function is used to switch
- between regexp and wildcard mode. Wildcard matching is much
- simpler than full regexps and has only four features:
-
- \table
- \row \li \b{c}
- \li Any character represents itself apart from those mentioned
- below. Thus \b{c} matches the character \e c.
- \row \li \b{?}
- \li Matches any single character. It is the same as
- \b{.} in full regexps.
- \row \li \b{*}
- \li Matches zero or more of any characters. It is the
- same as \b{.*} in full regexps.
- \row \li \b{[...]}
- \li Sets of characters can be represented in square brackets,
- similar to full regexps. Within the character class, like
- outside, backslash has no special meaning.
- \endtable
-
- In the mode Wildcard, the wildcard characters cannot be
- escaped. In the mode WildcardUnix, the character '\\' escapes the
- wildcard.
-
- For example if we are in wildcard mode and have strings which
- contain filenames we could identify HTML files with \b{*.html}.
- This will match zero or more characters followed by a dot followed
- by 'h', 't', 'm' and 'l'.
-
- To test a string against a wildcard expression, use exactMatch().
- For example:
-
- \snippet code/src_corelib_tools_qregexp.cpp 1
-
- \target perl-users
- \section1 Notes for Perl Users
-
- Most of the character class abbreviations supported by Perl are
- supported by QRegExp, see \l{#characters-and-abbreviations-for-sets-of-characters}
- {characters and abbreviations for sets of characters}.
-
- In QRegExp, apart from within character classes, \c{^} always
- signifies the start of the string, so carets must always be
- escaped unless used for that purpose. In Perl the meaning of caret
- varies automagically depending on where it occurs so escaping it
- is rarely necessary. The same applies to \c{$} which in
- QRegExp always signifies the end of the string.
-
- QRegExp's quantifiers are the same as Perl's greedy quantifiers
- (but see the \l{greedy quantifiers}{note above}). Non-greedy
- matching cannot be applied to individual quantifiers, but can be
- applied to all the quantifiers in the pattern. For example, to
- match the Perl regexp \b{ro+?m} requires:
-
- \snippet code/src_corelib_tools_qregexp.cpp 2
-
- The equivalent of Perl's \c{/i} option is
- setCaseSensitivity(Qt::CaseInsensitive).
-
- Perl's \c{/g} option can be emulated using a \l{#cap_in_a_loop}{loop}.
-
- In QRegExp \b{.} matches any character, therefore all QRegExp
- regexps have the equivalent of Perl's \c{/s} option. QRegExp
- does not have an equivalent to Perl's \c{/m} option, but this
- can be emulated in various ways for example by splitting the input
- into lines or by looping with a regexp that searches for newlines.
-
- Because QRegExp is string oriented, there are no \\A, \\Z, or \\z
- assertions. The \\G assertion is not supported but can be emulated
- in a loop.
-
- Perl's $& is cap(0) or capturedTexts()[0]. There are no QRegExp
- equivalents for $`, $' or $+. Perl's capturing variables, $1, $2,
- ... correspond to cap(1) or capturedTexts()[1], cap(2) or
- capturedTexts()[2], etc.
-
- To substitute a pattern use QString::replace().
-
- Perl's extended \c{/x} syntax is not supported, nor are
- directives, e.g. (?i), or regexp comments, e.g. (?#comment). On
- the other hand, C++'s rules for literal strings can be used to
- achieve the same:
-
- \snippet code/src_corelib_tools_qregexp.cpp 3
-
- Both zero-width positive and zero-width negative lookahead
- assertions (?=pattern) and (?!pattern) are supported with the same
- syntax as Perl. Perl's lookbehind assertions, "independent"
- subexpressions and conditional expressions are not supported.
-
- Non-capturing parentheses are also supported, with the same
- (?:pattern) syntax.
-
- See QString::split() and QStringList::join() for equivalents
- to Perl's split and join functions.
-
- Note: because C++ transforms \\'s they must be written \e twice in
- code, e.g. \b{\\b} must be written \b{\\\\b}.
-
- \target code-examples
- \section1 Code Examples
-
- \snippet code/src_corelib_tools_qregexp.cpp 4
-
- The third string matches '\underline{6}'. This is a simple validation
- regexp for integers in the range 0 to 99.
-
- \snippet code/src_corelib_tools_qregexp.cpp 5
-
- The second string matches '\underline{This_is-OK}'. We've used the
- character set abbreviation '\\S' (non-whitespace) and the anchors
- to match strings which contain no whitespace.
-
- In the following example we match strings containing 'mail' or
- 'letter' or 'correspondence' but only match whole words i.e. not
- 'email'
-
- \snippet code/src_corelib_tools_qregexp.cpp 6
-
- The second string matches "Please write the \underline{letter}". The
- word 'letter' is also captured (because of the parentheses). We
- can see what text we've captured like this:
-
- \snippet code/src_corelib_tools_qregexp.cpp 7
-
- This will capture the text from the first set of capturing
- parentheses (counting capturing left parentheses from left to
- right). The parentheses are counted from 1 since cap(0) is the
- whole matched regexp (equivalent to '&' in most regexp engines).
-
- \snippet code/src_corelib_tools_qregexp.cpp 8
-
- Here we've passed the QRegExp to QString's replace() function to
- replace the matched text with new text.
-
- \snippet code/src_corelib_tools_qregexp.cpp 9
-
- We've used the indexIn() function to repeatedly match the regexp in
- the string. Note that instead of moving forward by one character
- at a time \c pos++ we could have written \c {pos +=
- rx.matchedLength()} to skip over the already matched string. The
- count will equal 3, matching 'One \underline{Eric} another
- \underline{Eirik}, and an Ericsson. How many Eiriks, \underline{Eric}?'; it
- doesn't match 'Ericsson' or 'Eiriks' because they are not bounded
- by non-word boundaries.
-
- One common use of regexps is to split lines of delimited data into
- their component fields.
-
- \snippet code/src_corelib_tools_qregexp.cpp 10
-
- In this example our input lines have the format company name, web
- address and country. Unfortunately the regexp is rather long and
- not very versatile -- the code will break if we add any more
- fields. A simpler and better solution is to look for the
- separator, '\\t' in this case, and take the surrounding text. The
- QString::split() function can take a separator string or regexp
- as an argument and split a string accordingly.
-
- \snippet code/src_corelib_tools_qregexp.cpp 11
-
- Here field[0] is the company, field[1] the web address and so on.
-
- To imitate the matching of a shell we can use wildcard mode.
-
- \snippet code/src_corelib_tools_qregexp.cpp 12
-
- Wildcard matching can be convenient because of its simplicity, but
- any wildcard regexp can be defined using full regexps, e.g.
- \b{.*\\.html$}. Notice that we can't match both \c .html and \c
- .htm files with a wildcard unless we use \b{*.htm*} which will
- also match 'test.html.bak'. A full regexp gives us the precision
- we need, \b{.*\\.html?$}.
-
- QRegExp can match case insensitively using setCaseSensitivity(),
- and can use non-greedy matching, see setMinimal(). By
- default QRegExp uses full regexps but this can be changed with
- setPatternSyntax(). Searching can be done forward with indexIn() or backward
- with lastIndexIn(). Captured text can be accessed using
- capturedTexts() which returns a string list of all captured
- strings, or using cap() which returns the captured string for the
- given index. The pos() function takes a match index and returns
- the position in the string where the match was made (or -1 if
- there was no match).
-
- \sa QString, QStringList, QRegExpValidator, QSortFilterProxyModel,
- {tools/regexp}{Regular Expression Example}
-*/
-
-#if defined(Q_OS_VXWORKS) && defined(EOS)
-# undef EOS
-#endif
-
-const int NumBadChars = 64;
-#define BadChar(ch) ((ch).unicode() % NumBadChars)
-
-const int NoOccurrence = INT_MAX;
-const int EmptyCapture = INT_MAX;
-const int InftyLen = INT_MAX;
-const int InftyRep = 1025;
-const int EOS = -1;
-
-static bool isWord(QChar ch)
-{
- return ch.isLetterOrNumber() || ch.isMark() || ch == QLatin1Char('_');
-}
-
-/*
- Merges two vectors of ints and puts the result into the first
- one.
-*/
-static void mergeInto(QVector<int> *a, const QVector<int> &b)
-{
- int asize = a->size();
- int bsize = b.size();
- if (asize == 0) {
- *a = b;
-#ifndef QT_NO_REGEXP_OPTIM
- } else if (bsize == 1 && a->at(asize - 1) < b.at(0)) {
- a->resize(asize + 1);
- (*a)[asize] = b.at(0);
-#endif
- } else if (bsize >= 1) {
- int csize = asize + bsize;
- QVector<int> c(csize);
- int i = 0, j = 0, k = 0;
- while (i < asize) {
- if (j < bsize) {
- if (a->at(i) == b.at(j)) {
- ++i;
- --csize;
- } else if (a->at(i) < b.at(j)) {
- c[k++] = a->at(i++);
- } else {
- c[k++] = b.at(j++);
- }
- } else {
- memcpy(c.data() + k, a->constData() + i, (asize - i) * sizeof(int));
- break;
- }
- }
- c.resize(csize);
- if (j < bsize)
- memcpy(c.data() + k, b.constData() + j, (bsize - j) * sizeof(int));
- *a = c;
- }
-}
-
-#ifndef QT_NO_REGEXP_WILDCARD
-/*
- Translates a wildcard pattern to an equivalent regular expression
- pattern (e.g., *.cpp to .*\.cpp).
-
- If enableEscaping is true, it is possible to escape the wildcard
- characters with \
-*/
-static QString wc2rx(const QString &wc_str, const bool enableEscaping)
-{
- const int wclen = wc_str.length();
- QString rx;
- int i = 0;
- bool isEscaping = false; // the previous character is '\'
- const QChar *wc = wc_str.unicode();
-
- while (i < wclen) {
- const QChar c = wc[i++];
- switch (c.unicode()) {
- case '\\':
- if (enableEscaping) {
- if (isEscaping) {
- rx += QLatin1String("\\\\");
- } // we insert the \\ later if necessary
- if (i == wclen) { // the end
- rx += QLatin1String("\\\\");
- }
- } else {
- rx += QLatin1String("\\\\");
- }
- isEscaping = true;
- break;
- case '*':
- if (isEscaping) {
- rx += QLatin1String("\\*");
- isEscaping = false;
- } else {
- rx += QLatin1String(".*");
- }
- break;
- case '?':
- if (isEscaping) {
- rx += QLatin1String("\\?");
- isEscaping = false;
- } else {
- rx += QLatin1Char('.');
- }
-
- break;
- case '$':
- case '(':
- case ')':
- case '+':
- case '.':
- case '^':
- case '{':
- case '|':
- case '}':
- if (isEscaping) {
- isEscaping = false;
- rx += QLatin1String("\\\\");
- }
- rx += QLatin1Char('\\');
- rx += c;
- break;
- case '[':
- if (isEscaping) {
- isEscaping = false;
- rx += QLatin1String("\\[");
- } else {
- rx += c;
- if (wc[i] == QLatin1Char('^'))
- rx += wc[i++];
- if (i < wclen) {
- if (wc[i] == QLatin1Char(']'))
- rx += wc[i++];
- while (i < wclen && wc[i] != QLatin1Char(']')) {
- if (wc[i] == QLatin1Char('\\'))
- rx += QLatin1Char('\\');
- rx += wc[i++];
- }
- }
- }
- break;
-
- case ']':
- if(isEscaping){
- isEscaping = false;
- rx += QLatin1String("\\");
- }
- rx += c;
- break;
-
- default:
- if(isEscaping){
- isEscaping = false;
- rx += QLatin1String("\\\\");
- }
- rx += c;
- }
- }
- return rx;
-}
-#endif
-
-static int caretIndex(int offset, QRegExp::CaretMode caretMode)
-{
- if (caretMode == QRegExp::CaretAtZero) {
- return 0;
- } else if (caretMode == QRegExp::CaretAtOffset) {
- return offset;
- } else { // QRegExp::CaretWontMatch
- return -1;
- }
-}
-
-/*
- The QRegExpEngineKey struct uniquely identifies an engine.
-*/
-struct QRegExpEngineKey
-{
- QString pattern;
- QRegExp::PatternSyntax patternSyntax;
- Qt::CaseSensitivity cs;
-
- inline QRegExpEngineKey(const QString &pattern, QRegExp::PatternSyntax patternSyntax,
- Qt::CaseSensitivity cs)
- : pattern(pattern), patternSyntax(patternSyntax), cs(cs) {}
-
- inline void clear() {
- pattern.clear();
- patternSyntax = QRegExp::RegExp;
- cs = Qt::CaseSensitive;
- }
-};
-
-static bool operator==(const QRegExpEngineKey &key1, const QRegExpEngineKey &key2)
-{
- return key1.pattern == key2.pattern && key1.patternSyntax == key2.patternSyntax
- && key1.cs == key2.cs;
-}
-
-static uint qHash(const QRegExpEngineKey &key, uint seed = 0) Q_DECL_NOTHROW
-{
- QtPrivate::QHashCombine hash;
- seed = hash(seed, key.pattern);
- seed = hash(seed, key.patternSyntax);
- seed = hash(seed, key.cs);
- return seed;
-}
-
-class QRegExpEngine;
-
-//Q_DECLARE_TYPEINFO(QVector<int>, Q_MOVABLE_TYPE);
-
-/*
- This is the engine state during matching.
-*/
-struct QRegExpMatchState
-{
- const QChar *in; // a pointer to the input string data
- int pos; // the current position in the string
- int caretPos;
- int len; // the length of the input string
- bool minimal; // minimal matching?
- int *bigArray; // big array holding the data for the next pointers
- int *inNextStack; // is state is nextStack?
- int *curStack; // stack of current states
- int *nextStack; // stack of next states
- int *curCapBegin; // start of current states' captures
- int *nextCapBegin; // start of next states' captures
- int *curCapEnd; // end of current states' captures
- int *nextCapEnd; // end of next states' captures
- int *tempCapBegin; // start of temporary captures
- int *tempCapEnd; // end of temporary captures
- int *capBegin; // start of captures for a next state
- int *capEnd; // end of captures for a next state
- int *slideTab; // bump-along slide table for bad-character heuristic
- int *captured; // what match() returned last
- int slideTabSize; // size of slide table
- int capturedSize;
-#ifndef QT_NO_REGEXP_BACKREF
- QList<QVector<int> > sleeping; // list of back-reference sleepers
-#endif
- int matchLen; // length of match
- int oneTestMatchedLen; // length of partial match
-
- const QRegExpEngine *eng;
-
- inline QRegExpMatchState() : bigArray(0), captured(0) {}
- inline ~QRegExpMatchState() { free(bigArray); }
-
- void drain() { free(bigArray); bigArray = 0; captured = 0; } // to save memory
- void prepareForMatch(QRegExpEngine *eng);
- void match(const QChar *str, int len, int pos, bool minimal,
- bool oneTest, int caretIndex);
- bool matchHere();
- bool testAnchor(int i, int a, const int *capBegin);
-};
-
-/*
- The struct QRegExpAutomatonState represents one state in a modified NFA. The
- input characters matched are stored in the state instead of on
- the transitions, something possible for an automaton
- constructed from a regular expression.
-*/
-struct QRegExpAutomatonState
-{
-#ifndef QT_NO_REGEXP_CAPTURE
- int atom; // which atom does this state belong to?
-#endif
- int match; // what does it match? (see CharClassBit and BackRefBit)
- QVector<int> outs; // out-transitions
- QMap<int, int> reenter; // atoms reentered when transiting out
- QMap<int, int> anchors; // anchors met when transiting out
-
- inline QRegExpAutomatonState() { }
-#ifndef QT_NO_REGEXP_CAPTURE
- inline QRegExpAutomatonState(int a, int m)
- : atom(a), match(m) { }
-#else
- inline QRegExpAutomatonState(int m)
- : match(m) { }
-#endif
-};
-
-Q_DECLARE_TYPEINFO(QRegExpAutomatonState, Q_MOVABLE_TYPE);
-
-/*
- The struct QRegExpCharClassRange represents a range of characters (e.g.,
- [0-9] denotes range 48 to 57).
-*/
-struct QRegExpCharClassRange
-{
- ushort from; // 48
- ushort len; // 10
-};
-
-Q_DECLARE_TYPEINFO(QRegExpCharClassRange, Q_PRIMITIVE_TYPE);
-
-#ifndef QT_NO_REGEXP_CAPTURE
-/*
- The struct QRegExpAtom represents one node in the hierarchy of regular
- expression atoms.
-*/
-struct QRegExpAtom
-{
- enum { NoCapture = -1, OfficialCapture = -2, UnofficialCapture = -3 };
-
- int parent; // index of parent in array of atoms
- int capture; // index of capture, from 1 to ncap - 1
-};
-
-Q_DECLARE_TYPEINFO(QRegExpAtom, Q_PRIMITIVE_TYPE);
-#endif
-
-struct QRegExpLookahead;
-
-#ifndef QT_NO_REGEXP_ANCHOR_ALT
-/*
- The struct QRegExpAnchorAlternation represents a pair of anchors with
- OR semantics.
-*/
-struct QRegExpAnchorAlternation
-{
- int a; // this anchor...
- int b; // ...or this one
-};
-
-Q_DECLARE_TYPEINFO(QRegExpAnchorAlternation, Q_PRIMITIVE_TYPE);
-#endif
-
-#ifndef QT_NO_REGEXP_CCLASS
-
-#define FLAG(x) (1 << (x))
-/*
- The class QRegExpCharClass represents a set of characters, such as can
- be found in regular expressions (e.g., [a-z] denotes the set
- {a, b, ..., z}).
-*/
-class QRegExpCharClass
-{
-public:
- QRegExpCharClass();
-
- void clear();
- bool negative() const { return n; }
- void setNegative(bool negative);
- void addCategories(uint cats);
- void addRange(ushort from, ushort to);
- void addSingleton(ushort ch) { addRange(ch, ch); }
-
- bool in(QChar ch) const;
-#ifndef QT_NO_REGEXP_OPTIM
- const QVector<int> &firstOccurrence() const { return occ1; }
-#endif
-
-#if defined(QT_DEBUG)
- void dump() const;
-#endif
-
-private:
- QVector<QRegExpCharClassRange> r; // character ranges
-#ifndef QT_NO_REGEXP_OPTIM
- QVector<int> occ1; // first-occurrence array
-#endif
- uint c; // character classes
- bool n; // negative?
-};
-#else
-struct QRegExpCharClass
-{
- int dummy;
-
-#ifndef QT_NO_REGEXP_OPTIM
- QRegExpCharClass() { occ1.fill(0, NumBadChars); }
-
- const QVector<int> &firstOccurrence() const { return occ1; }
- QVector<int> occ1;
-#endif
-};
-#endif
-
-Q_DECLARE_TYPEINFO(QRegExpCharClass, Q_MOVABLE_TYPE);
-
-/*
- The QRegExpEngine class encapsulates a modified nondeterministic
- finite automaton (NFA).
-*/
-class QRegExpEngine
-{
-public:
- QRegExpEngine(Qt::CaseSensitivity cs, bool greedyQuantifiers)
- : cs(cs), greedyQuantifiers(greedyQuantifiers) { setup(); }
-
- QRegExpEngine(const QRegExpEngineKey &key);
- ~QRegExpEngine();
-
- bool isValid() const { return valid; }
- const QString &errorString() const { return yyError; }
- int captureCount() const { return officialncap; }
-
- int createState(QChar ch);
- int createState(const QRegExpCharClass &cc);
-#ifndef QT_NO_REGEXP_BACKREF
- int createState(int bref);
-#endif
-
- void addCatTransitions(const QVector<int> &from, const QVector<int> &to);
-#ifndef QT_NO_REGEXP_CAPTURE
- void addPlusTransitions(const QVector<int> &from, const QVector<int> &to, int atom);
-#endif
-
-#ifndef QT_NO_REGEXP_ANCHOR_ALT
- int anchorAlternation(int a, int b);
- int anchorConcatenation(int a, int b);
-#else
- int anchorAlternation(int a, int b) { return a & b; }
- int anchorConcatenation(int a, int b) { return a | b; }
-#endif
- void addAnchors(int from, int to, int a);
-
-#ifndef QT_NO_REGEXP_OPTIM
- void heuristicallyChooseHeuristic();
-#endif
-
-#if defined(QT_DEBUG)
- void dump() const;
-#endif
-
- QAtomicInt ref;
-
-private:
- enum { CharClassBit = 0x10000, BackRefBit = 0x20000 };
- enum { InitialState = 0, FinalState = 1 };
-
- void setup();
- int setupState(int match);
-
- /*
- Let's hope that 13 lookaheads and 14 back-references are
- enough.
- */
- enum { MaxLookaheads = 13, MaxBackRefs = 14 };
- enum { Anchor_Dollar = 0x00000001, Anchor_Caret = 0x00000002, Anchor_Word = 0x00000004,
- Anchor_NonWord = 0x00000008, Anchor_FirstLookahead = 0x00000010,
- Anchor_BackRef1Empty = Anchor_FirstLookahead << MaxLookaheads,
- Anchor_BackRef0Empty = Anchor_BackRef1Empty >> 1,
- Anchor_Alternation = unsigned(Anchor_BackRef1Empty) << MaxBackRefs,
-
- Anchor_LookaheadMask = (Anchor_FirstLookahead - 1) ^
- ((Anchor_FirstLookahead << MaxLookaheads) - 1) };
-#ifndef QT_NO_REGEXP_CAPTURE
- int startAtom(bool officialCapture);
- void finishAtom(int atom, bool needCapture);
-#endif
-
-#ifndef QT_NO_REGEXP_LOOKAHEAD
- int addLookahead(QRegExpEngine *eng, bool negative);
-#endif
-
-#ifndef QT_NO_REGEXP_OPTIM
- bool goodStringMatch(QRegExpMatchState &matchState) const;
- bool badCharMatch(QRegExpMatchState &matchState) const;
-#else
- bool bruteMatch(QRegExpMatchState &matchState) const;
-#endif
-
- QVector<QRegExpAutomatonState> s; // array of states
-#ifndef QT_NO_REGEXP_CAPTURE
- QVector<QRegExpAtom> f; // atom hierarchy
- int nf; // number of atoms
- int cf; // current atom
- QVector<int> captureForOfficialCapture;
-#endif
- int officialncap; // number of captures, seen from the outside
- int ncap; // number of captures, seen from the inside
-#ifndef QT_NO_REGEXP_CCLASS
- QVector<QRegExpCharClass> cl; // array of character classes
-#endif
-#ifndef QT_NO_REGEXP_LOOKAHEAD
- QVector<QRegExpLookahead *> ahead; // array of lookaheads
-#endif
-#ifndef QT_NO_REGEXP_ANCHOR_ALT
- QVector<QRegExpAnchorAlternation> aa; // array of (a, b) pairs of anchors
-#endif
-#ifndef QT_NO_REGEXP_OPTIM
- bool caretAnchored; // does the regexp start with ^?
- bool trivial; // is the good-string all that needs to match?
-#endif
- bool valid; // is the regular expression valid?
- Qt::CaseSensitivity cs; // case sensitive?
- bool greedyQuantifiers; // RegExp2?
- bool xmlSchemaExtensions;
-#ifndef QT_NO_REGEXP_BACKREF
- int nbrefs; // number of back-references
-#endif
-
-#ifndef QT_NO_REGEXP_OPTIM
- bool useGoodStringHeuristic; // use goodStringMatch? otherwise badCharMatch
-
- int goodEarlyStart; // the index where goodStr can first occur in a match
- int goodLateStart; // the index where goodStr can last occur in a match
- QString goodStr; // the string that any match has to contain
-
- int minl; // the minimum length of a match
- QVector<int> occ1; // first-occurrence array
-#endif
-
- /*
- The class Box is an abstraction for a regular expression
- fragment. It can also be seen as one node in the syntax tree of
- a regular expression with synthetized attributes.
-
- Its interface is ugly for performance reasons.
- */
- class Box
- {
- public:
- Box(QRegExpEngine *engine);
- Box(const Box &b) { operator=(b); }
-
- Box &operator=(const Box &b);
-
- void clear() { operator=(Box(eng)); }
- void set(QChar ch);
- void set(const QRegExpCharClass &cc);
-#ifndef QT_NO_REGEXP_BACKREF
- void set(int bref);
-#endif
-
- void cat(const Box &b);
- void orx(const Box &b);
- void plus(int atom);
- void opt();
- void catAnchor(int a);
-#ifndef QT_NO_REGEXP_OPTIM
- void setupHeuristics();
-#endif
-
-#if defined(QT_DEBUG)
- void dump() const;
-#endif
-
- private:
- void addAnchorsToEngine(const Box &to) const;
-
- QRegExpEngine *eng; // the automaton under construction
- QVector<int> ls; // the left states (firstpos)
- QVector<int> rs; // the right states (lastpos)
- QMap<int, int> lanchors; // the left anchors
- QMap<int, int> ranchors; // the right anchors
- int skipanchors; // the anchors to match if the box is skipped
-
-#ifndef QT_NO_REGEXP_OPTIM
- int earlyStart; // the index where str can first occur
- int lateStart; // the index where str can last occur
- QString str; // a string that has to occur in any match
- QString leftStr; // a string occurring at the left of this box
- QString rightStr; // a string occurring at the right of this box
- int maxl; // the maximum length of this box (possibly InftyLen)
-#endif
-
- int minl; // the minimum length of this box
-#ifndef QT_NO_REGEXP_OPTIM
- QVector<int> occ1; // first-occurrence array
-#endif
- };
-
- friend class Box;
-
- /*
- This is the lexical analyzer for regular expressions.
- */
- enum { Tok_Eos, Tok_Dollar, Tok_LeftParen, Tok_MagicLeftParen, Tok_PosLookahead,
- Tok_NegLookahead, Tok_RightParen, Tok_CharClass, Tok_Caret, Tok_Quantifier, Tok_Bar,
- Tok_Word, Tok_NonWord, Tok_Char = 0x10000, Tok_BackRef = 0x20000 };
- int getChar();
- int getEscape();
-#ifndef QT_NO_REGEXP_INTERVAL
- int getRep(int def);
-#endif
-#ifndef QT_NO_REGEXP_LOOKAHEAD
- void skipChars(int n);
-#endif
- void error(const char *msg);
- void startTokenizer(const QChar *rx, int len);
- int getToken();
-
- const QChar *yyIn; // a pointer to the input regular expression pattern
- int yyPos0; // the position of yyTok in the input pattern
- int yyPos; // the position of the next character to read
- int yyLen; // the length of yyIn
- int yyCh; // the last character read
- QScopedPointer<QRegExpCharClass> yyCharClass; // attribute for Tok_CharClass tokens
- int yyMinRep; // attribute for Tok_Quantifier
- int yyMaxRep; // ditto
- QString yyError; // syntax error or overflow during parsing?
-
- /*
- This is the syntactic analyzer for regular expressions.
- */
- int parse(const QChar *rx, int len);
- void parseAtom(Box *box);
- void parseFactor(Box *box);
- void parseTerm(Box *box);
- void parseExpression(Box *box);
-
- int yyTok; // the last token read
- bool yyMayCapture; // set this to false to disable capturing
-
- friend struct QRegExpMatchState;
-};
-
-#ifndef QT_NO_REGEXP_LOOKAHEAD
-/*
- The struct QRegExpLookahead represents a lookahead a la Perl (e.g.,
- (?=foo) and (?!bar)).
-*/
-struct QRegExpLookahead
-{
- QRegExpEngine *eng; // NFA representing the embedded regular expression
- bool neg; // negative lookahead?
-
- inline QRegExpLookahead(QRegExpEngine *eng0, bool neg0)
- : eng(eng0), neg(neg0) { }
- inline ~QRegExpLookahead() { delete eng; }
-};
-#endif
-
-/*!
- \internal
- convert the pattern string to the RegExp syntax.
-
- This is also used by QScriptEngine::newRegExp to convert to a pattern that JavaScriptCore can understan
- */
-Q_CORE_EXPORT QString qt_regexp_toCanonical(const QString &pattern, QRegExp::PatternSyntax patternSyntax)
-{
- switch (patternSyntax) {
-#ifndef QT_NO_REGEXP_WILDCARD
- case QRegExp::Wildcard:
- return wc2rx(pattern, false);
- case QRegExp::WildcardUnix:
- return wc2rx(pattern, true);
-#endif
- case QRegExp::FixedString:
- return QRegExp::escape(pattern);
- case QRegExp::W3CXmlSchema11:
- default:
- return pattern;
- }
-}
-
-QRegExpEngine::QRegExpEngine(const QRegExpEngineKey &key)
- : cs(key.cs), greedyQuantifiers(key.patternSyntax == QRegExp::RegExp2),
- xmlSchemaExtensions(key.patternSyntax == QRegExp::W3CXmlSchema11)
-{
- setup();
-
- QString rx = qt_regexp_toCanonical(key.pattern, key.patternSyntax);
-
- valid = (parse(rx.unicode(), rx.length()) == rx.length());
- if (!valid) {
-#ifndef QT_NO_REGEXP_OPTIM
- trivial = false;
-#endif
- error(RXERR_LEFTDELIM);
- }
-}
-
-QRegExpEngine::~QRegExpEngine()
-{
-#ifndef QT_NO_REGEXP_LOOKAHEAD
- qDeleteAll(ahead);
-#endif
-}
-
-void QRegExpMatchState::prepareForMatch(QRegExpEngine *eng)
-{
- /*
- We use one QVector<int> for all the big data used a lot in
- matchHere() and friends.
- */
- int ns = eng->s.size(); // number of states
- int ncap = eng->ncap;
-#ifndef QT_NO_REGEXP_OPTIM
- int newSlideTabSize = qMax(eng->minl + 1, 16);
-#else
- int newSlideTabSize = 0;
-#endif
- int numCaptures = eng->captureCount();
- int newCapturedSize = 2 + 2 * numCaptures;
- bigArray = q_check_ptr((int *)realloc(bigArray, ((3 + 4 * ncap) * ns + 4 * ncap + newSlideTabSize + newCapturedSize)*sizeof(int)));
-
- // set all internal variables only _after_ bigArray is realloc'ed
- // to prevent a broken regexp in oom case
-
- slideTabSize = newSlideTabSize;
- capturedSize = newCapturedSize;
- inNextStack = bigArray;
- memset(inNextStack, -1, ns * sizeof(int));
- curStack = inNextStack + ns;
- nextStack = inNextStack + 2 * ns;
-
- curCapBegin = inNextStack + 3 * ns;
- nextCapBegin = curCapBegin + ncap * ns;
- curCapEnd = curCapBegin + 2 * ncap * ns;
- nextCapEnd = curCapBegin + 3 * ncap * ns;
-
- tempCapBegin = curCapBegin + 4 * ncap * ns;
- tempCapEnd = tempCapBegin + ncap;
- capBegin = tempCapBegin + 2 * ncap;
- capEnd = tempCapBegin + 3 * ncap;
-
- slideTab = tempCapBegin + 4 * ncap;
- captured = slideTab + slideTabSize;
- memset(captured, -1, capturedSize*sizeof(int));
- this->eng = eng;
-}
-
-/*
- Tries to match in str and returns an array of (begin, length) pairs
- for captured text. If there is no match, all pairs are (-1, -1).
-*/
-void QRegExpMatchState::match(const QChar *str0, int len0, int pos0,
- bool minimal0, bool oneTest, int caretIndex)
-{
- bool matched = false;
- QChar char_null;
-
-#ifndef QT_NO_REGEXP_OPTIM
- if (eng->trivial && !oneTest) {
- pos = qFindString(str0, len0, pos0, eng->goodStr.unicode(), eng->goodStr.length(), eng->cs);
- matchLen = eng->goodStr.length();
- matched = (pos != -1);
- } else
-#endif
- {
- in = str0;
- if (in == 0)
- in = &char_null;
- pos = pos0;
- caretPos = caretIndex;
- len = len0;
- minimal = minimal0;
- matchLen = 0;
- oneTestMatchedLen = 0;
-
- if (eng->valid && pos >= 0 && pos <= len) {
-#ifndef QT_NO_REGEXP_OPTIM
- if (oneTest) {
- matched = matchHere();
- } else {
- if (pos <= len - eng->minl) {
- if (eng->caretAnchored) {
- matched = matchHere();
- } else if (eng->useGoodStringHeuristic) {
- matched = eng->goodStringMatch(*this);
- } else {
- matched = eng->badCharMatch(*this);
- }
- }
- }
-#else
- matched = oneTest ? matchHere() : eng->bruteMatch(*this);
-#endif
- }
- }
-
- if (matched) {
- int *c = captured;
- *c++ = pos;
- *c++ = matchLen;
-
- int numCaptures = (capturedSize - 2) >> 1;
-#ifndef QT_NO_REGEXP_CAPTURE
- for (int i = 0; i < numCaptures; ++i) {
- int j = eng->captureForOfficialCapture.at(i);
- if (capBegin[j] != EmptyCapture) {
- int len = capEnd[j] - capBegin[j];
- *c++ = (len > 0) ? pos + capBegin[j] : 0;
- *c++ = len;
- } else {
- *c++ = -1;
- *c++ = -1;
- }
- }
-#endif
- } else {
- // we rely on 2's complement here
- memset(captured, -1, capturedSize * sizeof(int));
- }
-}
-
-/*
- The three following functions add one state to the automaton and
- return the number of the state.
-*/
-
-int QRegExpEngine::createState(QChar ch)
-{
- return setupState(ch.unicode());
-}
-
-int QRegExpEngine::createState(const QRegExpCharClass &cc)
-{
-#ifndef QT_NO_REGEXP_CCLASS
- int n = cl.size();
- cl += QRegExpCharClass(cc);
- return setupState(CharClassBit | n);
-#else
- Q_UNUSED(cc);
- return setupState(CharClassBit);
-#endif
-}
-
-#ifndef QT_NO_REGEXP_BACKREF
-int QRegExpEngine::createState(int bref)
-{
- if (bref > nbrefs) {
- nbrefs = bref;
- if (nbrefs > MaxBackRefs) {
- error(RXERR_LIMIT);
- return 0;
- }
- }
- return setupState(BackRefBit | bref);
-}
-#endif
-
-/*
- The two following functions add a transition between all pairs of
- states (i, j) where i is found in from, and j is found in to.
-
- Cat-transitions are distinguished from plus-transitions for
- capturing.
-*/
-
-void QRegExpEngine::addCatTransitions(const QVector<int> &from, const QVector<int> &to)
-{
- for (int i = 0; i < from.size(); i++)
- mergeInto(&s[from.at(i)].outs, to);
-}
-
-#ifndef QT_NO_REGEXP_CAPTURE
-void QRegExpEngine::addPlusTransitions(const QVector<int> &from, const QVector<int> &to, int atom)
-{
- for (int i = 0; i < from.size(); i++) {
- QRegExpAutomatonState &st = s[from.at(i)];
- const QVector<int> oldOuts = st.outs;
- mergeInto(&st.outs, to);
- if (f.at(atom).capture != QRegExpAtom::NoCapture) {
- for (int j = 0; j < to.size(); j++) {
- // ### st.reenter.contains(to.at(j)) check looks suspicious
- if (!st.reenter.contains(to.at(j)) &&
- !std::binary_search(oldOuts.constBegin(), oldOuts.constEnd(), to.at(j)))
- st.reenter.insert(to.at(j), atom);
- }
- }
- }
-}
-#endif
-
-#ifndef QT_NO_REGEXP_ANCHOR_ALT
-/*
- Returns an anchor that means a OR b.
-*/
-int QRegExpEngine::anchorAlternation(int a, int b)
-{
- if (((a & b) == a || (a & b) == b) && ((a | b) & Anchor_Alternation) == 0)
- return a & b;
-
- int n = aa.size();
-#ifndef QT_NO_REGEXP_OPTIM
- if (n > 0 && aa.at(n - 1).a == a && aa.at(n - 1).b == b)
- return Anchor_Alternation | (n - 1);
-#endif
-
- QRegExpAnchorAlternation element = {a, b};
- aa.append(element);
- return Anchor_Alternation | n;
-}
-
-/*
- Returns an anchor that means a AND b.
-*/
-int QRegExpEngine::anchorConcatenation(int a, int b)
-{
- if (((a | b) & Anchor_Alternation) == 0)
- return a | b;
- if ((b & Anchor_Alternation) != 0)
- qSwap(a, b);
-
- int aprime = anchorConcatenation(aa.at(a ^ Anchor_Alternation).a, b);
- int bprime = anchorConcatenation(aa.at(a ^ Anchor_Alternation).b, b);
- return anchorAlternation(aprime, bprime);
-}
-#endif
-
-/*
- Adds anchor a on a transition caracterised by its from state and
- its to state.
-*/
-void QRegExpEngine::addAnchors(int from, int to, int a)
-{
- QRegExpAutomatonState &st = s[from];
- if (st.anchors.contains(to))
- a = anchorAlternation(st.anchors.value(to), a);
- st.anchors.insert(to, a);
-}
-
-#ifndef QT_NO_REGEXP_OPTIM
-/*
- This function chooses between the good-string and the bad-character
- heuristics. It computes two scores and chooses the heuristic with
- the highest score.
-
- Here are some common-sense constraints on the scores that should be
- respected if the formulas are ever modified: (1) If goodStr is
- empty, the good-string heuristic scores 0. (2) If the regular
- expression is trivial, the good-string heuristic should be used.
- (3) If the search is case insensitive, the good-string heuristic
- should be used, unless it scores 0. (Case insensitivity turns all
- entries of occ1 to 0.) (4) If (goodLateStart - goodEarlyStart) is
- big, the good-string heuristic should score less.
-*/
-void QRegExpEngine::heuristicallyChooseHeuristic()
-{
- if (minl == 0) {
- useGoodStringHeuristic = false;
- } else if (trivial) {
- useGoodStringHeuristic = true;
- } else {
- /*
- Magic formula: The good string has to constitute a good
- proportion of the minimum-length string, and appear at a
- more-or-less known index.
- */
- int goodStringScore = (64 * goodStr.length() / minl) -
- (goodLateStart - goodEarlyStart);
- /*
- Less magic formula: We pick some characters at random, and
- check whether they are good or bad.
- */
- int badCharScore = 0;
- int step = qMax(1, NumBadChars / 32);
- for (int i = 1; i < NumBadChars; i += step) {
- if (occ1.at(i) == NoOccurrence)
- badCharScore += minl;
- else
- badCharScore += occ1.at(i);
- }
- badCharScore /= minl;
- useGoodStringHeuristic = (goodStringScore > badCharScore);
- }
-}
-#endif
-
-#if defined(QT_DEBUG)
-void QRegExpEngine::dump() const
-{
- int i, j;
- qDebug("Case %ssensitive engine", cs ? "" : "in");
- qDebug(" States");
- for (i = 0; i < s.size(); i++) {
- qDebug(" %d%s", i, i == InitialState ? " (initial)" : i == FinalState ? " (final)" : "");
-#ifndef QT_NO_REGEXP_CAPTURE
- if (nf > 0)
- qDebug(" in atom %d", s[i].atom);
-#endif
- int m = s[i].match;
- if ((m & CharClassBit) != 0) {
- qDebug(" match character class %d", m ^ CharClassBit);
-#ifndef QT_NO_REGEXP_CCLASS
- cl[m ^ CharClassBit].dump();
-#else
- qDebug(" negative character class");
-#endif
- } else if ((m & BackRefBit) != 0) {
- qDebug(" match back-reference %d", m ^ BackRefBit);
- } else if (m >= 0x20 && m <= 0x7e) {
- qDebug(" match 0x%.4x (%c)", m, m);
- } else {
- qDebug(" match 0x%.4x", m);
- }
- for (j = 0; j < s[i].outs.size(); j++) {
- int next = s[i].outs[j];
- qDebug(" -> %d", next);
- if (s[i].reenter.contains(next))
- qDebug(" [reenter %d]", s[i].reenter[next]);
- if (s[i].anchors.value(next) != 0)
- qDebug(" [anchors 0x%.8x]", s[i].anchors[next]);
- }
- }
-#ifndef QT_NO_REGEXP_CAPTURE
- if (nf > 0) {
- qDebug(" Atom Parent Capture");
- for (i = 0; i < nf; i++) {
- if (f[i].capture == QRegExpAtom::NoCapture) {
- qDebug(" %6d %6d nil", i, f[i].parent);
- } else {
- int cap = f[i].capture;
- bool official = captureForOfficialCapture.contains(cap);
- qDebug(" %6d %6d %6d %s", i, f[i].parent, f[i].capture,
- official ? "official" : "");
- }
- }
- }
-#endif
-#ifndef QT_NO_REGEXP_ANCHOR_ALT
- for (i = 0; i < aa.size(); i++)
- qDebug(" Anchor alternation 0x%.8x: 0x%.8x 0x%.9x", i, aa[i].a, aa[i].b);
-#endif
-}
-#endif
-
-void QRegExpEngine::setup()
-{
- ref.store(1);
-#ifndef QT_NO_REGEXP_CAPTURE
- f.resize(32);
- nf = 0;
- cf = -1;
-#endif
- officialncap = 0;
- ncap = 0;
-#ifndef QT_NO_REGEXP_OPTIM
- caretAnchored = true;
- trivial = true;
-#endif
- valid = false;
-#ifndef QT_NO_REGEXP_BACKREF
- nbrefs = 0;
-#endif
-#ifndef QT_NO_REGEXP_OPTIM
- useGoodStringHeuristic = true;
- minl = 0;
- occ1.fill(0, NumBadChars);
-#endif
-}
-
-int QRegExpEngine::setupState(int match)
-{
-#ifndef QT_NO_REGEXP_CAPTURE
- s += QRegExpAutomatonState(cf, match);
-#else
- s += QRegExpAutomatonState(match);
-#endif
- return s.size() - 1;
-}
-
-#ifndef QT_NO_REGEXP_CAPTURE
-/*
- Functions startAtom() and finishAtom() should be called to delimit
- atoms. When a state is created, it is assigned to the current atom.
- The information is later used for capturing.
-*/
-int QRegExpEngine::startAtom(bool officialCapture)
-{
- if ((nf & (nf + 1)) == 0 && nf + 1 >= f.size())
- f.resize((nf + 1) << 1);
- f[nf].parent = cf;
- cf = nf++;
- f[cf].capture = officialCapture ? QRegExpAtom::OfficialCapture : QRegExpAtom::NoCapture;
- return cf;
-}
-
-void QRegExpEngine::finishAtom(int atom, bool needCapture)
-{
- if (greedyQuantifiers && needCapture && f[atom].capture == QRegExpAtom::NoCapture)
- f[atom].capture = QRegExpAtom::UnofficialCapture;
- cf = f.at(atom).parent;
-}
-#endif
-
-#ifndef QT_NO_REGEXP_LOOKAHEAD
-/*
- Creates a lookahead anchor.
-*/
-int QRegExpEngine::addLookahead(QRegExpEngine *eng, bool negative)
-{
- int n = ahead.size();
- if (n == MaxLookaheads) {
- error(RXERR_LIMIT);
- return 0;
- }
- ahead += new QRegExpLookahead(eng, negative);
- return Anchor_FirstLookahead << n;
-}
-#endif
-
-#ifndef QT_NO_REGEXP_CAPTURE
-/*
- We want the longest leftmost captures.
-*/
-static bool isBetterCapture(int ncap, const int *begin1, const int *end1, const int *begin2,
- const int *end2)
-{
- for (int i = 0; i < ncap; i++) {
- int delta = begin2[i] - begin1[i]; // it has to start early...
- if (delta == 0)
- delta = end1[i] - end2[i]; // ...and end late
-
- if (delta != 0)
- return delta > 0;
- }
- return false;
-}
-#endif
-
-/*
- Returns \c true if anchor a matches at position pos + i in the input
- string, otherwise false.
-*/
-bool QRegExpMatchState::testAnchor(int i, int a, const int *capBegin)
-{
- int j;
-
-#ifndef QT_NO_REGEXP_ANCHOR_ALT
- if ((a & QRegExpEngine::Anchor_Alternation) != 0)
- return testAnchor(i, eng->aa.at(a ^ QRegExpEngine::Anchor_Alternation).a, capBegin)
- || testAnchor(i, eng->aa.at(a ^ QRegExpEngine::Anchor_Alternation).b, capBegin);
-#endif
-
- if ((a & QRegExpEngine::Anchor_Caret) != 0) {
- if (pos + i != caretPos)
- return false;
- }
- if ((a & QRegExpEngine::Anchor_Dollar) != 0) {
- if (pos + i != len)
- return false;
- }
-#ifndef QT_NO_REGEXP_ESCAPE
- if ((a & (QRegExpEngine::Anchor_Word | QRegExpEngine::Anchor_NonWord)) != 0) {
- bool before = false;
- bool after = false;
- if (pos + i != 0)
- before = isWord(in[pos + i - 1]);
- if (pos + i != len)
- after = isWord(in[pos + i]);
- if ((a & QRegExpEngine::Anchor_Word) != 0 && (before == after))
- return false;
- if ((a & QRegExpEngine::Anchor_NonWord) != 0 && (before != after))
- return false;
- }
-#endif
-#ifndef QT_NO_REGEXP_LOOKAHEAD
- if ((a & QRegExpEngine::Anchor_LookaheadMask) != 0) {
- const QVector<QRegExpLookahead *> &ahead = eng->ahead;
- for (j = 0; j < ahead.size(); j++) {
- if ((a & (QRegExpEngine::Anchor_FirstLookahead << j)) != 0) {
- QRegExpMatchState matchState;
- matchState.prepareForMatch(ahead[j]->eng);
- matchState.match(in + pos + i, len - pos - i, 0,
- true, true, caretPos - pos - i);
- if ((matchState.captured[0] == 0) == ahead[j]->neg)
- return false;
- }
- }
- }
-#endif
-#ifndef QT_NO_REGEXP_CAPTURE
-#ifndef QT_NO_REGEXP_BACKREF
- for (j = 0; j < eng->nbrefs; j++) {
- if ((a & (QRegExpEngine::Anchor_BackRef1Empty << j)) != 0) {
- int i = eng->captureForOfficialCapture.at(j);
- if (capBegin[i] != EmptyCapture)
- return false;
- }
- }
-#endif
-#endif
- return true;
-}
-
-#ifndef QT_NO_REGEXP_OPTIM
-/*
- The three following functions are what Jeffrey Friedl would call
- transmissions (or bump-alongs). Using one or the other should make
- no difference except in performance.
-*/
-
-bool QRegExpEngine::goodStringMatch(QRegExpMatchState &matchState) const
-{
- int k = matchState.pos + goodEarlyStart;
- QStringMatcher matcher(goodStr.unicode(), goodStr.length(), cs);
- while ((k = matcher.indexIn(matchState.in, matchState.len, k)) != -1) {
- int from = k - goodLateStart;
- int to = k - goodEarlyStart;
- if (from > matchState.pos)
- matchState.pos = from;
-
- while (matchState.pos <= to) {
- if (matchState.matchHere())
- return true;
- ++matchState.pos;
- }
- ++k;
- }
- return false;
-}
-
-bool QRegExpEngine::badCharMatch(QRegExpMatchState &matchState) const
-{
- int slideHead = 0;
- int slideNext = 0;
- int i;
- int lastPos = matchState.len - minl;
- memset(matchState.slideTab, 0, matchState.slideTabSize * sizeof(int));
-
- /*
- Set up the slide table, used for the bad-character heuristic,
- using the table of first occurrence of each character.
- */
- for (i = 0; i < minl; i++) {
- int sk = occ1[BadChar(matchState.in[matchState.pos + i])];
- if (sk == NoOccurrence)
- sk = i + 1;
- if (sk > 0) {
- int k = i + 1 - sk;
- if (k < 0) {
- sk = i + 1;
- k = 0;
- }
- if (sk > matchState.slideTab[k])
- matchState.slideTab[k] = sk;
- }
- }
-
- if (matchState.pos > lastPos)
- return false;
-
- for (;;) {
- if (++slideNext >= matchState.slideTabSize)
- slideNext = 0;
- if (matchState.slideTab[slideHead] > 0) {
- if (matchState.slideTab[slideHead] - 1 > matchState.slideTab[slideNext])
- matchState.slideTab[slideNext] = matchState.slideTab[slideHead] - 1;
- matchState.slideTab[slideHead] = 0;
- } else {
- if (matchState.matchHere())
- return true;
- }
-
- if (matchState.pos == lastPos)
- break;
-
- /*
- Update the slide table. This code has much in common with
- the initialization code.
- */
- int sk = occ1[BadChar(matchState.in[matchState.pos + minl])];
- if (sk == NoOccurrence) {
- matchState.slideTab[slideNext] = minl;
- } else if (sk > 0) {
- int k = slideNext + minl - sk;
- if (k >= matchState.slideTabSize)
- k -= matchState.slideTabSize;
- if (sk > matchState.slideTab[k])
- matchState.slideTab[k] = sk;
- }
- slideHead = slideNext;
- ++matchState.pos;
- }
- return false;
-}
-#else
-bool QRegExpEngine::bruteMatch(QRegExpMatchState &matchState) const
-{
- while (matchState.pos <= matchState.len) {
- if (matchState.matchHere())
- return true;
- ++matchState.pos;
- }
- return false;
-}
-#endif
-
-/*
- Here's the core of the engine. It tries to do a match here and now.
-*/
-bool QRegExpMatchState::matchHere()
-{
- int ncur = 1, nnext = 0;
- int i = 0, j, k, m;
- bool stop = false;
-
- matchLen = -1;
- oneTestMatchedLen = -1;
- curStack[0] = QRegExpEngine::InitialState;
-
- int ncap = eng->ncap;
-#ifndef QT_NO_REGEXP_CAPTURE
- if (ncap > 0) {
- for (j = 0; j < ncap; j++) {
- curCapBegin[j] = EmptyCapture;
- curCapEnd[j] = EmptyCapture;
- }
- }
-#endif
-
-#ifndef QT_NO_REGEXP_BACKREF
- while ((ncur > 0 || !sleeping.isEmpty()) && i <= len - pos && !stop)
-#else
- while (ncur > 0 && i <= len - pos && !stop)
-#endif
- {
- int ch = (i < len - pos) ? in[pos + i].unicode() : 0;
- for (j = 0; j < ncur; j++) {
- int cur = curStack[j];
- const QRegExpAutomatonState &scur = eng->s.at(cur);
- const QVector<int> &outs = scur.outs;
- for (k = 0; k < outs.size(); k++) {
- int next = outs.at(k);
- const QRegExpAutomatonState &snext = eng->s.at(next);
- bool inside = true;
-#if !defined(QT_NO_REGEXP_BACKREF) && !defined(QT_NO_REGEXP_CAPTURE)
- int needSomeSleep = 0;
-#endif
-
- /*
- First, check if the anchors are anchored properly.
- */
- int a = scur.anchors.value(next);
- if (a != 0 && !testAnchor(i, a, curCapBegin + j * ncap))
- inside = false;
-
- /*
- If indeed they are, check if the input character is
- correct for this transition.
- */
- if (inside) {
- m = snext.match;
- if ((m & (QRegExpEngine::CharClassBit | QRegExpEngine::BackRefBit)) == 0) {
- if (eng->cs)
- inside = (m == ch);
- else
- inside = (QChar(m).toLower() == QChar(ch).toLower());
- } else if (next == QRegExpEngine::FinalState) {
- matchLen = i;
- stop = minimal;
- inside = true;
- } else if ((m & QRegExpEngine::CharClassBit) != 0) {
-#ifndef QT_NO_REGEXP_CCLASS
- const QRegExpCharClass &cc = eng->cl.at(m ^ QRegExpEngine::CharClassBit);
- if (eng->cs)
- inside = cc.in(ch);
- else if (cc.negative())
- inside = cc.in(QChar(ch).toLower()) &&
- cc.in(QChar(ch).toUpper());
- else
- inside = cc.in(QChar(ch).toLower()) ||
- cc.in(QChar(ch).toUpper());
-#endif
-#if !defined(QT_NO_REGEXP_BACKREF) && !defined(QT_NO_REGEXP_CAPTURE)
- } else { /* ((m & QRegExpEngine::BackRefBit) != 0) */
- int bref = m ^ QRegExpEngine::BackRefBit;
- int ell = j * ncap + eng->captureForOfficialCapture.at(bref - 1);
-
- inside = bref <= ncap && curCapBegin[ell] != EmptyCapture;
- if (inside) {
- if (eng->cs)
- inside = (in[pos + curCapBegin[ell]] == QChar(ch));
- else
- inside = (in[pos + curCapBegin[ell]].toLower()
- == QChar(ch).toLower());
- }
-
- if (inside) {
- int delta;
- if (curCapEnd[ell] == EmptyCapture)
- delta = i - curCapBegin[ell];
- else
- delta = curCapEnd[ell] - curCapBegin[ell];
-
- inside = (delta <= len - (pos + i));
- if (inside && delta > 1) {
- int n = 1;
- if (eng->cs) {
- while (n < delta) {
- if (in[pos + curCapBegin[ell] + n]
- != in[pos + i + n])
- break;
- ++n;
- }
- } else {
- while (n < delta) {
- QChar a = in[pos + curCapBegin[ell] + n];
- QChar b = in[pos + i + n];
- if (a.toLower() != b.toLower())
- break;
- ++n;
- }
- }
- inside = (n == delta);
- if (inside)
- needSomeSleep = delta - 1;
- }
- }
-#endif
- }
- }
-
- /*
- We must now update our data structures.
- */
- if (inside) {
-#ifndef QT_NO_REGEXP_CAPTURE
- int *capBegin, *capEnd;
-#endif
- /*
- If the next state was not encountered yet, all
- is fine.
- */
- if ((m = inNextStack[next]) == -1) {
- m = nnext++;
- nextStack[m] = next;
- inNextStack[next] = m;
-#ifndef QT_NO_REGEXP_CAPTURE
- capBegin = nextCapBegin + m * ncap;
- capEnd = nextCapEnd + m * ncap;
-
- /*
- Otherwise, we'll first maintain captures in
- temporary arrays, and decide at the end whether
- it's best to keep the previous capture zones or
- the new ones.
- */
- } else {
- capBegin = tempCapBegin;
- capEnd = tempCapEnd;
-#endif
- }
-
-#ifndef QT_NO_REGEXP_CAPTURE
- /*
- Updating the capture zones is much of a task.
- */
- if (ncap > 0) {
- memcpy(capBegin, curCapBegin + j * ncap, ncap * sizeof(int));
- memcpy(capEnd, curCapEnd + j * ncap, ncap * sizeof(int));
- int c = scur.atom, n = snext.atom;
- int p = -1, q = -1;
- int cap;
-
- /*
- Lemma 1. For any x in the range [0..nf), we
- have f[x].parent < x.
-
- Proof. By looking at startAtom(), it is
- clear that cf < nf holds all the time, and
- thus that f[nf].parent < nf.
- */
-
- /*
- If we are reentering an atom, we empty all
- capture zones inside it.
- */
- if ((q = scur.reenter.value(next)) != 0) {
- QBitArray b(eng->nf, false);
- b.setBit(q, true);
- for (int ell = q + 1; ell < eng->nf; ell++) {
- if (b.testBit(eng->f.at(ell).parent)) {
- b.setBit(ell, true);
- cap = eng->f.at(ell).capture;
- if (cap >= 0) {
- capBegin[cap] = EmptyCapture;
- capEnd[cap] = EmptyCapture;
- }
- }
- }
- p = eng->f.at(q).parent;
-
- /*
- Otherwise, close the capture zones we are
- leaving. We are leaving f[c].capture,
- f[f[c].parent].capture,
- f[f[f[c].parent].parent].capture, ...,
- until f[x].capture, with x such that
- f[x].parent is the youngest common ancestor
- for c and n.
-
- We go up along c's and n's ancestry until
- we find x.
- */
- } else {
- p = c;
- q = n;
- while (p != q) {
- if (p > q) {
- cap = eng->f.at(p).capture;
- if (cap >= 0) {
- if (capBegin[cap] == i) {
- capBegin[cap] = EmptyCapture;
- capEnd[cap] = EmptyCapture;
- } else {
- capEnd[cap] = i;
- }
- }
- p = eng->f.at(p).parent;
- } else {
- q = eng->f.at(q).parent;
- }
- }
- }
-
- /*
- In any case, we now open the capture zones
- we are entering. We work upwards from n
- until we reach p (the parent of the atom we
- reenter or the youngest common ancestor).
- */
- while (n > p) {
- cap = eng->f.at(n).capture;
- if (cap >= 0) {
- capBegin[cap] = i;
- capEnd[cap] = EmptyCapture;
- }
- n = eng->f.at(n).parent;
- }
- /*
- If the next state was already in
- nextStack, we must choose carefully which
- capture zones we want to keep.
- */
- if (capBegin == tempCapBegin &&
- isBetterCapture(ncap, capBegin, capEnd, nextCapBegin + m * ncap,
- nextCapEnd + m * ncap)) {
- memcpy(nextCapBegin + m * ncap, capBegin, ncap * sizeof(int));
- memcpy(nextCapEnd + m * ncap, capEnd, ncap * sizeof(int));
- }
- }
-#ifndef QT_NO_REGEXP_BACKREF
- /*
- We are done with updating the capture zones.
- It's now time to put the next state to sleep,
- if it needs to, and to remove it from
- nextStack.
- */
- if (needSomeSleep > 0) {
- QVector<int> zzZ(2 + 2 * ncap);
- zzZ[0] = i + needSomeSleep;
- zzZ[1] = next;
- if (ncap > 0) {
- memcpy(zzZ.data() + 2, capBegin, ncap * sizeof(int));
- memcpy(zzZ.data() + 2 + ncap, capEnd, ncap * sizeof(int));
- }
- inNextStack[nextStack[--nnext]] = -1;
- sleeping.append(zzZ);
- }
-#endif
-#endif
- }
- }
- }
-#ifndef QT_NO_REGEXP_CAPTURE
- /*
- If we reached the final state, hurray! Copy the captured
- zone.
- */
- if (ncap > 0 && (m = inNextStack[QRegExpEngine::FinalState]) != -1) {
- memcpy(capBegin, nextCapBegin + m * ncap, ncap * sizeof(int));
- memcpy(capEnd, nextCapEnd + m * ncap, ncap * sizeof(int));
- }
-#ifndef QT_NO_REGEXP_BACKREF
- /*
- It's time to wake up the sleepers.
- */
- j = 0;
- while (j < sleeping.count()) {
- if (sleeping.at(j)[0] == i) {
- const QVector<int> &zzZ = sleeping.at(j);
- int next = zzZ[1];
- const int *capBegin = zzZ.data() + 2;
- const int *capEnd = zzZ.data() + 2 + ncap;
- bool copyOver = true;
-
- if ((m = inNextStack[next]) == -1) {
- m = nnext++;
- nextStack[m] = next;
- inNextStack[next] = m;
- } else {
- copyOver = isBetterCapture(ncap, nextCapBegin + m * ncap, nextCapEnd + m * ncap,
- capBegin, capEnd);
- }
- if (copyOver) {
- memcpy(nextCapBegin + m * ncap, capBegin, ncap * sizeof(int));
- memcpy(nextCapEnd + m * ncap, capEnd, ncap * sizeof(int));
- }
-
- sleeping.removeAt(j);
- } else {
- ++j;
- }
- }
-#endif
-#endif
- for (j = 0; j < nnext; j++)
- inNextStack[nextStack[j]] = -1;
-
- // avoid needless iteration that confuses oneTestMatchedLen
- if (nnext == 1 && nextStack[0] == QRegExpEngine::FinalState
-#ifndef QT_NO_REGEXP_BACKREF
- && sleeping.isEmpty()
-#endif
- )
- stop = true;
-
- qSwap(curStack, nextStack);
-#ifndef QT_NO_REGEXP_CAPTURE
- qSwap(curCapBegin, nextCapBegin);
- qSwap(curCapEnd, nextCapEnd);
-#endif
- ncur = nnext;
- nnext = 0;
- ++i;
- }
-
-#ifndef QT_NO_REGEXP_BACKREF
- /*
- If minimal matching is enabled, we might have some sleepers
- left.
- */
- if (!sleeping.isEmpty())
- sleeping.clear();
-#endif
-
- oneTestMatchedLen = i - 1;
- return (matchLen >= 0);
-}
-
-#ifndef QT_NO_REGEXP_CCLASS
-
-QRegExpCharClass::QRegExpCharClass()
- : c(0), n(false)
-{
-#ifndef QT_NO_REGEXP_OPTIM
- occ1.fill(NoOccurrence, NumBadChars);
-#endif
-}
-
-void QRegExpCharClass::clear()
-{
- c = 0;
- r.clear();
- n = false;
-}
-
-void QRegExpCharClass::setNegative(bool negative)
-{
- n = negative;
-#ifndef QT_NO_REGEXP_OPTIM
- occ1.fill(0, NumBadChars);
-#endif
-}
-
-void QRegExpCharClass::addCategories(uint cats)
-{
- static const int all_cats = FLAG(QChar::Mark_NonSpacing) |
- FLAG(QChar::Mark_SpacingCombining) |
- FLAG(QChar::Mark_Enclosing) |
- FLAG(QChar::Number_DecimalDigit) |
- FLAG(QChar::Number_Letter) |
- FLAG(QChar::Number_Other) |
- FLAG(QChar::Separator_Space) |
- FLAG(QChar::Separator_Line) |
- FLAG(QChar::Separator_Paragraph) |
- FLAG(QChar::Other_Control) |
- FLAG(QChar::Other_Format) |
- FLAG(QChar::Other_Surrogate) |
- FLAG(QChar::Other_PrivateUse) |
- FLAG(QChar::Other_NotAssigned) |
- FLAG(QChar::Letter_Uppercase) |
- FLAG(QChar::Letter_Lowercase) |
- FLAG(QChar::Letter_Titlecase) |
- FLAG(QChar::Letter_Modifier) |
- FLAG(QChar::Letter_Other) |
- FLAG(QChar::Punctuation_Connector) |
- FLAG(QChar::Punctuation_Dash) |
- FLAG(QChar::Punctuation_Open) |
- FLAG(QChar::Punctuation_Close) |
- FLAG(QChar::Punctuation_InitialQuote) |
- FLAG(QChar::Punctuation_FinalQuote) |
- FLAG(QChar::Punctuation_Other) |
- FLAG(QChar::Symbol_Math) |
- FLAG(QChar::Symbol_Currency) |
- FLAG(QChar::Symbol_Modifier) |
- FLAG(QChar::Symbol_Other);
- c |= (all_cats & cats);
-#ifndef QT_NO_REGEXP_OPTIM
- occ1.fill(0, NumBadChars);
-#endif
-}
-
-void QRegExpCharClass::addRange(ushort from, ushort to)
-{
- if (from > to)
- qSwap(from, to);
- int m = r.size();
- r.resize(m + 1);
- r[m].from = from;
- r[m].len = to - from + 1;
-
-#ifndef QT_NO_REGEXP_OPTIM
- int i;
-
- if (to - from < NumBadChars) {
- if (from % NumBadChars <= to % NumBadChars) {
- for (i = from % NumBadChars; i <= to % NumBadChars; i++)
- occ1[i] = 0;
- } else {
- for (i = 0; i <= to % NumBadChars; i++)
- occ1[i] = 0;
- for (i = from % NumBadChars; i < NumBadChars; i++)
- occ1[i] = 0;
- }
- } else {
- occ1.fill(0, NumBadChars);
- }
-#endif
-}
-
-bool QRegExpCharClass::in(QChar ch) const
-{
-#ifndef QT_NO_REGEXP_OPTIM
- if (occ1.at(BadChar(ch)) == NoOccurrence)
- return n;
-#endif
-
- if (c != 0 && (c & FLAG(ch.category())) != 0)
- return !n;
-
- const int uc = ch.unicode();
- int size = r.size();
-
- for (int i = 0; i < size; ++i) {
- const QRegExpCharClassRange &range = r.at(i);
- if (uint(uc - range.from) < uint(r.at(i).len))
- return !n;
- }
- return n;
-}
-
-#if defined(QT_DEBUG)
-void QRegExpCharClass::dump() const
-{
- int i;
- qDebug(" %stive character class", n ? "nega" : "posi");
-#ifndef QT_NO_REGEXP_CCLASS
- if (c != 0)
- qDebug(" categories 0x%.8x", c);
-#endif
- for (i = 0; i < r.size(); i++)
- qDebug(" 0x%.4x through 0x%.4x", r[i].from, r[i].from + r[i].len - 1);
-}
-#endif
-#endif
-
-QRegExpEngine::Box::Box(QRegExpEngine *engine)
- : eng(engine), skipanchors(0)
-#ifndef QT_NO_REGEXP_OPTIM
- , earlyStart(0), lateStart(0), maxl(0)
-#endif
-{
-#ifndef QT_NO_REGEXP_OPTIM
- occ1.fill(NoOccurrence, NumBadChars);
-#endif
- minl = 0;
-}
-
-QRegExpEngine::Box &QRegExpEngine::Box::operator=(const Box &b)
-{
- eng = b.eng;
- ls = b.ls;
- rs = b.rs;
- lanchors = b.lanchors;
- ranchors = b.ranchors;
- skipanchors = b.skipanchors;
-#ifndef QT_NO_REGEXP_OPTIM
- earlyStart = b.earlyStart;
- lateStart = b.lateStart;
- str = b.str;
- leftStr = b.leftStr;
- rightStr = b.rightStr;
- maxl = b.maxl;
- occ1 = b.occ1;
-#endif
- minl = b.minl;
- return *this;
-}
-
-void QRegExpEngine::Box::set(QChar ch)
-{
- ls.resize(1);
- ls[0] = eng->createState(ch);
- rs = ls;
-#ifndef QT_NO_REGEXP_OPTIM
- str = ch;
- leftStr = ch;
- rightStr = ch;
- maxl = 1;
- occ1[BadChar(ch)] = 0;
-#endif
- minl = 1;
-}
-
-void QRegExpEngine::Box::set(const QRegExpCharClass &cc)
-{
- ls.resize(1);
- ls[0] = eng->createState(cc);
- rs = ls;
-#ifndef QT_NO_REGEXP_OPTIM
- maxl = 1;
- occ1 = cc.firstOccurrence();
-#endif
- minl = 1;
-}
-
-#ifndef QT_NO_REGEXP_BACKREF
-void QRegExpEngine::Box::set(int bref)
-{
- ls.resize(1);
- ls[0] = eng->createState(bref);
- rs = ls;
- if (bref >= 1 && bref <= MaxBackRefs)
- skipanchors = Anchor_BackRef0Empty << bref;
-#ifndef QT_NO_REGEXP_OPTIM
- maxl = InftyLen;
-#endif
- minl = 0;
-}
-#endif
-
-void QRegExpEngine::Box::cat(const Box &b)
-{
- eng->addCatTransitions(rs, b.ls);
- addAnchorsToEngine(b);
- if (minl == 0) {
- lanchors.unite(b.lanchors);
- if (skipanchors != 0) {
- for (int i = 0; i < b.ls.size(); i++) {
- int a = eng->anchorConcatenation(lanchors.value(b.ls.at(i), 0), skipanchors);
- lanchors.insert(b.ls.at(i), a);
- }
- }
- mergeInto(&ls, b.ls);
- }
- if (b.minl == 0) {
- ranchors.unite(b.ranchors);
- if (b.skipanchors != 0) {
- for (int i = 0; i < rs.size(); i++) {
- int a = eng->anchorConcatenation(ranchors.value(rs.at(i), 0), b.skipanchors);
- ranchors.insert(rs.at(i), a);
- }
- }
- mergeInto(&rs, b.rs);
- } else {
- ranchors = b.ranchors;
- rs = b.rs;
- }
-
-#ifndef QT_NO_REGEXP_OPTIM
- if (maxl != InftyLen) {
- if (rightStr.length() + b.leftStr.length() >
- qMax(str.length(), b.str.length())) {
- earlyStart = minl - rightStr.length();
- lateStart = maxl - rightStr.length();
- str = rightStr + b.leftStr;
- } else if (b.str.length() > str.length()) {
- earlyStart = minl + b.earlyStart;
- lateStart = maxl + b.lateStart;
- str = b.str;
- }
- }
-
- if (leftStr.length() == maxl)
- leftStr += b.leftStr;
-
- if (b.rightStr.length() == b.maxl) {
- rightStr += b.rightStr;
- } else {
- rightStr = b.rightStr;
- }
-
- if (maxl == InftyLen || b.maxl == InftyLen) {
- maxl = InftyLen;
- } else {
- maxl += b.maxl;
- }
-
- for (int i = 0; i < NumBadChars; i++) {
- if (b.occ1.at(i) != NoOccurrence && minl + b.occ1.at(i) < occ1.at(i))
- occ1[i] = minl + b.occ1.at(i);
- }
-#endif
-
- minl += b.minl;
- if (minl == 0)
- skipanchors = eng->anchorConcatenation(skipanchors, b.skipanchors);
- else
- skipanchors = 0;
-}
-
-void QRegExpEngine::Box::orx(const Box &b)
-{
- mergeInto(&ls, b.ls);
- lanchors.unite(b.lanchors);
- mergeInto(&rs, b.rs);
- ranchors.unite(b.ranchors);
-
- if (b.minl == 0) {
- if (minl == 0)
- skipanchors = eng->anchorAlternation(skipanchors, b.skipanchors);
- else
- skipanchors = b.skipanchors;
- }
-
-#ifndef QT_NO_REGEXP_OPTIM
- for (int i = 0; i < NumBadChars; i++) {
- if (occ1.at(i) > b.occ1.at(i))
- occ1[i] = b.occ1.at(i);
- }
- earlyStart = 0;
- lateStart = 0;
- str = QString();
- leftStr = QString();
- rightStr = QString();
- if (b.maxl > maxl)
- maxl = b.maxl;
-#endif
- if (b.minl < minl)
- minl = b.minl;
-}
-
-void QRegExpEngine::Box::plus(int atom)
-{
-#ifndef QT_NO_REGEXP_CAPTURE
- eng->addPlusTransitions(rs, ls, atom);
-#else
- Q_UNUSED(atom);
- eng->addCatTransitions(rs, ls);
-#endif
- addAnchorsToEngine(*this);
-#ifndef QT_NO_REGEXP_OPTIM
- maxl = InftyLen;
-#endif
-}
-
-void QRegExpEngine::Box::opt()
-{
-#ifndef QT_NO_REGEXP_OPTIM
- earlyStart = 0;
- lateStart = 0;
- str = QString();
- leftStr = QString();
- rightStr = QString();
-#endif
- skipanchors = 0;
- minl = 0;
-}
-
-void QRegExpEngine::Box::catAnchor(int a)
-{
- if (a != 0) {
- for (int i = 0; i < rs.size(); i++) {
- a = eng->anchorConcatenation(ranchors.value(rs.at(i), 0), a);
- ranchors.insert(rs.at(i), a);
- }
- if (minl == 0)
- skipanchors = eng->anchorConcatenation(skipanchors, a);
- }
-}
-
-#ifndef QT_NO_REGEXP_OPTIM
-void QRegExpEngine::Box::setupHeuristics()
-{
- eng->goodEarlyStart = earlyStart;
- eng->goodLateStart = lateStart;
- eng->goodStr = eng->cs ? str : str.toLower();
-
- eng->minl = minl;
- if (eng->cs) {
- /*
- A regular expression such as 112|1 has occ1['2'] = 2 and minl =
- 1 at this point. An entry of occ1 has to be at most minl or
- infinity for the rest of the algorithm to go well.
-
- We waited until here before normalizing these cases (instead of
- doing it in Box::orx()) because sometimes things improve by
- themselves. Consider for example (112|1)34.
- */
- for (int i = 0; i < NumBadChars; i++) {
- if (occ1.at(i) != NoOccurrence && occ1.at(i) >= minl)
- occ1[i] = minl;
- }
- eng->occ1 = occ1;
- } else {
- eng->occ1.fill(0, NumBadChars);
- }
-
- eng->heuristicallyChooseHeuristic();
-}
-#endif
-
-#if defined(QT_DEBUG)
-void QRegExpEngine::Box::dump() const
-{
- int i;
- qDebug("Box of at least %d character%s", minl, minl == 1 ? "" : "s");
- qDebug(" Left states:");
- for (i = 0; i < ls.size(); i++) {
- if (lanchors.value(ls[i], 0) == 0)
- qDebug(" %d", ls[i]);
- else
- qDebug(" %d [anchors 0x%.8x]", ls[i], lanchors[ls[i]]);
- }
- qDebug(" Right states:");
- for (i = 0; i < rs.size(); i++) {
- if (ranchors.value(rs[i], 0) == 0)
- qDebug(" %d", rs[i]);
- else
- qDebug(" %d [anchors 0x%.8x]", rs[i], ranchors[rs[i]]);
- }
- qDebug(" Skip anchors: 0x%.8x", skipanchors);
-}
-#endif
-
-void QRegExpEngine::Box::addAnchorsToEngine(const Box &to) const
-{
- for (int i = 0; i < to.ls.size(); i++) {
- for (int j = 0; j < rs.size(); j++) {
- int a = eng->anchorConcatenation(ranchors.value(rs.at(j), 0),
- to.lanchors.value(to.ls.at(i), 0));
- eng->addAnchors(rs[j], to.ls[i], a);
- }
- }
-}
-
-#ifndef QT_NO_REGEXP_CCLASS
-// fast lookup hash for xml schema extensions
-// sorted by name for b-search
-static const struct CategoriesRangeMapEntry {
- const char name[40];
- uint first, second;
-} categoriesRangeMap[] = {
- { "AegeanNumbers", 0x10100, 0x1013F },
- { "AlphabeticPresentationForms", 0xFB00, 0xFB4F },
- { "AncientGreekMusicalNotation", 0x1D200, 0x1D24F },
- { "AncientGreekNumbers", 0x10140, 0x1018F },
- { "Arabic", 0x0600, 0x06FF },
- { "ArabicPresentationForms-A", 0xFB50, 0xFDFF },
- { "ArabicPresentationForms-B", 0xFE70, 0xFEFF },
- { "ArabicSupplement", 0x0750, 0x077F },
- { "Armenian", 0x0530, 0x058F },
- { "Arrows", 0x2190, 0x21FF },
- { "BasicLatin", 0x0000, 0x007F },
- { "Bengali", 0x0980, 0x09FF },
- { "BlockElements", 0x2580, 0x259F },
- { "Bopomofo", 0x3100, 0x312F },
- { "BopomofoExtended", 0x31A0, 0x31BF },
- { "BoxDrawing", 0x2500, 0x257F },
- { "BraillePatterns", 0x2800, 0x28FF },
- { "Buginese", 0x1A00, 0x1A1F },
- { "Buhid", 0x1740, 0x175F },
- { "ByzantineMusicalSymbols", 0x1D000, 0x1D0FF },
- { "CJKCompatibility", 0x3300, 0x33FF },
- { "CJKCompatibilityForms", 0xFE30, 0xFE4F },
- { "CJKCompatibilityIdeographs", 0xF900, 0xFAFF },
- { "CJKCompatibilityIdeographsSupplement", 0x2F800, 0x2FA1F },
- { "CJKRadicalsSupplement", 0x2E80, 0x2EFF },
- { "CJKStrokes", 0x31C0, 0x31EF },
- { "CJKSymbolsandPunctuation", 0x3000, 0x303F },
- { "CJKUnifiedIdeographs", 0x4E00, 0x9FFF },
- { "CJKUnifiedIdeographsExtensionA", 0x3400, 0x4DB5 },
- { "CJKUnifiedIdeographsExtensionB", 0x20000, 0x2A6DF },
- { "Cherokee", 0x13A0, 0x13FF },
- { "CombiningDiacriticalMarks", 0x0300, 0x036F },
- { "CombiningDiacriticalMarksSupplement", 0x1DC0, 0x1DFF },
- { "CombiningHalfMarks", 0xFE20, 0xFE2F },
- { "CombiningMarksforSymbols", 0x20D0, 0x20FF },
- { "ControlPictures", 0x2400, 0x243F },
- { "Coptic", 0x2C80, 0x2CFF },
- { "CurrencySymbols", 0x20A0, 0x20CF },
- { "CypriotSyllabary", 0x10800, 0x1083F },
- { "Cyrillic", 0x0400, 0x04FF },
- { "CyrillicSupplement", 0x0500, 0x052F },
- { "Deseret", 0x10400, 0x1044F },
- { "Devanagari", 0x0900, 0x097F },
- { "Dingbats", 0x2700, 0x27BF },
- { "EnclosedAlphanumerics", 0x2460, 0x24FF },
- { "EnclosedCJKLettersandMonths", 0x3200, 0x32FF },
- { "Ethiopic", 0x1200, 0x137F },
- { "EthiopicExtended", 0x2D80, 0x2DDF },
- { "EthiopicSupplement", 0x1380, 0x139F },
- { "GeneralPunctuation", 0x2000, 0x206F },
- { "GeometricShapes", 0x25A0, 0x25FF },
- { "Georgian", 0x10A0, 0x10FF },
- { "GeorgianSupplement", 0x2D00, 0x2D2F },
- { "Glagolitic", 0x2C00, 0x2C5F },
- { "Gothic", 0x10330, 0x1034F },
- { "Greek", 0x0370, 0x03FF },
- { "GreekExtended", 0x1F00, 0x1FFF },
- { "Gujarati", 0x0A80, 0x0AFF },
- { "Gurmukhi", 0x0A00, 0x0A7F },
- { "HalfwidthandFullwidthForms", 0xFF00, 0xFFEF },
- { "HangulCompatibilityJamo", 0x3130, 0x318F },
- { "HangulJamo", 0x1100, 0x11FF },
- { "HangulSyllables", 0xAC00, 0xD7A3 },
- { "Hanunoo", 0x1720, 0x173F },
- { "Hebrew", 0x0590, 0x05FF },
- { "Hiragana", 0x3040, 0x309F },
- { "IPAExtensions", 0x0250, 0x02AF },
- { "IdeographicDescriptionCharacters", 0x2FF0, 0x2FFF },
- { "Kanbun", 0x3190, 0x319F },
- { "KangxiRadicals", 0x2F00, 0x2FDF },
- { "Kannada", 0x0C80, 0x0CFF },
- { "Katakana", 0x30A0, 0x30FF },
- { "KatakanaPhoneticExtensions", 0x31F0, 0x31FF },
- { "Kharoshthi", 0x10A00, 0x10A5F },
- { "Khmer", 0x1780, 0x17FF },
- { "KhmerSymbols", 0x19E0, 0x19FF },
- { "Lao", 0x0E80, 0x0EFF },
- { "Latin-1Supplement", 0x0080, 0x00FF },
- { "LatinExtended-A", 0x0100, 0x017F },
- { "LatinExtended-B", 0x0180, 0x024F },
- { "LatinExtendedAdditional", 0x1E00, 0x1EFF },
- { "LetterlikeSymbols", 0x2100, 0x214F },
- { "Limbu", 0x1900, 0x194F },
- { "LinearBIdeograms", 0x10080, 0x100FF },
- { "LinearBSyllabary", 0x10000, 0x1007F },
- { "Malayalam", 0x0D00, 0x0D7F },
- { "MathematicalAlphanumericSymbols", 0x1D400, 0x1D7FF },
- { "MathematicalOperators", 0x2200, 0x22FF },
- { "MiscellaneousMathematicalSymbols-A", 0x27C0, 0x27EF },
- { "MiscellaneousMathematicalSymbols-B", 0x2980, 0x29FF },
- { "MiscellaneousSymbols", 0x2600, 0x26FF },
- { "MiscellaneousSymbolsandArrows", 0x2B00, 0x2BFF },
- { "MiscellaneousTechnical", 0x2300, 0x23FF },
- { "ModifierToneLetters", 0xA700, 0xA71F },
- { "Mongolian", 0x1800, 0x18AF },
- { "MusicalSymbols", 0x1D100, 0x1D1FF },
- { "Myanmar", 0x1000, 0x109F },
- { "NewTaiLue", 0x1980, 0x19DF },
- { "NumberForms", 0x2150, 0x218F },
- { "Ogham", 0x1680, 0x169F },
- { "OldItalic", 0x10300, 0x1032F },
- { "OldPersian", 0x103A0, 0x103DF },
- { "OpticalCharacterRecognition", 0x2440, 0x245F },
- { "Oriya", 0x0B00, 0x0B7F },
- { "Osmanya", 0x10480, 0x104AF },
- { "PhoneticExtensions", 0x1D00, 0x1D7F },
- { "PhoneticExtensionsSupplement", 0x1D80, 0x1DBF },
- { "PrivateUse", 0xE000, 0xF8FF },
- { "Runic", 0x16A0, 0x16FF },
- { "Shavian", 0x10450, 0x1047F },
- { "Sinhala", 0x0D80, 0x0DFF },
- { "SmallFormVariants", 0xFE50, 0xFE6F },
- { "SpacingModifierLetters", 0x02B0, 0x02FF },
- { "Specials", 0xFFF0, 0xFFFF },
- { "SuperscriptsandSubscripts", 0x2070, 0x209F },
- { "SupplementalArrows-A", 0x27F0, 0x27FF },
- { "SupplementalArrows-B", 0x2900, 0x297F },
- { "SupplementalMathematicalOperators", 0x2A00, 0x2AFF },
- { "SupplementalPunctuation", 0x2E00, 0x2E7F },
- { "SupplementaryPrivateUseArea-A", 0xF0000, 0xFFFFF },
- { "SupplementaryPrivateUseArea-B", 0x100000, 0x10FFFF },
- { "SylotiNagri", 0xA800, 0xA82F },
- { "Syriac", 0x0700, 0x074F },
- { "Tagalog", 0x1700, 0x171F },
- { "Tagbanwa", 0x1760, 0x177F },
- { "Tags", 0xE0000, 0xE007F },
- { "TaiLe", 0x1950, 0x197F },
- { "TaiXuanJingSymbols", 0x1D300, 0x1D35F },
- { "Tamil", 0x0B80, 0x0BFF },
- { "Telugu", 0x0C00, 0x0C7F },
- { "Thaana", 0x0780, 0x07BF },
- { "Thai", 0x0E00, 0x0E7F },
- { "Tibetan", 0x0F00, 0x0FFF },
- { "Tifinagh", 0x2D30, 0x2D7F },
- { "Ugaritic", 0x10380, 0x1039F },
- { "UnifiedCanadianAboriginalSyllabics", 0x1400, 0x167F },
- { "VariationSelectors", 0xFE00, 0xFE0F },
- { "VariationSelectorsSupplement", 0xE0100, 0xE01EF },
- { "VerticalForms", 0xFE10, 0xFE1F },
- { "YiRadicals", 0xA490, 0xA4CF },
- { "YiSyllables", 0xA000, 0xA48F },
- { "YijingHexagramSymbols", 0x4DC0, 0x4DFF }
-};
-
-inline bool operator<(const CategoriesRangeMapEntry &entry1, const CategoriesRangeMapEntry &entry2)
-{ return qstrcmp(entry1.name, entry2.name) < 0; }
-inline bool operator<(const char *name, const CategoriesRangeMapEntry &entry)
-{ return qstrcmp(name, entry.name) < 0; }
-inline bool operator<(const CategoriesRangeMapEntry &entry, const char *name)
-{ return qstrcmp(entry.name, name) < 0; }
-#endif // QT_NO_REGEXP_CCLASS
-
-int QRegExpEngine::getChar()
-{
- return (yyPos == yyLen) ? EOS : yyIn[yyPos++].unicode();
-}
-
-int QRegExpEngine::getEscape()
-{
-#ifndef QT_NO_REGEXP_ESCAPE
- const char tab[] = "afnrtv"; // no b, as \b means word boundary
- const char backTab[] = "\a\f\n\r\t\v";
- ushort low;
- int i;
-#endif
- ushort val;
- int prevCh = yyCh;
-
- if (prevCh == EOS) {
- error(RXERR_END);
- return Tok_Char | '\\';
- }
- yyCh = getChar();
-#ifndef QT_NO_REGEXP_ESCAPE
- if ((prevCh & ~0xff) == 0) {
- const char *p = strchr(tab, prevCh);
- if (p != 0)
- return Tok_Char | backTab[p - tab];
- }
-#endif
-
- switch (prevCh) {
-#ifndef QT_NO_REGEXP_ESCAPE
- case '0':
- val = 0;
- for (i = 0; i < 3; i++) {
- if (yyCh >= '0' && yyCh <= '7')
- val = (val << 3) | (yyCh - '0');
- else
- break;
- yyCh = getChar();
- }
- if ((val & ~0377) != 0)
- error(RXERR_OCTAL);
- return Tok_Char | val;
-#endif
-#ifndef QT_NO_REGEXP_ESCAPE
- case 'B':
- return Tok_NonWord;
-#endif
-#ifndef QT_NO_REGEXP_CCLASS
- case 'D':
- // see QChar::isDigit()
- yyCharClass->addCategories(uint(-1) ^ FLAG(QChar::Number_DecimalDigit));
- return Tok_CharClass;
- case 'S':
- // see QChar::isSpace()
- yyCharClass->addCategories(uint(-1) ^ (FLAG(QChar::Separator_Space) |
- FLAG(QChar::Separator_Line) |
- FLAG(QChar::Separator_Paragraph) |
- FLAG(QChar::Other_Control)));
- yyCharClass->addRange(0x0000, 0x0008);
- yyCharClass->addRange(0x000e, 0x001f);
- yyCharClass->addRange(0x007f, 0x0084);
- yyCharClass->addRange(0x0086, 0x009f);
- return Tok_CharClass;
- case 'W':
- // see QChar::isLetterOrNumber() and QChar::isMark()
- yyCharClass->addCategories(uint(-1) ^ (FLAG(QChar::Mark_NonSpacing) |
- FLAG(QChar::Mark_SpacingCombining) |
- FLAG(QChar::Mark_Enclosing) |
- FLAG(QChar::Number_DecimalDigit) |
- FLAG(QChar::Number_Letter) |
- FLAG(QChar::Number_Other) |
- FLAG(QChar::Letter_Uppercase) |
- FLAG(QChar::Letter_Lowercase) |
- FLAG(QChar::Letter_Titlecase) |
- FLAG(QChar::Letter_Modifier) |
- FLAG(QChar::Letter_Other) |
- FLAG(QChar::Punctuation_Connector)));
- yyCharClass->addRange(0x203f, 0x2040);
- yyCharClass->addSingleton(0x2040);
- yyCharClass->addSingleton(0x2054);
- yyCharClass->addSingleton(0x30fb);
- yyCharClass->addRange(0xfe33, 0xfe34);
- yyCharClass->addRange(0xfe4d, 0xfe4f);
- yyCharClass->addSingleton(0xff3f);
- yyCharClass->addSingleton(0xff65);
- return Tok_CharClass;
-#endif
-#ifndef QT_NO_REGEXP_ESCAPE
- case 'b':
- return Tok_Word;
-#endif
-#ifndef QT_NO_REGEXP_CCLASS
- case 'd':
- // see QChar::isDigit()
- yyCharClass->addCategories(FLAG(QChar::Number_DecimalDigit));
- return Tok_CharClass;
- case 's':
- // see QChar::isSpace()
- yyCharClass->addCategories(FLAG(QChar::Separator_Space) |
- FLAG(QChar::Separator_Line) |
- FLAG(QChar::Separator_Paragraph));
- yyCharClass->addRange(0x0009, 0x000d);
- yyCharClass->addSingleton(0x0085);
- return Tok_CharClass;
- case 'w':
- // see QChar::isLetterOrNumber() and QChar::isMark()
- yyCharClass->addCategories(FLAG(QChar::Mark_NonSpacing) |
- FLAG(QChar::Mark_SpacingCombining) |
- FLAG(QChar::Mark_Enclosing) |
- FLAG(QChar::Number_DecimalDigit) |
- FLAG(QChar::Number_Letter) |
- FLAG(QChar::Number_Other) |
- FLAG(QChar::Letter_Uppercase) |
- FLAG(QChar::Letter_Lowercase) |
- FLAG(QChar::Letter_Titlecase) |
- FLAG(QChar::Letter_Modifier) |
- FLAG(QChar::Letter_Other));
- yyCharClass->addSingleton(0x005f); // '_'
- return Tok_CharClass;
- case 'I':
- if (!xmlSchemaExtensions)
- break;
- yyCharClass->setNegative(!yyCharClass->negative());
- Q_FALLTHROUGH();
- case 'i':
- if (xmlSchemaExtensions) {
- yyCharClass->addCategories(FLAG(QChar::Mark_NonSpacing) |
- FLAG(QChar::Mark_SpacingCombining) |
- FLAG(QChar::Mark_Enclosing) |
- FLAG(QChar::Number_DecimalDigit) |
- FLAG(QChar::Number_Letter) |
- FLAG(QChar::Number_Other) |
- FLAG(QChar::Letter_Uppercase) |
- FLAG(QChar::Letter_Lowercase) |
- FLAG(QChar::Letter_Titlecase) |
- FLAG(QChar::Letter_Modifier) |
- FLAG(QChar::Letter_Other));
- yyCharClass->addSingleton(0x003a); // ':'
- yyCharClass->addSingleton(0x005f); // '_'
- yyCharClass->addRange(0x0041, 0x005a); // [A-Z]
- yyCharClass->addRange(0x0061, 0x007a); // [a-z]
- yyCharClass->addRange(0xc0, 0xd6);
- yyCharClass->addRange(0xd8, 0xf6);
- yyCharClass->addRange(0xf8, 0x2ff);
- yyCharClass->addRange(0x370, 0x37d);
- yyCharClass->addRange(0x37f, 0x1fff);
- yyCharClass->addRange(0x200c, 0x200d);
- yyCharClass->addRange(0x2070, 0x218f);
- yyCharClass->addRange(0x2c00, 0x2fef);
- yyCharClass->addRange(0x3001, 0xd7ff);
- yyCharClass->addRange(0xf900, 0xfdcf);
- yyCharClass->addRange(0xfdf0, 0xfffd);
- yyCharClass->addRange((ushort)0x10000, (ushort)0xeffff);
- return Tok_CharClass;
- } else {
- break;
- }
- case 'C':
- if (!xmlSchemaExtensions)
- break;
- yyCharClass->setNegative(!yyCharClass->negative());
- Q_FALLTHROUGH();
- case 'c':
- if (xmlSchemaExtensions) {
- yyCharClass->addCategories(FLAG(QChar::Mark_NonSpacing) |
- FLAG(QChar::Mark_SpacingCombining) |
- FLAG(QChar::Mark_Enclosing) |
- FLAG(QChar::Number_DecimalDigit) |
- FLAG(QChar::Number_Letter) |
- FLAG(QChar::Number_Other) |
- FLAG(QChar::Letter_Uppercase) |
- FLAG(QChar::Letter_Lowercase) |
- FLAG(QChar::Letter_Titlecase) |
- FLAG(QChar::Letter_Modifier) |
- FLAG(QChar::Letter_Other));
- yyCharClass->addSingleton(0x002d); // '-'
- yyCharClass->addSingleton(0x002e); // '.'
- yyCharClass->addSingleton(0x003a); // ':'
- yyCharClass->addSingleton(0x005f); // '_'
- yyCharClass->addSingleton(0xb7);
- yyCharClass->addRange(0x0030, 0x0039); // [0-9]
- yyCharClass->addRange(0x0041, 0x005a); // [A-Z]
- yyCharClass->addRange(0x0061, 0x007a); // [a-z]
- yyCharClass->addRange(0xc0, 0xd6);
- yyCharClass->addRange(0xd8, 0xf6);
- yyCharClass->addRange(0xf8, 0x2ff);
- yyCharClass->addRange(0x370, 0x37d);
- yyCharClass->addRange(0x37f, 0x1fff);
- yyCharClass->addRange(0x200c, 0x200d);
- yyCharClass->addRange(0x2070, 0x218f);
- yyCharClass->addRange(0x2c00, 0x2fef);
- yyCharClass->addRange(0x3001, 0xd7ff);
- yyCharClass->addRange(0xf900, 0xfdcf);
- yyCharClass->addRange(0xfdf0, 0xfffd);
- yyCharClass->addRange((ushort)0x10000, (ushort)0xeffff);
- yyCharClass->addRange(0x0300, 0x036f);
- yyCharClass->addRange(0x203f, 0x2040);
- return Tok_CharClass;
- } else {
- break;
- }
- case 'P':
- if (!xmlSchemaExtensions)
- break;
- yyCharClass->setNegative(!yyCharClass->negative());
- Q_FALLTHROUGH();
- case 'p':
- if (xmlSchemaExtensions) {
- if (yyCh != '{') {
- error(RXERR_CHARCLASS);
- return Tok_CharClass;
- }
-
- QByteArray category;
- yyCh = getChar();
- while (yyCh != '}') {
- if (yyCh == EOS) {
- error(RXERR_END);
- return Tok_CharClass;
- }
- category.append(yyCh);
- yyCh = getChar();
- }
- yyCh = getChar(); // skip closing '}'
-
- int catlen = category.length();
- if (catlen == 1 || catlen == 2) {
- switch (category.at(0)) {
- case 'M':
- if (catlen == 1) {
- yyCharClass->addCategories(FLAG(QChar::Mark_NonSpacing) |
- FLAG(QChar::Mark_SpacingCombining) |
- FLAG(QChar::Mark_Enclosing));
- } else {
- switch (category.at(1)) {
- case 'n': yyCharClass->addCategories(FLAG(QChar::Mark_NonSpacing)); break; // Mn
- case 'c': yyCharClass->addCategories(FLAG(QChar::Mark_SpacingCombining)); break; // Mc
- case 'e': yyCharClass->addCategories(FLAG(QChar::Mark_Enclosing)); break; // Me
- default: error(RXERR_CATEGORY); break;
- }
- }
- break;
- case 'N':
- if (catlen == 1) {
- yyCharClass->addCategories(FLAG(QChar::Number_DecimalDigit) |
- FLAG(QChar::Number_Letter) |
- FLAG(QChar::Number_Other));
- } else {
- switch (category.at(1)) {
- case 'd': yyCharClass->addCategories(FLAG(QChar::Number_DecimalDigit)); break; // Nd
- case 'l': yyCharClass->addCategories(FLAG(QChar::Number_Letter)); break; // Hl
- case 'o': yyCharClass->addCategories(FLAG(QChar::Number_Other)); break; // No
- default: error(RXERR_CATEGORY); break;
- }
- }
- break;
- case 'Z':
- if (catlen == 1) {
- yyCharClass->addCategories(FLAG(QChar::Separator_Space) |
- FLAG(QChar::Separator_Line) |
- FLAG(QChar::Separator_Paragraph));
- } else {
- switch (category.at(1)) {
- case 's': yyCharClass->addCategories(FLAG(QChar::Separator_Space)); break; // Zs
- case 'l': yyCharClass->addCategories(FLAG(QChar::Separator_Line)); break; // Zl
- case 'p': yyCharClass->addCategories(FLAG(QChar::Separator_Paragraph)); break; // Zp
- default: error(RXERR_CATEGORY); break;
- }
- }
- break;
- case 'C':
- if (catlen == 1) {
- yyCharClass->addCategories(FLAG(QChar::Other_Control) |
- FLAG(QChar::Other_Format) |
- FLAG(QChar::Other_Surrogate) |
- FLAG(QChar::Other_PrivateUse) |
- FLAG(QChar::Other_NotAssigned));
- } else {
- switch (category.at(1)) {
- case 'c': yyCharClass->addCategories(FLAG(QChar::Other_Control)); break; // Cc
- case 'f': yyCharClass->addCategories(FLAG(QChar::Other_Format)); break; // Cf
- case 's': yyCharClass->addCategories(FLAG(QChar::Other_Surrogate)); break; // Cs
- case 'o': yyCharClass->addCategories(FLAG(QChar::Other_PrivateUse)); break; // Co
- case 'n': yyCharClass->addCategories(FLAG(QChar::Other_NotAssigned)); break; // Cn
- default: error(RXERR_CATEGORY); break;
- }
- }
- break;
- case 'L':
- if (catlen == 1) {
- yyCharClass->addCategories(FLAG(QChar::Letter_Uppercase) |
- FLAG(QChar::Letter_Lowercase) |
- FLAG(QChar::Letter_Titlecase) |
- FLAG(QChar::Letter_Modifier) |
- FLAG(QChar::Letter_Other));
- } else {
- switch (category.at(1)) {
- case 'u': yyCharClass->addCategories(FLAG(QChar::Letter_Uppercase)); break; // Lu
- case 'l': yyCharClass->addCategories(FLAG(QChar::Letter_Lowercase)); break; // Ll
- case 't': yyCharClass->addCategories(FLAG(QChar::Letter_Titlecase)); break; // Lt
- case 'm': yyCharClass->addCategories(FLAG(QChar::Letter_Modifier)); break; // Lm
- case 'o': yyCharClass->addCategories(FLAG(QChar::Letter_Other)); break; // Lo
- default: error(RXERR_CATEGORY); break;
- }
- }
- break;
- case 'P':
- if (catlen == 1) {
- yyCharClass->addCategories(FLAG(QChar::Punctuation_Connector) |
- FLAG(QChar::Punctuation_Dash) |
- FLAG(QChar::Punctuation_Open) |
- FLAG(QChar::Punctuation_Close) |
- FLAG(QChar::Punctuation_InitialQuote) |
- FLAG(QChar::Punctuation_FinalQuote) |
- FLAG(QChar::Punctuation_Other));
- } else {
- switch (category.at(1)) {
- case 'c': yyCharClass->addCategories(FLAG(QChar::Punctuation_Connector)); break; // Pc
- case 'd': yyCharClass->addCategories(FLAG(QChar::Punctuation_Dash)); break; // Pd
- case 's': yyCharClass->addCategories(FLAG(QChar::Punctuation_Open)); break; // Ps
- case 'e': yyCharClass->addCategories(FLAG(QChar::Punctuation_Close)); break; // Pe
- case 'i': yyCharClass->addCategories(FLAG(QChar::Punctuation_InitialQuote)); break; // Pi
- case 'f': yyCharClass->addCategories(FLAG(QChar::Punctuation_FinalQuote)); break; // Pf
- case 'o': yyCharClass->addCategories(FLAG(QChar::Punctuation_Other)); break; // Po
- default: error(RXERR_CATEGORY); break;
- }
- }
- break;
- case 'S':
- if (catlen == 1) {
- yyCharClass->addCategories(FLAG(QChar::Symbol_Math) |
- FLAG(QChar::Symbol_Currency) |
- FLAG(QChar::Symbol_Modifier) |
- FLAG(QChar::Symbol_Other));
- } else {
- switch (category.at(1)) {
- case 'm': yyCharClass->addCategories(FLAG(QChar::Symbol_Math)); break; // Sm
- case 'c': yyCharClass->addCategories(FLAG(QChar::Symbol_Currency)); break; // Sc
- case 'k': yyCharClass->addCategories(FLAG(QChar::Symbol_Modifier)); break; // Sk
- case 'o': yyCharClass->addCategories(FLAG(QChar::Symbol_Other)); break; // So
- default: error(RXERR_CATEGORY); break;
- }
- }
- break;
- default:
- error(RXERR_CATEGORY);
- break;
- }
- } else if (catlen > 2 && category.at(0) == 'I' && category.at(1) == 's') {
- static const int N = sizeof(categoriesRangeMap) / sizeof(categoriesRangeMap[0]);
- const char * const categoryFamily = category.constData() + 2;
- const CategoriesRangeMapEntry *r = std::lower_bound(categoriesRangeMap, categoriesRangeMap + N, categoryFamily);
- if (r != categoriesRangeMap + N && qstrcmp(r->name, categoryFamily) == 0)
- yyCharClass->addRange(r->first, r->second);
- else
- error(RXERR_CATEGORY);
- } else {
- error(RXERR_CATEGORY);
- }
- return Tok_CharClass;
- } else {
- break;
- }
-#endif
-#ifndef QT_NO_REGEXP_ESCAPE
- case 'x':
- val = 0;
- for (i = 0; i < 4; i++) {
- low = QChar(yyCh).toLower().unicode();
- if (low >= '0' && low <= '9')
- val = (val << 4) | (low - '0');
- else if (low >= 'a' && low <= 'f')
- val = (val << 4) | (low - 'a' + 10);
- else
- break;
- yyCh = getChar();
- }
- return Tok_Char | val;
-#endif
- default:
- break;
- }
- if (prevCh >= '1' && prevCh <= '9') {
-#ifndef QT_NO_REGEXP_BACKREF
- val = prevCh - '0';
- while (yyCh >= '0' && yyCh <= '9') {
- val = (val * 10) + (yyCh - '0');
- yyCh = getChar();
- }
- return Tok_BackRef | val;
-#else
- error(RXERR_DISABLED);
-#endif
- }
- return Tok_Char | prevCh;
-}
-
-#ifndef QT_NO_REGEXP_INTERVAL
-int QRegExpEngine::getRep(int def)
-{
- if (yyCh >= '0' && yyCh <= '9') {
- int rep = 0;
- do {
- rep = 10 * rep + yyCh - '0';
- if (rep >= InftyRep) {
- error(RXERR_REPETITION);
- rep = def;
- }
- yyCh = getChar();
- } while (yyCh >= '0' && yyCh <= '9');
- return rep;
- } else {
- return def;
- }
-}
-#endif
-
-#ifndef QT_NO_REGEXP_LOOKAHEAD
-void QRegExpEngine::skipChars(int n)
-{
- if (n > 0) {
- yyPos += n - 1;
- yyCh = getChar();
- }
-}
-#endif
-
-void QRegExpEngine::error(const char *msg)
-{
- if (yyError.isEmpty())
- yyError = QLatin1String(msg);
-}
-
-void QRegExpEngine::startTokenizer(const QChar *rx, int len)
-{
- yyIn = rx;
- yyPos0 = 0;
- yyPos = 0;
- yyLen = len;
- yyCh = getChar();
- yyCharClass.reset(new QRegExpCharClass);
- yyMinRep = 0;
- yyMaxRep = 0;
- yyError = QString();
-}
-
-int QRegExpEngine::getToken()
-{
-#ifndef QT_NO_REGEXP_CCLASS
- ushort pendingCh = 0;
- bool charPending;
- bool rangePending;
- int tok;
-#endif
- int prevCh = yyCh;
-
- yyPos0 = yyPos - 1;
-#ifndef QT_NO_REGEXP_CCLASS
- yyCharClass->clear();
-#endif
- yyMinRep = 0;
- yyMaxRep = 0;
- yyCh = getChar();
-
- switch (prevCh) {
- case EOS:
- yyPos0 = yyPos;
- return Tok_Eos;
- case '$':
- return Tok_Dollar;
- case '(':
- if (yyCh == '?') {
- prevCh = getChar();
- yyCh = getChar();
- switch (prevCh) {
-#ifndef QT_NO_REGEXP_LOOKAHEAD
- case '!':
- return Tok_NegLookahead;
- case '=':
- return Tok_PosLookahead;
-#endif
- case ':':
- return Tok_MagicLeftParen;
- case '<':
- error(RXERR_LOOKBEHIND);
- return Tok_MagicLeftParen;
- default:
- error(RXERR_LOOKAHEAD);
- return Tok_MagicLeftParen;
- }
- } else {
- return Tok_LeftParen;
- }
- case ')':
- return Tok_RightParen;
- case '*':
- yyMinRep = 0;
- yyMaxRep = InftyRep;
- return Tok_Quantifier;
- case '+':
- yyMinRep = 1;
- yyMaxRep = InftyRep;
- return Tok_Quantifier;
- case '.':
-#ifndef QT_NO_REGEXP_CCLASS
- yyCharClass->setNegative(true);
-#endif
- return Tok_CharClass;
- case '?':
- yyMinRep = 0;
- yyMaxRep = 1;
- return Tok_Quantifier;
- case '[':
-#ifndef QT_NO_REGEXP_CCLASS
- if (yyCh == '^') {
- yyCharClass->setNegative(true);
- yyCh = getChar();
- }
- charPending = false;
- rangePending = false;
- do {
- if (yyCh == '-' && charPending && !rangePending) {
- rangePending = true;
- yyCh = getChar();
- } else {
- if (charPending && !rangePending) {
- yyCharClass->addSingleton(pendingCh);
- charPending = false;
- }
- if (yyCh == '\\') {
- yyCh = getChar();
- tok = getEscape();
- if (tok == Tok_Word)
- tok = '\b';
- } else {
- tok = Tok_Char | yyCh;
- yyCh = getChar();
- }
- if (tok == Tok_CharClass) {
- if (rangePending) {
- yyCharClass->addSingleton('-');
- yyCharClass->addSingleton(pendingCh);
- charPending = false;
- rangePending = false;
- }
- } else if ((tok & Tok_Char) != 0) {
- if (rangePending) {
- yyCharClass->addRange(pendingCh, tok ^ Tok_Char);
- charPending = false;
- rangePending = false;
- } else {
- pendingCh = tok ^ Tok_Char;
- charPending = true;
- }
- } else {
- error(RXERR_CHARCLASS);
- }
- }
- } while (yyCh != ']' && yyCh != EOS);
- if (rangePending)
- yyCharClass->addSingleton('-');
- if (charPending)
- yyCharClass->addSingleton(pendingCh);
- if (yyCh == EOS)
- error(RXERR_END);
- else
- yyCh = getChar();
- return Tok_CharClass;
-#else
- error(RXERR_END);
- return Tok_Char | '[';
-#endif
- case '\\':
- return getEscape();
- case ']':
- error(RXERR_LEFTDELIM);
- return Tok_Char | ']';
- case '^':
- return Tok_Caret;
- case '{':
-#ifndef QT_NO_REGEXP_INTERVAL
- yyMinRep = getRep(0);
- yyMaxRep = yyMinRep;
- if (yyCh == ',') {
- yyCh = getChar();
- yyMaxRep = getRep(InftyRep);
- }
- if (yyMaxRep < yyMinRep)
- error(RXERR_INTERVAL);
- if (yyCh != '}')
- error(RXERR_REPETITION);
- yyCh = getChar();
- return Tok_Quantifier;
-#else
- error(RXERR_DISABLED);
- return Tok_Char | '{';
-#endif
- case '|':
- return Tok_Bar;
- case '}':
- error(RXERR_LEFTDELIM);
- return Tok_Char | '}';
- default:
- return Tok_Char | prevCh;
- }
-}
-
-int QRegExpEngine::parse(const QChar *pattern, int len)
-{
- valid = true;
- startTokenizer(pattern, len);
- yyTok = getToken();
-#ifndef QT_NO_REGEXP_CAPTURE
- yyMayCapture = true;
-#else
- yyMayCapture = false;
-#endif
-
-#ifndef QT_NO_REGEXP_CAPTURE
- int atom = startAtom(false);
-#endif
- QRegExpCharClass anything;
- Box box(this); // create InitialState
- box.set(anything);
- Box rightBox(this); // create FinalState
- rightBox.set(anything);
-
- Box middleBox(this);
- parseExpression(&middleBox);
-#ifndef QT_NO_REGEXP_CAPTURE
- finishAtom(atom, false);
-#endif
-#ifndef QT_NO_REGEXP_OPTIM
- middleBox.setupHeuristics();
-#endif
- box.cat(middleBox);
- box.cat(rightBox);
- yyCharClass.reset(0);
-
-#ifndef QT_NO_REGEXP_CAPTURE
- for (int i = 0; i < nf; ++i) {
- switch (f[i].capture) {
- case QRegExpAtom::NoCapture:
- break;
- case QRegExpAtom::OfficialCapture:
- f[i].capture = ncap;
- captureForOfficialCapture.append(ncap);
- ++ncap;
- ++officialncap;
- break;
- case QRegExpAtom::UnofficialCapture:
- f[i].capture = greedyQuantifiers ? ncap++ : QRegExpAtom::NoCapture;
- }
- }
-
-#ifndef QT_NO_REGEXP_BACKREF
-#ifndef QT_NO_REGEXP_OPTIM
- if (officialncap == 0 && nbrefs == 0) {
- ncap = nf = 0;
- f.clear();
- }
-#endif
- // handle the case where there's a \5 with no corresponding capture
- // (captureForOfficialCapture.size() != officialncap)
- for (int i = 0; i < nbrefs - officialncap; ++i) {
- captureForOfficialCapture.append(ncap);
- ++ncap;
- }
-#endif
-#endif
-
- if (!yyError.isEmpty())
- return -1;
-
-#ifndef QT_NO_REGEXP_OPTIM
- const QRegExpAutomatonState &sinit = s.at(InitialState);
- caretAnchored = !sinit.anchors.isEmpty();
- if (caretAnchored) {
- const QMap<int, int> &anchors = sinit.anchors;
- QMap<int, int>::const_iterator a;
- for (a = anchors.constBegin(); a != anchors.constEnd(); ++a) {
- if (
-#ifndef QT_NO_REGEXP_ANCHOR_ALT
- (*a & Anchor_Alternation) != 0 ||
-#endif
- (*a & Anchor_Caret) == 0)
- {
- caretAnchored = false;
- break;
- }
- }
- }
-#endif
-
- // cleanup anchors
- int numStates = s.count();
- for (int i = 0; i < numStates; ++i) {
- QRegExpAutomatonState &state = s[i];
- if (!state.anchors.isEmpty()) {
- QMap<int, int>::iterator a = state.anchors.begin();
- while (a != state.anchors.end()) {
- if (a.value() == 0)
- a = state.anchors.erase(a);
- else
- ++a;
- }
- }
- }
-
- return yyPos0;
-}
-
-void QRegExpEngine::parseAtom(Box *box)
-{
-#ifndef QT_NO_REGEXP_LOOKAHEAD
- QRegExpEngine *eng = 0;
- bool neg;
- int len;
-#endif
-
- if ((yyTok & Tok_Char) != 0) {
- box->set(QChar(yyTok ^ Tok_Char));
- } else {
-#ifndef QT_NO_REGEXP_OPTIM
- trivial = false;
-#endif
- switch (yyTok) {
- case Tok_Dollar:
- box->catAnchor(Anchor_Dollar);
- break;
- case Tok_Caret:
- box->catAnchor(Anchor_Caret);
- break;
-#ifndef QT_NO_REGEXP_LOOKAHEAD
- case Tok_PosLookahead:
- case Tok_NegLookahead:
- neg = (yyTok == Tok_NegLookahead);
- eng = new QRegExpEngine(cs, greedyQuantifiers);
- len = eng->parse(yyIn + yyPos - 1, yyLen - yyPos + 1);
- if (len >= 0)
- skipChars(len);
- else
- error(RXERR_LOOKAHEAD);
- box->catAnchor(addLookahead(eng, neg));
- yyTok = getToken();
- if (yyTok != Tok_RightParen)
- error(RXERR_LOOKAHEAD);
- break;
-#endif
-#ifndef QT_NO_REGEXP_ESCAPE
- case Tok_Word:
- box->catAnchor(Anchor_Word);
- break;
- case Tok_NonWord:
- box->catAnchor(Anchor_NonWord);
- break;
-#endif
- case Tok_LeftParen:
- case Tok_MagicLeftParen:
- yyTok = getToken();
- parseExpression(box);
- if (yyTok != Tok_RightParen)
- error(RXERR_END);
- break;
- case Tok_CharClass:
- box->set(*yyCharClass);
- break;
- case Tok_Quantifier:
- error(RXERR_REPETITION);
- break;
- default:
-#ifndef QT_NO_REGEXP_BACKREF
- if ((yyTok & Tok_BackRef) != 0)
- box->set(yyTok ^ Tok_BackRef);
- else
-#endif
- error(RXERR_DISABLED);
- }
- }
- yyTok = getToken();
-}
-
-void QRegExpEngine::parseFactor(Box *box)
-{
-#ifndef QT_NO_REGEXP_CAPTURE
- int outerAtom = greedyQuantifiers ? startAtom(false) : -1;
- int innerAtom = startAtom(yyMayCapture && yyTok == Tok_LeftParen);
- bool magicLeftParen = (yyTok == Tok_MagicLeftParen);
-#else
- const int innerAtom = -1;
-#endif
-
-#ifndef QT_NO_REGEXP_INTERVAL
-#define YYREDO() \
- yyIn = in, yyPos0 = pos0, yyPos = pos, yyLen = len, yyCh = ch, \
- *yyCharClass = charClass, yyMinRep = 0, yyMaxRep = 0, yyTok = tok
-
- const QChar *in = yyIn;
- int pos0 = yyPos0;
- int pos = yyPos;
- int len = yyLen;
- int ch = yyCh;
- QRegExpCharClass charClass;
- if (yyTok == Tok_CharClass)
- charClass = *yyCharClass;
- int tok = yyTok;
- bool mayCapture = yyMayCapture;
-#endif
-
- parseAtom(box);
-#ifndef QT_NO_REGEXP_CAPTURE
- finishAtom(innerAtom, magicLeftParen);
-#endif
-
- bool hasQuantifier = (yyTok == Tok_Quantifier);
- if (hasQuantifier) {
-#ifndef QT_NO_REGEXP_OPTIM
- trivial = false;
-#endif
- if (yyMaxRep == InftyRep) {
- box->plus(innerAtom);
-#ifndef QT_NO_REGEXP_INTERVAL
- } else if (yyMaxRep == 0) {
- box->clear();
-#endif
- }
- if (yyMinRep == 0)
- box->opt();
-
-#ifndef QT_NO_REGEXP_INTERVAL
- yyMayCapture = false;
- int alpha = (yyMinRep == 0) ? 0 : yyMinRep - 1;
- int beta = (yyMaxRep == InftyRep) ? 0 : yyMaxRep - (alpha + 1);
-
- Box rightBox(this);
- int i;
-
- for (i = 0; i < beta; i++) {
- YYREDO();
- Box leftBox(this);
- parseAtom(&leftBox);
- leftBox.cat(rightBox);
- leftBox.opt();
- rightBox = leftBox;
- }
- for (i = 0; i < alpha; i++) {
- YYREDO();
- Box leftBox(this);
- parseAtom(&leftBox);
- leftBox.cat(rightBox);
- rightBox = leftBox;
- }
- rightBox.cat(*box);
- *box = rightBox;
-#endif
- yyTok = getToken();
-#ifndef QT_NO_REGEXP_INTERVAL
- yyMayCapture = mayCapture;
-#endif
- }
-#undef YYREDO
-#ifndef QT_NO_REGEXP_CAPTURE
- if (greedyQuantifiers)
- finishAtom(outerAtom, hasQuantifier);
-#endif
-}
-
-void QRegExpEngine::parseTerm(Box *box)
-{
-#ifndef QT_NO_REGEXP_OPTIM
- if (yyTok != Tok_Eos && yyTok != Tok_RightParen && yyTok != Tok_Bar)
- parseFactor(box);
-#endif
- while (yyTok != Tok_Eos && yyTok != Tok_RightParen && yyTok != Tok_Bar) {
- Box rightBox(this);
- parseFactor(&rightBox);
- box->cat(rightBox);
- }
-}
-
-void QRegExpEngine::parseExpression(Box *box)
-{
- parseTerm(box);
- while (yyTok == Tok_Bar) {
-#ifndef QT_NO_REGEXP_OPTIM
- trivial = false;
-#endif
- Box rightBox(this);
- yyTok = getToken();
- parseTerm(&rightBox);
- box->orx(rightBox);
- }
-}
-
-/*
- The struct QRegExpPrivate contains the private data of a regular
- expression other than the automaton. It makes it possible for many
- QRegExp objects to use the same QRegExpEngine object with different
- QRegExpPrivate objects.
-*/
-struct QRegExpPrivate
-{
- QRegExpEngine *eng;
- QRegExpEngineKey engineKey;
- bool minimal;
-#ifndef QT_NO_REGEXP_CAPTURE
- QString t; // last string passed to QRegExp::indexIn() or lastIndexIn()
- QStringList capturedCache; // what QRegExp::capturedTexts() returned last
-#endif
- QRegExpMatchState matchState;
-
- inline QRegExpPrivate()
- : eng(0), engineKey(QString(), QRegExp::RegExp, Qt::CaseSensitive), minimal(false) { }
- inline QRegExpPrivate(const QRegExpEngineKey &key)
- : eng(0), engineKey(key), minimal(false) {}
-};
-
-#if !defined(QT_NO_REGEXP_OPTIM)
-struct QRECache
-{
- typedef QHash<QRegExpEngineKey, QRegExpEngine *> EngineCache;
- typedef QCache<QRegExpEngineKey, QRegExpEngine> UnusedEngineCache;
- EngineCache usedEngines;
- UnusedEngineCache unusedEngines;
-};
-Q_GLOBAL_STATIC(QRECache, engineCache)
-static QBasicMutex engineCacheMutex;
-#endif // QT_NO_REGEXP_OPTIM
-
-static void derefEngine(QRegExpEngine *eng, const QRegExpEngineKey &key)
-{
-#if !defined(QT_NO_REGEXP_OPTIM)
- QMutexLocker locker(&engineCacheMutex);
- if (!eng->ref.deref()) {
- if (QRECache *c = engineCache()) {
- c->unusedEngines.insert(key, eng, 4 + key.pattern.length() / 4);
- c->usedEngines.remove(key);
- } else {
- delete eng;
- }
- }
-#else
- Q_UNUSED(key);
- if (!eng->ref.deref())
- delete eng;
-#endif
-}
-
-static void prepareEngine_helper(QRegExpPrivate *priv)
-{
- Q_ASSERT(!priv->eng);
-
-#if !defined(QT_NO_REGEXP_OPTIM)
- QMutexLocker locker(&engineCacheMutex);
- if (QRECache *c = engineCache()) {
- priv->eng = c->unusedEngines.take(priv->engineKey);
- if (!priv->eng)
- priv->eng = c->usedEngines.value(priv->engineKey);
- if (!priv->eng)
- priv->eng = new QRegExpEngine(priv->engineKey);
- else
- priv->eng->ref.ref();
-
- c->usedEngines.insert(priv->engineKey, priv->eng);
- return;
- }
-#endif // QT_NO_REGEXP_OPTIM
-
- priv->eng = new QRegExpEngine(priv->engineKey);
-}
-
-inline static void prepareEngine(QRegExpPrivate *priv)
-{
- if (priv->eng)
- return;
- prepareEngine_helper(priv);
- priv->matchState.prepareForMatch(priv->eng);
-}
-
-static void prepareEngineForMatch(QRegExpPrivate *priv, const QString &str)
-{
- prepareEngine(priv);
- priv->matchState.prepareForMatch(priv->eng);
-#ifndef QT_NO_REGEXP_CAPTURE
- priv->t = str;
- priv->capturedCache.clear();
-#else
- Q_UNUSED(str);
-#endif
-}
-
-static void invalidateEngine(QRegExpPrivate *priv)
-{
- if (priv->eng != 0) {
- derefEngine(priv->eng, priv->engineKey);
- priv->eng = 0;
- priv->matchState.drain();
- }
-}
-
-/*!
- \enum QRegExp::CaretMode
-
- The CaretMode enum defines the different meanings of the caret
- (\b{^}) in a regular expression. The possible values are:
-
- \value CaretAtZero
- The caret corresponds to index 0 in the searched string.
-
- \value CaretAtOffset
- The caret corresponds to the start offset of the search.
-
- \value CaretWontMatch
- The caret never matches.
-*/
-
-/*!
- \enum QRegExp::PatternSyntax
-
- The syntax used to interpret the meaning of the pattern.
-
- \value RegExp A rich Perl-like pattern matching syntax. This is
- the default.
-
- \value RegExp2 Like RegExp, but with \l{greedy quantifiers}.
- (Introduced in Qt 4.2.)
-
- \value Wildcard This provides a simple pattern matching syntax
- similar to that used by shells (command interpreters) for "file
- globbing". See \l{QRegExp wildcard matching}.
-
- \value WildcardUnix This is similar to Wildcard but with the
- behavior of a Unix shell. The wildcard characters can be escaped
- with the character "\\".
-
- \value FixedString The pattern is a fixed string. This is
- equivalent to using the RegExp pattern on a string in
- which all metacharacters are escaped using escape().
-
- \value W3CXmlSchema11 The pattern is a regular expression as
- defined by the W3C XML Schema 1.1 specification.
-
- \sa setPatternSyntax()
-*/
-
-/*!
- Constructs an empty regexp.
-
- \sa isValid(), errorString()
-*/
-QRegExp::QRegExp()
-{
- priv = new QRegExpPrivate;
- prepareEngine(priv);
-}
-
-/*!
- Constructs a regular expression object for the given \a pattern
- string. The pattern must be given using wildcard notation if \a
- syntax is \l Wildcard; the default is \l RegExp. The pattern is
- case sensitive, unless \a cs is Qt::CaseInsensitive. Matching is
- greedy (maximal), but can be changed by calling
- setMinimal().
-
- \sa setPattern(), setCaseSensitivity(), setPatternSyntax()
-*/
-QRegExp::QRegExp(const QString &pattern, Qt::CaseSensitivity cs, PatternSyntax syntax)
-{
- priv = new QRegExpPrivate(QRegExpEngineKey(pattern, syntax, cs));
- prepareEngine(priv);
-}
-
-/*!
- Constructs a regular expression as a copy of \a rx.
-
- \sa operator=()
-*/
-QRegExp::QRegExp(const QRegExp &rx)
-{
- priv = new QRegExpPrivate;
- operator=(rx);
-}
-
-/*!
- Destroys the regular expression and cleans up its internal data.
-*/
-QRegExp::~QRegExp()
-{
- invalidateEngine(priv);
- delete priv;
-}
-
-/*!
- Copies the regular expression \a rx and returns a reference to the
- copy. The case sensitivity, wildcard, and minimal matching options
- are also copied.
-*/
-QRegExp &QRegExp::operator=(const QRegExp &rx)
-{
- prepareEngine(rx.priv); // to allow sharing
- QRegExpEngine *otherEng = rx.priv->eng;
- if (otherEng)
- otherEng->ref.ref();
- invalidateEngine(priv);
- priv->eng = otherEng;
- priv->engineKey = rx.priv->engineKey;
- priv->minimal = rx.priv->minimal;
-#ifndef QT_NO_REGEXP_CAPTURE
- priv->t = rx.priv->t;
- priv->capturedCache = rx.priv->capturedCache;
-#endif
- if (priv->eng)
- priv->matchState.prepareForMatch(priv->eng);
- priv->matchState.captured = rx.priv->matchState.captured;
- return *this;
-}
-
-/*!
- \fn QRegExp &QRegExp::operator=(QRegExp &&other)
-
- Move-assigns \a other to this QRegExp instance.
-
- \since 5.2
-*/
-
-/*!
- \fn void QRegExp::swap(QRegExp &other)
- \since 4.8
-
- Swaps regular expression \a other with this regular
- expression. This operation is very fast and never fails.
-*/
-
-/*!
- Returns \c true if this regular expression is equal to \a rx;
- otherwise returns \c false.
-
- Two QRegExp objects are equal if they have the same pattern
- strings and the same settings for case sensitivity, wildcard and
- minimal matching.
-*/
-bool QRegExp::operator==(const QRegExp &rx) const
-{
- return priv->engineKey == rx.priv->engineKey && priv->minimal == rx.priv->minimal;
-}
-
-/*!
- \since 5.6
- \relates QRegExp
-
- Returns the hash value for \a key, using
- \a seed to seed the calculation.
-*/
-uint qHash(const QRegExp &key, uint seed) Q_DECL_NOTHROW
-{
- QtPrivate::QHashCombine hash;
- seed = hash(seed, key.priv->engineKey);
- seed = hash(seed, key.priv->minimal);
- return seed;
-}
-
-/*!
- \fn bool QRegExp::operator!=(const QRegExp &rx) const
-
- Returns \c true if this regular expression is not equal to \a rx;
- otherwise returns \c false.
-
- \sa operator==()
-*/
-
-/*!
- Returns \c true if the pattern string is empty; otherwise returns
- false.
-
- If you call exactMatch() with an empty pattern on an empty string
- it will return true; otherwise it returns \c false since it operates
- over the whole string. If you call indexIn() with an empty pattern
- on \e any string it will return the start offset (0 by default)
- because the empty pattern matches the 'emptiness' at the start of
- the string. In this case the length of the match returned by
- matchedLength() will be 0.
-
- See QString::isEmpty().
-*/
-
-bool QRegExp::isEmpty() const
-{
- return priv->engineKey.pattern.isEmpty();
-}
-
-/*!
- Returns \c true if the regular expression is valid; otherwise returns
- false. An invalid regular expression never matches.
-
- The pattern \b{[a-z} is an example of an invalid pattern, since
- it lacks a closing square bracket.
-
- Note that the validity of a regexp may also depend on the setting
- of the wildcard flag, for example \b{*.html} is a valid
- wildcard regexp but an invalid full regexp.
-
- \sa errorString()
-*/
-bool QRegExp::isValid() const
-{
- if (priv->engineKey.pattern.isEmpty()) {
- return true;
- } else {
- prepareEngine(priv);
- return priv->eng->isValid();
- }
-}
-
-/*!
- Returns the pattern string of the regular expression. The pattern
- has either regular expression syntax or wildcard syntax, depending
- on patternSyntax().
-
- \sa patternSyntax(), caseSensitivity()
-*/
-QString QRegExp::pattern() const
-{
- return priv->engineKey.pattern;
-}
-
-/*!
- Sets the pattern string to \a pattern. The case sensitivity,
- wildcard, and minimal matching options are not changed.
-
- \sa setPatternSyntax(), setCaseSensitivity()
-*/
-void QRegExp::setPattern(const QString &pattern)
-{
- if (priv->engineKey.pattern != pattern) {
- invalidateEngine(priv);
- priv->engineKey.pattern = pattern;
- }
-}
-
-/*!
- Returns Qt::CaseSensitive if the regexp is matched case
- sensitively; otherwise returns Qt::CaseInsensitive.
-
- \sa patternSyntax(), pattern(), isMinimal()
-*/
-Qt::CaseSensitivity QRegExp::caseSensitivity() const
-{
- return priv->engineKey.cs;
-}
-
-/*!
- Sets case sensitive matching to \a cs.
-
- If \a cs is Qt::CaseSensitive, \b{\\.txt$} matches
- \c{readme.txt} but not \c{README.TXT}.
-
- \sa setPatternSyntax(), setPattern(), setMinimal()
-*/
-void QRegExp::setCaseSensitivity(Qt::CaseSensitivity cs)
-{
- if ((bool)cs != (bool)priv->engineKey.cs) {
- invalidateEngine(priv);
- priv->engineKey.cs = cs;
- }
-}
-
-/*!
- Returns the syntax used by the regular expression. The default is
- QRegExp::RegExp.
-
- \sa pattern(), caseSensitivity()
-*/
-QRegExp::PatternSyntax QRegExp::patternSyntax() const
-{
- return priv->engineKey.patternSyntax;
-}
-
-/*!
- Sets the syntax mode for the regular expression. The default is
- QRegExp::RegExp.
-
- Setting \a syntax to QRegExp::Wildcard enables simple shell-like
- \l{QRegExp wildcard matching}. For example, \b{r*.txt} matches the
- string \c{readme.txt} in wildcard mode, but does not match
- \c{readme}.
-
- Setting \a syntax to QRegExp::FixedString means that the pattern
- is interpreted as a plain string. Special characters (e.g.,
- backslash) don't need to be escaped then.
-
- \sa setPattern(), setCaseSensitivity(), escape()
-*/
-void QRegExp::setPatternSyntax(PatternSyntax syntax)
-{
- if (syntax != priv->engineKey.patternSyntax) {
- invalidateEngine(priv);
- priv->engineKey.patternSyntax = syntax;
- }
-}
-
-/*!
- Returns \c true if minimal (non-greedy) matching is enabled;
- otherwise returns \c false.
-
- \sa caseSensitivity(), setMinimal()
-*/
-bool QRegExp::isMinimal() const
-{
- return priv->minimal;
-}
-
-/*!
- Enables or disables minimal matching. If \a minimal is false,
- matching is greedy (maximal) which is the default.
-
- For example, suppose we have the input string "We must be
- <b>bold</b>, very <b>bold</b>!" and the pattern
- \b{<b>.*</b>}. With the default greedy (maximal) matching,
- the match is "We must be \underline{<b>bold</b>, very
- <b>bold</b>}!". But with minimal (non-greedy) matching, the
- first match is: "We must be \underline{<b>bold</b>}, very
- <b>bold</b>!" and the second match is "We must be <b>bold</b>,
- very \underline{<b>bold</b>}!". In practice we might use the pattern
- \b{<b>[^<]*\</b>} instead, although this will still fail for
- nested tags.
-
- \sa setCaseSensitivity()
-*/
-void QRegExp::setMinimal(bool minimal)
-{
- priv->minimal = minimal;
-}
-
-// ### Qt 5: make non-const
-/*!
- Returns \c true if \a str is matched exactly by this regular
- expression; otherwise returns \c false. You can determine how much of
- the string was matched by calling matchedLength().
-
- For a given regexp string R, exactMatch("R") is the equivalent of
- indexIn("^R$") since exactMatch() effectively encloses the regexp
- in the start of string and end of string anchors, except that it
- sets matchedLength() differently.
-
- For example, if the regular expression is \b{blue}, then
- exactMatch() returns \c true only for input \c blue. For inputs \c
- bluebell, \c blutak and \c lightblue, exactMatch() returns \c false
- and matchedLength() will return 4, 3 and 0 respectively.
-
- Although const, this function sets matchedLength(),
- capturedTexts(), and pos().
-
- \sa indexIn(), lastIndexIn()
-*/
-bool QRegExp::exactMatch(const QString &str) const
-{
- prepareEngineForMatch(priv, str);
- priv->matchState.match(str.unicode(), str.length(), 0, priv->minimal, true, 0);
- if (priv->matchState.captured[1] == str.length()) {
- return true;
- } else {
- priv->matchState.captured[0] = 0;
- priv->matchState.captured[1] = priv->matchState.oneTestMatchedLen;
- return false;
- }
-}
-
-// ### Qt 5: make non-const
-/*!
- Attempts to find a match in \a str from position \a offset (0 by
- default). If \a offset is -1, the search starts at the last
- character; if -2, at the next to last character; etc.
-
- Returns the position of the first match, or -1 if there was no
- match.
-
- The \a caretMode parameter can be used to instruct whether \b{^}
- should match at index 0 or at \a offset.
-
- You might prefer to use QString::indexOf(), QString::contains(),
- or even QStringList::filter(). To replace matches use
- QString::replace().
-
- Example:
- \snippet code/src_corelib_tools_qregexp.cpp 13
-
- Although const, this function sets matchedLength(),
- capturedTexts() and pos().
-
- If the QRegExp is a wildcard expression (see setPatternSyntax())
- and want to test a string against the whole wildcard expression,
- use exactMatch() instead of this function.
-
- \sa lastIndexIn(), exactMatch()
-*/
-
-int QRegExp::indexIn(const QString &str, int offset, CaretMode caretMode) const
-{
- prepareEngineForMatch(priv, str);
- if (offset < 0)
- offset += str.length();
- priv->matchState.match(str.unicode(), str.length(), offset,
- priv->minimal, false, caretIndex(offset, caretMode));
- return priv->matchState.captured[0];
-}
-
-// ### Qt 5: make non-const
-/*!
- Attempts to find a match backwards in \a str from position \a
- offset. If \a offset is -1 (the default), the search starts at the
- last character; if -2, at the next to last character; etc.
-
- Returns the position of the first match, or -1 if there was no
- match.
-
- The \a caretMode parameter can be used to instruct whether \b{^}
- should match at index 0 or at \a offset.
-
- Although const, this function sets matchedLength(),
- capturedTexts() and pos().
-
- \warning Searching backwards is much slower than searching
- forwards.
-
- \sa indexIn(), exactMatch()
-*/
-
-int QRegExp::lastIndexIn(const QString &str, int offset, CaretMode caretMode) const
-{
- prepareEngineForMatch(priv, str);
- if (offset < 0)
- offset += str.length();
- if (offset < 0 || offset > str.length()) {
- memset(priv->matchState.captured, -1, priv->matchState.capturedSize*sizeof(int));
- return -1;
- }
-
- while (offset >= 0) {
- priv->matchState.match(str.unicode(), str.length(), offset,
- priv->minimal, true, caretIndex(offset, caretMode));
- if (priv->matchState.captured[0] == offset)
- return offset;
- --offset;
- }
- return -1;
-}
-
-/*!
- Returns the length of the last matched string, or -1 if there was
- no match.
-
- \sa exactMatch(), indexIn(), lastIndexIn()
-*/
-int QRegExp::matchedLength() const
-{
- return priv->matchState.captured[1];
-}
-
-#ifndef QT_NO_REGEXP_CAPTURE
-
-/*!
- \since 4.6
- Returns the number of captures contained in the regular expression.
- */
-int QRegExp::captureCount() const
-{
- prepareEngine(priv);
- return priv->eng->captureCount();
-}
-
-/*!
- Returns a list of the captured text strings.
-
- The first string in the list is the entire matched string. Each
- subsequent list element contains a string that matched a
- (capturing) subexpression of the regexp.
-
- For example:
- \snippet code/src_corelib_tools_qregexp.cpp 14
-
- The above example also captures elements that may be present but
- which we have no interest in. This problem can be solved by using
- non-capturing parentheses:
-
- \snippet code/src_corelib_tools_qregexp.cpp 15
-
- Note that if you want to iterate over the list, you should iterate
- over a copy, e.g.
- \snippet code/src_corelib_tools_qregexp.cpp 16
-
- Some regexps can match an indeterminate number of times. For
- example if the input string is "Offsets: 12 14 99 231 7" and the
- regexp, \c{rx}, is \b{(\\d+)+}, we would hope to get a list of
- all the numbers matched. However, after calling
- \c{rx.indexIn(str)}, capturedTexts() will return the list ("12",
- "12"), i.e. the entire match was "12" and the first subexpression
- matched was "12". The correct approach is to use cap() in a
- \l{QRegExp#cap_in_a_loop}{loop}.
-
- The order of elements in the string list is as follows. The first
- element is the entire matching string. Each subsequent element
- corresponds to the next capturing open left parentheses. Thus
- capturedTexts()[1] is the text of the first capturing parentheses,
- capturedTexts()[2] is the text of the second and so on
- (corresponding to $1, $2, etc., in some other regexp languages).
-
- \sa cap(), pos()
-*/
-QStringList QRegExp::capturedTexts() const
-{
- if (priv->capturedCache.isEmpty()) {
- prepareEngine(priv);
- const int *captured = priv->matchState.captured;
- int n = priv->matchState.capturedSize;
-
- for (int i = 0; i < n; i += 2) {
- QString m;
- if (captured[i + 1] == 0)
- m = QLatin1String(""); // ### Qt 5: don't distinguish between null and empty
- else if (captured[i] >= 0)
- m = priv->t.mid(captured[i], captured[i + 1]);
- priv->capturedCache.append(m);
- }
- priv->t.clear();
- }
- return priv->capturedCache;
-}
-
-/*!
- \internal
-*/
-QStringList QRegExp::capturedTexts()
-{
- return const_cast<const QRegExp *>(this)->capturedTexts();
-}
-
-/*!
- Returns the text captured by the \a nth subexpression. The entire
- match has index 0 and the parenthesized subexpressions have
- indexes starting from 1 (excluding non-capturing parentheses).
-
- \snippet code/src_corelib_tools_qregexp.cpp 17
-
- The order of elements matched by cap() is as follows. The first
- element, cap(0), is the entire matching string. Each subsequent
- element corresponds to the next capturing open left parentheses.
- Thus cap(1) is the text of the first capturing parentheses, cap(2)
- is the text of the second, and so on.
-
- \sa capturedTexts(), pos()
-*/
-QString QRegExp::cap(int nth) const
-{
- return capturedTexts().value(nth);
-}
-
-/*!
- \internal
-*/
-QString QRegExp::cap(int nth)
-{
- return const_cast<const QRegExp *>(this)->cap(nth);
-}
-
-/*!
- Returns the position of the \a nth captured text in the searched
- string. If \a nth is 0 (the default), pos() returns the position
- of the whole match.
-
- Example:
- \snippet code/src_corelib_tools_qregexp.cpp 18
-
- For zero-length matches, pos() always returns -1. (For example, if
- cap(4) would return an empty string, pos(4) returns -1.) This is
- a feature of the implementation.
-
- \sa cap(), capturedTexts()
-*/
-int QRegExp::pos(int nth) const
-{
- if (nth < 0 || nth >= priv->matchState.capturedSize / 2)
- return -1;
- else
- return priv->matchState.captured[2 * nth];
-}
-
-/*!
- \internal
-*/
-int QRegExp::pos(int nth)
-{
- return const_cast<const QRegExp *>(this)->pos(nth);
-}
-
-/*!
- Returns a text string that explains why a regexp pattern is
- invalid the case being; otherwise returns "no error occurred".
-
- \sa isValid()
-*/
-QString QRegExp::errorString() const
-{
- if (isValid()) {
- return QString::fromLatin1(RXERR_OK);
- } else {
- return priv->eng->errorString();
- }
-}
-
-/*!
- \internal
-*/
-QString QRegExp::errorString()
-{
- return const_cast<const QRegExp *>(this)->errorString();
-}
-#endif
-
-/*!
- Returns the string \a str with every regexp special character
- escaped with a backslash. The special characters are $, (,), *, +,
- ., ?, [, \,], ^, {, | and }.
-
- Example:
-
- \snippet code/src_corelib_tools_qregexp.cpp 19
-
- This function is useful to construct regexp patterns dynamically:
-
- \snippet code/src_corelib_tools_qregexp.cpp 20
-
- \sa setPatternSyntax()
-*/
-QString QRegExp::escape(const QString &str)
-{
- QString quoted;
- const int count = str.count();
- quoted.reserve(count * 2);
- const QLatin1Char backslash('\\');
- for (int i = 0; i < count; i++) {
- switch (str.at(i).toLatin1()) {
- case '$':
- case '(':
- case ')':
- case '*':
- case '+':
- case '.':
- case '?':
- case '[':
- case '\\':
- case ']':
- case '^':
- case '{':
- case '|':
- case '}':
- quoted.append(backslash);
- }
- quoted.append(str.at(i));
- }
- return quoted;
-}
-
-
-#ifndef QT_NO_DATASTREAM
-/*!
- \relates QRegExp
-
- Writes the regular expression \a regExp to stream \a out.
-
- \sa {Serializing Qt Data Types}
-*/
-QDataStream &operator<<(QDataStream &out, const QRegExp &regExp)
-{
- return out << regExp.pattern() << (quint8)regExp.caseSensitivity()
- << (quint8)regExp.patternSyntax()
- << (quint8)!!regExp.isMinimal();
-}
-
-/*!
- \relates QRegExp
-
- Reads a regular expression from stream \a in into \a regExp.
-
- \sa {Serializing Qt Data Types}
-*/
-QDataStream &operator>>(QDataStream &in, QRegExp &regExp)
-{
- QString pattern;
- quint8 cs;
- quint8 patternSyntax;
- quint8 isMinimal;
-
- in >> pattern >> cs >> patternSyntax >> isMinimal;
-
- QRegExp newRegExp(pattern, Qt::CaseSensitivity(cs),
- QRegExp::PatternSyntax(patternSyntax));
-
- newRegExp.setMinimal(isMinimal);
- regExp = newRegExp;
- return in;
-}
-#endif // QT_NO_DATASTREAM
-
-#ifndef QT_NO_DEBUG_STREAM
-QDebug operator<<(QDebug dbg, const QRegExp &r)
-{
- QDebugStateSaver saver(dbg);
- dbg.nospace() << "QRegExp(patternSyntax=" << r.patternSyntax()
- << ", pattern='"<< r.pattern() << "')";
- return dbg;
-}
-#endif
-
-QT_END_NAMESPACE
diff --git a/src/corelib/tools/qregexp.h b/src/corelib/tools/qregexp.h
deleted file mode 100644
index b3fa242168..0000000000
--- a/src/corelib/tools/qregexp.h
+++ /dev/null
@@ -1,136 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#ifndef QREGEXP_H
-#define QREGEXP_H
-
-#include <QtCore/qglobal.h>
-
-#ifndef QT_NO_REGEXP
-
-#include <QtCore/qstring.h>
-
-QT_BEGIN_NAMESPACE
-
-
-struct QRegExpPrivate;
-class QStringList;
-class QRegExp;
-
-Q_CORE_EXPORT uint qHash(const QRegExp &key, uint seed = 0) Q_DECL_NOTHROW;
-
-class Q_CORE_EXPORT QRegExp
-{
-public:
- enum PatternSyntax {
- RegExp,
- Wildcard,
- FixedString,
- RegExp2,
- WildcardUnix,
- W3CXmlSchema11 };
- enum CaretMode { CaretAtZero, CaretAtOffset, CaretWontMatch };
-
- QRegExp();
- explicit QRegExp(const QString &pattern, Qt::CaseSensitivity cs = Qt::CaseSensitive,
- PatternSyntax syntax = RegExp);
- QRegExp(const QRegExp &rx);
- ~QRegExp();
- QRegExp &operator=(const QRegExp &rx);
-#ifdef Q_COMPILER_RVALUE_REFS
- QRegExp &operator=(QRegExp &&other) Q_DECL_NOTHROW { swap(other); return *this; }
-#endif
- void swap(QRegExp &other) Q_DECL_NOTHROW { qSwap(priv, other.priv); }
-
- bool operator==(const QRegExp &rx) const;
- inline bool operator!=(const QRegExp &rx) const { return !operator==(rx); }
-
- bool isEmpty() const;
- bool isValid() const;
- QString pattern() const;
- void setPattern(const QString &pattern);
- Qt::CaseSensitivity caseSensitivity() const;
- void setCaseSensitivity(Qt::CaseSensitivity cs);
- PatternSyntax patternSyntax() const;
- void setPatternSyntax(PatternSyntax syntax);
-
- bool isMinimal() const;
- void setMinimal(bool minimal);
-
- bool exactMatch(const QString &str) const;
-
- int indexIn(const QString &str, int offset = 0, CaretMode caretMode = CaretAtZero) const;
- int lastIndexIn(const QString &str, int offset = -1, CaretMode caretMode = CaretAtZero) const;
- int matchedLength() const;
-#ifndef QT_NO_REGEXP_CAPTURE
- int captureCount() const;
- QStringList capturedTexts() const;
- QStringList capturedTexts();
- QString cap(int nth = 0) const;
- QString cap(int nth = 0);
- int pos(int nth = 0) const;
- int pos(int nth = 0);
- QString errorString() const;
- QString errorString();
-#endif
-
- static QString escape(const QString &str);
-
- friend Q_CORE_EXPORT uint qHash(const QRegExp &key, uint seed) Q_DECL_NOTHROW;
-
-private:
- QRegExpPrivate *priv;
-};
-
-Q_DECLARE_TYPEINFO(QRegExp, Q_MOVABLE_TYPE);
-
-#ifndef QT_NO_DATASTREAM
-Q_CORE_EXPORT QDataStream &operator<<(QDataStream &out, const QRegExp &regExp);
-Q_CORE_EXPORT QDataStream &operator>>(QDataStream &in, QRegExp &regExp);
-#endif
-
-#ifndef QT_NO_DEBUG_STREAM
-Q_CORE_EXPORT QDebug operator<<(QDebug, const QRegExp &);
-#endif
-
-QT_END_NAMESPACE
-
-#endif // QT_NO_REGEXP
-
-#endif // QREGEXP_H
diff --git a/src/corelib/tools/qregularexpression.cpp b/src/corelib/tools/qregularexpression.cpp
deleted file mode 100644
index bdaa2d3243..0000000000
--- a/src/corelib/tools/qregularexpression.cpp
+++ /dev/null
@@ -1,3007 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 Giuseppe D'Angelo <dangelog@gmail.com>.
-** Copyright (C) 2016 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.com, author Giuseppe D'Angelo <giuseppe.dangelo@kdab.com>
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#include "qregularexpression.h"
-
-#include <QtCore/qcoreapplication.h>
-#include <QtCore/qhashfunctions.h>
-#include <QtCore/qmutex.h>
-#include <QtCore/qvector.h>
-#include <QtCore/qstringlist.h>
-#include <QtCore/qdebug.h>
-#include <QtCore/qthreadstorage.h>
-#include <QtCore/qglobal.h>
-#include <QtCore/qatomic.h>
-#include <QtCore/qdatastream.h>
-
-#define PCRE2_CODE_UNIT_WIDTH 16
-
-#include <pcre2.h>
-
-QT_BEGIN_NAMESPACE
-
-/*!
- \class QRegularExpression
- \inmodule QtCore
- \reentrant
-
- \brief The QRegularExpression class provides pattern matching using regular
- expressions.
-
- \since 5.0
-
- \ingroup tools
- \ingroup shared
-
- \keyword regular expression
-
- Regular expressions, or \e{regexps}, are a very powerful tool to handle
- strings and texts. This is useful in many contexts, e.g.,
-
- \table
- \row \li Validation
- \li A regexp can test whether a substring meets some criteria,
- e.g. is an integer or contains no whitespace.
- \row \li Searching
- \li A regexp provides more powerful pattern matching than
- simple substring matching, e.g., match one of the words
- \e{mail}, \e{letter} or \e{correspondence}, but none of the
- words \e{email}, \e{mailman}, \e{mailer}, \e{letterbox}, etc.
- \row \li Search and Replace
- \li A regexp can replace all occurrences of a substring with a
- different substring, e.g., replace all occurrences of \e{&}
- with \e{\&amp;} except where the \e{&} is already followed by
- an \e{amp;}.
- \row \li String Splitting
- \li A regexp can be used to identify where a string should be
- split apart, e.g. splitting tab-delimited strings.
- \endtable
-
- This document is by no means a complete reference to pattern matching using
- regular expressions, and the following parts will require the reader to
- have some basic knowledge about Perl-like regular expressions and their
- pattern syntax.
-
- Good references about regular expressions include:
-
- \list
- \li \e {Mastering Regular Expressions} (Third Edition) by Jeffrey E. F.
- Friedl, ISBN 0-596-52812-4;
- \li the \l{http://pcre.org/pcre.txt} {pcrepattern(3)} man page, describing
- the pattern syntax supported by PCRE (the reference implementation of
- Perl-compatible regular expressions);
- \li the \l{http://perldoc.perl.org/perlre.html} {Perl's regular expression
- documentation} and the \l{http://perldoc.perl.org/perlretut.html} {Perl's
- regular expression tutorial}.
- \endlist
-
- \tableofcontents
-
- \section1 Introduction
-
- QRegularExpression implements Perl-compatible regular expressions. It fully
- supports Unicode. For an overview of the regular expression syntax
- supported by QRegularExpression, please refer to the aforementioned
- pcrepattern(3) man page. A regular expression is made up of two things: a
- \b{pattern string} and a set of \b{pattern options} that change the
- meaning of the pattern string.
-
- You can set the pattern string by passing a string to the QRegularExpression
- constructor:
-
- \snippet code/src_corelib_tools_qregularexpression.cpp 0
-
- This sets the pattern string to \c{a pattern}. You can also use the
- setPattern() function to set a pattern on an existing QRegularExpression
- object:
-
- \snippet code/src_corelib_tools_qregularexpression.cpp 1
-
- Note that due to C++ literal strings rules, you must escape all backslashes
- inside the pattern string with another backslash:
-
- \snippet code/src_corelib_tools_qregularexpression.cpp 2
-
- The pattern() function returns the pattern that is currently set for a
- QRegularExpression object:
-
- \snippet code/src_corelib_tools_qregularexpression.cpp 3
-
- \section1 Pattern Options
-
- The meaning of the pattern string can be modified by setting one or more
- \e{pattern options}. For instance, it is possible to set a pattern to match
- case insensitively by setting the QRegularExpression::CaseInsensitiveOption.
-
- You can set the options by passing them to the QRegularExpression
- constructor, as in:
-
- \snippet code/src_corelib_tools_qregularexpression.cpp 4
-
- Alternatively, you can use the setPatternOptions() function on an existing
- QRegularExpressionObject:
-
- \snippet code/src_corelib_tools_qregularexpression.cpp 5
-
- It is possible to get the pattern options currently set on a
- QRegularExpression object by using the patternOptions() function:
-
- \snippet code/src_corelib_tools_qregularexpression.cpp 6
-
- Please refer to the QRegularExpression::PatternOption enum documentation for
- more information about each pattern option.
-
- \section1 Match Type and Match Options
-
- The last two arguments of the match() and the globalMatch() functions set
- the match type and the match options. The match type is a value of the
- QRegularExpression::MatchType enum; the "traditional" matching algorithm is
- chosen by using the NormalMatch match type (the default). It is also
- possible to enable partial matching of the regular expression against a
- subject string: see the \l{partial matching} section for more details.
-
- The match options are a set of one or more QRegularExpression::MatchOption
- values. They change the way a specific match of a regular expression
- against a subject string is done. Please refer to the
- QRegularExpression::MatchOption enum documentation for more details.
-
- \target normal matching
- \section1 Normal Matching
-
- In order to perform a match you can simply invoke the match() function
- passing a string to match against. We refer to this string as the
- \e{subject string}. The result of the match() function is a
- QRegularExpressionMatch object that can be used to inspect the results of
- the match. For instance:
-
- \snippet code/src_corelib_tools_qregularexpression.cpp 7
-
- If a match is successful, the (implicit) capturing group number 0 can be
- used to retrieve the substring matched by the entire pattern (see also the
- section about \l{extracting captured substrings}):
-
- \snippet code/src_corelib_tools_qregularexpression.cpp 8
-
- It's also possible to start a match at an arbitrary offset inside the
- subject string by passing the offset as an argument of the
- match() function. In the following example \c{"12 abc"}
- is not matched because the match is started at offset 1:
-
- \snippet code/src_corelib_tools_qregularexpression.cpp 9
-
- \target extracting captured substrings
- \section2 Extracting captured substrings
-
- The QRegularExpressionMatch object contains also information about the
- substrings captured by the capturing groups in the pattern string. The
- \l{QRegularExpressionMatch::}{captured()} function will return the string
- captured by the n-th capturing group:
-
- \snippet code/src_corelib_tools_qregularexpression.cpp 10
-
- Capturing groups in the pattern are numbered starting from 1, and the
- implicit capturing group 0 is used to capture the substring that matched
- the entire pattern.
-
- It's also possible to retrieve the starting and the ending offsets (inside
- the subject string) of each captured substring, by using the
- \l{QRegularExpressionMatch::}{capturedStart()} and the
- \l{QRegularExpressionMatch::}{capturedEnd()} functions:
-
- \snippet code/src_corelib_tools_qregularexpression.cpp 11
-
- All of these functions have an overload taking a QString as a parameter
- in order to extract \e{named} captured substrings. For instance:
-
- \snippet code/src_corelib_tools_qregularexpression.cpp 12
-
- \target global matching
- \section1 Global Matching
-
- \e{Global matching} is useful to find all the occurrences of a given
- regular expression inside a subject string. Suppose that we want to extract
- all the words from a given string, where a word is a substring matching
- the pattern \c{\w+}.
-
- QRegularExpression::globalMatch returns a QRegularExpressionMatchIterator,
- which is a Java-like forward iterator that can be used to iterate over the
- results. For instance:
-
- \snippet code/src_corelib_tools_qregularexpression.cpp 13
-
- Since it's a Java-like iterator, the QRegularExpressionMatchIterator will
- point immediately before the first result. Every result is returned as a
- QRegularExpressionMatch object. The
- \l{QRegularExpressionMatchIterator::}{hasNext()} function will return true
- if there's at least one more result, and
- \l{QRegularExpressionMatchIterator::}{next()} will return the next result
- and advance the iterator. Continuing from the previous example:
-
- \snippet code/src_corelib_tools_qregularexpression.cpp 14
-
- You can also use \l{QRegularExpressionMatchIterator::}{peekNext()} to get
- the next result without advancing the iterator.
-
- It is possible to pass a starting offset and one or more match options to
- the globalMatch() function, exactly like normal matching with match().
-
- \target partial matching
- \section1 Partial Matching
-
- A \e{partial match} is obtained when the end of the subject string is
- reached, but more characters are needed to successfully complete the match.
- Note that a partial match is usually much more inefficient than a normal
- match because many optimizations of the matching algorithm cannot be
- employed.
-
- A partial match must be explicitly requested by specifying a match type of
- PartialPreferCompleteMatch or PartialPreferFirstMatch when calling
- QRegularExpression::match or QRegularExpression::globalMatch. If a partial
- match is found, then calling the \l{QRegularExpressionMatch::}{hasMatch()}
- function on the QRegularExpressionMatch object returned by match() will
- return \c{false}, but \l{QRegularExpressionMatch::}{hasPartialMatch()} will return
- \c{true}.
-
- When a partial match is found, no captured substrings are returned, and the
- (implicit) capturing group 0 corresponding to the whole match captures the
- partially matched substring of the subject string.
-
- Note that asking for a partial match can still lead to a complete match, if
- one is found; in this case, \l{QRegularExpressionMatch::}{hasMatch()} will
- return \c{true} and \l{QRegularExpressionMatch::}{hasPartialMatch()}
- \c{false}. It never happens that a QRegularExpressionMatch reports both a
- partial and a complete match.
-
- Partial matching is mainly useful in two scenarios: validating user input
- in real time and incremental/multi-segment matching.
-
- \target validating user input
- \section2 Validating user input
-
- Suppose that we would like the user to input a date in a specific
- format, for instance "MMM dd, yyyy". We can check the input validity with
- a pattern like:
-
- \c{^(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec) \d\d?, \d\d\d\d$}
-
- (This pattern doesn't catch invalid days, but let's keep it for the
- example's purposes).
-
- We would like to validate the input with this regular expression \e{while}
- the user is typing it, so that we can report an error in the input as soon
- as it is committed (for instance, the user typed the wrong key). In order
- to do so we must distinguish three cases:
-
- \list
- \li the input cannot possibly match the regular expression;
- \li the input does match the regular expression;
- \li the input does not match the regular expression right now,
- but it will if more characters will be added to it.
- \endlist
-
- Note that these three cases represent exactly the possible states of a
- QValidator (see the QValidator::State enum).
-
- In particular, in the last case we want the regular expression engine to
- report a partial match: we are successfully matching the pattern against
- the subject string but the matching cannot continue because the end of the
- subject is encountered. Notice, however, that the matching algorithm should
- continue and try all possibilities, and in case a complete (non-partial)
- match is found, then this one should be reported, and the input string
- accepted as fully valid.
-
- This behaviour is implemented by the PartialPreferCompleteMatch match type.
- For instance:
-
- \snippet code/src_corelib_tools_qregularexpression.cpp 15
-
- If matching the same regular expression against the subject string leads to
- a complete match, it is reported as usual:
-
- \snippet code/src_corelib_tools_qregularexpression.cpp 16
-
- Another example with a different pattern, showing the behaviour of
- preferring a complete match over a partial one:
-
- \snippet code/src_corelib_tools_qregularexpression.cpp 17
-
- In this case, the subpattern \c{abc\\w+X} partially matches the subject
- string; however, the subpattern \c{def} matches the subject string
- completely, and therefore a complete match is reported.
-
- If multiple partial matches are found when matching (but no complete
- match), then the QRegularExpressionMatch object will report the first one
- that is found. For instance:
-
- \snippet code/src_corelib_tools_qregularexpression.cpp 18
-
- \section2 Incremental/multi-segment matching
-
- Incremental matching is another use case of partial matching. Suppose that
- we want to find the occurrences of a regular expression inside a large text
- (that is, substrings matching the regular expression). In order to do so we
- would like to "feed" the large text to the regular expression engines in
- smaller chunks. The obvious problem is what happens if the substring that
- matches the regular expression spans across two or more chunks.
-
- In this case, the regular expression engine should report a partial match,
- so that we can match again adding new data and (eventually) get a complete
- match. This implies that the regular expression engine may assume that
- there are other characters \e{beyond the end} of the subject string. This
- is not to be taken literally -- the engine will never try to access
- any character after the last one in the subject.
-
- QRegularExpression implements this behaviour when using the
- PartialPreferFirstMatch match type. This match type reports a partial match
- as soon as it is found, and other match alternatives are not tried
- (even if they could lead to a complete match). For instance:
-
- \snippet code/src_corelib_tools_qregularexpression.cpp 19
-
- This happens because when matching the first branch of the alternation
- operator a partial match is found, and therefore matching stops, without
- trying the second branch. Another example:
-
- \snippet code/src_corelib_tools_qregularexpression.cpp 20
-
- This shows what could seem a counterintuitve behaviour of quantifiers:
- since \c{?} is greedy, then the engine tries first to continue the match
- after having matched \c{"abc"}; but then the matching reaches the end of the
- subject string, and therefore a partial match is reported. This is
- even more surprising in the following example:
-
- \snippet code/src_corelib_tools_qregularexpression.cpp 21
-
- It's easy to understand this behaviour if we remember that the engine
- expects the subject string to be only a substring of the whole text we're
- looking for a match into (that is, how we said before, that the engine
- assumes that there are other characters beyond the end of the subject
- string).
-
- Since the \c{*} quantifier is greedy, then reporting a complete match could
- be an error, because after the current subject \c{"abc"} there may be other
- occurrences of \c{"abc"}. For instance, the complete text could have been
- "abcabcX", and therefore the \e{right} match to report (in the complete
- text) would have been \c{"abcabc"}; by matching only against the leading
- \c{"abc"} we instead get a partial match.
-
- \section1 Error Handling
-
- It is possible for a QRegularExpression object to be invalid because of
- syntax errors in the pattern string. The isValid() function will return
- true if the regular expression is valid, or false otherwise:
-
- \snippet code/src_corelib_tools_qregularexpression.cpp 22
-
- You can get more information about the specific error by calling the
- errorString() function; moreover, the patternErrorOffset() function
- will return the offset inside the pattern string
-
- \snippet code/src_corelib_tools_qregularexpression.cpp 23
-
- If a match is attempted with an invalid QRegularExpression, then the
- returned QRegularExpressionMatch object will be invalid as well (that is,
- its \l{QRegularExpressionMatch::}{isValid()} function will return false).
- The same applies for attempting a global match.
-
- \section1 Unsupported Perl-compatible Regular Expressions Features
-
- QRegularExpression does not support all the features available in
- Perl-compatible regular expressions. The most notable one is the fact that
- duplicated names for capturing groups are not supported, and using them can
- lead to undefined behaviour.
-
- This may change in a future version of Qt.
-
- \section1 Notes for QRegExp Users
-
- The QRegularExpression class introduced in Qt 5 is a big improvement upon
- QRegExp, in terms of APIs offered, supported pattern syntax and speed of
- execution. The biggest difference is that QRegularExpression simply holds a
- regular expression, and it's \e{not} modified when a match is requested.
- Instead, a QRegularExpressionMatch object is returned, in order to check
- the result of a match and extract the captured substring. The same applies
- with global matching and QRegularExpressionMatchIterator.
-
- Other differences are outlined below.
-
- \section2 Porting from QRegExp::exactMatch()
-
- QRegExp::exactMatch() in Qt 4 served two purposes: it exactly matched
- a regular expression against a subject string, and it implemented partial
- matching.
-
- \section3 Porting from QRegExp's Exact Matching
-
- Exact matching indicates whether the regular expression matches the entire
- subject string. For example, the classes yield on the subject string \c{"abc123"}:
-
- \table
- \header \li \li QRegExp::exactMatch() \li QRegularExpressionMatch::hasMatch()
- \row \li \c{"\\d+"} \li \b false \li \b true
- \row \li \c{"[a-z]+\\d+"} \li \b true \li \b true
- \endtable
-
- Exact matching is not reflected in QRegularExpression. If you want to be
- sure that the subject string matches the regular expression exactly, you can wrap the
- pattern between a couple of anchoring expressions. Simply
- putting the pattern between the \c{^} and the \c{$} anchors is enough
- in most cases:
-
- \snippet code/src_corelib_tools_qregularexpression.cpp 24
-
- However, remember that the \c{$} anchor not only matches at the end of the
- string, but also at a newline character right before the end of the string;
- that is, the previous pattern matches against the string "this pattern must
- match exactly\\n". Also, the behaviour of both the \c{^} and the \c{$}
- anchors changes if the MultiLineOption is set either explicitly (as a
- pattern option) or implicitly (as a directive inside the pattern string).
-
- Therefore, in the most general case, you should wrap the pattern between
- the \c{\A} and the \c{\z} anchors:
-
- \snippet code/src_corelib_tools_qregularexpression.cpp 25
-
- Note the usage of the non-capturing group in order to preserve the meaning
- of the branch operator inside the pattern.
-
- The QRegularExpression::anchoredPattern() helper method does exactly that for
- you.
-
- \sa anchoredPattern
-
- \section3 Porting from QRegExp's Partial Matching
-
- When using QRegExp::exactMatch(), if an exact match was not found, one
- could still find out how much of the subject string was matched by the
- regular expression by calling QRegExp::matchedLength(). If the returned length
- was equal to the subject string's length, then one could conclude that a partial
- match was found.
-
- QRegularExpression supports partial matching explicitly by means of the
- appropriate MatchType.
-
- \section2 Global matching
-
- Due to limitations of the QRegExp API it was impossible to implement global
- matching correctly (that is, like Perl does). In particular, patterns that
- can match 0 characters (like \c{"a*"}) are problematic.
-
- QRegularExpression::globalMatch() implements Perl global match correctly, and
- the returned iterator can be used to examine each result.
-
- \section2 Unicode properties support
-
- When using QRegExp, character classes such as \c{\w}, \c{\d}, etc. match
- characters with the corresponding Unicode property: for instance, \c{\d}
- matches any character with the Unicode Nd (decimal digit) property.
-
- Those character classes only match ASCII characters by default when using
- QRegularExpression: for instance, \c{\d} matches exactly a character in the
- \c{0-9} ASCII range. It is possible to change this behaviour by using the
- UseUnicodePropertiesOption pattern option.
-
- \section2 Wildcard matching
-
- There is no direct way to do wildcard matching in QRegularExpression.
- However, the wildcardToRegularExpression method is provided to translate
- glob patterns into a Perl-compatible regular expression that can be used
- for that purpose.
-
- \section2 Other pattern syntaxes
-
- QRegularExpression supports only Perl-compatible regular expressions.
-
- \section2 Minimal matching
-
- QRegExp::setMinimal() implemented minimal matching by simply reversing the
- greediness of the quantifiers (QRegExp did not support lazy quantifiers,
- like \c{*?}, \c{+?}, etc.). QRegularExpression instead does support greedy,
- lazy and possessive quantifiers. The InvertedGreedinessOption
- pattern option can be useful to emulate the effects of QRegExp::setMinimal():
- if enabled, it inverts the greediness of quantifiers (greedy ones become
- lazy and vice versa).
-
- \section2 Caret modes
-
- The AnchoredMatchOption match option can be used to emulate the
- QRegExp::CaretAtOffset behaviour. There is no equivalent for the other
- QRegExp::CaretMode modes.
-
- \section1 Debugging Code that Uses QRegularExpression
-
- QRegularExpression internally uses a just in time compiler (JIT) to
- optimize the execution of the matching algorithm. The JIT makes extensive
- usage of self-modifying code, which can lead debugging tools such as
- Valgrind to crash. You must enable all checks for self-modifying code if
- you want to debug programs using QRegularExpression (f.i., see Valgrind's
- \c{--smc-check} command line option). The downside of enabling such checks
- is that your program will run considerably slower.
-
- To avoid that, the JIT is disabled by default if you compile Qt in debug
- mode. It is possible to override the default and enable or disable the JIT
- usage (both in debug or release mode) by setting the
- \c{QT_ENABLE_REGEXP_JIT} environment variable to a non-zero or zero value
- respectively.
-
- \sa QRegularExpressionMatch, QRegularExpressionMatchIterator
-*/
-
-/*!
- \class QRegularExpressionMatch
- \inmodule QtCore
- \reentrant
-
- \brief The QRegularExpressionMatch class provides the results of a matching
- a QRegularExpression against a string.
-
- \since 5.0
-
- \ingroup tools
- \ingroup shared
-
- \keyword regular expression match
-
- A QRegularExpressionMatch object can be obtained by calling the
- QRegularExpression::match() function, or as a single result of a global
- match from a QRegularExpressionMatchIterator.
-
- The success or the failure of a match attempt can be inspected by calling
- the hasMatch() function. QRegularExpressionMatch also reports a successful
- partial match through the hasPartialMatch() function.
-
- In addition, QRegularExpressionMatch returns the substrings captured by the
- capturing groups in the pattern string. The implicit capturing group with
- index 0 captures the result of the whole match. The captured() function
- returns each substring captured, either by the capturing group's index or
- by its name:
-
- \snippet code/src_corelib_tools_qregularexpression.cpp 29
-
- For each captured substring it is possible to query its starting and ending
- offsets in the subject string by calling the capturedStart() and the
- capturedEnd() function, respectively. The length of each captured
- substring is available using the capturedLength() function.
-
- The convenience function capturedTexts() will return \e{all} the captured
- substrings at once (including the substring matched by the entire pattern)
- in the order they have been captured by captring groups; that is,
- \c{captured(i) == capturedTexts().at(i)}.
-
- You can retrieve the QRegularExpression object the subject string was
- matched against by calling the regularExpression() function; the
- match type and the match options are available as well by calling
- the matchType() and the matchOptions() respectively.
-
- Please refer to the QRegularExpression documentation for more information
- about the Qt regular expression classes.
-
- \sa QRegularExpression
-*/
-
-/*!
- \class QRegularExpressionMatchIterator
- \inmodule QtCore
- \reentrant
-
- \brief The QRegularExpressionMatchIterator class provides an iterator on
- the results of a global match of a QRegularExpression object against a string.
-
- \since 5.0
-
- \ingroup tools
- \ingroup shared
-
- \keyword regular expression iterator
-
- A QRegularExpressionMatchIterator object is a forward only Java-like
- iterator; it can be obtained by calling the
- QRegularExpression::globalMatch() function. A new
- QRegularExpressionMatchIterator will be positioned before the first result.
- You can then call the hasNext() function to check if there are more
- results available; if so, the next() function will return the next
- result and advance the iterator.
-
- Each result is a QRegularExpressionMatch object holding all the information
- for that result (including captured substrings).
-
- For instance:
-
- \snippet code/src_corelib_tools_qregularexpression.cpp 30
-
- Moreover, QRegularExpressionMatchIterator offers a peekNext() function
- to get the next result \e{without} advancing the iterator.
-
- You can retrieve the QRegularExpression object the subject string was
- matched against by calling the regularExpression() function; the
- match type and the match options are available as well by calling
- the matchType() and the matchOptions() respectively.
-
- Please refer to the QRegularExpression documentation for more information
- about the Qt regular expression classes.
-
- \sa QRegularExpression, QRegularExpressionMatch
-*/
-
-
-/*!
- \enum QRegularExpression::PatternOption
-
- The PatternOption enum defines modifiers to the way the pattern string
- should be interpreted, and therefore the way the pattern matches against a
- subject string.
-
- \value NoPatternOption
- No pattern options are set.
-
- \value CaseInsensitiveOption
- The pattern should match against the subject string in a case
- insensitive way. This option corresponds to the /i modifier in Perl
- regular expressions.
-
- \value DotMatchesEverythingOption
- The dot metacharacter (\c{.}) in the pattern string is allowed to match
- any character in the subject string, including newlines (normally, the
- dot does not match newlines). This option corresponds to the \c{/s}
- modifier in Perl regular expressions.
-
- \value MultilineOption
- The caret (\c{^}) and the dollar (\c{$}) metacharacters in the pattern
- string are allowed to match, respectively, immediately after and
- immediately before any newline in the subject string, as well as at the
- very beginning and at the very end of the subject string. This option
- corresponds to the \c{/m} modifier in Perl regular expressions.
-
- \value ExtendedPatternSyntaxOption
- Any whitespace in the pattern string which is not escaped and outside a
- character class is ignored. Moreover, an unescaped sharp (\b{#})
- outside a character class causes all the following characters, until
- the first newline (included), to be ignored. This can be used to
- increase the readability of a pattern string as well as put comments
- inside regular expressions; this is particulary useful if the pattern
- string is loaded from a file or written by the user, because in C++
- code it is always possible to use the rules for string literals to put
- comments outside the pattern string. This option corresponds to the \c{/x}
- modifier in Perl regular expressions.
-
- \value InvertedGreedinessOption
- The greediness of the quantifiers is inverted: \c{*}, \c{+}, \c{?},
- \c{{m,n}}, etc. become lazy, while their lazy versions (\c{*?},
- \c{+?}, \c{??}, \c{{m,n}?}, etc.) become greedy. There is no equivalent
- for this option in Perl regular expressions.
-
- \value DontCaptureOption
- The non-named capturing groups do not capture substrings; named
- capturing groups still work as intended, as well as the implicit
- capturing group number 0 corresponding to the entire match. There is no
- equivalent for this option in Perl regular expressions.
-
- \value UseUnicodePropertiesOption
- The meaning of the \c{\w}, \c{\d}, etc., character classes, as well as
- the meaning of their counterparts (\c{\W}, \c{\D}, etc.), is changed
- from matching ASCII characters only to matching any character with the
- corresponding Unicode property. For instance, \c{\d} is changed to
- match any character with the Unicode Nd (decimal digit) property;
- \c{\w} to match any character with either the Unicode L (letter) or N
- (digit) property, plus underscore, and so on. This option corresponds
- to the \c{/u} modifier in Perl regular expressions.
-
- \value OptimizeOnFirstUsageOption
- This option is ignored. A regular expression is automatically optimized
- (including JIT compiling) the first time it is used. This enum value
- was introduced in Qt 5.4.
-
- \value DontAutomaticallyOptimizeOption
- This option is ignored. A regular expression is automatically optimized
- (including JIT compiling) the first time it is used. This enum value
- was introduced in Qt 5.4.
-*/
-
-/*!
- \enum QRegularExpression::MatchType
-
- The MatchType enum defines the type of the match that should be attempted
- against the subject string.
-
- \value NormalMatch
- A normal match is done.
-
- \value PartialPreferCompleteMatch
- The pattern string is matched partially against the subject string. If
- a partial match is found, then it is recorded, and other matching
- alternatives are tried as usual. If a complete match is then found,
- then it's preferred to the partial match; in this case only the
- complete match is reported. If instead no complete match is found (but
- only the partial one), then the partial one is reported.
-
- \value PartialPreferFirstMatch
- The pattern string is matched partially against the subject string. If
- a partial match is found, then matching stops and the partial match is
- reported. In this case, other matching alternatives (potentially
- leading to a complete match) are not tried. Moreover, this match type
- assumes that the subject string only a substring of a larger text, and
- that (in this text) there are other characters beyond the end of the
- subject string. This can lead to surprising results; see the discussion
- in the \l{partial matching} section for more details.
-
- \value NoMatch
- No matching is done. This value is returned as the match type by a
- default constructed QRegularExpressionMatch or
- QRegularExpressionMatchIterator. Using this match type is not very
- useful for the user, as no matching ever happens. This enum value
- has been introduced in Qt 5.1.
-*/
-
-/*!
- \enum QRegularExpression::MatchOption
-
- \value NoMatchOption
- No match options are set.
-
- \value AnchoredMatchOption
- The match is constrained to start exactly at the offset passed to
- match() in order to be successful, even if the pattern string does not
- contain any metacharacter that anchors the match at that point.
-
- \value DontCheckSubjectStringMatchOption
- The subject string is not checked for UTF-16 validity before
- attempting a match. Use this option with extreme caution, as
- attempting to match an invalid string may crash the program and/or
- constitute a security issue. This enum value has been introduced in
- Qt 5.4.
-*/
-
-/*!
- \internal
-*/
-static int convertToPcreOptions(QRegularExpression::PatternOptions patternOptions)
-{
- int options = 0;
-
- if (patternOptions & QRegularExpression::CaseInsensitiveOption)
- options |= PCRE2_CASELESS;
- if (patternOptions & QRegularExpression::DotMatchesEverythingOption)
- options |= PCRE2_DOTALL;
- if (patternOptions & QRegularExpression::MultilineOption)
- options |= PCRE2_MULTILINE;
- if (patternOptions & QRegularExpression::ExtendedPatternSyntaxOption)
- options |= PCRE2_EXTENDED;
- if (patternOptions & QRegularExpression::InvertedGreedinessOption)
- options |= PCRE2_UNGREEDY;
- if (patternOptions & QRegularExpression::DontCaptureOption)
- options |= PCRE2_NO_AUTO_CAPTURE;
- if (patternOptions & QRegularExpression::UseUnicodePropertiesOption)
- options |= PCRE2_UCP;
-
- return options;
-}
-
-/*!
- \internal
-*/
-static int convertToPcreOptions(QRegularExpression::MatchOptions matchOptions)
-{
- int options = 0;
-
- if (matchOptions & QRegularExpression::AnchoredMatchOption)
- options |= PCRE2_ANCHORED;
- if (matchOptions & QRegularExpression::DontCheckSubjectStringMatchOption)
- options |= PCRE2_NO_UTF_CHECK;
-
- return options;
-}
-
-struct QRegularExpressionPrivate : QSharedData
-{
- QRegularExpressionPrivate();
- ~QRegularExpressionPrivate();
- QRegularExpressionPrivate(const QRegularExpressionPrivate &other);
-
- void cleanCompiledPattern();
- void compilePattern();
- void getPatternInfo();
- void optimizePattern();
-
- enum CheckSubjectStringOption {
- CheckSubjectString,
- DontCheckSubjectString
- };
-
- QRegularExpressionMatchPrivate *doMatch(const QString &subject,
- int subjectStartPos,
- int subjectLength,
- int offset,
- QRegularExpression::MatchType matchType,
- QRegularExpression::MatchOptions matchOptions,
- CheckSubjectStringOption checkSubjectStringOption = CheckSubjectString,
- const QRegularExpressionMatchPrivate *previous = 0) const;
-
- int captureIndexForName(QStringView name) const;
-
- // sizeof(QSharedData) == 4, so start our members with an enum
- QRegularExpression::PatternOptions patternOptions;
- QString pattern;
-
- // *All* of the following members are managed while holding this mutex,
- // except for isDirty which is set to true by QRegularExpression setters
- // (right after a detach happened).
- mutable QMutex mutex;
-
- // The PCRE code pointer is reference-counted by the QRegularExpressionPrivate
- // objects themselves; when the private is copied (i.e. a detach happened)
- // it is set to nullptr
- pcre2_code_16 *compiledPattern;
- int errorCode;
- int errorOffset;
- int capturingCount;
- bool usingCrLfNewlines;
- bool isDirty;
-};
-
-struct QRegularExpressionMatchPrivate : QSharedData
-{
- QRegularExpressionMatchPrivate(const QRegularExpression &re,
- const QString &subject,
- int subjectStart,
- int subjectLength,
- QRegularExpression::MatchType matchType,
- QRegularExpression::MatchOptions matchOptions);
-
- QRegularExpressionMatch nextMatch() const;
-
- const QRegularExpression regularExpression;
- const QString subject;
- // the capturedOffsets vector contains pairs of (start, end) positions
- // for each captured substring
- QVector<int> capturedOffsets;
-
- const int subjectStart;
- const int subjectLength;
-
- const QRegularExpression::MatchType matchType;
- const QRegularExpression::MatchOptions matchOptions;
-
- int capturedCount;
-
- bool hasMatch;
- bool hasPartialMatch;
- bool isValid;
-};
-
-struct QRegularExpressionMatchIteratorPrivate : QSharedData
-{
- QRegularExpressionMatchIteratorPrivate(const QRegularExpression &re,
- QRegularExpression::MatchType matchType,
- QRegularExpression::MatchOptions matchOptions,
- const QRegularExpressionMatch &next);
-
- bool hasNext() const;
- QRegularExpressionMatch next;
- const QRegularExpression regularExpression;
- const QRegularExpression::MatchType matchType;
- const QRegularExpression::MatchOptions matchOptions;
-};
-
-/*!
- \internal
-*/
-QRegularExpression::QRegularExpression(QRegularExpressionPrivate &dd)
- : d(&dd)
-{
-}
-
-/*!
- \internal
-*/
-QRegularExpressionPrivate::QRegularExpressionPrivate()
- : QSharedData(),
- patternOptions(0),
- pattern(),
- mutex(),
- compiledPattern(nullptr),
- errorCode(0),
- errorOffset(-1),
- capturingCount(0),
- usingCrLfNewlines(false),
- isDirty(true)
-{
-}
-
-/*!
- \internal
-*/
-QRegularExpressionPrivate::~QRegularExpressionPrivate()
-{
- cleanCompiledPattern();
-}
-
-/*!
- \internal
-
- Copies the private, which means copying only the pattern and the pattern
- options. The compiledPattern pointer is NOT copied (we
- do not own it any more), and in general all the members set when
- compiling a pattern are set to default values. isDirty is set back to true
- so that the pattern has to be recompiled again.
-*/
-QRegularExpressionPrivate::QRegularExpressionPrivate(const QRegularExpressionPrivate &other)
- : QSharedData(other),
- patternOptions(other.patternOptions),
- pattern(other.pattern),
- mutex(),
- compiledPattern(nullptr),
- errorCode(0),
- errorOffset(-1),
- capturingCount(0),
- usingCrLfNewlines(false),
- isDirty(true)
-{
-}
-
-/*!
- \internal
-*/
-void QRegularExpressionPrivate::cleanCompiledPattern()
-{
- pcre2_code_free_16(compiledPattern);
- compiledPattern = nullptr;
- errorCode = 0;
- errorOffset = -1;
- capturingCount = 0;
- usingCrLfNewlines = false;
-}
-
-/*!
- \internal
-*/
-void QRegularExpressionPrivate::compilePattern()
-{
- const QMutexLocker lock(&mutex);
-
- if (!isDirty)
- return;
-
- isDirty = false;
- cleanCompiledPattern();
-
- int options = convertToPcreOptions(patternOptions);
- options |= PCRE2_UTF;
-
- PCRE2_SIZE patternErrorOffset;
- compiledPattern = pcre2_compile_16(pattern.utf16(),
- pattern.length(),
- options,
- &errorCode,
- &patternErrorOffset,
- NULL);
-
- if (!compiledPattern) {
- errorOffset = static_cast<int>(patternErrorOffset);
- return;
- } else {
- // ignore whatever PCRE2 wrote into errorCode -- leave it to 0 to mean "no error"
- errorCode = 0;
- }
-
- optimizePattern();
- getPatternInfo();
-}
-
-/*!
- \internal
-*/
-void QRegularExpressionPrivate::getPatternInfo()
-{
- Q_ASSERT(compiledPattern);
-
- pcre2_pattern_info_16(compiledPattern, PCRE2_INFO_CAPTURECOUNT, &capturingCount);
-
- // detect the settings for the newline
- unsigned int patternNewlineSetting;
- if (pcre2_pattern_info_16(compiledPattern, PCRE2_INFO_NEWLINE, &patternNewlineSetting) != 0) {
- // no option was specified in the regexp, grab PCRE build defaults
- pcre2_config_16(PCRE2_CONFIG_NEWLINE, &patternNewlineSetting);
- }
-
- usingCrLfNewlines = (patternNewlineSetting == PCRE2_NEWLINE_CRLF) ||
- (patternNewlineSetting == PCRE2_NEWLINE_ANY) ||
- (patternNewlineSetting == PCRE2_NEWLINE_ANYCRLF);
-
- unsigned int hasJOptionChanged;
- pcre2_pattern_info_16(compiledPattern, PCRE2_INFO_JCHANGED, &hasJOptionChanged);
- if (Q_UNLIKELY(hasJOptionChanged)) {
- qWarning("QRegularExpressionPrivate::getPatternInfo(): the pattern '%s'\n is using the (?J) option; duplicate capturing group names are not supported by Qt",
- qPrintable(pattern));
- }
-}
-
-
-/*
- Simple "smartpointer" wrapper around a pcre2_jit_stack_16, to be used with
- QThreadStorage.
-*/
-class QPcreJitStackPointer
-{
- Q_DISABLE_COPY(QPcreJitStackPointer)
-
-public:
- /*!
- \internal
- */
- QPcreJitStackPointer()
- {
- // The default JIT stack size in PCRE is 32K,
- // we allocate from 32K up to 512K.
- stack = pcre2_jit_stack_create_16(32 * 1024, 512 * 1024, NULL);
- }
- /*!
- \internal
- */
- ~QPcreJitStackPointer()
- {
- if (stack)
- pcre2_jit_stack_free_16(stack);
- }
-
- pcre2_jit_stack_16 *stack;
-};
-
-Q_GLOBAL_STATIC(QThreadStorage<QPcreJitStackPointer *>, jitStacks)
-
-/*!
- \internal
-*/
-static pcre2_jit_stack_16 *qtPcreCallback(void *)
-{
- if (jitStacks()->hasLocalData())
- return jitStacks()->localData()->stack;
-
- return 0;
-}
-
-/*!
- \internal
-*/
-static bool isJitEnabled()
-{
- QByteArray jitEnvironment = qgetenv("QT_ENABLE_REGEXP_JIT");
- if (!jitEnvironment.isEmpty()) {
- bool ok;
- int enableJit = jitEnvironment.toInt(&ok);
- return ok ? (enableJit != 0) : true;
- }
-
-#ifdef QT_DEBUG
- return false;
-#else
- return true;
-#endif
-}
-
-/*!
- \internal
-
- The purpose of the function is to call pcre2_jit_compile_16, which
- JIT-compiles the pattern.
-
- It gets called when a pattern is recompiled by us (in compilePattern()),
- under mutex protection.
-*/
-void QRegularExpressionPrivate::optimizePattern()
-{
- Q_ASSERT(compiledPattern);
-
- static const bool enableJit = isJitEnabled();
-
- if (!enableJit)
- return;
-
- pcre2_jit_compile_16(compiledPattern, PCRE2_JIT_COMPLETE | PCRE2_JIT_PARTIAL_SOFT | PCRE2_JIT_PARTIAL_HARD);
-}
-
-/*!
- \internal
-
- Returns the capturing group number for the given name. Duplicated names for
- capturing groups are not supported.
-*/
-int QRegularExpressionPrivate::captureIndexForName(QStringView name) const
-{
- Q_ASSERT(!name.isEmpty());
-
- if (!compiledPattern)
- return -1;
-
- int index = pcre2_substring_number_from_name_16(compiledPattern, reinterpret_cast<PCRE2_SPTR16>(name.utf16()));
- if (index >= 0)
- return index;
-
- return -1;
-}
-
-/*!
- \internal
-
- This is a simple wrapper for pcre2_match_16 for handling the case in which the
- JIT runs out of memory. In that case, we allocate a thread-local JIT stack
- and re-run pcre2_match_16.
-*/
-static int safe_pcre2_match_16(const pcre2_code_16 *code,
- const unsigned short *subject, int length,
- int startOffset, int options,
- pcre2_match_data_16 *matchData,
- pcre2_match_context_16 *matchContext)
-{
- int result = pcre2_match_16(code, subject, length,
- startOffset, options, matchData, matchContext);
-
- if (result == PCRE2_ERROR_JIT_STACKLIMIT && !jitStacks()->hasLocalData()) {
- QPcreJitStackPointer *p = new QPcreJitStackPointer;
- jitStacks()->setLocalData(p);
-
- result = pcre2_match_16(code, subject, length,
- startOffset, options, matchData, matchContext);
- }
-
- return result;
-}
-
-/*!
- \internal
-
- Performs a match on the substring of the given \a subject string,
- substring which starts from \a subjectStart and up to
- (but not including) \a subjectStart + \a subjectLength. The match
- will be of type \a matchType and using the options \a matchOptions;
- the matching \a offset is relative the substring,
- and if negative, it's taken as an offset from the end of the substring.
-
- It also advances a match if a previous result is given as \a
- previous. The \a subject string goes a Unicode validity check if
- \a checkSubjectString is CheckSubjectString and the match options don't
- include DontCheckSubjectStringMatchOption (PCRE doesn't like illegal
- UTF-16 sequences).
-
- Returns the QRegularExpressionMatchPrivate of the result.
-
- Advancing a match is a tricky algorithm. If the previous match matched a
- non-empty string, we just do an ordinary match at the offset position.
-
- If the previous match matched an empty string, then an anchored, non-empty
- match is attempted at the offset position. If that succeeds, then we got
- the next match and we can return it. Otherwise, we advance by 1 position
- (which can be one or two code units in UTF-16!) and reattempt a "normal"
- match. We also have the problem of detecting the current newline format: if
- the new advanced offset is pointing to the beginning of a CRLF sequence, we
- must advance over it.
-*/
-QRegularExpressionMatchPrivate *QRegularExpressionPrivate::doMatch(const QString &subject,
- int subjectStart,
- int subjectLength,
- int offset,
- QRegularExpression::MatchType matchType,
- QRegularExpression::MatchOptions matchOptions,
- CheckSubjectStringOption checkSubjectStringOption,
- const QRegularExpressionMatchPrivate *previous) const
-{
- if (offset < 0)
- offset += subjectLength;
-
- QRegularExpression re(*const_cast<QRegularExpressionPrivate *>(this));
-
- QRegularExpressionMatchPrivate *priv = new QRegularExpressionMatchPrivate(re, subject,
- subjectStart, subjectLength,
- matchType, matchOptions);
-
- if (offset < 0 || offset > subjectLength)
- return priv;
-
- if (Q_UNLIKELY(!compiledPattern)) {
- qWarning("QRegularExpressionPrivate::doMatch(): called on an invalid QRegularExpression object");
- return priv;
- }
-
- // skip doing the actual matching if NoMatch type was requested
- if (matchType == QRegularExpression::NoMatch) {
- priv->isValid = true;
- return priv;
- }
-
- int pcreOptions = convertToPcreOptions(matchOptions);
-
- if (matchType == QRegularExpression::PartialPreferCompleteMatch)
- pcreOptions |= PCRE2_PARTIAL_SOFT;
- else if (matchType == QRegularExpression::PartialPreferFirstMatch)
- pcreOptions |= PCRE2_PARTIAL_HARD;
-
- if (checkSubjectStringOption == DontCheckSubjectString)
- pcreOptions |= PCRE2_NO_UTF_CHECK;
-
- bool previousMatchWasEmpty = false;
- if (previous && previous->hasMatch &&
- (previous->capturedOffsets.at(0) == previous->capturedOffsets.at(1))) {
- previousMatchWasEmpty = true;
- }
-
- pcre2_match_context_16 *matchContext = pcre2_match_context_create_16(NULL);
- pcre2_jit_stack_assign_16(matchContext, &qtPcreCallback, NULL);
- pcre2_match_data_16 *matchData = pcre2_match_data_create_from_pattern_16(compiledPattern, NULL);
-
- const unsigned short * const subjectUtf16 = subject.utf16() + subjectStart;
-
- int result;
-
- if (!previousMatchWasEmpty) {
- result = safe_pcre2_match_16(compiledPattern,
- subjectUtf16, subjectLength,
- offset, pcreOptions,
- matchData, matchContext);
- } else {
- result = safe_pcre2_match_16(compiledPattern,
- subjectUtf16, subjectLength,
- offset, pcreOptions | PCRE2_NOTEMPTY_ATSTART | PCRE2_ANCHORED,
- matchData, matchContext);
-
- if (result == PCRE2_ERROR_NOMATCH) {
- ++offset;
-
- if (usingCrLfNewlines
- && offset < subjectLength
- && subjectUtf16[offset - 1] == QLatin1Char('\r')
- && subjectUtf16[offset] == QLatin1Char('\n')) {
- ++offset;
- } else if (offset < subjectLength
- && QChar::isLowSurrogate(subjectUtf16[offset])) {
- ++offset;
- }
-
- result = safe_pcre2_match_16(compiledPattern,
- subjectUtf16, subjectLength,
- offset, pcreOptions,
- matchData, matchContext);
- }
- }
-
-#ifdef QREGULAREXPRESSION_DEBUG
- qDebug() << "Matching" << pattern << "against" << subject
- << "starting at" << subjectStart << "len" << subjectLength
- << "offset" << offset
- << matchType << matchOptions << previousMatchWasEmpty
- << "result" << result;
-#endif
-
- // result == 0 means not enough space in captureOffsets; should never happen
- Q_ASSERT(result != 0);
-
- if (result > 0) {
- // full match
- priv->isValid = true;
- priv->hasMatch = true;
- priv->capturedCount = result;
- priv->capturedOffsets.resize(result * 2);
- } else {
- // no match, partial match or error
- priv->hasPartialMatch = (result == PCRE2_ERROR_PARTIAL);
- priv->isValid = (result == PCRE2_ERROR_NOMATCH || result == PCRE2_ERROR_PARTIAL);
-
- if (result == PCRE2_ERROR_PARTIAL) {
- // partial match:
- // leave the start and end capture offsets (i.e. cap(0))
- priv->capturedCount = 1;
- priv->capturedOffsets.resize(2);
- } else {
- // no match or error
- priv->capturedCount = 0;
- priv->capturedOffsets.clear();
- }
- }
-
- // copy the captured substrings offsets, if any
- if (priv->capturedCount) {
- PCRE2_SIZE *ovector = pcre2_get_ovector_pointer_16(matchData);
- int * const capturedOffsets = priv->capturedOffsets.data();
-
- for (int i = 0; i < priv->capturedCount * 2; ++i)
- capturedOffsets[i] = static_cast<int>(ovector[i]);
-
- // For partial matches, PCRE2 and PCRE1 differ in behavior when lookbehinds
- // are involved. PCRE2 reports the real begin of the match and the maximum
- // used lookbehind as distinct information; PCRE1 instead automatically
- // adjusted ovector[0] to include the maximum lookbehind.
- //
- // For instance, given the pattern "\bstring\b", and the subject "a str":
- // * PCRE1 reports partial, capturing " str"
- // * PCRE2 reports partial, capturing "str" with a lookbehind of 1
- //
- // To keep behavior, emulate PCRE1 here.
- // (Eventually, we could expose the lookbehind info in a future patch.)
- if (result == PCRE2_ERROR_PARTIAL) {
- unsigned int maximumLookBehind;
- pcre2_pattern_info_16(compiledPattern, PCRE2_INFO_MAXLOOKBEHIND, &maximumLookBehind);
- capturedOffsets[0] -= maximumLookBehind;
- }
- }
-
- pcre2_match_data_free_16(matchData);
- pcre2_match_context_free_16(matchContext);
-
- return priv;
-}
-
-/*!
- \internal
-*/
-QRegularExpressionMatchPrivate::QRegularExpressionMatchPrivate(const QRegularExpression &re,
- const QString &subject,
- int subjectStart,
- int subjectLength,
- QRegularExpression::MatchType matchType,
- QRegularExpression::MatchOptions matchOptions)
- : regularExpression(re), subject(subject),
- subjectStart(subjectStart), subjectLength(subjectLength),
- matchType(matchType), matchOptions(matchOptions),
- capturedCount(0),
- hasMatch(false), hasPartialMatch(false), isValid(false)
-{
-}
-
-
-/*!
- \internal
-*/
-QRegularExpressionMatch QRegularExpressionMatchPrivate::nextMatch() const
-{
- Q_ASSERT(isValid);
- Q_ASSERT(hasMatch || hasPartialMatch);
-
- // Note the DontCheckSubjectString passed for the check of the subject string:
- // if we're advancing a match on the same subject,
- // then that subject was already checked at least once (when this object
- // was created, or when the object that created this one was created, etc.)
- QRegularExpressionMatchPrivate *nextPrivate = regularExpression.d->doMatch(subject,
- subjectStart,
- subjectLength,
- capturedOffsets.at(1),
- matchType,
- matchOptions,
- QRegularExpressionPrivate::DontCheckSubjectString,
- this);
- return QRegularExpressionMatch(*nextPrivate);
-}
-
-/*!
- \internal
-*/
-QRegularExpressionMatchIteratorPrivate::QRegularExpressionMatchIteratorPrivate(const QRegularExpression &re,
- QRegularExpression::MatchType matchType,
- QRegularExpression::MatchOptions matchOptions,
- const QRegularExpressionMatch &next)
- : next(next),
- regularExpression(re),
- matchType(matchType), matchOptions(matchOptions)
-{
-}
-
-/*!
- \internal
-*/
-bool QRegularExpressionMatchIteratorPrivate::hasNext() const
-{
- return next.isValid() && (next.hasMatch() || next.hasPartialMatch());
-}
-
-// PUBLIC API
-
-/*!
- Constructs a QRegularExpression object with an empty pattern and no pattern
- options.
-
- \sa setPattern(), setPatternOptions()
-*/
-QRegularExpression::QRegularExpression()
- : d(new QRegularExpressionPrivate)
-{
-}
-
-/*!
- Constructs a QRegularExpression object using the given \a pattern as
- pattern and the \a options as the pattern options.
-
- \sa setPattern(), setPatternOptions()
-*/
-QRegularExpression::QRegularExpression(const QString &pattern, PatternOptions options)
- : d(new QRegularExpressionPrivate)
-{
- d->pattern = pattern;
- d->patternOptions = options;
-}
-
-/*!
- Constructs a QRegularExpression object as a copy of \a re.
-
- \sa operator=()
-*/
-QRegularExpression::QRegularExpression(const QRegularExpression &re)
- : d(re.d)
-{
-}
-
-/*!
- Destroys the QRegularExpression object.
-*/
-QRegularExpression::~QRegularExpression()
-{
-}
-
-/*!
- Assigns the regular expression \a re to this object, and returns a reference
- to the copy. Both the pattern and the pattern options are copied.
-*/
-QRegularExpression &QRegularExpression::operator=(const QRegularExpression &re)
-{
- d = re.d;
- return *this;
-}
-
-/*!
- \fn void QRegularExpression::swap(QRegularExpression &other)
-
- Swaps the regular expression \a other with this regular expression. This
- operation is very fast and never fails.
-*/
-
-/*!
- Returns the pattern string of the regular expression.
-
- \sa setPattern(), patternOptions()
-*/
-QString QRegularExpression::pattern() const
-{
- return d->pattern;
-}
-
-/*!
- Sets the pattern string of the regular expression to \a pattern. The
- pattern options are left unchanged.
-
- \sa pattern(), setPatternOptions()
-*/
-void QRegularExpression::setPattern(const QString &pattern)
-{
- d.detach();
- d->isDirty = true;
- d->pattern = pattern;
-}
-
-/*!
- Returns the pattern options for the regular expression.
-
- \sa setPatternOptions(), pattern()
-*/
-QRegularExpression::PatternOptions QRegularExpression::patternOptions() const
-{
- return d->patternOptions;
-}
-
-/*!
- Sets the given \a options as the pattern options of the regular expression.
- The pattern string is left unchanged.
-
- \sa patternOptions(), setPattern()
-*/
-void QRegularExpression::setPatternOptions(PatternOptions options)
-{
- d.detach();
- d->isDirty = true;
- d->patternOptions = options;
-}
-
-/*!
- Returns the number of capturing groups inside the pattern string,
- or -1 if the regular expression is not valid.
-
- \note The implicit capturing group 0 is \e{not} included in the returned number.
-
- \sa isValid()
-*/
-int QRegularExpression::captureCount() const
-{
- if (!isValid()) // will compile the pattern
- return -1;
- return d->capturingCount;
-}
-
-/*!
- \since 5.1
-
- Returns a list of captureCount() + 1 elements, containing the names of the
- named capturing groups in the pattern string. The list is sorted such that
- the element of the list at position \c{i} is the name of the \c{i}-th
- capturing group, if it has a name, or an empty string if that capturing
- group is unnamed.
-
- For instance, given the regular expression
-
- \snippet code/src_corelib_tools_qregularexpression.cpp 32
-
- namedCaptureGroups() will return the following list:
-
- \snippet code/src_corelib_tools_qregularexpression.cpp 33
-
- which corresponds to the fact that the capturing group #0 (corresponding to
- the whole match) has no name, the capturing group #1 has name "day", the
- capturing group #2 has name "month", etc.
-
- If the regular expression is not valid, returns an empty list.
-
- \sa isValid(), QRegularExpressionMatch::captured(), QString::isEmpty()
-*/
-QStringList QRegularExpression::namedCaptureGroups() const
-{
- if (!isValid()) // isValid() will compile the pattern
- return QStringList();
-
- // namedCapturingTable will point to a table of
- // namedCapturingTableEntryCount entries, each one of which
- // contains one ushort followed by the name, NUL terminated.
- // The ushort is the numerical index of the name in the pattern.
- // The length of each entry is namedCapturingTableEntrySize.
- PCRE2_SPTR16 *namedCapturingTable;
- unsigned int namedCapturingTableEntryCount;
- unsigned int namedCapturingTableEntrySize;
-
- pcre2_pattern_info_16(d->compiledPattern, PCRE2_INFO_NAMETABLE, &namedCapturingTable);
- pcre2_pattern_info_16(d->compiledPattern, PCRE2_INFO_NAMECOUNT, &namedCapturingTableEntryCount);
- pcre2_pattern_info_16(d->compiledPattern, PCRE2_INFO_NAMEENTRYSIZE, &namedCapturingTableEntrySize);
-
- QStringList result;
-
- // no QList::resize nor fill is available. The +1 is for the implicit group #0
- result.reserve(d->capturingCount + 1);
- for (int i = 0; i < d->capturingCount + 1; ++i)
- result.append(QString());
-
- for (unsigned int i = 0; i < namedCapturingTableEntryCount; ++i) {
- const ushort * const currentNamedCapturingTableRow =
- reinterpret_cast<const ushort *>(namedCapturingTable) + namedCapturingTableEntrySize * i;
-
- const int index = *currentNamedCapturingTableRow;
- result[index] = QString::fromUtf16(currentNamedCapturingTableRow + 1);
- }
-
- return result;
-}
-
-/*!
- Returns \c true if the regular expression is a valid regular expression (that
- is, it contains no syntax errors, etc.), or false otherwise. Use
- errorString() to obtain a textual description of the error.
-
- \sa errorString(), patternErrorOffset()
-*/
-bool QRegularExpression::isValid() const
-{
- d.data()->compilePattern();
- return d->compiledPattern;
-}
-
-/*!
- Returns a textual description of the error found when checking the validity
- of the regular expression, or "no error" if no error was found.
-
- \sa isValid(), patternErrorOffset()
-*/
-QString QRegularExpression::errorString() const
-{
- d.data()->compilePattern();
- if (d->errorCode) {
- QString errorString;
- int errorStringLength;
- do {
- errorString.resize(errorString.length() + 64);
- errorStringLength = pcre2_get_error_message_16(d->errorCode,
- reinterpret_cast<ushort *>(errorString.data()),
- errorString.length());
- } while (errorStringLength < 0);
- errorString.resize(errorStringLength);
-
- return QCoreApplication::translate("QRegularExpression", std::move(errorString).toLatin1().constData());
- }
- return QCoreApplication::translate("QRegularExpression", "no error");
-}
-
-/*!
- Returns the offset, inside the pattern string, at which an error was found
- when checking the validity of the regular expression. If no error was
- found, then -1 is returned.
-
- \sa pattern(), isValid(), errorString()
-*/
-int QRegularExpression::patternErrorOffset() const
-{
- d.data()->compilePattern();
- return d->errorOffset;
-}
-
-/*!
- Attempts to match the regular expression against the given \a subject
- string, starting at the position \a offset inside the subject, using a
- match of type \a matchType and honoring the given \a matchOptions.
-
- The returned QRegularExpressionMatch object contains the results of the
- match.
-
- \sa QRegularExpressionMatch, {normal matching}
-*/
-QRegularExpressionMatch QRegularExpression::match(const QString &subject,
- int offset,
- MatchType matchType,
- MatchOptions matchOptions) const
-{
- d.data()->compilePattern();
-
- QRegularExpressionMatchPrivate *priv = d->doMatch(subject, 0, subject.length(), offset, matchType, matchOptions);
- return QRegularExpressionMatch(*priv);
-}
-
-/*!
- \since 5.5
- \overload
-
- Attempts to match the regular expression against the given \a subjectRef
- string reference, starting at the position \a offset inside the subject, using a
- match of type \a matchType and honoring the given \a matchOptions.
-
- The returned QRegularExpressionMatch object contains the results of the
- match.
-
- \sa QRegularExpressionMatch, {normal matching}
-*/
-QRegularExpressionMatch QRegularExpression::match(const QStringRef &subjectRef,
- int offset,
- MatchType matchType,
- MatchOptions matchOptions) const
-{
- d.data()->compilePattern();
-
- const QString subject = subjectRef.string() ? *subjectRef.string() : QString();
-
- QRegularExpressionMatchPrivate *priv = d->doMatch(subject, subjectRef.position(), subjectRef.length(), offset, matchType, matchOptions);
- return QRegularExpressionMatch(*priv);
-}
-
-/*!
- Attempts to perform a global match of the regular expression against the
- given \a subject string, starting at the position \a offset inside the
- subject, using a match of type \a matchType and honoring the given \a
- matchOptions.
-
- The returned QRegularExpressionMatchIterator is positioned before the
- first match result (if any).
-
- \sa QRegularExpressionMatchIterator, {global matching}
-*/
-QRegularExpressionMatchIterator QRegularExpression::globalMatch(const QString &subject,
- int offset,
- MatchType matchType,
- MatchOptions matchOptions) const
-{
- QRegularExpressionMatchIteratorPrivate *priv =
- new QRegularExpressionMatchIteratorPrivate(*this,
- matchType,
- matchOptions,
- match(subject, offset, matchType, matchOptions));
-
- return QRegularExpressionMatchIterator(*priv);
-}
-
-/*!
- \since 5.5
- \overload
-
- Attempts to perform a global match of the regular expression against the
- given \a subjectRef string reference, starting at the position \a offset inside the
- subject, using a match of type \a matchType and honoring the given \a
- matchOptions.
-
- The returned QRegularExpressionMatchIterator is positioned before the
- first match result (if any).
-
- \sa QRegularExpressionMatchIterator, {global matching}
-*/
-QRegularExpressionMatchIterator QRegularExpression::globalMatch(const QStringRef &subjectRef,
- int offset,
- MatchType matchType,
- MatchOptions matchOptions) const
-{
- QRegularExpressionMatchIteratorPrivate *priv =
- new QRegularExpressionMatchIteratorPrivate(*this,
- matchType,
- matchOptions,
- match(subjectRef, offset, matchType, matchOptions));
-
- return QRegularExpressionMatchIterator(*priv);
-}
-
-/*!
- \since 5.4
-
- Compiles the pattern immediately, including JIT compiling it (if
- the JIT is enabled) for optimization.
-
- \sa isValid(), {Debugging Code that Uses QRegularExpression}
-*/
-void QRegularExpression::optimize() const
-{
- d.data()->compilePattern();
-}
-
-/*!
- Returns \c true if the regular expression is equal to \a re, or false
- otherwise. Two QRegularExpression objects are equal if they have
- the same pattern string and the same pattern options.
-
- \sa operator!=()
-*/
-bool QRegularExpression::operator==(const QRegularExpression &re) const
-{
- return (d == re.d) ||
- (d->pattern == re.d->pattern && d->patternOptions == re.d->patternOptions);
-}
-
-/*!
- \fn QRegularExpression & QRegularExpression::operator=(QRegularExpression && re)
-
- Move-assigns the regular expression \a re to this object, and returns a reference
- to the copy. Both the pattern and the pattern options are copied.
-*/
-
-/*!
- \fn bool QRegularExpression::operator!=(const QRegularExpression &re) const
-
- Returns \c true if the regular expression is different from \a re, or
- false otherwise.
-
- \sa operator==()
-*/
-
-/*!
- \since 5.6
- \relates QRegularExpression
-
- Returns the hash value for \a key, using
- \a seed to seed the calculation.
-*/
-uint qHash(const QRegularExpression &key, uint seed) Q_DECL_NOTHROW
-{
- QtPrivate::QHashCombine hash;
- seed = hash(seed, key.d->pattern);
- seed = hash(seed, key.d->patternOptions);
- return seed;
-}
-
-/*!
- Escapes all characters of \a str so that they no longer have any special
- meaning when used as a regular expression pattern string, and returns
- the escaped string. For instance:
-
- \snippet code/src_corelib_tools_qregularexpression.cpp 26
-
- This is very convenient in order to build patterns from arbitrary strings:
-
- \snippet code/src_corelib_tools_qregularexpression.cpp 27
-
- \note This function implements Perl's quotemeta algorithm and escapes with
- a backslash all characters in \a str, except for the characters in the
- \c{[A-Z]}, \c{[a-z]} and \c{[0-9]} ranges, as well as the underscore
- (\c{_}) character. The only difference with Perl is that a literal NUL
- inside \a str is escaped with the sequence \c{"\\0"} (backslash +
- \c{'0'}), instead of \c{"\\\0"} (backslash + \c{NUL}).
-*/
-QString QRegularExpression::escape(const QString &str)
-{
- QString result;
- const int count = str.size();
- result.reserve(count * 2);
-
- // everything but [a-zA-Z0-9_] gets escaped,
- // cf. perldoc -f quotemeta
- for (int i = 0; i < count; ++i) {
- const QChar current = str.at(i);
-
- if (current == QChar::Null) {
- // unlike Perl, a literal NUL must be escaped with
- // "\\0" (backslash + 0) and not "\\\0" (backslash + NUL),
- // because pcre16_compile uses a NUL-terminated string
- result.append(QLatin1Char('\\'));
- result.append(QLatin1Char('0'));
- } else if ( (current < QLatin1Char('a') || current > QLatin1Char('z')) &&
- (current < QLatin1Char('A') || current > QLatin1Char('Z')) &&
- (current < QLatin1Char('0') || current > QLatin1Char('9')) &&
- current != QLatin1Char('_') )
- {
- result.append(QLatin1Char('\\'));
- result.append(current);
- if (current.isHighSurrogate() && i < (count - 1))
- result.append(str.at(++i));
- } else {
- result.append(current);
- }
- }
-
- result.squeeze();
- return result;
-}
-
-/*!
- \since 5.12
-
- Returns a regular expression representation of the given glob \a pattern.
- The transformation is targeting file path globbing, which means in particular
- that path separators receive special treatment. This implies that it is not
- just a basic translation from "*" to ".*".
-
- \snippet code/src_corelib_tools_qregularexpression.cpp 31
-
- \warning Unlike QRegExp, this implementation follows closely the definition
- of wildcard for glob patterns:
- \table
- \row \li \b{c}
- \li Any character represents itself apart from those mentioned
- below. Thus \b{c} matches the character \e c.
- \row \li \b{?}
- \li Matches any single character. It is the same as
- \b{.} in full regexps.
- \row \li \b{*}
- \li Matches zero or more of any characters. It is the
- same as \b{.*} in full regexps.
- \row \li \b{[abc]}
- \li Matches one character given in the bracket.
- \row \li \b{[a-c]}
- \li Matches one character from the range given in the bracket.
- \row \li \b{[!abc]}
- \li Matches one character that is not given in the bracket. It is the
- same as \b{[^abc]} in full regexp.
- \row \li \b{[!a-c]}
- \li Matches one character that is not from the range given in the
- bracket. It is the same as \b{[^a-c]} in full regexp.
- \endtable
-
- \note The backslash (\\) character is \e not an escape char in this context.
- In order to match one of the special characters, place it in square brackets
- (for example, "[?]").
-
- More information about the implementation can be found in:
- \list
- \li \l {https://en.wikipedia.org/wiki/Glob_(programming)} {The Wikipedia Glob article}
- \li \c man 7 glob
- \endlist
-
- \sa escape()
-*/
-QString QRegularExpression::wildcardToRegularExpression(const QString &pattern)
-{
- const int wclen = pattern.length();
- QString rx;
- rx.reserve(wclen + wclen / 16);
- int i = 0;
- const QChar *wc = pattern.unicode();
-
-#ifdef Q_OS_WIN
- const QLatin1Char nativePathSeparator('\\');
- const QLatin1String starEscape("[^/\\\\]*");
- const QLatin1String questionMarkEscape("[^/\\\\]");
-#else
- const QLatin1Char nativePathSeparator('/');
- const QLatin1String starEscape("[^/]*");
- const QLatin1String questionMarkEscape("[^/]");
-#endif
-
- while (i < wclen) {
- const QChar c = wc[i++];
- switch (c.unicode()) {
- case '*':
- rx += starEscape;
- break;
- case '?':
- rx += questionMarkEscape;
- break;
- case '\\':
-#ifdef Q_OS_WIN
- case '/':
- rx += QLatin1String("[/\\\\]");
- break;
-#endif
- case '$':
- case '(':
- case ')':
- case '+':
- case '.':
- case '^':
- case '{':
- case '|':
- case '}':
- rx += QLatin1Char('\\');
- rx += c;
- break;
- case '[':
- rx += c;
- // Support for the [!abc] or [!a-c] syntax
- if (i < wclen) {
- if (wc[i] == QLatin1Char('!')) {
- rx += QLatin1Char('^');
- ++i;
- }
-
- if (i < wclen && wc[i] == QLatin1Char(']'))
- rx += wc[i++];
-
- while (i < wclen && wc[i] != QLatin1Char(']')) {
- // The '/' appearing in a character class invalidates the
- // regular expression parsing. It also concerns '\\' on
- // Windows OS types.
- if (wc[i] == QLatin1Char('/') || wc[i] == nativePathSeparator)
- return rx;
- if (wc[i] == QLatin1Char('\\'))
- rx += QLatin1Char('\\');
- rx += wc[i++];
- }
- }
- break;
- default:
- rx += c;
- break;
- }
- }
-
- return anchoredPattern(rx);
-}
-
-/*!
- \fn QRegularExpression::anchoredPattern(const QString &expression)
-
- \since 5.12
-
- Returns the \a expression wrapped between the \c{\A} and \c{\z} anchors to
- be used for exact matching.
-
- \sa {Porting from QRegExp's Exact Matching}
-*/
-
-/*!
- \since 5.1
-
- Constructs a valid, empty QRegularExpressionMatch object. The regular
- expression is set to a default-constructed one; the match type to
- QRegularExpression::NoMatch and the match options to
- QRegularExpression::NoMatchOption.
-
- The object will report no match through the hasMatch() and the
- hasPartialMatch() member functions.
-*/
-QRegularExpressionMatch::QRegularExpressionMatch()
- : d(new QRegularExpressionMatchPrivate(QRegularExpression(),
- QString(),
- 0,
- 0,
- QRegularExpression::NoMatch,
- QRegularExpression::NoMatchOption))
-{
- d->isValid = true;
-}
-
-/*!
- Destroys the match result.
-*/
-QRegularExpressionMatch::~QRegularExpressionMatch()
-{
-}
-
-/*!
- Constructs a match result by copying the result of the given \a match.
-
- \sa operator=()
-*/
-QRegularExpressionMatch::QRegularExpressionMatch(const QRegularExpressionMatch &match)
- : d(match.d)
-{
-}
-
-/*!
- Assigns the match result \a match to this object, and returns a reference
- to the copy.
-*/
-QRegularExpressionMatch &QRegularExpressionMatch::operator=(const QRegularExpressionMatch &match)
-{
- d = match.d;
- return *this;
-}
-
-/*!
- \fn QRegularExpressionMatch &QRegularExpressionMatch::operator=(QRegularExpressionMatch &&match)
-
- Move-assigns the match result \a match to this object, and returns a reference
- to the copy.
-*/
-
-/*!
- \fn void QRegularExpressionMatch::swap(QRegularExpressionMatch &other)
-
- Swaps the match result \a other with this match result. This
- operation is very fast and never fails.
-*/
-
-/*!
- \internal
-*/
-QRegularExpressionMatch::QRegularExpressionMatch(QRegularExpressionMatchPrivate &dd)
- : d(&dd)
-{
-}
-
-/*!
- Returns the QRegularExpression object whose match() function returned this
- object.
-
- \sa QRegularExpression::match(), matchType(), matchOptions()
-*/
-QRegularExpression QRegularExpressionMatch::regularExpression() const
-{
- return d->regularExpression;
-}
-
-
-/*!
- Returns the match type that was used to get this QRegularExpressionMatch
- object, that is, the match type that was passed to
- QRegularExpression::match() or QRegularExpression::globalMatch().
-
- \sa QRegularExpression::match(), regularExpression(), matchOptions()
-*/
-QRegularExpression::MatchType QRegularExpressionMatch::matchType() const
-{
- return d->matchType;
-}
-
-/*!
- Returns the match options that were used to get this
- QRegularExpressionMatch object, that is, the match options that were passed
- to QRegularExpression::match() or QRegularExpression::globalMatch().
-
- \sa QRegularExpression::match(), regularExpression(), matchType()
-*/
-QRegularExpression::MatchOptions QRegularExpressionMatch::matchOptions() const
-{
- return d->matchOptions;
-}
-
-/*!
- Returns the index of the last capturing group that captured something,
- including the implicit capturing group 0. This can be used to extract all
- the substrings that were captured:
-
- \snippet code/src_corelib_tools_qregularexpression.cpp 28
-
- Note that some of the capturing groups with an index less than
- lastCapturedIndex() could have not matched, and therefore captured nothing.
-
- If the regular expression did not match, this function returns -1.
-
- \sa captured(), capturedStart(), capturedEnd(), capturedLength()
-*/
-int QRegularExpressionMatch::lastCapturedIndex() const
-{
- return d->capturedCount - 1;
-}
-
-/*!
- Returns the substring captured by the \a nth capturing group.
-
- If the \a nth capturing group did not capture a string, or if there is no
- such capturing group, returns a null QString.
-
- \note The implicit capturing group number 0 captures the substring matched
- by the entire pattern.
-
- \sa capturedRef(), capturedView(), lastCapturedIndex(), capturedStart(), capturedEnd(),
- capturedLength(), QString::isNull()
-*/
-QString QRegularExpressionMatch::captured(int nth) const
-{
- if (nth < 0 || nth > lastCapturedIndex())
- return QString();
-
- int start = capturedStart(nth);
-
- if (start == -1) // didn't capture
- return QString();
-
- return d->subject.mid(start + d->subjectStart, capturedLength(nth));
-}
-
-/*!
- Returns a reference to the substring captured by the \a nth capturing group.
-
- If the \a nth capturing group did not capture a string, or if there is no
- such capturing group, returns a null QStringRef.
-
- \note The implicit capturing group number 0 captures the substring matched
- by the entire pattern.
-
- \sa captured(), capturedView(), lastCapturedIndex(), capturedStart(), capturedEnd(),
- capturedLength(), QStringRef::isNull()
-*/
-QStringRef QRegularExpressionMatch::capturedRef(int nth) const
-{
- if (nth < 0 || nth > lastCapturedIndex())
- return QStringRef();
-
- int start = capturedStart(nth);
-
- if (start == -1) // didn't capture
- return QStringRef();
-
- return d->subject.midRef(start + d->subjectStart, capturedLength(nth));
-}
-
-/*!
- \since 5.10
-
- Returns a view of the substring captured by the \a nth capturing group.
-
- If the \a nth capturing group did not capture a string, or if there is no
- such capturing group, returns a null QStringView.
-
- \note The implicit capturing group number 0 captures the substring matched
- by the entire pattern.
-
- \sa captured(), capturedRef(), lastCapturedIndex(), capturedStart(), capturedEnd(),
- capturedLength(), QStringView::isNull()
-*/
-QStringView QRegularExpressionMatch::capturedView(int nth) const
-{
- return capturedRef(nth);
-}
-
-#if QT_STRINGVIEW_LEVEL < 2
-/*!
- Returns the substring captured by the capturing group named \a name.
-
- If the named capturing group \a name did not capture a string, or if
- there is no capturing group named \a name, returns a null QString.
-
- \sa capturedRef(), capturedView(), capturedStart(), capturedEnd(), capturedLength(),
- QString::isNull()
-*/
-QString QRegularExpressionMatch::captured(const QString &name) const
-{
- return captured(qToStringViewIgnoringNull(name));
-}
-
-/*!
- Returns a reference to the string captured by the capturing group named \a
- name.
-
- If the named capturing group \a name did not capture a string, or if
- there is no capturing group named \a name, returns a null QStringRef.
-
- \sa captured(), capturedView(), capturedStart(), capturedEnd(), capturedLength(),
- QStringRef::isNull()
-*/
-QStringRef QRegularExpressionMatch::capturedRef(const QString &name) const
-{
- return capturedRef(qToStringViewIgnoringNull(name));
-}
-#endif // QT_STRINGVIEW_LEVEL < 2
-
-/*!
- \since 5.10
-
- Returns the substring captured by the capturing group named \a name.
-
- If the named capturing group \a name did not capture a string, or if
- there is no capturing group named \a name, returns a null QString.
-
- \sa capturedRef(), capturedView(), capturedStart(), capturedEnd(), capturedLength(),
- QString::isNull()
-*/
-QString QRegularExpressionMatch::captured(QStringView name) const
-{
- if (name.isEmpty()) {
- qWarning("QRegularExpressionMatch::captured: empty capturing group name passed");
- return QString();
- }
- int nth = d->regularExpression.d->captureIndexForName(name);
- if (nth == -1)
- return QString();
- return captured(nth);
-}
-
-/*!
- \since 5.10
-
- Returns a reference to the string captured by the capturing group named \a
- name.
-
- If the named capturing group \a name did not capture a string, or if
- there is no capturing group named \a name, returns a null QStringRef.
-
- \sa captured(), capturedView(), capturedStart(), capturedEnd(), capturedLength(),
- QStringRef::isNull()
-*/
-QStringRef QRegularExpressionMatch::capturedRef(QStringView name) const
-{
- if (name.isEmpty()) {
- qWarning("QRegularExpressionMatch::capturedRef: empty capturing group name passed");
- return QStringRef();
- }
- int nth = d->regularExpression.d->captureIndexForName(name);
- if (nth == -1)
- return QStringRef();
- return capturedRef(nth);
-}
-
-/*!
- \since 5.10
-
- Returns a view of the string captured by the capturing group named \a
- name.
-
- If the named capturing group \a name did not capture a string, or if
- there is no capturing group named \a name, returns a null QStringView.
-
- \sa captured(), capturedRef(), capturedStart(), capturedEnd(), capturedLength(),
- QStringRef::isNull()
-*/
-QStringView QRegularExpressionMatch::capturedView(QStringView name) const
-{
- if (name.isEmpty()) {
- qWarning("QRegularExpressionMatch::capturedView: empty capturing group name passed");
- return QStringView();
- }
- int nth = d->regularExpression.d->captureIndexForName(name);
- if (nth == -1)
- return QStringView();
- return capturedView(nth);
-}
-
-/*!
- Returns a list of all strings captured by capturing groups, in the order
- the groups themselves appear in the pattern string. The list includes the
- implicit capturing group number 0, capturing the substring matched by the
- entire pattern.
-*/
-QStringList QRegularExpressionMatch::capturedTexts() const
-{
- QStringList texts;
- texts.reserve(d->capturedCount);
- for (int i = 0; i < d->capturedCount; ++i)
- texts << captured(i);
- return texts;
-}
-
-/*!
- Returns the offset inside the subject string corresponding to the
- starting position of the substring captured by the \a nth capturing group.
- If the \a nth capturing group did not capture a string or doesn't exist,
- returns -1.
-
- \sa capturedEnd(), capturedLength(), captured()
-*/
-int QRegularExpressionMatch::capturedStart(int nth) const
-{
- if (nth < 0 || nth > lastCapturedIndex())
- return -1;
-
- return d->capturedOffsets.at(nth * 2);
-}
-
-/*!
- Returns the length of the substring captured by the \a nth capturing group.
-
- \note This function returns 0 if the \a nth capturing group did not capture
- a string or doesn't exist.
-
- \sa capturedStart(), capturedEnd(), captured()
-*/
-int QRegularExpressionMatch::capturedLength(int nth) const
-{
- // bound checking performed by these two functions
- return capturedEnd(nth) - capturedStart(nth);
-}
-
-/*!
- Returns the offset inside the subject string immediately after the ending
- position of the substring captured by the \a nth capturing group. If the \a
- nth capturing group did not capture a string or doesn't exist, returns -1.
-
- \sa capturedStart(), capturedLength(), captured()
-*/
-int QRegularExpressionMatch::capturedEnd(int nth) const
-{
- if (nth < 0 || nth > lastCapturedIndex())
- return -1;
-
- return d->capturedOffsets.at(nth * 2 + 1);
-}
-
-#if QT_STRINGVIEW_LEVEL < 2
-/*!
- Returns the offset inside the subject string corresponding to the starting
- position of the substring captured by the capturing group named \a name.
- If the capturing group named \a name did not capture a string or doesn't
- exist, returns -1.
-
- \sa capturedEnd(), capturedLength(), captured()
-*/
-int QRegularExpressionMatch::capturedStart(const QString &name) const
-{
- return capturedStart(qToStringViewIgnoringNull(name));
-}
-
-/*!
- Returns the length of the substring captured by the capturing group named
- \a name.
-
- \note This function returns 0 if the capturing group named \a name did not
- capture a string or doesn't exist.
-
- \sa capturedStart(), capturedEnd(), captured()
-*/
-int QRegularExpressionMatch::capturedLength(const QString &name) const
-{
- return capturedLength(qToStringViewIgnoringNull(name));
-}
-
-/*!
- Returns the offset inside the subject string immediately after the ending
- position of the substring captured by the capturing group named \a name. If
- the capturing group named \a name did not capture a string or doesn't
- exist, returns -1.
-
- \sa capturedStart(), capturedLength(), captured()
-*/
-int QRegularExpressionMatch::capturedEnd(const QString &name) const
-{
- return capturedEnd(qToStringViewIgnoringNull(name));
-}
-#endif // QT_STRINGVIEW_LEVEL < 2
-
-/*!
- \since 5.10
-
- Returns the offset inside the subject string corresponding to the starting
- position of the substring captured by the capturing group named \a name.
- If the capturing group named \a name did not capture a string or doesn't
- exist, returns -1.
-
- \sa capturedEnd(), capturedLength(), captured()
-*/
-int QRegularExpressionMatch::capturedStart(QStringView name) const
-{
- if (name.isEmpty()) {
- qWarning("QRegularExpressionMatch::capturedStart: empty capturing group name passed");
- return -1;
- }
- int nth = d->regularExpression.d->captureIndexForName(name);
- if (nth == -1)
- return -1;
- return capturedStart(nth);
-}
-
-/*!
- \since 5.10
-
- Returns the length of the substring captured by the capturing group named
- \a name.
-
- \note This function returns 0 if the capturing group named \a name did not
- capture a string or doesn't exist.
-
- \sa capturedStart(), capturedEnd(), captured()
-*/
-int QRegularExpressionMatch::capturedLength(QStringView name) const
-{
- if (name.isEmpty()) {
- qWarning("QRegularExpressionMatch::capturedLength: empty capturing group name passed");
- return 0;
- }
- int nth = d->regularExpression.d->captureIndexForName(name);
- if (nth == -1)
- return 0;
- return capturedLength(nth);
-}
-
-/*!
- \since 5.10
-
- Returns the offset inside the subject string immediately after the ending
- position of the substring captured by the capturing group named \a name. If
- the capturing group named \a name did not capture a string or doesn't
- exist, returns -1.
-
- \sa capturedStart(), capturedLength(), captured()
-*/
-int QRegularExpressionMatch::capturedEnd(QStringView name) const
-{
- if (name.isEmpty()) {
- qWarning("QRegularExpressionMatch::capturedEnd: empty capturing group name passed");
- return -1;
- }
- int nth = d->regularExpression.d->captureIndexForName(name);
- if (nth == -1)
- return -1;
- return capturedEnd(nth);
-}
-
-/*!
- Returns \c true if the regular expression matched against the subject string,
- or false otherwise.
-
- \sa QRegularExpression::match(), hasPartialMatch()
-*/
-bool QRegularExpressionMatch::hasMatch() const
-{
- return d->hasMatch;
-}
-
-/*!
- Returns \c true if the regular expression partially matched against the
- subject string, or false otherwise.
-
- \note Only a match that explicitly used the one of the partial match types
- can yield a partial match. Still, if such a match succeeds totally, this
- function will return false, while hasMatch() will return true.
-
- \sa QRegularExpression::match(), QRegularExpression::MatchType, hasMatch()
-*/
-bool QRegularExpressionMatch::hasPartialMatch() const
-{
- return d->hasPartialMatch;
-}
-
-/*!
- Returns \c true if the match object was obtained as a result from the
- QRegularExpression::match() function invoked on a valid QRegularExpression
- object; returns \c false if the QRegularExpression was invalid.
-
- \sa QRegularExpression::match(), QRegularExpression::isValid()
-*/
-bool QRegularExpressionMatch::isValid() const
-{
- return d->isValid;
-}
-
-/*!
- \internal
-*/
-QRegularExpressionMatchIterator::QRegularExpressionMatchIterator(QRegularExpressionMatchIteratorPrivate &dd)
- : d(&dd)
-{
-}
-
-/*!
- \since 5.1
-
- Constructs an empty, valid QRegularExpressionMatchIterator object. The
- regular expression is set to a default-constructed one; the match type to
- QRegularExpression::NoMatch and the match options to
- QRegularExpression::NoMatchOption.
-
- Invoking the hasNext() member function on the constructed object will
- return false, as the iterator is not iterating on a valid sequence of
- matches.
-*/
-QRegularExpressionMatchIterator::QRegularExpressionMatchIterator()
- : d(new QRegularExpressionMatchIteratorPrivate(QRegularExpression(),
- QRegularExpression::NoMatch,
- QRegularExpression::NoMatchOption,
- QRegularExpressionMatch()))
-{
-}
-
-/*!
- Destroys the QRegularExpressionMatchIterator object.
-*/
-QRegularExpressionMatchIterator::~QRegularExpressionMatchIterator()
-{
-}
-
-/*!
- Constructs a QRegularExpressionMatchIterator object as a copy of \a
- iterator.
-
- \sa operator=()
-*/
-QRegularExpressionMatchIterator::QRegularExpressionMatchIterator(const QRegularExpressionMatchIterator &iterator)
- : d(iterator.d)
-{
-}
-
-/*!
- Assigns the iterator \a iterator to this object, and returns a reference to
- the copy.
-*/
-QRegularExpressionMatchIterator &QRegularExpressionMatchIterator::operator=(const QRegularExpressionMatchIterator &iterator)
-{
- d = iterator.d;
- return *this;
-}
-
-/*!
- \fn QRegularExpressionMatchIterator &QRegularExpressionMatchIterator::operator=(QRegularExpressionMatchIterator &&iterator)
-
- Move-assigns the \a iterator to this object.
-*/
-
-/*!
- \fn void QRegularExpressionMatchIterator::swap(QRegularExpressionMatchIterator &other)
-
- Swaps the iterator \a other with this iterator object. This operation is
- very fast and never fails.
-*/
-
-/*!
- Returns \c true if the iterator object was obtained as a result from the
- QRegularExpression::globalMatch() function invoked on a valid
- QRegularExpression object; returns \c false if the QRegularExpression was
- invalid.
-
- \sa QRegularExpression::globalMatch(), QRegularExpression::isValid()
-*/
-bool QRegularExpressionMatchIterator::isValid() const
-{
- return d->next.isValid();
-}
-
-/*!
- Returns \c true if there is at least one match result ahead of the iterator;
- otherwise it returns \c false.
-
- \sa next()
-*/
-bool QRegularExpressionMatchIterator::hasNext() const
-{
- return d->hasNext();
-}
-
-/*!
- Returns the next match result without moving the iterator.
-
- \note Calling this function when the iterator is at the end of the result
- set leads to undefined results.
-*/
-QRegularExpressionMatch QRegularExpressionMatchIterator::peekNext() const
-{
- if (!hasNext())
- qWarning("QRegularExpressionMatchIterator::peekNext() called on an iterator already at end");
-
- return d->next;
-}
-
-/*!
- Returns the next match result and advances the iterator by one position.
-
- \note Calling this function when the iterator is at the end of the result
- set leads to undefined results.
-*/
-QRegularExpressionMatch QRegularExpressionMatchIterator::next()
-{
- if (!hasNext()) {
- qWarning("QRegularExpressionMatchIterator::next() called on an iterator already at end");
- return d->next;
- }
-
- QRegularExpressionMatch current = d->next;
- d->next = d->next.d.constData()->nextMatch();
- return current;
-}
-
-/*!
- Returns the QRegularExpression object whose globalMatch() function returned
- this object.
-
- \sa QRegularExpression::globalMatch(), matchType(), matchOptions()
-*/
-QRegularExpression QRegularExpressionMatchIterator::regularExpression() const
-{
- return d->regularExpression;
-}
-
-/*!
- Returns the match type that was used to get this
- QRegularExpressionMatchIterator object, that is, the match type that was
- passed to QRegularExpression::globalMatch().
-
- \sa QRegularExpression::globalMatch(), regularExpression(), matchOptions()
-*/
-QRegularExpression::MatchType QRegularExpressionMatchIterator::matchType() const
-{
- return d->matchType;
-}
-
-/*!
- Returns the match options that were used to get this
- QRegularExpressionMatchIterator object, that is, the match options that
- were passed to QRegularExpression::globalMatch().
-
- \sa QRegularExpression::globalMatch(), regularExpression(), matchType()
-*/
-QRegularExpression::MatchOptions QRegularExpressionMatchIterator::matchOptions() const
-{
- return d->matchOptions;
-}
-
-#ifndef QT_NO_DATASTREAM
-/*!
- \relates QRegularExpression
-
- Writes the regular expression \a re to stream \a out.
-
- \sa {Serializing Qt Data Types}
-*/
-QDataStream &operator<<(QDataStream &out, const QRegularExpression &re)
-{
- out << re.pattern() << quint32(re.patternOptions());
- return out;
-}
-
-/*!
- \relates QRegularExpression
-
- Reads a regular expression from stream \a in into \a re.
-
- \sa {Serializing Qt Data Types}
-*/
-QDataStream &operator>>(QDataStream &in, QRegularExpression &re)
-{
- QString pattern;
- quint32 patternOptions;
- in >> pattern >> patternOptions;
- re.setPattern(pattern);
- re.setPatternOptions(QRegularExpression::PatternOptions(patternOptions));
- return in;
-}
-#endif
-
-#ifndef QT_NO_DEBUG_STREAM
-/*!
- \relates QRegularExpression
-
- Writes the regular expression \a re into the debug object \a debug for
- debugging purposes.
-
- \sa {Debugging Techniques}
-*/
-QDebug operator<<(QDebug debug, const QRegularExpression &re)
-{
- QDebugStateSaver saver(debug);
- debug.nospace() << "QRegularExpression(" << re.pattern() << ", " << re.patternOptions() << ')';
- return debug;
-}
-
-/*!
- \relates QRegularExpression
-
- Writes the pattern options \a patternOptions into the debug object \a debug
- for debugging purposes.
-
- \sa {Debugging Techniques}
-*/
-QDebug operator<<(QDebug debug, QRegularExpression::PatternOptions patternOptions)
-{
- QDebugStateSaver saver(debug);
- QByteArray flags;
-
- if (patternOptions == QRegularExpression::NoPatternOption) {
- flags = "NoPatternOption";
- } else {
- flags.reserve(200); // worst case...
- if (patternOptions & QRegularExpression::CaseInsensitiveOption)
- flags.append("CaseInsensitiveOption|");
- if (patternOptions & QRegularExpression::DotMatchesEverythingOption)
- flags.append("DotMatchesEverythingOption|");
- if (patternOptions & QRegularExpression::MultilineOption)
- flags.append("MultilineOption|");
- if (patternOptions & QRegularExpression::ExtendedPatternSyntaxOption)
- flags.append("ExtendedPatternSyntaxOption|");
- if (patternOptions & QRegularExpression::InvertedGreedinessOption)
- flags.append("InvertedGreedinessOption|");
- if (patternOptions & QRegularExpression::DontCaptureOption)
- flags.append("DontCaptureOption|");
- if (patternOptions & QRegularExpression::UseUnicodePropertiesOption)
- flags.append("UseUnicodePropertiesOption|");
-QT_WARNING_PUSH
-QT_WARNING_DISABLE_DEPRECATED
- if (patternOptions & QRegularExpression::OptimizeOnFirstUsageOption)
- flags.append("OptimizeOnFirstUsageOption|");
- if (patternOptions & QRegularExpression::DontAutomaticallyOptimizeOption)
- flags.append("DontAutomaticallyOptimizeOption|");
-QT_WARNING_POP
- flags.chop(1);
- }
-
- debug.nospace() << "QRegularExpression::PatternOptions(" << flags << ')';
-
- return debug;
-}
-/*!
- \relates QRegularExpressionMatch
-
- Writes the match object \a match into the debug object \a debug for
- debugging purposes.
-
- \sa {Debugging Techniques}
-*/
-QDebug operator<<(QDebug debug, const QRegularExpressionMatch &match)
-{
- QDebugStateSaver saver(debug);
- debug.nospace() << "QRegularExpressionMatch(";
-
- if (!match.isValid()) {
- debug << "Invalid)";
- return debug;
- }
-
- debug << "Valid";
-
- if (match.hasMatch()) {
- debug << ", has match: ";
- for (int i = 0; i <= match.lastCapturedIndex(); ++i) {
- debug << i
- << ":(" << match.capturedStart(i) << ", " << match.capturedEnd(i)
- << ", " << match.captured(i) << ')';
- if (i < match.lastCapturedIndex())
- debug << ", ";
- }
- } else if (match.hasPartialMatch()) {
- debug << ", has partial match: ("
- << match.capturedStart(0) << ", "
- << match.capturedEnd(0) << ", "
- << match.captured(0) << ')';
- } else {
- debug << ", no match";
- }
-
- debug << ')';
-
- return debug;
-}
-#endif
-
-// fool lupdate: make it extract those strings for translation, but don't put them
-// inside Qt -- they're already inside libpcre (cf. man 3 pcreapi, pcre_compile.c).
-#if 0
-
-/* PCRE is a library of functions to support regular expressions whose syntax
-and semantics are as close as possible to those of the Perl 5 language.
-
- Written by Philip Hazel
- Original API code Copyright (c) 1997-2012 University of Cambridge
- New API code Copyright (c) 2015 University of Cambridge
-
------------------------------------------------------------------------------
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions are met:
-
- * Redistributions of source code must retain the above copyright notice,
- this list of conditions and the following disclaimer.
-
- * Redistributions in binary form must reproduce the above copyright
- notice, this list of conditions and the following disclaimer in the
- documentation and/or other materials provided with the distribution.
-
- * Neither the name of the University of Cambridge nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
-AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
-LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
-CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
-SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
-INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
-CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
-ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
-POSSIBILITY OF SUCH DAMAGE.
------------------------------------------------------------------------------
-*/
-
-static const char *pcreCompileErrorCodes[] =
-{
- QT_TRANSLATE_NOOP("QRegularExpression", "no error"),
- QT_TRANSLATE_NOOP("QRegularExpression", "\\ at end of pattern"),
- QT_TRANSLATE_NOOP("QRegularExpression", "\\c at end of pattern"),
- QT_TRANSLATE_NOOP("QRegularExpression", "unrecognized character follows \\"),
- QT_TRANSLATE_NOOP("QRegularExpression", "numbers out of order in {} quantifier"),
- QT_TRANSLATE_NOOP("QRegularExpression", "number too big in {} quantifier"),
- QT_TRANSLATE_NOOP("QRegularExpression", "missing terminating ] for character class"),
- QT_TRANSLATE_NOOP("QRegularExpression", "invalid escape sequence in character class"),
- QT_TRANSLATE_NOOP("QRegularExpression", "range out of order in character class"),
- QT_TRANSLATE_NOOP("QRegularExpression", "quantifier does not follow a repeatable item"),
- QT_TRANSLATE_NOOP("QRegularExpression", "internal error: unexpected repeat"),
- QT_TRANSLATE_NOOP("QRegularExpression", "unrecognized character after (? or (?-"),
- QT_TRANSLATE_NOOP("QRegularExpression", "POSIX named classes are supported only within a class"),
- QT_TRANSLATE_NOOP("QRegularExpression", "POSIX collating elements are not supported"),
- QT_TRANSLATE_NOOP("QRegularExpression", "missing closing parenthesis"),
- QT_TRANSLATE_NOOP("QRegularExpression", "reference to non-existent subpattern"),
- QT_TRANSLATE_NOOP("QRegularExpression", "pattern passed as NULL"),
- QT_TRANSLATE_NOOP("QRegularExpression", "unrecognised compile-time option bit(s)"),
- QT_TRANSLATE_NOOP("QRegularExpression", "missing ) after (?# comment"),
- QT_TRANSLATE_NOOP("QRegularExpression", "parentheses are too deeply nested"),
- QT_TRANSLATE_NOOP("QRegularExpression", "regular expression is too large"),
- QT_TRANSLATE_NOOP("QRegularExpression", "failed to allocate heap memory"),
- QT_TRANSLATE_NOOP("QRegularExpression", "unmatched closing parenthesis"),
- QT_TRANSLATE_NOOP("QRegularExpression", "internal error: code overflow"),
- QT_TRANSLATE_NOOP("QRegularExpression", "letter or underscore expected after (?< or (?'"),
- QT_TRANSLATE_NOOP("QRegularExpression", "lookbehind assertion is not fixed length"),
- QT_TRANSLATE_NOOP("QRegularExpression", "malformed number or name after (?("),
- QT_TRANSLATE_NOOP("QRegularExpression", "conditional group contains more than two branches"),
- QT_TRANSLATE_NOOP("QRegularExpression", "assertion expected after (?( or (?(?C)"),
- QT_TRANSLATE_NOOP("QRegularExpression", "(?R or (?[+-]digits must be followed by )"),
- QT_TRANSLATE_NOOP("QRegularExpression", "unknown POSIX class name"),
- QT_TRANSLATE_NOOP("QRegularExpression", "internal error in pcre2_study(): should not occur"),
- QT_TRANSLATE_NOOP("QRegularExpression", "this version of PCRE2 does not have Unicode support"),
- QT_TRANSLATE_NOOP("QRegularExpression", "parentheses are too deeply nested (stack check)"),
- QT_TRANSLATE_NOOP("QRegularExpression", "character code point value in \\x{} or \\o{} is too large"),
- QT_TRANSLATE_NOOP("QRegularExpression", "invalid condition (?(0)"),
- QT_TRANSLATE_NOOP("QRegularExpression", "\\C is not allowed in a lookbehind assertion"),
- QT_TRANSLATE_NOOP("QRegularExpression", "PCRE does not support \\L, \\l, \\N{name}, \\U, or \\u"),
- QT_TRANSLATE_NOOP("QRegularExpression", "number after (?C is greater than 255"),
- QT_TRANSLATE_NOOP("QRegularExpression", "closing parenthesis for (?C expected"),
- QT_TRANSLATE_NOOP("QRegularExpression", "invalid escape sequence in (*VERB) name"),
- QT_TRANSLATE_NOOP("QRegularExpression", "unrecognized character after (?P"),
- QT_TRANSLATE_NOOP("QRegularExpression", "syntax error in subpattern name (missing terminator)"),
- QT_TRANSLATE_NOOP("QRegularExpression", "two named subpatterns have the same name (PCRE2_DUPNAMES not set)"),
- QT_TRANSLATE_NOOP("QRegularExpression", "group name must start with a non-digit"),
- QT_TRANSLATE_NOOP("QRegularExpression", "this version of PCRE2 does not have support for \\P, \\p, or \\X"),
- QT_TRANSLATE_NOOP("QRegularExpression", "malformed \\P or \\p sequence"),
- QT_TRANSLATE_NOOP("QRegularExpression", "unknown property name after \\P or \\p"),
- QT_TRANSLATE_NOOP("QRegularExpression", "subpattern name is too long (maximum " "10000" " characters)"),
- QT_TRANSLATE_NOOP("QRegularExpression", "too many named subpatterns (maximum " "256" ")"),
- QT_TRANSLATE_NOOP("QRegularExpression", "invalid range in character class"),
- QT_TRANSLATE_NOOP("QRegularExpression", "octal value is greater than \\377 in 8-bit non-UTF-8 mode"),
- QT_TRANSLATE_NOOP("QRegularExpression", "internal error: overran compiling workspace"),
- QT_TRANSLATE_NOOP("QRegularExpression", "internal error: previously-checked referenced subpattern not found"),
- QT_TRANSLATE_NOOP("QRegularExpression", "DEFINE group contains more than one branch"),
- QT_TRANSLATE_NOOP("QRegularExpression", "missing opening brace after \\o"),
- QT_TRANSLATE_NOOP("QRegularExpression", "internal error: unknown newline setting"),
- QT_TRANSLATE_NOOP("QRegularExpression", "\\g is not followed by a braced, angle-bracketed, or quoted name/number or by a plain number"),
- QT_TRANSLATE_NOOP("QRegularExpression", "a numbered reference must not be zero"),
- QT_TRANSLATE_NOOP("QRegularExpression", "an argument is not allowed for (*ACCEPT), (*FAIL), or (*COMMIT)"),
- QT_TRANSLATE_NOOP("QRegularExpression", "(*VERB) not recognized or malformed"),
- QT_TRANSLATE_NOOP("QRegularExpression", "number is too big"),
- QT_TRANSLATE_NOOP("QRegularExpression", "subpattern name expected"),
- QT_TRANSLATE_NOOP("QRegularExpression", "digit expected after (?+"),
- QT_TRANSLATE_NOOP("QRegularExpression", "non-octal character in \\o{} (closing brace missing?)"),
- QT_TRANSLATE_NOOP("QRegularExpression", "different names for subpatterns of the same number are not allowed"),
- QT_TRANSLATE_NOOP("QRegularExpression", "(*MARK) must have an argument"),
- QT_TRANSLATE_NOOP("QRegularExpression", "non-hex character in \\x{} (closing brace missing?)"),
- QT_TRANSLATE_NOOP("QRegularExpression", "\\c must be followed by a printable ASCII character"),
- QT_TRANSLATE_NOOP("QRegularExpression", "\\c must be followed by a letter or one of [\\]^_?"),
- QT_TRANSLATE_NOOP("QRegularExpression", "\\k is not followed by a braced, angle-bracketed, or quoted name"),
- QT_TRANSLATE_NOOP("QRegularExpression", "internal error: unknown opcode in find_fixedlength()"),
- QT_TRANSLATE_NOOP("QRegularExpression", "\\N is not supported in a class"),
- QT_TRANSLATE_NOOP("QRegularExpression", "SPARE ERROR"),
- QT_TRANSLATE_NOOP("QRegularExpression", "disallowed Unicode code point (>= 0xd800 && <= 0xdfff)"),
- QT_TRANSLATE_NOOP("QRegularExpression", "using UTF is disabled by the application"),
- QT_TRANSLATE_NOOP("QRegularExpression", "using UCP is disabled by the application"),
- QT_TRANSLATE_NOOP("QRegularExpression", "name is too long in (*MARK), (*PRUNE), (*SKIP), or (*THEN)"),
- QT_TRANSLATE_NOOP("QRegularExpression", "character code point value in \\u.... sequence is too large"),
- QT_TRANSLATE_NOOP("QRegularExpression", "digits missing in \\x{} or \\o{}"),
- QT_TRANSLATE_NOOP("QRegularExpression", "syntax error in (?(VERSION condition"),
- QT_TRANSLATE_NOOP("QRegularExpression", "internal error: unknown opcode in auto_possessify()"),
- QT_TRANSLATE_NOOP("QRegularExpression", "missing terminating delimiter for callout with string argument"),
- QT_TRANSLATE_NOOP("QRegularExpression", "unrecognized string delimiter follows (?C"),
- QT_TRANSLATE_NOOP("QRegularExpression", "using \\C is disabled by the application"),
- QT_TRANSLATE_NOOP("QRegularExpression", "(?| and/or (?J: or (?x: parentheses are too deeply nested"),
- QT_TRANSLATE_NOOP("QRegularExpression", "using \\C is disabled in this PCRE2 library"),
- QT_TRANSLATE_NOOP("QRegularExpression", "regular expression is too complicated"),
- QT_TRANSLATE_NOOP("QRegularExpression", "lookbehind assertion is too long"),
- QT_TRANSLATE_NOOP("QRegularExpression", "pattern string is longer than the limit set by the application"),
- QT_TRANSLATE_NOOP("QRegularExpression", "no error"),
- QT_TRANSLATE_NOOP("QRegularExpression", "no match"),
- QT_TRANSLATE_NOOP("QRegularExpression", "partial match"),
- QT_TRANSLATE_NOOP("QRegularExpression", "UTF-8 error: 1 byte missing at end"),
- QT_TRANSLATE_NOOP("QRegularExpression", "UTF-8 error: 2 bytes missing at end"),
- QT_TRANSLATE_NOOP("QRegularExpression", "UTF-8 error: 3 bytes missing at end"),
- QT_TRANSLATE_NOOP("QRegularExpression", "UTF-8 error: 4 bytes missing at end"),
- QT_TRANSLATE_NOOP("QRegularExpression", "UTF-8 error: 5 bytes missing at end"),
- QT_TRANSLATE_NOOP("QRegularExpression", "UTF-8 error: byte 2 top bits not 0x80"),
- QT_TRANSLATE_NOOP("QRegularExpression", "UTF-8 error: byte 3 top bits not 0x80"),
- QT_TRANSLATE_NOOP("QRegularExpression", "UTF-8 error: byte 4 top bits not 0x80"),
- QT_TRANSLATE_NOOP("QRegularExpression", "UTF-8 error: byte 5 top bits not 0x80"),
- QT_TRANSLATE_NOOP("QRegularExpression", "UTF-8 error: byte 6 top bits not 0x80"),
- QT_TRANSLATE_NOOP("QRegularExpression", "UTF-8 error: 5-byte character is not allowed (RFC 3629)"),
- QT_TRANSLATE_NOOP("QRegularExpression", "UTF-8 error: 6-byte character is not allowed (RFC 3629)"),
- QT_TRANSLATE_NOOP("QRegularExpression", "UTF-8 error: code points greater than 0x10ffff are not defined"),
- QT_TRANSLATE_NOOP("QRegularExpression", "UTF-8 error: code points 0xd800-0xdfff are not defined"),
- QT_TRANSLATE_NOOP("QRegularExpression", "UTF-8 error: overlong 2-byte sequence"),
- QT_TRANSLATE_NOOP("QRegularExpression", "UTF-8 error: overlong 3-byte sequence"),
- QT_TRANSLATE_NOOP("QRegularExpression", "UTF-8 error: overlong 4-byte sequence"),
- QT_TRANSLATE_NOOP("QRegularExpression", "UTF-8 error: overlong 5-byte sequence"),
- QT_TRANSLATE_NOOP("QRegularExpression", "UTF-8 error: overlong 6-byte sequence"),
- QT_TRANSLATE_NOOP("QRegularExpression", "UTF-8 error: isolated byte with 0x80 bit set"),
- QT_TRANSLATE_NOOP("QRegularExpression", "UTF-8 error: illegal byte (0xfe or 0xff)"),
- QT_TRANSLATE_NOOP("QRegularExpression", "UTF-16 error: missing low surrogate at end"),
- QT_TRANSLATE_NOOP("QRegularExpression", "UTF-16 error: invalid low surrogate"),
- QT_TRANSLATE_NOOP("QRegularExpression", "UTF-16 error: isolated low surrogate"),
- QT_TRANSLATE_NOOP("QRegularExpression", "UTF-32 error: code points 0xd800-0xdfff are not defined"),
- QT_TRANSLATE_NOOP("QRegularExpression", "UTF-32 error: code points greater than 0x10ffff are not defined"),
- QT_TRANSLATE_NOOP("QRegularExpression", "bad data value"),
- QT_TRANSLATE_NOOP("QRegularExpression", "patterns do not all use the same character tables"),
- QT_TRANSLATE_NOOP("QRegularExpression", "magic number missing"),
- QT_TRANSLATE_NOOP("QRegularExpression", "pattern compiled in wrong mode: 8/16/32-bit error"),
- QT_TRANSLATE_NOOP("QRegularExpression", "bad offset value"),
- QT_TRANSLATE_NOOP("QRegularExpression", "bad option value"),
- QT_TRANSLATE_NOOP("QRegularExpression", "invalid replacement string"),
- QT_TRANSLATE_NOOP("QRegularExpression", "bad offset into UTF string"),
- QT_TRANSLATE_NOOP("QRegularExpression", "callout error code"), /* Never returned by PCRE2 itself */
- QT_TRANSLATE_NOOP("QRegularExpression", "invalid data in workspace for DFA restart"),
- QT_TRANSLATE_NOOP("QRegularExpression", "too much recursion for DFA matching"),
- QT_TRANSLATE_NOOP("QRegularExpression", "backreference condition or recursion test is not supported for DFA matching"),
- QT_TRANSLATE_NOOP("QRegularExpression", "function is not supported for DFA matching"),
- QT_TRANSLATE_NOOP("QRegularExpression", "pattern contains an item that is not supported for DFA matching"),
- QT_TRANSLATE_NOOP("QRegularExpression", "workspace size exceeded in DFA matching"),
- QT_TRANSLATE_NOOP("QRegularExpression", "internal error - pattern overwritten?"),
- QT_TRANSLATE_NOOP("QRegularExpression", "bad JIT option"),
- QT_TRANSLATE_NOOP("QRegularExpression", "JIT stack limit reached"),
- QT_TRANSLATE_NOOP("QRegularExpression", "match limit exceeded"),
- QT_TRANSLATE_NOOP("QRegularExpression", "no more memory"),
- QT_TRANSLATE_NOOP("QRegularExpression", "unknown substring"),
- QT_TRANSLATE_NOOP("QRegularExpression", "non-unique substring name"),
- QT_TRANSLATE_NOOP("QRegularExpression", "NULL argument passed"),
- QT_TRANSLATE_NOOP("QRegularExpression", "nested recursion at the same subject position"),
- QT_TRANSLATE_NOOP("QRegularExpression", "recursion limit exceeded"),
- QT_TRANSLATE_NOOP("QRegularExpression", "requested value is not available"),
- QT_TRANSLATE_NOOP("QRegularExpression", "requested value is not set"),
- QT_TRANSLATE_NOOP("QRegularExpression", "offset limit set without PCRE2_USE_OFFSET_LIMIT"),
- QT_TRANSLATE_NOOP("QRegularExpression", "bad escape sequence in replacement string"),
- QT_TRANSLATE_NOOP("QRegularExpression", "expected closing curly bracket in replacement string"),
- QT_TRANSLATE_NOOP("QRegularExpression", "bad substitution in replacement string"),
- QT_TRANSLATE_NOOP("QRegularExpression", "match with end before start is not supported"),
- QT_TRANSLATE_NOOP("QRegularExpression", "too many replacements (more than INT_MAX)")
-};
-#endif // #if 0
-
-QT_END_NAMESPACE
diff --git a/src/corelib/tools/qregularexpression.h b/src/corelib/tools/qregularexpression.h
deleted file mode 100644
index f9e7029550..0000000000
--- a/src/corelib/tools/qregularexpression.h
+++ /dev/null
@@ -1,287 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2012 Giuseppe D'Angelo <dangelog@gmail.com>.
-** Copyright (C) 2012 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.com, author Giuseppe D'Angelo <giuseppe.dangelo@kdab.com>
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#ifndef QREGULAREXPRESSION_H
-#define QREGULAREXPRESSION_H
-
-#include <QtCore/qglobal.h>
-
-#include <QtCore/qstring.h>
-#include <QtCore/qstringlist.h>
-#include <QtCore/qshareddata.h>
-#include <QtCore/qvariant.h>
-
-QT_REQUIRE_CONFIG(regularexpression);
-
-QT_BEGIN_NAMESPACE
-
-class QStringView;
-
-class QRegularExpressionMatch;
-class QRegularExpressionMatchIterator;
-struct QRegularExpressionPrivate;
-class QRegularExpression;
-
-Q_CORE_EXPORT uint qHash(const QRegularExpression &key, uint seed = 0) Q_DECL_NOTHROW;
-
-class Q_CORE_EXPORT QRegularExpression
-{
-public:
- enum PatternOption {
- NoPatternOption = 0x0000,
- CaseInsensitiveOption = 0x0001,
- DotMatchesEverythingOption = 0x0002,
- MultilineOption = 0x0004,
- ExtendedPatternSyntaxOption = 0x0008,
- InvertedGreedinessOption = 0x0010,
- DontCaptureOption = 0x0020,
- UseUnicodePropertiesOption = 0x0040,
- OptimizeOnFirstUsageOption Q_DECL_ENUMERATOR_DEPRECATED_X("This option does not have any effect since Qt 5.12") = 0x0080,
- DontAutomaticallyOptimizeOption Q_DECL_ENUMERATOR_DEPRECATED_X("This option does not have any effect since Qt 5.12") = 0x0100,
- };
- Q_DECLARE_FLAGS(PatternOptions, PatternOption)
-
- PatternOptions patternOptions() const;
- void setPatternOptions(PatternOptions options);
-
- QRegularExpression();
- explicit QRegularExpression(const QString &pattern, PatternOptions options = NoPatternOption);
- QRegularExpression(const QRegularExpression &re);
- ~QRegularExpression();
- QRegularExpression &operator=(const QRegularExpression &re);
-
-#ifdef Q_COMPILER_RVALUE_REFS
- QRegularExpression &operator=(QRegularExpression &&re) Q_DECL_NOTHROW
- { d.swap(re.d); return *this; }
-#endif
-
- void swap(QRegularExpression &other) Q_DECL_NOTHROW { d.swap(other.d); }
-
- QString pattern() const;
- void setPattern(const QString &pattern);
-
- bool isValid() const;
- int patternErrorOffset() const;
- QString errorString() const;
-
- int captureCount() const;
- QStringList namedCaptureGroups() const;
-
- enum MatchType {
- NormalMatch = 0,
- PartialPreferCompleteMatch,
- PartialPreferFirstMatch,
- NoMatch
- };
-
- enum MatchOption {
- NoMatchOption = 0x0000,
- AnchoredMatchOption = 0x0001,
- DontCheckSubjectStringMatchOption = 0x0002
- };
- Q_DECLARE_FLAGS(MatchOptions, MatchOption)
-
- QRegularExpressionMatch match(const QString &subject,
- int offset = 0,
- MatchType matchType = NormalMatch,
- MatchOptions matchOptions = NoMatchOption) const;
-
- QRegularExpressionMatch match(const QStringRef &subjectRef,
- int offset = 0,
- MatchType matchType = NormalMatch,
- MatchOptions matchOptions = NoMatchOption) const;
-
- QRegularExpressionMatchIterator globalMatch(const QString &subject,
- int offset = 0,
- MatchType matchType = NormalMatch,
- MatchOptions matchOptions = NoMatchOption) const;
-
- QRegularExpressionMatchIterator globalMatch(const QStringRef &subjectRef,
- int offset = 0,
- MatchType matchType = NormalMatch,
- MatchOptions matchOptions = NoMatchOption) const;
-
- void optimize() const;
-
- static QString escape(const QString &str);
- static QString wildcardToRegularExpression(const QString &str);
- static inline QString anchoredPattern(const QString &expression)
- {
- return QLatin1String("\\A(?:")
- + expression
- + QLatin1String(")\\z");
- }
-
- bool operator==(const QRegularExpression &re) const;
- inline bool operator!=(const QRegularExpression &re) const { return !operator==(re); }
-
-private:
- friend struct QRegularExpressionPrivate;
- friend class QRegularExpressionMatch;
- friend struct QRegularExpressionMatchPrivate;
- friend class QRegularExpressionMatchIterator;
- friend Q_CORE_EXPORT uint qHash(const QRegularExpression &key, uint seed) Q_DECL_NOTHROW;
-
- QRegularExpression(QRegularExpressionPrivate &dd);
- QExplicitlySharedDataPointer<QRegularExpressionPrivate> d;
-};
-
-Q_DECLARE_SHARED(QRegularExpression)
-Q_DECLARE_OPERATORS_FOR_FLAGS(QRegularExpression::PatternOptions)
-Q_DECLARE_OPERATORS_FOR_FLAGS(QRegularExpression::MatchOptions)
-
-#ifndef QT_NO_DATASTREAM
-Q_CORE_EXPORT QDataStream &operator<<(QDataStream &out, const QRegularExpression &re);
-Q_CORE_EXPORT QDataStream &operator>>(QDataStream &in, QRegularExpression &re);
-#endif
-
-#ifndef QT_NO_DEBUG_STREAM
-Q_CORE_EXPORT QDebug operator<<(QDebug debug, const QRegularExpression &re);
-Q_CORE_EXPORT QDebug operator<<(QDebug debug, QRegularExpression::PatternOptions patternOptions);
-#endif
-
-struct QRegularExpressionMatchPrivate;
-
-class Q_CORE_EXPORT QRegularExpressionMatch
-{
-public:
- QRegularExpressionMatch();
- ~QRegularExpressionMatch();
- QRegularExpressionMatch(const QRegularExpressionMatch &match);
- QRegularExpressionMatch &operator=(const QRegularExpressionMatch &match);
-
-#ifdef Q_COMPILER_RVALUE_REFS
- QRegularExpressionMatch &operator=(QRegularExpressionMatch &&match) Q_DECL_NOTHROW
- { d.swap(match.d); return *this; }
-#endif
- void swap(QRegularExpressionMatch &other) Q_DECL_NOTHROW { d.swap(other.d); }
-
- QRegularExpression regularExpression() const;
- QRegularExpression::MatchType matchType() const;
- QRegularExpression::MatchOptions matchOptions() const;
-
- bool hasMatch() const;
- bool hasPartialMatch() const;
-
- bool isValid() const;
-
- int lastCapturedIndex() const;
-
- QString captured(int nth = 0) const;
- QStringRef capturedRef(int nth = 0) const;
- QStringView capturedView(int nth = 0) const;
-
-#if QT_STRINGVIEW_LEVEL < 2
- QString captured(const QString &name) const;
- QStringRef capturedRef(const QString &name) const;
-#endif
-
- QString captured(QStringView name) const;
- QStringRef capturedRef(QStringView name) const;
- QStringView capturedView(QStringView name) const;
-
- QStringList capturedTexts() const;
-
- int capturedStart(int nth = 0) const;
- int capturedLength(int nth = 0) const;
- int capturedEnd(int nth = 0) const;
-
-#if QT_STRINGVIEW_LEVEL < 2
- int capturedStart(const QString &name) const;
- int capturedLength(const QString &name) const;
- int capturedEnd(const QString &name) const;
-#endif
-
- int capturedStart(QStringView name) const;
- int capturedLength(QStringView name) const;
- int capturedEnd(QStringView name) const;
-
-private:
- friend class QRegularExpression;
- friend struct QRegularExpressionMatchPrivate;
- friend class QRegularExpressionMatchIterator;
-
- QRegularExpressionMatch(QRegularExpressionMatchPrivate &dd);
- QSharedDataPointer<QRegularExpressionMatchPrivate> d;
-};
-
-Q_DECLARE_SHARED(QRegularExpressionMatch)
-
-#ifndef QT_NO_DEBUG_STREAM
-Q_CORE_EXPORT QDebug operator<<(QDebug debug, const QRegularExpressionMatch &match);
-#endif
-
-struct QRegularExpressionMatchIteratorPrivate;
-
-class Q_CORE_EXPORT QRegularExpressionMatchIterator
-{
-public:
- QRegularExpressionMatchIterator();
- ~QRegularExpressionMatchIterator();
- QRegularExpressionMatchIterator(const QRegularExpressionMatchIterator &iterator);
- QRegularExpressionMatchIterator &operator=(const QRegularExpressionMatchIterator &iterator);
-#ifdef Q_COMPILER_RVALUE_REFS
- QRegularExpressionMatchIterator &operator=(QRegularExpressionMatchIterator &&iterator) Q_DECL_NOTHROW
- { d.swap(iterator.d); return *this; }
-#endif
- void swap(QRegularExpressionMatchIterator &other) Q_DECL_NOTHROW { d.swap(other.d); }
-
- bool isValid() const;
-
- bool hasNext() const;
- QRegularExpressionMatch next();
- QRegularExpressionMatch peekNext() const;
-
- QRegularExpression regularExpression() const;
- QRegularExpression::MatchType matchType() const;
- QRegularExpression::MatchOptions matchOptions() const;
-
-private:
- friend class QRegularExpression;
-
- QRegularExpressionMatchIterator(QRegularExpressionMatchIteratorPrivate &dd);
- QSharedDataPointer<QRegularExpressionMatchIteratorPrivate> d;
-};
-
-Q_DECLARE_SHARED(QRegularExpressionMatchIterator)
-
-QT_END_NAMESPACE
-
-#endif // QREGULAREXPRESSION_H
diff --git a/src/corelib/tools/qringbuffer.cpp b/src/corelib/tools/qringbuffer.cpp
index 59650ed2f7..311058a776 100644
--- a/src/corelib/tools/qringbuffer.cpp
+++ b/src/corelib/tools/qringbuffer.cpp
@@ -59,7 +59,7 @@ void QRingChunk::detach()
const int chunkSize = size();
QByteArray x(chunkSize, Qt::Uninitialized);
::memcpy(x.data(), chunk.constData() + headOffset, chunkSize);
- chunk = qMove(x);
+ chunk = std::move(x);
headOffset = 0;
tailOffset = chunkSize;
}
@@ -105,7 +105,7 @@ const char *QRingBuffer::readPointerAtPosition(qint64 pos, qint64 &length) const
}
length = 0;
- return 0;
+ return nullptr;
}
void QRingBuffer::free(qint64 bytes)
diff --git a/src/corelib/tools/qringbuffer_p.h b/src/corelib/tools/qringbuffer_p.h
index 76ab4a5b62..838cb31697 100644
--- a/src/corelib/tools/qringbuffer_p.h
+++ b/src/corelib/tools/qringbuffer_p.h
@@ -65,11 +65,11 @@ class QRingChunk
{
public:
// initialization and cleanup
- inline QRingChunk() Q_DECL_NOTHROW :
+ inline QRingChunk() noexcept :
headOffset(0), tailOffset(0)
{
}
- inline QRingChunk(const QRingChunk &other) Q_DECL_NOTHROW :
+ inline QRingChunk(const QRingChunk &other) noexcept :
chunk(other.chunk), headOffset(other.headOffset), tailOffset(other.tailOffset)
{
}
@@ -77,30 +77,30 @@ public:
chunk(alloc, Qt::Uninitialized), headOffset(0), tailOffset(0)
{
}
- explicit inline QRingChunk(const QByteArray &qba) Q_DECL_NOTHROW :
+ explicit inline QRingChunk(const QByteArray &qba) noexcept :
chunk(qba), headOffset(0), tailOffset(qba.size())
{
}
- inline QRingChunk &operator=(const QRingChunk &other) Q_DECL_NOTHROW
+ inline QRingChunk &operator=(const QRingChunk &other) noexcept
{
chunk = other.chunk;
headOffset = other.headOffset;
tailOffset = other.tailOffset;
return *this;
}
- inline QRingChunk(QRingChunk &&other) Q_DECL_NOTHROW :
+ inline QRingChunk(QRingChunk &&other) noexcept :
chunk(other.chunk), headOffset(other.headOffset), tailOffset(other.tailOffset)
{
other.headOffset = other.tailOffset = 0;
}
- inline QRingChunk &operator=(QRingChunk &&other) Q_DECL_NOTHROW
+ inline QRingChunk &operator=(QRingChunk &&other) noexcept
{
swap(other);
return *this;
}
- inline void swap(QRingChunk &other) Q_DECL_NOTHROW
+ inline void swap(QRingChunk &other) noexcept
{
chunk.swap(other.chunk);
qSwap(headOffset, other.headOffset);
diff --git a/src/corelib/tools/qscopedpointer.h b/src/corelib/tools/qscopedpointer.h
index 2a4083466b..af0c0ed336 100644
--- a/src/corelib/tools/qscopedpointer.h
+++ b/src/corelib/tools/qscopedpointer.h
@@ -97,7 +97,7 @@ class QScopedPointer
{
typedef T *QScopedPointer:: *RestrictedBool;
public:
- explicit QScopedPointer(T *p = nullptr) Q_DECL_NOTHROW : d(p)
+ explicit QScopedPointer(T *p = nullptr) noexcept : d(p)
{
}
@@ -113,12 +113,12 @@ public:
return *d;
}
- T *operator->() const Q_DECL_NOTHROW
+ T *operator->() const noexcept
{
return d;
}
- bool operator!() const Q_DECL_NOTHROW
+ bool operator!() const noexcept
{
return !d;
}
@@ -129,28 +129,28 @@ public:
return isNull() ? nullptr : &QScopedPointer::d;
}
#else
- operator RestrictedBool() const Q_DECL_NOTHROW
+ operator RestrictedBool() const noexcept
{
return isNull() ? nullptr : &QScopedPointer::d;
}
#endif
- T *data() const Q_DECL_NOTHROW
+ T *data() const noexcept
{
return d;
}
- T *get() const Q_DECL_NOTHROW
+ T *get() const noexcept
{
return d;
}
- bool isNull() const Q_DECL_NOTHROW
+ bool isNull() const noexcept
{
return !d;
}
- void reset(T *other = nullptr) Q_DECL_NOEXCEPT_EXPR(noexcept(Cleanup::cleanup(std::declval<T *>())))
+ void reset(T *other = nullptr) noexcept(noexcept(Cleanup::cleanup(std::declval<T *>())))
{
if (d == other)
return;
@@ -159,14 +159,14 @@ public:
Cleanup::cleanup(oldD);
}
- T *take() Q_DECL_NOTHROW
+ T *take() noexcept
{
T *oldD = d;
d = nullptr;
return oldD;
}
- void swap(QScopedPointer<T, Cleanup> &other) Q_DECL_NOTHROW
+ void swap(QScopedPointer<T, Cleanup> &other) noexcept
{
qSwap(d, other.d);
}
@@ -181,43 +181,43 @@ private:
};
template <class T, class Cleanup>
-inline bool operator==(const QScopedPointer<T, Cleanup> &lhs, const QScopedPointer<T, Cleanup> &rhs) Q_DECL_NOTHROW
+inline bool operator==(const QScopedPointer<T, Cleanup> &lhs, const QScopedPointer<T, Cleanup> &rhs) noexcept
{
return lhs.data() == rhs.data();
}
template <class T, class Cleanup>
-inline bool operator!=(const QScopedPointer<T, Cleanup> &lhs, const QScopedPointer<T, Cleanup> &rhs) Q_DECL_NOTHROW
+inline bool operator!=(const QScopedPointer<T, Cleanup> &lhs, const QScopedPointer<T, Cleanup> &rhs) noexcept
{
return lhs.data() != rhs.data();
}
template <class T, class Cleanup>
-inline bool operator==(const QScopedPointer<T, Cleanup> &lhs, std::nullptr_t) Q_DECL_NOTHROW
+inline bool operator==(const QScopedPointer<T, Cleanup> &lhs, std::nullptr_t) noexcept
{
return lhs.isNull();
}
template <class T, class Cleanup>
-inline bool operator==(std::nullptr_t, const QScopedPointer<T, Cleanup> &rhs) Q_DECL_NOTHROW
+inline bool operator==(std::nullptr_t, const QScopedPointer<T, Cleanup> &rhs) noexcept
{
return rhs.isNull();
}
template <class T, class Cleanup>
-inline bool operator!=(const QScopedPointer<T, Cleanup> &lhs, std::nullptr_t) Q_DECL_NOTHROW
+inline bool operator!=(const QScopedPointer<T, Cleanup> &lhs, std::nullptr_t) noexcept
{
return !lhs.isNull();
}
template <class T, class Cleanup>
-inline bool operator!=(std::nullptr_t, const QScopedPointer<T, Cleanup> &rhs) Q_DECL_NOTHROW
+inline bool operator!=(std::nullptr_t, const QScopedPointer<T, Cleanup> &rhs) noexcept
{
return !rhs.isNull();
}
template <class T, class Cleanup>
-inline void swap(QScopedPointer<T, Cleanup> &p1, QScopedPointer<T, Cleanup> &p2) Q_DECL_NOTHROW
+inline void swap(QScopedPointer<T, Cleanup> &p1, QScopedPointer<T, Cleanup> &p2) noexcept
{ p1.swap(p2); }
template <typename T, typename Cleanup = QScopedPointerArrayDeleter<T> >
@@ -244,7 +244,7 @@ public:
return this->d[i];
}
- void swap(QScopedArrayPointer &other) Q_DECL_NOTHROW // prevent QScopedPointer <->QScopedArrayPointer swaps
+ void swap(QScopedArrayPointer &other) noexcept // prevent QScopedPointer <->QScopedArrayPointer swaps
{ QScopedPointer<T, Cleanup>::swap(other); }
private:
@@ -263,7 +263,7 @@ private:
};
template <typename T, typename Cleanup>
-inline void swap(QScopedArrayPointer<T, Cleanup> &lhs, QScopedArrayPointer<T, Cleanup> &rhs) Q_DECL_NOTHROW
+inline void swap(QScopedArrayPointer<T, Cleanup> &lhs, QScopedArrayPointer<T, Cleanup> &rhs) noexcept
{ lhs.swap(rhs); }
QT_END_NAMESPACE
diff --git a/src/corelib/tools/qscopedvaluerollback.h b/src/corelib/tools/qscopedvaluerollback.h
index 5f76269388..f904b8dfcb 100644
--- a/src/corelib/tools/qscopedvaluerollback.h
+++ b/src/corelib/tools/qscopedvaluerollback.h
@@ -48,20 +48,20 @@ template <typename T>
class QScopedValueRollback
{
public:
- explicit QScopedValueRollback(T &var) :
- varRef(var), oldValue(var)
+ explicit QScopedValueRollback(T &var)
+ : varRef(var), oldValue(var)
{
}
- explicit QScopedValueRollback(T &var, T value) :
- varRef(var), oldValue(var)
+ explicit QScopedValueRollback(T &var, T value)
+ : varRef(var), oldValue(std::move(var))
{
- varRef = qMove(value);
+ varRef = std::move(value);
}
~QScopedValueRollback()
{
- varRef = qMove(oldValue);
+ varRef = std::move(oldValue);
}
void commit()
@@ -70,7 +70,7 @@ public:
}
private:
- T& varRef;
+ T &varRef;
T oldValue;
Q_DISABLE_COPY(QScopedValueRollback)
diff --git a/src/corelib/tools/qscopeguard.h b/src/corelib/tools/qscopeguard.h
index 31100fcabb..45c3f93da4 100644
--- a/src/corelib/tools/qscopeguard.h
+++ b/src/corelib/tools/qscopeguard.h
@@ -50,14 +50,19 @@ template <typename F> class QScopeGuard;
template <typename F> QScopeGuard<F> qScopeGuard(F f);
template <typename F>
-class QScopeGuard
+class
+#if QT_HAS_CPP_ATTRIBUTE(nodiscard)
+// Q_REQUIRED_RESULT can be defined as __warn_unused_result__ or as [[nodiscard]]
+// but the 1st one has some limitations for example can be placed only on functions.
+Q_REQUIRED_RESULT
+#endif
+QScopeGuard
{
public:
- QScopeGuard(QScopeGuard &&other) Q_DECL_NOEXCEPT
+ QScopeGuard(QScopeGuard &&other) noexcept
: m_func(std::move(other.m_func))
- , m_invoke(other.m_invoke)
+ , m_invoke(qExchange(other.m_invoke, false))
{
- other.dismiss();
}
~QScopeGuard()
@@ -66,13 +71,13 @@ public:
m_func();
}
- void dismiss() Q_DECL_NOEXCEPT
+ void dismiss() noexcept
{
m_invoke = false;
}
private:
- explicit QScopeGuard(F f) Q_DECL_NOEXCEPT
+ explicit QScopeGuard(F &&f) noexcept
: m_func(std::move(f))
{
}
@@ -86,6 +91,9 @@ private:
template <typename F>
+#if QT_HAS_CPP_ATTRIBUTE(nodiscard)
+Q_REQUIRED_RESULT
+#endif
QScopeGuard<F> qScopeGuard(F f)
{
return QScopeGuard<F>(std::move(f));
diff --git a/src/corelib/tools/qset.h b/src/corelib/tools/qset.h
index 6640c8486d..2e72832185 100644
--- a/src/corelib/tools/qset.h
+++ b/src/corelib/tools/qset.h
@@ -41,10 +41,9 @@
#define QSET_H
#include <QtCore/qhash.h>
-#ifdef Q_COMPILER_INITIALIZER_LISTS
-#include <initializer_list>
-#endif
+#include <QtCore/qcontainertools_impl.h>
+#include <initializer_list>
#include <iterator>
QT_BEGIN_NAMESPACE
@@ -56,19 +55,21 @@ class QSet
typedef QHash<T, QHashDummyValue> Hash;
public:
- inline QSet() Q_DECL_NOTHROW {}
-#ifdef Q_COMPILER_INITIALIZER_LISTS
+ inline QSet() noexcept {}
inline QSet(std::initializer_list<T> list)
+ : QSet(list.begin(), list.end()) {}
+ template <typename InputIterator, QtPrivate::IfIsInputIterator<InputIterator> = true>
+ inline QSet(InputIterator first, InputIterator last)
{
- reserve(int(list.size()));
- for (typename std::initializer_list<T>::const_iterator it = list.begin(); it != list.end(); ++it)
- insert(*it);
+ QtPrivate::reserveIfForwardIterator(this, first, last);
+ for (; first != last; ++first)
+ insert(*first);
}
-#endif
+
// compiler-generated copy/move ctor/assignment operators are fine!
// compiler-generated destructor is fine!
- inline void swap(QSet<T> &other) Q_DECL_NOTHROW { q_hash.swap(other.q_hash); }
+ inline void swap(QSet<T> &other) noexcept { q_hash.swap(other.q_hash); }
inline bool operator==(const QSet<T> &other) const
{ return q_hash == other.q_hash; }
@@ -176,20 +177,20 @@ public:
typedef std::reverse_iterator<const_iterator> const_reverse_iterator;
inline iterator begin() { return q_hash.begin(); }
- inline const_iterator begin() const Q_DECL_NOTHROW { return q_hash.begin(); }
- inline const_iterator cbegin() const Q_DECL_NOTHROW { return q_hash.begin(); }
- inline const_iterator constBegin() const Q_DECL_NOTHROW { return q_hash.constBegin(); }
+ inline const_iterator begin() const noexcept { return q_hash.begin(); }
+ inline const_iterator cbegin() const noexcept { return q_hash.begin(); }
+ inline const_iterator constBegin() const noexcept { return q_hash.constBegin(); }
inline iterator end() { return q_hash.end(); }
- inline const_iterator end() const Q_DECL_NOTHROW { return q_hash.end(); }
- inline const_iterator cend() const Q_DECL_NOTHROW { return q_hash.end(); }
- inline const_iterator constEnd() const Q_DECL_NOTHROW { return q_hash.constEnd(); }
+ inline const_iterator end() const noexcept { return q_hash.end(); }
+ inline const_iterator cend() const noexcept { return q_hash.end(); }
+ inline const_iterator constEnd() const noexcept { return q_hash.constEnd(); }
reverse_iterator rbegin() { return reverse_iterator(end()); }
reverse_iterator rend() { return reverse_iterator(begin()); }
- const_reverse_iterator rbegin() const Q_DECL_NOTHROW { return const_reverse_iterator(end()); }
- const_reverse_iterator rend() const Q_DECL_NOTHROW { return const_reverse_iterator(begin()); }
- const_reverse_iterator crbegin() const Q_DECL_NOTHROW { return const_reverse_iterator(end()); }
- const_reverse_iterator crend() const Q_DECL_NOTHROW { return const_reverse_iterator(begin()); }
+ const_reverse_iterator rbegin() const noexcept { return const_reverse_iterator(end()); }
+ const_reverse_iterator rend() const noexcept { return const_reverse_iterator(begin()); }
+ const_reverse_iterator crbegin() const noexcept { return const_reverse_iterator(end()); }
+ const_reverse_iterator crend() const noexcept { return const_reverse_iterator(begin()); }
iterator erase(iterator i)
{ return erase(m2c(i)); }
@@ -244,30 +245,40 @@ public:
inline QSet<T> operator-(const QSet<T> &other) const
{ QSet<T> result = *this; result -= other; return result; }
- QList<T> toList() const;
- inline QList<T> values() const { return toList(); }
-
+ QList<T> values() const;
+#if QT_VERSION < QT_VERSION_CHECK(6,0,0)
+ Q_DECL_DEPRECATED_X("Use values() instead.")
+ QList<T> toList() const { return values(); }
+ Q_DECL_DEPRECATED_X("Use QSet<T>(list.begin(), list.end()) instead.")
static QSet<T> fromList(const QList<T> &list);
+#endif
private:
Hash q_hash;
- static const_iterator m2c(iterator it) Q_DECL_NOTHROW
+ static const_iterator m2c(iterator it) noexcept
{ return const_iterator(typename Hash::const_iterator(it.i.i)); }
bool isValidIterator(const iterator &i) const
{
return q_hash.isValidIterator(reinterpret_cast<const typename Hash::iterator&>(i));
}
- bool isValidIterator(const const_iterator &i) const Q_DECL_NOTHROW
+ bool isValidIterator(const const_iterator &i) const noexcept
{
return q_hash.isValidIterator(reinterpret_cast<const typename Hash::const_iterator&>(i));
}
};
+#if defined(__cpp_deduction_guides) && __cpp_deduction_guides >= 201606
+template <typename InputIterator,
+ typename ValueType = typename std::iterator_traits<InputIterator>::value_type,
+ QtPrivate::IfIsInputIterator<InputIterator> = true>
+QSet(InputIterator, InputIterator) -> QSet<ValueType>;
+#endif
+
template <typename T>
uint qHash(const QSet<T> &key, uint seed = 0)
-Q_DECL_NOEXCEPT_EXPR(noexcept(qHashRangeCommutative(key.begin(), key.end(), seed)))
+noexcept(noexcept(qHashRangeCommutative(key.begin(), key.end(), seed)))
{
return qHashRangeCommutative(key.begin(), key.end(), seed);
}
@@ -280,11 +291,9 @@ Q_INLINE_TEMPLATE void QSet<T>::reserve(int asize) { q_hash.reserve(asize); }
template <class T>
Q_INLINE_TEMPLATE QSet<T> &QSet<T>::unite(const QSet<T> &other)
{
- QSet<T> copy(other);
- typename QSet<T>::const_iterator i = copy.constEnd();
- while (i != copy.constBegin()) {
- --i;
- insert(*i);
+ if (!q_hash.isSharedWith(other.q_hash)) {
+ for (const T &e : other)
+ insert(e);
}
return *this;
}
@@ -302,11 +311,9 @@ Q_INLINE_TEMPLATE QSet<T> &QSet<T>::intersect(const QSet<T> &other)
copy2 = *this;
*this = copy1;
}
- typename QSet<T>::const_iterator i = copy1.constEnd();
- while (i != copy1.constBegin()) {
- --i;
- if (!copy2.contains(*i))
- remove(*i);
+ for (const auto &e : qAsConst(copy1)) {
+ if (!copy2.contains(e))
+ remove(e);
}
return *this;
}
@@ -342,14 +349,11 @@ Q_INLINE_TEMPLATE bool QSet<T>::intersects(const QSet<T> &other) const
template <class T>
Q_INLINE_TEMPLATE QSet<T> &QSet<T>::subtract(const QSet<T> &other)
{
- if (&other == this) {
+ if (q_hash.isSharedWith(other.q_hash)) {
clear();
} else {
- auto i = other.constEnd();
- while (i != other.constBegin()) {
- --i;
- remove(*i);
- }
+ for (const auto &e : other)
+ remove(e);
}
return *this;
}
@@ -367,7 +371,7 @@ Q_INLINE_TEMPLATE bool QSet<T>::contains(const QSet<T> &other) const
}
template <typename T>
-Q_OUTOFLINE_TEMPLATE QList<T> QSet<T>::toList() const
+Q_OUTOFLINE_TEMPLATE QList<T> QSet<T>::values() const
{
QList<T> result;
result.reserve(size());
@@ -379,6 +383,7 @@ Q_OUTOFLINE_TEMPLATE QList<T> QSet<T>::toList() const
return result;
}
+#if QT_VERSION < QT_VERSION_CHECK(6,0,0)
template <typename T>
Q_OUTOFLINE_TEMPLATE QSet<T> QList<T>::toSet() const
{
@@ -400,9 +405,11 @@ QList<T> QList<T>::fromSet(const QSet<T> &set)
{
return set.toList();
}
+#endif
Q_DECLARE_SEQUENTIAL_ITERATOR(Set)
+#if !defined(QT_NO_JAVA_STYLE_ITERATORS)
template <typename T>
class QMutableSetIterator
{
@@ -434,6 +441,7 @@ public:
{ while (c->constBegin() != i) if (*(n = --i) == t) return true;
n = c->end(); return false; }
};
+#endif // QT_NO_JAVA_STYLE_ITERATORS
QT_END_NAMESPACE
diff --git a/src/corelib/tools/qset.qdoc b/src/corelib/tools/qset.qdoc
index 48863f2399..78854be0de 100644
--- a/src/corelib/tools/qset.qdoc
+++ b/src/corelib/tools/qset.qdoc
@@ -108,9 +108,17 @@
Constructs a set with a copy of each of the elements in the
initializer list \a list.
+*/
+
+/*! \fn template <class T> template<typename InputIterator> QSet<T>::QSet(InputIterator first, InputIterator last)
+ \since 5.14
+
+ Constructs a set with the contents in the iterator range [\a first, \a last).
+
+ The value type of \c InputIterator must be convertible to \c T.
- This function is only available if the program is being
- compiled in C++11 mode.
+ \note If the range [\a first, \a last) contains duplicate elements,
+ the first one is retained.
*/
/*!
@@ -993,6 +1001,8 @@
\snippet code/doc_src_qset.cpp 13
+ \include containers-range-constructor.qdocinc
+
\sa fromList(), QList::fromSet()
*/
@@ -1003,6 +1013,8 @@
This is the same as toList().
+ \include containers-range-constructor.qdocinc
+
\sa fromList(), QList::fromSet()
*/
@@ -1018,6 +1030,8 @@
\snippet code/doc_src_qset.cpp 14
+ \include containers-range-constructor.qdocinc
+
\sa toList(), QList::toSet()
*/
diff --git a/src/corelib/tools/qshareddata.h b/src/corelib/tools/qshareddata.h
index 6930cb96a5..f123f8e7b9 100644
--- a/src/corelib/tools/qshareddata.h
+++ b/src/corelib/tools/qshareddata.h
@@ -52,17 +52,21 @@ QT_BEGIN_NAMESPACE
template <class T> class QSharedDataPointer;
-class Q_CORE_EXPORT QSharedData
+class
+#if QT_VERSION < QT_VERSION_CHECK(6, 0, 0)
+Q_CORE_EXPORT
+#endif
+QSharedData
{
public:
mutable QAtomicInt ref;
- inline QSharedData() : ref(0) { }
- inline QSharedData(const QSharedData &) : ref(0) { }
+ inline QSharedData() noexcept : ref(0) { }
+ inline QSharedData(const QSharedData &) noexcept : ref(0) { }
-private:
// using the assignment operator would lead to corruption in the ref-counting
- QSharedData &operator=(const QSharedData &);
+ QSharedData &operator=(const QSharedData &) = delete;
+ ~QSharedData() = default;
};
template <class T> class QSharedDataPointer
@@ -71,7 +75,7 @@ public:
typedef T Type;
typedef T *pointer;
- inline void detach() { if (d && d->ref.load() != 1) detach_helper(); }
+ inline void detach() { if (d && d->ref.loadRelaxed() != 1) detach_helper(); }
inline T &operator*() { detach(); return *d; }
inline const T &operator*() const { return *d; }
inline T *operator->() { detach(); return d; }
@@ -88,7 +92,7 @@ public:
inline QSharedDataPointer() { d = nullptr; }
inline ~QSharedDataPointer() { if (d && !d->ref.deref()) delete d; }
- explicit QSharedDataPointer(T *data) Q_DECL_NOTHROW;
+ explicit QSharedDataPointer(T *data) noexcept;
inline QSharedDataPointer(const QSharedDataPointer<T> &o) : d(o.d) { if (d) d->ref.ref(); }
inline QSharedDataPointer<T> & operator=(const QSharedDataPointer<T> &o) {
if (o.d != d) {
@@ -112,19 +116,17 @@ public:
}
return *this;
}
-#ifdef Q_COMPILER_RVALUE_REFS
- QSharedDataPointer(QSharedDataPointer &&o) Q_DECL_NOTHROW : d(o.d) { o.d = nullptr; }
- inline QSharedDataPointer<T> &operator=(QSharedDataPointer<T> &&other) Q_DECL_NOTHROW
+ QSharedDataPointer(QSharedDataPointer &&o) noexcept : d(o.d) { o.d = nullptr; }
+ inline QSharedDataPointer<T> &operator=(QSharedDataPointer<T> &&other) noexcept
{
QSharedDataPointer moved(std::move(other));
swap(moved);
return *this;
}
-#endif
inline bool operator!() const { return !d; }
- inline void swap(QSharedDataPointer &other) Q_DECL_NOTHROW
+ inline void swap(QSharedDataPointer &other) noexcept
{ qSwap(d, other.d); }
protected:
@@ -161,7 +163,7 @@ public:
inline const T *constData() const { return d; }
inline T *take() { T *x = d; d = nullptr; return x; }
- inline void detach() { if (d && d->ref.load() != 1) detach_helper(); }
+ inline void detach() { if (d && d->ref.loadRelaxed() != 1) detach_helper(); }
inline void reset()
{
@@ -181,7 +183,7 @@ public:
inline QExplicitlySharedDataPointer() { d = nullptr; }
inline ~QExplicitlySharedDataPointer() { if (d && !d->ref.deref()) delete d; }
- explicit QExplicitlySharedDataPointer(T *data) Q_DECL_NOTHROW;
+ explicit QExplicitlySharedDataPointer(T *data) noexcept;
inline QExplicitlySharedDataPointer(const QExplicitlySharedDataPointer<T> &o) : d(o.d) { if (d) d->ref.ref(); }
template<class X>
@@ -218,19 +220,17 @@ public:
}
return *this;
}
-#ifdef Q_COMPILER_RVALUE_REFS
- inline QExplicitlySharedDataPointer(QExplicitlySharedDataPointer &&o) Q_DECL_NOTHROW : d(o.d) { o.d = nullptr; }
- inline QExplicitlySharedDataPointer<T> &operator=(QExplicitlySharedDataPointer<T> &&other) Q_DECL_NOTHROW
+ inline QExplicitlySharedDataPointer(QExplicitlySharedDataPointer &&o) noexcept : d(o.d) { o.d = nullptr; }
+ inline QExplicitlySharedDataPointer<T> &operator=(QExplicitlySharedDataPointer<T> &&other) noexcept
{
QExplicitlySharedDataPointer moved(std::move(other));
swap(moved);
return *this;
}
-#endif
inline bool operator!() const { return !d; }
- inline void swap(QExplicitlySharedDataPointer &other) Q_DECL_NOTHROW
+ inline void swap(QExplicitlySharedDataPointer &other) noexcept
{ qSwap(d, other.d); }
protected:
@@ -243,7 +243,7 @@ private:
};
template <class T>
-Q_INLINE_TEMPLATE QSharedDataPointer<T>::QSharedDataPointer(T *adata) Q_DECL_NOTHROW
+Q_INLINE_TEMPLATE QSharedDataPointer<T>::QSharedDataPointer(T *adata) noexcept
: d(adata)
{ if (d) d->ref.ref(); }
@@ -280,7 +280,7 @@ Q_OUTOFLINE_TEMPLATE void QExplicitlySharedDataPointer<T>::detach_helper()
}
template <class T>
-Q_INLINE_TEMPLATE QExplicitlySharedDataPointer<T>::QExplicitlySharedDataPointer(T *adata) Q_DECL_NOTHROW
+Q_INLINE_TEMPLATE QExplicitlySharedDataPointer<T>::QExplicitlySharedDataPointer(T *adata) noexcept
: d(adata)
{ if (d) d->ref.ref(); }
@@ -297,32 +297,20 @@ template <class T> inline bool operator==(const QExplicitlySharedDataPointer<T>
}
template <class T>
-Q_INLINE_TEMPLATE void qSwap(QSharedDataPointer<T> &p1, QSharedDataPointer<T> &p2)
+Q_INLINE_TEMPLATE void swap(QSharedDataPointer<T> &p1, QSharedDataPointer<T> &p2)
{ p1.swap(p2); }
template <class T>
-Q_INLINE_TEMPLATE void qSwap(QExplicitlySharedDataPointer<T> &p1, QExplicitlySharedDataPointer<T> &p2)
+Q_INLINE_TEMPLATE void swap(QExplicitlySharedDataPointer<T> &p1, QExplicitlySharedDataPointer<T> &p2)
{ p1.swap(p2); }
-QT_END_NAMESPACE
-namespace std {
- template <class T>
- Q_INLINE_TEMPLATE void swap(QT_PREPEND_NAMESPACE(QSharedDataPointer)<T> &p1, QT_PREPEND_NAMESPACE(QSharedDataPointer)<T> &p2)
- { p1.swap(p2); }
-
- template <class T>
- Q_INLINE_TEMPLATE void swap(QT_PREPEND_NAMESPACE(QExplicitlySharedDataPointer)<T> &p1, QT_PREPEND_NAMESPACE(QExplicitlySharedDataPointer)<T> &p2)
- { p1.swap(p2); }
-}
-QT_BEGIN_NAMESPACE
-
template <class T>
-Q_INLINE_TEMPLATE uint qHash(const QSharedDataPointer<T> &ptr, uint seed = 0) Q_DECL_NOTHROW
+Q_INLINE_TEMPLATE uint qHash(const QSharedDataPointer<T> &ptr, uint seed = 0) noexcept
{
return qHash(ptr.data(), seed);
}
template <class T>
-Q_INLINE_TEMPLATE uint qHash(const QExplicitlySharedDataPointer<T> &ptr, uint seed = 0) Q_DECL_NOTHROW
+Q_INLINE_TEMPLATE uint qHash(const QExplicitlySharedDataPointer<T> &ptr, uint seed = 0) noexcept
{
return qHash(ptr.data(), seed);
}
diff --git a/src/corelib/tools/qsharedpointer.cpp b/src/corelib/tools/qsharedpointer.cpp
index 39a71a4393..f185d2f23f 100644
--- a/src/corelib/tools/qsharedpointer.cpp
+++ b/src/corelib/tools/qsharedpointer.cpp
@@ -343,12 +343,6 @@
if you obtain a non-null object, you may use the pointer. See
QWeakPointer::toStrongRef() for an example.
- QWeakPointer also provides the QWeakPointer::data() method that returns
- the tracked pointer without ensuring that it remains valid. This function
- is provided if you can guarantee by external means that the object will
- not get deleted (or if you only need the pointer value) and the cost of
- creating a QSharedPointer using toStrongRef() is too high.
-
\omit
\section1 QWeakPointer internals
@@ -853,6 +847,7 @@
/*!
\fn template <class T> T *QWeakPointer<T>::data() const
\since 4.6
+ \obsolete Use toStrongRef() instead, and data() on the returned QSharedPointer.
Returns the value of the pointer being tracked by this QWeakPointer,
\b without ensuring that it cannot get deleted. To have that guarantee,
@@ -1271,6 +1266,57 @@
*/
/*!
+ \fn template <class X, class T> std::shared_ptr<X> qSharedPointerObjectCast(const std::shared_ptr<T> &src)
+ \relates QSharedPointer
+ \since 5.14
+
+ Returns a shared pointer to the pointer held by \a src, using a
+ \l qobject_cast() to type \tt X to obtain an internal pointer of the
+ appropriate type. If the \tt qobject_cast fails, the object
+ returned will be null.
+
+ Note that \tt X must have the same cv-qualifiers (\tt const and
+ \tt volatile) that \tt T has, or the code will fail to
+ compile. Use const_pointer_cast to cast away the constness.
+*/
+
+/*!
+ \fn template <class X, class T> std::shared_ptr<X> qobject_pointer_cast(const std::shared_ptr<T> &src)
+ \relates QSharedPointer
+ \since 5.14
+
+ Same as qSharedPointerObjectCast(). This function is provided for STL
+ compatibility.
+*/
+
+/*!
+ \fn template <class X, class T> std::shared_ptr<X> qSharedPointerObjectCast(std::shared_ptr<T> &&src)
+ \relates QSharedPointer
+ \since 5.14
+
+ Returns a shared pointer to the pointer held by \a src, using a
+ \l qobject_cast() to type \tt X to obtain an internal pointer of the
+ appropriate type.
+
+ If the \tt qobject_cast succeeds, the function will return a valid shared
+ pointer, and \a src is reset to null. If the \tt qobject_cast fails, the
+ object returned will be null, and \a src will not be modified.
+
+ Note that \tt X must have the same cv-qualifiers (\tt const and
+ \tt volatile) that \tt T has, or the code will fail to
+ compile. Use const_pointer_cast to cast away the constness.
+*/
+
+/*!
+ \fn template <class X, class T> std::shared_ptr<X> qobject_pointer_cast(std::shared_ptr<T> &&src)
+ \relates QSharedPointer
+ \since 5.14
+
+ Same as qSharedPointerObjectCast(). This function is provided for STL
+ compatibility.
+*/
+
+/*!
\fn template <class X> template <class T> QSharedPointer<X> qSharedPointerObjectCast(const QWeakPointer<T> &src)
\relates QSharedPointer
\relates QWeakPointer
@@ -1334,7 +1380,7 @@ void QtSharedPointer::ExternalRefCountData::setQObjectShared(const QObject *, bo
*/
void QtSharedPointer::ExternalRefCountData::checkQObjectShared(const QObject *)
{
- if (strongref.load() < 0)
+ if (strongref.loadRelaxed() < 0)
qWarning("QSharedPointer: cannot create a QSharedPointer from a QObject-tracking QWeakPointer");
}
@@ -1344,7 +1390,7 @@ QtSharedPointer::ExternalRefCountData *QtSharedPointer::ExternalRefCountData::ge
QObjectPrivate *d = QObjectPrivate::get(const_cast<QObject *>(obj));
Q_ASSERT_X(!d->wasDeleted, "QWeakPointer", "Detected QWeakPointer creation in a QObject being deleted");
- ExternalRefCountData *that = d->sharedRefcount.load();
+ ExternalRefCountData *that = d->sharedRefcount.loadRelaxed();
if (that) {
that->weakref.ref();
return that;
@@ -1352,8 +1398,8 @@ QtSharedPointer::ExternalRefCountData *QtSharedPointer::ExternalRefCountData::ge
// we can create the refcount data because it doesn't exist
ExternalRefCountData *x = new ExternalRefCountData(Qt::Uninitialized);
- x->strongref.store(-1);
- x->weakref.store(2); // the QWeakPointer that called us plus the QObject itself
+ x->strongref.storeRelaxed(-1);
+ x->weakref.storeRelaxed(2); // the QWeakPointer that called us plus the QObject itself
ExternalRefCountData *ret;
if (d->sharedRefcount.testAndSetOrdered(nullptr, x, ret)) { // ought to be release+acquire; this is acq_rel+acquire
@@ -1361,7 +1407,7 @@ QtSharedPointer::ExternalRefCountData *QtSharedPointer::ExternalRefCountData::ge
} else {
// ~ExternalRefCountData has a Q_ASSERT, so we use this trick to
// only execute this if Q_ASSERTs are enabled
- Q_ASSERT((x->weakref.store(0), true));
+ Q_ASSERT((x->weakref.storeRelaxed(0), true));
delete x;
ret->weakref.ref();
}
diff --git a/src/corelib/tools/qsharedpointer.h b/src/corelib/tools/qsharedpointer.h
index a2c5f990fc..5d47369687 100644
--- a/src/corelib/tools/qsharedpointer.h
+++ b/src/corelib/tools/qsharedpointer.h
@@ -48,6 +48,8 @@
# include <QtCore/qsharedpointer_impl.h>
#else
+#include <memory> // for std::shared_ptr
+
QT_BEGIN_NAMESPACE
@@ -167,6 +169,10 @@ template <class X, class T> QSharedPointer<X> qSharedPointerConstCast(const QSha
template <class X, class T> QSharedPointer<X> qSharedPointerConstCast(const QWeakPointer<T> &src);
template <class X, class T> QSharedPointer<X> qSharedPointerObjectCast(const QSharedPointer<T> &src);
template <class X, class T> QSharedPointer<X> qSharedPointerObjectCast(const QWeakPointer<T> &src);
+template <typename X, class T> std::shared_ptr<X> qobject_pointer_cast(const std::shared_ptr<T> &src);
+template <typename X, class T> std::shared_ptr<X> qobject_pointer_cast(std::shared_ptr<T> &&src);
+template <typename X, class T> std::shared_ptr<X> qSharedPointerObjectCast(const std::shared_ptr<T> &src);
+template <typename X, class T> std::shared_ptr<X> qSharedPointerObjectCast(std::shared_ptr<T> &&src);
template <class X, class T> QWeakPointer<X> qWeakPointerCast(const QWeakPointer<T> &src);
diff --git a/src/corelib/tools/qsharedpointer_impl.h b/src/corelib/tools/qsharedpointer_impl.h
index f2158436fd..362d57fb9a 100644
--- a/src/corelib/tools/qsharedpointer_impl.h
+++ b/src/corelib/tools/qsharedpointer_impl.h
@@ -67,6 +67,8 @@ QT_END_NAMESPACE
#endif
#include <QtCore/qhashfunctions.h>
+#include <memory>
+
QT_BEGIN_NAMESPACE
//
@@ -90,6 +92,10 @@ template <class X, class T>
QSharedPointer<X> qSharedPointerObjectCast(const QSharedPointer<T> &ptr);
#endif
+namespace QtPrivate {
+struct EnableInternalData;
+}
+
namespace QtSharedPointer {
template <class T> class ExternalRefCount;
@@ -133,11 +139,11 @@ namespace QtSharedPointer {
inline ExternalRefCountData(DestroyerFn d)
: destroyer(d)
{
- strongref.store(1);
- weakref.store(1);
+ strongref.storeRelaxed(1);
+ weakref.storeRelaxed(1);
}
inline ExternalRefCountData(Qt::Initialization) { }
- ~ExternalRefCountData() { Q_ASSERT(!weakref.load()); Q_ASSERT(strongref.load() <= 0); }
+ ~ExternalRefCountData() { Q_ASSERT(!weakref.loadRelaxed()); Q_ASSERT(strongref.loadRelaxed() <= 0); }
void destroy() { destroyer(this); }
@@ -218,8 +224,8 @@ namespace QtSharedPointer {
}
private:
// prevent construction
- ExternalRefCountWithCustomDeleter() Q_DECL_EQ_DELETE;
- ~ExternalRefCountWithCustomDeleter() Q_DECL_EQ_DELETE;
+ ExternalRefCountWithCustomDeleter() = delete;
+ ~ExternalRefCountWithCustomDeleter() = delete;
Q_DISABLE_COPY(ExternalRefCountWithCustomDeleter)
};
@@ -263,8 +269,8 @@ namespace QtSharedPointer {
private:
// prevent construction
- ExternalRefCountWithContiguousData() Q_DECL_EQ_DELETE;
- ~ExternalRefCountWithContiguousData() Q_DECL_EQ_DELETE;
+ ExternalRefCountWithContiguousData() = delete;
+ ~ExternalRefCountWithContiguousData() = delete;
Q_DISABLE_COPY(ExternalRefCountWithContiguousData)
};
@@ -291,18 +297,18 @@ public:
typedef const value_type &const_reference;
typedef qptrdiff difference_type;
- T *data() const Q_DECL_NOTHROW { return value; }
- T *get() const Q_DECL_NOTHROW { return value; }
- bool isNull() const Q_DECL_NOTHROW { return !data(); }
- operator RestrictedBool() const Q_DECL_NOTHROW { return isNull() ? nullptr : &QSharedPointer::value; }
- bool operator !() const Q_DECL_NOTHROW { return isNull(); }
+ T *data() const noexcept { return value; }
+ T *get() const noexcept { return value; }
+ bool isNull() const noexcept { return !data(); }
+ operator RestrictedBool() const noexcept { return isNull() ? nullptr : &QSharedPointer::value; }
+ bool operator !() const noexcept { return isNull(); }
T &operator*() const { return *data(); }
- T *operator->() const Q_DECL_NOTHROW { return data(); }
+ T *operator->() const noexcept { return data(); }
- Q_DECL_CONSTEXPR QSharedPointer() Q_DECL_NOTHROW : value(nullptr), d(nullptr) { }
+ Q_DECL_CONSTEXPR QSharedPointer() noexcept : value(nullptr), d(nullptr) { }
~QSharedPointer() { deref(); }
- Q_DECL_CONSTEXPR QSharedPointer(std::nullptr_t) Q_DECL_NOTHROW : value(nullptr), d(nullptr) { }
+ Q_DECL_CONSTEXPR QSharedPointer(std::nullptr_t) noexcept : value(nullptr), d(nullptr) { }
template <class X, IfCompatible<X> = true>
inline explicit QSharedPointer(X *ptr) : value(ptr) // noexcept
@@ -315,22 +321,21 @@ public:
template <typename Deleter>
QSharedPointer(std::nullptr_t, Deleter) : value(nullptr), d(nullptr) { }
- QSharedPointer(const QSharedPointer &other) Q_DECL_NOTHROW : value(other.value), d(other.d)
+ QSharedPointer(const QSharedPointer &other) noexcept : value(other.value), d(other.d)
{ if (d) ref(); }
- QSharedPointer &operator=(const QSharedPointer &other) Q_DECL_NOTHROW
+ QSharedPointer &operator=(const QSharedPointer &other) noexcept
{
QSharedPointer copy(other);
swap(copy);
return *this;
}
-#ifdef Q_COMPILER_RVALUE_REFS
- QSharedPointer(QSharedPointer &&other) Q_DECL_NOTHROW
+ QSharedPointer(QSharedPointer &&other) noexcept
: value(other.value), d(other.d)
{
other.d = nullptr;
other.value = nullptr;
}
- QSharedPointer &operator=(QSharedPointer &&other) Q_DECL_NOTHROW
+ QSharedPointer &operator=(QSharedPointer &&other) noexcept
{
QSharedPointer moved(std::move(other));
swap(moved);
@@ -338,7 +343,7 @@ public:
}
template <class X, IfCompatible<X> = true>
- QSharedPointer(QSharedPointer<X> &&other) Q_DECL_NOTHROW
+ QSharedPointer(QSharedPointer<X> &&other) noexcept
: value(other.value), d(other.d)
{
other.d = nullptr;
@@ -346,17 +351,15 @@ public:
}
template <class X, IfCompatible<X> = true>
- QSharedPointer &operator=(QSharedPointer<X> &&other) Q_DECL_NOTHROW
+ QSharedPointer &operator=(QSharedPointer<X> &&other) noexcept
{
QSharedPointer moved(std::move(other));
swap(moved);
return *this;
}
-#endif
-
template <class X, IfCompatible<X> = true>
- QSharedPointer(const QSharedPointer<X> &other) Q_DECL_NOTHROW : value(other.value), d(other.d)
+ QSharedPointer(const QSharedPointer<X> &other) noexcept : value(other.value), d(other.d)
{ if (d) ref(); }
template <class X, IfCompatible<X> = true>
@@ -375,7 +378,7 @@ public:
inline QSharedPointer<T> &operator=(const QWeakPointer<X> &other)
{ internalSet(other.d, other.value); return *this; }
- inline void swap(QSharedPointer &other)
+ inline void swap(QSharedPointer &other) noexcept
{ this->internalSwap(other); }
inline void reset() { clear(); }
@@ -444,9 +447,9 @@ public:
private:
explicit QSharedPointer(Qt::Initialization) {}
- void deref() Q_DECL_NOTHROW
+ void deref() noexcept
{ deref(d); }
- static void deref(Data *dd) Q_DECL_NOTHROW
+ static void deref(Data *dd) noexcept
{
if (!dd) return;
if (!dd->strongref.deref()) {
@@ -487,7 +490,7 @@ private:
enableSharedFromThis(ptr);
}
- void internalSwap(QSharedPointer &other) Q_DECL_NOTHROW
+ void internalSwap(QSharedPointer &other) noexcept
{
qSwap(d, other.d);
qSwap(this->value, other.value);
@@ -500,19 +503,19 @@ public:
template <class X> friend class QWeakPointer;
template <class X, class Y> friend QSharedPointer<X> QtSharedPointer::copyAndSetPointer(X * ptr, const QSharedPointer<Y> &src);
#endif
- void ref() const Q_DECL_NOTHROW { d->weakref.ref(); d->strongref.ref(); }
+ void ref() const noexcept { d->weakref.ref(); d->strongref.ref(); }
inline void internalSet(Data *o, T *actual)
{
if (o) {
// increase the strongref, but never up from zero
// or less (-1 is used by QWeakPointer on untracked QObject)
- int tmp = o->strongref.load();
+ int tmp = o->strongref.loadRelaxed();
while (tmp > 0) {
// try to increment from "tmp" to "tmp + 1"
if (o->strongref.testAndSetRelaxed(tmp, tmp + 1))
break; // succeeded
- tmp = o->strongref.load(); // failed, try again
+ tmp = o->strongref.loadRelaxed(); // failed, try again
}
if (tmp > 0) {
@@ -525,7 +528,7 @@ public:
qSwap(d, o);
qSwap(this->value, actual);
- if (!d || d->strongref.load() == 0)
+ if (!d || d->strongref.loadRelaxed() == 0)
this->value = nullptr;
// dereference saved data
@@ -553,12 +556,16 @@ public:
typedef const value_type &const_reference;
typedef qptrdiff difference_type;
- bool isNull() const Q_DECL_NOTHROW { return d == nullptr || d->strongref.load() == 0 || value == nullptr; }
- operator RestrictedBool() const Q_DECL_NOTHROW { return isNull() ? nullptr : &QWeakPointer::value; }
- bool operator !() const Q_DECL_NOTHROW { return isNull(); }
- T *data() const Q_DECL_NOTHROW { return d == nullptr || d->strongref.load() == 0 ? nullptr : value; }
+ bool isNull() const noexcept { return d == nullptr || d->strongref.loadRelaxed() == 0 || value == nullptr; }
+ operator RestrictedBool() const noexcept { return isNull() ? nullptr : &QWeakPointer::value; }
+ bool operator !() const noexcept { return isNull(); }
- inline QWeakPointer() Q_DECL_NOTHROW : d(nullptr), value(nullptr) { }
+#if QT_DEPRECATED_SINCE(5, 14)
+ QT_DEPRECATED_X("Use toStrongRef() instead, and data() on the returned QSharedPointer")
+ T *data() const noexcept { return internalData(); }
+#endif
+
+ inline QWeakPointer() noexcept : d(nullptr), value(nullptr) { }
inline ~QWeakPointer() { if (d && !d->weakref.deref()) delete d; }
#ifndef QT_NO_QOBJECT
@@ -576,26 +583,24 @@ public:
{ return *this = QWeakPointer(ptr); }
#endif
- QWeakPointer(const QWeakPointer &other) Q_DECL_NOTHROW : d(other.d), value(other.value)
+ QWeakPointer(const QWeakPointer &other) noexcept : d(other.d), value(other.value)
{ if (d) d->weakref.ref(); }
-#ifdef Q_COMPILER_RVALUE_REFS
- QWeakPointer(QWeakPointer &&other) Q_DECL_NOTHROW
+ QWeakPointer(QWeakPointer &&other) noexcept
: d(other.d), value(other.value)
{
other.d = nullptr;
other.value = nullptr;
}
- QWeakPointer &operator=(QWeakPointer &&other) Q_DECL_NOTHROW
+ QWeakPointer &operator=(QWeakPointer &&other) noexcept
{ QWeakPointer moved(std::move(other)); swap(moved); return *this; }
-#endif
- QWeakPointer &operator=(const QWeakPointer &other) Q_DECL_NOTHROW
+ QWeakPointer &operator=(const QWeakPointer &other) noexcept
{
QWeakPointer copy(other);
swap(copy);
return *this;
}
- void swap(QWeakPointer &other) Q_DECL_NOTHROW
+ void swap(QWeakPointer &other) noexcept
{
qSwap(this->d, other.d);
qSwap(this->value, other.value);
@@ -623,11 +628,11 @@ public:
}
template <class X>
- bool operator==(const QWeakPointer<X> &o) const Q_DECL_NOTHROW
+ bool operator==(const QWeakPointer<X> &o) const noexcept
{ return d == o.d && value == static_cast<const T *>(o.value); }
template <class X>
- bool operator!=(const QWeakPointer<X> &o) const Q_DECL_NOTHROW
+ bool operator!=(const QWeakPointer<X> &o) const noexcept
{ return !(*this == o); }
template <class X, IfCompatible<X> = true>
@@ -642,11 +647,11 @@ public:
}
template <class X>
- bool operator==(const QSharedPointer<X> &o) const Q_DECL_NOTHROW
+ bool operator==(const QSharedPointer<X> &o) const noexcept
{ return d == o.d; }
template <class X>
- bool operator!=(const QSharedPointer<X> &o) const Q_DECL_NOTHROW
+ bool operator!=(const QSharedPointer<X> &o) const noexcept
{ return !(*this == o); }
inline void clear() { *this = QWeakPointer(); }
@@ -660,7 +665,7 @@ public:
#endif
private:
-
+ friend struct QtPrivate::EnableInternalData;
#if defined(Q_NO_TEMPLATE_FRIENDS)
public:
#else
@@ -689,19 +694,33 @@ public:
value = actual;
}
+ // ### Qt 6: remove users of this API; no one should ever access
+ // a weak pointer's data but the weak pointer itself
+ inline T *internalData() const noexcept
+ {
+ return d == nullptr || d->strongref.loadRelaxed() == 0 ? nullptr : value;
+ }
+
Data *d;
T *value;
};
+namespace QtPrivate {
+struct EnableInternalData {
+ template <typename T>
+ static T *internalData(const QWeakPointer<T> &p) noexcept { return p.internalData(); }
+};
+// hack to delay name lookup to instantiation time by making
+// EnableInternalData a dependent name:
+template <typename T>
+struct EnableInternalDataWrap : EnableInternalData {};
+}
+
template <class T>
class QEnableSharedFromThis
{
protected:
-#ifdef Q_COMPILER_DEFAULT_MEMBERS
QEnableSharedFromThis() = default;
-#else
- Q_DECL_CONSTEXPR QEnableSharedFromThis() {}
-#endif
QEnableSharedFromThis(const QEnableSharedFromThis &) {}
QEnableSharedFromThis &operator=(const QEnableSharedFromThis &) { return *this; }
@@ -728,92 +747,92 @@ public:
// operator== and operator!=
//
template <class T, class X>
-bool operator==(const QSharedPointer<T> &ptr1, const QSharedPointer<X> &ptr2) Q_DECL_NOTHROW
+bool operator==(const QSharedPointer<T> &ptr1, const QSharedPointer<X> &ptr2) noexcept
{
return ptr1.data() == ptr2.data();
}
template <class T, class X>
-bool operator!=(const QSharedPointer<T> &ptr1, const QSharedPointer<X> &ptr2) Q_DECL_NOTHROW
+bool operator!=(const QSharedPointer<T> &ptr1, const QSharedPointer<X> &ptr2) noexcept
{
return ptr1.data() != ptr2.data();
}
template <class T, class X>
-bool operator==(const QSharedPointer<T> &ptr1, const X *ptr2) Q_DECL_NOTHROW
+bool operator==(const QSharedPointer<T> &ptr1, const X *ptr2) noexcept
{
return ptr1.data() == ptr2;
}
template <class T, class X>
-bool operator==(const T *ptr1, const QSharedPointer<X> &ptr2) Q_DECL_NOTHROW
+bool operator==(const T *ptr1, const QSharedPointer<X> &ptr2) noexcept
{
return ptr1 == ptr2.data();
}
template <class T, class X>
-bool operator!=(const QSharedPointer<T> &ptr1, const X *ptr2) Q_DECL_NOTHROW
+bool operator!=(const QSharedPointer<T> &ptr1, const X *ptr2) noexcept
{
return !(ptr1 == ptr2);
}
template <class T, class X>
-bool operator!=(const T *ptr1, const QSharedPointer<X> &ptr2) Q_DECL_NOTHROW
+bool operator!=(const T *ptr1, const QSharedPointer<X> &ptr2) noexcept
{
return !(ptr2 == ptr1);
}
template <class T, class X>
-bool operator==(const QSharedPointer<T> &ptr1, const QWeakPointer<X> &ptr2) Q_DECL_NOTHROW
+bool operator==(const QSharedPointer<T> &ptr1, const QWeakPointer<X> &ptr2) noexcept
{
return ptr2 == ptr1;
}
template <class T, class X>
-bool operator!=(const QSharedPointer<T> &ptr1, const QWeakPointer<X> &ptr2) Q_DECL_NOTHROW
+bool operator!=(const QSharedPointer<T> &ptr1, const QWeakPointer<X> &ptr2) noexcept
{
return ptr2 != ptr1;
}
template<class T>
-inline bool operator==(const QSharedPointer<T> &lhs, std::nullptr_t) Q_DECL_NOTHROW
+inline bool operator==(const QSharedPointer<T> &lhs, std::nullptr_t) noexcept
{
return lhs.isNull();
}
template<class T>
-inline bool operator!=(const QSharedPointer<T> &lhs, std::nullptr_t) Q_DECL_NOTHROW
+inline bool operator!=(const QSharedPointer<T> &lhs, std::nullptr_t) noexcept
{
return !lhs.isNull();
}
template<class T>
-inline bool operator==(std::nullptr_t, const QSharedPointer<T> &rhs) Q_DECL_NOTHROW
+inline bool operator==(std::nullptr_t, const QSharedPointer<T> &rhs) noexcept
{
return rhs.isNull();
}
template<class T>
-inline bool operator!=(std::nullptr_t, const QSharedPointer<T> &rhs) Q_DECL_NOTHROW
+inline bool operator!=(std::nullptr_t, const QSharedPointer<T> &rhs) noexcept
{
return !rhs.isNull();
}
template<class T>
-inline bool operator==(const QWeakPointer<T> &lhs, std::nullptr_t) Q_DECL_NOTHROW
+inline bool operator==(const QWeakPointer<T> &lhs, std::nullptr_t) noexcept
{
return lhs.isNull();
}
template<class T>
-inline bool operator!=(const QWeakPointer<T> &lhs, std::nullptr_t) Q_DECL_NOTHROW
+inline bool operator!=(const QWeakPointer<T> &lhs, std::nullptr_t) noexcept
{
return !lhs.isNull();
}
template<class T>
-inline bool operator==(std::nullptr_t, const QWeakPointer<T> &rhs) Q_DECL_NOTHROW
+inline bool operator==(std::nullptr_t, const QWeakPointer<T> &rhs) noexcept
{
return rhs.isNull();
}
template<class T>
-inline bool operator!=(std::nullptr_t, const QWeakPointer<T> &rhs) Q_DECL_NOTHROW
+inline bool operator!=(std::nullptr_t, const QWeakPointer<T> &rhs) noexcept
{
return !rhs.isNull();
}
@@ -876,18 +895,12 @@ Q_INLINE_TEMPLATE QWeakPointer<T> QSharedPointer<T>::toWeakRef() const
}
template <class T>
-inline void qSwap(QSharedPointer<T> &p1, QSharedPointer<T> &p2)
-{
- p1.swap(p2);
-}
+inline void swap(QSharedPointer<T> &p1, QSharedPointer<T> &p2) noexcept
+{ p1.swap(p2); }
-QT_END_NAMESPACE
-namespace std {
- template <class T>
- inline void swap(QT_PREPEND_NAMESPACE(QSharedPointer)<T> &p1, QT_PREPEND_NAMESPACE(QSharedPointer)<T> &p2)
- { p1.swap(p2); }
-}
-QT_BEGIN_NAMESPACE
+template <class T>
+inline void swap(QWeakPointer<T> &p1, QWeakPointer<T> &p2) noexcept
+{ p1.swap(p2); }
namespace QtSharedPointer {
// helper functions:
@@ -972,11 +985,13 @@ qobject_cast(const QWeakPointer<T> &src)
return qSharedPointerObjectCast<typename QtSharedPointer::RemovePointer<X>::Type, T>(src);
}
+/// ### Qt 6: make this use toStrongRef() (once support for storing
+/// non-managed QObjects in QWeakPointer is removed)
template<typename T>
QWeakPointer<typename std::enable_if<QtPrivate::IsPointerToTypeDerivedFromQObject<T*>::Value, T>::type>
qWeakPointerFromVariant(const QVariant &variant)
{
- return QWeakPointer<T>(qobject_cast<T*>(QtSharedPointer::weakPointerFromVariant_internal(variant).data()));
+ return QWeakPointer<T>(qobject_cast<T*>(QtPrivate::EnableInternalData::internalData(QtSharedPointer::weakPointerFromVariant_internal(variant))));
}
template<typename T>
QSharedPointer<typename std::enable_if<QtPrivate::IsPointerToTypeDerivedFromQObject<T*>::Value, T>::type>
@@ -985,6 +1000,46 @@ qSharedPointerFromVariant(const QVariant &variant)
return qSharedPointerObjectCast<T>(QtSharedPointer::sharedPointerFromVariant_internal(variant));
}
+// std::shared_ptr helpers
+
+template <typename X, class T>
+std::shared_ptr<X> qobject_pointer_cast(const std::shared_ptr<T> &src)
+{
+ using element_type = typename std::shared_ptr<X>::element_type;
+ return std::shared_ptr<X>(src, qobject_cast<element_type *>(src.get()));
+}
+
+template <typename X, class T>
+std::shared_ptr<X> qobject_pointer_cast(std::shared_ptr<T> &&src)
+{
+ using element_type = typename std::shared_ptr<X>::element_type;
+ auto castResult = qobject_cast<element_type *>(src.get());
+ if (castResult) {
+ auto result = std::shared_ptr<X>(std::move(src), castResult);
+#if __cplusplus <= 201703L
+ // C++2a's move aliasing constructor will leave src empty.
+ // Before C++2a we don't really know if the compiler has support for it.
+ // The move aliasing constructor is the resolution for LWG2996,
+ // which does not impose a feature-testing macro. So: clear src.
+ src.reset();
+#endif
+ return result;
+ }
+ return std::shared_ptr<X>();
+}
+
+template <typename X, class T>
+std::shared_ptr<X> qSharedPointerObjectCast(const std::shared_ptr<T> &src)
+{
+ return qobject_pointer_cast<X>(src);
+}
+
+template <typename X, class T>
+std::shared_ptr<X> qSharedPointerObjectCast(std::shared_ptr<T> &&src)
+{
+ return qobject_pointer_cast<X>(std::move(src));
+}
+
#endif
template<typename T> Q_DECLARE_TYPEINFO_BODY(QWeakPointer<T>, Q_MOVABLE_TYPE);
diff --git a/src/corelib/tools/qsimd.cpp b/src/corelib/tools/qsimd.cpp
index 09c276c4e0..fb9b5996f6 100644
--- a/src/corelib/tools/qsimd.cpp
+++ b/src/corelib/tools/qsimd.cpp
@@ -595,9 +595,9 @@ quint64 qDetectCpuFeatures()
features_string + features_indices[qCountTrailingZeroBits(missing)]);
}
- qt_cpu_features[0].store(f | quint32(QSimdInitialized));
+ qt_cpu_features[0].storeRelaxed(f | quint32(QSimdInitialized));
#ifndef Q_ATOMIC_INT64_IS_SUPPORTED
- qt_cpu_features[1].store(f >> 32);
+ qt_cpu_features[1].storeRelaxed(f >> 32);
#endif
return f;
}
@@ -630,7 +630,7 @@ void qDumpCPUFeatures()
# define _rdrandXX_step _rdrand32_step
# endif
-QT_FUNCTION_TARGET(RDRND) qsizetype qRandomCpu(void *buffer, qsizetype count) Q_DECL_NOTHROW
+QT_FUNCTION_TARGET(RDRND) qsizetype qRandomCpu(void *buffer, qsizetype count) noexcept
{
unsigned *ptr = reinterpret_cast<unsigned *>(buffer);
unsigned *end = ptr + count;
diff --git a/src/corelib/tools/qsimd_p.h b/src/corelib/tools/qsimd_p.h
index 397b0f55a6..26e98c4542 100644
--- a/src/corelib/tools/qsimd_p.h
+++ b/src/corelib/tools/qsimd_p.h
@@ -347,9 +347,9 @@ extern Q_CORE_EXPORT QBasicAtomicInteger<unsigned> qt_cpu_features[2];
Q_CORE_EXPORT quint64 qDetectCpuFeatures();
#if defined(Q_PROCESSOR_X86) && QT_COMPILER_SUPPORTS_HERE(RDRND) && !defined(QT_BOOTSTRAPPED)
-Q_CORE_EXPORT qsizetype qRandomCpu(void *, qsizetype) Q_DECL_NOTHROW;
+Q_CORE_EXPORT qsizetype qRandomCpu(void *, qsizetype) noexcept;
#else
-static inline qsizetype qRandomCpu(void *, qsizetype) Q_DECL_NOTHROW
+static inline qsizetype qRandomCpu(void *, qsizetype) noexcept
{
return 0;
}
@@ -357,9 +357,9 @@ static inline qsizetype qRandomCpu(void *, qsizetype) Q_DECL_NOTHROW
static inline quint64 qCpuFeatures()
{
- quint64 features = qt_cpu_features[0].load();
+ quint64 features = qt_cpu_features[0].loadRelaxed();
#ifndef Q_ATOMIC_INT64_IS_SUPPORTED
- features |= quint64(qt_cpu_features[1].load()) << 32;
+ features |= quint64(qt_cpu_features[1].loadRelaxed()) << 32;
#endif
if (Q_UNLIKELY(features == 0)) {
features = qDetectCpuFeatures();
diff --git a/src/corelib/tools/qsize.cpp b/src/corelib/tools/qsize.cpp
index 3e97947ad2..2cbaae117d 100644
--- a/src/corelib/tools/qsize.cpp
+++ b/src/corelib/tools/qsize.cpp
@@ -163,7 +163,7 @@ QT_BEGIN_NAMESPACE
\sa setWidth(), setHeight(), transposed()
*/
-void QSize::transpose() Q_DECL_NOTHROW
+void QSize::transpose() noexcept
{
qSwap(wd, ht);
}
@@ -222,7 +222,7 @@ void QSize::transpose() Q_DECL_NOTHROW
Return a size scaled to a rectangle with the given size \a s,
according to the specified \a mode.
*/
-QSize QSize::scaled(const QSize &s, Qt::AspectRatioMode mode) const Q_DECL_NOTHROW
+QSize QSize::scaled(const QSize &s, Qt::AspectRatioMode mode) const noexcept
{
if (mode == Qt::IgnoreAspectRatio || wd == 0 || ht == 0) {
return s;
@@ -390,7 +390,25 @@ QSize QSize::scaled(const QSize &s, Qt::AspectRatioMode mode) const Q_DECL_NOTHR
\sa expandedTo(), scale()
*/
+/*!
+ \fn QSize QSize::grownBy(QMargins margins) const
+ \fn QSizeF QSizeF::grownBy(QMarginsF margins) const
+ \since 5.14
+
+ Returns the size that results from growing this size by \a margins.
+
+ \sa shrunkBy()
+*/
+/*!
+ \fn QSize QSize::shrunkBy(QMargins margins) const
+ \fn QSizeF QSizeF::shrunkBy(QMarginsF margins) const
+ \since 5.14
+
+ Returns the size that results from shrinking this size by \a margins.
+
+ \sa grownBy()
+*/
/*****************************************************************************
QSize stream functions
@@ -594,7 +612,7 @@ QDebug operator<<(QDebug dbg, const QSize &s)
\sa setWidth(), setHeight(), transposed()
*/
-void QSizeF::transpose() Q_DECL_NOTHROW
+void QSizeF::transpose() noexcept
{
qSwap(wd, ht);
}
@@ -653,7 +671,7 @@ void QSizeF::transpose() Q_DECL_NOTHROW
Returns a size scaled to a rectangle with the given size \a s,
according to the specified \a mode.
*/
-QSizeF QSizeF::scaled(const QSizeF &s, Qt::AspectRatioMode mode) const Q_DECL_NOTHROW
+QSizeF QSizeF::scaled(const QSizeF &s, Qt::AspectRatioMode mode) const noexcept
{
if (mode == Qt::IgnoreAspectRatio || qIsNull(wd) || qIsNull(ht)) {
return s;
diff --git a/src/corelib/tools/qsize.h b/src/corelib/tools/qsize.h
index bb29dca7c4..06de1cd63f 100644
--- a/src/corelib/tools/qsize.h
+++ b/src/corelib/tools/qsize.h
@@ -41,6 +41,7 @@
#define QSIZE_H
#include <QtCore/qnamespace.h>
+#include <QtCore/qmargins.h>
#if defined(Q_OS_DARWIN) || defined(Q_QDOC)
struct CGSize;
@@ -52,46 +53,51 @@ QT_BEGIN_NAMESPACE
class Q_CORE_EXPORT QSize
{
public:
- Q_DECL_CONSTEXPR QSize() Q_DECL_NOTHROW;
- Q_DECL_CONSTEXPR QSize(int w, int h) Q_DECL_NOTHROW;
-
- Q_DECL_CONSTEXPR inline bool isNull() const Q_DECL_NOTHROW;
- Q_DECL_CONSTEXPR inline bool isEmpty() const Q_DECL_NOTHROW;
- Q_DECL_CONSTEXPR inline bool isValid() const Q_DECL_NOTHROW;
-
- Q_DECL_CONSTEXPR inline int width() const Q_DECL_NOTHROW;
- Q_DECL_CONSTEXPR inline int height() const Q_DECL_NOTHROW;
- Q_DECL_RELAXED_CONSTEXPR inline void setWidth(int w) Q_DECL_NOTHROW;
- Q_DECL_RELAXED_CONSTEXPR inline void setHeight(int h) Q_DECL_NOTHROW;
- void transpose() Q_DECL_NOTHROW;
- Q_REQUIRED_RESULT Q_DECL_CONSTEXPR inline QSize transposed() const Q_DECL_NOTHROW;
-
- inline void scale(int w, int h, Qt::AspectRatioMode mode) Q_DECL_NOTHROW;
- inline void scale(const QSize &s, Qt::AspectRatioMode mode) Q_DECL_NOTHROW;
- Q_REQUIRED_RESULT QSize scaled(int w, int h, Qt::AspectRatioMode mode) const Q_DECL_NOTHROW;
- Q_REQUIRED_RESULT QSize scaled(const QSize &s, Qt::AspectRatioMode mode) const Q_DECL_NOTHROW;
-
- Q_REQUIRED_RESULT Q_DECL_CONSTEXPR inline QSize expandedTo(const QSize &) const Q_DECL_NOTHROW;
- Q_REQUIRED_RESULT Q_DECL_CONSTEXPR inline QSize boundedTo(const QSize &) const Q_DECL_NOTHROW;
-
- Q_DECL_RELAXED_CONSTEXPR inline int &rwidth() Q_DECL_NOTHROW;
- Q_DECL_RELAXED_CONSTEXPR inline int &rheight() Q_DECL_NOTHROW;
-
- Q_DECL_RELAXED_CONSTEXPR inline QSize &operator+=(const QSize &) Q_DECL_NOTHROW;
- Q_DECL_RELAXED_CONSTEXPR inline QSize &operator-=(const QSize &) Q_DECL_NOTHROW;
- Q_DECL_RELAXED_CONSTEXPR inline QSize &operator*=(qreal c) Q_DECL_NOTHROW;
+ Q_DECL_CONSTEXPR QSize() noexcept;
+ Q_DECL_CONSTEXPR QSize(int w, int h) noexcept;
+
+ Q_DECL_CONSTEXPR inline bool isNull() const noexcept;
+ Q_DECL_CONSTEXPR inline bool isEmpty() const noexcept;
+ Q_DECL_CONSTEXPR inline bool isValid() const noexcept;
+
+ Q_DECL_CONSTEXPR inline int width() const noexcept;
+ Q_DECL_CONSTEXPR inline int height() const noexcept;
+ Q_DECL_RELAXED_CONSTEXPR inline void setWidth(int w) noexcept;
+ Q_DECL_RELAXED_CONSTEXPR inline void setHeight(int h) noexcept;
+ void transpose() noexcept;
+ Q_REQUIRED_RESULT Q_DECL_CONSTEXPR inline QSize transposed() const noexcept;
+
+ inline void scale(int w, int h, Qt::AspectRatioMode mode) noexcept;
+ inline void scale(const QSize &s, Qt::AspectRatioMode mode) noexcept;
+ Q_REQUIRED_RESULT QSize scaled(int w, int h, Qt::AspectRatioMode mode) const noexcept;
+ Q_REQUIRED_RESULT QSize scaled(const QSize &s, Qt::AspectRatioMode mode) const noexcept;
+
+ Q_REQUIRED_RESULT Q_DECL_CONSTEXPR inline QSize expandedTo(const QSize &) const noexcept;
+ Q_REQUIRED_RESULT Q_DECL_CONSTEXPR inline QSize boundedTo(const QSize &) const noexcept;
+
+ Q_REQUIRED_RESULT Q_DECL_CONSTEXPR QSize grownBy(QMargins m) const noexcept
+ { return {width() + m.left() + m.right(), height() + m.top() + m.bottom()}; }
+ Q_REQUIRED_RESULT Q_DECL_CONSTEXPR QSize shrunkBy(QMargins m) const noexcept
+ { return {width() - m.left() - m.right(), height() - m.top() - m.bottom()}; }
+
+ Q_DECL_RELAXED_CONSTEXPR inline int &rwidth() noexcept;
+ Q_DECL_RELAXED_CONSTEXPR inline int &rheight() noexcept;
+
+ Q_DECL_RELAXED_CONSTEXPR inline QSize &operator+=(const QSize &) noexcept;
+ Q_DECL_RELAXED_CONSTEXPR inline QSize &operator-=(const QSize &) noexcept;
+ Q_DECL_RELAXED_CONSTEXPR inline QSize &operator*=(qreal c) noexcept;
inline QSize &operator/=(qreal c);
- friend inline Q_DECL_CONSTEXPR bool operator==(const QSize &, const QSize &) Q_DECL_NOTHROW;
- friend inline Q_DECL_CONSTEXPR bool operator!=(const QSize &, const QSize &) Q_DECL_NOTHROW;
- friend inline Q_DECL_CONSTEXPR const QSize operator+(const QSize &, const QSize &) Q_DECL_NOTHROW;
- friend inline Q_DECL_CONSTEXPR const QSize operator-(const QSize &, const QSize &) Q_DECL_NOTHROW;
- friend inline Q_DECL_CONSTEXPR const QSize operator*(const QSize &, qreal) Q_DECL_NOTHROW;
- friend inline Q_DECL_CONSTEXPR const QSize operator*(qreal, const QSize &) Q_DECL_NOTHROW;
+ friend inline Q_DECL_CONSTEXPR bool operator==(const QSize &, const QSize &) noexcept;
+ friend inline Q_DECL_CONSTEXPR bool operator!=(const QSize &, const QSize &) noexcept;
+ friend inline Q_DECL_CONSTEXPR const QSize operator+(const QSize &, const QSize &) noexcept;
+ friend inline Q_DECL_CONSTEXPR const QSize operator-(const QSize &, const QSize &) noexcept;
+ friend inline Q_DECL_CONSTEXPR const QSize operator*(const QSize &, qreal) noexcept;
+ friend inline Q_DECL_CONSTEXPR const QSize operator*(qreal, const QSize &) noexcept;
friend inline const QSize operator/(const QSize &, qreal);
#if defined(Q_OS_DARWIN) || defined(Q_QDOC)
- Q_REQUIRED_RESULT CGSize toCGSize() const Q_DECL_NOTHROW;
+ Q_REQUIRED_RESULT CGSize toCGSize() const noexcept;
#endif
private:
@@ -114,74 +120,74 @@ Q_CORE_EXPORT QDataStream &operator>>(QDataStream &, QSize &);
QSize inline functions
*****************************************************************************/
-Q_DECL_CONSTEXPR inline QSize::QSize() Q_DECL_NOTHROW : wd(-1), ht(-1) {}
+Q_DECL_CONSTEXPR inline QSize::QSize() noexcept : wd(-1), ht(-1) {}
-Q_DECL_CONSTEXPR inline QSize::QSize(int w, int h) Q_DECL_NOTHROW : wd(w), ht(h) {}
+Q_DECL_CONSTEXPR inline QSize::QSize(int w, int h) noexcept : wd(w), ht(h) {}
-Q_DECL_CONSTEXPR inline bool QSize::isNull() const Q_DECL_NOTHROW
+Q_DECL_CONSTEXPR inline bool QSize::isNull() const noexcept
{ return wd==0 && ht==0; }
-Q_DECL_CONSTEXPR inline bool QSize::isEmpty() const Q_DECL_NOTHROW
+Q_DECL_CONSTEXPR inline bool QSize::isEmpty() const noexcept
{ return wd<1 || ht<1; }
-Q_DECL_CONSTEXPR inline bool QSize::isValid() const Q_DECL_NOTHROW
+Q_DECL_CONSTEXPR inline bool QSize::isValid() const noexcept
{ return wd>=0 && ht>=0; }
-Q_DECL_CONSTEXPR inline int QSize::width() const Q_DECL_NOTHROW
+Q_DECL_CONSTEXPR inline int QSize::width() const noexcept
{ return wd; }
-Q_DECL_CONSTEXPR inline int QSize::height() const Q_DECL_NOTHROW
+Q_DECL_CONSTEXPR inline int QSize::height() const noexcept
{ return ht; }
-Q_DECL_RELAXED_CONSTEXPR inline void QSize::setWidth(int w) Q_DECL_NOTHROW
+Q_DECL_RELAXED_CONSTEXPR inline void QSize::setWidth(int w) noexcept
{ wd = w; }
-Q_DECL_RELAXED_CONSTEXPR inline void QSize::setHeight(int h) Q_DECL_NOTHROW
+Q_DECL_RELAXED_CONSTEXPR inline void QSize::setHeight(int h) noexcept
{ ht = h; }
-Q_DECL_CONSTEXPR inline QSize QSize::transposed() const Q_DECL_NOTHROW
+Q_DECL_CONSTEXPR inline QSize QSize::transposed() const noexcept
{ return QSize(ht, wd); }
-inline void QSize::scale(int w, int h, Qt::AspectRatioMode mode) Q_DECL_NOTHROW
+inline void QSize::scale(int w, int h, Qt::AspectRatioMode mode) noexcept
{ scale(QSize(w, h), mode); }
-inline void QSize::scale(const QSize &s, Qt::AspectRatioMode mode) Q_DECL_NOTHROW
+inline void QSize::scale(const QSize &s, Qt::AspectRatioMode mode) noexcept
{ *this = scaled(s, mode); }
-inline QSize QSize::scaled(int w, int h, Qt::AspectRatioMode mode) const Q_DECL_NOTHROW
+inline QSize QSize::scaled(int w, int h, Qt::AspectRatioMode mode) const noexcept
{ return scaled(QSize(w, h), mode); }
-Q_DECL_RELAXED_CONSTEXPR inline int &QSize::rwidth() Q_DECL_NOTHROW
+Q_DECL_RELAXED_CONSTEXPR inline int &QSize::rwidth() noexcept
{ return wd; }
-Q_DECL_RELAXED_CONSTEXPR inline int &QSize::rheight() Q_DECL_NOTHROW
+Q_DECL_RELAXED_CONSTEXPR inline int &QSize::rheight() noexcept
{ return ht; }
-Q_DECL_RELAXED_CONSTEXPR inline QSize &QSize::operator+=(const QSize &s) Q_DECL_NOTHROW
+Q_DECL_RELAXED_CONSTEXPR inline QSize &QSize::operator+=(const QSize &s) noexcept
{ wd+=s.wd; ht+=s.ht; return *this; }
-Q_DECL_RELAXED_CONSTEXPR inline QSize &QSize::operator-=(const QSize &s) Q_DECL_NOTHROW
+Q_DECL_RELAXED_CONSTEXPR inline QSize &QSize::operator-=(const QSize &s) noexcept
{ wd-=s.wd; ht-=s.ht; return *this; }
-Q_DECL_RELAXED_CONSTEXPR inline QSize &QSize::operator*=(qreal c) Q_DECL_NOTHROW
+Q_DECL_RELAXED_CONSTEXPR inline QSize &QSize::operator*=(qreal c) noexcept
{ wd = qRound(wd*c); ht = qRound(ht*c); return *this; }
-Q_DECL_CONSTEXPR inline bool operator==(const QSize &s1, const QSize &s2) Q_DECL_NOTHROW
+Q_DECL_CONSTEXPR inline bool operator==(const QSize &s1, const QSize &s2) noexcept
{ return s1.wd == s2.wd && s1.ht == s2.ht; }
-Q_DECL_CONSTEXPR inline bool operator!=(const QSize &s1, const QSize &s2) Q_DECL_NOTHROW
+Q_DECL_CONSTEXPR inline bool operator!=(const QSize &s1, const QSize &s2) noexcept
{ return s1.wd != s2.wd || s1.ht != s2.ht; }
-Q_DECL_CONSTEXPR inline const QSize operator+(const QSize & s1, const QSize & s2) Q_DECL_NOTHROW
+Q_DECL_CONSTEXPR inline const QSize operator+(const QSize & s1, const QSize & s2) noexcept
{ return QSize(s1.wd+s2.wd, s1.ht+s2.ht); }
-Q_DECL_CONSTEXPR inline const QSize operator-(const QSize &s1, const QSize &s2) Q_DECL_NOTHROW
+Q_DECL_CONSTEXPR inline const QSize operator-(const QSize &s1, const QSize &s2) noexcept
{ return QSize(s1.wd-s2.wd, s1.ht-s2.ht); }
-Q_DECL_CONSTEXPR inline const QSize operator*(const QSize &s, qreal c) Q_DECL_NOTHROW
+Q_DECL_CONSTEXPR inline const QSize operator*(const QSize &s, qreal c) noexcept
{ return QSize(qRound(s.wd*c), qRound(s.ht*c)); }
-Q_DECL_CONSTEXPR inline const QSize operator*(qreal c, const QSize &s) Q_DECL_NOTHROW
+Q_DECL_CONSTEXPR inline const QSize operator*(qreal c, const QSize &s) noexcept
{ return QSize(qRound(s.wd*c), qRound(s.ht*c)); }
inline QSize &QSize::operator/=(qreal c)
@@ -197,12 +203,12 @@ inline const QSize operator/(const QSize &s, qreal c)
return QSize(qRound(s.wd/c), qRound(s.ht/c));
}
-Q_DECL_CONSTEXPR inline QSize QSize::expandedTo(const QSize & otherSize) const Q_DECL_NOTHROW
+Q_DECL_CONSTEXPR inline QSize QSize::expandedTo(const QSize & otherSize) const noexcept
{
return QSize(qMax(wd,otherSize.wd), qMax(ht,otherSize.ht));
}
-Q_DECL_CONSTEXPR inline QSize QSize::boundedTo(const QSize & otherSize) const Q_DECL_NOTHROW
+Q_DECL_CONSTEXPR inline QSize QSize::boundedTo(const QSize & otherSize) const noexcept
{
return QSize(qMin(wd,otherSize.wd), qMin(ht,otherSize.ht));
}
@@ -215,50 +221,55 @@ Q_CORE_EXPORT QDebug operator<<(QDebug, const QSize &);
class Q_CORE_EXPORT QSizeF
{
public:
- Q_DECL_CONSTEXPR QSizeF() Q_DECL_NOTHROW;
- Q_DECL_CONSTEXPR QSizeF(const QSize &sz) Q_DECL_NOTHROW;
- Q_DECL_CONSTEXPR QSizeF(qreal w, qreal h) Q_DECL_NOTHROW;
-
- inline bool isNull() const Q_DECL_NOTHROW;
- Q_DECL_CONSTEXPR inline bool isEmpty() const Q_DECL_NOTHROW;
- Q_DECL_CONSTEXPR inline bool isValid() const Q_DECL_NOTHROW;
-
- Q_DECL_CONSTEXPR inline qreal width() const Q_DECL_NOTHROW;
- Q_DECL_CONSTEXPR inline qreal height() const Q_DECL_NOTHROW;
- Q_DECL_RELAXED_CONSTEXPR inline void setWidth(qreal w) Q_DECL_NOTHROW;
- Q_DECL_RELAXED_CONSTEXPR inline void setHeight(qreal h) Q_DECL_NOTHROW;
- void transpose() Q_DECL_NOTHROW;
- Q_REQUIRED_RESULT Q_DECL_CONSTEXPR inline QSizeF transposed() const Q_DECL_NOTHROW;
-
- inline void scale(qreal w, qreal h, Qt::AspectRatioMode mode) Q_DECL_NOTHROW;
- inline void scale(const QSizeF &s, Qt::AspectRatioMode mode) Q_DECL_NOTHROW;
- Q_REQUIRED_RESULT QSizeF scaled(qreal w, qreal h, Qt::AspectRatioMode mode) const Q_DECL_NOTHROW;
- Q_REQUIRED_RESULT QSizeF scaled(const QSizeF &s, Qt::AspectRatioMode mode) const Q_DECL_NOTHROW;
-
- Q_REQUIRED_RESULT Q_DECL_CONSTEXPR inline QSizeF expandedTo(const QSizeF &) const Q_DECL_NOTHROW;
- Q_REQUIRED_RESULT Q_DECL_CONSTEXPR inline QSizeF boundedTo(const QSizeF &) const Q_DECL_NOTHROW;
-
- Q_DECL_RELAXED_CONSTEXPR inline qreal &rwidth() Q_DECL_NOTHROW;
- Q_DECL_RELAXED_CONSTEXPR inline qreal &rheight() Q_DECL_NOTHROW;
-
- Q_DECL_RELAXED_CONSTEXPR inline QSizeF &operator+=(const QSizeF &) Q_DECL_NOTHROW;
- Q_DECL_RELAXED_CONSTEXPR inline QSizeF &operator-=(const QSizeF &) Q_DECL_NOTHROW;
- Q_DECL_RELAXED_CONSTEXPR inline QSizeF &operator*=(qreal c) Q_DECL_NOTHROW;
+ Q_DECL_CONSTEXPR QSizeF() noexcept;
+ Q_DECL_CONSTEXPR QSizeF(const QSize &sz) noexcept;
+ Q_DECL_CONSTEXPR QSizeF(qreal w, qreal h) noexcept;
+
+ inline bool isNull() const noexcept;
+ Q_DECL_CONSTEXPR inline bool isEmpty() const noexcept;
+ Q_DECL_CONSTEXPR inline bool isValid() const noexcept;
+
+ Q_DECL_CONSTEXPR inline qreal width() const noexcept;
+ Q_DECL_CONSTEXPR inline qreal height() const noexcept;
+ Q_DECL_RELAXED_CONSTEXPR inline void setWidth(qreal w) noexcept;
+ Q_DECL_RELAXED_CONSTEXPR inline void setHeight(qreal h) noexcept;
+ void transpose() noexcept;
+ Q_REQUIRED_RESULT Q_DECL_CONSTEXPR inline QSizeF transposed() const noexcept;
+
+ inline void scale(qreal w, qreal h, Qt::AspectRatioMode mode) noexcept;
+ inline void scale(const QSizeF &s, Qt::AspectRatioMode mode) noexcept;
+ Q_REQUIRED_RESULT QSizeF scaled(qreal w, qreal h, Qt::AspectRatioMode mode) const noexcept;
+ Q_REQUIRED_RESULT QSizeF scaled(const QSizeF &s, Qt::AspectRatioMode mode) const noexcept;
+
+ Q_REQUIRED_RESULT Q_DECL_CONSTEXPR inline QSizeF expandedTo(const QSizeF &) const noexcept;
+ Q_REQUIRED_RESULT Q_DECL_CONSTEXPR inline QSizeF boundedTo(const QSizeF &) const noexcept;
+
+ Q_REQUIRED_RESULT Q_DECL_CONSTEXPR QSizeF grownBy(QMarginsF m) const noexcept
+ { return {width() + m.left() + m.right(), height() + m.top() + m.bottom()}; }
+ Q_REQUIRED_RESULT Q_DECL_CONSTEXPR QSizeF shrunkBy(QMarginsF m) const noexcept
+ { return {width() - m.left() - m.right(), height() - m.top() - m.bottom()}; }
+
+ Q_DECL_RELAXED_CONSTEXPR inline qreal &rwidth() noexcept;
+ Q_DECL_RELAXED_CONSTEXPR inline qreal &rheight() noexcept;
+
+ Q_DECL_RELAXED_CONSTEXPR inline QSizeF &operator+=(const QSizeF &) noexcept;
+ Q_DECL_RELAXED_CONSTEXPR inline QSizeF &operator-=(const QSizeF &) noexcept;
+ Q_DECL_RELAXED_CONSTEXPR inline QSizeF &operator*=(qreal c) noexcept;
inline QSizeF &operator/=(qreal c);
- friend Q_DECL_CONSTEXPR inline bool operator==(const QSizeF &, const QSizeF &) Q_DECL_NOTHROW;
- friend Q_DECL_CONSTEXPR inline bool operator!=(const QSizeF &, const QSizeF &) Q_DECL_NOTHROW;
- friend Q_DECL_CONSTEXPR inline const QSizeF operator+(const QSizeF &, const QSizeF &) Q_DECL_NOTHROW;
- friend Q_DECL_CONSTEXPR inline const QSizeF operator-(const QSizeF &, const QSizeF &) Q_DECL_NOTHROW;
- friend Q_DECL_CONSTEXPR inline const QSizeF operator*(const QSizeF &, qreal) Q_DECL_NOTHROW;
- friend Q_DECL_CONSTEXPR inline const QSizeF operator*(qreal, const QSizeF &) Q_DECL_NOTHROW;
+ friend Q_DECL_CONSTEXPR inline bool operator==(const QSizeF &, const QSizeF &) noexcept;
+ friend Q_DECL_CONSTEXPR inline bool operator!=(const QSizeF &, const QSizeF &) noexcept;
+ friend Q_DECL_CONSTEXPR inline const QSizeF operator+(const QSizeF &, const QSizeF &) noexcept;
+ friend Q_DECL_CONSTEXPR inline const QSizeF operator-(const QSizeF &, const QSizeF &) noexcept;
+ friend Q_DECL_CONSTEXPR inline const QSizeF operator*(const QSizeF &, qreal) noexcept;
+ friend Q_DECL_CONSTEXPR inline const QSizeF operator*(qreal, const QSizeF &) noexcept;
friend inline const QSizeF operator/(const QSizeF &, qreal);
- Q_DECL_CONSTEXPR inline QSize toSize() const Q_DECL_NOTHROW;
+ Q_DECL_CONSTEXPR inline QSize toSize() const noexcept;
#if defined(Q_OS_DARWIN) || defined(Q_QDOC)
- Q_REQUIRED_RESULT static QSizeF fromCGSize(CGSize size) Q_DECL_NOTHROW;
- Q_REQUIRED_RESULT CGSize toCGSize() const Q_DECL_NOTHROW;
+ Q_REQUIRED_RESULT static QSizeF fromCGSize(CGSize size) noexcept;
+ Q_REQUIRED_RESULT CGSize toCGSize() const noexcept;
#endif
private:
@@ -282,76 +293,76 @@ Q_CORE_EXPORT QDataStream &operator>>(QDataStream &, QSizeF &);
QSizeF inline functions
*****************************************************************************/
-Q_DECL_CONSTEXPR inline QSizeF::QSizeF() Q_DECL_NOTHROW : wd(-1.), ht(-1.) {}
+Q_DECL_CONSTEXPR inline QSizeF::QSizeF() noexcept : wd(-1.), ht(-1.) {}
-Q_DECL_CONSTEXPR inline QSizeF::QSizeF(const QSize &sz) Q_DECL_NOTHROW : wd(sz.width()), ht(sz.height()) {}
+Q_DECL_CONSTEXPR inline QSizeF::QSizeF(const QSize &sz) noexcept : wd(sz.width()), ht(sz.height()) {}
-Q_DECL_CONSTEXPR inline QSizeF::QSizeF(qreal w, qreal h) Q_DECL_NOTHROW : wd(w), ht(h) {}
+Q_DECL_CONSTEXPR inline QSizeF::QSizeF(qreal w, qreal h) noexcept : wd(w), ht(h) {}
-inline bool QSizeF::isNull() const Q_DECL_NOTHROW
+inline bool QSizeF::isNull() const noexcept
{ return qIsNull(wd) && qIsNull(ht); }
-Q_DECL_CONSTEXPR inline bool QSizeF::isEmpty() const Q_DECL_NOTHROW
+Q_DECL_CONSTEXPR inline bool QSizeF::isEmpty() const noexcept
{ return wd <= 0. || ht <= 0.; }
-Q_DECL_CONSTEXPR inline bool QSizeF::isValid() const Q_DECL_NOTHROW
+Q_DECL_CONSTEXPR inline bool QSizeF::isValid() const noexcept
{ return wd >= 0. && ht >= 0.; }
-Q_DECL_CONSTEXPR inline qreal QSizeF::width() const Q_DECL_NOTHROW
+Q_DECL_CONSTEXPR inline qreal QSizeF::width() const noexcept
{ return wd; }
-Q_DECL_CONSTEXPR inline qreal QSizeF::height() const Q_DECL_NOTHROW
+Q_DECL_CONSTEXPR inline qreal QSizeF::height() const noexcept
{ return ht; }
-Q_DECL_RELAXED_CONSTEXPR inline void QSizeF::setWidth(qreal w) Q_DECL_NOTHROW
+Q_DECL_RELAXED_CONSTEXPR inline void QSizeF::setWidth(qreal w) noexcept
{ wd = w; }
-Q_DECL_RELAXED_CONSTEXPR inline void QSizeF::setHeight(qreal h) Q_DECL_NOTHROW
+Q_DECL_RELAXED_CONSTEXPR inline void QSizeF::setHeight(qreal h) noexcept
{ ht = h; }
-Q_DECL_CONSTEXPR inline QSizeF QSizeF::transposed() const Q_DECL_NOTHROW
+Q_DECL_CONSTEXPR inline QSizeF QSizeF::transposed() const noexcept
{ return QSizeF(ht, wd); }
-inline void QSizeF::scale(qreal w, qreal h, Qt::AspectRatioMode mode) Q_DECL_NOTHROW
+inline void QSizeF::scale(qreal w, qreal h, Qt::AspectRatioMode mode) noexcept
{ scale(QSizeF(w, h), mode); }
-inline void QSizeF::scale(const QSizeF &s, Qt::AspectRatioMode mode) Q_DECL_NOTHROW
+inline void QSizeF::scale(const QSizeF &s, Qt::AspectRatioMode mode) noexcept
{ *this = scaled(s, mode); }
-inline QSizeF QSizeF::scaled(qreal w, qreal h, Qt::AspectRatioMode mode) const Q_DECL_NOTHROW
+inline QSizeF QSizeF::scaled(qreal w, qreal h, Qt::AspectRatioMode mode) const noexcept
{ return scaled(QSizeF(w, h), mode); }
-Q_DECL_RELAXED_CONSTEXPR inline qreal &QSizeF::rwidth() Q_DECL_NOTHROW
+Q_DECL_RELAXED_CONSTEXPR inline qreal &QSizeF::rwidth() noexcept
{ return wd; }
-Q_DECL_RELAXED_CONSTEXPR inline qreal &QSizeF::rheight() Q_DECL_NOTHROW
+Q_DECL_RELAXED_CONSTEXPR inline qreal &QSizeF::rheight() noexcept
{ return ht; }
-Q_DECL_RELAXED_CONSTEXPR inline QSizeF &QSizeF::operator+=(const QSizeF &s) Q_DECL_NOTHROW
+Q_DECL_RELAXED_CONSTEXPR inline QSizeF &QSizeF::operator+=(const QSizeF &s) noexcept
{ wd += s.wd; ht += s.ht; return *this; }
-Q_DECL_RELAXED_CONSTEXPR inline QSizeF &QSizeF::operator-=(const QSizeF &s) Q_DECL_NOTHROW
+Q_DECL_RELAXED_CONSTEXPR inline QSizeF &QSizeF::operator-=(const QSizeF &s) noexcept
{ wd -= s.wd; ht -= s.ht; return *this; }
-Q_DECL_RELAXED_CONSTEXPR inline QSizeF &QSizeF::operator*=(qreal c) Q_DECL_NOTHROW
+Q_DECL_RELAXED_CONSTEXPR inline QSizeF &QSizeF::operator*=(qreal c) noexcept
{ wd *= c; ht *= c; return *this; }
-Q_DECL_CONSTEXPR inline bool operator==(const QSizeF &s1, const QSizeF &s2) Q_DECL_NOTHROW
+Q_DECL_CONSTEXPR inline bool operator==(const QSizeF &s1, const QSizeF &s2) noexcept
{ return qFuzzyCompare(s1.wd, s2.wd) && qFuzzyCompare(s1.ht, s2.ht); }
-Q_DECL_CONSTEXPR inline bool operator!=(const QSizeF &s1, const QSizeF &s2) Q_DECL_NOTHROW
+Q_DECL_CONSTEXPR inline bool operator!=(const QSizeF &s1, const QSizeF &s2) noexcept
{ return !qFuzzyCompare(s1.wd, s2.wd) || !qFuzzyCompare(s1.ht, s2.ht); }
-Q_DECL_CONSTEXPR inline const QSizeF operator+(const QSizeF & s1, const QSizeF & s2) Q_DECL_NOTHROW
+Q_DECL_CONSTEXPR inline const QSizeF operator+(const QSizeF & s1, const QSizeF & s2) noexcept
{ return QSizeF(s1.wd+s2.wd, s1.ht+s2.ht); }
-Q_DECL_CONSTEXPR inline const QSizeF operator-(const QSizeF &s1, const QSizeF &s2) Q_DECL_NOTHROW
+Q_DECL_CONSTEXPR inline const QSizeF operator-(const QSizeF &s1, const QSizeF &s2) noexcept
{ return QSizeF(s1.wd-s2.wd, s1.ht-s2.ht); }
-Q_DECL_CONSTEXPR inline const QSizeF operator*(const QSizeF &s, qreal c) Q_DECL_NOTHROW
+Q_DECL_CONSTEXPR inline const QSizeF operator*(const QSizeF &s, qreal c) noexcept
{ return QSizeF(s.wd*c, s.ht*c); }
-Q_DECL_CONSTEXPR inline const QSizeF operator*(qreal c, const QSizeF &s) Q_DECL_NOTHROW
+Q_DECL_CONSTEXPR inline const QSizeF operator*(qreal c, const QSizeF &s) noexcept
{ return QSizeF(s.wd*c, s.ht*c); }
inline QSizeF &QSizeF::operator/=(qreal c)
@@ -367,17 +378,17 @@ inline const QSizeF operator/(const QSizeF &s, qreal c)
return QSizeF(s.wd/c, s.ht/c);
}
-Q_DECL_CONSTEXPR inline QSizeF QSizeF::expandedTo(const QSizeF & otherSize) const Q_DECL_NOTHROW
+Q_DECL_CONSTEXPR inline QSizeF QSizeF::expandedTo(const QSizeF & otherSize) const noexcept
{
return QSizeF(qMax(wd,otherSize.wd), qMax(ht,otherSize.ht));
}
-Q_DECL_CONSTEXPR inline QSizeF QSizeF::boundedTo(const QSizeF & otherSize) const Q_DECL_NOTHROW
+Q_DECL_CONSTEXPR inline QSizeF QSizeF::boundedTo(const QSizeF & otherSize) const noexcept
{
return QSizeF(qMin(wd,otherSize.wd), qMin(ht,otherSize.ht));
}
-Q_DECL_CONSTEXPR inline QSize QSizeF::toSize() const Q_DECL_NOTHROW
+Q_DECL_CONSTEXPR inline QSize QSizeF::toSize() const noexcept
{
return QSize(qRound(wd), qRound(ht));
}
diff --git a/src/corelib/tools/qstack.h b/src/corelib/tools/qstack.h
index bf04935b50..e59212aa2a 100644
--- a/src/corelib/tools/qstack.h
+++ b/src/corelib/tools/qstack.h
@@ -50,7 +50,7 @@ class QStack : public QVector<T>
{
public:
// compiler-generated special member functions are fine!
- inline void swap(QStack<T> &other) Q_DECL_NOTHROW { QVector<T>::swap(other); } // prevent QVector<->QStack swaps
+ inline void swap(QStack<T> &other) noexcept { QVector<T>::swap(other); } // prevent QVector<->QStack swaps
inline void push(const T &t) { QVector<T>::append(t); }
T pop();
T &top();
diff --git a/src/corelib/tools/qstring.cpp b/src/corelib/tools/qstring.cpp
deleted file mode 100644
index b25685923c..0000000000
--- a/src/corelib/tools/qstring.cpp
+++ /dev/null
@@ -1,12295 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Copyright (C) 2018 Intel Corporation.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#include "qstringlist.h"
-#include "qregexp.h"
-#if QT_CONFIG(regularexpression)
-#include "qregularexpression.h"
-#endif
-#include "qunicodetables_p.h"
-#if QT_CONFIG(textcodec)
-#include <qtextcodec.h>
-#endif
-#include <private/qutfcodec_p.h>
-#include <private/qlocale_tools_p.h>
-#include "qsimd_p.h"
-#include <qnumeric.h>
-#include <qdatastream.h>
-#include <qlist.h>
-#include "qlocale.h"
-#include "qlocale_p.h"
-#include "qstringbuilder.h"
-#include "qstringmatcher.h"
-#include "qvarlengtharray.h"
-#include "qtools_p.h"
-#include "qdebug.h"
-#include "qendian.h"
-#include "qcollator.h"
-
-#ifdef Q_OS_MAC
-#include <private/qcore_mac_p.h>
-#endif
-
-#include <private/qfunctions_p.h>
-
-#include <limits.h>
-#include <string.h>
-#include <stdlib.h>
-#include <stdio.h>
-#include <stdarg.h>
-#include <wchar.h>
-
-#include "qchar.cpp"
-#include "qstringmatcher.cpp"
-#include "qstringiterator_p.h"
-#include "qstringalgorithms_p.h"
-#include "qthreadstorage.h"
-
-#ifdef Q_OS_WIN
-# include <qt_windows.h>
-#endif
-
-#ifdef truncate
-# undef truncate
-#endif
-
-#ifndef LLONG_MAX
-#define LLONG_MAX qint64_C(9223372036854775807)
-#endif
-#ifndef LLONG_MIN
-#define LLONG_MIN (-LLONG_MAX - qint64_C(1))
-#endif
-#ifndef ULLONG_MAX
-#define ULLONG_MAX quint64_C(18446744073709551615)
-#endif
-
-#define IS_RAW_DATA(d) ((d)->offset != sizeof(QStringData))
-
-QT_BEGIN_NAMESPACE
-
-/*
- * Note on the use of SIMD in qstring.cpp:
- *
- * Several operations with strings are improved with the use of SIMD code,
- * since they are repetitive. For MIPS, we have hand-written assembly code
- * outside of qstring.cpp targeting MIPS DSP and MIPS DSPr2. For ARM and for
- * x86, we can only use intrinsics and therefore everything is contained in
- * qstring.cpp. We need to use intrinsics only for those platforms due to the
- * different compilers and toolchains used, which have different syntax for
- * assembly sources.
- *
- * ** SSE notes: **
- *
- * Whenever multiple alternatives are equivalent or near so, we prefer the one
- * using instructions from SSE2, since SSE2 is guaranteed to be enabled for all
- * 64-bit builds and we enable it for 32-bit builds by default. Use of higher
- * SSE versions should be done when there is a clear performance benefit and
- * requires fallback code to SSE2, if it exists.
- *
- * Performance measurement in the past shows that most strings are short in
- * size and, therefore, do not benefit from alignment prologues. That is,
- * trying to find a 16-byte-aligned boundary to operate on is often more
- * expensive than executing the unaligned operation directly. In addition, note
- * that the QString private data is designed so that the data is stored on
- * 16-byte boundaries if the system malloc() returns 16-byte aligned pointers
- * on its own (64-bit glibc on Linux does; 32-bit glibc on Linux returns them
- * 50% of the time), so skipping the alignment prologue is actually optimizing
- * for the common case.
- */
-
-#if defined(__mips_dsp)
-// From qstring_mips_dsp_asm.S
-extern "C" void qt_fromlatin1_mips_asm_unroll4 (ushort*, const char*, uint);
-extern "C" void qt_fromlatin1_mips_asm_unroll8 (ushort*, const char*, uint);
-extern "C" void qt_toLatin1_mips_dsp_asm(uchar *dst, const ushort *src, int length);
-#endif
-
-// internal
-int qFindString(const QChar *haystack, int haystackLen, int from,
- const QChar *needle, int needleLen, Qt::CaseSensitivity cs);
-int qFindStringBoyerMoore(const QChar *haystack, int haystackLen, int from,
- const QChar *needle, int needleLen, Qt::CaseSensitivity cs);
-static inline int qt_last_index_of(const QChar *haystack, int haystackLen, QChar needle,
- int from, Qt::CaseSensitivity cs);
-static inline int qt_string_count(const QChar *haystack, int haystackLen,
- const QChar *needle, int needleLen,
- Qt::CaseSensitivity cs);
-static inline int qt_string_count(const QChar *haystack, int haystackLen,
- QChar needle, Qt::CaseSensitivity cs);
-static inline int qt_find_latin1_string(const QChar *hay, int size, QLatin1String needle,
- int from, Qt::CaseSensitivity cs);
-static inline bool qt_starts_with(QStringView haystack, QStringView needle, Qt::CaseSensitivity cs);
-static inline bool qt_starts_with(QStringView haystack, QLatin1String needle, Qt::CaseSensitivity cs);
-static inline bool qt_starts_with(QStringView haystack, QChar needle, Qt::CaseSensitivity cs);
-static inline bool qt_ends_with(QStringView haystack, QStringView needle, Qt::CaseSensitivity cs);
-static inline bool qt_ends_with(QStringView haystack, QLatin1String needle, Qt::CaseSensitivity cs);
-static inline bool qt_ends_with(QStringView haystack, QChar needle, Qt::CaseSensitivity cs);
-
-qsizetype QtPrivate::qustrlen(const ushort *str) Q_DECL_NOTHROW
-{
- qsizetype result = 0;
-
-#ifdef __SSE2__
- // find the 16-byte alignment immediately prior or equal to str
- quintptr misalignment = quintptr(str) & 0xf;
- Q_ASSERT((misalignment & 1) == 0);
- const ushort *ptr = str - (misalignment / 2);
-
- // load 16 bytes and see if we have a null
- // (aligned loads can never segfault)
- const __m128i zeroes = _mm_setzero_si128();
- __m128i data = _mm_load_si128(reinterpret_cast<const __m128i *>(ptr));
- __m128i comparison = _mm_cmpeq_epi16(data, zeroes);
- quint32 mask = _mm_movemask_epi8(comparison);
-
- // ignore the result prior to the beginning of str
- mask >>= misalignment;
-
- // Have we found something in the first block? Need to handle it now
- // because of the left shift above.
- if (mask)
- return qCountTrailingZeroBits(quint32(mask)) / 2;
-
- do {
- ptr += 8;
- data = _mm_load_si128(reinterpret_cast<const __m128i *>(ptr));
-
- comparison = _mm_cmpeq_epi16(data, zeroes);
- mask = _mm_movemask_epi8(comparison);
- } while (mask == 0);
-
- // found a null
- uint idx = qCountTrailingZeroBits(quint32(mask));
- return ptr - str + idx / 2;
-#endif
-
- if (sizeof(wchar_t) == sizeof(ushort))
- return wcslen(reinterpret_cast<const wchar_t *>(str));
-
- while (*str++)
- ++result;
- return result;
-}
-
-#if defined(Q_COMPILER_LAMBDA) && !defined(__OPTIMIZE_SIZE__)
-namespace {
-template <uint MaxCount> struct UnrollTailLoop
-{
- template <typename RetType, typename Functor1, typename Functor2, typename Number>
- static inline RetType exec(Number count, RetType returnIfExited, Functor1 loopCheck, Functor2 returnIfFailed, Number i = 0)
- {
- /* equivalent to:
- * while (count--) {
- * if (loopCheck(i))
- * return returnIfFailed(i);
- * }
- * return returnIfExited;
- */
-
- if (!count)
- return returnIfExited;
-
- bool check = loopCheck(i);
- if (check)
- return returnIfFailed(i);
-
- return UnrollTailLoop<MaxCount - 1>::exec(count - 1, returnIfExited, loopCheck, returnIfFailed, i + 1);
- }
-
- template <typename Functor, typename Number>
- static inline void exec(Number count, Functor code)
- {
- /* equivalent to:
- * for (Number i = 0; i < count; ++i)
- * code(i);
- */
- exec(count, 0, [=](Number i) -> bool { code(i); return false; }, [](Number) { return 0; });
- }
-};
-template <> template <typename RetType, typename Functor1, typename Functor2, typename Number>
-inline RetType UnrollTailLoop<0>::exec(Number, RetType returnIfExited, Functor1, Functor2, Number)
-{
- return returnIfExited;
-}
-}
-#endif
-
-/*!
- * \internal
- *
- * Searches for character \a c in the string \a str and returns a pointer to
- * it. Unlike strchr() and wcschr() (but like glibc's strchrnul()), if the
- * character is not found, this function returns a pointer to the end of the
- * string -- that is, \c{str.end()}.
- */
-const ushort *QtPrivate::qustrchr(QStringView str, ushort c) noexcept
-{
- const ushort *n = reinterpret_cast<const ushort *>(str.begin());
- const ushort *e = reinterpret_cast<const ushort *>(str.end());
-
-#ifdef __SSE2__
- bool loops = true;
- // Using the PMOVMSKB instruction, we get two bits for each character
- // we compare.
-# if defined(__AVX2__) && !defined(__OPTIMIZE_SIZE__)
- // we're going to read n[0..15] (32 bytes)
- __m256i mch256 = _mm256_set1_epi32(c | (c << 16));
- for (const ushort *next = n + 16; next <= e; n = next, next += 16) {
- __m256i data = _mm256_loadu_si256(reinterpret_cast<const __m256i *>(n));
- __m256i result = _mm256_cmpeq_epi16(data, mch256);
- uint mask = uint(_mm256_movemask_epi8(result));
- if (mask) {
- uint idx = qCountTrailingZeroBits(mask);
- return n + idx / 2;
- }
- }
- loops = false;
- __m128i mch = _mm256_castsi256_si128(mch256);
-# else
- __m128i mch = _mm_set1_epi32(c | (c << 16));
-# endif
-
- auto hasMatch = [mch, &n](__m128i data, ushort validityMask) {
- __m128i result = _mm_cmpeq_epi16(data, mch);
- uint mask = uint(_mm_movemask_epi8(result));
- if ((mask & validityMask) == 0)
- return false;
- uint idx = qCountTrailingZeroBits(mask);
- n += idx / 2;
- return true;
- };
-
- // we're going to read n[0..7] (16 bytes)
- for (const ushort *next = n + 8; next <= e; n = next, next += 8) {
- __m128i data = _mm_loadu_si128(reinterpret_cast<const __m128i *>(n));
- if (hasMatch(data, 0xffff))
- return n;
-
- if (!loops) {
- n += 8;
- break;
- }
- }
-
-# if !defined(__OPTIMIZE_SIZE__)
- // we're going to read n[0..3] (8 bytes)
- if (e - n > 3) {
- __m128i data = _mm_loadl_epi64(reinterpret_cast<const __m128i *>(n));
- if (hasMatch(data, 0xff))
- return n;
-
- n += 4;
- }
-
- return UnrollTailLoop<3>::exec(e - n, e,
- [=](int i) { return n[i] == c; },
- [=](int i) { return n + i; });
-# endif
-#elif defined(__ARM_NEON__) && defined(Q_PROCESSOR_ARM_64) // vaddv is only available on Aarch64
- const uint16x8_t vmask = { 1, 1 << 1, 1 << 2, 1 << 3, 1 << 4, 1 << 5, 1 << 6, 1 << 7 };
- const uint16x8_t ch_vec = vdupq_n_u16(c);
- for (const ushort *next = n + 8; next <= e; n = next, next += 8) {
- uint16x8_t data = vld1q_u16(n);
- uint mask = vaddvq_u16(vandq_u16(vceqq_u16(data, ch_vec), vmask));
- if (ushort(mask)) {
- // found a match
- return n + qCountTrailingZeroBits(mask);
- }
- }
-#endif // aarch64
-
- --n;
- while (++n != e)
- if (*n == c)
- return n;
-
- return n;
-}
-
-#ifdef __SSE2__
-// Scans from \a ptr to \a end until \a maskval is non-zero. Returns true if
-// the no non-zero was found. Returns false and updates \a ptr to point to the
-// first 16-bit word that has any bit set (note: if the input is 8-bit, \a ptr
-// may be updated to one byte short).
-static bool simdTestMask(const char *&ptr, const char *end, quint32 maskval)
-{
- auto updatePtr = [&](uint result) {
- // found a character matching the mask
- uint idx = qCountTrailingZeroBits(~result);
- ptr += idx;
- return false;
- };
-
-# if defined(__SSE4_1__)
- __m128i mask;
- auto updatePtrSimd = [&](__m128i data) {
- __m128i masked = _mm_and_si128(mask, data);
- __m128i comparison = _mm_cmpeq_epi16(masked, _mm_setzero_si128());
- uint result = _mm_movemask_epi8(comparison);
- return updatePtr(result);
- };
-
-# if defined(__AVX2__)
- // AVX2 implementation: test 32 bytes at a time
- const __m256i mask256 = _mm256_broadcastd_epi32(_mm_cvtsi32_si128(maskval));
- while (ptr + 32 <= end) {
- __m256i data = _mm256_loadu_si256(reinterpret_cast<const __m256i *>(ptr));
- if (!_mm256_testz_si256(mask256, data)) {
- // found a character matching the mask
- __m256i masked256 = _mm256_and_si256(mask256, data);
- __m256i comparison256 = _mm256_cmpeq_epi16(masked256, _mm256_setzero_si256());
- return updatePtr(_mm256_movemask_epi8(comparison256));
- }
- ptr += 32;
- }
-
- mask = _mm256_castsi256_si128(mask256);
-# else
- // SSE 4.1 implementation: test 32 bytes at a time (two 16-byte
- // comparisons, unrolled)
- mask = _mm_set1_epi32(maskval);
- while (ptr + 32 <= end) {
- __m128i data1 = _mm_loadu_si128(reinterpret_cast<const __m128i *>(ptr));
- __m128i data2 = _mm_loadu_si128(reinterpret_cast<const __m128i *>(ptr + 16));
- if (!_mm_testz_si128(mask, data1))
- return updatePtrSimd(data1);
-
- ptr += 16;
- if (!_mm_testz_si128(mask, data2))
- return updatePtrSimd(data2);
- ptr += 16;
- }
-# endif
-
- // AVX2 and SSE4.1: final 16-byte comparison
- if (ptr + 16 <= end) {
- __m128i data1 = _mm_loadu_si128(reinterpret_cast<const __m128i *>(ptr));
- if (!_mm_testz_si128(mask, data1))
- return updatePtrSimd(data1);
- ptr += 16;
- }
-
- // and final 8-byte comparison
- if (ptr + 8 <= end) {
- __m128i data1 = _mm_loadl_epi64(reinterpret_cast<const __m128i *>(ptr));
- if (!_mm_testz_si128(mask, data1))
- return updatePtrSimd(data1);
- ptr += 8;
- }
-
-# else
- // SSE2 implementation: test 16 bytes at a time.
- const __m128i mask = _mm_set1_epi32(maskval);
- while (ptr + 16 <= end) {
- __m128i data = _mm_loadu_si128(reinterpret_cast<const __m128i *>(ptr));
- __m128i masked = _mm_and_si128(mask, data);
- __m128i comparison = _mm_cmpeq_epi16(masked, _mm_setzero_si128());
- quint16 result = _mm_movemask_epi8(comparison);
- if (result != 0xffff)
- return updatePtr(result);
- ptr += 16;
- }
-
- // and one 8-byte comparison
- if (ptr + 8 <= end) {
- __m128i data = _mm_loadl_epi64(reinterpret_cast<const __m128i *>(ptr));
- __m128i masked = _mm_and_si128(mask, data);
- __m128i comparison = _mm_cmpeq_epi16(masked, _mm_setzero_si128());
- quint8 result = _mm_movemask_epi8(comparison);
- if (result != 0xff)
- return updatePtr(result);
- ptr += 8;
- }
-# endif
-
- return true;
-}
-
-static Q_ALWAYS_INLINE __m128i mm_load8_zero_extend(const void *ptr)
-{
- const __m128i *dataptr = static_cast<const __m128i *>(ptr);
-#if defined(__SSE4_1__)
- // use a MOVQ followed by PMOVZXBW
- // if AVX2 is present, these should combine into a single VPMOVZXBW instruction
- __m128i data = _mm_loadl_epi64(dataptr);
- return _mm_cvtepu8_epi16(data);
-# else
- // use MOVQ followed by PUNPCKLBW
- __m128i data = _mm_loadl_epi64(dataptr);
- return _mm_unpacklo_epi8(data, _mm_setzero_si128());
-# endif
-}
-#endif
-
-// Note: ptr on output may be off by one and point to a preceding US-ASCII
-// character. Usually harmless.
-bool qt_is_ascii(const char *&ptr, const char *end) Q_DECL_NOTHROW
-{
-#if defined(__SSE2__)
- // Testing for the high bit can be done efficiently with just PMOVMSKB
-# if defined(__AVX2__)
- while (ptr + 32 <= end) {
- __m256i data = _mm256_loadu_si256(reinterpret_cast<const __m256i *>(ptr));
- quint32 mask = _mm256_movemask_epi8(data);
- if (mask) {
- uint idx = qCountTrailingZeroBits(mask);
- ptr += idx;
- return false;
- }
- ptr += 32;
- }
-# endif
- while (ptr + 16 <= end) {
- __m128i data = _mm_loadu_si128(reinterpret_cast<const __m128i *>(ptr));
- quint32 mask = _mm_movemask_epi8(data);
- if (mask) {
- uint idx = qCountTrailingZeroBits(mask);
- ptr += idx;
- return false;
- }
- ptr += 16;
- }
- if (ptr + 8 <= end) {
- __m128i data = _mm_loadl_epi64(reinterpret_cast<const __m128i *>(ptr));
- quint8 mask = _mm_movemask_epi8(data);
- if (mask) {
- uint idx = qCountTrailingZeroBits(mask);
- ptr += idx;
- return false;
- }
- ptr += 8;
- }
-#endif
-
- while (ptr + 4 <= end) {
- quint32 data = qFromUnaligned<quint32>(ptr);
- if (data &= 0x80808080U) {
-#if Q_BYTE_ORDER == Q_BIG_ENDIAN
- uint idx = qCountLeadingZeroBits(data);
-#else
- uint idx = qCountTrailingZeroBits(data);
-#endif
- ptr += idx / 8;
- return false;
- }
- ptr += 4;
- }
-
- while (ptr != end) {
- if (quint8(*ptr) & 0x80)
- return false;
- ++ptr;
- }
- return true;
-}
-
-bool QtPrivate::isAscii(QLatin1String s) Q_DECL_NOTHROW
-{
- const char *ptr = s.begin();
- const char *end = s.end();
-
- return qt_is_ascii(ptr, end);
-}
-
-static bool isAscii(const QChar *&ptr, const QChar *end)
-{
-#ifdef __SSE2__
- const char *ptr8 = reinterpret_cast<const char *>(ptr);
- const char *end8 = reinterpret_cast<const char *>(end);
- bool ok = simdTestMask(ptr8, end8, 0xff80ff80);
- ptr = reinterpret_cast<const QChar *>(ptr8);
- if (!ok)
- return false;
-#endif
-
- while (ptr != end) {
- if (ptr->unicode() & 0xff80)
- return false;
- ++ptr;
- }
- return true;
-}
-
-bool QtPrivate::isAscii(QStringView s) Q_DECL_NOTHROW
-{
- const QChar *ptr = s.begin();
- const QChar *end = s.end();
-
- return isAscii(ptr, end);
-}
-
-bool QtPrivate::isLatin1(QStringView s) Q_DECL_NOTHROW
-{
- const QChar *ptr = s.begin();
- const QChar *end = s.end();
-
-#if defined(__SSE4_1__)
- const char *ptr8 = reinterpret_cast<const char *>(ptr);
- const char *end8 = reinterpret_cast<const char *>(end);
- if (!simdTestMask(ptr8, end8, 0xff00ff00))
- return false;
- ptr = reinterpret_cast<const QChar *>(ptr8);
-#elif defined(__SSE2__)
- // Testing if every other byte is non-zero can be done efficiently by
- // using PUNPCKHBW (unpack high order bytes) and comparing that to zero.
- while (ptr + 32 < end) {
- __m128i data1 = _mm_loadu_si128(reinterpret_cast<const __m128i *>(ptr));
- __m128i data2 = _mm_loadu_si128(reinterpret_cast<const __m128i *>(ptr + 16));
- __m128i high = _mm_unpackhi_epi8(data1, data2);
- __m128i comparison = _mm_cmpeq_epi16(high, _mm_setzero_si128());
- if (_mm_movemask_epi8(comparison))
- return false;
- ptr += 16;
- }
- if (ptr + 16 < end) {
- __m128i data1 = _mm_loadu_si128(reinterpret_cast<const __m128i *>(ptr));
- __m128i high = _mm_unpackhi_epi8(data1, data1);
- __m128i comparison = _mm_cmpeq_epi16(high, _mm_setzero_si128());
- if (_mm_movemask_epi8(comparison))
- return false;
- }
-#endif
-
- while (ptr != end) {
- if ((*ptr++).unicode() > 0xff)
- return false;
- }
- return true;
-}
-
-// conversion between Latin 1 and UTF-16
-void qt_from_latin1(ushort *dst, const char *str, size_t size) Q_DECL_NOTHROW
-{
- /* SIMD:
- * Unpacking with SSE has been shown to improve performance on recent CPUs
- * The same method gives no improvement with NEON. On Aarch64, clang will do the vectorization
- * itself in exactly the same way as one would do it with intrinsics.
- */
-#if defined(__SSE2__)
- const char *e = str + size;
- qptrdiff offset = 0;
-
- // we're going to read str[offset..offset+15] (16 bytes)
- for ( ; str + offset + 15 < e; offset += 16) {
- const __m128i chunk = _mm_loadu_si128((const __m128i*)(str + offset)); // load
-#ifdef __AVX2__
- // zero extend to an YMM register
- const __m256i extended = _mm256_cvtepu8_epi16(chunk);
-
- // store
- _mm256_storeu_si256((__m256i*)(dst + offset), extended);
-#else
- const __m128i nullMask = _mm_set1_epi32(0);
-
- // unpack the first 8 bytes, padding with zeros
- const __m128i firstHalf = _mm_unpacklo_epi8(chunk, nullMask);
- _mm_storeu_si128((__m128i*)(dst + offset), firstHalf); // store
-
- // unpack the last 8 bytes, padding with zeros
- const __m128i secondHalf = _mm_unpackhi_epi8 (chunk, nullMask);
- _mm_storeu_si128((__m128i*)(dst + offset + 8), secondHalf); // store
-#endif
- }
-
- // we're going to read str[offset..offset+7] (8 bytes)
- if (str + offset + 7 < e) {
- const __m128i unpacked = mm_load8_zero_extend(str + offset);
- _mm_storeu_si128(reinterpret_cast<__m128i *>(dst + offset), unpacked);
- offset += 8;
- }
-
- size = size % 8;
- dst += offset;
- str += offset;
-# if defined(Q_COMPILER_LAMBDA) && !defined(__OPTIMIZE_SIZE__)
- return UnrollTailLoop<7>::exec(int(size), [=](int i) { dst[i] = (uchar)str[i]; });
-# endif
-#endif
-#if defined(__mips_dsp)
- if (size > 20)
- qt_fromlatin1_mips_asm_unroll8(dst, str, size);
- else
- qt_fromlatin1_mips_asm_unroll4(dst, str, size);
-#else
- while (size--)
- *dst++ = (uchar)*str++;
-#endif
-}
-
-template <bool Checked>
-static void qt_to_latin1_internal(uchar *dst, const ushort *src, qsizetype length)
-{
-#if defined(__SSE2__)
- uchar *e = dst + length;
- qptrdiff offset = 0;
-
-# ifdef __AVX2__
- const __m256i questionMark256 = _mm256_broadcastw_epi16(_mm_cvtsi32_si128('?'));
- const __m256i outOfRange256 = _mm256_broadcastw_epi16(_mm_cvtsi32_si128(0x100));
- const __m128i questionMark = _mm256_castsi256_si128(questionMark256);
- const __m128i outOfRange = _mm256_castsi256_si128(outOfRange256);
-# else
- const __m128i questionMark = _mm_set1_epi16('?');
- const __m128i outOfRange = _mm_set1_epi16(0x100);
-# endif
-
- auto mergeQuestionMarks = [=](__m128i chunk) {
- // SSE has no compare instruction for unsigned comparison.
-# ifdef __SSE4_1__
- // We use an unsigned uc = qMin(uc, 0x100) and then compare for equality.
- chunk = _mm_min_epu16(chunk, outOfRange);
- const __m128i offLimitMask = _mm_cmpeq_epi16(chunk, outOfRange);
- chunk = _mm_blendv_epi8(chunk, questionMark, offLimitMask);
-# else
- // The variables must be shiffted + 0x8000 to be compared
- const __m128i signedBitOffset = _mm_set1_epi16(short(0x8000));
- const __m128i thresholdMask = _mm_set1_epi16(short(0xff + 0x8000));
-
- const __m128i signedChunk = _mm_add_epi16(chunk, signedBitOffset);
- const __m128i offLimitMask = _mm_cmpgt_epi16(signedChunk, thresholdMask);
-
- // offLimitQuestionMark contains '?' for each 16 bits that was off-limit
- // the 16 bits that were correct contains zeros
- const __m128i offLimitQuestionMark = _mm_and_si128(offLimitMask, questionMark);
-
- // correctBytes contains the bytes that were in limit
- // the 16 bits that were off limits contains zeros
- const __m128i correctBytes = _mm_andnot_si128(offLimitMask, chunk);
-
- // merge offLimitQuestionMark and correctBytes to have the result
- chunk = _mm_or_si128(correctBytes, offLimitQuestionMark);
-
- Q_UNUSED(outOfRange);
-# endif
- return chunk;
- };
-
- // we're going to write to dst[offset..offset+15] (16 bytes)
- for ( ; dst + offset + 15 < e; offset += 16) {
-# if defined(__AVX2__)
- __m256i chunk = _mm256_loadu_si256(reinterpret_cast<const __m256i *>(src + offset));
- if (Checked) {
- // See mergeQuestionMarks lambda above for details
- chunk = _mm256_min_epu16(chunk, outOfRange256);
- const __m256i offLimitMask = _mm256_cmpeq_epi16(chunk, outOfRange256);
- chunk = _mm256_blendv_epi8(chunk, questionMark256, offLimitMask);
- }
-
- const __m128i chunk2 = _mm256_extracti128_si256(chunk, 1);
- const __m128i chunk1 = _mm256_castsi256_si128(chunk);
-# else
- __m128i chunk1 = _mm_loadu_si128((const __m128i*)(src + offset)); // load
- if (Checked)
- chunk1 = mergeQuestionMarks(chunk1);
-
- __m128i chunk2 = _mm_loadu_si128((const __m128i*)(src + offset + 8)); // load
- if (Checked)
- chunk2 = mergeQuestionMarks(chunk2);
-# endif
-
- // pack the two vector to 16 x 8bits elements
- const __m128i result = _mm_packus_epi16(chunk1, chunk2);
- _mm_storeu_si128((__m128i*)(dst + offset), result); // store
- }
-
-# if !defined(__OPTIMIZE_SIZE__)
- // we're going to write to dst[offset..offset+7] (8 bytes)
- if (dst + offset + 7 < e) {
- __m128i chunk = _mm_loadu_si128(reinterpret_cast<const __m128i *>(src + offset));
- if (Checked)
- chunk = mergeQuestionMarks(chunk);
-
- // pack, where the upper half is ignored
- const __m128i result = _mm_packus_epi16(chunk, chunk);
- _mm_storel_epi64(reinterpret_cast<__m128i *>(dst + offset), result);
- offset += 8;
- }
-
- // we're going to write to dst[offset..offset+3] (4 bytes)
- if (dst + offset + 3 < e) {
- __m128i chunk = _mm_loadl_epi64(reinterpret_cast<const __m128i *>(src + offset));
- if (Checked)
- chunk = mergeQuestionMarks(chunk);
-
- // pack, we'll the upper three quarters
- const __m128i result = _mm_packus_epi16(chunk, chunk);
- qToUnaligned(_mm_cvtsi128_si32(result), dst + offset);
- offset += 4;
- }
-
- length = length % 4;
-# else
- length = length % 16;
-# endif // optimize size
-
- // advance dst, src for tail processing
- dst += offset;
- src += offset;
-
-# if !defined(__OPTIMIZE_SIZE__)
- return UnrollTailLoop<3>::exec(length, [=](int i) {
- if (Checked)
- dst[i] = (src[i]>0xff) ? '?' : (uchar) src[i];
- else
- dst[i] = src[i];
- });
-# endif
-#elif defined(__ARM_NEON__)
- // Refer to the documentation of the SSE2 implementation
- // this use eactly the same method as for SSE except:
- // 1) neon has unsigned comparison
- // 2) packing is done to 64 bits (8 x 8bits component).
- if (length >= 16) {
- const int chunkCount = length >> 3; // divided by 8
- const uint16x8_t questionMark = vdupq_n_u16('?'); // set
- const uint16x8_t thresholdMask = vdupq_n_u16(0xff); // set
- for (int i = 0; i < chunkCount; ++i) {
- uint16x8_t chunk = vld1q_u16((uint16_t *)src); // load
- src += 8;
-
- if (Checked) {
- const uint16x8_t offLimitMask = vcgtq_u16(chunk, thresholdMask); // chunk > thresholdMask
- const uint16x8_t offLimitQuestionMark = vandq_u16(offLimitMask, questionMark); // offLimitMask & questionMark
- const uint16x8_t correctBytes = vbicq_u16(chunk, offLimitMask); // !offLimitMask & chunk
- chunk = vorrq_u16(correctBytes, offLimitQuestionMark); // correctBytes | offLimitQuestionMark
- }
- const uint8x8_t result = vmovn_u16(chunk); // narrowing move->packing
- vst1_u8(dst, result); // store
- dst += 8;
- }
- length = length % 8;
- }
-#endif
-#if defined(__mips_dsp)
- qt_toLatin1_mips_dsp_asm(dst, src, length);
-#else
- while (length--) {
- if (Checked)
- *dst++ = (*src>0xff) ? '?' : (uchar) *src;
- else
- *dst++ = *src;
- ++src;
- }
-#endif
-}
-
-static void qt_to_latin1(uchar *dst, const ushort *src, qsizetype length)
-{
- qt_to_latin1_internal<true>(dst, src, length);
-}
-
-void qt_to_latin1_unchecked(uchar *dst, const ushort *src, qsizetype length)
-{
- qt_to_latin1_internal<false>(dst, src, length);
-}
-
-// Unicode case-insensitive comparison
-static int ucstricmp(const QChar *a, const QChar *ae, const QChar *b, const QChar *be)
-{
- if (a == b)
- return (ae - be);
-
- const QChar *e = ae;
- if (be - b < ae - a)
- e = a + (be - b);
-
- uint alast = 0;
- uint blast = 0;
- while (a < e) {
-// qDebug() << hex << alast << blast;
-// qDebug() << hex << "*a=" << *a << "alast=" << alast << "folded=" << foldCase (*a, alast);
-// qDebug() << hex << "*b=" << *b << "blast=" << blast << "folded=" << foldCase (*b, blast);
- int diff = foldCase(a->unicode(), alast) - foldCase(b->unicode(), blast);
- if ((diff))
- return diff;
- ++a;
- ++b;
- }
- if (a == ae) {
- if (b == be)
- return 0;
- return -1;
- }
- return 1;
-}
-
-// Case-insensitive comparison between a Unicode string and a QLatin1String
-static int ucstricmp(const QChar *a, const QChar *ae, const char *b, const char *be)
-{
- auto e = ae;
- if (be - b < ae - a)
- e = a + (be - b);
-
- while (a < e) {
- int diff = foldCase(a->unicode()) - foldCase(uchar(*b));
- if ((diff))
- return diff;
- ++a;
- ++b;
- }
- if (a == ae) {
- if (b == be)
- return 0;
- return -1;
- }
- return 1;
-}
-
-#if defined(__mips_dsp)
-// From qstring_mips_dsp_asm.S
-extern "C" int qt_ucstrncmp_mips_dsp_asm(const ushort *a,
- const ushort *b,
- unsigned len);
-#endif
-
-// Unicode case-sensitive compare two same-sized strings
-static int ucstrncmp(const QChar *a, const QChar *b, size_t l)
-{
-#ifdef __OPTIMIZE_SIZE__
- const QChar *end = a + l;
- while (a < end) {
- if (int diff = (int)a->unicode() - (int)b->unicode())
- return diff;
- ++a;
- ++b;
- }
- return 0;
-#else
-#if defined(__mips_dsp)
- Q_STATIC_ASSERT(sizeof(uint) == sizeof(size_t));
- if (l >= 8) {
- return qt_ucstrncmp_mips_dsp_asm(reinterpret_cast<const ushort*>(a),
- reinterpret_cast<const ushort*>(b),
- l);
- }
-#endif // __mips_dsp
-#ifdef __SSE2__
- const QChar *end = a + l;
- qptrdiff offset = 0;
-
- // Using the PMOVMSKB instruction, we get two bits for each character
- // we compare.
- int retval;
- auto isDifferent = [a, b, &offset, &retval](__m128i a_data, __m128i b_data) {
- __m128i result = _mm_cmpeq_epi16(a_data, b_data);
- uint mask = ~uint(_mm_movemask_epi8(result));
- if (ushort(mask) == 0)
- return false;
- uint idx = qCountTrailingZeroBits(mask);
- retval = a[offset + idx / 2].unicode() - b[offset + idx / 2].unicode();
- return true;
- };
-
- // we're going to read a[0..15] and b[0..15] (32 bytes)
- for ( ; a + offset + 16 <= end; offset += 16) {
-#ifdef __AVX2__
- __m256i a_data = _mm256_loadu_si256(reinterpret_cast<const __m256i *>(a + offset));
- __m256i b_data = _mm256_loadu_si256(reinterpret_cast<const __m256i *>(b + offset));
- __m256i result = _mm256_cmpeq_epi16(a_data, b_data);
- uint mask = _mm256_movemask_epi8(result);
-#else
- __m128i a_data1 = _mm_loadu_si128(reinterpret_cast<const __m128i *>(a + offset));
- __m128i a_data2 = _mm_loadu_si128(reinterpret_cast<const __m128i *>(a + offset + 8));
- __m128i b_data1 = _mm_loadu_si128(reinterpret_cast<const __m128i *>(b + offset));
- __m128i b_data2 = _mm_loadu_si128(reinterpret_cast<const __m128i *>(b + offset + 8));
- __m128i result1 = _mm_cmpeq_epi16(a_data1, b_data1);
- __m128i result2 = _mm_cmpeq_epi16(a_data2, b_data2);
- uint mask = _mm_movemask_epi8(result1) | (_mm_movemask_epi8(result2) << 16);
-#endif
- mask = ~mask;
- if (mask) {
- // found a different character
- uint idx = qCountTrailingZeroBits(mask);
- return a[offset + idx / 2].unicode() - b[offset + idx / 2].unicode();
- }
- }
-
- // we're going to read a[0..7] and b[0..7] (16 bytes)
- if (a + offset + 8 <= end) {
- __m128i a_data = _mm_loadu_si128(reinterpret_cast<const __m128i *>(a + offset));
- __m128i b_data = _mm_loadu_si128(reinterpret_cast<const __m128i *>(b + offset));
- if (isDifferent(a_data, b_data))
- return retval;
-
- offset += 8;
- }
-
- // we're going to read a[0..3] and b[0..3] (8 bytes)
- if (a + offset + 4 <= end) {
- __m128i a_data = _mm_loadl_epi64(reinterpret_cast<const __m128i *>(a + offset));
- __m128i b_data = _mm_loadl_epi64(reinterpret_cast<const __m128i *>(b + offset));
- if (isDifferent(a_data, b_data))
- return retval;
-
- offset += 4;
- }
-
- // reset l
- l &= 3;
-
- const auto lambda = [=](size_t i) -> int {
- return a[offset + i].unicode() - b[offset + i].unicode();
- };
- return UnrollTailLoop<3>::exec(l, 0, lambda, lambda);
-#endif
-#if defined(__ARM_NEON__) && defined(Q_PROCESSOR_ARM_64) // vaddv is only available on Aarch64
- if (l >= 8) {
- const QChar *end = a + l;
- const uint16x8_t mask = { 1, 1 << 1, 1 << 2, 1 << 3, 1 << 4, 1 << 5, 1 << 6, 1 << 7 };
- while (a + 7 < end) {
- uint16x8_t da = vld1q_u16(reinterpret_cast<const uint16_t *>(a));
- uint16x8_t db = vld1q_u16(reinterpret_cast<const uint16_t *>(b));
-
- uint8_t r = ~(uint8_t)vaddvq_u16(vandq_u16(vceqq_u16(da, db), mask));
- if (r) {
- // found a different QChar
- uint idx = qCountTrailingZeroBits(r);
- return (int)a[idx].unicode() - (int)b[idx].unicode();
- }
- a += 8;
- b += 8;
- }
- l &= 7;
- }
- const auto lambda = [=](size_t i) -> int {
- return a[i].unicode() - b[i].unicode();
- };
- return UnrollTailLoop<7>::exec(l, 0, lambda, lambda);
-#endif // __ARM_NEON__
- if (!l)
- return 0;
-
- // check alignment
- if ((reinterpret_cast<quintptr>(a) & 2) == (reinterpret_cast<quintptr>(b) & 2)) {
- // both addresses have the same alignment
- if (reinterpret_cast<quintptr>(a) & 2) {
- // both addresses are not aligned to 4-bytes boundaries
- // compare the first character
- if (*a != *b)
- return a->unicode() - b->unicode();
- --l;
- ++a;
- ++b;
-
- // now both addresses are 4-bytes aligned
- }
-
- // both addresses are 4-bytes aligned
- // do a fast 32-bit comparison
- const quint32 *da = reinterpret_cast<const quint32 *>(a);
- const quint32 *db = reinterpret_cast<const quint32 *>(b);
- const quint32 *e = da + (l >> 1);
- for ( ; da != e; ++da, ++db) {
- if (*da != *db) {
- a = reinterpret_cast<const QChar *>(da);
- b = reinterpret_cast<const QChar *>(db);
- if (*a != *b)
- return a->unicode() - b->unicode();
- return a[1].unicode() - b[1].unicode();
- }
- }
-
- // do we have a tail?
- a = reinterpret_cast<const QChar *>(da);
- b = reinterpret_cast<const QChar *>(db);
- return (l & 1) ? a->unicode() - b->unicode() : 0;
- } else {
- // one of the addresses isn't 4-byte aligned but the other is
- const QChar *e = a + l;
- for ( ; a != e; ++a, ++b) {
- if (*a != *b)
- return a->unicode() - b->unicode();
- }
- }
- return 0;
-#endif
-}
-
-static int ucstrncmp(const QChar *a, const uchar *c, size_t l)
-{
- const ushort *uc = reinterpret_cast<const ushort *>(a);
- const ushort *e = uc + l;
-
-#ifdef __SSE2__
- __m128i nullmask = _mm_setzero_si128();
- qptrdiff offset = 0;
-
-# if !defined(__OPTIMIZE_SIZE__)
- // Using the PMOVMSKB instruction, we get two bits for each character
- // we compare.
- int retval;
- auto isDifferent = [uc, c, &offset, &retval](__m128i a_data, __m128i b_data) {
- __m128i result = _mm_cmpeq_epi16(a_data, b_data);
- uint mask = ~uint(_mm_movemask_epi8(result));
- if (ushort(mask) == 0)
- return false;
- uint idx = qCountTrailingZeroBits(mask);
- retval = uc[offset + idx / 2] - c[offset + idx / 2];
- return true;
- };
-# endif
-
- // we're going to read uc[offset..offset+15] (32 bytes)
- // and c[offset..offset+15] (16 bytes)
- for ( ; uc + offset + 15 < e; offset += 16) {
- // similar to fromLatin1_helper:
- // load 16 bytes of Latin 1 data
- __m128i chunk = _mm_loadu_si128((const __m128i*)(c + offset));
-
-# ifdef __AVX2__
- // expand Latin 1 data via zero extension
- __m256i ldata = _mm256_cvtepu8_epi16(chunk);
-
- // load UTF-16 data and compare
- __m256i ucdata = _mm256_loadu_si256((const __m256i*)(uc + offset));
- __m256i result = _mm256_cmpeq_epi16(ldata, ucdata);
-
- uint mask = ~_mm256_movemask_epi8(result);
-# else
- // expand via unpacking
- __m128i firstHalf = _mm_unpacklo_epi8(chunk, nullmask);
- __m128i secondHalf = _mm_unpackhi_epi8(chunk, nullmask);
-
- // load UTF-16 data and compare
- __m128i ucdata1 = _mm_loadu_si128((const __m128i*)(uc + offset));
- __m128i ucdata2 = _mm_loadu_si128((const __m128i*)(uc + offset + 8));
- __m128i result1 = _mm_cmpeq_epi16(firstHalf, ucdata1);
- __m128i result2 = _mm_cmpeq_epi16(secondHalf, ucdata2);
-
- uint mask = ~(_mm_movemask_epi8(result1) | _mm_movemask_epi8(result2) << 16);
-# endif
- if (mask) {
- // found a different character
- uint idx = qCountTrailingZeroBits(mask);
- return uc[offset + idx / 2] - c[offset + idx / 2];
- }
- }
-
-# if !defined(__OPTIMIZE_SIZE__)
- // we'll read uc[offset..offset+7] (16 bytes) and c[offset..offset+7] (8 bytes)
- if (uc + offset + 7 < e) {
- // same, but we're using an 8-byte load
- __m128i secondHalf = mm_load8_zero_extend(c + offset);
-
- __m128i ucdata = _mm_loadu_si128((const __m128i*)(uc + offset));
- if (isDifferent(ucdata, secondHalf))
- return retval;
-
- // still matched
- offset += 8;
- }
-
- enum { MaxTailLength = 3 };
- // we'll read uc[offset..offset+3] (8 bytes) and c[offset..offset+3] (4 bytes)
- if (uc + offset + 3 < e) {
- __m128i chunk = _mm_cvtsi32_si128(qFromUnaligned<int>(c + offset));
- __m128i secondHalf = _mm_unpacklo_epi8(chunk, nullmask);
-
- __m128i ucdata = _mm_loadl_epi64(reinterpret_cast<const __m128i *>(uc + offset));
- if (isDifferent(ucdata, secondHalf))
- return retval;
-
- // still matched
- offset += 4;
- }
-# endif // optimize size
-
- // reset uc and c
- uc += offset;
- c += offset;
-
-# if !defined(__OPTIMIZE_SIZE__)
- const auto lambda = [=](size_t i) { return uc[i] - ushort(c[i]); };
- return UnrollTailLoop<MaxTailLength>::exec(e - uc, 0, lambda, lambda);
-# endif
-#endif
-
- while (uc < e) {
- int diff = *uc - *c;
- if (diff)
- return diff;
- uc++, c++;
- }
-
- return 0;
-}
-
-template <typename Number>
-Q_DECL_CONSTEXPR int lencmp(Number lhs, Number rhs) Q_DECL_NOTHROW
-{
- return lhs == rhs ? 0 :
- lhs > rhs ? 1 :
- /* else */ -1 ;
-}
-
-// Unicode case-sensitive comparison
-static int ucstrcmp(const QChar *a, size_t alen, const QChar *b, size_t blen)
-{
- if (a == b && alen == blen)
- return 0;
- const size_t l = qMin(alen, blen);
- int cmp = ucstrncmp(a, b, l);
- return cmp ? cmp : lencmp(alen, blen);
-}
-
-static int ucstrcmp(const QChar *a, size_t alen, const char *b, size_t blen)
-{
- const size_t l = qMin(alen, blen);
- const int cmp = ucstrncmp(a, reinterpret_cast<const uchar*>(b), l);
- return cmp ? cmp : lencmp(alen, blen);
-}
-
-static int qt_compare_strings(QStringView lhs, QStringView rhs, Qt::CaseSensitivity cs) Q_DECL_NOTHROW
-{
- if (cs == Qt::CaseSensitive)
- return ucstrcmp(lhs.begin(), lhs.size(), rhs.begin(), rhs.size());
- else
- return ucstricmp(lhs.begin(), lhs.end(), rhs.begin(), rhs.end());
-}
-
-static int qt_compare_strings(QStringView lhs, QLatin1String rhs, Qt::CaseSensitivity cs) Q_DECL_NOTHROW
-{
- if (cs == Qt::CaseSensitive)
- return ucstrcmp(lhs.begin(), lhs.size(), rhs.begin(), rhs.size());
- else
- return ucstricmp(lhs.begin(), lhs.end(), rhs.begin(), rhs.end());
-}
-
-static int qt_compare_strings(QLatin1String lhs, QStringView rhs, Qt::CaseSensitivity cs) Q_DECL_NOTHROW
-{
- return -qt_compare_strings(rhs, lhs, cs);
-}
-
-static int qt_compare_strings(QLatin1String lhs, QLatin1String rhs, Qt::CaseSensitivity cs) Q_DECL_NOTHROW
-{
- if (lhs.isEmpty())
- return lencmp(0, rhs.size());
- if (cs == Qt::CaseInsensitive)
- return qstrnicmp(lhs.data(), lhs.size(), rhs.data(), rhs.size());
- const auto l = std::min(lhs.size(), rhs.size());
- int r = qstrncmp(lhs.data(), rhs.data(), l);
- return r ? r : lencmp(lhs.size(), rhs.size());
-}
-
-/*!
- \relates QStringView
- \internal
- \since 5.10
-
- Returns an integer that compares to 0 as \a lhs compares to \a rhs.
-
- If \a cs is Qt::CaseSensitive (the default), the comparison is case-sensitive;
- otherwise the comparison is case-insensitive.
-
- Case-sensitive comparison is based exclusively on the numeric Unicode values
- of the characters and is very fast, but is not what a human would expect.
- Consider sorting user-visible strings with QString::localeAwareCompare().
-*/
-int QtPrivate::compareStrings(QStringView lhs, QStringView rhs, Qt::CaseSensitivity cs) Q_DECL_NOTHROW
-{
- return qt_compare_strings(lhs, rhs, cs);
-}
-
-/*!
- \relates QStringView
- \internal
- \since 5.10
- \overload
-
- Returns an integer that compares to 0 as \a lhs compares to \a rhs.
-
- If \a cs is Qt::CaseSensitive (the default), the comparison is case-sensitive;
- otherwise the comparison is case-insensitive.
-
- Case-sensitive comparison is based exclusively on the numeric Unicode values
- of the characters and is very fast, but is not what a human would expect.
- Consider sorting user-visible strings with QString::localeAwareCompare().
-*/
-int QtPrivate::compareStrings(QStringView lhs, QLatin1String rhs, Qt::CaseSensitivity cs) Q_DECL_NOTHROW
-{
- return qt_compare_strings(lhs, rhs, cs);
-}
-
-/*!
- \relates QStringView
- \internal
- \since 5.10
- \overload
-
- Returns an integer that compares to 0 as \a lhs compares to \a rhs.
-
- If \a cs is Qt::CaseSensitive (the default), the comparison is case-sensitive;
- otherwise the comparison is case-insensitive.
-
- Case-sensitive comparison is based exclusively on the numeric Unicode values
- of the characters and is very fast, but is not what a human would expect.
- Consider sorting user-visible strings with QString::localeAwareCompare().
-*/
-int QtPrivate::compareStrings(QLatin1String lhs, QStringView rhs, Qt::CaseSensitivity cs) Q_DECL_NOTHROW
-{
- return qt_compare_strings(lhs, rhs, cs);
-}
-
-/*!
- \relates QStringView
- \internal
- \since 5.10
- \overload
-
- Returns an integer that compares to 0 as \a lhs compares to \a rhs.
-
- If \a cs is Qt::CaseSensitive (the default), the comparison is case-sensitive;
- otherwise the comparison is case-insensitive.
-
- Case-sensitive comparison is based exclusively on the numeric Latin-1 values
- of the characters and is very fast, but is not what a human would expect.
- Consider sorting user-visible strings with QString::localeAwareCompare().
-*/
-int QtPrivate::compareStrings(QLatin1String lhs, QLatin1String rhs, Qt::CaseSensitivity cs) Q_DECL_NOTHROW
-{
- return qt_compare_strings(lhs, rhs, cs);
-}
-
-/*!
- \internal
-
- Returns the index position of the first occurrence of the
- character \a ch in the string given by \a str and \a len,
- searching forward from index
- position \a from. Returns -1 if \a ch could not be found.
-*/
-static int findChar(const QChar *str, int len, QChar ch, int from,
- Qt::CaseSensitivity cs)
-{
- const ushort *s = (const ushort *)str;
- ushort c = ch.unicode();
- if (from < 0)
- from = qMax(from + len, 0);
- if (from < len) {
- const ushort *n = s + from;
- const ushort *e = s + len;
- if (cs == Qt::CaseSensitive) {
- n = QtPrivate::qustrchr(QStringView(n, e), c);
- if (n != e)
- return n - s;
- } else {
- c = foldCase(c);
- --n;
- while (++n != e)
- if (foldCase(*n) == c)
- return n - s;
- }
- }
- return -1;
-}
-
-#define REHASH(a) \
- if (sl_minus_1 < sizeof(uint) * CHAR_BIT) \
- hashHaystack -= uint(a) << sl_minus_1; \
- hashHaystack <<= 1
-
-inline bool qIsUpper(char ch)
-{
- return ch >= 'A' && ch <= 'Z';
-}
-
-inline bool qIsDigit(char ch)
-{
- return ch >= '0' && ch <= '9';
-}
-
-inline char qToLower(char ch)
-{
- if (ch >= 'A' && ch <= 'Z')
- return ch - 'A' + 'a';
- else
- return ch;
-}
-
-
-#if QT_DEPRECATED_SINCE(5, 9)
-const QString::Null QString::null = { };
-#endif
-
-/*!
- \macro QT_RESTRICTED_CAST_FROM_ASCII
- \relates QString
-
- Defining this macro disables most automatic conversions from source
- literals and 8-bit data to unicode QStrings, but allows the use of
- the \c{QChar(char)} and \c{QString(const char (&ch)[N]} constructors,
- and the \c{QString::operator=(const char (&ch)[N])} assignment operator
- giving most of the type-safety benefits of \c QT_NO_CAST_FROM_ASCII
- but does not require user code to wrap character and string literals
- with QLatin1Char, QLatin1String or similar.
-
- Using this macro together with source strings outside the 7-bit range,
- non-literals, or literals with embedded NUL characters is undefined.
-
- \sa QT_NO_CAST_FROM_ASCII, QT_NO_CAST_TO_ASCII
-*/
-
-/*!
- \macro QT_NO_CAST_FROM_ASCII
- \relates QString
-
- Disables automatic conversions from 8-bit strings (char *) to unicode QStrings
-
- \sa QT_NO_CAST_TO_ASCII, QT_RESTRICTED_CAST_FROM_ASCII, QT_NO_CAST_FROM_BYTEARRAY
-*/
-
-/*!
- \macro QT_NO_CAST_TO_ASCII
- \relates QString
-
- disables automatic conversion from QString to 8-bit strings (char *)
-
- \sa QT_NO_CAST_FROM_ASCII, QT_RESTRICTED_CAST_FROM_ASCII, QT_NO_CAST_FROM_BYTEARRAY
-*/
-
-/*!
- \macro QT_ASCII_CAST_WARNINGS
- \internal
- \relates QString
-
- This macro can be defined to force a warning whenever a function is
- called that automatically converts between unicode and 8-bit encodings.
-
- Note: This only works for compilers that support warnings for
- deprecated API.
-
- \sa QT_NO_CAST_TO_ASCII, QT_NO_CAST_FROM_ASCII, QT_RESTRICTED_CAST_FROM_ASCII
-*/
-
-/*!
- \class QCharRef
- \inmodule QtCore
- \reentrant
- \brief The QCharRef class is a helper class for QString.
-
- \internal
-
- \ingroup string-processing
-
- When you get an object of type QCharRef, if you can assign to it,
- the assignment will apply to the character in the string from
- which you got the reference. That is its whole purpose in life.
- The QCharRef becomes invalid once modifications are made to the
- string: if you want to keep the character, copy it into a QChar.
-
- Most of the QChar member functions also exist in QCharRef.
- However, they are not explicitly documented here.
-
- \sa QString::operator[](), QString::at(), QChar
-*/
-
-/*!
- \class QString
- \inmodule QtCore
- \reentrant
-
- \brief The QString class provides a Unicode character string.
-
- \ingroup tools
- \ingroup shared
- \ingroup string-processing
-
- QString stores a string of 16-bit \l{QChar}s, where each QChar
- corresponds to one UTF-16 code unit. (Unicode characters
- with code values above 65535 are stored using surrogate pairs,
- i.e., two consecutive \l{QChar}s.)
-
- \l{Unicode} is an international standard that supports most of the
- writing systems in use today. It is a superset of US-ASCII (ANSI
- X3.4-1986) and Latin-1 (ISO 8859-1), and all the US-ASCII/Latin-1
- characters are available at the same code positions.
-
- Behind the scenes, QString uses \l{implicit sharing}
- (copy-on-write) to reduce memory usage and to avoid the needless
- copying of data. This also helps reduce the inherent overhead of
- storing 16-bit characters instead of 8-bit characters.
-
- In addition to QString, Qt also provides the QByteArray class to
- store raw bytes and traditional 8-bit '\\0'-terminated strings.
- For most purposes, QString is the class you want to use. It is
- used throughout the Qt API, and the Unicode support ensures that
- your applications will be easy to translate if you want to expand
- your application's market at some point. The two main cases where
- QByteArray is appropriate are when you need to store raw binary
- data, and when memory conservation is critical (like in embedded
- systems).
-
- \tableofcontents
-
- \section1 Initializing a String
-
- One way to initialize a QString is simply to pass a \c{const char
- *} to its constructor. For example, the following code creates a
- QString of size 5 containing the data "Hello":
-
- \snippet qstring/main.cpp 0
-
- QString converts the \c{const char *} data into Unicode using the
- fromUtf8() function.
-
- In all of the QString functions that take \c{const char *}
- parameters, the \c{const char *} is interpreted as a classic
- C-style '\\0'-terminated string encoded in UTF-8. It is legal for
- the \c{const char *} parameter to be \nullptr.
-
- You can also provide string data as an array of \l{QChar}s:
-
- \snippet qstring/main.cpp 1
-
- QString makes a deep copy of the QChar data, so you can modify it
- later without experiencing side effects. (If for performance
- reasons you don't want to take a deep copy of the character data,
- use QString::fromRawData() instead.)
-
- Another approach is to set the size of the string using resize()
- and to initialize the data character per character. QString uses
- 0-based indexes, just like C++ arrays. To access the character at
- a particular index position, you can use \l operator[](). On
- non-const strings, \l operator[]() returns a reference to a
- character that can be used on the left side of an assignment. For
- example:
-
- \snippet qstring/main.cpp 2
-
- For read-only access, an alternative syntax is to use the at()
- function:
-
- \snippet qstring/main.cpp 3
-
- The at() function can be faster than \l operator[](), because it
- never causes a \l{deep copy} to occur. Alternatively, use the
- left(), right(), or mid() functions to extract several characters
- at a time.
-
- A QString can embed '\\0' characters (QChar::Null). The size()
- function always returns the size of the whole string, including
- embedded '\\0' characters.
-
- After a call to the resize() function, newly allocated characters
- have undefined values. To set all the characters in the string to
- a particular value, use the fill() function.
-
- QString provides dozens of overloads designed to simplify string
- usage. For example, if you want to compare a QString with a string
- literal, you can write code like this and it will work as expected:
-
- \snippet qstring/main.cpp 4
-
- You can also pass string literals to functions that take QStrings
- as arguments, invoking the QString(const char *)
- constructor. Similarly, you can pass a QString to a function that
- takes a \c{const char *} argument using the \l qPrintable() macro
- which returns the given QString as a \c{const char *}. This is
- equivalent to calling <QString>.toLocal8Bit().constData().
-
- \section1 Manipulating String Data
-
- QString provides the following basic functions for modifying the
- character data: append(), prepend(), insert(), replace(), and
- remove(). For example:
-
- \snippet qstring/main.cpp 5
-
- If you are building a QString gradually and know in advance
- approximately how many characters the QString will contain, you
- can call reserve(), asking QString to preallocate a certain amount
- of memory. You can also call capacity() to find out how much
- memory QString actually allocated.
-
- The replace() and remove() functions' first two arguments are the
- position from which to start erasing and the number of characters
- that should be erased. If you want to replace all occurrences of
- a particular substring with another, use one of the two-parameter
- replace() overloads.
-
- A frequent requirement is to remove whitespace characters from a
- string ('\\n', '\\t', ' ', etc.). If you want to remove whitespace
- from both ends of a QString, use the trimmed() function. If you
- want to remove whitespace from both ends and replace multiple
- consecutive whitespaces with a single space character within the
- string, use simplified().
-
- If you want to find all occurrences of a particular character or
- substring in a QString, use the indexOf() or lastIndexOf()
- functions. The former searches forward starting from a given index
- position, the latter searches backward. Both return the index
- position of the character or substring if they find it; otherwise,
- they return -1. For example, here is a typical loop that finds all
- occurrences of a particular substring:
-
- \snippet qstring/main.cpp 6
-
- QString provides many functions for converting numbers into
- strings and strings into numbers. See the arg() functions, the
- setNum() functions, the number() static functions, and the
- toInt(), toDouble(), and similar functions.
-
- To get an upper- or lowercase version of a string use toUpper() or
- toLower().
-
- Lists of strings are handled by the QStringList class. You can
- split a string into a list of strings using the split() function,
- and join a list of strings into a single string with an optional
- separator using QStringList::join(). You can obtain a list of
- strings from a string list that contain a particular substring or
- that match a particular QRegExp using the QStringList::filter()
- function.
-
- \section1 Querying String Data
-
- If you want to see if a QString starts or ends with a particular
- substring use startsWith() or endsWith(). If you simply want to
- check whether a QString contains a particular character or
- substring, use the contains() function. If you want to find out
- how many times a particular character or substring occurs in the
- string, use count().
-
- QStrings can be compared using overloaded operators such as \l
- operator<(), \l operator<=(), \l operator==(), \l operator>=(),
- and so on. Note that the comparison is based exclusively on the
- numeric Unicode values of the characters. It is very fast, but is
- not what a human would expect; the QString::localeAwareCompare()
- function is a better choice for sorting user-interface strings.
-
- To obtain a pointer to the actual character data, call data() or
- constData(). These functions return a pointer to the beginning of
- the QChar data. The pointer is guaranteed to remain valid until a
- non-const function is called on the QString.
-
- \section1 Converting Between 8-Bit Strings and Unicode Strings
-
- QString provides the following three functions that return a
- \c{const char *} version of the string as QByteArray: toUtf8(),
- toLatin1(), and toLocal8Bit().
-
- \list
- \li toLatin1() returns a Latin-1 (ISO 8859-1) encoded 8-bit string.
- \li toUtf8() returns a UTF-8 encoded 8-bit string. UTF-8 is a
- superset of US-ASCII (ANSI X3.4-1986) that supports the entire
- Unicode character set through multibyte sequences.
- \li toLocal8Bit() returns an 8-bit string using the system's local
- encoding.
- \endlist
-
- To convert from one of these encodings, QString provides
- fromLatin1(), fromUtf8(), and fromLocal8Bit(). Other
- encodings are supported through the QTextCodec class.
-
- As mentioned above, QString provides a lot of functions and
- operators that make it easy to interoperate with \c{const char *}
- strings. But this functionality is a double-edged sword: It makes
- QString more convenient to use if all strings are US-ASCII or
- Latin-1, but there is always the risk that an implicit conversion
- from or to \c{const char *} is done using the wrong 8-bit
- encoding. To minimize these risks, you can turn off these implicit
- conversions by defining the following two preprocessor symbols:
-
- \list
- \li \c QT_NO_CAST_FROM_ASCII disables automatic conversions from
- C string literals and pointers to Unicode.
- \li \c QT_RESTRICTED_CAST_FROM_ASCII allows automatic conversions
- from C characters and character arrays, but disables automatic
- conversions from character pointers to Unicode.
- \li \c QT_NO_CAST_TO_ASCII disables automatic conversion from QString
- to C strings.
- \endlist
-
- One way to define these preprocessor symbols globally for your
- application is to add the following entry to your \l {Creating Project Files}{qmake project file}:
-
- \snippet code/src_corelib_tools_qstring.cpp 0
-
- You then need to explicitly call fromUtf8(), fromLatin1(),
- or fromLocal8Bit() to construct a QString from an
- 8-bit string, or use the lightweight QLatin1String class, for
- example:
-
- \snippet code/src_corelib_tools_qstring.cpp 1
-
- Similarly, you must call toLatin1(), toUtf8(), or
- toLocal8Bit() explicitly to convert the QString to an 8-bit
- string. (Other encodings are supported through the QTextCodec
- class.)
-
- \table 100 %
- \header
- \li Note for C Programmers
-
- \row
- \li
- Due to C++'s type system and the fact that QString is
- \l{implicitly shared}, QStrings may be treated like \c{int}s or
- other basic types. For example:
-
- \snippet qstring/main.cpp 7
-
- The \c result variable, is a normal variable allocated on the
- stack. When \c return is called, and because we're returning by
- value, the copy constructor is called and a copy of the string is
- returned. No actual copying takes place thanks to the implicit
- sharing.
-
- \endtable
-
- \section1 Distinction Between Null and Empty Strings
-
- For historical reasons, QString distinguishes between a null
- string and an empty string. A \e null string is a string that is
- initialized using QString's default constructor or by passing
- (const char *)0 to the constructor. An \e empty string is any
- string with size 0. A null string is always empty, but an empty
- string isn't necessarily null:
-
- \snippet qstring/main.cpp 8
-
- All functions except isNull() treat null strings the same as empty
- strings. For example, toUtf8().constData() returns a valid pointer
- (\e not nullptr) to a '\\0' character for a null string. We
- recommend that you always use the isEmpty() function and avoid isNull().
-
- \section1 Argument Formats
-
- In member functions where an argument \e format can be specified
- (e.g., arg(), number()), the argument \e format can be one of the
- following:
-
- \table
- \header \li Format \li Meaning
- \row \li \c e \li format as [-]9.9e[+|-]999
- \row \li \c E \li format as [-]9.9E[+|-]999
- \row \li \c f \li format as [-]9.9
- \row \li \c g \li use \c e or \c f format, whichever is the most concise
- \row \li \c G \li use \c E or \c f format, whichever is the most concise
- \endtable
-
- A \e precision is also specified with the argument \e format. For
- the 'e', 'E', and 'f' formats, the \e precision represents the
- number of digits \e after the decimal point. For the 'g' and 'G'
- formats, the \e precision represents the maximum number of
- significant digits (trailing zeroes are omitted).
-
- \section1 More Efficient String Construction
-
- Many strings are known at compile time. But the trivial
- constructor QString("Hello"), will copy the contents of the string,
- treating the contents as Latin-1. To avoid this one can use the
- QStringLiteral macro to directly create the required data at compile
- time. Constructing a QString out of the literal does then not cause
- any overhead at runtime.
-
- A slightly less efficient way is to use QLatin1String. This class wraps
- a C string literal, precalculates it length at compile time and can
- then be used for faster comparison with QStrings and conversion to
- QStrings than a regular C string literal.
-
- Using the QString \c{'+'} operator, it is easy to construct a
- complex string from multiple substrings. You will often write code
- like this:
-
- \snippet qstring/stringbuilder.cpp 0
-
- There is nothing wrong with either of these string constructions,
- but there are a few hidden inefficiencies. Beginning with Qt 4.6,
- you can eliminate them.
-
- First, multiple uses of the \c{'+'} operator usually means
- multiple memory allocations. When concatenating \e{n} substrings,
- where \e{n > 2}, there can be as many as \e{n - 1} calls to the
- memory allocator.
-
- In 4.6, an internal template class \c{QStringBuilder} has been
- added along with a few helper functions. This class is marked
- internal and does not appear in the documentation, because you
- aren't meant to instantiate it in your code. Its use will be
- automatic, as described below. The class is found in
- \c {src/corelib/tools/qstringbuilder.cpp} if you want to have a
- look at it.
-
- \c{QStringBuilder} uses expression templates and reimplements the
- \c{'%'} operator so that when you use \c{'%'} for string
- concatenation instead of \c{'+'}, multiple substring
- concatenations will be postponed until the final result is about
- to be assigned to a QString. At this point, the amount of memory
- required for the final result is known. The memory allocator is
- then called \e{once} to get the required space, and the substrings
- are copied into it one by one.
-
- Additional efficiency is gained by inlining and reduced reference
- counting (the QString created from a \c{QStringBuilder} typically
- has a ref count of 1, whereas QString::append() needs an extra
- test).
-
- There are two ways you can access this improved method of string
- construction. The straightforward way is to include
- \c{QStringBuilder} wherever you want to use it, and use the
- \c{'%'} operator instead of \c{'+'} when concatenating strings:
-
- \snippet qstring/stringbuilder.cpp 5
-
- A more global approach which is the most convenient but
- not entirely source compatible, is to this define in your
- .pro file:
-
- \snippet qstring/stringbuilder.cpp 3
-
- and the \c{'+'} will automatically be performed as the
- \c{QStringBuilder} \c{'%'} everywhere.
-
- \section1 Maximum size and out-of-memory conditions
-
- The current version of QString is limited to just under 2 GB (2^31 bytes)
- in size. The exact value is architecture-dependent, since it depends on the
- overhead required for managing the data block, but is no more than 32
- bytes. Raw data blocks are also limited by the use of \c int type in the
- current version to 2 GB minus 1 byte. Since QString uses two bytes per
- character, that translates to just under 2^30 characters in one QString.
-
- In case memory allocation fails, QString will throw a \c std::bad_alloc
- exception. Out of memory conditions in the Qt containers are the only case
- where Qt will throw exceptions.
-
- Note that the operating system may impose further limits on applications
- holding a lot of allocated memory, especially large, contiguous blocks.
- Such considerations, the configuration of such behavior or any mitigation
- are outside the scope of the Qt API.
-
- \sa fromRawData(), QChar, QLatin1String, QByteArray, QStringRef
-*/
-
-/*!
- \enum QString::SplitBehavior
-
- This enum specifies how the split() function should behave with
- respect to empty strings.
-
- \value KeepEmptyParts If a field is empty, keep it in the result.
- \value SkipEmptyParts If a field is empty, don't include it in the result.
-
- \sa split()
-*/
-
-/*! \typedef QString::ConstIterator
-
- Qt-style synonym for QString::const_iterator.
-*/
-
-/*! \typedef QString::Iterator
-
- Qt-style synonym for QString::iterator.
-*/
-
-/*! \typedef QString::const_iterator
-
- This typedef provides an STL-style const iterator for QString.
-
- \sa QString::iterator
-*/
-
-/*! \typedef QString::iterator
-
- The QString::iterator typedef provides an STL-style non-const
- iterator for QString.
-
- \sa QString::const_iterator
-*/
-
-/*! \typedef QString::const_reverse_iterator
- \since 5.6
-
- This typedef provides an STL-style const reverse iterator for QString.
-
- \sa QString::reverse_iterator, QString::const_iterator
-*/
-
-/*! \typedef QString::reverse_iterator
- \since 5.6
-
- This typedef provides an STL-style non-const reverse iterator for QString.
-
- \sa QString::const_reverse_iterator, QString::iterator
-*/
-
-/*!
- \typedef QString::size_type
-
- The QString::size_type typedef provides an STL-style type for sizes (int).
-*/
-
-/*!
- \typedef QString::difference_type
-
- The QString::size_type typedef provides an STL-style type for difference between pointers.
-*/
-
-/*!
- \typedef QString::const_reference
-
- This typedef provides an STL-style const reference for a QString element (QChar).
-*/
-/*!
- \typedef QString::reference
-
- This typedef provides an STL-style
- reference for a QString element (QChar).
-*/
-
-/*!
- \typedef QString::const_pointer
-
- The QString::const_pointer typedef provides an STL-style
- const pointer to a QString element (QChar).
-*/
-/*!
- \typedef QString::pointer
-
- The QString::const_pointer typedef provides an STL-style
- pointer to a QString element (QChar).
-*/
-
-/*!
- \typedef QString::value_type
-
- This typedef provides an STL-style value type for QString.
-*/
-
-/*! \fn QString::iterator QString::begin()
-
- Returns an \l{STL-style iterators}{STL-style iterator} pointing to the first character in
- the string.
-
- \sa constBegin(), end()
-*/
-
-/*! \fn QString::const_iterator QString::begin() const
-
- \overload begin()
-*/
-
-/*! \fn QString::const_iterator QString::cbegin() const
- \since 5.0
-
- Returns a const \l{STL-style iterators}{STL-style iterator} pointing to the first character
- in the string.
-
- \sa begin(), cend()
-*/
-
-/*! \fn QString::const_iterator QString::constBegin() const
-
- Returns a const \l{STL-style iterators}{STL-style iterator} pointing to the first character
- in the string.
-
- \sa begin(), constEnd()
-*/
-
-/*! \fn QString::iterator QString::end()
-
- Returns an \l{STL-style iterators}{STL-style iterator} pointing to the imaginary character
- after the last character in the string.
-
- \sa begin(), constEnd()
-*/
-
-/*! \fn QString::const_iterator QString::end() const
-
- \overload end()
-*/
-
-/*! \fn QString::const_iterator QString::cend() const
- \since 5.0
-
- Returns a const \l{STL-style iterators}{STL-style iterator} pointing to the imaginary
- character after the last character in the list.
-
- \sa cbegin(), end()
-*/
-
-/*! \fn QString::const_iterator QString::constEnd() const
-
- Returns a const \l{STL-style iterators}{STL-style iterator} pointing to the imaginary
- character after the last character in the list.
-
- \sa constBegin(), end()
-*/
-
-/*! \fn QString::reverse_iterator QString::rbegin()
- \since 5.6
-
- Returns a \l{STL-style iterators}{STL-style} reverse iterator pointing to the first
- character in the string, in reverse order.
-
- \sa begin(), crbegin(), rend()
-*/
-
-/*! \fn QString::const_reverse_iterator QString::rbegin() const
- \since 5.6
- \overload
-*/
-
-/*! \fn QString::const_reverse_iterator QString::crbegin() const
- \since 5.6
-
- Returns a const \l{STL-style iterators}{STL-style} reverse iterator pointing to the first
- character in the string, in reverse order.
-
- \sa begin(), rbegin(), rend()
-*/
-
-/*! \fn QString::reverse_iterator QString::rend()
- \since 5.6
-
- Returns a \l{STL-style iterators}{STL-style} reverse iterator pointing to one past
- the last character in the string, in reverse order.
-
- \sa end(), crend(), rbegin()
-*/
-
-/*! \fn QString::const_reverse_iterator QString::rend() const
- \since 5.6
- \overload
-*/
-
-/*! \fn QString::const_reverse_iterator QString::crend() const
- \since 5.6
-
- Returns a const \l{STL-style iterators}{STL-style} reverse iterator pointing to one
- past the last character in the string, in reverse order.
-
- \sa end(), rend(), rbegin()
-*/
-
-/*!
- \fn QString::QString()
-
- Constructs a null string. Null strings are also empty.
-
- \sa isEmpty()
-*/
-
-/*!
- \fn QString::QString(QString &&other)
-
- Move-constructs a QString instance, making it point at the same
- object that \a other was pointing to.
-
- \since 5.2
-*/
-
-/*! \fn QString::QString(const char *str)
-
- Constructs a string initialized with the 8-bit string \a str. The
- given const char pointer is converted to Unicode using the
- fromUtf8() function.
-
- You can disable this constructor by defining \c
- QT_NO_CAST_FROM_ASCII when you compile your applications. This
- can be useful if you want to ensure that all user-visible strings
- go through QObject::tr(), for example.
-
- \note Defining \c QT_RESTRICTED_CAST_FROM_ASCII also disables
- this constructor, but enables a \c{QString(const char (&ch)[N])}
- constructor instead. Using non-literal input, or input with
- embedded NUL characters, or non-7-bit characters is undefined
- in this case.
-
- \sa fromLatin1(), fromLocal8Bit(), fromUtf8(), QT_NO_CAST_FROM_ASCII, QT_RESTRICTED_CAST_FROM_ASCII
-*/
-
-/*! \fn QString QString::fromStdString(const std::string &str)
-
- Returns a copy of the \a str string. The given string is converted
- to Unicode using the fromUtf8() function.
-
- \sa fromLatin1(), fromLocal8Bit(), fromUtf8(), QByteArray::fromStdString()
-*/
-
-/*! \fn QString QString::fromStdWString(const std::wstring &str)
-
- Returns a copy of the \a str string. The given string is assumed
- to be encoded in utf16 if the size of wchar_t is 2 bytes (e.g. on
- windows) and ucs4 if the size of wchar_t is 4 bytes (most Unix
- systems).
-
- \sa fromUtf16(), fromLatin1(), fromLocal8Bit(), fromUtf8(), fromUcs4(), fromStdU16String(), fromStdU32String()
-*/
-
-/*! \fn QString QString::fromWCharArray(const wchar_t *string, int size)
- \since 4.2
-
- Returns a copy of the \a string, where the encoding of \a string depends on
- the size of wchar. If wchar is 4 bytes, the \a string is interpreted as UCS-4,
- if wchar is 2 bytes it is interpreted as UTF-16.
-
- If \a size is -1 (default), the \a string has to be \\0'-terminated.
-
- \sa fromUtf16(), fromLatin1(), fromLocal8Bit(), fromUtf8(), fromUcs4(), fromStdWString()
-*/
-
-/*! \fn std::wstring QString::toStdWString() const
-
- Returns a std::wstring object with the data contained in this
- QString. The std::wstring is encoded in utf16 on platforms where
- wchar_t is 2 bytes wide (e.g. windows) and in ucs4 on platforms
- where wchar_t is 4 bytes wide (most Unix systems).
-
- This method is mostly useful to pass a QString to a function
- that accepts a std::wstring object.
-
- \sa utf16(), toLatin1(), toUtf8(), toLocal8Bit(), toStdU16String(), toStdU32String()
-*/
-
-int QString::toUcs4_helper(const ushort *uc, int length, uint *out)
-{
- int count = 0;
-
- QStringIterator i(QStringView(uc, length));
- while (i.hasNext())
- out[count++] = i.next();
-
- return count;
-}
-
-/*! \fn int QString::toWCharArray(wchar_t *array) const
- \since 4.2
-
- Fills the \a array with the data contained in this QString object.
- The array is encoded in UTF-16 on platforms where
- wchar_t is 2 bytes wide (e.g. windows) and in UCS-4 on platforms
- where wchar_t is 4 bytes wide (most Unix systems).
-
- \a array has to be allocated by the caller and contain enough space to
- hold the complete string (allocating the array with the same length as the
- string is always sufficient).
-
- This function returns the actual length of the string in \a array.
-
- \note This function does not append a null character to the array.
-
- \sa utf16(), toUcs4(), toLatin1(), toUtf8(), toLocal8Bit(), toStdWString()
-*/
-
-/*! \fn QString::QString(const QString &other)
-
- Constructs a copy of \a other.
-
- This operation takes \l{constant time}, because QString is
- \l{implicitly shared}. This makes returning a QString from a
- function very fast. If a shared instance is modified, it will be
- copied (copy-on-write), and that takes \l{linear time}.
-
- \sa operator=()
-*/
-
-/*!
- Constructs a string initialized with the first \a size characters
- of the QChar array \a unicode.
-
- If \a unicode is 0, a null string is constructed.
-
- If \a size is negative, \a unicode is assumed to point to a \\0'-terminated
- array and its length is determined dynamically. The terminating
- null character is not considered part of the string.
-
- QString makes a deep copy of the string data. The unicode data is copied as
- is and the Byte Order Mark is preserved if present.
-
- \sa fromRawData()
-*/
-QString::QString(const QChar *unicode, int size)
-{
- if (!unicode) {
- d = Data::sharedNull();
- } else {
- if (size < 0) {
- size = 0;
- while (!unicode[size].isNull())
- ++size;
- }
- if (!size) {
- d = Data::allocate(0);
- } else {
- d = Data::allocate(size + 1);
- Q_CHECK_PTR(d);
- d->size = size;
- memcpy(d->data(), unicode, size * sizeof(QChar));
- d->data()[size] = '\0';
- }
- }
-}
-
-/*!
- Constructs a string of the given \a size with every character set
- to \a ch.
-
- \sa fill()
-*/
-QString::QString(int size, QChar ch)
-{
- if (size <= 0) {
- d = Data::allocate(0);
- } else {
- d = Data::allocate(size + 1);
- Q_CHECK_PTR(d);
- d->size = size;
- d->data()[size] = '\0';
- ushort *i = d->data() + size;
- ushort *b = d->data();
- const ushort value = ch.unicode();
- while (i != b)
- *--i = value;
- }
-}
-
-/*! \fn QString::QString(int size, Qt::Initialization)
- \internal
-
- Constructs a string of the given \a size without initializing the
- characters. This is only used in \c QStringBuilder::toString().
-*/
-QString::QString(int size, Qt::Initialization)
-{
- d = Data::allocate(size + 1);
- Q_CHECK_PTR(d);
- d->size = size;
- d->data()[size] = '\0';
-}
-
-/*! \fn QString::QString(QLatin1String str)
-
- Constructs a copy of the Latin-1 string \a str.
-
- \sa fromLatin1()
-*/
-
-/*!
- Constructs a string of size 1 containing the character \a ch.
-*/
-QString::QString(QChar ch)
-{
- d = Data::allocate(2);
- Q_CHECK_PTR(d);
- d->size = 1;
- d->data()[0] = ch.unicode();
- d->data()[1] = '\0';
-}
-
-/*! \fn QString::QString(const QByteArray &ba)
-
- Constructs a string initialized with the byte array \a ba. The
- given byte array is converted to Unicode using fromUtf8(). Stops
- copying at the first 0 character, otherwise copies the entire byte
- array.
-
- You can disable this constructor by defining \c
- QT_NO_CAST_FROM_ASCII when you compile your applications. This
- can be useful if you want to ensure that all user-visible strings
- go through QObject::tr(), for example.
-
- \sa fromLatin1(), fromLocal8Bit(), fromUtf8(), QT_NO_CAST_FROM_ASCII
-*/
-
-/*! \fn QString::QString(const Null &)
- \internal
-*/
-
-/*! \fn QString::QString(QStringDataPtr)
- \internal
-*/
-
-/*! \fn QString &QString::operator=(const QString::Null &)
- \internal
-*/
-
-/*!
- \fn QString::~QString()
-
- Destroys the string.
-*/
-
-
-/*! \fn void QString::swap(QString &other)
- \since 4.8
-
- Swaps string \a other with this string. This operation is very fast and
- never fails.
-*/
-
-/*! \fn void QString::detach()
-
- \internal
-*/
-
-/*! \fn bool QString::isDetached() const
-
- \internal
-*/
-
-/*! \fn bool QString::isSharedWith(const QString &other) const
-
- \internal
-*/
-
-/*!
- Sets the size of the string to \a size characters.
-
- If \a size is greater than the current size, the string is
- extended to make it \a size characters long with the extra
- characters added to the end. The new characters are uninitialized.
-
- If \a size is less than the current size, characters are removed
- from the end.
-
- Example:
-
- \snippet qstring/main.cpp 45
-
- If you want to append a certain number of identical characters to
- the string, use the \l {QString::}{resize(int, QChar)} overload.
-
- If you want to expand the string so that it reaches a certain
- width and fill the new positions with a particular character, use
- the leftJustified() function:
-
- If \a size is negative, it is equivalent to passing zero.
-
- \snippet qstring/main.cpp 47
-
- \sa truncate(), reserve()
-*/
-
-void QString::resize(int size)
-{
- if (size < 0)
- size = 0;
-
- if (IS_RAW_DATA(d) && !d->ref.isShared() && size < d->size) {
- d->size = size;
- return;
- }
-
- if (d->ref.isShared() || uint(size) + 1u > d->alloc)
- reallocData(uint(size) + 1u, true);
- if (d->alloc) {
- d->size = size;
- d->data()[size] = '\0';
- }
-}
-
-/*!
- \overload
- \since 5.7
-
- Unlike \l {QString::}{resize(int)}, this overload
- initializes the new characters to \a fillChar:
-
- \snippet qstring/main.cpp 46
-*/
-
-void QString::resize(int size, QChar fillChar)
-{
- const int oldSize = length();
- resize(size);
- const int difference = length() - oldSize;
- if (difference > 0)
- std::fill_n(d->begin() + oldSize, difference, fillChar.unicode());
-}
-
-/*! \fn int QString::capacity() const
-
- Returns the maximum number of characters that can be stored in
- the string without forcing a reallocation.
-
- The sole purpose of this function is to provide a means of fine
- tuning QString's memory usage. In general, you will rarely ever
- need to call this function. If you want to know how many
- characters are in the string, call size().
-
- \sa reserve(), squeeze()
-*/
-
-/*!
- \fn void QString::reserve(int size)
-
- Attempts to allocate memory for at least \a size characters. If
- you know in advance how large the string will be, you can call
- this function, and if you resize the string often you are likely
- to get better performance. If \a size is an underestimate, the
- worst that will happen is that the QString will be a bit slower.
-
- The sole purpose of this function is to provide a means of fine
- tuning QString's memory usage. In general, you will rarely ever
- need to call this function. If you want to change the size of the
- string, call resize().
-
- This function is useful for code that needs to build up a long
- string and wants to avoid repeated reallocation. In this example,
- we want to add to the string until some condition is \c true, and
- we're fairly sure that size is large enough to make a call to
- reserve() worthwhile:
-
- \snippet qstring/main.cpp 44
-
- \sa squeeze(), capacity()
-*/
-
-/*!
- \fn void QString::squeeze()
-
- Releases any memory not required to store the character data.
-
- The sole purpose of this function is to provide a means of fine
- tuning QString's memory usage. In general, you will rarely ever
- need to call this function.
-
- \sa reserve(), capacity()
-*/
-
-void QString::reallocData(uint alloc, bool grow)
-{
- auto allocOptions = d->detachFlags();
- if (grow)
- allocOptions |= QArrayData::Grow;
-
- if (d->ref.isShared() || IS_RAW_DATA(d)) {
- Data *x = Data::allocate(alloc, allocOptions);
- Q_CHECK_PTR(x);
- x->size = qMin(int(alloc) - 1, d->size);
- ::memcpy(x->data(), d->data(), x->size * sizeof(QChar));
- x->data()[x->size] = 0;
- if (!d->ref.deref())
- Data::deallocate(d);
- d = x;
- } else {
- Data *p = Data::reallocateUnaligned(d, alloc, allocOptions);
- Q_CHECK_PTR(p);
- d = p;
- }
-}
-
-#if QT_VERSION < QT_VERSION_CHECK(6, 0, 0)
-void QString::expand(int i)
-{
- resize(qMax(i + 1, d->size), QLatin1Char(' '));
-}
-#endif
-
-/*! \fn void QString::clear()
-
- Clears the contents of the string and makes it null.
-
- \sa resize(), isNull()
-*/
-
-/*! \fn QString &QString::operator=(const QString &other)
-
- Assigns \a other to this string and returns a reference to this
- string.
-*/
-
-QString &QString::operator=(const QString &other) Q_DECL_NOTHROW
-{
- other.d->ref.ref();
- if (!d->ref.deref())
- Data::deallocate(d);
- d = other.d;
- return *this;
-}
-
-/*!
- \fn QString &QString::operator=(QString &&other)
-
- Move-assigns \a other to this QString instance.
-
- \since 5.2
-*/
-
-/*! \fn QString &QString::operator=(QLatin1String str)
-
- \overload operator=()
-
- Assigns the Latin-1 string \a str to this string.
-*/
-QString &QString::operator=(QLatin1String other)
-{
- if (isDetached() && other.size() <= capacity()) { // assumes d->alloc == 0 -> !isDetached() (sharedNull)
- d->size = other.size();
- d->data()[other.size()] = 0;
- qt_from_latin1(d->data(), other.latin1(), other.size());
- } else {
- *this = fromLatin1(other.latin1(), other.size());
- }
- return *this;
-}
-
-/*! \fn QString &QString::operator=(const QByteArray &ba)
-
- \overload operator=()
-
- Assigns \a ba to this string. The byte array is converted to Unicode
- using the fromUtf8() function. This function stops conversion at the
- first NUL character found, or the end of the \a ba byte array.
-
- You can disable this operator by defining \c
- QT_NO_CAST_FROM_ASCII when you compile your applications. This
- can be useful if you want to ensure that all user-visible strings
- go through QObject::tr(), for example.
-
- \sa QT_NO_CAST_FROM_ASCII
-*/
-
-/*! \fn QString &QString::operator=(const char *str)
-
- \overload operator=()
-
- Assigns \a str to this string. The const char pointer is converted
- to Unicode using the fromUtf8() function.
-
- You can disable this operator by defining \c QT_NO_CAST_FROM_ASCII
- or \c QT_RESTRICTED_CAST_FROM_ASCII when you compile your applications.
- This can be useful if you want to ensure that all user-visible strings
- go through QObject::tr(), for example.
-
- \sa QT_NO_CAST_FROM_ASCII, QT_RESTRICTED_CAST_FROM_ASCII
-*/
-
-/*! \fn QString &QString::operator=(char ch)
-
- \overload operator=()
-
- Assigns character \a ch to this string. Note that the character is
- converted to Unicode using the fromLatin1() function, unlike other 8-bit
- functions that operate on UTF-8 data.
-
- You can disable this operator by defining \c
- QT_NO_CAST_FROM_ASCII when you compile your applications. This
- can be useful if you want to ensure that all user-visible strings
- go through QObject::tr(), for example.
-
- \sa QT_NO_CAST_FROM_ASCII
-*/
-
-/*!
- \overload operator=()
-
- Sets the string to contain the single character \a ch.
-*/
-QString &QString::operator=(QChar ch)
-{
- if (isDetached() && capacity() >= 1) { // assumes d->alloc == 0 -> !isDetached() (sharedNull)
- // re-use existing capacity:
- ushort *dat = d->data();
- dat[0] = ch.unicode();
- dat[1] = 0;
- d->size = 1;
- } else {
- operator=(QString(ch));
- }
- return *this;
-}
-
-/*!
- \fn QString& QString::insert(int position, const QString &str)
-
- Inserts the string \a str at the given index \a position and
- returns a reference to this string.
-
- Example:
-
- \snippet qstring/main.cpp 26
-
- If the given \a position is greater than size(), the array is
- first extended using resize().
-
- \sa append(), prepend(), replace(), remove()
-*/
-
-
-/*!
- \fn QString& QString::insert(int position, const QStringRef &str)
- \since 5.5
- \overload insert()
-
- Inserts the string reference \a str at the given index \a position and
- returns a reference to this string.
-
- If the given \a position is greater than size(), the array is
- first extended using resize().
-*/
-
-
-/*!
- \fn QString& QString::insert(int position, const char *str)
- \since 5.5
- \overload insert()
-
- Inserts the C string \a str at the given index \a position and
- returns a reference to this string.
-
- If the given \a position is greater than size(), the array is
- first extended using resize().
-
- This function is not available when \c QT_NO_CAST_FROM_ASCII is
- defined.
-
- \sa QT_NO_CAST_FROM_ASCII
-*/
-
-
-/*!
- \fn QString& QString::insert(int position, const QByteArray &str)
- \since 5.5
- \overload insert()
-
- Inserts the byte array \a str at the given index \a position and
- returns a reference to this string.
-
- If the given \a position is greater than size(), the array is
- first extended using resize().
-
- This function is not available when \c QT_NO_CAST_FROM_ASCII is
- defined.
-
- \sa QT_NO_CAST_FROM_ASCII
-*/
-
-
-/*!
- \fn QString &QString::insert(int position, QLatin1String str)
- \overload insert()
-
- Inserts the Latin-1 string \a str at the given index \a position.
-*/
-QString &QString::insert(int i, QLatin1String str)
-{
- const char *s = str.latin1();
- if (i < 0 || !s || !(*s))
- return *this;
-
- int len = str.size();
- if (Q_UNLIKELY(i > d->size))
- resize(i + len, QLatin1Char(' '));
- else
- resize(d->size + len);
-
- ::memmove(d->data() + i + len, d->data() + i, (d->size - i - len) * sizeof(QChar));
- qt_from_latin1(d->data() + i, s, uint(len));
- return *this;
-}
-
-/*!
- \fn QString& QString::insert(int position, const QChar *unicode, int size)
- \overload insert()
-
- Inserts the first \a size characters of the QChar array \a unicode
- at the given index \a position in the string.
-*/
-QString& QString::insert(int i, const QChar *unicode, int size)
-{
- if (i < 0 || size <= 0)
- return *this;
-
- const ushort *s = (const ushort *)unicode;
- if (s >= d->data() && s < d->data() + d->alloc) {
- // Part of me - take a copy
- ushort *tmp = static_cast<ushort *>(::malloc(size * sizeof(QChar)));
- Q_CHECK_PTR(tmp);
- memcpy(tmp, s, size * sizeof(QChar));
- insert(i, reinterpret_cast<const QChar *>(tmp), size);
- ::free(tmp);
- return *this;
- }
-
- if (Q_UNLIKELY(i > d->size))
- resize(i + size, QLatin1Char(' '));
- else
- resize(d->size + size);
-
- ::memmove(d->data() + i + size, d->data() + i, (d->size - i - size) * sizeof(QChar));
- memcpy(d->data() + i, s, size * sizeof(QChar));
- return *this;
-}
-
-/*!
- \fn QString& QString::insert(int position, QChar ch)
- \overload insert()
-
- Inserts \a ch at the given index \a position in the string.
-*/
-
-QString& QString::insert(int i, QChar ch)
-{
- if (i < 0)
- i += d->size;
- if (i < 0)
- return *this;
- if (Q_UNLIKELY(i > d->size))
- resize(i + 1, QLatin1Char(' '));
- else
- resize(d->size + 1);
- ::memmove(d->data() + i + 1, d->data() + i, (d->size - i - 1) * sizeof(QChar));
- d->data()[i] = ch.unicode();
- return *this;
-}
-
-/*!
- Appends the string \a str onto the end of this string.
-
- Example:
-
- \snippet qstring/main.cpp 9
-
- This is the same as using the insert() function:
-
- \snippet qstring/main.cpp 10
-
- The append() function is typically very fast (\l{constant time}),
- because QString preallocates extra space at the end of the string
- data so it can grow without reallocating the entire string each
- time.
-
- \sa operator+=(), prepend(), insert()
-*/
-QString &QString::append(const QString &str)
-{
- if (str.d != Data::sharedNull()) {
- if (d == Data::sharedNull()) {
- operator=(str);
- } else {
- if (d->ref.isShared() || uint(d->size + str.d->size) + 1u > d->alloc)
- reallocData(uint(d->size + str.d->size) + 1u, true);
- memcpy(d->data() + d->size, str.d->data(), str.d->size * sizeof(QChar));
- d->size += str.d->size;
- d->data()[d->size] = '\0';
- }
- }
- return *this;
-}
-
-/*!
- \overload append()
- \since 5.0
-
- Appends \a len characters from the QChar array \a str to this string.
-*/
-QString &QString::append(const QChar *str, int len)
-{
- if (str && len > 0) {
- if (d->ref.isShared() || uint(d->size + len) + 1u > d->alloc)
- reallocData(uint(d->size + len) + 1u, true);
- memcpy(d->data() + d->size, str, len * sizeof(QChar));
- d->size += len;
- d->data()[d->size] = '\0';
- }
- return *this;
-}
-
-/*!
- \overload append()
-
- Appends the Latin-1 string \a str to this string.
-*/
-QString &QString::append(QLatin1String str)
-{
- const char *s = str.latin1();
- if (s) {
- int len = str.size();
- if (d->ref.isShared() || uint(d->size + len) + 1u > d->alloc)
- reallocData(uint(d->size + len) + 1u, true);
- ushort *i = d->data() + d->size;
- qt_from_latin1(i, s, uint(len));
- i[len] = '\0';
- d->size += len;
- }
- return *this;
-}
-
-/*! \fn QString &QString::append(const QByteArray &ba)
-
- \overload append()
-
- Appends the byte array \a ba to this string. The given byte array
- is converted to Unicode using the fromUtf8() function.
-
- You can disable this function by defining \c QT_NO_CAST_FROM_ASCII
- when you compile your applications. This can be useful if you want
- to ensure that all user-visible strings go through QObject::tr(),
- for example.
-
- \sa QT_NO_CAST_FROM_ASCII
-*/
-
-/*! \fn QString &QString::append(const char *str)
-
- \overload append()
-
- Appends the string \a str to this string. The given const char
- pointer is converted to Unicode using the fromUtf8() function.
-
- You can disable this function by defining \c QT_NO_CAST_FROM_ASCII
- when you compile your applications. This can be useful if you want
- to ensure that all user-visible strings go through QObject::tr(),
- for example.
-
- \sa QT_NO_CAST_FROM_ASCII
-*/
-
-/*!
- \overload append()
-
- Appends the character \a ch to this string.
-*/
-QString &QString::append(QChar ch)
-{
- if (d->ref.isShared() || uint(d->size) + 2u > d->alloc)
- reallocData(uint(d->size) + 2u, true);
- d->data()[d->size++] = ch.unicode();
- d->data()[d->size] = '\0';
- return *this;
-}
-
-/*! \fn QString &QString::prepend(const QString &str)
-
- Prepends the string \a str to the beginning of this string and
- returns a reference to this string.
-
- Example:
-
- \snippet qstring/main.cpp 36
-
- \sa append(), insert()
-*/
-
-/*! \fn QString &QString::prepend(QLatin1String str)
-
- \overload prepend()
-
- Prepends the Latin-1 string \a str to this string.
-*/
-
-/*! \fn QString &QString::prepend(const QChar *str, int len)
- \since 5.5
- \overload prepend()
-
- Prepends \a len characters from the QChar array \a str to this string and
- returns a reference to this string.
-*/
-
-/*! \fn QString &QString::prepend(const QStringRef &str)
- \since 5.5
- \overload prepend()
-
- Prepends the string reference \a str to the beginning of this string and
- returns a reference to this string.
-*/
-
-/*! \fn QString &QString::prepend(const QByteArray &ba)
-
- \overload prepend()
-
- Prepends the byte array \a ba to this string. The byte array is
- converted to Unicode using the fromUtf8() function.
-
- You can disable this function by defining \c
- QT_NO_CAST_FROM_ASCII when you compile your applications. This
- can be useful if you want to ensure that all user-visible strings
- go through QObject::tr(), for example.
-
- \sa QT_NO_CAST_FROM_ASCII
-*/
-
-/*! \fn QString &QString::prepend(const char *str)
-
- \overload prepend()
-
- Prepends the string \a str to this string. The const char pointer
- is converted to Unicode using the fromUtf8() function.
-
- You can disable this function by defining \c
- QT_NO_CAST_FROM_ASCII when you compile your applications. This
- can be useful if you want to ensure that all user-visible strings
- go through QObject::tr(), for example.
-
- \sa QT_NO_CAST_FROM_ASCII
-*/
-
-/*! \fn QString &QString::prepend(QChar ch)
-
- \overload prepend()
-
- Prepends the character \a ch to this string.
-*/
-
-/*!
- \fn QString &QString::remove(int position, int n)
-
- Removes \a n characters from the string, starting at the given \a
- position index, and returns a reference to the string.
-
- If the specified \a position index is within the string, but \a
- position + \a n is beyond the end of the string, the string is
- truncated at the specified \a position.
-
- \snippet qstring/main.cpp 37
-
- \sa insert(), replace()
-*/
-QString &QString::remove(int pos, int len)
-{
- if (pos < 0) // count from end of string
- pos += d->size;
- if (uint(pos) >= uint(d->size)) {
- // range problems
- } else if (len >= d->size - pos) {
- resize(pos); // truncate
- } else if (len > 0) {
- detach();
- memmove(d->data() + pos, d->data() + pos + len,
- (d->size - pos - len + 1) * sizeof(ushort));
- d->size -= len;
- }
- return *this;
-}
-
-template<typename T>
-static void removeStringImpl(QString &s, const T &needle, Qt::CaseSensitivity cs)
-{
- const int needleSize = needle.size();
- if (needleSize) {
- if (needleSize == 1) {
- s.remove(needle.front(), cs);
- } else {
- int i = 0;
- while ((i = s.indexOf(needle, i, cs)) != -1)
- s.remove(i, needleSize);
- }
- }
-}
-
-/*!
- Removes every occurrence of the given \a str string in this
- string, and returns a reference to this string.
-
- If \a cs is Qt::CaseSensitive (default), the search is
- case sensitive; otherwise the search is case insensitive.
-
- This is the same as \c replace(str, "", cs).
-
- \sa replace()
-*/
-QString &QString::remove(const QString &str, Qt::CaseSensitivity cs)
-{
- removeStringImpl(*this, str, cs);
- return *this;
-}
-
-/*!
- \since 5.11
- \overload
-
- Removes every occurrence of the given \a str string in this
- string, and returns a reference to this string.
-
- If \a cs is Qt::CaseSensitive (default), the search is
- case sensitive; otherwise the search is case insensitive.
-
- This is the same as \c replace(str, "", cs).
-
- \sa replace()
-*/
-QString &QString::remove(QLatin1String str, Qt::CaseSensitivity cs)
-{
- removeStringImpl(*this, str, cs);
- return *this;
-}
-
-/*!
- Removes every occurrence of the character \a ch in this string, and
- returns a reference to this string.
-
- If \a cs is Qt::CaseSensitive (default), the search is case
- sensitive; otherwise the search is case insensitive.
-
- Example:
-
- \snippet qstring/main.cpp 38
-
- This is the same as \c replace(ch, "", cs).
-
- \sa replace()
-*/
-QString &QString::remove(QChar ch, Qt::CaseSensitivity cs)
-{
- const int idx = indexOf(ch, 0, cs);
- if (idx != -1) {
- const auto first = begin(); // implicit detach()
- auto last = end();
- if (cs == Qt::CaseSensitive) {
- last = std::remove(first + idx, last, ch);
- } else {
- const QChar c = ch.toCaseFolded();
- auto caseInsensEqual = [c](QChar x) {
- return c == x.toCaseFolded();
- };
- last = std::remove_if(first + idx, last, caseInsensEqual);
- }
- resize(last - first);
- }
- return *this;
-}
-
-/*!
- \fn QString &QString::remove(const QRegExp &rx)
-
- Removes every occurrence of the regular expression \a rx in the
- string, and returns a reference to the string. For example:
-
- \snippet qstring/main.cpp 39
-
- \sa indexOf(), lastIndexOf(), replace()
-*/
-
-/*!
- \fn QString &QString::remove(const QRegularExpression &re)
- \since 5.0
-
- Removes every occurrence of the regular expression \a re in the
- string, and returns a reference to the string. For example:
-
- \snippet qstring/main.cpp 96
-
- \sa indexOf(), lastIndexOf(), replace()
-*/
-
-/*!
- \fn QString &QString::replace(int position, int n, const QString &after)
-
- Replaces \a n characters beginning at index \a position with
- the string \a after and returns a reference to this string.
-
- \note If the specified \a position index is within the string,
- but \a position + \a n goes outside the strings range,
- then \a n will be adjusted to stop at the end of the string.
-
- Example:
-
- \snippet qstring/main.cpp 40
-
- \sa insert(), remove()
-*/
-QString &QString::replace(int pos, int len, const QString &after)
-{
- return replace(pos, len, after.constData(), after.length());
-}
-
-/*!
- \fn QString &QString::replace(int position, int n, const QChar *unicode, int size)
- \overload replace()
- Replaces \a n characters beginning at index \a position with the
- first \a size characters of the QChar array \a unicode and returns a
- reference to this string.
-*/
-QString &QString::replace(int pos, int len, const QChar *unicode, int size)
-{
- if (uint(pos) > uint(d->size))
- return *this;
- if (len > d->size - pos)
- len = d->size - pos;
-
- uint index = pos;
- replace_helper(&index, 1, len, unicode, size);
- return *this;
-}
-
-/*!
- \fn QString &QString::replace(int position, int n, QChar after)
- \overload replace()
-
- Replaces \a n characters beginning at index \a position with the
- character \a after and returns a reference to this string.
-*/
-QString &QString::replace(int pos, int len, QChar after)
-{
- return replace(pos, len, &after, 1);
-}
-
-/*!
- \overload replace()
- Replaces every occurrence of the string \a before with the string \a
- after and returns a reference to this string.
-
- If \a cs is Qt::CaseSensitive (default), the search is case
- sensitive; otherwise the search is case insensitive.
-
- Example:
-
- \snippet qstring/main.cpp 41
-
- \note The replacement text is not rescanned after it is inserted.
-
- Example:
-
- \snippet qstring/main.cpp 86
-*/
-QString &QString::replace(const QString &before, const QString &after, Qt::CaseSensitivity cs)
-{
- return replace(before.constData(), before.size(), after.constData(), after.size(), cs);
-}
-
-namespace { // helpers for replace and its helper:
-QChar *textCopy(const QChar *start, int len)
-{
- const size_t size = len * sizeof(QChar);
- QChar *const copy = static_cast<QChar *>(::malloc(size));
- Q_CHECK_PTR(copy);
- ::memcpy(copy, start, size);
- return copy;
-}
-
-bool pointsIntoRange(const QChar *ptr, const ushort *base, int len)
-{
- const QChar *const start = reinterpret_cast<const QChar *>(base);
- return start <= ptr && ptr < start + len;
-}
-} // end namespace
-
-/*!
- \internal
- */
-void QString::replace_helper(uint *indices, int nIndices, int blen, const QChar *after, int alen)
-{
- // Copy after if it lies inside our own d->data() area (which we could
- // possibly invalidate via a realloc or modify by replacement).
- QChar *afterBuffer = 0;
- if (pointsIntoRange(after, d->data(), d->size)) // Use copy in place of vulnerable original:
- after = afterBuffer = textCopy(after, alen);
-
- QT_TRY {
- if (blen == alen) {
- // replace in place
- detach();
- for (int i = 0; i < nIndices; ++i)
- memcpy(d->data() + indices[i], after, alen * sizeof(QChar));
- } else if (alen < blen) {
- // replace from front
- detach();
- uint to = indices[0];
- if (alen)
- memcpy(d->data()+to, after, alen*sizeof(QChar));
- to += alen;
- uint movestart = indices[0] + blen;
- for (int i = 1; i < nIndices; ++i) {
- int msize = indices[i] - movestart;
- if (msize > 0) {
- memmove(d->data() + to, d->data() + movestart, msize * sizeof(QChar));
- to += msize;
- }
- if (alen) {
- memcpy(d->data() + to, after, alen * sizeof(QChar));
- to += alen;
- }
- movestart = indices[i] + blen;
- }
- int msize = d->size - movestart;
- if (msize > 0)
- memmove(d->data() + to, d->data() + movestart, msize * sizeof(QChar));
- resize(d->size - nIndices*(blen-alen));
- } else {
- // replace from back
- int adjust = nIndices*(alen-blen);
- int newLen = d->size + adjust;
- int moveend = d->size;
- resize(newLen);
-
- while (nIndices) {
- --nIndices;
- int movestart = indices[nIndices] + blen;
- int insertstart = indices[nIndices] + nIndices*(alen-blen);
- int moveto = insertstart + alen;
- memmove(d->data() + moveto, d->data() + movestart,
- (moveend - movestart)*sizeof(QChar));
- memcpy(d->data() + insertstart, after, alen * sizeof(QChar));
- moveend = movestart-blen;
- }
- }
- } QT_CATCH(const std::bad_alloc &) {
- ::free(afterBuffer);
- QT_RETHROW;
- }
- ::free(afterBuffer);
-}
-
-/*!
- \since 4.5
- \overload replace()
-
- Replaces each occurrence in this string of the first \a blen
- characters of \a before with the first \a alen characters of \a
- after and returns a reference to this string.
-
- If \a cs is Qt::CaseSensitive (default), the search is case
- sensitive; otherwise the search is case insensitive.
-*/
-QString &QString::replace(const QChar *before, int blen,
- const QChar *after, int alen,
- Qt::CaseSensitivity cs)
-{
- if (d->size == 0) {
- if (blen)
- return *this;
- } else {
- if (cs == Qt::CaseSensitive && before == after && blen == alen)
- return *this;
- }
- if (alen == 0 && blen == 0)
- return *this;
-
- QStringMatcher matcher(before, blen, cs);
- QChar *beforeBuffer = 0, *afterBuffer = 0;
-
- int index = 0;
- while (1) {
- uint indices[1024];
- uint pos = 0;
- while (pos < 1024) {
- index = matcher.indexIn(*this, index);
- if (index == -1)
- break;
- indices[pos++] = index;
- if (blen) // Step over before:
- index += blen;
- else // Only count one instance of empty between any two characters:
- index++;
- }
- if (!pos) // Nothing to replace
- break;
-
- if (Q_UNLIKELY(index != -1)) {
- /*
- We're about to change data, that before and after might point
- into, and we'll need that data for our next batch of indices.
- */
- if (!afterBuffer && pointsIntoRange(after, d->data(), d->size))
- after = afterBuffer = textCopy(after, alen);
-
- if (!beforeBuffer && pointsIntoRange(before, d->data(), d->size)) {
- beforeBuffer = textCopy(before, blen);
- matcher = QStringMatcher(beforeBuffer, blen, cs);
- }
- }
-
- replace_helper(indices, pos, blen, after, alen);
-
- if (Q_LIKELY(index == -1)) // Nothing left to replace
- break;
- // The call to replace_helper just moved what index points at:
- index += pos*(alen-blen);
- }
- ::free(afterBuffer);
- ::free(beforeBuffer);
-
- return *this;
-}
-
-/*!
- \overload replace()
- Replaces every occurrence of the character \a ch in the string with
- \a after and returns a reference to this string.
-
- If \a cs is Qt::CaseSensitive (default), the search is case
- sensitive; otherwise the search is case insensitive.
-*/
-QString& QString::replace(QChar ch, const QString &after, Qt::CaseSensitivity cs)
-{
- if (after.d->size == 0)
- return remove(ch, cs);
-
- if (after.d->size == 1)
- return replace(ch, after.d->data()[0], cs);
-
- if (d->size == 0)
- return *this;
-
- ushort cc = (cs == Qt::CaseSensitive ? ch.unicode() : ch.toCaseFolded().unicode());
-
- int index = 0;
- while (1) {
- uint indices[1024];
- uint pos = 0;
- if (cs == Qt::CaseSensitive) {
- while (pos < 1024 && index < d->size) {
- if (d->data()[index] == cc)
- indices[pos++] = index;
- index++;
- }
- } else {
- while (pos < 1024 && index < d->size) {
- if (QChar::toCaseFolded(d->data()[index]) == cc)
- indices[pos++] = index;
- index++;
- }
- }
- if (!pos) // Nothing to replace
- break;
-
- replace_helper(indices, pos, 1, after.constData(), after.d->size);
-
- if (Q_LIKELY(index == -1)) // Nothing left to replace
- break;
- // The call to replace_helper just moved what index points at:
- index += pos*(after.d->size - 1);
- }
- return *this;
-}
-
-/*!
- \overload replace()
- Replaces every occurrence of the character \a before with the
- character \a after and returns a reference to this string.
-
- If \a cs is Qt::CaseSensitive (default), the search is case
- sensitive; otherwise the search is case insensitive.
-*/
-QString& QString::replace(QChar before, QChar after, Qt::CaseSensitivity cs)
-{
- if (d->size) {
- const int idx = indexOf(before, 0, cs);
- if (idx != -1) {
- detach();
- const ushort a = after.unicode();
- ushort *i = d->data();
- const ushort *e = i + d->size;
- i += idx;
- *i = a;
- if (cs == Qt::CaseSensitive) {
- const ushort b = before.unicode();
- while (++i != e) {
- if (*i == b)
- *i = a;
- }
- } else {
- const ushort b = foldCase(before.unicode());
- while (++i != e) {
- if (foldCase(*i) == b)
- *i = a;
- }
- }
- }
- }
- return *this;
-}
-
-/*!
- \since 4.5
- \overload replace()
-
- Replaces every occurrence of the string \a before with the string \a
- after and returns a reference to this string.
-
- If \a cs is Qt::CaseSensitive (default), the search is case
- sensitive; otherwise the search is case insensitive.
-
- \note The text is not rescanned after a replacement.
-*/
-QString &QString::replace(QLatin1String before, QLatin1String after, Qt::CaseSensitivity cs)
-{
- int alen = after.size();
- int blen = before.size();
- QVarLengthArray<ushort> a(alen);
- QVarLengthArray<ushort> b(blen);
- qt_from_latin1(a.data(), after.latin1(), alen);
- qt_from_latin1(b.data(), before.latin1(), blen);
- return replace((const QChar *)b.data(), blen, (const QChar *)a.data(), alen, cs);
-}
-
-/*!
- \since 4.5
- \overload replace()
-
- Replaces every occurrence of the string \a before with the string \a
- after and returns a reference to this string.
-
- If \a cs is Qt::CaseSensitive (default), the search is case
- sensitive; otherwise the search is case insensitive.
-
- \note The text is not rescanned after a replacement.
-*/
-QString &QString::replace(QLatin1String before, const QString &after, Qt::CaseSensitivity cs)
-{
- int blen = before.size();
- QVarLengthArray<ushort> b(blen);
- qt_from_latin1(b.data(), before.latin1(), blen);
- return replace((const QChar *)b.data(), blen, after.constData(), after.d->size, cs);
-}
-
-/*!
- \since 4.5
- \overload replace()
-
- Replaces every occurrence of the string \a before with the string \a
- after and returns a reference to this string.
-
- If \a cs is Qt::CaseSensitive (default), the search is case
- sensitive; otherwise the search is case insensitive.
-
- \note The text is not rescanned after a replacement.
-*/
-QString &QString::replace(const QString &before, QLatin1String after, Qt::CaseSensitivity cs)
-{
- int alen = after.size();
- QVarLengthArray<ushort> a(alen);
- qt_from_latin1(a.data(), after.latin1(), alen);
- return replace(before.constData(), before.d->size, (const QChar *)a.data(), alen, cs);
-}
-
-/*!
- \since 4.5
- \overload replace()
-
- Replaces every occurrence of the character \a c with the string \a
- after and returns a reference to this string.
-
- If \a cs is Qt::CaseSensitive (default), the search is case
- sensitive; otherwise the search is case insensitive.
-
- \note The text is not rescanned after a replacement.
-*/
-QString &QString::replace(QChar c, QLatin1String after, Qt::CaseSensitivity cs)
-{
- int alen = after.size();
- QVarLengthArray<ushort> a(alen);
- qt_from_latin1(a.data(), after.latin1(), alen);
- return replace(&c, 1, (const QChar *)a.data(), alen, cs);
-}
-
-
-/*!
- \relates QString
- Returns \c true if string \a s1 is equal to string \a s2; otherwise
- returns \c false.
-
- The comparison is based exclusively on the numeric Unicode values of
- the characters and is very fast, but is not what a human would
- expect. Consider sorting user-interface strings with
- localeAwareCompare().
-*/
-bool operator==(const QString &s1, const QString &s2) Q_DECL_NOTHROW
-{
- if (s1.d->size != s2.d->size)
- return false;
-
- return qt_compare_strings(s1, s2, Qt::CaseSensitive) == 0;
-}
-
-/*!
- \overload operator==()
- Returns \c true if this string is equal to \a other; otherwise
- returns \c false.
-*/
-bool QString::operator==(QLatin1String other) const Q_DECL_NOTHROW
-{
- if (d->size != other.size())
- return false;
-
- return qt_compare_strings(*this, other, Qt::CaseSensitive) == 0;
-}
-
-/*! \fn bool QString::operator==(const QByteArray &other) const
-
- \overload operator==()
-
- The \a other byte array is converted to a QString using the
- fromUtf8() function. This function stops conversion at the
- first NUL character found, or the end of the byte array.
-
- You can disable this operator by defining \c
- QT_NO_CAST_FROM_ASCII when you compile your applications. This
- can be useful if you want to ensure that all user-visible strings
- go through QObject::tr(), for example.
-
- Returns \c true if this string is lexically equal to the parameter
- string \a other. Otherwise returns \c false.
-
- \sa QT_NO_CAST_FROM_ASCII
-*/
-
-/*! \fn bool QString::operator==(const char *other) const
-
- \overload operator==()
-
- The \a other const char pointer is converted to a QString using
- the fromUtf8() function.
-
- You can disable this operator by defining \c
- QT_NO_CAST_FROM_ASCII when you compile your applications. This
- can be useful if you want to ensure that all user-visible strings
- go through QObject::tr(), for example.
-
- \sa QT_NO_CAST_FROM_ASCII
-*/
-
-/*!
- \relates QString
- Returns \c true if string \a s1 is lexically less than string
- \a s2; otherwise returns \c false.
-
- The comparison is based exclusively on the numeric Unicode values
- of the characters and is very fast, but is not what a human would
- expect. Consider sorting user-interface strings using the
- QString::localeAwareCompare() function.
-*/
-bool operator<(const QString &s1, const QString &s2) Q_DECL_NOTHROW
-{
- return qt_compare_strings(s1, s2, Qt::CaseSensitive) < 0;
-}
-
-/*!
- \overload operator<()
-
- Returns \c true if this string is lexically less than the parameter
- string called \a other; otherwise returns \c false.
-*/
-bool QString::operator<(QLatin1String other) const Q_DECL_NOTHROW
-{
- return qt_compare_strings(*this, other, Qt::CaseSensitive) < 0;
-}
-
-/*! \fn bool QString::operator<(const QByteArray &other) const
-
- \overload operator<()
-
- The \a other byte array is converted to a QString using the
- fromUtf8() function. If any NUL characters ('\\0') are embedded
- in the byte array, they will be included in the transformation.
-
- You can disable this operator by defining \c
- QT_NO_CAST_FROM_ASCII when you compile your applications. This
- can be useful if you want to ensure that all user-visible strings
- go through QObject::tr(), for example.
-
- \sa QT_NO_CAST_FROM_ASCII
-*/
-
-/*! \fn bool QString::operator<(const char *other) const
-
- Returns \c true if this string is lexically less than string \a other.
- Otherwise returns \c false.
-
- \overload operator<()
-
- The \a other const char pointer is converted to a QString using
- the fromUtf8() function.
-
- You can disable this operator by defining \c
- QT_NO_CAST_FROM_ASCII when you compile your applications. This
- can be useful if you want to ensure that all user-visible strings
- go through QObject::tr(), for example.
-
- \sa QT_NO_CAST_FROM_ASCII
-*/
-
-/*! \fn bool operator<=(const QString &s1, const QString &s2)
-
- \relates QString
-
- Returns \c true if string \a s1 is lexically less than or equal to
- string \a s2; otherwise returns \c false.
-
- The comparison is based exclusively on the numeric Unicode values
- of the characters and is very fast, but is not what a human would
- expect. Consider sorting user-interface strings with
- localeAwareCompare().
-*/
-
-/*! \fn bool QString::operator<=(QLatin1String other) const
-
- Returns \c true if this string is lexically less than or equal to
- parameter string \a other. Otherwise returns \c false.
-
- \overload operator<=()
-*/
-
-/*! \fn bool QString::operator<=(const QByteArray &other) const
-
- \overload operator<=()
-
- The \a other byte array is converted to a QString using the
- fromUtf8() function. If any NUL characters ('\\0') are embedded
- in the byte array, they will be included in the transformation.
-
- You can disable this operator by defining \c
- QT_NO_CAST_FROM_ASCII when you compile your applications. This
- can be useful if you want to ensure that all user-visible strings
- go through QObject::tr(), for example.
-
- \sa QT_NO_CAST_FROM_ASCII
-*/
-
-/*! \fn bool QString::operator<=(const char *other) const
-
- \overload operator<=()
-
- The \a other const char pointer is converted to a QString using
- the fromUtf8() function.
-
- You can disable this operator by defining \c
- QT_NO_CAST_FROM_ASCII when you compile your applications. This
- can be useful if you want to ensure that all user-visible strings
- go through QObject::tr(), for example.
-
- \sa QT_NO_CAST_FROM_ASCII
-*/
-
-/*! \fn bool operator>(const QString &s1, const QString &s2)
- \relates QString
-
- Returns \c true if string \a s1 is lexically greater than string \a s2;
- otherwise returns \c false.
-
- The comparison is based exclusively on the numeric Unicode values
- of the characters and is very fast, but is not what a human would
- expect. Consider sorting user-interface strings with
- localeAwareCompare().
-*/
-
-/*!
- \overload operator>()
-
- Returns \c true if this string is lexically greater than the parameter
- string \a other; otherwise returns \c false.
-*/
-bool QString::operator>(QLatin1String other) const Q_DECL_NOTHROW
-{
- return qt_compare_strings(*this, other, Qt::CaseSensitive) > 0;
-}
-
-/*! \fn bool QString::operator>(const QByteArray &other) const
-
- \overload operator>()
-
- The \a other byte array is converted to a QString using the
- fromUtf8() function. If any NUL characters ('\\0') are embedded
- in the byte array, they will be included in the transformation.
-
- You can disable this operator by defining \c
- QT_NO_CAST_FROM_ASCII when you compile your applications. This
- can be useful if you want to ensure that all user-visible strings
- go through QObject::tr(), for example.
-
- \sa QT_NO_CAST_FROM_ASCII
-*/
-
-/*! \fn bool QString::operator>(const char *other) const
-
- \overload operator>()
-
- The \a other const char pointer is converted to a QString using
- the fromUtf8() function.
-
- You can disable this operator by defining \c QT_NO_CAST_FROM_ASCII
- when you compile your applications. This can be useful if you want
- to ensure that all user-visible strings go through QObject::tr(),
- for example.
-
- \sa QT_NO_CAST_FROM_ASCII
-*/
-
-/*! \fn bool operator>=(const QString &s1, const QString &s2)
- \relates QString
-
- Returns \c true if string \a s1 is lexically greater than or equal to
- string \a s2; otherwise returns \c false.
-
- The comparison is based exclusively on the numeric Unicode values
- of the characters and is very fast, but is not what a human would
- expect. Consider sorting user-interface strings with
- localeAwareCompare().
-*/
-
-/*! \fn bool QString::operator>=(QLatin1String other) const
-
- Returns \c true if this string is lexically greater than or equal to parameter
- string \a other. Otherwise returns \c false.
-
- \overload operator>=()
-*/
-
-/*! \fn bool QString::operator>=(const QByteArray &other) const
-
- \overload operator>=()
-
- The \a other byte array is converted to a QString using the
- fromUtf8() function. If any NUL characters ('\\0') are embedded in
- the byte array, they will be included in the transformation.
-
- You can disable this operator by defining \c QT_NO_CAST_FROM_ASCII
- when you compile your applications. This can be useful if you want
- to ensure that all user-visible strings go through QObject::tr(),
- for example.
-
- \sa QT_NO_CAST_FROM_ASCII
-*/
-
-/*! \fn bool QString::operator>=(const char *other) const
-
- \overload operator>=()
-
- The \a other const char pointer is converted to a QString using
- the fromUtf8() function.
-
- You can disable this operator by defining \c QT_NO_CAST_FROM_ASCII
- when you compile your applications. This can be useful if you want
- to ensure that all user-visible strings go through QObject::tr(),
- for example.
-
- \sa QT_NO_CAST_FROM_ASCII
-*/
-
-/*! \fn bool operator!=(const QString &s1, const QString &s2)
- \relates QString
-
- Returns \c true if string \a s1 is not equal to string \a s2;
- otherwise returns \c false.
-
- The comparison is based exclusively on the numeric Unicode values
- of the characters and is very fast, but is not what a human would
- expect. Consider sorting user-interface strings with
- localeAwareCompare().
-*/
-
-/*! \fn bool QString::operator!=(QLatin1String other) const
-
- Returns \c true if this string is not equal to parameter string \a other.
- Otherwise returns \c false.
-
- \overload operator!=()
-*/
-
-/*! \fn bool QString::operator!=(const QByteArray &other) const
-
- \overload operator!=()
-
- The \a other byte array is converted to a QString using the
- fromUtf8() function. If any NUL characters ('\\0') are embedded
- in the byte array, they will be included in the transformation.
-
- You can disable this operator by defining \c QT_NO_CAST_FROM_ASCII
- when you compile your applications. This can be useful if you want
- to ensure that all user-visible strings go through QObject::tr(),
- for example.
-
- \sa QT_NO_CAST_FROM_ASCII
-*/
-
-/*! \fn bool QString::operator!=(const char *other) const
-
- \overload operator!=()
-
- The \a other const char pointer is converted to a QString using
- the fromUtf8() function.
-
- You can disable this operator by defining \c
- QT_NO_CAST_FROM_ASCII when you compile your applications. This
- can be useful if you want to ensure that all user-visible strings
- go through QObject::tr(), for example.
-
- \sa QT_NO_CAST_FROM_ASCII
-*/
-
-/*!
- Returns the index position of the first occurrence of the string \a
- str in this string, searching forward from index position \a
- from. Returns -1 if \a str is not found.
-
- If \a cs is Qt::CaseSensitive (default), the search is case
- sensitive; otherwise the search is case insensitive.
-
- Example:
-
- \snippet qstring/main.cpp 24
-
- If \a from is -1, the search starts at the last character; if it is
- -2, at the next to last character and so on.
-
- \sa lastIndexOf(), contains(), count()
-*/
-int QString::indexOf(const QString &str, int from, Qt::CaseSensitivity cs) const
-{
- return qFindString(unicode(), length(), from, str.unicode(), str.length(), cs);
-}
-
-/*!
- \since 4.5
- Returns the index position of the first occurrence of the string \a
- str in this string, searching forward from index position \a
- from. Returns -1 if \a str is not found.
-
- If \a cs is Qt::CaseSensitive (default), the search is case
- sensitive; otherwise the search is case insensitive.
-
- Example:
-
- \snippet qstring/main.cpp 24
-
- If \a from is -1, the search starts at the last character; if it is
- -2, at the next to last character and so on.
-
- \sa lastIndexOf(), contains(), count()
-*/
-
-int QString::indexOf(QLatin1String str, int from, Qt::CaseSensitivity cs) const
-{
- return qt_find_latin1_string(unicode(), size(), str, from, cs);
-}
-
-int qFindString(
- const QChar *haystack0, int haystackLen, int from,
- const QChar *needle0, int needleLen, Qt::CaseSensitivity cs)
-{
- const int l = haystackLen;
- const int sl = needleLen;
- if (from < 0)
- from += l;
- if (uint(sl + from) > (uint)l)
- return -1;
- if (!sl)
- return from;
- if (!l)
- return -1;
-
- if (sl == 1)
- return findChar(haystack0, haystackLen, needle0[0], from, cs);
-
- /*
- We use the Boyer-Moore algorithm in cases where the overhead
- for the skip table should pay off, otherwise we use a simple
- hash function.
- */
- if (l > 500 && sl > 5)
- return qFindStringBoyerMoore(haystack0, haystackLen, from,
- needle0, needleLen, cs);
-
- auto sv = [sl](const ushort *v) { return QStringView(v, sl); };
- /*
- We use some hashing for efficiency's sake. Instead of
- comparing strings, we compare the hash value of str with that
- of a part of this QString. Only if that matches, we call
- qt_string_compare().
- */
- const ushort *needle = (const ushort *)needle0;
- const ushort *haystack = (const ushort *)haystack0 + from;
- const ushort *end = (const ushort *)haystack0 + (l-sl);
- const uint sl_minus_1 = sl - 1;
- uint hashNeedle = 0, hashHaystack = 0;
- int idx;
-
- if (cs == Qt::CaseSensitive) {
- for (idx = 0; idx < sl; ++idx) {
- hashNeedle = ((hashNeedle<<1) + needle[idx]);
- hashHaystack = ((hashHaystack<<1) + haystack[idx]);
- }
- hashHaystack -= haystack[sl_minus_1];
-
- while (haystack <= end) {
- hashHaystack += haystack[sl_minus_1];
- if (hashHaystack == hashNeedle
- && qt_compare_strings(sv(needle), sv(haystack), Qt::CaseSensitive) == 0)
- return haystack - (const ushort *)haystack0;
-
- REHASH(*haystack);
- ++haystack;
- }
- } else {
- const ushort *haystack_start = (const ushort *)haystack0;
- for (idx = 0; idx < sl; ++idx) {
- hashNeedle = (hashNeedle<<1) + foldCase(needle + idx, needle);
- hashHaystack = (hashHaystack<<1) + foldCase(haystack + idx, haystack_start);
- }
- hashHaystack -= foldCase(haystack + sl_minus_1, haystack_start);
-
- while (haystack <= end) {
- hashHaystack += foldCase(haystack + sl_minus_1, haystack_start);
- if (hashHaystack == hashNeedle
- && qt_compare_strings(sv(needle), sv(haystack), Qt::CaseInsensitive) == 0)
- return haystack - (const ushort *)haystack0;
-
- REHASH(foldCase(haystack, haystack_start));
- ++haystack;
- }
- }
- return -1;
-}
-
-/*!
- \overload indexOf()
-
- Returns the index position of the first occurrence of the
- character \a ch in the string, searching forward from index
- position \a from. Returns -1 if \a ch could not be found.
-*/
-int QString::indexOf(QChar ch, int from, Qt::CaseSensitivity cs) const
-{
- return findChar(unicode(), length(), ch, from, cs);
-}
-
-/*!
- \since 4.8
-
- \overload indexOf()
-
- Returns the index position of the first occurrence of the string
- reference \a str in this string, searching forward from index
- position \a from. Returns -1 if \a str is not found.
-
- If \a cs is Qt::CaseSensitive (default), the search is case
- sensitive; otherwise the search is case insensitive.
-*/
-int QString::indexOf(const QStringRef &str, int from, Qt::CaseSensitivity cs) const
-{
- return qFindString(unicode(), length(), from, str.unicode(), str.length(), cs);
-}
-
-static int lastIndexOfHelper(const ushort *haystack, int from, const ushort *needle, int sl, Qt::CaseSensitivity cs)
-{
- /*
- See indexOf() for explanations.
- */
-
- auto sv = [sl](const ushort *v) { return QStringView(v, sl); };
-
- const ushort *end = haystack;
- haystack += from;
- const uint sl_minus_1 = sl - 1;
- const ushort *n = needle+sl_minus_1;
- const ushort *h = haystack+sl_minus_1;
- uint hashNeedle = 0, hashHaystack = 0;
- int idx;
-
- if (cs == Qt::CaseSensitive) {
- for (idx = 0; idx < sl; ++idx) {
- hashNeedle = ((hashNeedle<<1) + *(n-idx));
- hashHaystack = ((hashHaystack<<1) + *(h-idx));
- }
- hashHaystack -= *haystack;
-
- while (haystack >= end) {
- hashHaystack += *haystack;
- if (hashHaystack == hashNeedle
- && qt_compare_strings(sv(needle), sv(haystack), Qt::CaseSensitive) == 0)
- return haystack - end;
- --haystack;
- REHASH(haystack[sl]);
- }
- } else {
- for (idx = 0; idx < sl; ++idx) {
- hashNeedle = ((hashNeedle<<1) + foldCase(n-idx, needle));
- hashHaystack = ((hashHaystack<<1) + foldCase(h-idx, end));
- }
- hashHaystack -= foldCase(haystack, end);
-
- while (haystack >= end) {
- hashHaystack += foldCase(haystack, end);
- if (hashHaystack == hashNeedle
- && qt_compare_strings(sv(haystack), sv(needle), Qt::CaseInsensitive) == 0)
- return haystack - end;
- --haystack;
- REHASH(foldCase(haystack + sl, end));
- }
- }
- return -1;
-}
-
-static inline int lastIndexOfHelper(
- const QStringRef &haystack, int from, const QStringRef &needle, Qt::CaseSensitivity cs)
-{
- return lastIndexOfHelper(reinterpret_cast<const ushort*>(haystack.unicode()), from,
- reinterpret_cast<const ushort*>(needle.unicode()), needle.size(), cs);
-}
-
-static inline int lastIndexOfHelper(
- const QStringRef &haystack, int from, QLatin1String needle, Qt::CaseSensitivity cs)
-{
- const int size = needle.size();
- QVarLengthArray<ushort> s(size);
- qt_from_latin1(s.data(), needle.latin1(), size);
- return lastIndexOfHelper(reinterpret_cast<const ushort*>(haystack.unicode()), from,
- s.data(), size, cs);
-}
-
-/*!
- Returns the index position of the last occurrence of the string \a
- str in this string, searching backward from index position \a
- from. If \a from is -1 (default), the search starts at the last
- character; if \a from is -2, at the next to last character and so
- on. Returns -1 if \a str is not found.
-
- If \a cs is Qt::CaseSensitive (default), the search is case
- sensitive; otherwise the search is case insensitive.
-
- Example:
-
- \snippet qstring/main.cpp 29
-
- \sa indexOf(), contains(), count()
-*/
-int QString::lastIndexOf(const QString &str, int from, Qt::CaseSensitivity cs) const
-{
- return QStringRef(this).lastIndexOf(QStringRef(&str), from, cs);
-}
-
-/*!
- \since 4.5
- \overload lastIndexOf()
-
- Returns the index position of the last occurrence of the string \a
- str in this string, searching backward from index position \a
- from. If \a from is -1 (default), the search starts at the last
- character; if \a from is -2, at the next to last character and so
- on. Returns -1 if \a str is not found.
-
- If \a cs is Qt::CaseSensitive (default), the search is case
- sensitive; otherwise the search is case insensitive.
-
- Example:
-
- \snippet qstring/main.cpp 29
-
- \sa indexOf(), contains(), count()
-*/
-int QString::lastIndexOf(QLatin1String str, int from, Qt::CaseSensitivity cs) const
-{
- return QStringRef(this).lastIndexOf(str, from, cs);
-}
-
-/*!
- \overload lastIndexOf()
-
- Returns the index position of the last occurrence of the character
- \a ch, searching backward from position \a from.
-*/
-int QString::lastIndexOf(QChar ch, int from, Qt::CaseSensitivity cs) const
-{
- return qt_last_index_of(unicode(), size(), ch, from, cs);
-}
-
-/*!
- \since 4.8
- \overload lastIndexOf()
-
- Returns the index position of the last occurrence of the string
- reference \a str in this string, searching backward from index
- position \a from. If \a from is -1 (default), the search starts at
- the last character; if \a from is -2, at the next to last character
- and so on. Returns -1 if \a str is not found.
-
- If \a cs is Qt::CaseSensitive (default), the search is case
- sensitive; otherwise the search is case insensitive.
-
- \sa indexOf(), contains(), count()
-*/
-int QString::lastIndexOf(const QStringRef &str, int from, Qt::CaseSensitivity cs) const
-{
- return QStringRef(this).lastIndexOf(str, from, cs);
-}
-
-
-#if !(defined(QT_NO_REGEXP) && !QT_CONFIG(regularexpression))
-struct QStringCapture
-{
- int pos;
- int len;
- int no;
-};
-Q_DECLARE_TYPEINFO(QStringCapture, Q_PRIMITIVE_TYPE);
-#endif
-
-#ifndef QT_NO_REGEXP
-
-/*!
- \overload replace()
-
- Replaces every occurrence of the regular expression \a rx in the
- string with \a after. Returns a reference to the string. For
- example:
-
- \snippet qstring/main.cpp 42
-
- For regular expressions containing \l{capturing parentheses},
- occurrences of \b{\\1}, \b{\\2}, ..., in \a after are replaced
- with \a{rx}.cap(1), cap(2), ...
-
- \snippet qstring/main.cpp 43
-
- \sa indexOf(), lastIndexOf(), remove(), QRegExp::cap()
-*/
-QString& QString::replace(const QRegExp &rx, const QString &after)
-{
- QRegExp rx2(rx);
-
- if (isEmpty() && rx2.indexIn(*this) == -1)
- return *this;
-
- reallocData(uint(d->size) + 1u);
-
- int index = 0;
- int numCaptures = rx2.captureCount();
- int al = after.length();
- QRegExp::CaretMode caretMode = QRegExp::CaretAtZero;
-
- if (numCaptures > 0) {
- const QChar *uc = after.unicode();
- int numBackRefs = 0;
-
- for (int i = 0; i < al - 1; i++) {
- if (uc[i] == QLatin1Char('\\')) {
- int no = uc[i + 1].digitValue();
- if (no > 0 && no <= numCaptures)
- numBackRefs++;
- }
- }
-
- /*
- This is the harder case where we have back-references.
- */
- if (numBackRefs > 0) {
- QVarLengthArray<QStringCapture, 16> captures(numBackRefs);
- int j = 0;
-
- for (int i = 0; i < al - 1; i++) {
- if (uc[i] == QLatin1Char('\\')) {
- int no = uc[i + 1].digitValue();
- if (no > 0 && no <= numCaptures) {
- QStringCapture capture;
- capture.pos = i;
- capture.len = 2;
-
- if (i < al - 2) {
- int secondDigit = uc[i + 2].digitValue();
- if (secondDigit != -1 && ((no * 10) + secondDigit) <= numCaptures) {
- no = (no * 10) + secondDigit;
- ++capture.len;
- }
- }
-
- capture.no = no;
- captures[j++] = capture;
- }
- }
- }
-
- while (index <= length()) {
- index = rx2.indexIn(*this, index, caretMode);
- if (index == -1)
- break;
-
- QString after2(after);
- for (j = numBackRefs - 1; j >= 0; j--) {
- const QStringCapture &capture = captures[j];
- after2.replace(capture.pos, capture.len, rx2.cap(capture.no));
- }
-
- replace(index, rx2.matchedLength(), after2);
- index += after2.length();
-
- // avoid infinite loop on 0-length matches (e.g., QRegExp("[a-z]*"))
- if (rx2.matchedLength() == 0)
- ++index;
-
- caretMode = QRegExp::CaretWontMatch;
- }
- return *this;
- }
- }
-
- /*
- This is the simple and optimized case where we don't have
- back-references.
- */
- while (index != -1) {
- struct {
- int pos;
- int length;
- } replacements[2048];
-
- int pos = 0;
- int adjust = 0;
- while (pos < 2047) {
- index = rx2.indexIn(*this, index, caretMode);
- if (index == -1)
- break;
- int ml = rx2.matchedLength();
- replacements[pos].pos = index;
- replacements[pos++].length = ml;
- index += ml;
- adjust += al - ml;
- // avoid infinite loop
- if (!ml)
- index++;
- }
- if (!pos)
- break;
- replacements[pos].pos = d->size;
- int newlen = d->size + adjust;
-
- // to continue searching at the right position after we did
- // the first round of replacements
- if (index != -1)
- index += adjust;
- QString newstring;
- newstring.reserve(newlen + 1);
- QChar *newuc = newstring.data();
- QChar *uc = newuc;
- int copystart = 0;
- int i = 0;
- while (i < pos) {
- int copyend = replacements[i].pos;
- int size = copyend - copystart;
- memcpy(static_cast<void*>(uc), static_cast<const void *>(d->data() + copystart), size * sizeof(QChar));
- uc += size;
- memcpy(static_cast<void *>(uc), static_cast<const void *>(after.d->data()), al * sizeof(QChar));
- uc += al;
- copystart = copyend + replacements[i].length;
- i++;
- }
- memcpy(static_cast<void *>(uc), static_cast<const void *>(d->data() + copystart), (d->size - copystart) * sizeof(QChar));
- newstring.resize(newlen);
- *this = newstring;
- caretMode = QRegExp::CaretWontMatch;
- }
- return *this;
-}
-#endif
-
-#if QT_CONFIG(regularexpression)
-/*!
- \overload replace()
- \since 5.0
-
- Replaces every occurrence of the regular expression \a re in the
- string with \a after. Returns a reference to the string. For
- example:
-
- \snippet qstring/main.cpp 87
-
- For regular expressions containing capturing groups,
- occurrences of \b{\\1}, \b{\\2}, ..., in \a after are replaced
- with the string captured by the corresponding capturing group.
-
- \snippet qstring/main.cpp 88
-
- \sa indexOf(), lastIndexOf(), remove(), QRegularExpression, QRegularExpressionMatch
-*/
-QString &QString::replace(const QRegularExpression &re, const QString &after)
-{
- if (!re.isValid()) {
- qWarning("QString::replace: invalid QRegularExpression object");
- return *this;
- }
-
- const QString copy(*this);
- QRegularExpressionMatchIterator iterator = re.globalMatch(copy);
- if (!iterator.hasNext()) // no matches at all
- return *this;
-
- reallocData(uint(d->size) + 1u);
-
- int numCaptures = re.captureCount();
-
- // 1. build the backreferences vector, holding where the backreferences
- // are in the replacement string
- QVector<QStringCapture> backReferences;
- const int al = after.length();
- const QChar *ac = after.unicode();
-
- for (int i = 0; i < al - 1; i++) {
- if (ac[i] == QLatin1Char('\\')) {
- int no = ac[i + 1].digitValue();
- if (no > 0 && no <= numCaptures) {
- QStringCapture backReference;
- backReference.pos = i;
- backReference.len = 2;
-
- if (i < al - 2) {
- int secondDigit = ac[i + 2].digitValue();
- if (secondDigit != -1 && ((no * 10) + secondDigit) <= numCaptures) {
- no = (no * 10) + secondDigit;
- ++backReference.len;
- }
- }
-
- backReference.no = no;
- backReferences.append(backReference);
- }
- }
- }
-
- // 2. iterate on the matches. For every match, copy in chunks
- // - the part before the match
- // - the after string, with the proper replacements for the backreferences
-
- int newLength = 0; // length of the new string, with all the replacements
- int lastEnd = 0;
- QVector<QStringRef> chunks;
- while (iterator.hasNext()) {
- QRegularExpressionMatch match = iterator.next();
- int len;
- // add the part before the match
- len = match.capturedStart() - lastEnd;
- if (len > 0) {
- chunks << copy.midRef(lastEnd, len);
- newLength += len;
- }
-
- lastEnd = 0;
- // add the after string, with replacements for the backreferences
- for (const QStringCapture &backReference : qAsConst(backReferences)) {
- // part of "after" before the backreference
- len = backReference.pos - lastEnd;
- if (len > 0) {
- chunks << after.midRef(lastEnd, len);
- newLength += len;
- }
-
- // backreference itself
- len = match.capturedLength(backReference.no);
- if (len > 0) {
- chunks << copy.midRef(match.capturedStart(backReference.no), len);
- newLength += len;
- }
-
- lastEnd = backReference.pos + backReference.len;
- }
-
- // add the last part of the after string
- len = after.length() - lastEnd;
- if (len > 0) {
- chunks << after.midRef(lastEnd, len);
- newLength += len;
- }
-
- lastEnd = match.capturedEnd();
- }
-
- // 3. trailing string after the last match
- if (copy.length() > lastEnd) {
- chunks << copy.midRef(lastEnd);
- newLength += copy.length() - lastEnd;
- }
-
- // 4. assemble the chunks together
- resize(newLength);
- int i = 0;
- QChar *uc = data();
- for (const QStringRef &chunk : qAsConst(chunks)) {
- int len = chunk.length();
- memcpy(uc + i, chunk.unicode(), len * sizeof(QChar));
- i += len;
- }
-
- return *this;
-}
-#endif // QT_CONFIG(regularexpression)
-
-/*!
- Returns the number of (potentially overlapping) occurrences of
- the string \a str in this string.
-
- If \a cs is Qt::CaseSensitive (default), the search is
- case sensitive; otherwise the search is case insensitive.
-
- \sa contains(), indexOf()
-*/
-
-int QString::count(const QString &str, Qt::CaseSensitivity cs) const
-{
- return qt_string_count(unicode(), size(), str.unicode(), str.size(), cs);
-}
-
-/*!
- \overload count()
-
- Returns the number of occurrences of character \a ch in the string.
-
- If \a cs is Qt::CaseSensitive (default), the search is
- case sensitive; otherwise the search is case insensitive.
-
- \sa contains(), indexOf()
-*/
-
-int QString::count(QChar ch, Qt::CaseSensitivity cs) const
-{
- return qt_string_count(unicode(), size(), ch, cs);
- }
-
-/*!
- \since 4.8
- \overload count()
- Returns the number of (potentially overlapping) occurrences of the
- string reference \a str in this string.
-
- If \a cs is Qt::CaseSensitive (default), the search is
- case sensitive; otherwise the search is case insensitive.
-
- \sa contains(), indexOf()
-*/
-int QString::count(const QStringRef &str, Qt::CaseSensitivity cs) const
-{
- return qt_string_count(unicode(), size(), str.unicode(), str.size(), cs);
-}
-
-
-/*! \fn bool QString::contains(const QString &str, Qt::CaseSensitivity cs = Qt::CaseSensitive) const
-
- Returns \c true if this string contains an occurrence of the string
- \a str; otherwise returns \c false.
-
- If \a cs is Qt::CaseSensitive (default), the search is
- case sensitive; otherwise the search is case insensitive.
-
- Example:
- \snippet qstring/main.cpp 17
-
- \sa indexOf(), count()
-*/
-
-/*! \fn bool QString::contains(QLatin1String str, Qt::CaseSensitivity cs = Qt::CaseSensitive) const
- \since 5.3
-
- \overload contains()
-
- Returns \c true if this string contains an occurrence of the latin-1 string
- \a str; otherwise returns \c false.
-*/
-
-/*! \fn bool QString::contains(QChar ch, Qt::CaseSensitivity cs = Qt::CaseSensitive) const
-
- \overload contains()
-
- Returns \c true if this string contains an occurrence of the
- character \a ch; otherwise returns \c false.
-*/
-
-/*! \fn bool QString::contains(const QStringRef &str, Qt::CaseSensitivity cs = Qt::CaseSensitive) const
- \since 4.8
-
- Returns \c true if this string contains an occurrence of the string
- reference \a str; otherwise returns \c false.
-
- If \a cs is Qt::CaseSensitive (default), the search is
- case sensitive; otherwise the search is case insensitive.
-
- \sa indexOf(), count()
-*/
-
-/*! \fn bool QString::contains(const QRegExp &rx) const
-
- \overload contains()
-
- Returns \c true if the regular expression \a rx matches somewhere in
- this string; otherwise returns \c false.
-*/
-
-/*! \fn bool QString::contains(QRegExp &rx) const
- \overload contains()
- \since 4.5
-
- Returns \c true if the regular expression \a rx matches somewhere in
- this string; otherwise returns \c false.
-
- If there is a match, the \a rx regular expression will contain the
- matched captures (see QRegExp::matchedLength, QRegExp::cap).
-*/
-
-#ifndef QT_NO_REGEXP
-/*!
- \overload indexOf()
-
- Returns the index position of the first match of the regular
- expression \a rx in the string, searching forward from index
- position \a from. Returns -1 if \a rx didn't match anywhere.
-
- Example:
-
- \snippet qstring/main.cpp 25
-*/
-int QString::indexOf(const QRegExp& rx, int from) const
-{
- QRegExp rx2(rx);
- return rx2.indexIn(*this, from);
-}
-
-/*!
- \overload indexOf()
- \since 4.5
-
- Returns the index position of the first match of the regular
- expression \a rx in the string, searching forward from index
- position \a from. Returns -1 if \a rx didn't match anywhere.
-
- If there is a match, the \a rx regular expression will contain the
- matched captures (see QRegExp::matchedLength, QRegExp::cap).
-
- Example:
-
- \snippet qstring/main.cpp 25
-*/
-int QString::indexOf(QRegExp& rx, int from) const
-{
- return rx.indexIn(*this, from);
-}
-
-/*!
- \overload lastIndexOf()
-
- Returns the index position of the last match of the regular
- expression \a rx in the string, searching backward from index
- position \a from. Returns -1 if \a rx didn't match anywhere.
-
- Example:
-
- \snippet qstring/main.cpp 30
-*/
-int QString::lastIndexOf(const QRegExp& rx, int from) const
-{
- QRegExp rx2(rx);
- return rx2.lastIndexIn(*this, from);
-}
-
-/*!
- \overload lastIndexOf()
- \since 4.5
-
- Returns the index position of the last match of the regular
- expression \a rx in the string, searching backward from index
- position \a from. Returns -1 if \a rx didn't match anywhere.
-
- If there is a match, the \a rx regular expression will contain the
- matched captures (see QRegExp::matchedLength, QRegExp::cap).
-
- Example:
-
- \snippet qstring/main.cpp 30
-*/
-int QString::lastIndexOf(QRegExp& rx, int from) const
-{
- return rx.lastIndexIn(*this, from);
-}
-
-/*!
- \overload count()
-
- Returns the number of times the regular expression \a rx matches
- in the string.
-
- This function counts overlapping matches, so in the example
- below, there are four instances of "ana" or "ama":
-
- \snippet qstring/main.cpp 18
-
-*/
-int QString::count(const QRegExp& rx) const
-{
- QRegExp rx2(rx);
- int count = 0;
- int index = -1;
- int len = length();
- while (index < len - 1) { // count overlapping matches
- index = rx2.indexIn(*this, index + 1);
- if (index == -1)
- break;
- count++;
- }
- return count;
-}
-#endif // QT_NO_REGEXP
-
-#if QT_CONFIG(regularexpression)
-/*!
- \overload indexOf()
- \since 5.0
-
- Returns the index position of the first match of the regular
- expression \a re in the string, searching forward from index
- position \a from. Returns -1 if \a re didn't match anywhere.
-
- Example:
-
- \snippet qstring/main.cpp 93
-*/
-int QString::indexOf(const QRegularExpression& re, int from) const
-{
- return indexOf(re, from, nullptr);
-}
-
-/*!
- \overload
- \since 5.5
-
- Returns the index position of the first match of the regular
- expression \a re in the string, searching forward from index
- position \a from. Returns -1 if \a re didn't match anywhere.
-
- If the match is successful and \a rmatch is not \nullptr, it also
- writes the results of the match into the QRegularExpressionMatch object
- pointed to by \a rmatch.
-
- Example:
-
- \snippet qstring/main.cpp 99
-*/
-int QString::indexOf(const QRegularExpression &re, int from, QRegularExpressionMatch *rmatch) const
-{
- if (!re.isValid()) {
- qWarning("QString::indexOf: invalid QRegularExpression object");
- return -1;
- }
-
- QRegularExpressionMatch match = re.match(*this, from);
- if (match.hasMatch()) {
- const int ret = match.capturedStart();
- if (rmatch)
- *rmatch = qMove(match);
- return ret;
- }
-
- return -1;
-}
-
-/*!
- \overload lastIndexOf()
- \since 5.0
-
- Returns the index position of the last match of the regular
- expression \a re in the string, which starts before the index
- position \a from. Returns -1 if \a re didn't match anywhere.
-
- Example:
-
- \snippet qstring/main.cpp 94
-*/
-int QString::lastIndexOf(const QRegularExpression &re, int from) const
-{
- return lastIndexOf(re, from, nullptr);
-}
-
-/*!
- \overload
- \since 5.5
-
- Returns the index position of the last match of the regular
- expression \a re in the string, which starts before the index
- position \a from. Returns -1 if \a re didn't match anywhere.
-
- If the match is successful and \a rmatch is not \nullptr, it also
- writes the results of the match into the QRegularExpressionMatch object
- pointed to by \a rmatch.
-
- Example:
-
- \snippet qstring/main.cpp 100
-*/
-int QString::lastIndexOf(const QRegularExpression &re, int from, QRegularExpressionMatch *rmatch) const
-{
- if (!re.isValid()) {
- qWarning("QString::lastIndexOf: invalid QRegularExpression object");
- return -1;
- }
-
- int endpos = (from < 0) ? (size() + from + 1) : (from + 1);
- QRegularExpressionMatchIterator iterator = re.globalMatch(*this);
- int lastIndex = -1;
- while (iterator.hasNext()) {
- QRegularExpressionMatch match = iterator.next();
- int start = match.capturedStart();
- if (start < endpos) {
- lastIndex = start;
- if (rmatch)
- *rmatch = qMove(match);
- } else {
- break;
- }
- }
-
- return lastIndex;
-}
-
-/*! \overload contains()
- \since 5.0
-
- Returns \c true if the regular expression \a re matches somewhere in
- this string; otherwise returns \c false.
-*/
-bool QString::contains(const QRegularExpression &re) const
-{
- return contains(re, nullptr);
-}
-
-/*!
- \overload contains()
- \since 5.1
-
- Returns \c true if the regular expression \a re matches somewhere in this
- string; otherwise returns \c false.
-
- If the match is successful and \a rmatch is not \nullptr, it also
- writes the results of the match into the QRegularExpressionMatch object
- pointed to by \a rmatch.
-
- \sa QRegularExpression::match()
-*/
-
-bool QString::contains(const QRegularExpression &re, QRegularExpressionMatch *rmatch) const
-{
- if (!re.isValid()) {
- qWarning("QString::contains: invalid QRegularExpression object");
- return false;
- }
- QRegularExpressionMatch m = re.match(*this);
- bool hasMatch = m.hasMatch();
- if (hasMatch && rmatch)
- *rmatch = qMove(m);
- return hasMatch;
-}
-
-/*!
- \overload count()
- \since 5.0
-
- Returns the number of times the regular expression \a re matches
- in the string.
-
- This function counts overlapping matches, so in the example
- below, there are four instances of "ana" or "ama":
-
- \snippet qstring/main.cpp 95
-*/
-int QString::count(const QRegularExpression &re) const
-{
- if (!re.isValid()) {
- qWarning("QString::count: invalid QRegularExpression object");
- return 0;
- }
- int count = 0;
- int index = -1;
- int len = length();
- while (index < len - 1) {
- QRegularExpressionMatch match = re.match(*this, index + 1);
- if (!match.hasMatch())
- break;
- index = match.capturedStart();
- count++;
- }
- return count;
-}
-#endif // QT_CONFIG(regularexpression)
-
-/*! \fn int QString::count() const
-
- \overload count()
-
- Same as size().
-*/
-
-
-/*!
- \enum QString::SectionFlag
-
- This enum specifies flags that can be used to affect various
- aspects of the section() function's behavior with respect to
- separators and empty fields.
-
- \value SectionDefault Empty fields are counted, leading and
- trailing separators are not included, and the separator is
- compared case sensitively.
-
- \value SectionSkipEmpty Treat empty fields as if they don't exist,
- i.e. they are not considered as far as \e start and \e end are
- concerned.
-
- \value SectionIncludeLeadingSep Include the leading separator (if
- any) in the result string.
-
- \value SectionIncludeTrailingSep Include the trailing separator
- (if any) in the result string.
-
- \value SectionCaseInsensitiveSeps Compare the separator
- case-insensitively.
-
- \sa section()
-*/
-
-/*!
- \fn QString QString::section(QChar sep, int start, int end = -1, SectionFlags flags) const
-
- This function returns a section of the string.
-
- This string is treated as a sequence of fields separated by the
- character, \a sep. The returned string consists of the fields from
- position \a start to position \a end inclusive. If \a end is not
- specified, all fields from position \a start to the end of the
- string are included. Fields are numbered 0, 1, 2, etc., counting
- from the left, and -1, -2, etc., counting from right to left.
-
- The \a flags argument can be used to affect some aspects of the
- function's behavior, e.g. whether to be case sensitive, whether
- to skip empty fields and how to deal with leading and trailing
- separators; see \l{SectionFlags}.
-
- \snippet qstring/main.cpp 52
-
- If \a start or \a end is negative, we count fields from the right
- of the string, the right-most field being -1, the one from
- right-most field being -2, and so on.
-
- \snippet qstring/main.cpp 53
-
- \sa split()
-*/
-
-/*!
- \overload section()
-
- \snippet qstring/main.cpp 51
- \snippet qstring/main.cpp 54
-
- \sa split()
-*/
-
-QString QString::section(const QString &sep, int start, int end, SectionFlags flags) const
-{
- const QVector<QStringRef> sections = splitRef(sep, KeepEmptyParts,
- (flags & SectionCaseInsensitiveSeps) ? Qt::CaseInsensitive : Qt::CaseSensitive);
- const int sectionsSize = sections.size();
- if (!(flags & SectionSkipEmpty)) {
- if (start < 0)
- start += sectionsSize;
- if (end < 0)
- end += sectionsSize;
- } else {
- int skip = 0;
- for (int k = 0; k < sectionsSize; ++k) {
- if (sections.at(k).isEmpty())
- skip++;
- }
- if (start < 0)
- start += sectionsSize - skip;
- if (end < 0)
- end += sectionsSize - skip;
- }
- if (start >= sectionsSize || end < 0 || start > end)
- return QString();
-
- QString ret;
- int first_i = start, last_i = end;
- for (int x = 0, i = 0; x <= end && i < sectionsSize; ++i) {
- const QStringRef &section = sections.at(i);
- const bool empty = section.isEmpty();
- if (x >= start) {
- if(x == start)
- first_i = i;
- if(x == end)
- last_i = i;
- if (x > start && i > 0)
- ret += sep;
- ret += section;
- }
- if (!empty || !(flags & SectionSkipEmpty))
- x++;
- }
- if ((flags & SectionIncludeLeadingSep) && first_i > 0)
- ret.prepend(sep);
- if ((flags & SectionIncludeTrailingSep) && last_i < sectionsSize - 1)
- ret += sep;
- return ret;
-}
-
-#if !(defined(QT_NO_REGEXP) && !QT_CONFIG(regularexpression))
-class qt_section_chunk {
-public:
- qt_section_chunk() {}
- qt_section_chunk(int l, QStringRef s) : length(l), string(qMove(s)) {}
- int length;
- QStringRef string;
-};
-Q_DECLARE_TYPEINFO(qt_section_chunk, Q_MOVABLE_TYPE);
-
-static QString extractSections(const QVector<qt_section_chunk> &sections,
- int start,
- int end,
- QString::SectionFlags flags)
-{
- const int sectionsSize = sections.size();
-
- if (!(flags & QString::SectionSkipEmpty)) {
- if (start < 0)
- start += sectionsSize;
- if (end < 0)
- end += sectionsSize;
- } else {
- int skip = 0;
- for (int k = 0; k < sectionsSize; ++k) {
- const qt_section_chunk &section = sections.at(k);
- if (section.length == section.string.length())
- skip++;
- }
- if (start < 0)
- start += sectionsSize - skip;
- if (end < 0)
- end += sectionsSize - skip;
- }
- if (start >= sectionsSize || end < 0 || start > end)
- return QString();
-
- QString ret;
- int x = 0;
- int first_i = start, last_i = end;
- for (int i = 0; x <= end && i < sectionsSize; ++i) {
- const qt_section_chunk &section = sections.at(i);
- const bool empty = (section.length == section.string.length());
- if (x >= start) {
- if (x == start)
- first_i = i;
- if (x == end)
- last_i = i;
- if (x != start)
- ret += section.string;
- else
- ret += section.string.mid(section.length);
- }
- if (!empty || !(flags & QString::SectionSkipEmpty))
- x++;
- }
-
- if ((flags & QString::SectionIncludeLeadingSep) && first_i >= 0) {
- const qt_section_chunk &section = sections.at(first_i);
- ret.prepend(section.string.left(section.length));
- }
-
- if ((flags & QString::SectionIncludeTrailingSep)
- && last_i < sectionsSize - 1) {
- const qt_section_chunk &section = sections.at(last_i+1);
- ret += section.string.left(section.length);
- }
-
- return ret;
-}
-#endif
-
-#ifndef QT_NO_REGEXP
-/*!
- \overload section()
-
- This string is treated as a sequence of fields separated by the
- regular expression, \a reg.
-
- \snippet qstring/main.cpp 55
-
- \warning Using this QRegExp version is much more expensive than
- the overloaded string and character versions.
-
- \sa split(), simplified()
-*/
-QString QString::section(const QRegExp &reg, int start, int end, SectionFlags flags) const
-{
- const QChar *uc = unicode();
- if(!uc)
- return QString();
-
- QRegExp sep(reg);
- sep.setCaseSensitivity((flags & SectionCaseInsensitiveSeps) ? Qt::CaseInsensitive
- : Qt::CaseSensitive);
-
- QVector<qt_section_chunk> sections;
- int n = length(), m = 0, last_m = 0, last_len = 0;
- while ((m = sep.indexIn(*this, m)) != -1) {
- sections.append(qt_section_chunk(last_len, QStringRef(this, last_m, m - last_m)));
- last_m = m;
- last_len = sep.matchedLength();
- m += qMax(sep.matchedLength(), 1);
- }
- sections.append(qt_section_chunk(last_len, QStringRef(this, last_m, n - last_m)));
-
- return extractSections(sections, start, end, flags);
-}
-#endif
-
-#if QT_CONFIG(regularexpression)
-/*!
- \overload section()
- \since 5.0
-
- This string is treated as a sequence of fields separated by the
- regular expression, \a re.
-
- \snippet qstring/main.cpp 89
-
- \warning Using this QRegularExpression version is much more expensive than
- the overloaded string and character versions.
-
- \sa split(), simplified()
-*/
-QString QString::section(const QRegularExpression &re, int start, int end, SectionFlags flags) const
-{
- if (!re.isValid()) {
- qWarning("QString::section: invalid QRegularExpression object");
- return QString();
- }
-
- const QChar *uc = unicode();
- if (!uc)
- return QString();
-
- QRegularExpression sep(re);
- if (flags & SectionCaseInsensitiveSeps)
- sep.setPatternOptions(sep.patternOptions() | QRegularExpression::CaseInsensitiveOption);
-
- QVector<qt_section_chunk> sections;
- int n = length(), m = 0, last_m = 0, last_len = 0;
- QRegularExpressionMatchIterator iterator = sep.globalMatch(*this);
- while (iterator.hasNext()) {
- QRegularExpressionMatch match = iterator.next();
- m = match.capturedStart();
- sections.append(qt_section_chunk(last_len, QStringRef(this, last_m, m - last_m)));
- last_m = m;
- last_len = match.capturedLength();
- }
- sections.append(qt_section_chunk(last_len, QStringRef(this, last_m, n - last_m)));
-
- return extractSections(sections, start, end, flags);
-}
-#endif // QT_CONFIG(regularexpression)
-
-/*!
- Returns a substring that contains the \a n leftmost characters
- of the string.
-
- The entire string is returned if \a n is greater than or equal
- to size(), or less than zero.
-
- \snippet qstring/main.cpp 31
-
- \sa right(), mid(), startsWith(), chopped(), chop(), truncate()
-*/
-QString QString::left(int n) const
-{
- if (uint(n) >= uint(d->size))
- return *this;
- return QString((const QChar*) d->data(), n);
-}
-
-/*!
- Returns a substring that contains the \a n rightmost characters
- of the string.
-
- The entire string is returned if \a n is greater than or equal
- to size(), or less than zero.
-
- \snippet qstring/main.cpp 48
-
- \sa left(), mid(), endsWith(), chopped(), chop(), truncate()
-*/
-QString QString::right(int n) const
-{
- if (uint(n) >= uint(d->size))
- return *this;
- return QString((const QChar*) d->data() + d->size - n, n);
-}
-
-/*!
- Returns a string that contains \a n characters of this string,
- starting at the specified \a position index.
-
- Returns a null string if the \a position index exceeds the
- length of the string. If there are less than \a n characters
- available in the string starting at the given \a position, or if
- \a n is -1 (default), the function returns all characters that
- are available from the specified \a position.
-
- Example:
-
- \snippet qstring/main.cpp 34
-
- \sa left(), right(), chopped(), chop(), truncate()
-*/
-
-QString QString::mid(int position, int n) const
-{
- using namespace QtPrivate;
- switch (QContainerImplHelper::mid(d->size, &position, &n)) {
- case QContainerImplHelper::Null:
- return QString();
- case QContainerImplHelper::Empty:
- {
- QStringDataPtr empty = { Data::allocate(0) };
- return QString(empty);
- }
- case QContainerImplHelper::Full:
- return *this;
- case QContainerImplHelper::Subset:
- return QString((const QChar*)d->data() + position, n);
- }
- Q_UNREACHABLE();
- return QString();
-}
-
-/*!
- \fn QString QString::chopped(int len) const
- \since 5.10
-
- Returns a substring that contains the size() - \a len leftmost characters
- of this string.
-
- \note The behavior is undefined if \a len is negative or greater than size().
-
- \sa endsWith(), left(), right(), mid(), chop(), truncate()
-*/
-
-#if QT_STRINGVIEW_LEVEL < 2
-/*!
- Returns \c true if the string starts with \a s; otherwise returns
- \c false.
-
- If \a cs is Qt::CaseSensitive (default), the search is
- case sensitive; otherwise the search is case insensitive.
-
- \snippet qstring/main.cpp 65
-
- \sa endsWith()
-*/
-bool QString::startsWith(const QString& s, Qt::CaseSensitivity cs) const
-{
- return qt_starts_with(*this, s, cs);
-}
-#endif
-
-/*!
- \overload startsWith()
- */
-bool QString::startsWith(QLatin1String s, Qt::CaseSensitivity cs) const
-{
- return qt_starts_with(*this, s, cs);
-}
-
-/*!
- \overload startsWith()
-
- Returns \c true if the string starts with \a c; otherwise returns
- \c false.
-*/
-bool QString::startsWith(QChar c, Qt::CaseSensitivity cs) const
-{
- return qt_starts_with(*this, c, cs);
-}
-
-#if QT_STRINGVIEW_LEVEL < 2
-/*!
- \since 4.8
- \overload
- Returns \c true if the string starts with the string reference \a s;
- otherwise returns \c false.
-
- If \a cs is Qt::CaseSensitive (default), the search is case
- sensitive; otherwise the search is case insensitive.
-
- \sa endsWith()
-*/
-bool QString::startsWith(const QStringRef &s, Qt::CaseSensitivity cs) const
-{
- return qt_starts_with(*this, s, cs);
-}
-#endif
-
-/*!
- \fn bool QString::startsWith(QStringView str, Qt::CaseSensitivity cs) const
- \since 5.10
- \overload
-
- Returns \c true if the string starts with the string-view \a str;
- otherwise returns \c false.
-
- If \a cs is Qt::CaseSensitive (default), the search is case-sensitive;
- otherwise the search is case insensitive.
-
- \sa endsWith()
-*/
-
-#if QT_STRINGVIEW_LEVEL < 2
-/*!
- Returns \c true if the string ends with \a s; otherwise returns
- \c false.
-
- If \a cs is Qt::CaseSensitive (default), the search is case
- sensitive; otherwise the search is case insensitive.
-
- \snippet qstring/main.cpp 20
-
- \sa startsWith()
-*/
-bool QString::endsWith(const QString &s, Qt::CaseSensitivity cs) const
-{
- return qt_ends_with(*this, s, cs);
-}
-
-/*!
- \since 4.8
- \overload endsWith()
- Returns \c true if the string ends with the string reference \a s;
- otherwise returns \c false.
-
- If \a cs is Qt::CaseSensitive (default), the search is case
- sensitive; otherwise the search is case insensitive.
-
- \sa startsWith()
-*/
-bool QString::endsWith(const QStringRef &s, Qt::CaseSensitivity cs) const
-{
- return qt_ends_with(*this, s, cs);
-}
-#endif // QT_STRINGVIEW_LEVEL < 2
-
-/*!
- \fn bool QString::endsWith(QStringView str, Qt::CaseSensitivity cs) const
- \since 5.10
- \overload endsWith()
- Returns \c true if the string ends with the string view \a str;
- otherwise returns \c false.
-
- If \a cs is Qt::CaseSensitive (default), the search is case
- sensitive; otherwise the search is case insensitive.
-
- \sa startsWith()
-*/
-
-/*!
- \overload endsWith()
-*/
-bool QString::endsWith(QLatin1String s, Qt::CaseSensitivity cs) const
-{
- return qt_ends_with(*this, s, cs);
-}
-
-/*!
- Returns \c true if the string ends with \a c; otherwise returns
- \c false.
-
- \overload endsWith()
- */
-bool QString::endsWith(QChar c, Qt::CaseSensitivity cs) const
-{
- return qt_ends_with(*this, c, cs);
-}
-
-/*!
- Returns \c true if the string only contains uppercase letters,
- otherwise returns \c false.
- \since 5.12
-
- \sa QChar::isUpper(), isLower()
-*/
-bool QString::isUpper() const
-{
- if (isEmpty())
- return false;
-
- const QChar *d = data();
-
- for (int i = 0, max = size(); i < max; ++i) {
- if (!d[i].isUpper())
- return false;
- }
-
- return true;
-}
-
-/*!
- Returns \c true if the string only contains lowercase letters,
- otherwise returns \c false.
- \since 5.12
-
- \sa QChar::isLower(), isUpper()
- */
-bool QString::isLower() const
-{
- if (isEmpty())
- return false;
-
- const QChar *d = data();
-
- for (int i = 0, max = size(); i < max; ++i) {
- if (!d[i].isLower())
- return false;
- }
-
- return true;
-}
-
-static QByteArray qt_convert_to_latin1(QStringView string);
-
-QByteArray QString::toLatin1_helper(const QString &string)
-{
- return qt_convert_to_latin1(string);
-}
-
-/*!
- \since 5.10
- \internal
- \relates QStringView
-
- Returns a Latin-1 representation of \a string as a QByteArray.
-
- The behavior is undefined if \a string contains non-Latin1 characters.
-
- \sa QString::toLatin1(), QStringView::toLatin1(), QtPrivate::convertToUtf8(),
- QtPrivate::convertToLocal8Bit(), QtPrivate::convertToUcs4()
-*/
-QByteArray QtPrivate::convertToLatin1(QStringView string)
-{
- return qt_convert_to_latin1(string);
-}
-
-static QByteArray qt_convert_to_latin1(QStringView string)
-{
- if (Q_UNLIKELY(string.isNull()))
- return QByteArray();
-
- QByteArray ba(string.length(), Qt::Uninitialized);
-
- // since we own the only copy, we're going to const_cast the constData;
- // that avoids an unnecessary call to detach() and expansion code that will never get used
- qt_to_latin1(reinterpret_cast<uchar *>(const_cast<char *>(ba.constData())),
- reinterpret_cast<const ushort *>(string.data()), string.length());
- return ba;
-}
-
-QByteArray QString::toLatin1_helper_inplace(QString &s)
-{
- if (!s.isDetached())
- return qt_convert_to_latin1(s);
-
- // We can return our own buffer to the caller.
- // Conversion to Latin-1 always shrinks the buffer by half.
- const ushort *data = reinterpret_cast<const ushort *>(s.constData());
- uint length = s.size();
-
- // Swap the d pointers.
- // Kids, avert your eyes. Don't try this at home.
- QArrayData *ba_d = s.d;
-
- // multiply the allocated capacity by sizeof(ushort)
- ba_d->alloc *= sizeof(ushort);
-
- // reset ourselves to QString()
- s.d = QString().d;
-
- // do the in-place conversion
- uchar *dst = reinterpret_cast<uchar *>(ba_d->data());
- qt_to_latin1(dst, data, length);
- dst[length] = '\0';
-
- QByteArrayDataPtr badptr = { ba_d };
- return QByteArray(badptr);
-}
-
-
-/*!
- \fn QByteArray QString::toLatin1() const
-
- Returns a Latin-1 representation of the string as a QByteArray.
-
- The returned byte array is undefined if the string contains non-Latin1
- characters. Those characters may be suppressed or replaced with a
- question mark.
-
- \sa fromLatin1(), toUtf8(), toLocal8Bit(), QTextCodec
-*/
-
-/*!
- \fn QByteArray QString::toAscii() const
- \deprecated
- Returns an 8-bit representation of the string as a QByteArray.
-
- This function does the same as toLatin1().
-
- Note that, despite the name, this function does not necessarily return an US-ASCII
- (ANSI X3.4-1986) string and its result may not be US-ASCII compatible.
-
- \sa fromAscii(), toLatin1(), toUtf8(), toLocal8Bit(), QTextCodec
-*/
-
-static QByteArray qt_convert_to_local_8bit(QStringView string);
-
-/*!
- \fn QByteArray QString::toLocal8Bit() const
-
- Returns the local 8-bit representation of the string as a
- QByteArray. The returned byte array is undefined if the string
- contains characters not supported by the local 8-bit encoding.
-
- QTextCodec::codecForLocale() is used to perform the conversion from
- Unicode. If the locale encoding could not be determined, this function
- does the same as toLatin1().
-
- If this string contains any characters that cannot be encoded in the
- locale, the returned byte array is undefined. Those characters may be
- suppressed or replaced by another.
-
- \sa fromLocal8Bit(), toLatin1(), toUtf8(), QTextCodec
-*/
-
-QByteArray QString::toLocal8Bit_helper(const QChar *data, int size)
-{
- return qt_convert_to_local_8bit(QStringView(data, size));
-}
-
-static QByteArray qt_convert_to_local_8bit(QStringView string)
-{
- if (string.isNull())
- return QByteArray();
-#if QT_CONFIG(textcodec)
- QTextCodec *localeCodec = QTextCodec::codecForLocale();
- if (localeCodec)
- return localeCodec->fromUnicode(string);
-#endif // textcodec
- return qt_convert_to_latin1(string);
-}
-
-/*!
- \since 5.10
- \internal
- \relates QStringView
-
- Returns a local 8-bit representation of \a string as a QByteArray.
-
- QTextCodec::codecForLocale() is used to perform the conversion from
- Unicode.
-
- The behavior is undefined if \a string contains characters not
- supported by the locale's 8-bit encoding.
-
- \sa QString::toLocal8Bit(), QStringView::toLocal8Bit()
-*/
-QByteArray QtPrivate::convertToLocal8Bit(QStringView string)
-{
- return qt_convert_to_local_8bit(string);
-}
-
-static QByteArray qt_convert_to_utf8(QStringView str);
-
-/*!
- \fn QByteArray QString::toUtf8() const
-
- Returns a UTF-8 representation of the string as a QByteArray.
-
- UTF-8 is a Unicode codec and can represent all characters in a Unicode
- string like QString.
-
- \sa fromUtf8(), toLatin1(), toLocal8Bit(), QTextCodec
-*/
-
-QByteArray QString::toUtf8_helper(const QString &str)
-{
- return qt_convert_to_utf8(str);
-}
-
-static QByteArray qt_convert_to_utf8(QStringView str)
-{
- if (str.isNull())
- return QByteArray();
-
- return QUtf8::convertFromUnicode(str.data(), str.length());
-}
-
-/*!
- \since 5.10
- \internal
- \relates QStringView
-
- Returns a UTF-8 representation of \a string as a QByteArray.
-
- UTF-8 is a Unicode codec and can represent all characters in a Unicode
- string like QStringView.
-
- \sa QString::toUtf8(), QStringView::toUtf8()
-*/
-QByteArray QtPrivate::convertToUtf8(QStringView string)
-{
- return qt_convert_to_utf8(string);
-}
-
-static QVector<uint> qt_convert_to_ucs4(QStringView string);
-
-/*!
- \since 4.2
-
- Returns a UCS-4/UTF-32 representation of the string as a QVector<uint>.
-
- UCS-4 is a Unicode codec and therefore it is lossless. All characters from
- this string will be encoded in UCS-4. Any invalid sequence of code units in
- this string is replaced by the Unicode's replacement character
- (QChar::ReplacementCharacter, which corresponds to \c{U+FFFD}).
-
- The returned vector is not \\0'-terminated.
-
- \sa fromUtf8(), toUtf8(), toLatin1(), toLocal8Bit(), QTextCodec, fromUcs4(), toWCharArray()
-*/
-QVector<uint> QString::toUcs4() const
-{
- return qt_convert_to_ucs4(*this);
-}
-
-static QVector<uint> qt_convert_to_ucs4(QStringView string)
-{
- QVector<uint> v(string.length());
- uint *a = const_cast<uint*>(v.constData());
- QStringIterator it(string);
- while (it.hasNext())
- *a++ = it.next();
- v.resize(a - v.constData());
- return v;
-}
-
-/*!
- \since 5.10
- \internal
- \relates QStringView
-
- Returns a UCS-4/UTF-32 representation of \a string as a QVector<uint>.
-
- UCS-4 is a Unicode codec and therefore it is lossless. All characters from
- this string will be encoded in UCS-4. Any invalid sequence of code units in
- this string is replaced by the Unicode's replacement character
- (QChar::ReplacementCharacter, which corresponds to \c{U+FFFD}).
-
- The returned vector is not \\0'-terminated.
-
- \sa QString::toUcs4(), QStringView::toUcs4(), QtPrivate::convertToLatin1(),
- QtPrivate::convertToLocal8Bit(), QtPrivate::convertToUtf8()
-*/
-QVector<uint> QtPrivate::convertToUcs4(QStringView string)
-{
- return qt_convert_to_ucs4(string);
-}
-
-QString::Data *QString::fromLatin1_helper(const char *str, int size)
-{
- Data *d;
- if (!str) {
- d = Data::sharedNull();
- } else if (size == 0 || (!*str && size < 0)) {
- d = Data::allocate(0);
- } else {
- if (size < 0)
- size = qstrlen(str);
- d = Data::allocate(size + 1);
- Q_CHECK_PTR(d);
- d->size = size;
- d->data()[size] = '\0';
- ushort *dst = d->data();
-
- qt_from_latin1(dst, str, uint(size));
- }
- return d;
-}
-
-QString::Data *QString::fromAscii_helper(const char *str, int size)
-{
- QString s = fromUtf8(str, size);
- s.d->ref.ref();
- return s.d;
-}
-
-/*! \fn QString QString::fromLatin1(const char *str, int size)
- Returns a QString initialized with the first \a size characters
- of the Latin-1 string \a str.
-
- If \a size is -1 (default), it is taken to be strlen(\a
- str).
-
- \sa toLatin1(), fromUtf8(), fromLocal8Bit()
-*/
-
-/*!
- \fn QString QString::fromLatin1(const QByteArray &str)
- \overload
- \since 5.0
-
- Returns a QString initialized with the Latin-1 string \a str.
-*/
-
-/*! \fn QString QString::fromLocal8Bit(const char *str, int size)
- Returns a QString initialized with the first \a size characters
- of the 8-bit string \a str.
-
- If \a size is -1 (default), it is taken to be strlen(\a
- str).
-
- QTextCodec::codecForLocale() is used to perform the conversion.
-
- \sa toLocal8Bit(), fromLatin1(), fromUtf8()
-*/
-
-/*!
- \fn QString QString::fromLocal8Bit(const QByteArray &str)
- \overload
- \since 5.0
-
- Returns a QString initialized with the 8-bit string \a str.
-*/
-QString QString::fromLocal8Bit_helper(const char *str, int size)
-{
- if (!str)
- return QString();
- if (size == 0 || (!*str && size < 0)) {
- QStringDataPtr empty = { Data::allocate(0) };
- return QString(empty);
- }
-#if QT_CONFIG(textcodec)
- if (size < 0)
- size = qstrlen(str);
- QTextCodec *codec = QTextCodec::codecForLocale();
- if (codec)
- return codec->toUnicode(str, size);
-#endif // textcodec
- return fromLatin1(str, size);
-}
-
-/*! \fn QString QString::fromAscii(const char *, int size);
- \deprecated
-
- Returns a QString initialized with the first \a size characters
- from the string \a str.
-
- If \a size is -1 (default), it is taken to be strlen(\a
- str).
-
- This function does the same as fromLatin1().
-
- \sa toAscii(), fromLatin1(), fromUtf8(), fromLocal8Bit()
-*/
-
-/*!
- \fn QString QString::fromAscii(const QByteArray &str)
- \deprecated
- \overload
- \since 5.0
-
- Returns a QString initialized with the string \a str.
-*/
-
-/*! \fn QString QString::fromUtf8(const char *str, int size)
- Returns a QString initialized with the first \a size bytes
- of the UTF-8 string \a str.
-
- If \a size is -1 (default), it is taken to be strlen(\a
- str).
-
- UTF-8 is a Unicode codec and can represent all characters in a Unicode
- string like QString. However, invalid sequences are possible with UTF-8
- and, if any such are found, they will be replaced with one or more
- "replacement characters", or suppressed. These include non-Unicode
- sequences, non-characters, overlong sequences or surrogate codepoints
- encoded into UTF-8.
-
- This function can be used to process incoming data incrementally as long as
- all UTF-8 characters are terminated within the incoming data. Any
- unterminated characters at the end of the string will be replaced or
- suppressed. In order to do stateful decoding, please use \l QTextDecoder.
-
- \sa toUtf8(), fromLatin1(), fromLocal8Bit()
-*/
-
-/*!
- \fn QString QString::fromUtf8(const QByteArray &str)
- \overload
- \since 5.0
-
- Returns a QString initialized with the UTF-8 string \a str.
-*/
-QString QString::fromUtf8_helper(const char *str, int size)
-{
- if (!str)
- return QString();
-
- Q_ASSERT(size != -1);
- return QUtf8::convertToUnicode(str, size);
-}
-
-/*!
- Returns a QString initialized with the first \a size characters
- of the Unicode string \a unicode (ISO-10646-UTF-16 encoded).
-
- If \a size is -1 (default), \a unicode must be \\0'-terminated.
-
- This function checks for a Byte Order Mark (BOM). If it is missing,
- host byte order is assumed.
-
- This function is slow compared to the other Unicode conversions.
- Use QString(const QChar *, int) or QString(const QChar *) if possible.
-
- QString makes a deep copy of the Unicode data.
-
- \sa utf16(), setUtf16(), fromStdU16String()
-*/
-QString QString::fromUtf16(const ushort *unicode, int size)
-{
- if (!unicode)
- return QString();
- if (size < 0) {
- size = 0;
- while (unicode[size] != 0)
- ++size;
- }
- return QUtf16::convertToUnicode((const char *)unicode, size*2, 0);
-}
-
-/*!
- \fn QString QString::fromUtf16(const char16_t *str, int size)
- \since 5.3
-
- Returns a QString initialized with the first \a size characters
- of the Unicode string \a str (ISO-10646-UTF-16 encoded).
-
- If \a size is -1 (default), \a str must be \\0'-terminated.
-
- This function checks for a Byte Order Mark (BOM). If it is missing,
- host byte order is assumed.
-
- This function is slow compared to the other Unicode conversions.
- Use QString(const QChar *, int) or QString(const QChar *) if possible.
-
- QString makes a deep copy of the Unicode data.
-
- \sa utf16(), setUtf16(), fromStdU16String()
-*/
-
-/*!
- \fn QString QString::fromUcs4(const char32_t *str, int size)
- \since 5.3
-
- Returns a QString initialized with the first \a size characters
- of the Unicode string \a str (ISO-10646-UCS-4 encoded).
-
- If \a size is -1 (default), \a str must be \\0'-terminated.
-
- \sa toUcs4(), fromUtf16(), utf16(), setUtf16(), fromWCharArray(), fromStdU32String()
-*/
-
-/*!
- \since 4.2
-
- Returns a QString initialized with the first \a size characters
- of the Unicode string \a unicode (ISO-10646-UCS-4 encoded).
-
- If \a size is -1 (default), \a unicode must be \\0'-terminated.
-
- \sa toUcs4(), fromUtf16(), utf16(), setUtf16(), fromWCharArray(), fromStdU32String()
-*/
-QString QString::fromUcs4(const uint *unicode, int size)
-{
- if (!unicode)
- return QString();
- if (size < 0) {
- size = 0;
- while (unicode[size] != 0)
- ++size;
- }
- return QUtf32::convertToUnicode((const char *)unicode, size*4, 0);
-}
-
-
-/*!
- Resizes the string to \a size characters and copies \a unicode
- into the string.
-
- If \a unicode is 0, nothing is copied, but the string is still
- resized to \a size.
-
- \sa unicode(), setUtf16()
-*/
-QString& QString::setUnicode(const QChar *unicode, int size)
-{
- resize(size);
- if (unicode && size)
- memcpy(d->data(), unicode, size * sizeof(QChar));
- return *this;
-}
-
-/*!
- \fn QString &QString::setUtf16(const ushort *unicode, int size)
-
- Resizes the string to \a size characters and copies \a unicode
- into the string.
-
- If \a unicode is 0, nothing is copied, but the string is still
- resized to \a size.
-
- Note that unlike fromUtf16(), this function does not consider BOMs and
- possibly differing byte ordering.
-
- \sa utf16(), setUnicode()
-*/
-
-/*!
- \fn QString QString::simplified() const
-
- Returns a string that has whitespace removed from the start
- and the end, and that has each sequence of internal whitespace
- replaced with a single space.
-
- Whitespace means any character for which QChar::isSpace() returns
- \c true. This includes the ASCII characters '\\t', '\\n', '\\v',
- '\\f', '\\r', and ' '.
-
- Example:
-
- \snippet qstring/main.cpp 57
-
- \sa trimmed()
-*/
-QString QString::simplified_helper(const QString &str)
-{
- return QStringAlgorithms<const QString>::simplified_helper(str);
-}
-
-QString QString::simplified_helper(QString &str)
-{
- return QStringAlgorithms<QString>::simplified_helper(str);
-}
-
-namespace {
- template <typename StringView>
- StringView qt_trimmed(StringView s) Q_DECL_NOTHROW
- {
- auto begin = s.begin();
- auto end = s.end();
- QStringAlgorithms<const StringView>::trimmed_helper_positions(begin, end);
- return StringView{begin, end};
- }
-}
-
-/*!
- \fn QStringView QtPrivate::trimmed(QStringView s)
- \fn QLatin1String QtPrivate::trimmed(QLatin1String s)
- \internal
- \relates QStringView
- \since 5.10
-
- Returns \a s with whitespace removed from the start and the end.
-
- Whitespace means any character for which QChar::isSpace() returns
- \c true. This includes the ASCII characters '\\t', '\\n', '\\v',
- '\\f', '\\r', and ' '.
-
- \sa QString::trimmed(), QStringView::trimmed(), QLatin1String::trimmed()
-*/
-QStringView QtPrivate::trimmed(QStringView s) Q_DECL_NOTHROW
-{
- return qt_trimmed(s);
-}
-
-QLatin1String QtPrivate::trimmed(QLatin1String s) Q_DECL_NOTHROW
-{
- return qt_trimmed(s);
-}
-
-/*!
- \fn QString QString::trimmed() const
-
- Returns a string that has whitespace removed from the start and
- the end.
-
- Whitespace means any character for which QChar::isSpace() returns
- \c true. This includes the ASCII characters '\\t', '\\n', '\\v',
- '\\f', '\\r', and ' '.
-
- Example:
-
- \snippet qstring/main.cpp 82
-
- Unlike simplified(), trimmed() leaves internal whitespace alone.
-
- \sa simplified()
-*/
-QString QString::trimmed_helper(const QString &str)
-{
- return QStringAlgorithms<const QString>::trimmed_helper(str);
-}
-
-QString QString::trimmed_helper(QString &str)
-{
- return QStringAlgorithms<QString>::trimmed_helper(str);
-}
-
-/*! \fn const QChar QString::at(int position) const
-
- Returns the character at the given index \a position in the
- string.
-
- The \a position must be a valid index position in the string
- (i.e., 0 <= \a position < size()).
-
- \sa operator[]()
-*/
-
-/*!
- \fn QCharRef QString::operator[](int position)
-
- Returns the character at the specified \a position in the string as a
- modifiable reference.
-
- Example:
-
- \snippet qstring/main.cpp 85
-
- The return value is of type QCharRef, a helper class for QString.
- When you get an object of type QCharRef, you can use it as if it
- were a reference to a QChar. If you assign to it, the assignment will apply to
- the character in the QString from which you got the reference.
-
- \sa at()
-*/
-
-/*!
- \fn const QChar QString::operator[](int position) const
-
- \overload operator[]()
-*/
-
-/*! \fn QCharRef QString::operator[](uint position)
-
-\overload operator[]()
-
-Returns the character at the specified \a position in the string as a
-modifiable reference.
-*/
-
-/*! \fn const QChar QString::operator[](uint position) const
- Equivalent to \c at(position).
-\overload operator[]()
-*/
-
-/*!
- \fn QChar QString::front() const
- \since 5.10
-
- Returns the first character in the string.
- Same as \c{at(0)}.
-
- This function is provided for STL compatibility.
-
- \warning Calling this function on an empty string constitutes
- undefined behavior.
-
- \sa back(), at(), operator[]()
-*/
-
-/*!
- \fn QChar QString::back() const
- \since 5.10
-
- Returns the last character in the string.
- Same as \c{at(size() - 1)}.
-
- This function is provided for STL compatibility.
-
- \warning Calling this function on an empty string constitutes
- undefined behavior.
-
- \sa front(), at(), operator[]()
-*/
-
-/*!
- \fn QCharRef QString::front()
- \since 5.10
-
- Returns a reference to the first character in the string.
- Same as \c{operator[](0)}.
-
- This function is provided for STL compatibility.
-
- \warning Calling this function on an empty string constitutes
- undefined behavior.
-
- \sa back(), at(), operator[]()
-*/
-
-/*!
- \fn QCharRef QString::back()
- \since 5.10
-
- Returns a reference to the last character in the string.
- Same as \c{operator[](size() - 1)}.
-
- This function is provided for STL compatibility.
-
- \warning Calling this function on an empty string constitutes
- undefined behavior.
-
- \sa front(), at(), operator[]()
-*/
-
-/*!
- \fn void QString::truncate(int position)
-
- Truncates the string at the given \a position index.
-
- If the specified \a position index is beyond the end of the
- string, nothing happens.
-
- Example:
-
- \snippet qstring/main.cpp 83
-
- If \a position is negative, it is equivalent to passing zero.
-
- \sa chop(), resize(), left(), QStringRef::truncate()
-*/
-
-void QString::truncate(int pos)
-{
- if (pos < d->size)
- resize(pos);
-}
-
-
-/*!
- Removes \a n characters from the end of the string.
-
- If \a n is greater than or equal to size(), the result is an
- empty string; if \a n is negative, it is equivalent to passing zero.
-
- Example:
- \snippet qstring/main.cpp 15
-
- If you want to remove characters from the \e beginning of the
- string, use remove() instead.
-
- \sa truncate(), resize(), remove(), QStringRef::chop()
-*/
-void QString::chop(int n)
-{
- if (n > 0)
- resize(d->size - n);
-}
-
-/*!
- Sets every character in the string to character \a ch. If \a size
- is different from -1 (default), the string is resized to \a
- size beforehand.
-
- Example:
-
- \snippet qstring/main.cpp 21
-
- \sa resize()
-*/
-
-QString& QString::fill(QChar ch, int size)
-{
- resize(size < 0 ? d->size : size);
- if (d->size) {
- QChar *i = (QChar*)d->data() + d->size;
- QChar *b = (QChar*)d->data();
- while (i != b)
- *--i = ch;
- }
- return *this;
-}
-
-/*!
- \fn int QString::length() const
-
- Returns the number of characters in this string. Equivalent to
- size().
-
- \sa resize()
-*/
-
-/*!
- \fn int QString::size() const
-
- Returns the number of characters in this string.
-
- The last character in the string is at position size() - 1.
-
- Example:
- \snippet qstring/main.cpp 58
-
- \sa isEmpty(), resize()
-*/
-
-/*! \fn bool QString::isNull() const
-
- Returns \c true if this string is null; otherwise returns \c false.
-
- Example:
-
- \snippet qstring/main.cpp 28
-
- Qt makes a distinction between null strings and empty strings for
- historical reasons. For most applications, what matters is
- whether or not a string contains any data, and this can be
- determined using the isEmpty() function.
-
- \sa isEmpty()
-*/
-
-/*! \fn bool QString::isEmpty() const
-
- Returns \c true if the string has no characters; otherwise returns
- \c false.
-
- Example:
-
- \snippet qstring/main.cpp 27
-
- \sa size()
-*/
-
-/*! \fn QString &QString::operator+=(const QString &other)
-
- Appends the string \a other onto the end of this string and
- returns a reference to this string.
-
- Example:
-
- \snippet qstring/main.cpp 84
-
- This operation is typically very fast (\l{constant time}),
- because QString preallocates extra space at the end of the string
- data so it can grow without reallocating the entire string each
- time.
-
- \sa append(), prepend()
-*/
-
-/*! \fn QString &QString::operator+=(QLatin1String str)
-
- \overload operator+=()
-
- Appends the Latin-1 string \a str to this string.
-*/
-
-/*! \fn QString &QString::operator+=(const QByteArray &ba)
-
- \overload operator+=()
-
- Appends the byte array \a ba to this string. The byte array is converted
- to Unicode using the fromUtf8() function. If any NUL characters ('\\0')
- are embedded in the \a ba byte array, they will be included in the
- transformation.
-
- You can disable this function by defining \c
- QT_NO_CAST_FROM_ASCII when you compile your applications. This
- can be useful if you want to ensure that all user-visible strings
- go through QObject::tr(), for example.
-
- \sa QT_NO_CAST_FROM_ASCII
-*/
-
-/*! \fn QString &QString::operator+=(const char *str)
-
- \overload operator+=()
-
- Appends the string \a str to this string. The const char pointer
- is converted to Unicode using the fromUtf8() function.
-
- You can disable this function by defining \c QT_NO_CAST_FROM_ASCII
- when you compile your applications. This can be useful if you want
- to ensure that all user-visible strings go through QObject::tr(),
- for example.
-
- \sa QT_NO_CAST_FROM_ASCII
-*/
-
-/*! \fn QString &QString::operator+=(const QStringRef &str)
-
- \overload operator+=()
-
- Appends the string section referenced by \a str to this string.
-*/
-
-/*! \fn QString &QString::operator+=(char ch)
-
- \overload operator+=()
-
- Appends the character \a ch to this string. Note that the character is
- converted to Unicode using the fromLatin1() function, unlike other 8-bit
- functions that operate on UTF-8 data.
-
- You can disable this function by defining \c QT_NO_CAST_FROM_ASCII
- when you compile your applications. This can be useful if you want
- to ensure that all user-visible strings go through QObject::tr(),
- for example.
-
- \sa QT_NO_CAST_FROM_ASCII
-*/
-
-/*! \fn QString &QString::operator+=(QChar ch)
-
- \overload operator+=()
-
- Appends the character \a ch to the string.
-*/
-
-/*! \fn QString &QString::operator+=(QChar::SpecialCharacter c)
-
- \overload operator+=()
-
- \internal
-*/
-
-/*!
- \fn bool operator==(const char *s1, const QString &s2)
-
- \overload operator==()
- \relates QString
-
- Returns \c true if \a s1 is equal to \a s2; otherwise returns \c false.
- Note that no string is equal to \a s1 being 0.
-
- Equivalent to \c {s1 != 0 && compare(s1, s2) == 0}.
-*/
-
-/*!
- \fn bool operator!=(const char *s1, const QString &s2)
- \relates QString
-
- Returns \c true if \a s1 is not equal to \a s2; otherwise returns
- \c false.
-
- For \a s1 != 0, this is equivalent to \c {compare(} \a s1, \a s2
- \c {) != 0}. Note that no string is equal to \a s1 being 0.
-*/
-
-/*!
- \fn bool operator<(const char *s1, const QString &s2)
- \relates QString
-
- Returns \c true if \a s1 is lexically less than \a s2; otherwise
- returns \c false. For \a s1 != 0, this is equivalent to \c
- {compare(s1, s2) < 0}.
-
- The comparison is based exclusively on the numeric Unicode values
- of the characters and is very fast, but is not what a human would
- expect. Consider sorting user-interface strings using the
- QString::localeAwareCompare() function.
-*/
-
-/*!
- \fn bool operator<=(const char *s1, const QString &s2)
- \relates QString
-
- Returns \c true if \a s1 is lexically less than or equal to \a s2;
- otherwise returns \c false. For \a s1 != 0, this is equivalent to \c
- {compare(s1, s2) <= 0}.
-
- The comparison is based exclusively on the numeric Unicode values
- of the characters and is very fast, but is not what a human would
- expect. Consider sorting user-interface strings with
- QString::localeAwareCompare().
-*/
-
-/*!
- \fn bool operator>(const char *s1, const QString &s2)
- \relates QString
-
- Returns \c true if \a s1 is lexically greater than \a s2; otherwise
- returns \c false. Equivalent to \c {compare(s1, s2) > 0}.
-
- The comparison is based exclusively on the numeric Unicode values
- of the characters and is very fast, but is not what a human would
- expect. Consider sorting user-interface strings using the
- QString::localeAwareCompare() function.
-*/
-
-/*!
- \fn bool operator>=(const char *s1, const QString &s2)
- \relates QString
-
- Returns \c true if \a s1 is lexically greater than or equal to \a s2;
- otherwise returns \c false. For \a s1 != 0, this is equivalent to \c
- {compare(s1, s2) >= 0}.
-
- The comparison is based exclusively on the numeric Unicode values
- of the characters and is very fast, but is not what a human would
- expect. Consider sorting user-interface strings using the
- QString::localeAwareCompare() function.
-*/
-
-/*!
- \fn const QString operator+(const QString &s1, const QString &s2)
- \relates QString
-
- Returns a string which is the result of concatenating \a s1 and \a
- s2.
-*/
-
-/*!
- \fn const QString operator+(const QString &s1, const char *s2)
- \relates QString
-
- Returns a string which is the result of concatenating \a s1 and \a
- s2 (\a s2 is converted to Unicode using the QString::fromUtf8()
- function).
-
- \sa QString::fromUtf8()
-*/
-
-/*!
- \fn const QString operator+(const char *s1, const QString &s2)
- \relates QString
-
- Returns a string which is the result of concatenating \a s1 and \a
- s2 (\a s1 is converted to Unicode using the QString::fromUtf8()
- function).
-
- \sa QString::fromUtf8()
-*/
-
-/*!
- \fn const QString operator+(const QString &s, char ch)
- \relates QString
-
- Returns a string which is the result of concatenating the string
- \a s and the character \a ch.
-*/
-
-/*!
- \fn const QString operator+(char ch, const QString &s)
- \relates QString
-
- Returns a string which is the result of concatenating the
- character \a ch and the string \a s.
-*/
-
-/*!
- \fn int QString::compare(const QString &s1, const QString &s2, Qt::CaseSensitivity cs)
- \since 4.2
-
- Compares \a s1 with \a s2 and returns an integer less than, equal
- to, or greater than zero if \a s1 is less than, equal to, or
- greater than \a s2.
-
- If \a cs is Qt::CaseSensitive, the comparison is case sensitive;
- otherwise the comparison is case insensitive.
-
- Case sensitive comparison is based exclusively on the numeric
- Unicode values of the characters and is very fast, but is not what
- a human would expect. Consider sorting user-visible strings with
- localeAwareCompare().
-
- \snippet qstring/main.cpp 16
-
- \sa operator==(), operator<(), operator>()
-*/
-
-/*!
- \fn int QString::compare(const QString &s1, QLatin1String s2, Qt::CaseSensitivity cs)
- \since 4.2
- \overload compare()
-
- Performs a comparison of \a s1 and \a s2, using the case
- sensitivity setting \a cs.
-*/
-
-/*!
- \fn int QString::compare(QLatin1String s1, const QString &s2, Qt::CaseSensitivity cs = Qt::CaseSensitive)
-
- \since 4.2
- \overload compare()
-
- Performs a comparison of \a s1 and \a s2, using the case
- sensitivity setting \a cs.
-*/
-
-/*!
- \fn int QString::compare(QStringView s, Qt::CaseSensitivity cs = Qt::CaseSensitive) const
-
- \since 5.12
- \overload compare()
-
- Performs a comparison of this with \a s, using the case
- sensitivity setting \a cs.
-*/
-
-#if QT_STRINGVIEW_LEVEL < 2
-/*!
- \overload compare()
- \since 4.2
-
- Lexically compares this string with the \a other string and
- returns an integer less than, equal to, or greater than zero if
- this string is less than, equal to, or greater than the other
- string.
-
- Same as compare(*this, \a other, \a cs).
-*/
-int QString::compare(const QString &other, Qt::CaseSensitivity cs) const Q_DECL_NOTHROW
-{
- return qt_compare_strings(*this, other, cs);
-}
-#endif
-
-/*!
- \internal
- \since 4.5
-*/
-int QString::compare_helper(const QChar *data1, int length1, const QChar *data2, int length2,
- Qt::CaseSensitivity cs) Q_DECL_NOTHROW
-{
- Q_ASSERT(length1 >= 0);
- Q_ASSERT(length2 >= 0);
- Q_ASSERT(data1 || length1 == 0);
- Q_ASSERT(data2 || length2 == 0);
- return qt_compare_strings(QStringView(data1, length1), QStringView(data2, length2), cs);
-}
-
-/*!
- \overload compare()
- \since 4.2
-
- Same as compare(*this, \a other, \a cs).
-*/
-int QString::compare(QLatin1String other, Qt::CaseSensitivity cs) const Q_DECL_NOTHROW
-{
- return qt_compare_strings(*this, other, cs);
-}
-
-#if QT_STRINGVIEW_LEVEL < 2
-/*!
- \fn int QString::compare(const QStringRef &ref, Qt::CaseSensitivity cs = Qt::CaseSensitive) const
- \overload compare()
-
- Compares the string reference, \a ref, with the string and returns
- an integer less than, equal to, or greater than zero if the string
- is less than, equal to, or greater than \a ref.
-*/
-#endif
-
-/*!
- \internal
- \since 5.0
-*/
-int QString::compare_helper(const QChar *data1, int length1, const char *data2, int length2,
- Qt::CaseSensitivity cs)
-{
- Q_ASSERT(length1 >= 0);
- Q_ASSERT(data1 || length1 == 0);
- if (!data2)
- return length1;
- if (Q_UNLIKELY(length2 < 0))
- length2 = int(strlen(data2));
- // ### make me nothrow in all cases
- QVarLengthArray<ushort> s2(length2);
- const auto beg = reinterpret_cast<QChar *>(s2.data());
- const auto end = QUtf8::convertToUnicode(beg, data2, length2);
- return qt_compare_strings(QStringView(data1, length1), QStringView(beg, end - beg), cs);
-}
-
-/*!
- \fn int QString::compare(const QString &s1, const QStringRef &s2, Qt::CaseSensitivity cs = Qt::CaseSensitive)
- \overload compare()
-*/
-
-/*!
- \internal
- \since 4.5
-*/
-int QString::compare_helper(const QChar *data1, int length1, QLatin1String s2,
- Qt::CaseSensitivity cs) Q_DECL_NOTHROW
-{
- Q_ASSERT(length1 >= 0);
- Q_ASSERT(data1 || length1 == 0);
- return qt_compare_strings(QStringView(data1, length1), s2, cs);
-}
-
-/*!
- \fn int QString::localeAwareCompare(const QString & s1, const QString & s2)
-
- Compares \a s1 with \a s2 and returns an integer less than, equal
- to, or greater than zero if \a s1 is less than, equal to, or
- greater than \a s2.
-
- The comparison is performed in a locale- and also
- platform-dependent manner. Use this function to present sorted
- lists of strings to the user.
-
- On \macos and iOS this function compares according the
- "Order for sorted lists" setting in the International preferences panel.
-
- \sa compare(), QLocale
-*/
-
-/*!
- \fn int QString::localeAwareCompare(const QStringRef &other) const
- \since 4.5
- \overload localeAwareCompare()
-
- Compares this string with the \a other string and returns an
- integer less than, equal to, or greater than zero if this string
- is less than, equal to, or greater than the \a other string.
-
- The comparison is performed in a locale- and also
- platform-dependent manner. Use this function to present sorted
- lists of strings to the user.
-
- Same as \c {localeAwareCompare(*this, other)}.
-*/
-
-/*!
- \fn int QString::localeAwareCompare(const QString &s1, const QStringRef &s2)
- \since 4.5
- \overload localeAwareCompare()
-
- Compares \a s1 with \a s2 and returns an integer less than, equal
- to, or greater than zero if \a s1 is less than, equal to, or
- greater than \a s2.
-
- The comparison is performed in a locale- and also
- platform-dependent manner. Use this function to present sorted
- lists of strings to the user.
-*/
-
-
-#if !defined(CSTR_LESS_THAN)
-#define CSTR_LESS_THAN 1
-#define CSTR_EQUAL 2
-#define CSTR_GREATER_THAN 3
-#endif
-
-/*!
- \overload localeAwareCompare()
-
- Compares this string with the \a other string and returns an
- integer less than, equal to, or greater than zero if this string
- is less than, equal to, or greater than the \a other string.
-
- The comparison is performed in a locale- and also
- platform-dependent manner. Use this function to present sorted
- lists of strings to the user.
-
- Same as \c {localeAwareCompare(*this, other)}.
-*/
-int QString::localeAwareCompare(const QString &other) const
-{
- return localeAwareCompare_helper(constData(), length(), other.constData(), other.length());
-}
-
-#if QT_CONFIG(icu)
-Q_GLOBAL_STATIC(QThreadStorage<QCollator>, defaultCollator)
-#endif
-
-/*!
- \internal
- \since 4.5
-*/
-int QString::localeAwareCompare_helper(const QChar *data1, int length1,
- const QChar *data2, int length2)
-{
- Q_ASSERT(length1 >= 0);
- Q_ASSERT(data1 || length1 == 0);
- Q_ASSERT(length2 >= 0);
- Q_ASSERT(data2 || length2 == 0);
-
- // do the right thing for null and empty
- if (length1 == 0 || length2 == 0)
- return qt_compare_strings(QStringView(data1, length1), QStringView(data2, length2),
- Qt::CaseSensitive);
-
-#if QT_CONFIG(icu)
- if (!defaultCollator()->hasLocalData())
- defaultCollator()->setLocalData(QCollator());
- return defaultCollator()->localData().compare(data1, length1, data2, length2);
-#else
- const QString lhs = QString::fromRawData(data1, length1).normalized(QString::NormalizationForm_C);
- const QString rhs = QString::fromRawData(data2, length2).normalized(QString::NormalizationForm_C);
-# if defined(Q_OS_WIN)
- int res = CompareStringEx(LOCALE_NAME_USER_DEFAULT, 0, (LPWSTR)lhs.constData(), lhs.length(), (LPWSTR)rhs.constData(), rhs.length(), NULL, NULL, 0);
-
- switch (res) {
- case CSTR_LESS_THAN:
- return -1;
- case CSTR_GREATER_THAN:
- return 1;
- default:
- return 0;
- }
-# elif defined (Q_OS_DARWIN)
- // Use CFStringCompare for comparing strings on Mac. This makes Qt order
- // strings the same way as native applications do, and also respects
- // the "Order for sorted lists" setting in the International preferences
- // panel.
- const CFStringRef thisString =
- CFStringCreateWithCharactersNoCopy(kCFAllocatorDefault,
- reinterpret_cast<const UniChar *>(lhs.constData()), lhs.length(), kCFAllocatorNull);
- const CFStringRef otherString =
- CFStringCreateWithCharactersNoCopy(kCFAllocatorDefault,
- reinterpret_cast<const UniChar *>(rhs.constData()), rhs.length(), kCFAllocatorNull);
-
- const int result = CFStringCompare(thisString, otherString, kCFCompareLocalized);
- CFRelease(thisString);
- CFRelease(otherString);
- return result;
-# elif defined(Q_OS_UNIX)
- // declared in <string.h>
- int delta = strcoll(lhs.toLocal8Bit().constData(), rhs.toLocal8Bit().constData());
- if (delta == 0)
- delta = qt_compare_strings(lhs, rhs, Qt::CaseSensitive);
- return delta;
-# else
-# error "This case shouldn't happen"
- return qt_compare_strings(lhs, rhs, Qt::CaseSensitive);
-# endif
-#endif // !QT_CONFIG(icu)
-}
-
-
-/*!
- \fn const QChar *QString::unicode() const
-
- Returns a Unicode representation of the string.
- The result remains valid until the string is modified.
-
- \note The returned string may not be '\\0'-terminated.
- Use size() to determine the length of the array.
-
- \sa utf16(), fromRawData()
-*/
-
-/*!
- \fn const ushort *QString::utf16() const
-
- Returns the QString as a '\\0\'-terminated array of unsigned
- shorts. The result remains valid until the string is modified.
-
- The returned string is in host byte order.
-
- \sa unicode()
-*/
-
-const ushort *QString::utf16() const
-{
- if (IS_RAW_DATA(d)) {
- // ensure '\0'-termination for ::fromRawData strings
- const_cast<QString*>(this)->reallocData(uint(d->size) + 1u);
- }
- return d->data();
-}
-
-/*!
- Returns a string of size \a width that contains this string
- padded by the \a fill character.
-
- If \a truncate is \c false and the size() of the string is more than
- \a width, then the returned string is a copy of the string.
-
- \snippet qstring/main.cpp 32
-
- If \a truncate is \c true and the size() of the string is more than
- \a width, then any characters in a copy of the string after
- position \a width are removed, and the copy is returned.
-
- \snippet qstring/main.cpp 33
-
- \sa rightJustified()
-*/
-
-QString QString::leftJustified(int width, QChar fill, bool truncate) const
-{
- QString result;
- int len = length();
- int padlen = width - len;
- if (padlen > 0) {
- result.resize(len+padlen);
- if (len)
- memcpy(result.d->data(), d->data(), sizeof(QChar)*len);
- QChar *uc = (QChar*)result.d->data() + len;
- while (padlen--)
- * uc++ = fill;
- } else {
- if (truncate)
- result = left(width);
- else
- result = *this;
- }
- return result;
-}
-
-/*!
- Returns a string of size() \a width that contains the \a fill
- character followed by the string. For example:
-
- \snippet qstring/main.cpp 49
-
- If \a truncate is \c false and the size() of the string is more than
- \a width, then the returned string is a copy of the string.
-
- If \a truncate is true and the size() of the string is more than
- \a width, then the resulting string is truncated at position \a
- width.
-
- \snippet qstring/main.cpp 50
-
- \sa leftJustified()
-*/
-
-QString QString::rightJustified(int width, QChar fill, bool truncate) const
-{
- QString result;
- int len = length();
- int padlen = width - len;
- if (padlen > 0) {
- result.resize(len+padlen);
- QChar *uc = (QChar*)result.d->data();
- while (padlen--)
- * uc++ = fill;
- if (len)
- memcpy(static_cast<void *>(uc), static_cast<const void *>(d->data()), sizeof(QChar)*len);
- } else {
- if (truncate)
- result = left(width);
- else
- result = *this;
- }
- return result;
-}
-
-/*!
- \fn QString QString::toLower() const
-
- Returns a lowercase copy of the string.
-
- \snippet qstring/main.cpp 75
-
- The case conversion will always happen in the 'C' locale. For locale dependent
- case folding use QLocale::toLower()
-
- \sa toUpper(), QLocale::toLower()
-*/
-
-namespace QUnicodeTables {
-/*
- \internal
- Converts the \a str string starting from the position pointed to by the \a
- it iterator, using the Unicode case traits \c Traits, and returns the
- result. The input string must not be empty (the convertCase function below
- guarantees that).
-
- The string type \c{T} is also a template and is either \c{const QString} or
- \c{QString}. This function can do both copy-conversion and in-place
- conversion depending on the state of the \a str parameter:
- \list
- \li \c{T} is \c{const QString}: copy-convert
- \li \c{T} is \c{QString} and its refcount != 1: copy-convert
- \li \c{T} is \c{QString} and its refcount == 1: in-place convert
- \endlist
-
- In copy-convert mode, the local variable \c{s} is detached from the input
- \a str. In the in-place convert mode, \a str is in moved-from state (which
- this function requires to be a valid, empty string) and \c{s} contains the
- only copy of the string, without reallocation (thus, \a it is still valid).
-
- There is one pathological case left: when the in-place conversion needs to
- reallocate memory to grow the buffer. In that case, we need to adjust the \a
- it pointer.
- */
-template <typename Traits, typename T>
-Q_NEVER_INLINE
-static QString detachAndConvertCase(T &str, QStringIterator it)
-{
- Q_ASSERT(!str.isEmpty());
- QString s = qMove(str); // will copy if T is const QString
- QChar *pp = s.begin() + it.index(); // will detach if necessary
-
- do {
- uint uc = it.nextUnchecked();
-
- const QUnicodeTables::Properties *prop = qGetProp(uc);
- signed short caseDiff = Traits::caseDiff(prop);
-
- if (Q_UNLIKELY(Traits::caseSpecial(prop))) {
- const ushort *specialCase = specialCaseMap + caseDiff;
- ushort length = *specialCase++;
-
- if (Q_LIKELY(length == 1)) {
- *pp++ = QChar(*specialCase);
- } else {
- // slow path: the string is growing
- int inpos = it.index() - 1;
- int outpos = pp - s.constBegin();
-
- s.replace(outpos, 1, reinterpret_cast<const QChar *>(specialCase), length);
- pp = const_cast<QChar *>(s.constBegin()) + outpos + length;
-
- // do we need to adjust the input iterator too?
- // if it is pointing to s's data, str is empty
- if (str.isEmpty())
- it = QStringIterator(s.constBegin(), inpos + length, s.constEnd());
- }
- } else if (Q_UNLIKELY(QChar::requiresSurrogates(uc))) {
- // so far, case convertion never changes planes (guaranteed by the qunicodetables generator)
- pp++;
- *pp++ = QChar::lowSurrogate(uc + caseDiff);
- } else {
- *pp++ = QChar(uc + caseDiff);
- }
- } while (it.hasNext());
-
- return s;
-}
-
-template <typename Traits, typename T>
-static QString convertCase(T &str)
-{
- const QChar *p = str.constBegin();
- const QChar *e = p + str.size();
-
- // this avoids out of bounds check in the loop
- while (e != p && e[-1].isHighSurrogate())
- --e;
-
- QStringIterator it(p, e);
- while (it.hasNext()) {
- uint uc = it.nextUnchecked();
- if (Traits::caseDiff(qGetProp(uc))) {
- it.recedeUnchecked();
- return detachAndConvertCase<Traits>(str, it);
- }
- }
- return qMove(str);
-}
-} // namespace QUnicodeTables
-
-QString QString::toLower_helper(const QString &str)
-{
- return QUnicodeTables::convertCase<QUnicodeTables::LowercaseTraits>(str);
-}
-
-QString QString::toLower_helper(QString &str)
-{
- return QUnicodeTables::convertCase<QUnicodeTables::LowercaseTraits>(str);
-}
-
-/*!
- \fn QString QString::toCaseFolded() const
-
- Returns the case folded equivalent of the string. For most Unicode
- characters this is the same as toLower().
-*/
-
-QString QString::toCaseFolded_helper(const QString &str)
-{
- return QUnicodeTables::convertCase<QUnicodeTables::CasefoldTraits>(str);
-}
-
-QString QString::toCaseFolded_helper(QString &str)
-{
- return QUnicodeTables::convertCase<QUnicodeTables::CasefoldTraits>(str);
-}
-
-/*!
- \fn QString QString::toUpper() const
-
- Returns an uppercase copy of the string.
-
- \snippet qstring/main.cpp 81
-
- The case conversion will always happen in the 'C' locale. For locale dependent
- case folding use QLocale::toUpper()
-
- \sa toLower(), QLocale::toLower()
-*/
-
-QString QString::toUpper_helper(const QString &str)
-{
- return QUnicodeTables::convertCase<QUnicodeTables::UppercaseTraits>(str);
-}
-
-QString QString::toUpper_helper(QString &str)
-{
- return QUnicodeTables::convertCase<QUnicodeTables::UppercaseTraits>(str);
-}
-
-/*!
- \obsolete
-
- Use asprintf(), arg() or QTextStream instead.
-*/
-QString &QString::sprintf(const char *cformat, ...)
-{
- va_list ap;
- va_start(ap, cformat);
- *this = vasprintf(cformat, ap);
- va_end(ap);
- return *this;
-}
-
-// ### Qt 6: Consider whether this function shouldn't be removed See task 202871.
-/*!
- \since 5.5
-
- Safely builds a formatted string from the format string \a cformat
- and an arbitrary list of arguments.
-
- The format string supports the conversion specifiers, length modifiers,
- and flags provided by printf() in the standard C++ library. The \a cformat
- string and \c{%s} arguments must be UTF-8 encoded.
-
- \note The \c{%lc} escape sequence expects a unicode character of type
- \c char16_t, or \c ushort (as returned by QChar::unicode()).
- The \c{%ls} escape sequence expects a pointer to a zero-terminated array
- of unicode characters of type \c char16_t, or ushort (as returned by
- QString::utf16()). This is at odds with the printf() in the standard C++
- library, which defines \c {%lc} to print a wchar_t and \c{%ls} to print
- a \c{wchar_t*}, and might also produce compiler warnings on platforms
- where the size of \c {wchar_t} is not 16 bits.
-
- \warning We do not recommend using QString::asprintf() in new Qt
- code. Instead, consider using QTextStream or arg(), both of
- which support Unicode strings seamlessly and are type-safe.
- Here is an example that uses QTextStream:
-
- \snippet qstring/main.cpp 64
-
- For \l {QObject::tr()}{translations}, especially if the strings
- contains more than one escape sequence, you should consider using
- the arg() function instead. This allows the order of the
- replacements to be controlled by the translator.
-
- \sa arg()
-*/
-
-QString QString::asprintf(const char *cformat, ...)
-{
- va_list ap;
- va_start(ap, cformat);
- const QString s = vasprintf(cformat, ap);
- va_end(ap);
- return s;
-}
-
-/*!
- \obsolete
-
- Use vasprintf(), arg() or QTextStream instead.
-*/
-QString &QString::vsprintf(const char *cformat, va_list ap)
-{
- return *this = vasprintf(cformat, ap);
-}
-
-static void append_utf8(QString &qs, const char *cs, int len)
-{
- const int oldSize = qs.size();
- qs.resize(oldSize + len);
- const QChar *newEnd = QUtf8::convertToUnicode(qs.data() + oldSize, cs, len);
- qs.resize(newEnd - qs.constData());
-}
-
-static uint parse_flag_characters(const char * &c) Q_DECL_NOTHROW
-{
- uint flags = QLocaleData::ZeroPadExponent;
- while (true) {
- switch (*c) {
- case '#':
- flags |= QLocaleData::ShowBase | QLocaleData::AddTrailingZeroes
- | QLocaleData::ForcePoint;
- break;
- case '0': flags |= QLocaleData::ZeroPadded; break;
- case '-': flags |= QLocaleData::LeftAdjusted; break;
- case ' ': flags |= QLocaleData::BlankBeforePositive; break;
- case '+': flags |= QLocaleData::AlwaysShowSign; break;
- case '\'': flags |= QLocaleData::ThousandsGroup; break;
- default: return flags;
- }
- ++c;
- }
-}
-
-static int parse_field_width(const char * &c)
-{
- Q_ASSERT(qIsDigit(*c));
-
- // can't be negative - started with a digit
- // contains at least one digit
- const char *endp;
- bool ok;
- const qulonglong result = qstrtoull(c, &endp, 10, &ok);
- c = endp;
- while (qIsDigit(*c)) // preserve Qt 5.5 behavior of consuming all digits, no matter how many
- ++c;
- return ok && result < qulonglong(std::numeric_limits<int>::max()) ? int(result) : 0;
-}
-
-enum LengthMod { lm_none, lm_hh, lm_h, lm_l, lm_ll, lm_L, lm_j, lm_z, lm_t };
-
-static inline bool can_consume(const char * &c, char ch) Q_DECL_NOTHROW
-{
- if (*c == ch) {
- ++c;
- return true;
- }
- return false;
-}
-
-static LengthMod parse_length_modifier(const char * &c) Q_DECL_NOTHROW
-{
- switch (*c++) {
- case 'h': return can_consume(c, 'h') ? lm_hh : lm_h;
- case 'l': return can_consume(c, 'l') ? lm_ll : lm_l;
- case 'L': return lm_L;
- case 'j': return lm_j;
- case 'z':
- case 'Z': return lm_z;
- case 't': return lm_t;
- }
- --c; // don't consume *c - it wasn't a flag
- return lm_none;
-}
-
-/*!
- \fn QString QString::vasprintf(const char *cformat, va_list ap)
- \since 5.5
-
- Equivalent method to asprintf(), but takes a va_list \a ap
- instead a list of variable arguments. See the asprintf()
- documentation for an explanation of \a cformat.
-
- This method does not call the va_end macro, the caller
- is responsible to call va_end on \a ap.
-
- \sa asprintf()
-*/
-
-QString QString::vasprintf(const char *cformat, va_list ap)
-{
- if (!cformat || !*cformat) {
- // Qt 1.x compat
- return fromLatin1("");
- }
-
- // Parse cformat
-
- QString result;
- const char *c = cformat;
- for (;;) {
- // Copy non-escape chars to result
- const char *cb = c;
- while (*c != '\0' && *c != '%')
- c++;
- append_utf8(result, cb, int(c - cb));
-
- if (*c == '\0')
- break;
-
- // Found '%'
- const char *escape_start = c;
- ++c;
-
- if (*c == '\0') {
- result.append(QLatin1Char('%')); // a % at the end of the string - treat as non-escape text
- break;
- }
- if (*c == '%') {
- result.append(QLatin1Char('%')); // %%
- ++c;
- continue;
- }
-
- uint flags = parse_flag_characters(c);
-
- if (*c == '\0') {
- result.append(QLatin1String(escape_start)); // incomplete escape, treat as non-escape text
- break;
- }
-
- // Parse field width
- int width = -1; // -1 means unspecified
- if (qIsDigit(*c)) {
- width = parse_field_width(c);
- } else if (*c == '*') { // can't parse this in another function, not portably, at least
- width = va_arg(ap, int);
- if (width < 0)
- width = -1; // treat all negative numbers as unspecified
- ++c;
- }
-
- if (*c == '\0') {
- result.append(QLatin1String(escape_start)); // incomplete escape, treat as non-escape text
- break;
- }
-
- // Parse precision
- int precision = -1; // -1 means unspecified
- if (*c == '.') {
- ++c;
- if (qIsDigit(*c)) {
- precision = parse_field_width(c);
- } else if (*c == '*') { // can't parse this in another function, not portably, at least
- precision = va_arg(ap, int);
- if (precision < 0)
- precision = -1; // treat all negative numbers as unspecified
- ++c;
- }
- }
-
- if (*c == '\0') {
- result.append(QLatin1String(escape_start)); // incomplete escape, treat as non-escape text
- break;
- }
-
- const LengthMod length_mod = parse_length_modifier(c);
-
- if (*c == '\0') {
- result.append(QLatin1String(escape_start)); // incomplete escape, treat as non-escape text
- break;
- }
-
- // Parse the conversion specifier and do the conversion
- QString subst;
- switch (*c) {
- case 'd':
- case 'i': {
- qint64 i;
- switch (length_mod) {
- case lm_none: i = va_arg(ap, int); break;
- case lm_hh: i = va_arg(ap, int); break;
- case lm_h: i = va_arg(ap, int); break;
- case lm_l: i = va_arg(ap, long int); break;
- case lm_ll: i = va_arg(ap, qint64); break;
- case lm_j: i = va_arg(ap, long int); break;
- case lm_z: i = va_arg(ap, size_t); break;
- case lm_t: i = va_arg(ap, int); break;
- default: i = 0; break;
- }
- subst = QLocaleData::c()->longLongToString(i, precision, 10, width, flags);
- ++c;
- break;
- }
- case 'o':
- case 'u':
- case 'x':
- case 'X': {
- quint64 u;
- switch (length_mod) {
- case lm_none: u = va_arg(ap, uint); break;
- case lm_hh: u = va_arg(ap, uint); break;
- case lm_h: u = va_arg(ap, uint); break;
- case lm_l: u = va_arg(ap, ulong); break;
- case lm_ll: u = va_arg(ap, quint64); break;
- case lm_z: u = va_arg(ap, size_t); break;
- default: u = 0; break;
- }
-
- if (qIsUpper(*c))
- flags |= QLocaleData::CapitalEorX;
-
- int base = 10;
- switch (qToLower(*c)) {
- case 'o':
- base = 8; break;
- case 'u':
- base = 10; break;
- case 'x':
- base = 16; break;
- default: break;
- }
- subst = QLocaleData::c()->unsLongLongToString(u, precision, base, width, flags);
- ++c;
- break;
- }
- case 'E':
- case 'e':
- case 'F':
- case 'f':
- case 'G':
- case 'g':
- case 'A':
- case 'a': {
- double d;
- if (length_mod == lm_L)
- d = va_arg(ap, long double); // not supported - converted to a double
- else
- d = va_arg(ap, double);
-
- if (qIsUpper(*c))
- flags |= QLocaleData::CapitalEorX;
-
- QLocaleData::DoubleForm form = QLocaleData::DFDecimal;
- switch (qToLower(*c)) {
- case 'e': form = QLocaleData::DFExponent; break;
- case 'a': // not supported - decimal form used instead
- case 'f': form = QLocaleData::DFDecimal; break;
- case 'g': form = QLocaleData::DFSignificantDigits; break;
- default: break;
- }
- subst = QLocaleData::c()->doubleToString(d, precision, form, width, flags);
- ++c;
- break;
- }
- case 'c': {
- if (length_mod == lm_l)
- subst = QChar((ushort) va_arg(ap, int));
- else
- subst = QLatin1Char((uchar) va_arg(ap, int));
- ++c;
- break;
- }
- case 's': {
- if (length_mod == lm_l) {
- const ushort *buff = va_arg(ap, const ushort*);
- const ushort *ch = buff;
- while (*ch != 0)
- ++ch;
- subst.setUtf16(buff, ch - buff);
- } else
- subst = QString::fromUtf8(va_arg(ap, const char*));
- if (precision != -1)
- subst.truncate(precision);
- ++c;
- break;
- }
- case 'p': {
- void *arg = va_arg(ap, void*);
- const quint64 i = reinterpret_cast<quintptr>(arg);
- flags |= QLocaleData::ShowBase;
- subst = QLocaleData::c()->unsLongLongToString(i, precision, 16, width, flags);
- ++c;
- break;
- }
- case 'n':
- switch (length_mod) {
- case lm_hh: {
- signed char *n = va_arg(ap, signed char*);
- *n = result.length();
- break;
- }
- case lm_h: {
- short int *n = va_arg(ap, short int*);
- *n = result.length();
- break;
- }
- case lm_l: {
- long int *n = va_arg(ap, long int*);
- *n = result.length();
- break;
- }
- case lm_ll: {
- qint64 *n = va_arg(ap, qint64*);
- *n = result.length();
- break;
- }
- default: {
- int *n = va_arg(ap, int*);
- *n = result.length();
- break;
- }
- }
- ++c;
- break;
-
- default: // bad escape, treat as non-escape text
- for (const char *cc = escape_start; cc != c; ++cc)
- result.append(QLatin1Char(*cc));
- continue;
- }
-
- if (flags & QLocaleData::LeftAdjusted)
- result.append(subst.leftJustified(width));
- else
- result.append(subst.rightJustified(width));
- }
-
- return result;
-}
-
-/*!
- Returns the string converted to a \c{long long} using base \a
- base, which is 10 by default and must be between 2 and 36, or 0.
- Returns 0 if the conversion fails.
-
- If \a ok is not \nullptr, failure is reported by setting *\a{ok}
- to \c false, and success by setting *\a{ok} to \c true.
-
- If \a base is 0, the C language convention is used: If the string
- begins with "0x", base 16 is used; if the string begins with "0",
- base 8 is used; otherwise, base 10 is used.
-
- The string conversion will always happen in the 'C' locale. For locale
- dependent conversion use QLocale::toLongLong()
-
- Example:
-
- \snippet qstring/main.cpp 74
-
- This function ignores leading and trailing whitespace.
-
- \sa number(), toULongLong(), toInt(), QLocale::toLongLong()
-*/
-
-qint64 QString::toLongLong(bool *ok, int base) const
-{
- return toIntegral_helper<qlonglong>(constData(), size(), ok, base);
-}
-
-qlonglong QString::toIntegral_helper(const QChar *data, int len, bool *ok, int base)
-{
-#if defined(QT_CHECK_RANGE)
- if (base != 0 && (base < 2 || base > 36)) {
- qWarning("QString::toULongLong: Invalid base (%d)", base);
- base = 10;
- }
-#endif
-
- return QLocaleData::c()->stringToLongLong(QStringView(data, len), base, ok, QLocale::RejectGroupSeparator);
-}
-
-
-/*!
- Returns the string converted to an \c{unsigned long long} using base \a
- base, which is 10 by default and must be between 2 and 36, or 0.
- Returns 0 if the conversion fails.
-
- If \a ok is not \nullptr, failure is reported by setting *\a{ok}
- to \c false, and success by setting *\a{ok} to \c true.
-
- If \a base is 0, the C language convention is used: If the string
- begins with "0x", base 16 is used; if the string begins with "0",
- base 8 is used; otherwise, base 10 is used.
-
- The string conversion will always happen in the 'C' locale. For locale
- dependent conversion use QLocale::toULongLong()
-
- Example:
-
- \snippet qstring/main.cpp 79
-
- This function ignores leading and trailing whitespace.
-
- \sa number(), toLongLong(), QLocale::toULongLong()
-*/
-
-quint64 QString::toULongLong(bool *ok, int base) const
-{
- return toIntegral_helper<qulonglong>(constData(), size(), ok, base);
-}
-
-qulonglong QString::toIntegral_helper(const QChar *data, uint len, bool *ok, int base)
-{
-#if defined(QT_CHECK_RANGE)
- if (base != 0 && (base < 2 || base > 36)) {
- qWarning("QString::toULongLong: Invalid base (%d)", base);
- base = 10;
- }
-#endif
-
- return QLocaleData::c()->stringToUnsLongLong(QStringView(data, len), base, ok,
- QLocale::RejectGroupSeparator);
-}
-
-/*!
- \fn long QString::toLong(bool *ok, int base) const
-
- Returns the string converted to a \c long using base \a
- base, which is 10 by default and must be between 2 and 36, or 0.
- Returns 0 if the conversion fails.
-
- If \a ok is not \nullptr, failure is reported by setting *\a{ok}
- to \c false, and success by setting *\a{ok} to \c true.
-
- If \a base is 0, the C language convention is used: If the string
- begins with "0x", base 16 is used; if the string begins with "0",
- base 8 is used; otherwise, base 10 is used.
-
- The string conversion will always happen in the 'C' locale. For locale
- dependent conversion use QLocale::toLongLong()
-
- Example:
-
- \snippet qstring/main.cpp 73
-
- This function ignores leading and trailing whitespace.
-
- \sa number(), toULong(), toInt(), QLocale::toInt()
-*/
-
-long QString::toLong(bool *ok, int base) const
-{
- return toIntegral_helper<long>(constData(), size(), ok, base);
-}
-
-/*!
- \fn ulong QString::toULong(bool *ok, int base) const
-
- Returns the string converted to an \c{unsigned long} using base \a
- base, which is 10 by default and must be between 2 and 36, or 0.
- Returns 0 if the conversion fails.
-
- If \a ok is not \nullptr, failure is reported by setting *\a{ok}
- to \c false, and success by setting *\a{ok} to \c true.
-
- If \a base is 0, the C language convention is used: If the string
- begins with "0x", base 16 is used; if the string begins with "0",
- base 8 is used; otherwise, base 10 is used.
-
- The string conversion will always happen in the 'C' locale. For locale
- dependent conversion use QLocale::toULongLong()
-
- Example:
-
- \snippet qstring/main.cpp 78
-
- This function ignores leading and trailing whitespace.
-
- \sa number(), QLocale::toUInt()
-*/
-
-ulong QString::toULong(bool *ok, int base) const
-{
- return toIntegral_helper<ulong>(constData(), size(), ok, base);
-}
-
-
-/*!
- Returns the string converted to an \c int using base \a
- base, which is 10 by default and must be between 2 and 36, or 0.
- Returns 0 if the conversion fails.
-
- If \a ok is not \nullptr, failure is reported by setting *\a{ok}
- to \c false, and success by setting *\a{ok} to \c true.
-
- If \a base is 0, the C language convention is used: If the string
- begins with "0x", base 16 is used; if the string begins with "0",
- base 8 is used; otherwise, base 10 is used.
-
- The string conversion will always happen in the 'C' locale. For locale
- dependent conversion use QLocale::toInt()
-
- Example:
-
- \snippet qstring/main.cpp 72
-
- This function ignores leading and trailing whitespace.
-
- \sa number(), toUInt(), toDouble(), QLocale::toInt()
-*/
-
-int QString::toInt(bool *ok, int base) const
-{
- return toIntegral_helper<int>(constData(), size(), ok, base);
-}
-
-/*!
- Returns the string converted to an \c{unsigned int} using base \a
- base, which is 10 by default and must be between 2 and 36, or 0.
- Returns 0 if the conversion fails.
-
- If \a ok is not \nullptr, failure is reported by setting *\a{ok}
- to \c false, and success by setting *\a{ok} to \c true.
-
- If \a base is 0, the C language convention is used: If the string
- begins with "0x", base 16 is used; if the string begins with "0",
- base 8 is used; otherwise, base 10 is used.
-
- The string conversion will always happen in the 'C' locale. For locale
- dependent conversion use QLocale::toUInt()
-
- Example:
-
- \snippet qstring/main.cpp 77
-
- This function ignores leading and trailing whitespace.
-
- \sa number(), toInt(), QLocale::toUInt()
-*/
-
-uint QString::toUInt(bool *ok, int base) const
-{
- return toIntegral_helper<uint>(constData(), size(), ok, base);
-}
-
-/*!
- Returns the string converted to a \c short using base \a
- base, which is 10 by default and must be between 2 and 36, or 0.
- Returns 0 if the conversion fails.
-
- If \a ok is not \nullptr, failure is reported by setting *\a{ok}
- to \c false, and success by setting *\a{ok} to \c true.
-
- If \a base is 0, the C language convention is used: If the string
- begins with "0x", base 16 is used; if the string begins with "0",
- base 8 is used; otherwise, base 10 is used.
-
- The string conversion will always happen in the 'C' locale. For locale
- dependent conversion use QLocale::toShort()
-
- Example:
-
- \snippet qstring/main.cpp 76
-
- This function ignores leading and trailing whitespace.
-
- \sa number(), toUShort(), toInt(), QLocale::toShort()
-*/
-
-short QString::toShort(bool *ok, int base) const
-{
- return toIntegral_helper<short>(constData(), size(), ok, base);
-}
-
-/*!
- Returns the string converted to an \c{unsigned short} using base \a
- base, which is 10 by default and must be between 2 and 36, or 0.
- Returns 0 if the conversion fails.
-
- If \a ok is not \nullptr, failure is reported by setting *\a{ok}
- to \c false, and success by setting *\a{ok} to \c true.
-
- If \a base is 0, the C language convention is used: If the string
- begins with "0x", base 16 is used; if the string begins with "0",
- base 8 is used; otherwise, base 10 is used.
-
- The string conversion will always happen in the 'C' locale. For locale
- dependent conversion use QLocale::toUShort()
-
- Example:
-
- \snippet qstring/main.cpp 80
-
- This function ignores leading and trailing whitespace.
-
- \sa number(), toShort(), QLocale::toUShort()
-*/
-
-ushort QString::toUShort(bool *ok, int base) const
-{
- return toIntegral_helper<ushort>(constData(), size(), ok, base);
-}
-
-
-/*!
- Returns the string converted to a \c double value.
-
- Returns an infinity if the conversion overflows or 0.0 if the
- conversion fails for other reasons (e.g. underflow).
-
- If \a ok is not \nullptr, failure is reported by setting *\a{ok}
- to \c false, and success by setting *\a{ok} to \c true.
-
- \snippet qstring/main.cpp 66
-
- \warning The QString content may only contain valid numerical characters
- which includes the plus/minus sign, the character e used in scientific
- notation, and the decimal point. Including the unit or additional characters
- leads to a conversion error.
-
- \snippet qstring/main.cpp 67
-
- The string conversion will always happen in the 'C' locale. For locale
- dependent conversion use QLocale::toDouble()
-
- \snippet qstring/main.cpp 68
-
- For historical reasons, this function does not handle
- thousands group separators. If you need to convert such numbers,
- use QLocale::toDouble().
-
- \snippet qstring/main.cpp 69
-
- This function ignores leading and trailing whitespace.
-
- \sa number(), QLocale::setDefault(), QLocale::toDouble(), trimmed()
-*/
-
-double QString::toDouble(bool *ok) const
-{
- return QLocaleData::c()->stringToDouble(*this, ok, QLocale::RejectGroupSeparator);
-}
-
-/*!
- Returns the string converted to a \c float value.
-
- Returns an infinity if the conversion overflows or 0.0 if the
- conversion fails for other reasons (e.g. underflow).
-
- If \a ok is not \nullptr, failure is reported by setting *\a{ok}
- to \c false, and success by setting *\a{ok} to \c true.
-
- \warning The QString content may only contain valid numerical characters
- which includes the plus/minus sign, the character e used in scientific
- notation, and the decimal point. Including the unit or additional characters
- leads to a conversion error.
-
- The string conversion will always happen in the 'C' locale. For locale
- dependent conversion use QLocale::toFloat()
-
- For historical reasons, this function does not handle
- thousands group separators. If you need to convert such numbers,
- use QLocale::toFloat().
-
- Example:
-
- \snippet qstring/main.cpp 71
-
- This function ignores leading and trailing whitespace.
-
- \sa number(), toDouble(), toInt(), QLocale::toFloat(), trimmed()
-*/
-
-float QString::toFloat(bool *ok) const
-{
- return QLocaleData::convertDoubleToFloat(toDouble(ok), ok);
-}
-
-/*! \fn QString &QString::setNum(int n, int base)
-
- Sets the string to the printed value of \a n in the specified \a
- base, and returns a reference to the string.
-
- The base is 10 by default and must be between 2 and 36. For bases
- other than 10, \a n is treated as an unsigned integer.
-
- \snippet qstring/main.cpp 56
-
- The formatting always uses QLocale::C, i.e., English/UnitedStates.
- To get a localized string representation of a number, use
- QLocale::toString() with the appropriate locale.
-*/
-
-/*! \fn QString &QString::setNum(uint n, int base)
-
- \overload
-*/
-
-/*! \fn QString &QString::setNum(long n, int base)
-
- \overload
-*/
-
-/*! \fn QString &QString::setNum(ulong n, int base)
-
- \overload
-*/
-
-/*!
- \overload
-*/
-QString &QString::setNum(qlonglong n, int base)
-{
- return *this = number(n, base);
-}
-
-/*!
- \overload
-*/
-QString &QString::setNum(qulonglong n, int base)
-{
- return *this = number(n, base);
-}
-
-/*! \fn QString &QString::setNum(short n, int base)
-
- \overload
-*/
-
-/*! \fn QString &QString::setNum(ushort n, int base)
-
- \overload
-*/
-
-/*!
- \fn QString &QString::setNum(double n, char format, int precision)
- \overload
-
- Sets the string to the printed value of \a n, formatted according
- to the given \a format and \a precision, and returns a reference
- to the string.
-
- The \a format can be 'e', 'E', 'f', 'g' or 'G' (see
- \l{Argument Formats} for an explanation of the formats).
-
- The formatting always uses QLocale::C, i.e., English/UnitedStates.
- To get a localized string representation of a number, use
- QLocale::toString() with the appropriate locale.
-*/
-
-QString &QString::setNum(double n, char f, int prec)
-{
- return *this = number(n, f, prec);
-}
-
-/*!
- \fn QString &QString::setNum(float n, char format, int precision)
- \overload
-
- Sets the string to the printed value of \a n, formatted according
- to the given \a format and \a precision, and returns a reference
- to the string.
-
- The formatting always uses QLocale::C, i.e., English/UnitedStates.
- To get a localized string representation of a number, use
- QLocale::toString() with the appropriate locale.
-*/
-
-
-/*!
- \fn QString QString::number(long n, int base)
-
- Returns a string equivalent of the number \a n according to the
- specified \a base.
-
- The base is 10 by default and must be between 2
- and 36. For bases other than 10, \a n is treated as an
- unsigned integer.
-
- The formatting always uses QLocale::C, i.e., English/UnitedStates.
- To get a localized string representation of a number, use
- QLocale::toString() with the appropriate locale.
-
- \snippet qstring/main.cpp 35
-
- \sa setNum()
-*/
-
-QString QString::number(long n, int base)
-{
- return number(qlonglong(n), base);
-}
-
-/*!
- \fn QString QString::number(ulong n, int base)
-
- \overload
-*/
-QString QString::number(ulong n, int base)
-{
- return number(qulonglong(n), base);
-}
-
-/*!
- \overload
-*/
-QString QString::number(int n, int base)
-{
- return number(qlonglong(n), base);
-}
-
-/*!
- \overload
-*/
-QString QString::number(uint n, int base)
-{
- return number(qulonglong(n), base);
-}
-
-/*!
- \overload
-*/
-QString QString::number(qlonglong n, int base)
-{
-#if defined(QT_CHECK_RANGE)
- if (base < 2 || base > 36) {
- qWarning("QString::setNum: Invalid base (%d)", base);
- base = 10;
- }
-#endif
- return QLocaleData::c()->longLongToString(n, -1, base);
-}
-
-/*!
- \overload
-*/
-QString QString::number(qulonglong n, int base)
-{
-#if defined(QT_CHECK_RANGE)
- if (base < 2 || base > 36) {
- qWarning("QString::setNum: Invalid base (%d)", base);
- base = 10;
- }
-#endif
- return QLocaleData::c()->unsLongLongToString(n, -1, base);
-}
-
-
-/*!
- \fn QString QString::number(double n, char format, int precision)
-
- Returns a string equivalent of the number \a n, formatted
- according to the specified \a format and \a precision. See
- \l{Argument Formats} for details.
-
- Unlike QLocale::toString(), this function does not honor the
- user's locale settings.
-
- \sa setNum(), QLocale::toString()
-*/
-QString QString::number(double n, char f, int prec)
-{
- QLocaleData::DoubleForm form = QLocaleData::DFDecimal;
- uint flags = QLocaleData::ZeroPadExponent;
-
- if (qIsUpper(f))
- flags |= QLocaleData::CapitalEorX;
-
- switch (qToLower(f)) {
- case 'f':
- form = QLocaleData::DFDecimal;
- break;
- case 'e':
- form = QLocaleData::DFExponent;
- break;
- case 'g':
- form = QLocaleData::DFSignificantDigits;
- break;
- default:
-#if defined(QT_CHECK_RANGE)
- qWarning("QString::setNum: Invalid format char '%c'", f);
-#endif
- break;
- }
-
- return QLocaleData::c()->doubleToString(n, prec, form, -1, flags);
-}
-
-namespace {
-template<class ResultList, class StringSource>
-static ResultList splitString(const StringSource &source, const QChar *sep,
- QString::SplitBehavior behavior, Qt::CaseSensitivity cs, const int separatorSize)
-{
- ResultList list;
- int start = 0;
- int end;
- int extra = 0;
- while ((end = qFindString(source.constData(), source.size(), start + extra, sep, separatorSize, cs)) != -1) {
- if (start != end || behavior == QString::KeepEmptyParts)
- list.append(source.mid(start, end - start));
- start = end + separatorSize;
- extra = (separatorSize == 0 ? 1 : 0);
- }
- if (start != source.size() || behavior == QString::KeepEmptyParts)
- list.append(source.mid(start, -1));
- return list;
-}
-
-} // namespace
-
-/*!
- Splits the string into substrings wherever \a sep occurs, and
- returns the list of those strings. If \a sep does not match
- anywhere in the string, split() returns a single-element list
- containing this string.
-
- \a cs specifies whether \a sep should be matched case
- sensitively or case insensitively.
-
- If \a behavior is QString::SkipEmptyParts, empty entries don't
- appear in the result. By default, empty entries are kept.
-
- Example:
-
- \snippet qstring/main.cpp 62
-
- If \a sep is empty, split() returns an empty string, followed
- by each of the string's characters, followed by another empty string:
-
- \snippet qstring/main.cpp 62-empty
-
- To understand this behavior, recall that the empty string matches
- everywhere, so the above is qualitatively the same as:
-
- \snippet qstring/main.cpp 62-slashes
-
- \sa QStringList::join(), section()
-*/
-QStringList QString::split(const QString &sep, SplitBehavior behavior, Qt::CaseSensitivity cs) const
-{
- return splitString<QStringList>(*this, sep.constData(), behavior, cs, sep.size());
-}
-
-/*!
- Splits the string into substring references wherever \a sep occurs, and
- returns the list of those strings.
-
- See QString::split() for how \a sep, \a behavior and \a cs interact to form
- the result.
-
- \note All references are valid as long this string is alive. Destroying this
- string will cause all references to be dangling pointers.
-
- \since 5.4
- \sa QStringRef split()
-*/
-QVector<QStringRef> QString::splitRef(const QString &sep, SplitBehavior behavior, Qt::CaseSensitivity cs) const
-{
- return splitString<QVector<QStringRef> >(QStringRef(this), sep.constData(), behavior, cs, sep.size());
-}
-/*!
- \overload
-*/
-QStringList QString::split(QChar sep, SplitBehavior behavior, Qt::CaseSensitivity cs) const
-{
- return splitString<QStringList>(*this, &sep, behavior, cs, 1);
-}
-
-/*!
- \overload
- \since 5.4
-*/
-QVector<QStringRef> QString::splitRef(QChar sep, SplitBehavior behavior, Qt::CaseSensitivity cs) const
-{
- return splitString<QVector<QStringRef> >(QStringRef(this), &sep, behavior, cs, 1);
-}
-
-/*!
- Splits the string into substrings references wherever \a sep occurs, and
- returns the list of those strings.
-
- See QString::split() for how \a sep, \a behavior and \a cs interact to form
- the result.
-
- \note All references are valid as long this string is alive. Destroying this
- string will cause all references to be dangling pointers.
-
- \since 5.4
-*/
-QVector<QStringRef> QStringRef::split(const QString &sep, QString::SplitBehavior behavior, Qt::CaseSensitivity cs) const
-{
- return splitString<QVector<QStringRef> >(*this, sep.constData(), behavior, cs, sep.size());
-}
-
-/*!
- \overload
- \since 5.4
-*/
-QVector<QStringRef> QStringRef::split(QChar sep, QString::SplitBehavior behavior, Qt::CaseSensitivity cs) const
-{
- return splitString<QVector<QStringRef> >(*this, &sep, behavior, cs, 1);
-}
-
-#ifndef QT_NO_REGEXP
-namespace {
-template<class ResultList, typename MidMethod>
-static ResultList splitString(const QString &source, MidMethod mid, const QRegExp &rx, QString::SplitBehavior behavior)
-{
- QRegExp rx2(rx);
- ResultList list;
- int start = 0;
- int extra = 0;
- int end;
- while ((end = rx2.indexIn(source, start + extra)) != -1) {
- int matchedLen = rx2.matchedLength();
- if (start != end || behavior == QString::KeepEmptyParts)
- list.append((source.*mid)(start, end - start));
- start = end + matchedLen;
- extra = (matchedLen == 0) ? 1 : 0;
- }
- if (start != source.size() || behavior == QString::KeepEmptyParts)
- list.append((source.*mid)(start, -1));
- return list;
-}
-} // namespace
-
-/*!
- \overload
-
- Splits the string into substrings wherever the regular expression
- \a rx matches, and returns the list of those strings. If \a rx
- does not match anywhere in the string, split() returns a
- single-element list containing this string.
-
- Here is an example where we extract the words in a sentence
- using one or more whitespace characters as the separator:
-
- \snippet qstring/main.cpp 59
-
- Here is a similar example, but this time we use any sequence of
- non-word characters as the separator:
-
- \snippet qstring/main.cpp 60
-
- Here is a third example where we use a zero-length assertion,
- \b{\\b} (word boundary), to split the string into an
- alternating sequence of non-word and word tokens:
-
- \snippet qstring/main.cpp 61
-
- \sa QStringList::join(), section()
-*/
-QStringList QString::split(const QRegExp &rx, SplitBehavior behavior) const
-{
- return splitString<QStringList>(*this, &QString::mid, rx, behavior);
-}
-
-/*!
- \overload
- \since 5.4
-
- Splits the string into substring references wherever the regular expression
- \a rx matches, and returns the list of those strings. If \a rx
- does not match anywhere in the string, splitRef() returns a
- single-element vector containing this string reference.
-
- \note All references are valid as long this string is alive. Destroying this
- string will cause all references to be dangling pointers.
-
- \sa QStringRef split()
-*/
-QVector<QStringRef> QString::splitRef(const QRegExp &rx, SplitBehavior behavior) const
-{
- return splitString<QVector<QStringRef> >(*this, &QString::midRef, rx, behavior);
-}
-#endif
-
-#if QT_CONFIG(regularexpression)
-namespace {
-template<class ResultList, typename MidMethod>
-static ResultList splitString(const QString &source, MidMethod mid, const QRegularExpression &re,
- QString::SplitBehavior behavior)
-{
- ResultList list;
- if (!re.isValid()) {
- qWarning("QString::split: invalid QRegularExpression object");
- return list;
- }
-
- int start = 0;
- int end = 0;
- QRegularExpressionMatchIterator iterator = re.globalMatch(source);
- while (iterator.hasNext()) {
- QRegularExpressionMatch match = iterator.next();
- end = match.capturedStart();
- if (start != end || behavior == QString::KeepEmptyParts)
- list.append((source.*mid)(start, end - start));
- start = match.capturedEnd();
- }
-
- if (start != source.size() || behavior == QString::KeepEmptyParts)
- list.append((source.*mid)(start, -1));
-
- return list;
-}
-} // namespace
-
-/*!
- \overload
- \since 5.0
-
- Splits the string into substrings wherever the regular expression
- \a re matches, and returns the list of those strings. If \a re
- does not match anywhere in the string, split() returns a
- single-element list containing this string.
-
- Here is an example where we extract the words in a sentence
- using one or more whitespace characters as the separator:
-
- \snippet qstring/main.cpp 90
-
- Here is a similar example, but this time we use any sequence of
- non-word characters as the separator:
-
- \snippet qstring/main.cpp 91
-
- Here is a third example where we use a zero-length assertion,
- \b{\\b} (word boundary), to split the string into an
- alternating sequence of non-word and word tokens:
-
- \snippet qstring/main.cpp 92
-
- \sa QStringList::join(), section()
-*/
-QStringList QString::split(const QRegularExpression &re, SplitBehavior behavior) const
-{
- return splitString<QStringList>(*this, &QString::mid, re, behavior);
-}
-
-/*!
- \overload
- \since 5.4
-
- Splits the string into substring references wherever the regular expression
- \a re matches, and returns the list of those strings. If \a re
- does not match anywhere in the string, splitRef() returns a
- single-element vector containing this string reference.
-
- \note All references are valid as long this string is alive. Destroying this
- string will cause all references to be dangling pointers.
-
- \sa split() QStringRef
-*/
-QVector<QStringRef> QString::splitRef(const QRegularExpression &re, SplitBehavior behavior) const
-{
- return splitString<QVector<QStringRef> >(*this, &QString::midRef, re, behavior);
-}
-#endif // QT_CONFIG(regularexpression)
-
-/*!
- \enum QString::NormalizationForm
-
- This enum describes the various normalized forms of Unicode text.
-
- \value NormalizationForm_D Canonical Decomposition
- \value NormalizationForm_C Canonical Decomposition followed by Canonical Composition
- \value NormalizationForm_KD Compatibility Decomposition
- \value NormalizationForm_KC Compatibility Decomposition followed by Canonical Composition
-
- \sa normalized(),
- {http://www.unicode.org/reports/tr15/}{Unicode Standard Annex #15}
-*/
-
-/*!
- \since 4.5
-
- Returns a copy of this string repeated the specified number of \a times.
-
- If \a times is less than 1, an empty string is returned.
-
- Example:
-
- \snippet code/src_corelib_tools_qstring.cpp 8
-*/
-QString QString::repeated(int times) const
-{
- if (d->size == 0)
- return *this;
-
- if (times <= 1) {
- if (times == 1)
- return *this;
- return QString();
- }
-
- const int resultSize = times * d->size;
-
- QString result;
- result.reserve(resultSize);
- if (result.d->alloc != uint(resultSize) + 1u)
- return QString(); // not enough memory
-
- memcpy(result.d->data(), d->data(), d->size * sizeof(ushort));
-
- int sizeSoFar = d->size;
- ushort *end = result.d->data() + sizeSoFar;
-
- const int halfResultSize = resultSize >> 1;
- while (sizeSoFar <= halfResultSize) {
- memcpy(end, result.d->data(), sizeSoFar * sizeof(ushort));
- end += sizeSoFar;
- sizeSoFar <<= 1;
- }
- memcpy(end, result.d->data(), (resultSize - sizeSoFar) * sizeof(ushort));
- result.d->data()[resultSize] = '\0';
- result.d->size = resultSize;
- return result;
-}
-
-void qt_string_normalize(QString *data, QString::NormalizationForm mode, QChar::UnicodeVersion version, int from)
-{
- const QChar *p = data->constData() + from;
- if (isAscii(p, p + data->length() - from))
- return;
- if (p > data->constData() + from)
- from = p - data->constData() - 1; // need one before the non-ASCII to perform NFC
-
- if (version == QChar::Unicode_Unassigned) {
- version = QChar::currentUnicodeVersion();
- } else if (int(version) <= NormalizationCorrectionsVersionMax) {
- const QString &s = *data;
- QChar *d = 0;
- for (int i = 0; i < NumNormalizationCorrections; ++i) {
- const NormalizationCorrection &n = uc_normalization_corrections[i];
- if (n.version > version) {
- int pos = from;
- if (QChar::requiresSurrogates(n.ucs4)) {
- ushort ucs4High = QChar::highSurrogate(n.ucs4);
- ushort ucs4Low = QChar::lowSurrogate(n.ucs4);
- ushort oldHigh = QChar::highSurrogate(n.old_mapping);
- ushort oldLow = QChar::lowSurrogate(n.old_mapping);
- while (pos < s.length() - 1) {
- if (s.at(pos).unicode() == ucs4High && s.at(pos + 1).unicode() == ucs4Low) {
- if (!d)
- d = data->data();
- d[pos] = QChar(oldHigh);
- d[++pos] = QChar(oldLow);
- }
- ++pos;
- }
- } else {
- while (pos < s.length()) {
- if (s.at(pos).unicode() == n.ucs4) {
- if (!d)
- d = data->data();
- d[pos] = QChar(n.old_mapping);
- }
- ++pos;
- }
- }
- }
- }
- }
-
- if (normalizationQuickCheckHelper(data, mode, from, &from))
- return;
-
- decomposeHelper(data, mode < QString::NormalizationForm_KD, version, from);
-
- canonicalOrderHelper(data, version, from);
-
- if (mode == QString::NormalizationForm_D || mode == QString::NormalizationForm_KD)
- return;
-
- composeHelper(data, version, from);
-}
-
-/*!
- Returns the string in the given Unicode normalization \a mode,
- according to the given \a version of the Unicode standard.
-*/
-QString QString::normalized(QString::NormalizationForm mode, QChar::UnicodeVersion version) const
-{
- QString copy = *this;
- qt_string_normalize(&copy, mode, version, 0);
- return copy;
-}
-
-
-struct ArgEscapeData
-{
- int min_escape; // lowest escape sequence number
- int occurrences; // number of occurrences of the lowest escape sequence number
- int locale_occurrences; // number of occurrences of the lowest escape sequence number that
- // contain 'L'
- int escape_len; // total length of escape sequences which will be replaced
-};
-
-static ArgEscapeData findArgEscapes(QStringView s)
-{
- const QChar *uc_begin = s.begin();
- const QChar *uc_end = s.end();
-
- ArgEscapeData d;
-
- d.min_escape = INT_MAX;
- d.occurrences = 0;
- d.escape_len = 0;
- d.locale_occurrences = 0;
-
- const QChar *c = uc_begin;
- while (c != uc_end) {
- while (c != uc_end && c->unicode() != '%')
- ++c;
-
- if (c == uc_end)
- break;
- const QChar *escape_start = c;
- if (++c == uc_end)
- break;
-
- bool locale_arg = false;
- if (c->unicode() == 'L') {
- locale_arg = true;
- if (++c == uc_end)
- break;
- }
-
- int escape = c->digitValue();
- if (escape == -1)
- continue;
-
- ++c;
-
- if (c != uc_end) {
- int next_escape = c->digitValue();
- if (next_escape != -1) {
- escape = (10 * escape) + next_escape;
- ++c;
- }
- }
-
- if (escape > d.min_escape)
- continue;
-
- if (escape < d.min_escape) {
- d.min_escape = escape;
- d.occurrences = 0;
- d.escape_len = 0;
- d.locale_occurrences = 0;
- }
-
- ++d.occurrences;
- if (locale_arg)
- ++d.locale_occurrences;
- d.escape_len += c - escape_start;
- }
- return d;
-}
-
-static QString replaceArgEscapes(QStringView s, const ArgEscapeData &d, int field_width,
- QStringView arg, QStringView larg, QChar fillChar)
-{
- const QChar *uc_begin = s.begin();
- const QChar *uc_end = s.end();
-
- int abs_field_width = qAbs(field_width);
- int result_len = s.length()
- - d.escape_len
- + (d.occurrences - d.locale_occurrences)
- *qMax(abs_field_width, arg.length())
- + d.locale_occurrences
- *qMax(abs_field_width, larg.length());
-
- QString result(result_len, Qt::Uninitialized);
- QChar *result_buff = (QChar*) result.unicode();
-
- QChar *rc = result_buff;
- const QChar *c = uc_begin;
- int repl_cnt = 0;
- while (c != uc_end) {
- /* We don't have to check if we run off the end of the string with c,
- because as long as d.occurrences > 0 we KNOW there are valid escape
- sequences. */
-
- const QChar *text_start = c;
-
- while (c->unicode() != '%')
- ++c;
-
- const QChar *escape_start = c++;
-
- bool locale_arg = false;
- if (c->unicode() == 'L') {
- locale_arg = true;
- ++c;
- }
-
- int escape = c->digitValue();
- if (escape != -1) {
- if (c + 1 != uc_end && (c + 1)->digitValue() != -1) {
- escape = (10 * escape) + (c + 1)->digitValue();
- ++c;
- }
- }
-
- if (escape != d.min_escape) {
- memcpy(rc, text_start, (c - text_start)*sizeof(QChar));
- rc += c - text_start;
- }
- else {
- ++c;
-
- memcpy(rc, text_start, (escape_start - text_start)*sizeof(QChar));
- rc += escape_start - text_start;
-
- uint pad_chars;
- if (locale_arg)
- pad_chars = qMax(abs_field_width, larg.length()) - larg.length();
- else
- pad_chars = qMax(abs_field_width, arg.length()) - arg.length();
-
- if (field_width > 0) { // left padded
- for (uint i = 0; i < pad_chars; ++i)
- (rc++)->unicode() = fillChar.unicode();
- }
-
- if (locale_arg) {
- memcpy(rc, larg.data(), larg.length()*sizeof(QChar));
- rc += larg.length();
- }
- else {
- memcpy(rc, arg.data(), arg.length()*sizeof(QChar));
- rc += arg.length();
- }
-
- if (field_width < 0) { // right padded
- for (uint i = 0; i < pad_chars; ++i)
- (rc++)->unicode() = fillChar.unicode();
- }
-
- if (++repl_cnt == d.occurrences) {
- memcpy(rc, c, (uc_end - c)*sizeof(QChar));
- rc += uc_end - c;
- Q_ASSERT(rc - result_buff == result_len);
- c = uc_end;
- }
- }
- }
- Q_ASSERT(rc == result_buff + result_len);
-
- return result;
-}
-
-#if QT_STRINGVIEW_LEVEL < 2
-/*!
- Returns a copy of this string with the lowest numbered place marker
- replaced by string \a a, i.e., \c %1, \c %2, ..., \c %99.
-
- \a fieldWidth specifies the minimum amount of space that argument \a
- a shall occupy. If \a a requires less space than \a fieldWidth, it
- is padded to \a fieldWidth with character \a fillChar. A positive
- \a fieldWidth produces right-aligned text. A negative \a fieldWidth
- produces left-aligned text.
-
- This example shows how we might create a \c status string for
- reporting progress while processing a list of files:
-
- \snippet qstring/main.cpp 11
-
- First, \c arg(i) replaces \c %1. Then \c arg(total) replaces \c
- %2. Finally, \c arg(fileName) replaces \c %3.
-
- One advantage of using arg() over asprintf() is that the order of the
- numbered place markers can change, if the application's strings are
- translated into other languages, but each arg() will still replace
- the lowest numbered unreplaced place marker, no matter where it
- appears. Also, if place marker \c %i appears more than once in the
- string, the arg() replaces all of them.
-
- If there is no unreplaced place marker remaining, a warning message
- is output and the result is undefined. Place marker numbers must be
- in the range 1 to 99.
-*/
-QString QString::arg(const QString &a, int fieldWidth, QChar fillChar) const
-{
- return arg(qToStringViewIgnoringNull(a), fieldWidth, fillChar);
-}
-#endif // QT_STRINGVIEW_LEVEL < 2
-
-/*!
- \overload
- \since 5.10
-
- Returns a copy of this string with the lowest-numbered place-marker
- replaced by string \a a, i.e., \c %1, \c %2, ..., \c %99.
-
- \a fieldWidth specifies the minimum amount of space that \a a
- shall occupy. If \a a requires less space than \a fieldWidth, it
- is padded to \a fieldWidth with character \a fillChar. A positive
- \a fieldWidth produces right-aligned text. A negative \a fieldWidth
- produces left-aligned text.
-
- This example shows how we might create a \c status string for
- reporting progress while processing a list of files:
-
- \snippet qstring/main.cpp 11-qstringview
-
- First, \c arg(i) replaces \c %1. Then \c arg(total) replaces \c
- %2. Finally, \c arg(fileName) replaces \c %3.
-
- One advantage of using arg() over asprintf() is that the order of the
- numbered place markers can change, if the application's strings are
- translated into other languages, but each arg() will still replace
- the lowest-numbered unreplaced place-marker, no matter where it
- appears. Also, if place-marker \c %i appears more than once in the
- string, arg() replaces all of them.
-
- If there is no unreplaced place-marker remaining, a warning message
- is printed and the result is undefined. Place-marker numbers must be
- in the range 1 to 99.
-*/
-QString QString::arg(QStringView a, int fieldWidth, QChar fillChar) const
-{
- ArgEscapeData d = findArgEscapes(*this);
-
- if (Q_UNLIKELY(d.occurrences == 0)) {
- qWarning("QString::arg: Argument missing: %ls, %ls", qUtf16Printable(*this),
- qUtf16Printable(a.toString()));
- return *this;
- }
- return replaceArgEscapes(*this, d, fieldWidth, a, a, fillChar);
-}
-
-/*!
- \overload
- \since 5.10
-
- Returns a copy of this string with the lowest-numbered place-marker
- replaced by string \a a, i.e., \c %1, \c %2, ..., \c %99.
-
- \a fieldWidth specifies the minimum amount of space that \a a
- shall occupy. If \a a requires less space than \a fieldWidth, it
- is padded to \a fieldWidth with character \a fillChar. A positive
- \a fieldWidth produces right-aligned text. A negative \a fieldWidth
- produces left-aligned text.
-
- One advantage of using arg() over asprintf() is that the order of the
- numbered place markers can change, if the application's strings are
- translated into other languages, but each arg() will still replace
- the lowest-numbered unreplaced place-marker, no matter where it
- appears. Also, if place-marker \c %i appears more than once in the
- string, arg() replaces all of them.
-
- If there is no unreplaced place-marker remaining, a warning message
- is printed and the result is undefined. Place-marker numbers must be
- in the range 1 to 99.
-*/
-QString QString::arg(QLatin1String a, int fieldWidth, QChar fillChar) const
-{
- QVarLengthArray<ushort> utf16(a.size());
- qt_from_latin1(utf16.data(), a.data(), a.size());
- return arg(QStringView(utf16.data(), utf16.size()), fieldWidth, fillChar);
-}
-
-/*!
- \fn QString QString::arg(const QString& a1, const QString& a2) const
- \overload arg()
-
- This is the same as \c {str.arg(a1).arg(a2)}, except that the
- strings \a a1 and \a a2 are replaced in one pass. This can make a
- difference if \a a1 contains e.g. \c{%1}:
-
- \snippet qstring/main.cpp 13
-
- A similar problem occurs when the numbered place markers are not
- white space separated:
-
- \snippet qstring/main.cpp 12
- \snippet qstring/main.cpp 97
-
- Let's look at the substitutions:
- \list
- \li First, \c Hello replaces \c {%1} so the string becomes \c {"Hello%3%2"}.
- \li Then, \c 20 replaces \c {%2} so the string becomes \c {"Hello%320"}.
- \li Since the maximum numbered place marker value is 99, \c 50 replaces \c {%32}.
- \endlist
- Thus the string finally becomes \c {"Hello500"}.
-
- In such cases, the following yields the expected results:
-
- \snippet qstring/main.cpp 12
- \snippet qstring/main.cpp 98
-*/
-
-/*!
- \fn QString QString::arg(const QString& a1, const QString& a2, const QString& a3) const
- \overload arg()
-
- This is the same as calling \c str.arg(a1).arg(a2).arg(a3), except
- that the strings \a a1, \a a2 and \a a3 are replaced in one pass.
-*/
-
-/*!
- \fn QString QString::arg(const QString& a1, const QString& a2, const QString& a3, const QString& a4) const
- \overload arg()
-
- This is the same as calling \c
- {str.arg(a1).arg(a2).arg(a3).arg(a4)}, except that the strings \a
- a1, \a a2, \a a3 and \a a4 are replaced in one pass.
-*/
-
-/*!
- \fn QString QString::arg(const QString& a1, const QString& a2, const QString& a3, const QString& a4, const QString& a5) const
- \overload arg()
-
- This is the same as calling \c
- {str.arg(a1).arg(a2).arg(a3).arg(a4).arg(a5)}, except that the strings
- \a a1, \a a2, \a a3, \a a4, and \a a5 are replaced in one pass.
-*/
-
-/*!
- \fn QString QString::arg(const QString& a1, const QString& a2, const QString& a3, const QString& a4, const QString& a5, const QString& a6) const
- \overload arg()
-
- This is the same as calling \c
- {str.arg(a1).arg(a2).arg(a3).arg(a4).arg(a5).arg(a6))}, except that
- the strings \a a1, \a a2, \a a3, \a a4, \a a5, and \a a6 are
- replaced in one pass.
-*/
-
-/*!
- \fn QString QString::arg(const QString& a1, const QString& a2, const QString& a3, const QString& a4, const QString& a5, const QString& a6, const QString& a7) const
- \overload arg()
-
- This is the same as calling \c
- {str.arg(a1).arg(a2).arg(a3).arg(a4).arg(a5).arg(a6).arg(a7)},
- except that the strings \a a1, \a a2, \a a3, \a a4, \a a5, \a a6,
- and \a a7 are replaced in one pass.
-*/
-
-/*!
- \fn QString QString::arg(const QString& a1, const QString& a2, const QString& a3, const QString& a4, const QString& a5, const QString& a6, const QString& a7, const QString& a8) const
- \overload arg()
-
- This is the same as calling \c
- {str.arg(a1).arg(a2).arg(a3).arg(a4).arg(a5).arg(a6).arg(a7).arg(a8)},
- except that the strings \a a1, \a a2, \a a3, \a a4, \a a5, \a a6, \a
- a7, and \a a8 are replaced in one pass.
-*/
-
-/*!
- \fn QString QString::arg(const QString& a1, const QString& a2, const QString& a3, const QString& a4, const QString& a5, const QString& a6, const QString& a7, const QString& a8, const QString& a9) const
- \overload arg()
-
- This is the same as calling \c
- {str.arg(a1).arg(a2).arg(a3).arg(a4).arg(a5).arg(a6).arg(a7).arg(a8).arg(a9)},
- except that the strings \a a1, \a a2, \a a3, \a a4, \a a5, \a a6, \a
- a7, \a a8, and \a a9 are replaced in one pass.
-*/
-
-/*! \fn QString QString::arg(int a, int fieldWidth, int base, QChar fillChar) const
- \overload arg()
-
- The \a a argument is expressed in base \a base, which is 10 by
- default and must be between 2 and 36. For bases other than 10, \a a
- is treated as an unsigned integer.
-
- \a fieldWidth specifies the minimum amount of space that \a a is
- padded to and filled with the character \a fillChar. A positive
- value produces right-aligned text; a negative value produces
- left-aligned text.
-
- The '%' can be followed by an 'L', in which case the sequence is
- replaced with a localized representation of \a a. The conversion
- uses the default locale, set by QLocale::setDefault(). If no default
- locale was specified, the "C" locale is used. The 'L' flag is
- ignored if \a base is not 10.
-
- \snippet qstring/main.cpp 12
- \snippet qstring/main.cpp 14
-
- If \a fillChar is '0' (the number 0, ASCII 48), the locale's zero is
- used. For negative numbers, zero padding might appear before the
- minus sign.
-*/
-
-/*! \fn QString QString::arg(uint a, int fieldWidth, int base, QChar fillChar) const
- \overload arg()
-
- The \a base argument specifies the base to use when converting the
- integer \a a into a string. The base must be between 2 and 36.
-
- If \a fillChar is '0' (the number 0, ASCII 48), the locale's zero is
- used. For negative numbers, zero padding might appear before the
- minus sign.
-*/
-
-/*! \fn QString QString::arg(long a, int fieldWidth, int base, QChar fillChar) const
- \overload arg()
-
- \a fieldWidth specifies the minimum amount of space that \a a is
- padded to and filled with the character \a fillChar. A positive
- value produces right-aligned text; a negative value produces
- left-aligned text.
-
- The \a a argument is expressed in the given \a base, which is 10 by
- default and must be between 2 and 36.
-
- The '%' can be followed by an 'L', in which case the sequence is
- replaced with a localized representation of \a a. The conversion
- uses the default locale. The default locale is determined from the
- system's locale settings at application startup. It can be changed
- using QLocale::setDefault(). The 'L' flag is ignored if \a base is
- not 10.
-
- \snippet qstring/main.cpp 12
- \snippet qstring/main.cpp 14
-
- If \a fillChar is '0' (the number 0, ASCII 48), the locale's zero is
- used. For negative numbers, zero padding might appear before the
- minus sign.
-*/
-
-/*! \fn QString QString::arg(ulong a, int fieldWidth, int base, QChar fillChar) const
- \overload arg()
-
- \a fieldWidth specifies the minimum amount of space that \a a is
- padded to and filled with the character \a fillChar. A positive
- value produces right-aligned text; a negative value produces
- left-aligned text.
-
- The \a base argument specifies the base to use when converting the
- integer \a a to a string. The base must be between 2 and 36, with 8
- giving octal, 10 decimal, and 16 hexadecimal numbers.
-
- If \a fillChar is '0' (the number 0, ASCII 48), the locale's zero is
- used. For negative numbers, zero padding might appear before the
- minus sign.
-*/
-
-/*!
- \overload arg()
-
- \a fieldWidth specifies the minimum amount of space that \a a is
- padded to and filled with the character \a fillChar. A positive
- value produces right-aligned text; a negative value produces
- left-aligned text.
-
- The \a base argument specifies the base to use when converting the
- integer \a a into a string. The base must be between 2 and 36, with
- 8 giving octal, 10 decimal, and 16 hexadecimal numbers.
-
- If \a fillChar is '0' (the number 0, ASCII 48), the locale's zero is
- used. For negative numbers, zero padding might appear before the
- minus sign.
-*/
-QString QString::arg(qlonglong a, int fieldWidth, int base, QChar fillChar) const
-{
- ArgEscapeData d = findArgEscapes(*this);
-
- if (d.occurrences == 0) {
- qWarning() << "QString::arg: Argument missing:" << *this << ',' << a;
- return *this;
- }
-
- unsigned flags = QLocaleData::NoFlags;
- if (fillChar == QLatin1Char('0'))
- flags = QLocaleData::ZeroPadded;
-
- QString arg;
- if (d.occurrences > d.locale_occurrences)
- arg = QLocaleData::c()->longLongToString(a, -1, base, fieldWidth, flags);
-
- QString locale_arg;
- if (d.locale_occurrences > 0) {
- QLocale locale;
- if (!(locale.numberOptions() & QLocale::OmitGroupSeparator))
- flags |= QLocaleData::ThousandsGroup;
- locale_arg = locale.d->m_data->longLongToString(a, -1, base, fieldWidth, flags);
- }
-
- return replaceArgEscapes(*this, d, fieldWidth, arg, locale_arg, fillChar);
-}
-
-/*!
- \overload arg()
-
- \a fieldWidth specifies the minimum amount of space that \a a is
- padded to and filled with the character \a fillChar. A positive
- value produces right-aligned text; a negative value produces
- left-aligned text.
-
- The \a base argument specifies the base to use when converting the
- integer \a a into a string. \a base must be between 2 and 36, with 8
- giving octal, 10 decimal, and 16 hexadecimal numbers.
-
- If \a fillChar is '0' (the number 0, ASCII 48), the locale's zero is
- used. For negative numbers, zero padding might appear before the
- minus sign.
-*/
-QString QString::arg(qulonglong a, int fieldWidth, int base, QChar fillChar) const
-{
- ArgEscapeData d = findArgEscapes(*this);
-
- if (d.occurrences == 0) {
- qWarning() << "QString::arg: Argument missing:" << *this << ',' << a;
- return *this;
- }
-
- unsigned flags = QLocaleData::NoFlags;
- if (fillChar == QLatin1Char('0'))
- flags = QLocaleData::ZeroPadded;
-
- QString arg;
- if (d.occurrences > d.locale_occurrences)
- arg = QLocaleData::c()->unsLongLongToString(a, -1, base, fieldWidth, flags);
-
- QString locale_arg;
- if (d.locale_occurrences > 0) {
- QLocale locale;
- if (!(locale.numberOptions() & QLocale::OmitGroupSeparator))
- flags |= QLocaleData::ThousandsGroup;
- locale_arg = locale.d->m_data->unsLongLongToString(a, -1, base, fieldWidth, flags);
- }
-
- return replaceArgEscapes(*this, d, fieldWidth, arg, locale_arg, fillChar);
-}
-
-/*!
- \overload arg()
-
- \fn QString QString::arg(short a, int fieldWidth, int base, QChar fillChar) const
-
- \a fieldWidth specifies the minimum amount of space that \a a is
- padded to and filled with the character \a fillChar. A positive
- value produces right-aligned text; a negative value produces
- left-aligned text.
-
- The \a base argument specifies the base to use when converting the
- integer \a a into a string. The base must be between 2 and 36, with
- 8 giving octal, 10 decimal, and 16 hexadecimal numbers.
-
- If \a fillChar is '0' (the number 0, ASCII 48), the locale's zero is
- used. For negative numbers, zero padding might appear before the
- minus sign.
-*/
-
-/*!
- \fn QString QString::arg(ushort a, int fieldWidth, int base, QChar fillChar) const
- \overload arg()
-
- \a fieldWidth specifies the minimum amount of space that \a a is
- padded to and filled with the character \a fillChar. A positive
- value produces right-aligned text; a negative value produces
- left-aligned text.
-
- The \a base argument specifies the base to use when converting the
- integer \a a into a string. The base must be between 2 and 36, with
- 8 giving octal, 10 decimal, and 16 hexadecimal numbers.
-
- If \a fillChar is '0' (the number 0, ASCII 48), the locale's zero is
- used. For negative numbers, zero padding might appear before the
- minus sign.
-*/
-
-/*!
- \overload arg()
-*/
-QString QString::arg(QChar a, int fieldWidth, QChar fillChar) const
-{
- QString c;
- c += a;
- return arg(c, fieldWidth, fillChar);
-}
-
-/*!
- \overload arg()
-
- The \a a argument is interpreted as a Latin-1 character.
-*/
-QString QString::arg(char a, int fieldWidth, QChar fillChar) const
-{
- QString c;
- c += QLatin1Char(a);
- return arg(c, fieldWidth, fillChar);
-}
-
-/*!
- \fn QString QString::arg(double a, int fieldWidth, char format, int precision, QChar fillChar) const
- \overload arg()
-
- Argument \a a is formatted according to the specified \a format and
- \a precision. See \l{Argument Formats} for details.
-
- \a fieldWidth specifies the minimum amount of space that \a a is
- padded to and filled with the character \a fillChar. A positive
- value produces right-aligned text; a negative value produces
- left-aligned text.
-
- \snippet code/src_corelib_tools_qstring.cpp 2
-
- The '%' can be followed by an 'L', in which case the sequence is
- replaced with a localized representation of \a a. The conversion
- uses the default locale, set by QLocale::setDefault(). If no
- default locale was specified, the "C" locale is used.
-
- If \a fillChar is '0' (the number 0, ASCII 48), this function will
- use the locale's zero to pad. For negative numbers, the zero padding
- will probably appear before the minus sign.
-
- \sa QLocale::toString()
-*/
-QString QString::arg(double a, int fieldWidth, char fmt, int prec, QChar fillChar) const
-{
- ArgEscapeData d = findArgEscapes(*this);
-
- if (d.occurrences == 0) {
- qWarning("QString::arg: Argument missing: %s, %g", toLocal8Bit().data(), a);
- return *this;
- }
-
- unsigned flags = QLocaleData::NoFlags;
- if (fillChar == QLatin1Char('0'))
- flags |= QLocaleData::ZeroPadded;
-
- if (qIsUpper(fmt))
- flags |= QLocaleData::CapitalEorX;
-
- QLocaleData::DoubleForm form = QLocaleData::DFDecimal;
- switch (qToLower(fmt)) {
- case 'f':
- form = QLocaleData::DFDecimal;
- break;
- case 'e':
- form = QLocaleData::DFExponent;
- break;
- case 'g':
- form = QLocaleData::DFSignificantDigits;
- break;
- default:
-#if defined(QT_CHECK_RANGE)
- qWarning("QString::arg: Invalid format char '%c'", fmt);
-#endif
- break;
- }
-
- QString arg;
- if (d.occurrences > d.locale_occurrences)
- arg = QLocaleData::c()->doubleToString(a, prec, form, fieldWidth, flags | QLocaleData::ZeroPadExponent);
-
- QString locale_arg;
- if (d.locale_occurrences > 0) {
- QLocale locale;
-
- const QLocale::NumberOptions numberOptions = locale.numberOptions();
- if (!(numberOptions & QLocale::OmitGroupSeparator))
- flags |= QLocaleData::ThousandsGroup;
- if (!(numberOptions & QLocale::OmitLeadingZeroInExponent))
- flags |= QLocaleData::ZeroPadExponent;
- if (numberOptions & QLocale::IncludeTrailingZeroesAfterDot)
- flags |= QLocaleData::AddTrailingZeroes;
- locale_arg = locale.d->m_data->doubleToString(a, prec, form, fieldWidth, flags);
- }
-
- return replaceArgEscapes(*this, d, fieldWidth, arg, locale_arg, fillChar);
-}
-
-static int getEscape(const QChar *uc, int *pos, int len, int maxNumber = 999)
-{
- int i = *pos;
- ++i;
- if (i < len && uc[i] == QLatin1Char('L'))
- ++i;
- if (i < len) {
- int escape = uc[i].unicode() - '0';
- if (uint(escape) >= 10U)
- return -1;
- ++i;
- while (i < len) {
- int digit = uc[i].unicode() - '0';
- if (uint(digit) >= 10U)
- break;
- escape = (escape * 10) + digit;
- ++i;
- }
- if (escape <= maxNumber) {
- *pos = i;
- return escape;
- }
- }
- return -1;
-}
-
-/*
- Algorithm for multiArg:
-
- 1. Parse the string as a sequence of verbatim text and placeholders (%L?\d{,3}).
- The L is parsed and accepted for compatibility with non-multi-arg, but since
- multiArg only accepts strings as replacements, the localization request can
- be safely ignored.
- 2. The result of step (1) is a list of (string-ref,int)-tuples. The string-ref
- either points at text to be copied verbatim (in which case the int is -1),
- or, initially, at the textual representation of the placeholder. In that case,
- the int contains the numerical number as parsed from the placeholder.
- 3. Next, collect all the non-negative ints found, sort them in ascending order and
- remove duplicates.
- 3a. If the result has more entires than multiArg() was given replacement strings,
- we have found placeholders we can't satisfy with replacement strings. That is
- fine (there could be another .arg() call coming after this one), so just
- truncate the result to the number of actual multiArg() replacement strings.
- 3b. If the result has less entries than multiArg() was given replacement strings,
- the string is missing placeholders. This is an error that the user should be
- warned about.
- 4. The result of step (3) is a mapping from the index of any replacement string to
- placeholder number. This is the wrong way around, but since placeholder
- numbers could get as large as 999, while we typically don't have more than 9
- replacement strings, we trade 4K of sparsely-used memory for doing a reverse lookup
- each time we need to map a placeholder number to a replacement string index
- (that's a linear search; but still *much* faster than using an associative container).
- 5. Next, for each of the tuples found in step (1), do the following:
- 5a. If the int is negative, do nothing.
- 5b. Otherwise, if the int is found in the result of step (3) at index I, replace
- the string-ref with a string-ref for the (complete) I'th replacement string.
- 5c. Otherwise, do nothing.
- 6. Concatenate all string refs into a single result string.
-*/
-
-namespace {
-struct Part
-{
- Part() : stringRef(), number(0) {}
- Part(const QString &s, int pos, int len, int num = -1) Q_DECL_NOTHROW
- : stringRef(&s, pos, len), number(num) {}
-
- QStringRef stringRef;
- int number;
-};
-} // unnamed namespace
-
-template <>
-class QTypeInfo<Part> : public QTypeInfoMerger<Part, QStringRef, int> {}; // Q_DECLARE_METATYPE
-
-
-namespace {
-
-enum { ExpectedParts = 32 };
-
-typedef QVarLengthArray<Part, ExpectedParts> ParseResult;
-typedef QVarLengthArray<int, ExpectedParts/2> ArgIndexToPlaceholderMap;
-
-static ParseResult parseMultiArgFormatString(const QString &s)
-{
- ParseResult result;
-
- const QChar *uc = s.constData();
- const int len = s.size();
- const int end = len - 1;
- int i = 0;
- int last = 0;
-
- while (i < end) {
- if (uc[i] == QLatin1Char('%')) {
- int percent = i;
- int number = getEscape(uc, &i, len);
- if (number != -1) {
- if (last != percent)
- result.push_back(Part(s, last, percent - last)); // literal text (incl. failed placeholders)
- result.push_back(Part(s, percent, i - percent, number)); // parsed placeholder
- last = i;
- continue;
- }
- }
- ++i;
- }
-
- if (last < len)
- result.push_back(Part(s, last, len - last)); // trailing literal text
-
- return result;
-}
-
-static ArgIndexToPlaceholderMap makeArgIndexToPlaceholderMap(const ParseResult &parts)
-{
- ArgIndexToPlaceholderMap result;
-
- for (ParseResult::const_iterator it = parts.begin(), end = parts.end(); it != end; ++it) {
- if (it->number >= 0)
- result.push_back(it->number);
- }
-
- std::sort(result.begin(), result.end());
- result.erase(std::unique(result.begin(), result.end()),
- result.end());
-
- return result;
-}
-
-static int resolveStringRefsAndReturnTotalSize(ParseResult &parts, const ArgIndexToPlaceholderMap &argIndexToPlaceholderMap, const QString *args[])
-{
- int totalSize = 0;
- for (ParseResult::iterator pit = parts.begin(), end = parts.end(); pit != end; ++pit) {
- if (pit->number != -1) {
- const ArgIndexToPlaceholderMap::const_iterator ait
- = std::find(argIndexToPlaceholderMap.begin(), argIndexToPlaceholderMap.end(), pit->number);
- if (ait != argIndexToPlaceholderMap.end())
- pit->stringRef = QStringRef(args[ait - argIndexToPlaceholderMap.begin()]);
- }
- totalSize += pit->stringRef.size();
- }
- return totalSize;
-}
-
-} // unnamed namespace
-
-QString QString::multiArg(int numArgs, const QString **args) const
-{
- // Step 1-2 above
- ParseResult parts = parseMultiArgFormatString(*this);
-
- // 3-4
- ArgIndexToPlaceholderMap argIndexToPlaceholderMap = makeArgIndexToPlaceholderMap(parts);
-
- if (argIndexToPlaceholderMap.size() > numArgs) // 3a
- argIndexToPlaceholderMap.resize(numArgs);
- else if (argIndexToPlaceholderMap.size() < numArgs) // 3b
- qWarning("QString::arg: %d argument(s) missing in %s",
- numArgs - argIndexToPlaceholderMap.size(), toLocal8Bit().data());
-
- // 5
- const int totalSize = resolveStringRefsAndReturnTotalSize(parts, argIndexToPlaceholderMap, args);
-
- // 6:
- QString result(totalSize, Qt::Uninitialized);
- QChar *out = result.data();
-
- for (ParseResult::const_iterator it = parts.begin(), end = parts.end(); it != end; ++it) {
- if (const int sz = it->stringRef.size()) {
- memcpy(out, it->stringRef.constData(), sz * sizeof(QChar));
- out += sz;
- }
- }
-
- return result;
-}
-
-/*! \fn bool QString::isSimpleText() const
-
- \internal
-*/
-bool QString::isSimpleText() const
-{
- const ushort *p = d->data();
- const ushort * const end = p + d->size;
- while (p < end) {
- ushort uc = *p;
- // sort out regions of complex text formatting
- if (uc > 0x058f && (uc < 0x1100 || uc > 0xfb0f)) {
- return false;
- }
- p++;
- }
-
- return true;
-}
-
-/*! \fn bool QString::isRightToLeft() const
-
- Returns \c true if the string is read right to left.
-
- \sa QStringRef::isRightToLeft()
-*/
-bool QString::isRightToLeft() const
-{
- return QtPrivate::isRightToLeft(QStringView(*this));
-}
-
-/*! \fn QChar *QString::data()
-
- Returns a pointer to the data stored in the QString. The pointer
- can be used to access and modify the characters that compose the
- string.
-
- Unlike constData() and unicode(), the returned data is always
- '\\0'-terminated.
-
- Example:
-
- \snippet qstring/main.cpp 19
-
- Note that the pointer remains valid only as long as the string is
- not modified by other means. For read-only access, constData() is
- faster because it never causes a \l{deep copy} to occur.
-
- \sa constData(), operator[]()
-*/
-
-/*! \fn const QChar *QString::data() const
-
- \overload
-
- \note The returned string may not be '\\0'-terminated.
- Use size() to determine the length of the array.
-
- \sa fromRawData()
-*/
-
-/*! \fn const QChar *QString::constData() const
-
- Returns a pointer to the data stored in the QString. The pointer
- can be used to access the characters that compose the string.
-
- Note that the pointer remains valid only as long as the string is
- not modified.
-
- \note The returned string may not be '\\0'-terminated.
- Use size() to determine the length of the array.
-
- \sa data(), operator[](), fromRawData()
-*/
-
-/*! \fn void QString::push_front(const QString &other)
-
- This function is provided for STL compatibility, prepending the
- given \a other string to the beginning of this string. It is
- equivalent to \c prepend(other).
-
- \sa prepend()
-*/
-
-/*! \fn void QString::push_front(QChar ch)
-
- \overload
-
- Prepends the given \a ch character to the beginning of this string.
-*/
-
-/*! \fn void QString::push_back(const QString &other)
-
- This function is provided for STL compatibility, appending the
- given \a other string onto the end of this string. It is
- equivalent to \c append(other).
-
- \sa append()
-*/
-
-/*! \fn void QString::push_back(QChar ch)
-
- \overload
-
- Appends the given \a ch character onto the end of this string.
-*/
-
-/*! \fn void QString::shrink_to_fit()
- \since 5.10
-
- This function is provided for STL compatibility. It is
- equivalent to squeeze().
-
- \sa squeeze()
-*/
-
-/*!
- \fn std::string QString::toStdString() const
-
- Returns a std::string object with the data contained in this
- QString. The Unicode data is converted into 8-bit characters using
- the toUtf8() function.
-
- This method is mostly useful to pass a QString to a function
- that accepts a std::string object.
-
- \sa toLatin1(), toUtf8(), toLocal8Bit(), QByteArray::toStdString()
-*/
-
-/*!
- Constructs a QString that uses the first \a size Unicode characters
- in the array \a unicode. The data in \a unicode is \e not
- copied. The caller must be able to guarantee that \a unicode will
- not be deleted or modified as long as the QString (or an
- unmodified copy of it) exists.
-
- Any attempts to modify the QString or copies of it will cause it
- to create a deep copy of the data, ensuring that the raw data
- isn't modified.
-
- Here is an example of how we can use a QRegularExpression on raw data in
- memory without requiring to copy the data into a QString:
-
- \snippet qstring/main.cpp 22
- \snippet qstring/main.cpp 23
-
- \warning A string created with fromRawData() is \e not
- '\\0'-terminated, unless the raw data contains a '\\0' character
- at position \a size. This means unicode() will \e not return a
- '\\0'-terminated string (although utf16() does, at the cost of
- copying the raw data).
-
- \sa fromUtf16(), setRawData()
-*/
-QString QString::fromRawData(const QChar *unicode, int size)
-{
- Data *x;
- if (!unicode) {
- x = Data::sharedNull();
- } else if (!size) {
- x = Data::allocate(0);
- } else {
- x = Data::fromRawData(reinterpret_cast<const ushort *>(unicode), size);
- Q_CHECK_PTR(x);
- }
- QStringDataPtr dataPtr = { x };
- return QString(dataPtr);
-}
-
-/*!
- \since 4.7
-
- Resets the QString to use the first \a size Unicode characters
- in the array \a unicode. The data in \a unicode is \e not
- copied. The caller must be able to guarantee that \a unicode will
- not be deleted or modified as long as the QString (or an
- unmodified copy of it) exists.
-
- This function can be used instead of fromRawData() to re-use
- existings QString objects to save memory re-allocations.
-
- \sa fromRawData()
-*/
-QString &QString::setRawData(const QChar *unicode, int size)
-{
- if (d->ref.isShared() || d->alloc) {
- *this = fromRawData(unicode, size);
- } else {
- if (unicode) {
- d->size = size;
- d->offset = reinterpret_cast<const char *>(unicode) - reinterpret_cast<char *>(d);
- } else {
- d->offset = sizeof(QStringData);
- d->size = 0;
- }
- }
- return *this;
-}
-
-/*! \fn QString QString::fromStdU16String(const std::u16string &str)
- \since 5.5
-
- Returns a copy of the \a str string. The given string is assumed
- to be encoded in UTF-16.
-
- \sa fromUtf16(), fromStdWString(), fromStdU32String()
-*/
-
-/*!
- \fn std::u16string QString::toStdU16String() const
- \since 5.5
-
- Returns a std::u16string object with the data contained in this
- QString. The Unicode data is the same as returned by the utf16()
- method.
-
- \sa utf16(), toStdWString(), toStdU32String()
-*/
-
-/*! \fn QString QString::fromStdU32String(const std::u32string &str)
- \since 5.5
-
- Returns a copy of the \a str string. The given string is assumed
- to be encoded in UCS-4.
-
- \sa fromUcs4(), fromStdWString(), fromStdU16String()
-*/
-
-/*!
- \fn std::u32string QString::toStdU32String() const
- \since 5.5
-
- Returns a std::u32string object with the data contained in this
- QString. The Unicode data is the same as returned by the toUcs4()
- method.
-
- \sa toUcs4(), toStdWString(), toStdU16String()
-*/
-
-/*! \class QLatin1String
- \inmodule QtCore
- \brief The QLatin1String class provides a thin wrapper around an US-ASCII/Latin-1 encoded string literal.
-
- \ingroup string-processing
- \reentrant
-
- Many of QString's member functions are overloaded to accept
- \c{const char *} instead of QString. This includes the copy
- constructor, the assignment operator, the comparison operators,
- and various other functions such as \l{QString::insert()}{insert()}, \l{QString::replace()}{replace()},
- and \l{QString::indexOf()}{indexOf()}. These functions
- are usually optimized to avoid constructing a QString object for
- the \c{const char *} data. For example, assuming \c str is a
- QString,
-
- \snippet code/src_corelib_tools_qstring.cpp 3
-
- is much faster than
-
- \snippet code/src_corelib_tools_qstring.cpp 4
-
- because it doesn't construct four temporary QString objects and
- make a deep copy of the character data.
-
- Applications that define \c QT_NO_CAST_FROM_ASCII (as explained
- in the QString documentation) don't have access to QString's
- \c{const char *} API. To provide an efficient way of specifying
- constant Latin-1 strings, Qt provides the QLatin1String, which is
- just a very thin wrapper around a \c{const char *}. Using
- QLatin1String, the example code above becomes
-
- \snippet code/src_corelib_tools_qstring.cpp 5
-
- This is a bit longer to type, but it provides exactly the same
- benefits as the first version of the code, and is faster than
- converting the Latin-1 strings using QString::fromLatin1().
-
- Thanks to the QString(QLatin1String) constructor,
- QLatin1String can be used everywhere a QString is expected. For
- example:
-
- \snippet code/src_corelib_tools_qstring.cpp 6
-
- \note If the function you're calling with a QLatin1String
- argument isn't actually overloaded to take QLatin1String, the
- implicit conversion to QString will trigger a memory allocation,
- which is usually what you want to avoid by using QLatin1String
- in the first place. In those cases, using QStringLiteral may be
- the better option.
-
- \sa QString, QLatin1Char, {QStringLiteral()}{QStringLiteral}, QT_NO_CAST_FROM_ASCII
-*/
-
-/*!
- \typedef QLatin1String::value_type
- \since 5.10
-
- Alias for \c{const char}. Provided for compatibility with the STL.
-*/
-
-/*!
- \typedef QLatin1String::difference_type
- \since 5.10
-
- Alias for \c{int}. Provided for compatibility with the STL.
-*/
-
-/*!
- \typedef QLatin1String::size_type
- \since 5.10
-
- Alias for \c{int}. Provided for compatibility with the STL.
-*/
-
-/*!
- \typedef QLatin1String::reference
- \since 5.10
-
- Alias for \c{value_type &}. Provided for compatibility with the STL.
-*/
-
-/*!
- \typedef QLatin1String::const_reference
- \since 5.11
-
- Alias for \c{reference}. Provided for compatibility with the STL.
-*/
-
-/*!
- \typedef QLatin1String::iterator
- \since 5.10
-
- This typedef provides an STL-style const iterator for QLatin1String.
-
- QLatin1String does not support mutable iterators, so this is the same
- as const_iterator.
-
- \sa const_iterator, reverse_iterator
-*/
-
-/*!
- \typedef QLatin1String::const_iterator
- \since 5.10
-
- This typedef provides an STL-style const iterator for QLatin1String.
-
- \sa iterator, const_reverse_iterator
-*/
-
-/*!
- \typedef QLatin1String::reverse_iterator
- \since 5.10
-
- This typedef provides an STL-style const reverse iterator for QLatin1String.
-
- QLatin1String does not support mutable reverse iterators, so this is the
- same as const_reverse_iterator.
-
- \sa const_reverse_iterator, iterator
-*/
-
-/*!
- \typedef QLatin1String::const_reverse_iterator
- \since 5.10
-
- This typedef provides an STL-style const reverse iterator for QLatin1String.
-
- \sa reverse_iterator, const_iterator
-*/
-
-/*! \fn QLatin1String::QLatin1String()
- \since 5.6
-
- Constructs a QLatin1String object that stores a nullptr.
-*/
-
-/*! \fn QLatin1String::QLatin1String(const char *str)
-
- Constructs a QLatin1String object that stores \a str.
-
- The string data is \e not copied. The caller must be able to
- guarantee that \a str will not be deleted or modified as long as
- the QLatin1String object exists.
-
- \sa latin1()
-*/
-
-/*! \fn QLatin1String::QLatin1String(const char *str, int size)
-
- Constructs a QLatin1String object that stores \a str with \a size.
-
- The string data is \e not copied. The caller must be able to
- guarantee that \a str will not be deleted or modified as long as
- the QLatin1String object exists.
-
- \sa latin1()
-*/
-
-/*!
- \fn QLatin1String::QLatin1String(const char *first, const char *last)
- \since 5.10
-
- Constructs a QLatin1String object that stores \a first with length
- (\a last - \a first).
-
- The range \c{[first,last)} must remain valid for the lifetime of
- this Latin-1 string object.
-
- Passing \nullptr as \a first is safe if \a last is \nullptr,
- too, and results in a null Latin-1 string.
-
- The behavior is undefined if \a last precedes \a first, \a first
- is \nullptr and \a last is not, or if \c{last - first >
- INT_MAX}.
-*/
-
-/*! \fn QLatin1String::QLatin1String(const QByteArray &str)
-
- Constructs a QLatin1String object that stores \a str.
-
- The string data is \e not copied. The caller must be able to
- guarantee that \a str will not be deleted or modified as long as
- the QLatin1String object exists.
-
- \sa latin1()
-*/
-
-/*! \fn const char *QLatin1String::latin1() const
-
- Returns the Latin-1 string stored in this object.
-*/
-
-/*! \fn const char *QLatin1String::data() const
-
- Returns the Latin-1 string stored in this object.
-*/
-
-/*! \fn int QLatin1String::size() const
-
- Returns the size of the Latin-1 string stored in this object.
-*/
-
-/*! \fn bool QLatin1String::isNull() const
- \since 5.10
-
- Returns whether the Latin-1 string stored in this object is null
- (\c{data() == nullptr}) or not.
-
- \sa isEmpty(), data()
-*/
-
-/*! \fn bool QLatin1String::isEmpty() const
- \since 5.10
-
- Returns whether the Latin-1 string stored in this object is empty
- (\c{size() == 0}) or not.
-
- \sa isNull(), size()
-*/
-
-/*! \fn QLatin1Char QLatin1String::at(int pos) const
- \since 5.8
-
- Returns the character at position \a pos in this object.
-
- \note This function performs no error checking.
- The behavior is undefined when \a pos < 0 or \a pos >= size().
-
- \sa operator[]()
-*/
-
-/*! \fn QLatin1Char QLatin1String::operator[](int pos) const
- \since 5.8
-
- Returns the character at position \a pos in this object.
-
- \note This function performs no error checking.
- The behavior is undefined when \a pos < 0 or \a pos >= size().
-
- \sa at()
-*/
-
-/*!
- \fn QLatin1Char QLatin1String::front() const
- \since 5.10
-
- Returns the first character in the string.
- Same as \c{at(0)}.
-
- This function is provided for STL compatibility.
-
- \warning Calling this function on an empty string constitutes
- undefined behavior.
-
- \sa back(), at(), operator[]()
-*/
-
-/*!
- \fn QLatin1Char QLatin1String::back() const
- \since 5.10
-
- Returns the last character in the string.
- Same as \c{at(size() - 1)}.
-
- This function is provided for STL compatibility.
-
- \warning Calling this function on an empty string constitutes
- undefined behavior.
-
- \sa front(), at(), operator[]()
-*/
-
-/*!
- \fn bool QLatin1String::startsWith(QStringView str, Qt::CaseSensitivity cs) const
- \since 5.10
- \fn bool QLatin1String::startsWith(QLatin1String l1, Qt::CaseSensitivity cs) const
- \since 5.10
- \fn bool QLatin1String::startsWith(QChar ch) const
- \since 5.10
- \fn bool QLatin1String::startsWith(QChar ch, Qt::CaseSensitivity cs) const
- \since 5.10
-
- Returns \c true if this Latin-1 string starts with string-view \a str,
- Latin-1 string \a l1, or character \a ch, respectively;
- otherwise returns \c false.
-
- If \a cs is Qt::CaseSensitive (the default), the search is case-sensitive;
- otherwise the search is case-insensitive.
-
- \sa endsWith()
-*/
-
-/*!
- \fn bool QLatin1String::endsWith(QStringView str, Qt::CaseSensitivity cs) const
- \since 5.10
- \fn bool QLatin1String::endsWith(QLatin1String l1, Qt::CaseSensitivity cs) const
- \since 5.10
- \fn bool QLatin1String::endsWith(QChar ch) const
- \since 5.10
- \fn bool QLatin1String::endsWith(QChar ch, Qt::CaseSensitivity cs) const
- \since 5.10
-
- Returns \c true if this Latin-1 string ends with string-view \a str,
- Latin-1 string \a l1, or character \a ch, respectively;
- otherwise returns \c false.
-
- If \a cs is Qt::CaseSensitive (the default), the search is case-sensitive;
- otherwise the search is case-insensitive.
-
- \sa startsWith()
-*/
-
-/*!
- \fn QLatin1String::const_iterator QLatin1String::begin() const
- \since 5.10
-
- Returns a const \l{STL-style iterators}{STL-style iterator} pointing to the first character in
- the string.
-
- This function is provided for STL compatibility.
-
- \sa end(), cbegin(), rbegin(), data()
-*/
-
-/*!
- \fn QLatin1String::const_iterator QLatin1String::cbegin() const
- \since 5.10
-
- Same as begin().
-
- This function is provided for STL compatibility.
-
- \sa cend(), begin(), crbegin(), data()
-*/
-
-/*!
- \fn QLatin1String::const_iterator QLatin1String::end() const
- \since 5.10
-
- Returns a const \l{STL-style iterators}{STL-style iterator} pointing to the imaginary
- character after the last character in the list.
-
- This function is provided for STL compatibility.
-
- \sa begin(), cend(), rend()
-*/
-
-/*! \fn QLatin1String::const_iterator QLatin1String::cend() const
- \since 5.10
-
- Same as end().
-
- This function is provided for STL compatibility.
-
- \sa cbegin(), end(), crend()
-*/
-
-/*!
- \fn QLatin1String::const_reverse_iterator QLatin1String::rbegin() const
- \since 5.10
-
- Returns a const \l{STL-style iterators}{STL-style} reverse iterator pointing to the first
- character in the string, in reverse order.
-
- This function is provided for STL compatibility.
-
- \sa rend(), crbegin(), begin()
-*/
-
-/*!
- \fn QLatin1String::const_reverse_iterator QLatin1String::crbegin() const
- \since 5.10
-
- Same as rbegin().
-
- This function is provided for STL compatibility.
-
- \sa crend(), rbegin(), cbegin()
-*/
-
-/*!
- \fn QLatin1String::const_reverse_iterator QLatin1String::rend() const
- \since 5.10
-
- Returns a \l{STL-style iterators}{STL-style} reverse iterator pointing to one past
- the last character in the string, in reverse order.
-
- This function is provided for STL compatibility.
-
- \sa rbegin(), crend(), end()
-*/
-
-/*!
- \fn QLatin1String::const_reverse_iterator QLatin1String::crend() const
- \since 5.10
-
- Same as rend().
-
- This function is provided for STL compatibility.
-
- \sa crbegin(), rend(), cend()
-*/
-
-/*! \fn QLatin1String QLatin1String::mid(int start) const
- \since 5.8
-
- Returns the substring starting at position \a start in this object,
- and extending to the end of the string.
-
- \note This function performs no error checking.
- The behavior is undefined when \a start < 0 or \a start > size().
-
- \sa left(), right(), chopped(), chop(), truncate()
-*/
-
-/*! \fn QLatin1String QLatin1String::mid(int start, int length) const
- \since 5.8
- \overload
-
- Returns the substring of length \a length starting at position
- \a start in this object.
-
- \note This function performs no error checking.
- The behavior is undefined when \a start < 0, \a length < 0,
- or \a start + \a length > size().
-
- \sa left(), right(), chopped(), chop(), truncate()
-*/
-
-/*! \fn QLatin1String QLatin1String::left(int length) const
- \since 5.8
-
- Returns the substring of length \a length starting at position
- 0 in this object.
-
- \note This function performs no error checking.
- The behavior is undefined when \a length < 0 or \a length > size().
-
- \sa mid(), right(), chopped(), chop(), truncate()
-*/
-
-/*! \fn QLatin1String QLatin1String::right(int length) const
- \since 5.8
-
- Returns the substring of length \a length starting at position
- size() - \a length in this object.
-
- \note This function performs no error checking.
- The behavior is undefined when \a length < 0 or \a length > size().
-
- \sa mid(), left(), chopped(), chop(), truncate()
-*/
-
-/*!
- \fn QLatin1String QLatin1String::chopped(int length) const
- \since 5.10
-
- Returns the substring of length size() - \a length starting at the
- beginning of this object.
-
- Same as \c{left(size() - length)}.
-
- \note The behavior is undefined when \a length < 0 or \a length > size().
-
- \sa mid(), left(), right(), chop(), truncate()
-*/
-
-/*!
- \fn void QLatin1String::truncate(int length)
- \since 5.10
-
- Truncates this string to length \a length.
-
- Same as \c{*this = left(length)}.
-
- \note The behavior is undefined when \a length < 0 or \a length > size().
-
- \sa mid(), left(), right(), chopped(), chop()
-*/
-
-/*!
- \fn void QLatin1String::chop(int length)
- \since 5.10
-
- Truncates this string by \a length characters.
-
- Same as \c{*this = left(size() - length)}.
-
- \note The behavior is undefined when \a length < 0 or \a length > size().
-
- \sa mid(), left(), right(), chopped(), truncate()
-*/
-
-/*!
- \fn QLatin1String QLatin1String::trimmed() const
- \since 5.10
-
- Strips leading and trailing whitespace and returns the result.
-
- Whitespace means any character for which QChar::isSpace() returns
- \c true. This includes the ASCII characters '\\t', '\\n', '\\v',
- '\\f', '\\r', and ' '.
-*/
-
-/*! \fn bool QLatin1String::operator==(const QString &other) const
-
- Returns \c true if this string is equal to string \a other;
- otherwise returns \c false.
-
- The comparison is based exclusively on the numeric Unicode values
- of the characters and is very fast, but is not what a human would
- expect. Consider sorting user-interface strings with
- QString::localeAwareCompare().
-*/
-
-/*!
- \fn bool QLatin1String::operator==(const char *other) const
- \since 4.3
- \overload
-
- The \a other const char pointer is converted to a QString using
- the QString::fromUtf8() function.
-
- You can disable this operator by defining \c
- QT_NO_CAST_FROM_ASCII when you compile your applications. This
- can be useful if you want to ensure that all user-visible strings
- go through QObject::tr(), for example.
-
- \sa QT_NO_CAST_FROM_ASCII
-*/
-
-/*!
- \fn bool QLatin1String::operator==(const QByteArray &other) const
- \since 5.0
- \overload
-
- The \a other byte array is converted to a QString using
- the QString::fromUtf8() function.
-
- You can disable this operator by defining \c
- QT_NO_CAST_FROM_ASCII when you compile your applications. This
- can be useful if you want to ensure that all user-visible strings
- go through QObject::tr(), for example.
-
- \sa QT_NO_CAST_FROM_ASCII
-*/
-
-/*! \fn bool QLatin1String::operator!=(const QString &other) const
-
- Returns \c true if this string is not equal to string \a other;
- otherwise returns \c false.
-
- The comparison is based exclusively on the numeric Unicode values
- of the characters and is very fast, but is not what a human would
- expect. Consider sorting user-interface strings with
- QString::localeAwareCompare().
-*/
-
-/*!
- \fn bool QLatin1String::operator!=(const char *other) const
- \since 4.3
- \overload operator!=()
-
- The \a other const char pointer is converted to a QString using
- the QString::fromUtf8() function.
-
- You can disable this operator by defining \c
- QT_NO_CAST_FROM_ASCII when you compile your applications. This
- can be useful if you want to ensure that all user-visible strings
- go through QObject::tr(), for example.
-
- \sa QT_NO_CAST_FROM_ASCII
-*/
-
-/*!
- \fn bool QLatin1String::operator!=(const QByteArray &other) const
- \since 5.0
- \overload operator!=()
-
- The \a other byte array is converted to a QString using
- the QString::fromUtf8() function.
-
- You can disable this operator by defining \c
- QT_NO_CAST_FROM_ASCII when you compile your applications. This
- can be useful if you want to ensure that all user-visible strings
- go through QObject::tr(), for example.
-
- \sa QT_NO_CAST_FROM_ASCII
-*/
-
-/*!
- \fn bool QLatin1String::operator>(const QString &other) const
-
- Returns \c true if this string is lexically greater than string \a
- other; otherwise returns \c false.
-
- The comparison is based exclusively on the numeric Unicode values
- of the characters and is very fast, but is not what a human would
- expect. Consider sorting user-interface strings with
- QString::localeAwareCompare().
-*/
-
-/*!
- \fn bool QLatin1String::operator>(const char *other) const
- \since 4.3
- \overload
-
- The \a other const char pointer is converted to a QString using
- the QString::fromUtf8() function.
-
- You can disable this operator by defining \c QT_NO_CAST_FROM_ASCII
- when you compile your applications. This can be useful if you want
- to ensure that all user-visible strings go through QObject::tr(),
- for example.
-
- \sa QT_NO_CAST_FROM_ASCII
-*/
-
-/*!
- \fn bool QLatin1String::operator>(const QByteArray &other) const
- \since 5.0
- \overload
-
- The \a other const char pointer is converted to a QString using
- the QString::fromUtf8() function.
-
- You can disable this operator by defining \c QT_NO_CAST_FROM_ASCII
- when you compile your applications. This can be useful if you want
- to ensure that all user-visible strings go through QObject::tr(),
- for example.
-
- \sa QT_NO_CAST_FROM_ASCII
-*/
-
-/*!
- \fn bool QLatin1String::operator<(const QString &other) const
-
- Returns \c true if this string is lexically less than the \a other
- string; otherwise returns \c false.
-
- The comparison is based exclusively on the numeric Unicode values
- of the characters and is very fast, but is not what a human would
- expect. Consider sorting user-interface strings using the
- QString::localeAwareCompare() function.
-*/
-
-/*!
- \fn bool QLatin1String::operator<(const char *other) const
- \since 4.3
- \overload
-
- The \a other const char pointer is converted to a QString using
- the QString::fromUtf8() function.
-
- You can disable this operator by defining \c
- QT_NO_CAST_FROM_ASCII when you compile your applications. This
- can be useful if you want to ensure that all user-visible strings
- go through QObject::tr(), for example.
-
- \sa QT_NO_CAST_FROM_ASCII
-*/
-
-/*!
- \fn bool QLatin1String::operator<(const QByteArray &other) const
- \since 5.0
- \overload
-
- The \a other const char pointer is converted to a QString using
- the QString::fromUtf8() function.
-
- You can disable this operator by defining \c
- QT_NO_CAST_FROM_ASCII when you compile your applications. This
- can be useful if you want to ensure that all user-visible strings
- go through QObject::tr(), for example.
-
- \sa QT_NO_CAST_FROM_ASCII
-*/
-
-/*!
- \fn bool QLatin1String::operator>=(const QString &other) const
-
- Returns \c true if this string is lexically greater than or equal
- to string \a other; otherwise returns \c false.
-
- The comparison is based exclusively on the numeric Unicode values
- of the characters and is very fast, but is not what a human would
- expect. Consider sorting user-interface strings with
- QString::localeAwareCompare().
-*/
-
-/*!
- \fn bool QLatin1String::operator>=(const char *other) const
- \since 4.3
- \overload
-
- The \a other const char pointer is converted to a QString using
- the QString::fromUtf8() function.
-
- You can disable this operator by defining \c
- QT_NO_CAST_FROM_ASCII when you compile your applications. This
- can be useful if you want to ensure that all user-visible strings
- go through QObject::tr(), for example.
-
- \sa QT_NO_CAST_FROM_ASCII
-*/
-
-/*!
- \fn bool QLatin1String::operator>=(const QByteArray &other) const
- \since 5.0
- \overload
-
- The \a other array is converted to a QString using
- the QString::fromUtf8() function.
-
- You can disable this operator by defining \c
- QT_NO_CAST_FROM_ASCII when you compile your applications. This
- can be useful if you want to ensure that all user-visible strings
- go through QObject::tr(), for example.
-
- \sa QT_NO_CAST_FROM_ASCII
-*/
-
-/*! \fn bool QLatin1String::operator<=(const QString &other) const
-
- Returns \c true if this string is lexically less than or equal
- to string \a other; otherwise returns \c false.
-
- The comparison is based exclusively on the numeric Unicode values
- of the characters and is very fast, but is not what a human would
- expect. Consider sorting user-interface strings with
- QString::localeAwareCompare().
-*/
-
-/*!
- \fn bool QLatin1String::operator<=(const char *other) const
- \since 4.3
- \overload
-
- The \a other const char pointer is converted to a QString using
- the QString::fromUtf8() function.
-
- You can disable this operator by defining \c
- QT_NO_CAST_FROM_ASCII when you compile your applications. This
- can be useful if you want to ensure that all user-visible strings
- go through QObject::tr(), for example.
-
- \sa QT_NO_CAST_FROM_ASCII
-*/
-
-/*!
- \fn bool QLatin1String::operator<=(const QByteArray &other) const
- \since 5.0
- \overload
-
- The \a other array is converted to a QString using
- the QString::fromUtf8() function.
-
- You can disable this operator by defining \c
- QT_NO_CAST_FROM_ASCII when you compile your applications. This
- can be useful if you want to ensure that all user-visible strings
- go through QObject::tr(), for example.
-
- \sa QT_NO_CAST_FROM_ASCII
-*/
-
-
-/*! \fn bool operator==(QLatin1String s1, QLatin1String s2)
- \relates QLatin1String
-
- Returns \c true if string \a s1 is lexically equal to string \a s2; otherwise
- returns \c false.
-*/
-/*! \fn bool operator!=(QLatin1String s1, QLatin1String s2)
- \relates QLatin1String
-
- Returns \c true if string \a s1 is lexically unequal to string \a s2; otherwise
- returns \c false.
-*/
-/*! \fn bool operator<(QLatin1String s1, QLatin1String s2)
- \relates QLatin1String
-
- Returns \c true if string \a s1 is lexically smaller than string \a s2; otherwise
- returns \c false.
-*/
-/*! \fn bool operator<=(QLatin1String s1, QLatin1String s2)
- \relates QLatin1String
-
- Returns \c true if string \a s1 is lexically smaller than or equal to string \a s2; otherwise
- returns \c false.
-*/
-/*! \fn bool operator>(QLatin1String s1, QLatin1String s2)
- \relates QLatin1String
-
- Returns \c true if string \a s1 is lexically greater than string \a s2; otherwise
- returns \c false.
-*/
-/*! \fn bool operator>=(QLatin1String s1, QLatin1String s2)
- \relates QLatin1String
-
- Returns \c true if string \a s1 is lexically greater than or equal to
- string \a s2; otherwise returns \c false.
-*/
-
-
-#if !defined(QT_NO_DATASTREAM) || (defined(QT_BOOTSTRAPPED) && !defined(QT_BUILD_QMAKE))
-/*!
- \fn QDataStream &operator<<(QDataStream &stream, const QString &string)
- \relates QString
-
- Writes the given \a string to the specified \a stream.
-
- \sa {Serializing Qt Data Types}
-*/
-
-QDataStream &operator<<(QDataStream &out, const QString &str)
-{
- if (out.version() == 1) {
- out << str.toLatin1();
- } else {
- if (!str.isNull() || out.version() < 3) {
- if ((out.byteOrder() == QDataStream::BigEndian) == (QSysInfo::ByteOrder == QSysInfo::BigEndian)) {
- out.writeBytes(reinterpret_cast<const char *>(str.unicode()), sizeof(QChar) * str.length());
- } else {
- QVarLengthArray<ushort> buffer(str.length());
- qbswap<sizeof(ushort)>(str.constData(), str.length(), buffer.data());
- out.writeBytes(reinterpret_cast<const char *>(buffer.data()), sizeof(ushort) * buffer.size());
- }
- } else {
- // write null marker
- out << (quint32)0xffffffff;
- }
- }
- return out;
-}
-
-/*!
- \fn QDataStream &operator>>(QDataStream &stream, QString &string)
- \relates QString
-
- Reads a string from the specified \a stream into the given \a string.
-
- \sa {Serializing Qt Data Types}
-*/
-
-QDataStream &operator>>(QDataStream &in, QString &str)
-{
- if (in.version() == 1) {
- QByteArray l;
- in >> l;
- str = QString::fromLatin1(l);
- } else {
- quint32 bytes = 0;
- in >> bytes; // read size of string
- if (bytes == 0xffffffff) { // null string
- str.clear();
- } else if (bytes > 0) { // not empty
- if (bytes & 0x1) {
- str.clear();
- in.setStatus(QDataStream::ReadCorruptData);
- return in;
- }
-
- const quint32 Step = 1024 * 1024;
- quint32 len = bytes / 2;
- quint32 allocated = 0;
-
- while (allocated < len) {
- int blockSize = qMin(Step, len - allocated);
- str.resize(allocated + blockSize);
- if (in.readRawData(reinterpret_cast<char *>(str.data()) + allocated * 2,
- blockSize * 2) != blockSize * 2) {
- str.clear();
- in.setStatus(QDataStream::ReadPastEnd);
- return in;
- }
- allocated += blockSize;
- }
-
- if ((in.byteOrder() == QDataStream::BigEndian)
- != (QSysInfo::ByteOrder == QSysInfo::BigEndian)) {
- ushort *data = reinterpret_cast<ushort *>(str.data());
- qbswap<sizeof(*data)>(data, len, data);
- }
- } else {
- str = QString(QLatin1String(""));
- }
- }
- return in;
-}
-#endif // QT_NO_DATASTREAM
-
-
-
-
-/*!
- \class QStringRef
- \inmodule QtCore
- \since 4.3
- \brief The QStringRef class provides a thin wrapper around QString substrings.
- \reentrant
- \ingroup tools
- \ingroup string-processing
-
- QStringRef provides a read-only subset of the QString API.
-
- A string reference explicitly references a portion of a string()
- with a given size(), starting at a specific position(). Calling
- toString() returns a copy of the data as a real QString instance.
-
- This class is designed to improve the performance of substring
- handling when manipulating substrings obtained from existing QString
- instances. QStringRef avoids the memory allocation and reference
- counting overhead of a standard QString by simply referencing a
- part of the original string. This can prove to be advantageous in
- low level code, such as that used in a parser, at the expense of
- potentially more complex code.
-
- For most users, there are no semantic benefits to using QStringRef
- instead of QString since QStringRef requires attention to be paid
- to memory management issues, potentially making code more complex
- to write and maintain.
-
- \warning A QStringRef is only valid as long as the referenced
- string exists. If the original string is deleted, the string
- reference points to an invalid memory location.
-
- We suggest that you only use this class in stable code where profiling
- has clearly identified that performance improvements can be made by
- replacing standard string operations with the optimized substring
- handling provided by this class.
-
- \sa {Implicitly Shared Classes}
-*/
-
-/*!
- \typedef QStringRef::size_type
- \internal
-*/
-
-/*!
- \typedef QStringRef::value_type
- \internal
-*/
-
-/*!
- \typedef QStringRef::const_pointer
- \internal
-*/
-
-/*!
- \typedef QStringRef::const_reference
- \internal
-*/
-
-/*!
- \typedef QStringRef::const_iterator
- \since 5.4
-
- This typedef provides an STL-style const iterator for QStringRef.
-
- \sa QStringRef::const_reverse_iterator
-*/
-
-/*!
- \typedef QStringRef::const_reverse_iterator
- \since 5.7
-
- This typedef provides an STL-style const reverse iterator for QStringRef.
-
- \sa QStringRef::const_iterator
-*/
-
-/*!
- \fn QStringRef::QStringRef()
-
- Constructs an empty string reference.
-*/
-
-/*! \fn QStringRef::QStringRef(const QString *string, int position, int length)
-
-Constructs a string reference to the range of characters in the given
-\a string specified by the starting \a position and \a length in characters.
-
-\warning This function exists to improve performance as much as possible,
-and performs no bounds checking. For program correctness, \a position and
-\a length must describe a valid substring of \a string.
-
-This means that the starting \a position must be positive or 0 and smaller
-than \a string's length, and \a length must be positive or 0 but smaller than
-the string's length minus the starting \a position;
-i.e, 0 <= position < string->length() and
-0 <= length <= string->length() - position must both be satisfied.
-*/
-
-/*! \fn QStringRef::QStringRef(const QString *string)
-
-Constructs a string reference to the given \a string.
-*/
-
-/*! \fn QStringRef::QStringRef(const QStringRef &other)
-
-Constructs a copy of the \a other string reference.
- */
-/*!
-\fn QStringRef::~QStringRef()
-
-Destroys the string reference.
-
-Since this class is only used to refer to string data, and does not take
-ownership of it, no memory is freed when instances are destroyed.
-*/
-
-/*!
- \fn int QStringRef::position() const
-
- Returns the starting position in the referenced string that is referred to
- by the string reference.
-
- \sa size(), string()
-*/
-
-/*!
- \fn int QStringRef::size() const
-
- Returns the number of characters referred to by the string reference.
- Equivalent to length() and count().
-
- \sa position(), string()
-*/
-/*!
- \fn int QStringRef::count() const
- Returns the number of characters referred to by the string reference.
- Equivalent to size() and length().
-
- \sa position(), string()
-*/
-/*!
- \fn int QStringRef::length() const
- Returns the number of characters referred to by the string reference.
- Equivalent to size() and count().
-
- \sa position(), string()
-*/
-
-
-/*!
- \fn bool QStringRef::isEmpty() const
-
- Returns \c true if the string reference has no characters; otherwise returns
- \c false.
-
- A string reference is empty if its size is zero.
-
- \sa size()
-*/
-
-/*!
- \fn bool QStringRef::isNull() const
-
- Returns \c true if this string reference does not reference a string or if
- the string it references is null (i.e. QString::isNull() is true).
-
- \sa size()
-*/
-
-/*!
- \fn const QString *QStringRef::string() const
-
- Returns a pointer to the string referred to by the string reference, or
- 0 if it does not reference a string.
-
- \sa unicode()
-*/
-
-
-/*!
- \fn const QChar *QStringRef::unicode() const
-
- Returns a Unicode representation of the string reference. Since
- the data stems directly from the referenced string, it is not
- \\0'-terminated unless the string reference includes the string's
- null terminator.
-
- \sa string()
-*/
-
-/*!
- \fn const QChar *QStringRef::data() const
-
- Same as unicode().
-*/
-
-/*!
- \fn const QChar *QStringRef::constData() const
-
- Same as unicode().
-*/
-
-/*!
- \fn QStringRef::const_iterator QStringRef::begin() const
- \since 5.4
-
- Returns a const \l{STL-style iterators}{STL-style iterator} pointing to the first character in
- the string.
-
- \sa cbegin(), constBegin(), end(), constEnd(), rbegin(), rend()
-*/
-
-/*!
- \fn QStringRef::const_iterator QStringRef::cbegin() const
- \since 5.4
-
- Same as begin().
-
- \sa begin(), constBegin(), cend(), constEnd(), rbegin(), rend()
-*/
-
-/*!
- \fn QStringRef::const_iterator QStringRef::constBegin() const
- \since 5.9
-
- Same as begin().
-
- \sa begin(), cend(), constEnd(), rbegin(), rend()
-*/
-
-/*!
- \fn QStringRef::const_iterator QStringRef::end() const
- \since 5.4
-
- Returns a const \l{STL-style iterators}{STL-style iterator} pointing to the imaginary
- character after the last character in the list.
-
- \sa cbegin(), constBegin(), end(), constEnd(), rbegin(), rend()
-*/
-
-/*! \fn QStringRef::const_iterator QStringRef::cend() const
- \since 5.4
-
- Same as end().
-
- \sa end(), constEnd(), cbegin(), constBegin(), rbegin(), rend()
-*/
-
-/*! \fn QStringRef::const_iterator QStringRef::constEnd() const
- \since 5.9
-
- Same as end().
-
- \sa end(), cend(), cbegin(), constBegin(), rbegin(), rend()
-*/
-
-/*!
- \fn QStringRef::const_reverse_iterator QStringRef::rbegin() const
- \since 5.7
-
- Returns a const \l{STL-style iterators}{STL-style} reverse iterator pointing to the first
- character in the string, in reverse order.
-
- \sa begin(), crbegin(), rend()
-*/
-
-/*!
- \fn QStringRef::const_reverse_iterator QStringRef::crbegin() const
- \since 5.7
-
- Same as rbegin().
-
- \sa begin(), rbegin(), rend()
-*/
-
-/*!
- \fn QStringRef::const_reverse_iterator QStringRef::rend() const
- \since 5.7
-
- Returns a \l{STL-style iterators}{STL-style} reverse iterator pointing to one past
- the last character in the string, in reverse order.
-
- \sa end(), crend(), rbegin()
-*/
-
-
-/*!
- \fn QStringRef::const_reverse_iterator QStringRef::crend() const
- \since 5.7
-
- Same as rend().
-
- \sa end(), rend(), rbegin()
-*/
-
-/*!
- Returns a copy of the string reference as a QString object.
-
- If the string reference is not a complete reference of the string
- (meaning that position() is 0 and size() equals string()->size()),
- this function will allocate a new string to return.
-
- \sa string()
-*/
-
-QString QStringRef::toString() const {
- if (!m_string)
- return QString();
- if (m_size && m_position == 0 && m_size == m_string->size())
- return *m_string;
- return QString(m_string->unicode() + m_position, m_size);
-}
-
-
-/*! \relates QStringRef
-
- Returns \c true if string reference \a s1 is lexically equal to string reference \a s2; otherwise
- returns \c false.
-*/
-bool operator==(const QStringRef &s1,const QStringRef &s2) Q_DECL_NOTHROW
-{
- return s1.size() == s2.size() && qt_compare_strings(s1, s2, Qt::CaseSensitive) == 0;
-}
-
-/*! \relates QStringRef
-
- Returns \c true if string \a s1 is lexically equal to string reference \a s2; otherwise
- returns \c false.
-*/
-bool operator==(const QString &s1,const QStringRef &s2) Q_DECL_NOTHROW
-{
- return s1.size() == s2.size() && qt_compare_strings(s1, s2, Qt::CaseSensitive) == 0;
-}
-
-/*! \relates QStringRef
-
- Returns \c true if string \a s1 is lexically equal to string reference \a s2; otherwise
- returns \c false.
-*/
-bool operator==(QLatin1String s1, const QStringRef &s2) Q_DECL_NOTHROW
-{
- if (s1.size() != s2.size())
- return false;
-
- return qt_compare_strings(s2, s1, Qt::CaseSensitive) == 0;
-}
-
-/*!
- \relates QStringRef
-
- Returns \c true if string reference \a s1 is lexically less than
- string reference \a s2; otherwise returns \c false.
-
- The comparison is based exclusively on the numeric Unicode values
- of the characters and is very fast, but is not what a human would
- expect. Consider sorting user-interface strings using the
- QString::localeAwareCompare() function.
-*/
-bool operator<(const QStringRef &s1,const QStringRef &s2) Q_DECL_NOTHROW
-{
- return qt_compare_strings(s1, s2, Qt::CaseSensitive) < 0;
-}
-
-/*!\fn bool operator<=(const QStringRef &s1,const QStringRef &s2)
-
- \relates QStringRef
-
- Returns \c true if string reference \a s1 is lexically less than
- or equal to string reference \a s2; otherwise returns \c false.
-
- The comparison is based exclusively on the numeric Unicode values
- of the characters and is very fast, but is not what a human would
- expect. Consider sorting user-interface strings using the
- QString::localeAwareCompare() function.
-*/
-
-/*!\fn bool operator>=(const QStringRef &s1,const QStringRef &s2)
-
- \relates QStringRef
-
- Returns \c true if string reference \a s1 is lexically greater than
- or equal to string reference \a s2; otherwise returns \c false.
-
- The comparison is based exclusively on the numeric Unicode values
- of the characters and is very fast, but is not what a human would
- expect. Consider sorting user-interface strings using the
- QString::localeAwareCompare() function.
-*/
-
-/*!\fn bool operator>(const QStringRef &s1,const QStringRef &s2)
-
- \relates QStringRef
-
- Returns \c true if string reference \a s1 is lexically greater than
- string reference \a s2; otherwise returns \c false.
-
- The comparison is based exclusively on the numeric Unicode values
- of the characters and is very fast, but is not what a human would
- expect. Consider sorting user-interface strings using the
- QString::localeAwareCompare() function.
-*/
-
-
-/*!
- \fn const QChar QStringRef::at(int position) const
-
- Returns the character at the given index \a position in the
- string reference.
-
- The \a position must be a valid index position in the string
- (i.e., 0 <= \a position < size()).
-*/
-
-/*!
- \fn QChar QStringRef::operator[](int position) const
- \since 5.7
-
- Returns the character at the given index \a position in the
- string reference.
-
- The \a position must be a valid index position in the string
- reference (i.e., 0 <= \a position < size()).
-
- \sa at()
-*/
-
-/*!
- \fn QChar QStringRef::front() const
- \since 5.10
-
- Returns the first character in the string.
- Same as \c{at(0)}.
-
- This function is provided for STL compatibility.
-
- \warning Calling this function on an empty string constitutes
- undefined behavior.
-
- \sa back(), at(), operator[]()
-*/
-
-/*!
- \fn QChar QStringRef::back() const
- \since 5.10
-
- Returns the last character in the string.
- Same as \c{at(size() - 1)}.
-
- This function is provided for STL compatibility.
-
- \warning Calling this function on an empty string constitutes
- undefined behavior.
-
- \sa front(), at(), operator[]()
-*/
-
-/*!
- \fn void QStringRef::clear()
-
- Clears the contents of the string reference by making it null and empty.
-
- \sa isEmpty(), isNull()
-*/
-
-/*!
- \fn QStringRef &QStringRef::operator=(const QStringRef &other)
-
- Assigns the \a other string reference to this string reference, and
- returns the result.
-*/
-
-/*!
- \fn QStringRef &QStringRef::operator=(const QString *string)
-
- Constructs a string reference to the given \a string and assigns it to
- this string reference, returning the result.
-*/
-
-/*!
- \fn bool QStringRef::operator==(const char * s) const
-
- \overload operator==()
-
- The \a s byte array is converted to a QStringRef using the
- fromUtf8() function. This function stops conversion at the
- first NUL character found, or the end of the byte array.
-
- You can disable this operator by defining \c
- QT_NO_CAST_FROM_ASCII when you compile your applications. This
- can be useful if you want to ensure that all user-visible strings
- go through QObject::tr(), for example.
-
- Returns \c true if this string is lexically equal to the parameter
- string \a s. Otherwise returns \c false.
-
- \sa QT_NO_CAST_FROM_ASCII
-*/
-
-/*!
- \fn bool QStringRef::operator!=(const char * s) const
-
- \overload operator!=()
-
- The \a s const char pointer is converted to a QStringRef using
- the fromUtf8() function.
-
- You can disable this operator by defining \c
- QT_NO_CAST_FROM_ASCII when you compile your applications. This
- can be useful if you want to ensure that all user-visible strings
- go through QObject::tr(), for example.
-
- Returns \c true if this string is not lexically equal to the parameter
- string \a s. Otherwise returns \c false.
-
- \sa QT_NO_CAST_FROM_ASCII
-*/
-
-/*!
- \fn bool QStringRef::operator<(const char * s) const
-
- \overload operator<()
-
- The \a s const char pointer is converted to a QStringRef using
- the fromUtf8() function.
-
- You can disable this operator by defining \c
- QT_NO_CAST_FROM_ASCII when you compile your applications. This
- can be useful if you want to ensure that all user-visible strings
- go through QObject::tr(), for example.
-
- Returns \c true if this string is lexically smaller than the parameter
- string \a s. Otherwise returns \c false.
-
- \sa QT_NO_CAST_FROM_ASCII
-*/
-
-/*!
- \fn bool QStringRef::operator<=(const char * s) const
-
- \overload operator<=()
-
- The \a s const char pointer is converted to a QStringRef using
- the fromUtf8() function.
-
- You can disable this operator by defining \c
- QT_NO_CAST_FROM_ASCII when you compile your applications. This
- can be useful if you want to ensure that all user-visible strings
- go through QObject::tr(), for example.
-
- Returns \c true if this string is lexically smaller than or equal to the parameter
- string \a s. Otherwise returns \c false.
-
- \sa QT_NO_CAST_FROM_ASCII
-*/
-
-/*!
- \fn bool QStringRef::operator>(const char * s) const
-
-
- \overload operator>()
-
- The \a s const char pointer is converted to a QStringRef using
- the fromUtf8() function.
-
- You can disable this operator by defining \c
- QT_NO_CAST_FROM_ASCII when you compile your applications. This
- can be useful if you want to ensure that all user-visible strings
- go through QObject::tr(), for example.
-
- Returns \c true if this string is lexically greater than the parameter
- string \a s. Otherwise returns \c false.
-
- \sa QT_NO_CAST_FROM_ASCII
-*/
-
-/*!
- \fn bool QStringRef::operator>= (const char * s) const
-
- \overload operator>=()
-
- The \a s const char pointer is converted to a QStringRef using
- the fromUtf8() function.
-
- You can disable this operator by defining \c
- QT_NO_CAST_FROM_ASCII when you compile your applications. This
- can be useful if you want to ensure that all user-visible strings
- go through QObject::tr(), for example.
-
- Returns \c true if this string is lexically greater than or equal to the
- parameter string \a s. Otherwise returns \c false.
-
- \sa QT_NO_CAST_FROM_ASCII
-*/
-/*!
- \typedef QString::Data
- \internal
-*/
-
-/*!
- \typedef QString::DataPtr
- \internal
-*/
-
-/*!
- \fn DataPtr & QString::data_ptr()
- \internal
-*/
-
-
-
-/*! Appends the string reference to \a string, and returns a new
-reference to the combined string data.
- */
-QStringRef QStringRef::appendTo(QString *string) const
-{
- if (!string)
- return QStringRef();
- int pos = string->size();
- string->insert(pos, unicode(), size());
- return QStringRef(string, pos, size());
-}
-
-/*!
- \fn int QStringRef::compare(const QStringRef &s1, const QString &s2, Qt::CaseSensitivity cs = Qt::CaseSensitive)
- \since 4.5
-
- Compares the string \a s1 with the string \a s2 and returns an
- integer less than, equal to, or greater than zero if \a s1
- is less than, equal to, or greater than \a s2.
-
- If \a cs is Qt::CaseSensitive, the comparison is case sensitive;
- otherwise the comparison is case insensitive.
-*/
-
-/*!
- \fn int QStringRef::compare(const QStringRef &s1, const QStringRef &s2, Qt::CaseSensitivity cs = Qt::CaseSensitive)
- \since 4.5
- \overload
-
- Compares the string \a s1 with the string \a s2 and returns an
- integer less than, equal to, or greater than zero if \a s1
- is less than, equal to, or greater than \a s2.
-
- If \a cs is Qt::CaseSensitive, the comparison is case sensitive;
- otherwise the comparison is case insensitive.
-*/
-
-/*!
- \fn int QStringRef::compare(const QStringRef &s1, QLatin1String s2, Qt::CaseSensitivity cs = Qt::CaseSensitive)
- \since 4.5
- \overload
-
- Compares the string \a s1 with the string \a s2 and returns an
- integer less than, equal to, or greater than zero if \a s1
- is less than, equal to, or greater than \a s2.
-
- If \a cs is Qt::CaseSensitive, the comparison is case sensitive;
- otherwise the comparison is case insensitive.
-*/
-
-/*!
- \overload
- \fn int QStringRef::compare(const QString &other, Qt::CaseSensitivity cs = Qt::CaseSensitive) const
- \since 4.5
-
- Compares this string with the \a other string and returns an
- integer less than, equal to, or greater than zero if this string
- is less than, equal to, or greater than the \a other string.
-
- If \a cs is Qt::CaseSensitive, the comparison is case sensitive;
- otherwise the comparison is case insensitive.
-
- Equivalent to \c {compare(*this, other, cs)}.
-*/
-
-/*!
- \overload
- \fn int QStringRef::compare(const QStringRef &other, Qt::CaseSensitivity cs = Qt::CaseSensitive) const
- \since 4.5
-
- Compares this string with the \a other string and returns an
- integer less than, equal to, or greater than zero if this string
- is less than, equal to, or greater than the \a other string.
-
- If \a cs is Qt::CaseSensitive, the comparison is case sensitive;
- otherwise the comparison is case insensitive.
-
- Equivalent to \c {compare(*this, other, cs)}.
-*/
-
-/*!
- \overload
- \fn int QStringRef::compare(QLatin1String other, Qt::CaseSensitivity cs = Qt::CaseSensitive) const
- \since 4.5
-
- Compares this string with the \a other string and returns an
- integer less than, equal to, or greater than zero if this string
- is less than, equal to, or greater than the \a other string.
-
- If \a cs is Qt::CaseSensitive, the comparison is case sensitive;
- otherwise the comparison is case insensitive.
-
- Equivalent to \c {compare(*this, other, cs)}.
-*/
-
-/*!
- \overload
- \fn int QStringRef::compare(const QByteArray &other, Qt::CaseSensitivity cs = Qt::CaseSensitive) const
- \since 5.8
-
- Compares this string with \a other and returns an
- integer less than, equal to, or greater than zero if this string
- is less than, equal to, or greater than the \a other byte array,
- interpreted as a UTF-8 sequence.
-
- If \a cs is Qt::CaseSensitive, the comparison is case sensitive;
- otherwise the comparison is case insensitive.
-
- Equivalent to \c {compare(*this, other, cs)}.
-*/
-
-/*!
- \fn int QStringRef::localeAwareCompare(const QStringRef &s1, const QString & s2)
- \since 4.5
-
- Compares \a s1 with \a s2 and returns an integer less than, equal
- to, or greater than zero if \a s1 is less than, equal to, or
- greater than \a s2.
-
- The comparison is performed in a locale- and also
- platform-dependent manner. Use this function to present sorted
- lists of strings to the user.
-
- On \macos and iOS, this function compares according the
- "Order for sorted lists" setting in the International prefereces panel.
-
- \sa compare(), QLocale
-*/
-
-/*!
- \fn int QStringRef::localeAwareCompare(const QStringRef &s1, const QStringRef & s2)
- \since 4.5
- \overload
-
- Compares \a s1 with \a s2 and returns an integer less than, equal
- to, or greater than zero if \a s1 is less than, equal to, or
- greater than \a s2.
-
- The comparison is performed in a locale- and also
- platform-dependent manner. Use this function to present sorted
- lists of strings to the user.
-
-*/
-
-/*!
- \fn int QStringRef::localeAwareCompare(const QString &other) const
- \since 4.5
- \overload
-
- Compares this string with the \a other string and returns an
- integer less than, equal to, or greater than zero if this string
- is less than, equal to, or greater than the \a other string.
-
- The comparison is performed in a locale- and also
- platform-dependent manner. Use this function to present sorted
- lists of strings to the user.
-*/
-
-/*!
- \fn int QStringRef::localeAwareCompare(const QStringRef &other) const
- \since 4.5
- \overload
-
- Compares this string with the \a other string and returns an
- integer less than, equal to, or greater than zero if this string
- is less than, equal to, or greater than the \a other string.
-
- The comparison is performed in a locale- and also
- platform-dependent manner. Use this function to present sorted
- lists of strings to the user.
-*/
-
-/*!
- \fn QString &QString::append(const QStringRef &reference)
- \since 4.4
-
- Appends the given string \a reference to this string and returns the result.
- */
-QString &QString::append(const QStringRef &str)
-{
- if (str.string() == this) {
- str.appendTo(this);
- } else if (!str.isNull()) {
- int oldSize = size();
- resize(oldSize + str.size());
- memcpy(data() + oldSize, str.unicode(), str.size() * sizeof(QChar));
- }
- return *this;
-}
-
-/*!
- \fn QStringRef::left(int n) const
- \since 5.2
-
- Returns a substring reference to the \a n leftmost characters
- of the string.
-
- If \a n is greater than or equal to size(), or less than zero,
- a reference to the entire string is returned.
-
- \sa right(), mid(), startsWith(), chopped(), chop(), truncate()
-*/
-QStringRef QStringRef::left(int n) const
-{
- if (uint(n) >= uint(m_size))
- return *this;
- return QStringRef(m_string, m_position, n);
-}
-
-/*!
- \since 4.4
-
- Returns a substring reference to the \a n leftmost characters
- of the string.
-
- If \a n is greater than or equal to size(), or less than zero,
- a reference to the entire string is returned.
-
- \snippet qstring/main.cpp leftRef
-
- \sa left(), rightRef(), midRef(), startsWith()
-*/
-QStringRef QString::leftRef(int n) const
-{
- return QStringRef(this).left(n);
-}
-
-/*!
- \fn QStringRef::right(int n) const
- \since 5.2
-
- Returns a substring reference to the \a n rightmost characters
- of the string.
-
- If \a n is greater than or equal to size(), or less than zero,
- a reference to the entire string is returned.
-
- \sa left(), mid(), endsWith(), chopped(), chop(), truncate()
-*/
-QStringRef QStringRef::right(int n) const
-{
- if (uint(n) >= uint(m_size))
- return *this;
- return QStringRef(m_string, m_size - n + m_position, n);
-}
-
-/*!
- \since 4.4
-
- Returns a substring reference to the \a n rightmost characters
- of the string.
-
- If \a n is greater than or equal to size(), or less than zero,
- a reference to the entire string is returned.
-
- \snippet qstring/main.cpp rightRef
-
- \sa right(), leftRef(), midRef(), endsWith()
-*/
-QStringRef QString::rightRef(int n) const
-{
- return QStringRef(this).right(n);
-}
-
-/*!
- \fn QStringRef QStringRef::mid(int position, int n = -1) const
- \since 5.2
-
- Returns a substring reference to \a n characters of this string,
- starting at the specified \a position.
-
- If the \a position exceeds the length of the string, a null
- reference is returned.
-
- If there are less than \a n characters available in the string,
- starting at the given \a position, or if \a n is -1 (default), the
- function returns all characters from the specified \a position
- onwards.
-
- \sa left(), right(), chopped(), chop(), truncate()
-*/
-QStringRef QStringRef::mid(int pos, int n) const
-{
- using namespace QtPrivate;
- switch (QContainerImplHelper::mid(m_size, &pos, &n)) {
- case QContainerImplHelper::Null:
- return QStringRef();
- case QContainerImplHelper::Empty:
- return QStringRef(m_string, 0, 0);
- case QContainerImplHelper::Full:
- return *this;
- case QContainerImplHelper::Subset:
- return QStringRef(m_string, pos + m_position, n);
- }
- Q_UNREACHABLE();
- return QStringRef();
-}
-
-/*!
- \fn QStringRef QStringRef::chopped(int len) const
- \since 5.10
-
- Returns a substring reference to the size() - \a len leftmost characters
- of this string.
-
- \note The behavior is undefined if \a len is negative or greater than size().
-
- \sa endsWith(), left(), right(), mid(), chop(), truncate()
-*/
-
-/*!
- \since 4.4
-
- Returns a substring reference to \a n characters of this string,
- starting at the specified \a position.
-
- If the \a position exceeds the length of the string, a null
- reference is returned.
-
- If there are less than \a n characters available in the string,
- starting at the given \a position, or if \a n is -1 (default), the
- function returns all characters from the specified \a position
- onwards.
-
- Example:
-
- \snippet qstring/main.cpp midRef
-
- \sa mid(), leftRef(), rightRef()
-*/
-QStringRef QString::midRef(int position, int n) const
-{
- return QStringRef(this).mid(position, n);
-}
-
-/*!
- \fn void QStringRef::truncate(int position)
- \since 5.6
-
- Truncates the string at the given \a position index.
-
- If the specified \a position index is beyond the end of the
- string, nothing happens.
-
- If \a position is negative, it is equivalent to passing zero.
-
- \sa QString::truncate()
-*/
-
-/*!
- \fn void QStringRef::chop(int n)
- \since 5.8
-
- Removes \a n characters from the end of the string.
-
- If \a n is greater than or equal to size(), the result is an
- empty string; if \a n is negative, it is equivalent to passing zero.
-
- \sa QString::chop(), truncate()
-*/
-
-/*!
- \since 4.8
-
- Returns the index position of the first occurrence of the string \a
- str in this string reference, searching forward from index position
- \a from. Returns -1 if \a str is not found.
-
- If \a cs is Qt::CaseSensitive (default), the search is case
- sensitive; otherwise the search is case insensitive.
-
- If \a from is -1, the search starts at the last character; if it is
- -2, at the next to last character and so on.
-
- \sa QString::indexOf(), lastIndexOf(), contains(), count()
-*/
-int QStringRef::indexOf(const QString &str, int from, Qt::CaseSensitivity cs) const
-{
- return qFindString(unicode(), length(), from, str.unicode(), str.length(), cs);
-}
-
-/*!
- \since 4.8
- \overload indexOf()
-
- Returns the index position of the first occurrence of the
- character \a ch in the string reference, searching forward from
- index position \a from. Returns -1 if \a ch could not be found.
-
- \sa QString::indexOf(), lastIndexOf(), contains(), count()
-*/
-int QStringRef::indexOf(QChar ch, int from, Qt::CaseSensitivity cs) const
-{
- return findChar(unicode(), length(), ch, from, cs);
-}
-
-/*!
- \since 4.8
-
- Returns the index position of the first occurrence of the string \a
- str in this string reference, searching forward from index position
- \a from. Returns -1 if \a str is not found.
-
- If \a cs is Qt::CaseSensitive (default), the search is case
- sensitive; otherwise the search is case insensitive.
-
- If \a from is -1, the search starts at the last character; if it is
- -2, at the next to last character and so on.
-
- \sa QString::indexOf(), lastIndexOf(), contains(), count()
-*/
-int QStringRef::indexOf(QLatin1String str, int from, Qt::CaseSensitivity cs) const
-{
- return qt_find_latin1_string(unicode(), size(), str, from, cs);
-}
-
-/*!
- \since 4.8
-
- \overload indexOf()
-
- Returns the index position of the first occurrence of the string
- reference \a str in this string reference, searching forward from
- index position \a from. Returns -1 if \a str is not found.
-
- If \a cs is Qt::CaseSensitive (default), the search is case
- sensitive; otherwise the search is case insensitive.
-
- \sa QString::indexOf(), lastIndexOf(), contains(), count()
-*/
-int QStringRef::indexOf(const QStringRef &str, int from, Qt::CaseSensitivity cs) const
-{
- return qFindString(unicode(), size(), from, str.unicode(), str.size(), cs);
-}
-
-/*!
- \since 4.8
-
- Returns the index position of the last occurrence of the string \a
- str in this string reference, searching backward from index position
- \a from. If \a from is -1 (default), the search starts at the last
- character; if \a from is -2, at the next to last character and so
- on. Returns -1 if \a str is not found.
-
- If \a cs is Qt::CaseSensitive (default), the search is case
- sensitive; otherwise the search is case insensitive.
-
- \sa QString::lastIndexOf(), indexOf(), contains(), count()
-*/
-int QStringRef::lastIndexOf(const QString &str, int from, Qt::CaseSensitivity cs) const
-{
- return lastIndexOf(QStringRef(&str), from, cs);
-}
-
-/*!
- \since 4.8
- \overload lastIndexOf()
-
- Returns the index position of the last occurrence of the character
- \a ch, searching backward from position \a from.
-
- \sa QString::lastIndexOf(), indexOf(), contains(), count()
-*/
-int QStringRef::lastIndexOf(QChar ch, int from, Qt::CaseSensitivity cs) const
-{
- return qt_last_index_of(unicode(), size(), ch, from, cs);
-}
-
-template<typename T>
-static int last_index_of_impl(const QStringRef &haystack, int from, const T &needle, Qt::CaseSensitivity cs)
-{
- const int sl = needle.size();
- if (sl == 1)
- return haystack.lastIndexOf(needle.at(0), from, cs);
-
- const int l = haystack.size();
- if (from < 0)
- from += l;
- int delta = l - sl;
- if (from == l && sl == 0)
- return from;
- if (uint(from) >= uint(l) || delta < 0)
- return -1;
- if (from > delta)
- from = delta;
-
- return lastIndexOfHelper(haystack, from, needle, cs);
-}
-
-/*!
- \since 4.8
- \overload lastIndexOf()
-
- Returns the index position of the last occurrence of the string \a
- str in this string reference, searching backward from index position
- \a from. If \a from is -1 (default), the search starts at the last
- character; if \a from is -2, at the next to last character and so
- on. Returns -1 if \a str is not found.
-
- If \a cs is Qt::CaseSensitive (default), the search is case
- sensitive; otherwise the search is case insensitive.
-
- \sa QString::lastIndexOf(), indexOf(), contains(), count()
-*/
-int QStringRef::lastIndexOf(QLatin1String str, int from, Qt::CaseSensitivity cs) const
-{
- return last_index_of_impl(*this, from, str, cs);
-}
-
-/*!
- \since 4.8
- \overload lastIndexOf()
-
- Returns the index position of the last occurrence of the string
- reference \a str in this string reference, searching backward from
- index position \a from. If \a from is -1 (default), the search
- starts at the last character; if \a from is -2, at the next to last
- character and so on. Returns -1 if \a str is not found.
-
- If \a cs is Qt::CaseSensitive (default), the search is case
- sensitive; otherwise the search is case insensitive.
-
- \sa QString::lastIndexOf(), indexOf(), contains(), count()
-*/
-int QStringRef::lastIndexOf(const QStringRef &str, int from, Qt::CaseSensitivity cs) const
-{
- return last_index_of_impl(*this, from, str, cs);
-}
-
-/*!
- \since 4.8
- Returns the number of (potentially overlapping) occurrences of
- the string \a str in this string reference.
-
- If \a cs is Qt::CaseSensitive (default), the search is
- case sensitive; otherwise the search is case insensitive.
-
- \sa QString::count(), contains(), indexOf()
-*/
-int QStringRef::count(const QString &str, Qt::CaseSensitivity cs) const
-{
- return qt_string_count(unicode(), size(), str.unicode(), str.size(), cs);
-}
-
-/*!
- \since 4.8
- \overload count()
-
- Returns the number of occurrences of the character \a ch in the
- string reference.
-
- If \a cs is Qt::CaseSensitive (default), the search is
- case sensitive; otherwise the search is case insensitive.
-
- \sa QString::count(), contains(), indexOf()
-*/
-int QStringRef::count(QChar ch, Qt::CaseSensitivity cs) const
-{
- return qt_string_count(unicode(), size(), ch, cs);
-}
-
-/*!
- \since 4.8
- \overload count()
-
- Returns the number of (potentially overlapping) occurrences of the
- string reference \a str in this string reference.
-
- If \a cs is Qt::CaseSensitive (default), the search is
- case sensitive; otherwise the search is case insensitive.
-
- \sa QString::count(), contains(), indexOf()
-*/
-int QStringRef::count(const QStringRef &str, Qt::CaseSensitivity cs) const
-{
- return qt_string_count(unicode(), size(), str.unicode(), str.size(), cs);
-}
-
-/*!
- \since 5.9
-
- Returns \c true if the string is read right to left.
-
- \sa QString::isRightToLeft()
-*/
-bool QStringRef::isRightToLeft() const
-{
- return QtPrivate::isRightToLeft(QStringView(unicode(), size()));
-}
-
-/*!
- \since 5.11
- \internal
- \relates QStringView
-
- Returns \c true if the string is read right to left.
-
- \sa QString::isRightToLeft()
-*/
-bool QtPrivate::isRightToLeft(QStringView string)
-{
- const ushort *p = reinterpret_cast<const ushort*>(string.data());
- const ushort * const end = p + string.size();
- int isolateLevel = 0;
- while (p < end) {
- uint ucs4 = *p;
- if (QChar::isHighSurrogate(ucs4) && p < end - 1) {
- ushort low = p[1];
- if (QChar::isLowSurrogate(low)) {
- ucs4 = QChar::surrogateToUcs4(ucs4, low);
- ++p;
- }
- }
- switch (QChar::direction(ucs4))
- {
- case QChar::DirRLI:
- case QChar::DirLRI:
- case QChar::DirFSI:
- ++isolateLevel;
- break;
- case QChar::DirPDI:
- if (isolateLevel)
- --isolateLevel;
- break;
- case QChar::DirL:
- if (isolateLevel)
- break;
- return false;
- case QChar::DirR:
- case QChar::DirAL:
- if (isolateLevel)
- break;
- return true;
- default:
- break;
- }
- ++p;
- }
- return false;
-}
-
-/*!
- \since 4.8
-
- Returns \c true if the string reference starts with \a str; otherwise
- returns \c false.
-
- If \a cs is Qt::CaseSensitive (default), the search is
- case sensitive; otherwise the search is case insensitive.
-
- \sa QString::startsWith(), endsWith()
-*/
-bool QStringRef::startsWith(const QString &str, Qt::CaseSensitivity cs) const
-{
- return qt_starts_with(*this, str, cs);
-}
-
-/*!
- \since 4.8
- \overload startsWith()
- \sa QString::startsWith(), endsWith()
-*/
-bool QStringRef::startsWith(QLatin1String str, Qt::CaseSensitivity cs) const
-{
- return qt_starts_with(*this, str, cs);
-}
-
-/*!
- \fn bool QStringRef::startsWith(QStringView str, Qt::CaseSensitivity cs) const
- \since 5.10
- \overload startsWith()
- \sa QString::startsWith(), endsWith()
-*/
-
-/*!
- \since 4.8
- \overload startsWith()
- \sa QString::startsWith(), endsWith()
-*/
-bool QStringRef::startsWith(const QStringRef &str, Qt::CaseSensitivity cs) const
-{
- return qt_starts_with(*this, str, cs);
-}
-
-/*!
- \since 4.8
- \overload startsWith()
-
- Returns \c true if the string reference starts with \a ch; otherwise
- returns \c false.
-
- If \a cs is Qt::CaseSensitive (default), the search is case
- sensitive; otherwise the search is case insensitive.
-
- \sa QString::startsWith(), endsWith()
-*/
-bool QStringRef::startsWith(QChar ch, Qt::CaseSensitivity cs) const
-{
- return qt_starts_with(*this, ch, cs);
-}
-
-/*!
- \since 4.8
- Returns \c true if the string reference ends with \a str; otherwise
- returns \c false.
-
- If \a cs is Qt::CaseSensitive (default), the search is case
- sensitive; otherwise the search is case insensitive.
-
- \sa QString::endsWith(), startsWith()
-*/
-bool QStringRef::endsWith(const QString &str, Qt::CaseSensitivity cs) const
-{
- return qt_ends_with(*this, str, cs);
-}
-
-/*!
- \since 4.8
- \overload endsWith()
-
- Returns \c true if the string reference ends with \a ch; otherwise
- returns \c false.
-
- If \a cs is Qt::CaseSensitive (default), the search is case
- sensitive; otherwise the search is case insensitive.
-
- \sa QString::endsWith(), endsWith()
-*/
-bool QStringRef::endsWith(QChar ch, Qt::CaseSensitivity cs) const
-{
- return qt_ends_with(*this, ch, cs);
-}
-
-/*!
- \since 4.8
- \overload endsWith()
- \sa QString::endsWith(), endsWith()
-*/
-bool QStringRef::endsWith(QLatin1String str, Qt::CaseSensitivity cs) const
-{
- return qt_ends_with(*this, str, cs);
-}
-
-/*!
- \fn bool QStringRef::endsWith(QStringView str, Qt::CaseSensitivity cs) const
- \since 5.10
- \overload endsWith()
- \sa QString::endsWith(), startsWith()
-*/
-
-/*!
- \since 4.8
- \overload endsWith()
- \sa QString::endsWith(), endsWith()
-*/
-bool QStringRef::endsWith(const QStringRef &str, Qt::CaseSensitivity cs) const
-{
- return qt_ends_with(*this, str, cs);
-}
-
-
-/*! \fn bool QStringRef::contains(const QString &str, Qt::CaseSensitivity cs = Qt::CaseSensitive) const
-
- \since 4.8
- Returns \c true if this string reference contains an occurrence of
- the string \a str; otherwise returns \c false.
-
- If \a cs is Qt::CaseSensitive (default), the search is
- case sensitive; otherwise the search is case insensitive.
-
- \sa indexOf(), count()
-*/
-
-/*! \fn bool QStringRef::contains(QChar ch, Qt::CaseSensitivity cs = Qt::CaseSensitive) const
-
- \overload contains()
- \since 4.8
-
- Returns \c true if this string contains an occurrence of the
- character \a ch; otherwise returns \c false.
-
- If \a cs is Qt::CaseSensitive (default), the search is
- case sensitive; otherwise the search is case insensitive.
-
-*/
-
-/*! \fn bool QStringRef::contains(const QStringRef &str, Qt::CaseSensitivity cs = Qt::CaseSensitive) const
- \overload contains()
- \since 4.8
-
- Returns \c true if this string reference contains an occurrence of
- the string reference \a str; otherwise returns \c false.
-
- If \a cs is Qt::CaseSensitive (default), the search is
- case sensitive; otherwise the search is case insensitive.
-
- \sa indexOf(), count()
-*/
-
-/*! \fn bool QStringRef::contains(QLatin1String str, Qt::CaseSensitivity cs) const
- \since 4.8
- \overload contains()
-
- Returns \c true if this string reference contains an occurrence of
- the string \a str; otherwise returns \c false.
-
- If \a cs is Qt::CaseSensitive (default), the search is
- case sensitive; otherwise the search is case insensitive.
-
- \sa indexOf(), count()
-*/
-
-static inline int qt_last_index_of(const QChar *haystack, int haystackLen, QChar needle,
- int from, Qt::CaseSensitivity cs)
-{
- ushort c = needle.unicode();
- if (from < 0)
- from += haystackLen;
- if (uint(from) >= uint(haystackLen))
- return -1;
- if (from >= 0) {
- const ushort *b = reinterpret_cast<const ushort*>(haystack);
- const ushort *n = b + from;
- if (cs == Qt::CaseSensitive) {
- for (; n >= b; --n)
- if (*n == c)
- return n - b;
- } else {
- c = foldCase(c);
- for (; n >= b; --n)
- if (foldCase(*n) == c)
- return n - b;
- }
- }
- return -1;
-
-
-}
-
-static inline int qt_string_count(const QChar *haystack, int haystackLen,
- const QChar *needle, int needleLen,
- Qt::CaseSensitivity cs)
-{
- int num = 0;
- int i = -1;
- if (haystackLen > 500 && needleLen > 5) {
- QStringMatcher matcher(needle, needleLen, cs);
- while ((i = matcher.indexIn(haystack, haystackLen, i + 1)) != -1)
- ++num;
- } else {
- while ((i = qFindString(haystack, haystackLen, i + 1, needle, needleLen, cs)) != -1)
- ++num;
- }
- return num;
-}
-
-static inline int qt_string_count(const QChar *unicode, int size, QChar ch,
- Qt::CaseSensitivity cs)
-{
- ushort c = ch.unicode();
- int num = 0;
- const ushort *b = reinterpret_cast<const ushort*>(unicode);
- const ushort *i = b + size;
- if (cs == Qt::CaseSensitive) {
- while (i != b)
- if (*--i == c)
- ++num;
- } else {
- c = foldCase(c);
- while (i != b)
- if (foldCase(*(--i)) == c)
- ++num;
- }
- return num;
-}
-
-static inline int qt_find_latin1_string(const QChar *haystack, int size,
- QLatin1String needle,
- int from, Qt::CaseSensitivity cs)
-{
- if (size < needle.size())
- return -1;
-
- const char *latin1 = needle.latin1();
- int len = needle.size();
- QVarLengthArray<ushort> s(len);
- qt_from_latin1(s.data(), latin1, len);
-
- return qFindString(haystack, size, from,
- reinterpret_cast<const QChar*>(s.constData()), len, cs);
-}
-
-template <typename Haystack, typename Needle>
-bool qt_starts_with_impl(Haystack haystack, Needle needle, Qt::CaseSensitivity cs) Q_DECL_NOTHROW
-{
- if (haystack.isNull())
- return needle.isNull(); // historical behavior, consider changing in ### Qt 6.
- const auto haystackLen = haystack.size();
- const auto needleLen = needle.size();
- if (haystackLen == 0)
- return needleLen == 0;
- if (needleLen > haystackLen)
- return false;
-
- return qt_compare_strings(haystack.left(needleLen), needle, cs) == 0;
-}
-
-static inline bool qt_starts_with(QStringView haystack, QStringView needle, Qt::CaseSensitivity cs)
-{
- return qt_starts_with_impl(haystack, needle, cs);
-}
-
-static inline bool qt_starts_with(QStringView haystack, QLatin1String needle, Qt::CaseSensitivity cs)
-{
- return qt_starts_with_impl(haystack, needle, cs);
-}
-
-static inline bool qt_starts_with(QStringView haystack, QChar needle, Qt::CaseSensitivity cs)
-{
- return haystack.size()
- && (cs == Qt::CaseSensitive ? haystack.front() == needle
- : foldCase(haystack.front()) == foldCase(needle));
-}
-
-/*!
- \fn bool QtPrivate::startsWith(QStringView haystack, QStringView needle, Qt::CaseSensitivity cs)
- \since 5.10
- \fn bool QtPrivate::startsWith(QStringView haystack, QLatin1String needle, Qt::CaseSensitivity cs)
- \since 5.10
- \fn bool QtPrivate::startsWith(QLatin1String haystack, QStringView needle, Qt::CaseSensitivity cs)
- \since 5.10
- \fn bool QtPrivate::startsWith(QLatin1String haystack, QLatin1String needle, Qt::CaseSensitivity cs)
- \since 5.10
- \internal
- \relates QStringView
-
- Returns \c true if \a haystack starts with \a needle,
- otherwise returns \c false.
-
- If \a cs is Qt::CaseSensitive (the default), the search is case-sensitive;
- otherwise the search is case-insensitive.
-
- \sa QtPrivate::endsWith(), QString::endsWith(), QStringView::endsWith(), QLatin1String::endsWith()
-*/
-
-bool QtPrivate::startsWith(QStringView haystack, QStringView needle, Qt::CaseSensitivity cs) Q_DECL_NOTHROW
-{
- return qt_starts_with_impl(haystack, needle, cs);
-}
-
-bool QtPrivate::startsWith(QStringView haystack, QLatin1String needle, Qt::CaseSensitivity cs) Q_DECL_NOTHROW
-{
- return qt_starts_with_impl(haystack, needle, cs);
-}
-
-bool QtPrivate::startsWith(QLatin1String haystack, QStringView needle, Qt::CaseSensitivity cs) Q_DECL_NOTHROW
-{
- return qt_starts_with_impl(haystack, needle, cs);
-}
-
-bool QtPrivate::startsWith(QLatin1String haystack, QLatin1String needle, Qt::CaseSensitivity cs) Q_DECL_NOTHROW
-{
- return qt_starts_with_impl(haystack, needle, cs);
-}
-
-template <typename Haystack, typename Needle>
-bool qt_ends_with_impl(Haystack haystack, Needle needle, Qt::CaseSensitivity cs) Q_DECL_NOTHROW
-{
- if (haystack.isNull())
- return needle.isNull(); // historical behavior, consider changing in ### Qt 6.
- const auto haystackLen = haystack.size();
- const auto needleLen = needle.size();
- if (haystackLen == 0)
- return needleLen == 0;
- if (haystackLen < needleLen)
- return false;
-
- return qt_compare_strings(haystack.right(needleLen), needle, cs) == 0;
-}
-
-static inline bool qt_ends_with(QStringView haystack, QStringView needle, Qt::CaseSensitivity cs)
-{
- return qt_ends_with_impl(haystack, needle, cs);
-}
-
-static inline bool qt_ends_with(QStringView haystack, QLatin1String needle, Qt::CaseSensitivity cs)
-{
- return qt_ends_with_impl(haystack, needle, cs);
-}
-
-static inline bool qt_ends_with(QStringView haystack, QChar needle, Qt::CaseSensitivity cs)
-{
- return haystack.size()
- && (cs == Qt::CaseSensitive ? haystack.back() == needle
- : foldCase(haystack.back()) == foldCase(needle));
-}
-
-/*!
- \fn bool QtPrivate::endsWith(QStringView haystack, QStringView needle, Qt::CaseSensitivity cs)
- \since 5.10
- \fn bool QtPrivate::endsWith(QStringView haystack, QLatin1String needle, Qt::CaseSensitivity cs)
- \since 5.10
- \fn bool QtPrivate::endsWith(QLatin1String haystack, QStringView needle, Qt::CaseSensitivity cs)
- \since 5.10
- \fn bool QtPrivate::endsWith(QLatin1String haystack, QLatin1String needle, Qt::CaseSensitivity cs)
- \since 5.10
- \internal
- \relates QStringView
-
- Returns \c true if \a haystack ends with \a needle,
- otherwise returns \c false.
-
- If \a cs is Qt::CaseSensitive (the default), the search is case-sensitive;
- otherwise the search is case-insensitive.
-
- \sa QtPrivate::startsWith(), QString::endsWith(), QStringView::endsWith(), QLatin1String::endsWith()
-*/
-
-bool QtPrivate::endsWith(QStringView haystack, QStringView needle, Qt::CaseSensitivity cs) Q_DECL_NOTHROW
-{
- return qt_ends_with_impl(haystack, needle, cs);
-}
-
-bool QtPrivate::endsWith(QStringView haystack, QLatin1String needle, Qt::CaseSensitivity cs) Q_DECL_NOTHROW
-{
- return qt_ends_with_impl(haystack, needle, cs);
-}
-
-bool QtPrivate::endsWith(QLatin1String haystack, QStringView needle, Qt::CaseSensitivity cs) Q_DECL_NOTHROW
-{
- return qt_ends_with_impl(haystack, needle, cs);
-}
-
-bool QtPrivate::endsWith(QLatin1String haystack, QLatin1String needle, Qt::CaseSensitivity cs) Q_DECL_NOTHROW
-{
- return qt_ends_with_impl(haystack, needle, cs);
-}
-
-/*!
- \since 4.8
-
- Returns a Latin-1 representation of the string as a QByteArray.
-
- The returned byte array is undefined if the string contains non-Latin1
- characters. Those characters may be suppressed or replaced with a
- question mark.
-
- \sa toUtf8(), toLocal8Bit(), QTextCodec
-*/
-QByteArray QStringRef::toLatin1() const
-{
- return qt_convert_to_latin1(*this);
-}
-
-/*!
- \fn QByteArray QStringRef::toAscii() const
- \since 4.8
- \deprecated
-
- Returns an 8-bit representation of the string as a QByteArray.
-
- This function does the same as toLatin1().
-
- Note that, despite the name, this function does not necessarily return an US-ASCII
- (ANSI X3.4-1986) string and its result may not be US-ASCII compatible.
-
- \sa toLatin1(), toUtf8(), toLocal8Bit(), QTextCodec
-*/
-
-/*!
- \since 4.8
-
- Returns the local 8-bit representation of the string as a
- QByteArray. The returned byte array is undefined if the string
- contains characters not supported by the local 8-bit encoding.
-
- QTextCodec::codecForLocale() is used to perform the conversion from
- Unicode. If the locale encoding could not be determined, this function
- does the same as toLatin1().
-
- If this string contains any characters that cannot be encoded in the
- locale, the returned byte array is undefined. Those characters may be
- suppressed or replaced by another.
-
- \sa toLatin1(), toUtf8(), QTextCodec
-*/
-QByteArray QStringRef::toLocal8Bit() const
-{
- return qt_convert_to_local_8bit(*this);
-}
-
-/*!
- \since 4.8
-
- Returns a UTF-8 representation of the string as a QByteArray.
-
- UTF-8 is a Unicode codec and can represent all characters in a Unicode
- string like QString.
-
- \sa toLatin1(), toLocal8Bit(), QTextCodec
-*/
-QByteArray QStringRef::toUtf8() const
-{
- return qt_convert_to_utf8(*this);
-}
-
-/*!
- \since 4.8
-
- Returns a UCS-4/UTF-32 representation of the string as a QVector<uint>.
-
- UCS-4 is a Unicode codec and therefore it is lossless. All characters from
- this string will be encoded in UCS-4. Any invalid sequence of code units in
- this string is replaced by the Unicode's replacement character
- (QChar::ReplacementCharacter, which corresponds to \c{U+FFFD}).
-
- The returned vector is not \\0'-terminated.
-
- \sa toUtf8(), toLatin1(), toLocal8Bit(), QTextCodec
-*/
-QVector<uint> QStringRef::toUcs4() const
-{
- return qt_convert_to_ucs4(*this);
-}
-
-/*!
- Returns a string that has whitespace removed from the start and
- the end.
-
- Whitespace means any character for which QChar::isSpace() returns
- \c true. This includes the ASCII characters '\\t', '\\n', '\\v',
- '\\f', '\\r', and ' '.
-
- Unlike QString::simplified(), trimmed() leaves internal whitespace alone.
-
- \since 5.1
-
- \sa QString::trimmed()
-*/
-QStringRef QStringRef::trimmed() const
-{
- const QChar *begin = cbegin();
- const QChar *end = cend();
- QStringAlgorithms<const QStringRef>::trimmed_helper_positions(begin, end);
- if (begin == cbegin() && end == cend())
- return *this;
- int position = m_position + (begin - cbegin());
- return QStringRef(m_string, position, end - begin);
-}
-
-/*!
- Returns the string converted to a \c{long long} using base \a
- base, which is 10 by default and must be between 2 and 36, or 0.
- Returns 0 if the conversion fails.
-
- If \a ok is not \nullptr, failure is reported by setting *\a{ok}
- to \c false, and success by setting *\a{ok} to \c true.
-
- If \a base is 0, the C language convention is used: If the string
- begins with "0x", base 16 is used; if the string begins with "0",
- base 8 is used; otherwise, base 10 is used.
-
- The string conversion will always happen in the 'C' locale. For locale
- dependent conversion use QLocale::toLongLong()
-
- \sa QString::toLongLong()
-
- \since 5.1
-*/
-
-qint64 QStringRef::toLongLong(bool *ok, int base) const
-{
- return QString::toIntegral_helper<qint64>(constData(), size(), ok, base);
-}
-
-/*!
- Returns the string converted to an \c{unsigned long long} using base \a
- base, which is 10 by default and must be between 2 and 36, or 0.
- Returns 0 if the conversion fails.
-
- If \a ok is not \nullptr, failure is reported by setting *\a{ok}
- to \c false, and success by setting *\a{ok} to \c true.
-
- If \a base is 0, the C language convention is used: If the string
- begins with "0x", base 16 is used; if the string begins with "0",
- base 8 is used; otherwise, base 10 is used.
-
- The string conversion will always happen in the 'C' locale. For locale
- dependent conversion use QLocale::toULongLong()
-
- \sa QString::toULongLong()
-
- \since 5.1
-*/
-
-quint64 QStringRef::toULongLong(bool *ok, int base) const
-{
- return QString::toIntegral_helper<quint64>(constData(), size(), ok, base);
-}
-
-/*!
- \fn long QStringRef::toLong(bool *ok, int base) const
-
- Returns the string converted to a \c long using base \a
- base, which is 10 by default and must be between 2 and 36, or 0.
- Returns 0 if the conversion fails.
-
- If \a ok is not \nullptr, failure is reported by setting *\a{ok}
- to \c false, and success by setting *\a{ok} to \c true.
-
- If \a base is 0, the C language convention is used: If the string
- begins with "0x", base 16 is used; if the string begins with "0",
- base 8 is used; otherwise, base 10 is used.
-
- The string conversion will always happen in the 'C' locale. For locale
- dependent conversion use QLocale::toLong()
-
- \sa QString::toLong()
-
- \since 5.1
-*/
-
-long QStringRef::toLong(bool *ok, int base) const
-{
- return QString::toIntegral_helper<long>(constData(), size(), ok, base);
-}
-
-/*!
- \fn ulong QStringRef::toULong(bool *ok, int base) const
-
- Returns the string converted to an \c{unsigned long} using base \a
- base, which is 10 by default and must be between 2 and 36, or 0.
- Returns 0 if the conversion fails.
-
- If \a ok is not \nullptr, failure is reported by setting *\a{ok}
- to \c false, and success by setting *\a{ok} to \c true.
-
- If \a base is 0, the C language convention is used: If the string
- begins with "0x", base 16 is used; if the string begins with "0",
- base 8 is used; otherwise, base 10 is used.
-
- The string conversion will always happen in the 'C' locale. For locale
- dependent conversion use QLocale::toULongLong()
-
- \sa QString::toULong()
-
- \since 5.1
-*/
-
-ulong QStringRef::toULong(bool *ok, int base) const
-{
- return QString::toIntegral_helper<ulong>(constData(), size(), ok, base);
-}
-
-
-/*!
- Returns the string converted to an \c int using base \a
- base, which is 10 by default and must be between 2 and 36, or 0.
- Returns 0 if the conversion fails.
-
- If \a ok is not \nullptr, failure is reported by setting *\a{ok}
- to \c false, and success by setting *\a{ok} to \c true.
-
- If \a base is 0, the C language convention is used: If the string
- begins with "0x", base 16 is used; if the string begins with "0",
- base 8 is used; otherwise, base 10 is used.
-
- The string conversion will always happen in the 'C' locale. For locale
- dependent conversion use QLocale::toInt()
-
- \sa QString::toInt()
-
- \since 5.1
-*/
-
-int QStringRef::toInt(bool *ok, int base) const
-{
- return QString::toIntegral_helper<int>(constData(), size(), ok, base);
-}
-
-/*!
- Returns the string converted to an \c{unsigned int} using base \a
- base, which is 10 by default and must be between 2 and 36, or 0.
- Returns 0 if the conversion fails.
-
- If \a ok is not \nullptr, failure is reported by setting *\a{ok}
- to \c false, and success by setting *\a{ok} to \c true.
-
- If \a base is 0, the C language convention is used: If the string
- begins with "0x", base 16 is used; if the string begins with "0",
- base 8 is used; otherwise, base 10 is used.
-
- The string conversion will always happen in the 'C' locale. For locale
- dependent conversion use QLocale::toUInt()
-
- \sa QString::toUInt()
-
- \since 5.1
-*/
-
-uint QStringRef::toUInt(bool *ok, int base) const
-{
- return QString::toIntegral_helper<uint>(constData(), size(), ok, base);
-}
-
-/*!
- Returns the string converted to a \c short using base \a
- base, which is 10 by default and must be between 2 and 36, or 0.
- Returns 0 if the conversion fails.
-
- If \a ok is not \nullptr, failure is reported by setting *\a{ok}
- to \c false, and success by setting *\a{ok} to \c true.
-
- If \a base is 0, the C language convention is used: If the string
- begins with "0x", base 16 is used; if the string begins with "0",
- base 8 is used; otherwise, base 10 is used.
-
- The string conversion will always happen in the 'C' locale. For locale
- dependent conversion use QLocale::toShort()
-
- \sa QString::toShort()
-
- \since 5.1
-*/
-
-short QStringRef::toShort(bool *ok, int base) const
-{
- return QString::toIntegral_helper<short>(constData(), size(), ok, base);
-}
-
-/*!
- Returns the string converted to an \c{unsigned short} using base \a
- base, which is 10 by default and must be between 2 and 36, or 0.
- Returns 0 if the conversion fails.
-
- If \a ok is not \nullptr, failure is reported by setting *\a{ok}
- to \c false, and success by setting *\a{ok} to \c true.
-
- If \a base is 0, the C language convention is used: If the string
- begins with "0x", base 16 is used; if the string begins with "0",
- base 8 is used; otherwise, base 10 is used.
-
- The string conversion will always happen in the 'C' locale. For locale
- dependent conversion use QLocale::toUShort()
-
- \sa QString::toUShort()
-
- \since 5.1
-*/
-
-ushort QStringRef::toUShort(bool *ok, int base) const
-{
- return QString::toIntegral_helper<ushort>(constData(), size(), ok, base);
-}
-
-
-/*!
- Returns the string converted to a \c double value.
-
- Returns an infinity if the conversion overflows or 0.0 if the
- conversion fails for other reasons (e.g. underflow).
-
- If \a ok is not \nullptr, failure is reported by setting *\a{ok}
- to \c false, and success by setting *\a{ok} to \c true.
-
- The string conversion will always happen in the 'C' locale. For locale
- dependent conversion use QLocale::toDouble()
-
- For historic reasons, this function does not handle
- thousands group separators. If you need to convert such numbers,
- use QLocale::toDouble().
-
- \sa QString::toDouble()
-
- \since 5.1
-*/
-
-double QStringRef::toDouble(bool *ok) const
-{
- return QLocaleData::c()->stringToDouble(*this, ok, QLocale::RejectGroupSeparator);
-}
-
-/*!
- Returns the string converted to a \c float value.
-
- Returns an infinity if the conversion overflows or 0.0 if the
- conversion fails for other reasons (e.g. underflow).
-
- If \a ok is not \nullptr, failure is reported by setting *\a{ok}
- to \c false, and success by setting *\a{ok} to \c true.
-
- The string conversion will always happen in the 'C' locale. For locale
- dependent conversion use QLocale::toFloat()
-
- \sa QString::toFloat()
-
- \since 5.1
-*/
-
-float QStringRef::toFloat(bool *ok) const
-{
- return QLocaleData::convertDoubleToFloat(toDouble(ok), ok);
-}
-
-/*!
- \obsolete
- \fn QString Qt::escape(const QString &plain)
-
- Use QString::toHtmlEscaped() instead.
-*/
-
-/*!
- \since 5.0
-
- Converts a plain text string to an HTML string with
- HTML metacharacters \c{<}, \c{>}, \c{&}, and \c{"} replaced by HTML
- entities.
-
- Example:
-
- \snippet code/src_corelib_tools_qstring.cpp 7
-*/
-QString QString::toHtmlEscaped() const
-{
- QString rich;
- const int len = length();
- rich.reserve(int(len * 1.1));
- for (int i = 0; i < len; ++i) {
- if (at(i) == QLatin1Char('<'))
- rich += QLatin1String("&lt;");
- else if (at(i) == QLatin1Char('>'))
- rich += QLatin1String("&gt;");
- else if (at(i) == QLatin1Char('&'))
- rich += QLatin1String("&amp;");
- else if (at(i) == QLatin1Char('"'))
- rich += QLatin1String("&quot;");
- else
- rich += at(i);
- }
- rich.squeeze();
- return rich;
-}
-
-/*!
- \macro QStringLiteral(str)
- \relates QString
-
- The macro generates the data for a QString out of the string literal \a str
- at compile time. Creating a QString from it is free in this case, and the
- generated string data is stored in the read-only segment of the compiled
- object file.
-
- If you have code that looks like this:
-
- \snippet code/src_corelib_tools_qstring.cpp 9
-
- then a temporary QString will be created to be passed as the \c{hasAttribute}
- function parameter. This can be quite expensive, as it involves a memory
- allocation and the copy/conversion of the data into QString's internal
- encoding.
-
- This cost can be avoided by using QStringLiteral instead:
-
- \snippet code/src_corelib_tools_qstring.cpp 10
-
- In this case, QString's internal data will be generated at compile time; no
- conversion or allocation will occur at runtime.
-
- Using QStringLiteral instead of a double quoted plain C++ string literal can
- significantly speed up creation of QString instances from data known at
- compile time.
-
- \note QLatin1String can still be more efficient than QStringLiteral
- when the string is passed to a function that has an overload taking
- QLatin1String and this overload avoids conversion to QString. For
- instance, QString::operator==() can compare to a QLatin1String
- directly:
-
- \snippet code/src_corelib_tools_qstring.cpp 11
-
- \note Some compilers have bugs encoding strings containing characters outside
- the US-ASCII character set. Make sure you prefix your string with \c{u} in
- those cases. It is optional otherwise.
-
- \sa QByteArrayLiteral
-*/
-
-/*!
- \internal
- */
-void QAbstractConcatenable::appendLatin1To(const char *a, int len, QChar *out) Q_DECL_NOTHROW
-{
- qt_from_latin1(reinterpret_cast<ushort *>(out), a, uint(len));
-}
-
-QT_END_NAMESPACE
diff --git a/src/corelib/tools/qstring.h b/src/corelib/tools/qstring.h
deleted file mode 100644
index b138c3f140..0000000000
--- a/src/corelib/tools/qstring.h
+++ /dev/null
@@ -1,1879 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Copyright (C) 2016 Intel Corporation.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#ifndef QSTRING_H
-#define QSTRING_H
-
-#if defined(QT_NO_CAST_FROM_ASCII) && defined(QT_RESTRICTED_CAST_FROM_ASCII)
-#error QT_NO_CAST_FROM_ASCII and QT_RESTRICTED_CAST_FROM_ASCII must not be defined at the same time
-#endif
-
-#include <QtCore/qchar.h>
-#include <QtCore/qbytearray.h>
-#include <QtCore/qrefcount.h>
-#include <QtCore/qnamespace.h>
-#include <QtCore/qstringliteral.h>
-#include <QtCore/qstringalgorithms.h>
-#include <QtCore/qstringview.h>
-
-#include <string>
-#include <iterator>
-
-#if defined(Q_OS_ANDROID) && !defined(ANDROID_HAS_WSTRING)
-// std::wstring is disabled on android's glibc, as bionic lacks certain features
-// that libstdc++ checks for (like mbcslen).
-namespace std
-{
- typedef basic_string<wchar_t> wstring;
-}
-#endif
-
-#include <stdarg.h>
-
-#ifdef truncate
-#error qstring.h must be included before any header file that defines truncate
-#endif
-
-#if defined(Q_OS_DARWIN) || defined(Q_QDOC)
-Q_FORWARD_DECLARE_CF_TYPE(CFString);
-Q_FORWARD_DECLARE_OBJC_CLASS(NSString);
-#endif
-
-QT_BEGIN_NAMESPACE
-
-class QCharRef;
-class QRegExp;
-class QRegularExpression;
-class QRegularExpressionMatch;
-class QString;
-class QStringList;
-class QTextCodec;
-class QStringRef;
-template <typename T> class QVector;
-
-class QLatin1String
-{
-public:
- Q_DECL_CONSTEXPR inline QLatin1String() Q_DECL_NOTHROW : m_size(0), m_data(nullptr) {}
- Q_DECL_CONSTEXPR inline explicit QLatin1String(const char *s) Q_DECL_NOTHROW : m_size(s ? int(strlen(s)) : 0), m_data(s) {}
- Q_DECL_CONSTEXPR explicit QLatin1String(const char *f, const char *l)
- : QLatin1String(f, int(l - f)) {}
- Q_DECL_CONSTEXPR inline explicit QLatin1String(const char *s, int sz) Q_DECL_NOTHROW : m_size(sz), m_data(s) {}
- inline explicit QLatin1String(const QByteArray &s) Q_DECL_NOTHROW : m_size(int(qstrnlen(s.constData(), s.size()))), m_data(s.constData()) {}
-
- Q_DECL_CONSTEXPR const char *latin1() const Q_DECL_NOTHROW { return m_data; }
- Q_DECL_CONSTEXPR int size() const Q_DECL_NOTHROW { return m_size; }
- Q_DECL_CONSTEXPR const char *data() const Q_DECL_NOTHROW { return m_data; }
-
- Q_DECL_CONSTEXPR bool isNull() const Q_DECL_NOTHROW { return !data(); }
- Q_DECL_CONSTEXPR bool isEmpty() const Q_DECL_NOTHROW { return !size(); }
-
- Q_DECL_CONSTEXPR QLatin1Char at(int i) const
- { return Q_ASSERT(i >= 0), Q_ASSERT(i < size()), QLatin1Char(m_data[i]); }
- Q_DECL_CONSTEXPR QLatin1Char operator[](int i) const { return at(i); }
-
- Q_REQUIRED_RESULT Q_DECL_CONSTEXPR QLatin1Char front() const { return at(0); }
- Q_REQUIRED_RESULT Q_DECL_CONSTEXPR QLatin1Char back() const { return at(size() - 1); }
-
- Q_REQUIRED_RESULT bool startsWith(QStringView s, Qt::CaseSensitivity cs = Qt::CaseSensitive) const Q_DECL_NOTHROW
- { return QtPrivate::startsWith(*this, s, cs); }
- Q_REQUIRED_RESULT bool startsWith(QLatin1String s, Qt::CaseSensitivity cs = Qt::CaseSensitive) const Q_DECL_NOTHROW
- { return QtPrivate::startsWith(*this, s, cs); }
- Q_REQUIRED_RESULT Q_DECL_CONSTEXPR bool startsWith(QChar c) const Q_DECL_NOTHROW
- { return !isEmpty() && front() == c; }
- Q_REQUIRED_RESULT inline bool startsWith(QChar c, Qt::CaseSensitivity cs) const Q_DECL_NOTHROW
- { return QtPrivate::startsWith(*this, QStringView(&c, 1), cs); }
-
- Q_REQUIRED_RESULT bool endsWith(QStringView s, Qt::CaseSensitivity cs = Qt::CaseSensitive) const Q_DECL_NOTHROW
- { return QtPrivate::endsWith(*this, s, cs); }
- Q_REQUIRED_RESULT bool endsWith(QLatin1String s, Qt::CaseSensitivity cs = Qt::CaseSensitive) const Q_DECL_NOTHROW
- { return QtPrivate::endsWith(*this, s, cs); }
- Q_REQUIRED_RESULT Q_DECL_CONSTEXPR bool endsWith(QChar c) const Q_DECL_NOTHROW
- { return !isEmpty() && back() == c; }
- Q_REQUIRED_RESULT inline bool endsWith(QChar c, Qt::CaseSensitivity cs) const Q_DECL_NOTHROW
- { return QtPrivate::endsWith(*this, QStringView(&c, 1), cs); }
-
- using value_type = const char;
- using reference = value_type&;
- using const_reference = reference;
- using iterator = value_type*;
- using const_iterator = iterator;
- using difference_type = int; // violates Container concept requirements
- using size_type = int; // violates Container concept requirements
-
- Q_DECL_CONSTEXPR const_iterator begin() const Q_DECL_NOTHROW { return data(); }
- Q_DECL_CONSTEXPR const_iterator cbegin() const Q_DECL_NOTHROW { return data(); }
- Q_DECL_CONSTEXPR const_iterator end() const Q_DECL_NOTHROW { return data() + size(); }
- Q_DECL_CONSTEXPR const_iterator cend() const Q_DECL_NOTHROW { return data() + size(); }
-
- using reverse_iterator = std::reverse_iterator<iterator>;
- using const_reverse_iterator = reverse_iterator;
-
- const_reverse_iterator rbegin() const Q_DECL_NOTHROW { return const_reverse_iterator(end()); }
- const_reverse_iterator crbegin() const Q_DECL_NOTHROW { return const_reverse_iterator(end()); }
- const_reverse_iterator rend() const Q_DECL_NOTHROW { return const_reverse_iterator(begin()); }
- const_reverse_iterator crend() const Q_DECL_NOTHROW { return const_reverse_iterator(begin()); }
-
- Q_DECL_CONSTEXPR QLatin1String mid(int pos) const
- { return Q_ASSERT(pos >= 0), Q_ASSERT(pos <= size()), QLatin1String(m_data + pos, m_size - pos); }
- Q_DECL_CONSTEXPR QLatin1String mid(int pos, int n) const
- { return Q_ASSERT(pos >= 0), Q_ASSERT(n >= 0), Q_ASSERT(pos + n <= size()), QLatin1String(m_data + pos, n); }
- Q_DECL_CONSTEXPR QLatin1String left(int n) const
- { return Q_ASSERT(n >= 0), Q_ASSERT(n <= size()), QLatin1String(m_data, n); }
- Q_DECL_CONSTEXPR QLatin1String right(int n) const
- { return Q_ASSERT(n >= 0), Q_ASSERT(n <= size()), QLatin1String(m_data + m_size - n, n); }
- Q_REQUIRED_RESULT Q_DECL_CONSTEXPR QLatin1String chopped(int n) const
- { return Q_ASSERT(n >= 0), Q_ASSERT(n <= size()), QLatin1String(m_data, m_size - n); }
-
- Q_DECL_RELAXED_CONSTEXPR void chop(int n)
- { Q_ASSERT(n >= 0); Q_ASSERT(n <= size()); m_size -= n; }
- Q_DECL_RELAXED_CONSTEXPR void truncate(int n)
- { Q_ASSERT(n >= 0); Q_ASSERT(n <= size()); m_size = n; }
-
- Q_REQUIRED_RESULT QLatin1String trimmed() const Q_DECL_NOTHROW { return QtPrivate::trimmed(*this); }
-
- inline bool operator==(const QString &s) const Q_DECL_NOTHROW;
- inline bool operator!=(const QString &s) const Q_DECL_NOTHROW;
- inline bool operator>(const QString &s) const Q_DECL_NOTHROW;
- inline bool operator<(const QString &s) const Q_DECL_NOTHROW;
- inline bool operator>=(const QString &s) const Q_DECL_NOTHROW;
- inline bool operator<=(const QString &s) const Q_DECL_NOTHROW;
-
-#if !defined(QT_NO_CAST_FROM_ASCII) && !defined(QT_RESTRICTED_CAST_FROM_ASCII)
- inline QT_ASCII_CAST_WARN bool operator==(const char *s) const;
- inline QT_ASCII_CAST_WARN bool operator!=(const char *s) const;
- inline QT_ASCII_CAST_WARN bool operator<(const char *s) const;
- inline QT_ASCII_CAST_WARN bool operator>(const char *s) const;
- inline QT_ASCII_CAST_WARN bool operator<=(const char *s) const;
- inline QT_ASCII_CAST_WARN bool operator>=(const char *s) const;
-
- inline QT_ASCII_CAST_WARN bool operator==(const QByteArray &s) const;
- inline QT_ASCII_CAST_WARN bool operator!=(const QByteArray &s) const;
- inline QT_ASCII_CAST_WARN bool operator<(const QByteArray &s) const;
- inline QT_ASCII_CAST_WARN bool operator>(const QByteArray &s) const;
- inline QT_ASCII_CAST_WARN bool operator<=(const QByteArray &s) const;
- inline QT_ASCII_CAST_WARN bool operator>=(const QByteArray &s) const;
-#endif // !defined(QT_NO_CAST_FROM_ASCII) && !defined(QT_RESTRICTED_CAST_FROM_ASCII)
-
-private:
- int m_size;
- const char *m_data;
-};
-Q_DECLARE_TYPEINFO(QLatin1String, Q_MOVABLE_TYPE);
-
-// Qt 4.x compatibility
-typedef QLatin1String QLatin1Literal;
-
-//
-// QLatin1String inline implementations
-//
-inline bool QtPrivate::isLatin1(QLatin1String) Q_DECL_NOTHROW
-{ return true; }
-
-//
-// QStringView members that require QLatin1String:
-//
-bool QStringView::startsWith(QLatin1String s, Qt::CaseSensitivity cs) const Q_DECL_NOTHROW
-{ return QtPrivate::startsWith(*this, s, cs); }
-bool QStringView::endsWith(QLatin1String s, Qt::CaseSensitivity cs) const Q_DECL_NOTHROW
-{ return QtPrivate::endsWith(*this, s, cs); }
-
-class Q_CORE_EXPORT QString
-{
-public:
- typedef QStringData Data;
-
- inline QString() Q_DECL_NOTHROW;
- explicit QString(const QChar *unicode, int size = -1);
- QString(QChar c);
- QString(int size, QChar c);
- inline QString(QLatin1String latin1);
- inline QString(const QString &) Q_DECL_NOTHROW;
- inline ~QString();
- QString &operator=(QChar c);
- QString &operator=(const QString &) Q_DECL_NOTHROW;
- QString &operator=(QLatin1String latin1);
-#ifdef Q_COMPILER_RVALUE_REFS
- inline QString(QString && other) Q_DECL_NOTHROW : d(other.d) { other.d = Data::sharedNull(); }
- inline QString &operator=(QString &&other) Q_DECL_NOTHROW
- { qSwap(d, other.d); return *this; }
-#endif
- inline void swap(QString &other) Q_DECL_NOTHROW { qSwap(d, other.d); }
- inline int size() const { return d->size; }
- inline int count() const { return d->size; }
- inline int length() const;
- inline bool isEmpty() const;
- void resize(int size);
- void resize(int size, QChar fillChar);
-
- QString &fill(QChar c, int size = -1);
- void truncate(int pos);
- void chop(int n);
-
- int capacity() const;
- inline void reserve(int size);
- inline void squeeze();
-
- inline const QChar *unicode() const;
- inline QChar *data();
- inline const QChar *data() const;
- inline const QChar *constData() const;
-
- inline void detach();
- inline bool isDetached() const;
- inline bool isSharedWith(const QString &other) const { return d == other.d; }
- void clear();
-
- inline const QChar at(int i) const;
- const QChar operator[](int i) const;
- QCharRef operator[](int i);
- const QChar operator[](uint i) const;
- QCharRef operator[](uint i);
-
- Q_REQUIRED_RESULT inline QChar front() const { return at(0); }
- Q_REQUIRED_RESULT inline QCharRef front();
- Q_REQUIRED_RESULT inline QChar back() const { return at(size() - 1); }
- Q_REQUIRED_RESULT inline QCharRef back();
-
- Q_REQUIRED_RESULT QString arg(qlonglong a, int fieldwidth=0, int base=10,
- QChar fillChar = QLatin1Char(' ')) const;
- Q_REQUIRED_RESULT QString arg(qulonglong a, int fieldwidth=0, int base=10,
- QChar fillChar = QLatin1Char(' ')) const;
- Q_REQUIRED_RESULT QString arg(long a, int fieldwidth=0, int base=10,
- QChar fillChar = QLatin1Char(' ')) const;
- Q_REQUIRED_RESULT QString arg(ulong a, int fieldwidth=0, int base=10,
- QChar fillChar = QLatin1Char(' ')) const;
- Q_REQUIRED_RESULT QString arg(int a, int fieldWidth = 0, int base = 10,
- QChar fillChar = QLatin1Char(' ')) const;
- Q_REQUIRED_RESULT QString arg(uint a, int fieldWidth = 0, int base = 10,
- QChar fillChar = QLatin1Char(' ')) const;
- Q_REQUIRED_RESULT QString arg(short a, int fieldWidth = 0, int base = 10,
- QChar fillChar = QLatin1Char(' ')) const;
- Q_REQUIRED_RESULT QString arg(ushort a, int fieldWidth = 0, int base = 10,
- QChar fillChar = QLatin1Char(' ')) const;
- Q_REQUIRED_RESULT QString arg(double a, int fieldWidth = 0, char fmt = 'g', int prec = -1,
- QChar fillChar = QLatin1Char(' ')) const;
- Q_REQUIRED_RESULT QString arg(char a, int fieldWidth = 0,
- QChar fillChar = QLatin1Char(' ')) const;
- Q_REQUIRED_RESULT QString arg(QChar a, int fieldWidth = 0,
- QChar fillChar = QLatin1Char(' ')) const;
-#if QT_STRINGVIEW_LEVEL < 2
- Q_REQUIRED_RESULT QString arg(const QString &a, int fieldWidth = 0,
- QChar fillChar = QLatin1Char(' ')) const;
-#endif
- Q_REQUIRED_RESULT QString arg(QStringView a, int fieldWidth = 0,
- QChar fillChar = QLatin1Char(' ')) const;
- Q_REQUIRED_RESULT QString arg(QLatin1String a, int fieldWidth = 0,
- QChar fillChar = QLatin1Char(' ')) const;
- Q_REQUIRED_RESULT QString arg(const QString &a1, const QString &a2) const;
- Q_REQUIRED_RESULT QString arg(const QString &a1, const QString &a2, const QString &a3) const;
- Q_REQUIRED_RESULT QString arg(const QString &a1, const QString &a2, const QString &a3,
- const QString &a4) const;
- Q_REQUIRED_RESULT QString arg(const QString &a1, const QString &a2, const QString &a3,
- const QString &a4, const QString &a5) const;
- Q_REQUIRED_RESULT QString arg(const QString &a1, const QString &a2, const QString &a3,
- const QString &a4, const QString &a5, const QString &a6) const;
- Q_REQUIRED_RESULT QString arg(const QString &a1, const QString &a2, const QString &a3,
- const QString &a4, const QString &a5, const QString &a6,
- const QString &a7) const;
- Q_REQUIRED_RESULT QString arg(const QString &a1, const QString &a2, const QString &a3,
- const QString &a4, const QString &a5, const QString &a6,
- const QString &a7, const QString &a8) const;
- Q_REQUIRED_RESULT QString arg(const QString &a1, const QString &a2, const QString &a3,
- const QString &a4, const QString &a5, const QString &a6,
- const QString &a7, const QString &a8, const QString &a9) const;
-
- QString &vsprintf(const char *format, va_list ap) Q_ATTRIBUTE_FORMAT_PRINTF(2, 0);
- QString &sprintf(const char *format, ...) Q_ATTRIBUTE_FORMAT_PRINTF(2, 3);
- static QString vasprintf(const char *format, va_list ap) Q_ATTRIBUTE_FORMAT_PRINTF(1, 0);
- static QString asprintf(const char *format, ...) Q_ATTRIBUTE_FORMAT_PRINTF(1, 2);
-
- int indexOf(QChar c, int from = 0, Qt::CaseSensitivity cs = Qt::CaseSensitive) const;
- int indexOf(const QString &s, int from = 0, Qt::CaseSensitivity cs = Qt::CaseSensitive) const;
- int indexOf(QLatin1String s, int from = 0, Qt::CaseSensitivity cs = Qt::CaseSensitive) const;
- int indexOf(const QStringRef &s, int from = 0, Qt::CaseSensitivity cs = Qt::CaseSensitive) const;
- int lastIndexOf(QChar c, int from = -1, Qt::CaseSensitivity cs = Qt::CaseSensitive) const;
- int lastIndexOf(const QString &s, int from = -1, Qt::CaseSensitivity cs = Qt::CaseSensitive) const;
- int lastIndexOf(QLatin1String s, int from = -1, Qt::CaseSensitivity cs = Qt::CaseSensitive) const;
- int lastIndexOf(const QStringRef &s, int from = -1, Qt::CaseSensitivity cs = Qt::CaseSensitive) const;
-
- inline bool contains(QChar c, Qt::CaseSensitivity cs = Qt::CaseSensitive) const;
- inline bool contains(const QString &s, Qt::CaseSensitivity cs = Qt::CaseSensitive) const;
- inline bool contains(QLatin1String s, Qt::CaseSensitivity cs = Qt::CaseSensitive) const;
- inline bool contains(const QStringRef &s, Qt::CaseSensitivity cs = Qt::CaseSensitive) const;
- int count(QChar c, Qt::CaseSensitivity cs = Qt::CaseSensitive) const;
- int count(const QString &s, Qt::CaseSensitivity cs = Qt::CaseSensitive) const;
- int count(const QStringRef &s, Qt::CaseSensitivity cs = Qt::CaseSensitive) const;
-
-#ifndef QT_NO_REGEXP
- int indexOf(const QRegExp &, int from = 0) const;
- int lastIndexOf(const QRegExp &, int from = -1) const;
- inline bool contains(const QRegExp &rx) const { return indexOf(rx) != -1; }
- int count(const QRegExp &) const;
-
- int indexOf(QRegExp &, int from = 0) const;
- int lastIndexOf(QRegExp &, int from = -1) const;
- inline bool contains(QRegExp &rx) const { return indexOf(rx) != -1; }
-#endif
-
-#if QT_CONFIG(regularexpression)
- int indexOf(const QRegularExpression &re, int from = 0) const;
- int indexOf(const QRegularExpression &re, int from, QRegularExpressionMatch *rmatch) const; // ### Qt 6: merge overloads
- int lastIndexOf(const QRegularExpression &re, int from = -1) const;
- int lastIndexOf(const QRegularExpression &re, int from, QRegularExpressionMatch *rmatch) const; // ### Qt 6: merge overloads
- bool contains(const QRegularExpression &re) const;
- bool contains(const QRegularExpression &re, QRegularExpressionMatch *rmatch) const; // ### Qt 6: merge overloads
- int count(const QRegularExpression &re) const;
-#endif
-
- enum SectionFlag {
- SectionDefault = 0x00,
- SectionSkipEmpty = 0x01,
- SectionIncludeLeadingSep = 0x02,
- SectionIncludeTrailingSep = 0x04,
- SectionCaseInsensitiveSeps = 0x08
- };
- Q_DECLARE_FLAGS(SectionFlags, SectionFlag)
-
- QString section(QChar sep, int start, int end = -1, SectionFlags flags = SectionDefault) const;
- QString section(const QString &in_sep, int start, int end = -1, SectionFlags flags = SectionDefault) const;
-#ifndef QT_NO_REGEXP
- QString section(const QRegExp &reg, int start, int end = -1, SectionFlags flags = SectionDefault) const;
-#endif
-#if QT_CONFIG(regularexpression)
- QString section(const QRegularExpression &re, int start, int end = -1, SectionFlags flags = SectionDefault) const;
-#endif
- Q_REQUIRED_RESULT QString left(int n) const;
- Q_REQUIRED_RESULT QString right(int n) const;
- Q_REQUIRED_RESULT QString mid(int position, int n = -1) const;
- Q_REQUIRED_RESULT QString chopped(int n) const
- { Q_ASSERT(n >= 0); Q_ASSERT(n <= size()); return left(size() - n); }
-
-
- Q_REQUIRED_RESULT QStringRef leftRef(int n) const;
- Q_REQUIRED_RESULT QStringRef rightRef(int n) const;
- Q_REQUIRED_RESULT QStringRef midRef(int position, int n = -1) const;
-
-#if QT_STRINGVIEW_LEVEL < 2
- bool startsWith(const QString &s, Qt::CaseSensitivity cs = Qt::CaseSensitive) const;
- bool startsWith(const QStringRef &s, Qt::CaseSensitivity cs = Qt::CaseSensitive) const;
-#endif
- Q_REQUIRED_RESULT bool startsWith(QStringView s, Qt::CaseSensitivity cs = Qt::CaseSensitive) const Q_DECL_NOTHROW
- { return QtPrivate::startsWith(*this, s, cs); }
- bool startsWith(QLatin1String s, Qt::CaseSensitivity cs = Qt::CaseSensitive) const;
- bool startsWith(QChar c, Qt::CaseSensitivity cs = Qt::CaseSensitive) const;
-
-#if QT_STRINGVIEW_LEVEL < 2
- bool endsWith(const QString &s, Qt::CaseSensitivity cs = Qt::CaseSensitive) const;
- bool endsWith(const QStringRef &s, Qt::CaseSensitivity cs = Qt::CaseSensitive) const;
-#endif
- Q_REQUIRED_RESULT bool endsWith(QStringView s, Qt::CaseSensitivity cs = Qt::CaseSensitive) const Q_DECL_NOTHROW
- { return QtPrivate::endsWith(*this, s, cs); }
- bool endsWith(QLatin1String s, Qt::CaseSensitivity cs = Qt::CaseSensitive) const;
- bool endsWith(QChar c, Qt::CaseSensitivity cs = Qt::CaseSensitive) const;
-
- bool isUpper() const;
- bool isLower() const;
-
- Q_REQUIRED_RESULT QString leftJustified(int width, QChar fill = QLatin1Char(' '), bool trunc = false) const;
- Q_REQUIRED_RESULT QString rightJustified(int width, QChar fill = QLatin1Char(' '), bool trunc = false) const;
-
-#if defined(Q_COMPILER_REF_QUALIFIERS) && !defined(QT_COMPILING_QSTRING_COMPAT_CPP) && !defined(Q_CLANG_QDOC)
-# if defined(Q_CC_GNU) && !defined(Q_CC_CLANG) && !defined(Q_CC_INTEL) && !QT_HAS_CPP_ATTRIBUTE(nodiscard)
- // required due to https://gcc.gnu.org/bugzilla/show_bug.cgi?id=61941
-# pragma push_macro("Q_REQUIRED_RESULT")
-# undef Q_REQUIRED_RESULT
-# define Q_REQUIRED_RESULT
-# define Q_REQUIRED_RESULT_pushed
-# endif
- Q_REQUIRED_RESULT QString toLower() const &
- { return toLower_helper(*this); }
- Q_REQUIRED_RESULT QString toLower() &&
- { return toLower_helper(*this); }
- Q_REQUIRED_RESULT QString toUpper() const &
- { return toUpper_helper(*this); }
- Q_REQUIRED_RESULT QString toUpper() &&
- { return toUpper_helper(*this); }
- Q_REQUIRED_RESULT QString toCaseFolded() const &
- { return toCaseFolded_helper(*this); }
- Q_REQUIRED_RESULT QString toCaseFolded() &&
- { return toCaseFolded_helper(*this); }
- Q_REQUIRED_RESULT QString trimmed() const &
- { return trimmed_helper(*this); }
- Q_REQUIRED_RESULT QString trimmed() &&
- { return trimmed_helper(*this); }
- Q_REQUIRED_RESULT QString simplified() const &
- { return simplified_helper(*this); }
- Q_REQUIRED_RESULT QString simplified() &&
- { return simplified_helper(*this); }
-# ifdef Q_REQUIRED_RESULT_pushed
-# pragma pop_macro("Q_REQUIRED_RESULT")
-# endif
-#else
- Q_REQUIRED_RESULT QString toLower() const;
- Q_REQUIRED_RESULT QString toUpper() const;
- Q_REQUIRED_RESULT QString toCaseFolded() const;
- Q_REQUIRED_RESULT QString trimmed() const;
- Q_REQUIRED_RESULT QString simplified() const;
-#endif
- Q_REQUIRED_RESULT QString toHtmlEscaped() const;
-
- QString &insert(int i, QChar c);
- QString &insert(int i, const QChar *uc, int len);
- inline QString &insert(int i, const QString &s) { return insert(i, s.constData(), s.length()); }
- inline QString &insert(int i, const QStringRef &s);
- QString &insert(int i, QLatin1String s);
- QString &append(QChar c);
- QString &append(const QChar *uc, int len);
- QString &append(const QString &s);
- QString &append(const QStringRef &s);
- QString &append(QLatin1String s);
- inline QString &prepend(QChar c) { return insert(0, c); }
- inline QString &prepend(const QChar *uc, int len) { return insert(0, uc, len); }
- inline QString &prepend(const QString &s) { return insert(0, s); }
- inline QString &prepend(const QStringRef &s) { return insert(0, s); }
- inline QString &prepend(QLatin1String s) { return insert(0, s); }
-
- inline QString &operator+=(QChar c) {
- if (d->ref.isShared() || uint(d->size) + 2u > d->alloc)
- reallocData(uint(d->size) + 2u, true);
- d->data()[d->size++] = c.unicode();
- d->data()[d->size] = '\0';
- return *this;
- }
-
- inline QString &operator+=(QChar::SpecialCharacter c) { return append(QChar(c)); }
- inline QString &operator+=(const QString &s) { return append(s); }
- inline QString &operator+=(const QStringRef &s) { return append(s); }
- inline QString &operator+=(QLatin1String s) { return append(s); }
-
- QString &remove(int i, int len);
- QString &remove(QChar c, Qt::CaseSensitivity cs = Qt::CaseSensitive);
- QString &remove(QLatin1String s, Qt::CaseSensitivity cs = Qt::CaseSensitive);
- QString &remove(const QString &s, Qt::CaseSensitivity cs = Qt::CaseSensitive);
- QString &replace(int i, int len, QChar after);
- QString &replace(int i, int len, const QChar *s, int slen);
- QString &replace(int i, int len, const QString &after);
- QString &replace(QChar before, QChar after, Qt::CaseSensitivity cs = Qt::CaseSensitive);
- QString &replace(const QChar *before, int blen, const QChar *after, int alen, Qt::CaseSensitivity cs = Qt::CaseSensitive);
- QString &replace(QLatin1String before, QLatin1String after, Qt::CaseSensitivity cs = Qt::CaseSensitive);
- QString &replace(QLatin1String before, const QString &after, Qt::CaseSensitivity cs = Qt::CaseSensitive);
- QString &replace(const QString &before, QLatin1String after, Qt::CaseSensitivity cs = Qt::CaseSensitive);
- QString &replace(const QString &before, const QString &after,
- Qt::CaseSensitivity cs = Qt::CaseSensitive);
- QString &replace(QChar c, const QString &after, Qt::CaseSensitivity cs = Qt::CaseSensitive);
- QString &replace(QChar c, QLatin1String after, Qt::CaseSensitivity cs = Qt::CaseSensitive);
-#ifndef QT_NO_REGEXP
- QString &replace(const QRegExp &rx, const QString &after);
- inline QString &remove(const QRegExp &rx)
- { return replace(rx, QString()); }
-#endif
-#if QT_CONFIG(regularexpression)
- QString &replace(const QRegularExpression &re, const QString &after);
- inline QString &remove(const QRegularExpression &re)
- { return replace(re, QString()); }
-#endif
-
- enum SplitBehavior { KeepEmptyParts, SkipEmptyParts };
-
- Q_REQUIRED_RESULT QStringList split(const QString &sep, SplitBehavior behavior = KeepEmptyParts,
- Qt::CaseSensitivity cs = Qt::CaseSensitive) const;
- Q_REQUIRED_RESULT QVector<QStringRef> splitRef(const QString &sep, SplitBehavior behavior = KeepEmptyParts,
- Qt::CaseSensitivity cs = Qt::CaseSensitive) const;
- Q_REQUIRED_RESULT QStringList split(QChar sep, SplitBehavior behavior = KeepEmptyParts,
- Qt::CaseSensitivity cs = Qt::CaseSensitive) const;
- Q_REQUIRED_RESULT QVector<QStringRef> splitRef(QChar sep, SplitBehavior behavior = KeepEmptyParts,
- Qt::CaseSensitivity cs = Qt::CaseSensitive) const;
-#ifndef QT_NO_REGEXP
- Q_REQUIRED_RESULT QStringList split(const QRegExp &sep, SplitBehavior behavior = KeepEmptyParts) const;
- Q_REQUIRED_RESULT QVector<QStringRef> splitRef(const QRegExp &sep, SplitBehavior behavior = KeepEmptyParts) const;
-#endif
-#if QT_CONFIG(regularexpression)
- Q_REQUIRED_RESULT QStringList split(const QRegularExpression &sep, SplitBehavior behavior = KeepEmptyParts) const;
- Q_REQUIRED_RESULT QVector<QStringRef> splitRef(const QRegularExpression &sep, SplitBehavior behavior = KeepEmptyParts) const;
-#endif
- enum NormalizationForm {
- NormalizationForm_D,
- NormalizationForm_C,
- NormalizationForm_KD,
- NormalizationForm_KC
- };
- Q_REQUIRED_RESULT QString normalized(NormalizationForm mode, QChar::UnicodeVersion version = QChar::Unicode_Unassigned) const;
-
- Q_REQUIRED_RESULT QString repeated(int times) const;
-
- const ushort *utf16() const;
-
-#if defined(Q_COMPILER_REF_QUALIFIERS) && !defined(QT_COMPILING_QSTRING_COMPAT_CPP) && !defined(Q_CLANG_QDOC)
- Q_REQUIRED_RESULT QByteArray toLatin1() const &
- { return toLatin1_helper(*this); }
- Q_REQUIRED_RESULT QByteArray toLatin1() &&
- { return toLatin1_helper_inplace(*this); }
- Q_REQUIRED_RESULT QByteArray toUtf8() const &
- { return toUtf8_helper(*this); }
- Q_REQUIRED_RESULT QByteArray toUtf8() &&
- { return toUtf8_helper(*this); }
- Q_REQUIRED_RESULT QByteArray toLocal8Bit() const &
- { return toLocal8Bit_helper(isNull() ? nullptr : constData(), size()); }
- Q_REQUIRED_RESULT QByteArray toLocal8Bit() &&
- { return toLocal8Bit_helper(isNull() ? nullptr : constData(), size()); }
-#else
- Q_REQUIRED_RESULT QByteArray toLatin1() const;
- Q_REQUIRED_RESULT QByteArray toUtf8() const;
- Q_REQUIRED_RESULT QByteArray toLocal8Bit() const;
-#endif
- Q_REQUIRED_RESULT QVector<uint> toUcs4() const;
-
- // note - this are all inline so we can benefit from strlen() compile time optimizations
- static inline QString fromLatin1(const char *str, int size = -1)
- {
- QStringDataPtr dataPtr = { fromLatin1_helper(str, (str && size == -1) ? int(strlen(str)) : size) };
- return QString(dataPtr);
- }
- static inline QString fromUtf8(const char *str, int size = -1)
- {
- return fromUtf8_helper(str, (str && size == -1) ? int(strlen(str)) : size);
- }
- static inline QString fromLocal8Bit(const char *str, int size = -1)
- {
- return fromLocal8Bit_helper(str, (str && size == -1) ? int(strlen(str)) : size);
- }
- static inline QString fromLatin1(const QByteArray &str)
- { return str.isNull() ? QString() : fromLatin1(str.data(), qstrnlen(str.constData(), str.size())); }
- static inline QString fromUtf8(const QByteArray &str)
- { return str.isNull() ? QString() : fromUtf8(str.data(), qstrnlen(str.constData(), str.size())); }
- static inline QString fromLocal8Bit(const QByteArray &str)
- { return str.isNull() ? QString() : fromLocal8Bit(str.data(), qstrnlen(str.constData(), str.size())); }
- static QString fromUtf16(const ushort *, int size = -1);
- static QString fromUcs4(const uint *, int size = -1);
- static QString fromRawData(const QChar *, int size);
-
-#if defined(Q_COMPILER_UNICODE_STRINGS)
- static QString fromUtf16(const char16_t *str, int size = -1)
- { return fromUtf16(reinterpret_cast<const ushort *>(str), size); }
- static QString fromUcs4(const char32_t *str, int size = -1)
- { return fromUcs4(reinterpret_cast<const uint *>(str), size); }
-#endif
-
-#if QT_DEPRECATED_SINCE(5, 0)
- QT_DEPRECATED static inline QString fromAscii(const char *str, int size = -1)
- { return fromLatin1(str, size); }
- QT_DEPRECATED static inline QString fromAscii(const QByteArray &str)
- { return fromLatin1(str); }
- Q_REQUIRED_RESULT QByteArray toAscii() const
- { return toLatin1(); }
-#endif
-
- inline int toWCharArray(wchar_t *array) const;
- Q_REQUIRED_RESULT static inline QString fromWCharArray(const wchar_t *string, int size = -1);
-
- QString &setRawData(const QChar *unicode, int size);
- QString &setUnicode(const QChar *unicode, int size);
- inline QString &setUtf16(const ushort *utf16, int size);
-
-#if QT_STRINGVIEW_LEVEL < 2
- int compare(const QString &s, Qt::CaseSensitivity cs = Qt::CaseSensitive) const Q_DECL_NOTHROW;
- inline int compare(const QStringRef &s, Qt::CaseSensitivity cs = Qt::CaseSensitive) const Q_DECL_NOTHROW;
-#endif
- int compare(QLatin1String other, Qt::CaseSensitivity cs = Qt::CaseSensitive) const Q_DECL_NOTHROW;
- inline int compare(QStringView s, Qt::CaseSensitivity cs = Qt::CaseSensitive) const Q_DECL_NOTHROW;
-
- static inline int compare(const QString &s1, const QString &s2,
- Qt::CaseSensitivity cs = Qt::CaseSensitive) Q_DECL_NOTHROW
- { return s1.compare(s2, cs); }
-
- static inline int compare(const QString &s1, QLatin1String s2,
- Qt::CaseSensitivity cs = Qt::CaseSensitive) Q_DECL_NOTHROW
- { return s1.compare(s2, cs); }
- static inline int compare(QLatin1String s1, const QString &s2,
- Qt::CaseSensitivity cs = Qt::CaseSensitive) Q_DECL_NOTHROW
- { return -s2.compare(s1, cs); }
-
- static int compare(const QString &s1, const QStringRef &s2,
- Qt::CaseSensitivity = Qt::CaseSensitive) Q_DECL_NOTHROW;
-
- int localeAwareCompare(const QString& s) const;
- static int localeAwareCompare(const QString& s1, const QString& s2)
- { return s1.localeAwareCompare(s2); }
-
- int localeAwareCompare(const QStringRef &s) const;
- static int localeAwareCompare(const QString& s1, const QStringRef& s2);
-
- // ### Qt6: make inline except for the long long versions
- short toShort(bool *ok=nullptr, int base=10) const;
- ushort toUShort(bool *ok=nullptr, int base=10) const;
- int toInt(bool *ok=nullptr, int base=10) const;
- uint toUInt(bool *ok=nullptr, int base=10) const;
- long toLong(bool *ok=nullptr, int base=10) const;
- ulong toULong(bool *ok=nullptr, int base=10) const;
- qlonglong toLongLong(bool *ok=nullptr, int base=10) const;
- qulonglong toULongLong(bool *ok=nullptr, int base=10) const;
- float toFloat(bool *ok=nullptr) const;
- double toDouble(bool *ok=nullptr) const;
-
- QString &setNum(short, int base=10);
- QString &setNum(ushort, int base=10);
- QString &setNum(int, int base=10);
- QString &setNum(uint, int base=10);
- QString &setNum(long, int base=10);
- QString &setNum(ulong, int base=10);
- QString &setNum(qlonglong, int base=10);
- QString &setNum(qulonglong, int base=10);
- QString &setNum(float, char f='g', int prec=6);
- QString &setNum(double, char f='g', int prec=6);
-
- static QString number(int, int base=10);
- static QString number(uint, int base=10);
- static QString number(long, int base=10);
- static QString number(ulong, int base=10);
- static QString number(qlonglong, int base=10);
- static QString number(qulonglong, int base=10);
- static QString number(double, char f='g', int prec=6);
-
- friend Q_CORE_EXPORT bool operator==(const QString &s1, const QString &s2) Q_DECL_NOTHROW;
- friend Q_CORE_EXPORT bool operator<(const QString &s1, const QString &s2) Q_DECL_NOTHROW;
- friend inline bool operator>(const QString &s1, const QString &s2) Q_DECL_NOTHROW { return s2 < s1; }
- friend inline bool operator!=(const QString &s1, const QString &s2) Q_DECL_NOTHROW { return !(s1 == s2); }
- friend inline bool operator<=(const QString &s1, const QString &s2) Q_DECL_NOTHROW { return !(s1 > s2); }
- friend inline bool operator>=(const QString &s1, const QString &s2) Q_DECL_NOTHROW { return !(s1 < s2); }
-
- bool operator==(QLatin1String s) const Q_DECL_NOTHROW;
- bool operator<(QLatin1String s) const Q_DECL_NOTHROW;
- bool operator>(QLatin1String s) const Q_DECL_NOTHROW;
- inline bool operator!=(QLatin1String s) const Q_DECL_NOTHROW { return !operator==(s); }
- inline bool operator<=(QLatin1String s) const Q_DECL_NOTHROW { return !operator>(s); }
- inline bool operator>=(QLatin1String s) const Q_DECL_NOTHROW { return !operator<(s); }
-
- // ASCII compatibility
-#if defined(QT_RESTRICTED_CAST_FROM_ASCII)
- template <int N>
- inline QString(const char (&ch)[N])
- : d(fromAscii_helper(ch, N - 1))
- {}
- template <int N>
- QString(char (&)[N]) = delete;
- template <int N>
- inline QString &operator=(const char (&ch)[N])
- { return (*this = fromUtf8(ch, N - 1)); }
- template <int N>
- QString &operator=(char (&)[N]) = delete;
-#endif
-#if !defined(QT_NO_CAST_FROM_ASCII) && !defined(QT_RESTRICTED_CAST_FROM_ASCII)
- inline QT_ASCII_CAST_WARN QString(const char *ch)
- : d(fromAscii_helper(ch, ch ? int(strlen(ch)) : -1))
- {}
- inline QT_ASCII_CAST_WARN QString(const QByteArray &a)
- : d(fromAscii_helper(a.constData(), qstrnlen(a.constData(), a.size())))
- {}
- inline QT_ASCII_CAST_WARN QString &operator=(const char *ch)
- { return (*this = fromUtf8(ch)); }
- inline QT_ASCII_CAST_WARN QString &operator=(const QByteArray &a)
- { return (*this = fromUtf8(a)); }
- inline QT_ASCII_CAST_WARN QString &operator=(char c)
- { return (*this = QChar::fromLatin1(c)); }
-
- // these are needed, so it compiles with STL support enabled
- inline QT_ASCII_CAST_WARN QString &prepend(const char *s)
- { return prepend(QString::fromUtf8(s)); }
- inline QT_ASCII_CAST_WARN QString &prepend(const QByteArray &s)
- { return prepend(QString::fromUtf8(s)); }
- inline QT_ASCII_CAST_WARN QString &append(const char *s)
- { return append(QString::fromUtf8(s)); }
- inline QT_ASCII_CAST_WARN QString &append(const QByteArray &s)
- { return append(QString::fromUtf8(s)); }
- inline QT_ASCII_CAST_WARN QString &insert(int i, const char *s)
- { return insert(i, QString::fromUtf8(s)); }
- inline QT_ASCII_CAST_WARN QString &insert(int i, const QByteArray &s)
- { return insert(i, QString::fromUtf8(s)); }
- inline QT_ASCII_CAST_WARN QString &operator+=(const char *s)
- { return append(QString::fromUtf8(s)); }
- inline QT_ASCII_CAST_WARN QString &operator+=(const QByteArray &s)
- { return append(QString::fromUtf8(s)); }
- inline QT_ASCII_CAST_WARN QString &operator+=(char c)
- { return append(QChar::fromLatin1(c)); }
-
- inline QT_ASCII_CAST_WARN bool operator==(const char *s) const;
- inline QT_ASCII_CAST_WARN bool operator!=(const char *s) const;
- inline QT_ASCII_CAST_WARN bool operator<(const char *s) const;
- inline QT_ASCII_CAST_WARN bool operator<=(const char *s) const;
- inline QT_ASCII_CAST_WARN bool operator>(const char *s) const;
- inline QT_ASCII_CAST_WARN bool operator>=(const char *s) const;
-
- inline QT_ASCII_CAST_WARN bool operator==(const QByteArray &s) const;
- inline QT_ASCII_CAST_WARN bool operator!=(const QByteArray &s) const;
- inline QT_ASCII_CAST_WARN bool operator<(const QByteArray &s) const;
- inline QT_ASCII_CAST_WARN bool operator>(const QByteArray &s) const;
- inline QT_ASCII_CAST_WARN bool operator<=(const QByteArray &s) const;
- inline QT_ASCII_CAST_WARN bool operator>=(const QByteArray &s) const;
-
- friend inline QT_ASCII_CAST_WARN bool operator==(const char *s1, const QString &s2);
- friend inline QT_ASCII_CAST_WARN bool operator!=(const char *s1, const QString &s2);
- friend inline QT_ASCII_CAST_WARN bool operator<(const char *s1, const QString &s2);
- friend inline QT_ASCII_CAST_WARN bool operator>(const char *s1, const QString &s2);
- friend inline QT_ASCII_CAST_WARN bool operator<=(const char *s1, const QString &s2);
- friend inline QT_ASCII_CAST_WARN bool operator>=(const char *s1, const QString &s2);
-
- friend inline QT_ASCII_CAST_WARN bool operator==(const char *s1, const QStringRef &s2);
- friend inline QT_ASCII_CAST_WARN bool operator!=(const char *s1, const QStringRef &s2);
- friend inline QT_ASCII_CAST_WARN bool operator<(const char *s1, const QStringRef &s2);
- friend inline QT_ASCII_CAST_WARN bool operator>(const char *s1, const QStringRef &s2);
- friend inline QT_ASCII_CAST_WARN bool operator<=(const char *s1, const QStringRef &s2);
- friend inline QT_ASCII_CAST_WARN bool operator>=(const char *s1, const QStringRef &s2);
-#endif
-
- typedef QChar *iterator;
- typedef const QChar *const_iterator;
- typedef iterator Iterator;
- typedef const_iterator ConstIterator;
- typedef std::reverse_iterator<iterator> reverse_iterator;
- typedef std::reverse_iterator<const_iterator> const_reverse_iterator;
- inline iterator begin();
- inline const_iterator begin() const;
- inline const_iterator cbegin() const;
- inline const_iterator constBegin() const;
- inline iterator end();
- inline const_iterator end() const;
- inline const_iterator cend() const;
- inline const_iterator constEnd() const;
- reverse_iterator rbegin() { return reverse_iterator(end()); }
- reverse_iterator rend() { return reverse_iterator(begin()); }
- const_reverse_iterator rbegin() const { return const_reverse_iterator(end()); }
- const_reverse_iterator rend() const { return const_reverse_iterator(begin()); }
- const_reverse_iterator crbegin() const { return const_reverse_iterator(end()); }
- const_reverse_iterator crend() const { return const_reverse_iterator(begin()); }
-
- // STL compatibility
- typedef int size_type;
- typedef qptrdiff difference_type;
- typedef const QChar & const_reference;
- typedef QChar & reference;
- typedef QChar *pointer;
- typedef const QChar *const_pointer;
- typedef QChar value_type;
- inline void push_back(QChar c) { append(c); }
- inline void push_back(const QString &s) { append(s); }
- inline void push_front(QChar c) { prepend(c); }
- inline void push_front(const QString &s) { prepend(s); }
- void shrink_to_fit() { squeeze(); }
-
- static inline QString fromStdString(const std::string &s);
- inline std::string toStdString() const;
- static inline QString fromStdWString(const std::wstring &s);
- inline std::wstring toStdWString() const;
-
-#if defined(Q_STDLIB_UNICODE_STRINGS) || defined(Q_QDOC)
- static inline QString fromStdU16String(const std::u16string &s);
- inline std::u16string toStdU16String() const;
- static inline QString fromStdU32String(const std::u32string &s);
- inline std::u32string toStdU32String() const;
-#endif
-
-#if defined(Q_OS_DARWIN) || defined(Q_QDOC)
- static QString fromCFString(CFStringRef string);
- CFStringRef toCFString() const Q_DECL_CF_RETURNS_RETAINED;
- static QString fromNSString(const NSString *string);
- NSString *toNSString() const Q_DECL_NS_RETURNS_AUTORELEASED;
-#endif
- // compatibility
-#if QT_DEPRECATED_SINCE(5, 9)
- struct Null { };
- QT_DEPRECATED_X("use QString()")
- static const Null null;
- inline QString(const Null &): d(Data::sharedNull()) {}
- inline QString &operator=(const Null &) { *this = QString(); return *this; }
-#endif
- inline bool isNull() const { return d == Data::sharedNull(); }
-
-
- bool isSimpleText() const;
- bool isRightToLeft() const;
-
- QString(int size, Qt::Initialization);
- Q_DECL_CONSTEXPR inline QString(QStringDataPtr dd) : d(dd.ptr) {}
-
-private:
-#if defined(QT_NO_CAST_FROM_ASCII)
- QString &operator+=(const char *s);
- QString &operator+=(const QByteArray &s);
- QString(const char *ch);
- QString(const QByteArray &a);
- QString &operator=(const char *ch);
- QString &operator=(const QByteArray &a);
-#endif
-
- Data *d;
-
- friend inline bool operator==(QChar, const QString &) Q_DECL_NOTHROW;
- friend inline bool operator< (QChar, const QString &) Q_DECL_NOTHROW;
- friend inline bool operator> (QChar, const QString &) Q_DECL_NOTHROW;
- friend inline bool operator==(QChar, const QStringRef &) Q_DECL_NOTHROW;
- friend inline bool operator< (QChar, const QStringRef &) Q_DECL_NOTHROW;
- friend inline bool operator> (QChar, const QStringRef &) Q_DECL_NOTHROW;
- friend inline bool operator==(QChar, QLatin1String) Q_DECL_NOTHROW;
- friend inline bool operator< (QChar, QLatin1String) Q_DECL_NOTHROW;
- friend inline bool operator> (QChar, QLatin1String) Q_DECL_NOTHROW;
-
- void reallocData(uint alloc, bool grow = false);
-#if QT_VERSION < QT_VERSION_CHECK(6, 0, 0)
- void expand(int i);
-#endif
- QString multiArg(int numArgs, const QString **args) const;
- static int compare_helper(const QChar *data1, int length1,
- const QChar *data2, int length2,
- Qt::CaseSensitivity cs = Qt::CaseSensitive) Q_DECL_NOTHROW;
- static int compare_helper(const QChar *data1, int length1,
- const char *data2, int length2,
- Qt::CaseSensitivity cs = Qt::CaseSensitive);
- static int compare_helper(const QChar *data1, int length1,
- QLatin1String s2,
- Qt::CaseSensitivity cs = Qt::CaseSensitive) Q_DECL_NOTHROW;
- static int localeAwareCompare_helper(const QChar *data1, int length1,
- const QChar *data2, int length2);
- static QString toLower_helper(const QString &str);
- static QString toLower_helper(QString &str);
- static QString toUpper_helper(const QString &str);
- static QString toUpper_helper(QString &str);
- static QString toCaseFolded_helper(const QString &str);
- static QString toCaseFolded_helper(QString &str);
- static QString trimmed_helper(const QString &str);
- static QString trimmed_helper(QString &str);
- static QString simplified_helper(const QString &str);
- static QString simplified_helper(QString &str);
- static Data *fromLatin1_helper(const char *str, int size = -1);
- static Data *fromAscii_helper(const char *str, int size = -1);
- static QString fromUtf8_helper(const char *str, int size);
- static QString fromLocal8Bit_helper(const char *, int size);
- static QByteArray toLatin1_helper(const QString &);
- static QByteArray toLatin1_helper_inplace(QString &);
- static QByteArray toUtf8_helper(const QString &);
- static QByteArray toLocal8Bit_helper(const QChar *data, int size);
- static int toUcs4_helper(const ushort *uc, int length, uint *out);
- static qlonglong toIntegral_helper(const QChar *data, int len, bool *ok, int base);
- static qulonglong toIntegral_helper(const QChar *data, uint len, bool *ok, int base);
- void replace_helper(uint *indices, int nIndices, int blen, const QChar *after, int alen);
- friend class QCharRef;
- friend class QTextCodec;
- friend class QStringRef;
- friend class QStringView;
- friend class QByteArray;
- friend class QCollator;
- friend struct QAbstractConcatenable;
-
- template <typename T> static
- T toIntegral_helper(const QChar *data, int len, bool *ok, int base)
- {
- using Int64 = typename std::conditional<std::is_unsigned<T>::value, qulonglong, qlonglong>::type;
- using Int32 = typename std::conditional<std::is_unsigned<T>::value, uint, int>::type;
-
- // we select the right overload by casting size() to int or uint
- Int64 val = toIntegral_helper(data, Int32(len), ok, base);
- if (T(val) != val) {
- if (ok)
- *ok = false;
- val = 0;
- }
- return T(val);
- }
-
-public:
- typedef Data * DataPtr;
- inline DataPtr &data_ptr() { return d; }
-};
-
-//
-// QStringView inline members that require QString:
-//
-QString QStringView::toString() const
-{ return Q_ASSERT(size() == length()), QString(data(), length()); }
-
-//
-// QString inline members
-//
-inline QString::QString(QLatin1String aLatin1) : d(fromLatin1_helper(aLatin1.latin1(), aLatin1.size()))
-{ }
-inline int QString::length() const
-{ return d->size; }
-inline const QChar QString::at(int i) const
-{ Q_ASSERT(uint(i) < uint(size())); return d->data()[i]; }
-inline const QChar QString::operator[](int i) const
-{ Q_ASSERT(uint(i) < uint(size())); return d->data()[i]; }
-inline const QChar QString::operator[](uint i) const
-{ Q_ASSERT(i < uint(size())); return d->data()[i]; }
-inline bool QString::isEmpty() const
-{ return d->size == 0; }
-inline const QChar *QString::unicode() const
-{ return reinterpret_cast<const QChar*>(d->data()); }
-inline const QChar *QString::data() const
-{ return reinterpret_cast<const QChar*>(d->data()); }
-inline QChar *QString::data()
-{ detach(); return reinterpret_cast<QChar*>(d->data()); }
-inline const QChar *QString::constData() const
-{ return reinterpret_cast<const QChar*>(d->data()); }
-inline void QString::detach()
-{ if (d->ref.isShared() || (d->offset != sizeof(QStringData))) reallocData(uint(d->size) + 1u); }
-inline bool QString::isDetached() const
-{ return !d->ref.isShared(); }
-inline void QString::clear()
-{ if (!isNull()) *this = QString(); }
-inline QString::QString(const QString &other) Q_DECL_NOTHROW : d(other.d)
-{ Q_ASSERT(&other != this); d->ref.ref(); }
-inline int QString::capacity() const
-{ return d->alloc ? d->alloc - 1 : 0; }
-inline QString &QString::setNum(short n, int base)
-{ return setNum(qlonglong(n), base); }
-inline QString &QString::setNum(ushort n, int base)
-{ return setNum(qulonglong(n), base); }
-inline QString &QString::setNum(int n, int base)
-{ return setNum(qlonglong(n), base); }
-inline QString &QString::setNum(uint n, int base)
-{ return setNum(qulonglong(n), base); }
-inline QString &QString::setNum(long n, int base)
-{ return setNum(qlonglong(n), base); }
-inline QString &QString::setNum(ulong n, int base)
-{ return setNum(qulonglong(n), base); }
-inline QString &QString::setNum(float n, char f, int prec)
-{ return setNum(double(n),f,prec); }
-inline QString QString::arg(int a, int fieldWidth, int base, QChar fillChar) const
-{ return arg(qlonglong(a), fieldWidth, base, fillChar); }
-inline QString QString::arg(uint a, int fieldWidth, int base, QChar fillChar) const
-{ return arg(qulonglong(a), fieldWidth, base, fillChar); }
-inline QString QString::arg(long a, int fieldWidth, int base, QChar fillChar) const
-{ return arg(qlonglong(a), fieldWidth, base, fillChar); }
-inline QString QString::arg(ulong a, int fieldWidth, int base, QChar fillChar) const
-{ return arg(qulonglong(a), fieldWidth, base, fillChar); }
-inline QString QString::arg(short a, int fieldWidth, int base, QChar fillChar) const
-{ return arg(qlonglong(a), fieldWidth, base, fillChar); }
-inline QString QString::arg(ushort a, int fieldWidth, int base, QChar fillChar) const
-{ return arg(qulonglong(a), fieldWidth, base, fillChar); }
-inline QString QString::arg(const QString &a1, const QString &a2) const
-{ const QString *args[2] = { &a1, &a2 }; return multiArg(2, args); }
-inline QString QString::arg(const QString &a1, const QString &a2, const QString &a3) const
-{ const QString *args[3] = { &a1, &a2, &a3 }; return multiArg(3, args); }
-inline QString QString::arg(const QString &a1, const QString &a2, const QString &a3,
- const QString &a4) const
-{ const QString *args[4] = { &a1, &a2, &a3, &a4 }; return multiArg(4, args); }
-inline QString QString::arg(const QString &a1, const QString &a2, const QString &a3,
- const QString &a4, const QString &a5) const
-{ const QString *args[5] = { &a1, &a2, &a3, &a4, &a5 }; return multiArg(5, args); }
-inline QString QString::arg(const QString &a1, const QString &a2, const QString &a3,
- const QString &a4, const QString &a5, const QString &a6) const
-{ const QString *args[6] = { &a1, &a2, &a3, &a4, &a5, &a6 }; return multiArg(6, args); }
-inline QString QString::arg(const QString &a1, const QString &a2, const QString &a3,
- const QString &a4, const QString &a5, const QString &a6,
- const QString &a7) const
-{ const QString *args[7] = { &a1, &a2, &a3, &a4, &a5, &a6, &a7 }; return multiArg(7, args); }
-inline QString QString::arg(const QString &a1, const QString &a2, const QString &a3,
- const QString &a4, const QString &a5, const QString &a6,
- const QString &a7, const QString &a8) const
-{ const QString *args[8] = { &a1, &a2, &a3, &a4, &a5, &a6, &a7, &a8 }; return multiArg(8, args); }
-inline QString QString::arg(const QString &a1, const QString &a2, const QString &a3,
- const QString &a4, const QString &a5, const QString &a6,
- const QString &a7, const QString &a8, const QString &a9) const
-{ const QString *args[9] = { &a1, &a2, &a3, &a4, &a5, &a6, &a7, &a8, &a9 }; return multiArg(9, args); }
-
-inline QString QString::section(QChar asep, int astart, int aend, SectionFlags aflags) const
-{ return section(QString(asep), astart, aend, aflags); }
-
-QT_WARNING_PUSH
-QT_WARNING_DISABLE_MSVC(4127) // "conditional expression is constant"
-QT_WARNING_DISABLE_INTEL(111) // "statement is unreachable"
-
-inline int QString::toWCharArray(wchar_t *array) const
-{
- if (sizeof(wchar_t) == sizeof(QChar)) {
- memcpy(array, d->data(), sizeof(QChar) * size());
- return size();
- } else {
- return toUcs4_helper(d->data(), size(), reinterpret_cast<uint *>(array));
- }
-}
-
-QT_WARNING_POP
-
-inline QString QString::fromWCharArray(const wchar_t *string, int size)
-{
- return sizeof(wchar_t) == sizeof(QChar) ? fromUtf16(reinterpret_cast<const ushort *>(string), size)
- : fromUcs4(reinterpret_cast<const uint *>(string), size);
-}
-
-
-class Q_CORE_EXPORT QCharRef {
- QString &s;
- int i;
- inline QCharRef(QString &str, int idx)
- : s(str),i(idx) {}
- friend class QString;
-public:
-
- // most QChar operations repeated here
-
- // all this is not documented: We just say "like QChar" and let it be.
- inline operator QChar() const
- { return i < s.d->size ? s.d->data()[i] : 0; }
- inline QCharRef &operator=(QChar c)
- { if (i >= s.d->size) s.resize(i + 1, QLatin1Char(' ')); else s.detach();
- s.d->data()[i] = c.unicode(); return *this; }
-
- // An operator= for each QChar cast constructors
-#ifndef QT_NO_CAST_FROM_ASCII
- inline QT_ASCII_CAST_WARN QCharRef &operator=(char c)
- { return operator=(QChar::fromLatin1(c)); }
- inline QT_ASCII_CAST_WARN QCharRef &operator=(uchar c)
- { return operator=(QChar::fromLatin1(c)); }
-#endif
- inline QCharRef &operator=(const QCharRef &c) { return operator=(QChar(c)); }
- inline QCharRef &operator=(ushort rc) { return operator=(QChar(rc)); }
- inline QCharRef &operator=(short rc) { return operator=(QChar(rc)); }
- inline QCharRef &operator=(uint rc) { return operator=(QChar(rc)); }
- inline QCharRef &operator=(int rc) { return operator=(QChar(rc)); }
-
- // each function...
- inline bool isNull() const { return QChar(*this).isNull(); }
- inline bool isPrint() const { return QChar(*this).isPrint(); }
- inline bool isPunct() const { return QChar(*this).isPunct(); }
- inline bool isSpace() const { return QChar(*this).isSpace(); }
- inline bool isMark() const { return QChar(*this).isMark(); }
- inline bool isLetter() const { return QChar(*this).isLetter(); }
- inline bool isNumber() const { return QChar(*this).isNumber(); }
- inline bool isLetterOrNumber() { return QChar(*this).isLetterOrNumber(); }
- inline bool isDigit() const { return QChar(*this).isDigit(); }
- inline bool isLower() const { return QChar(*this).isLower(); }
- inline bool isUpper() const { return QChar(*this).isUpper(); }
- inline bool isTitleCase() const { return QChar(*this).isTitleCase(); }
-
- inline int digitValue() const { return QChar(*this).digitValue(); }
- QChar toLower() const { return QChar(*this).toLower(); }
- QChar toUpper() const { return QChar(*this).toUpper(); }
- QChar toTitleCase () const { return QChar(*this).toTitleCase(); }
-
- QChar::Category category() const { return QChar(*this).category(); }
- QChar::Direction direction() const { return QChar(*this).direction(); }
- QChar::JoiningType joiningType() const { return QChar(*this).joiningType(); }
-#if QT_DEPRECATED_SINCE(5, 3)
- QT_DEPRECATED QChar::Joining joining() const
- {
- switch (QChar(*this).joiningType()) {
- case QChar::Joining_Causing: return QChar::Center;
- case QChar::Joining_Dual: return QChar::Dual;
- case QChar::Joining_Right: return QChar::Right;
- case QChar::Joining_None:
- case QChar::Joining_Left:
- case QChar::Joining_Transparent:
- default: return QChar::OtherJoining;
- }
- }
-#endif
- bool hasMirrored() const { return QChar(*this).hasMirrored(); }
- QChar mirroredChar() const { return QChar(*this).mirroredChar(); }
- QString decomposition() const { return QChar(*this).decomposition(); }
- QChar::Decomposition decompositionTag() const { return QChar(*this).decompositionTag(); }
- uchar combiningClass() const { return QChar(*this).combiningClass(); }
-
- inline QChar::Script script() const { return QChar(*this).script(); }
-
- QChar::UnicodeVersion unicodeVersion() const { return QChar(*this).unicodeVersion(); }
-
- inline uchar cell() const { return QChar(*this).cell(); }
- inline uchar row() const { return QChar(*this).row(); }
- inline void setCell(uchar cell);
- inline void setRow(uchar row);
-
-#if QT_DEPRECATED_SINCE(5, 0)
- QT_DEPRECATED char toAscii() const { return QChar(*this).toLatin1(); }
-#endif
- char toLatin1() const { return QChar(*this).toLatin1(); }
- ushort unicode() const { return QChar(*this).unicode(); }
- ushort& unicode() { return s.data()[i].unicode(); }
-
-};
-Q_DECLARE_TYPEINFO(QCharRef, Q_MOVABLE_TYPE);
-
-inline void QCharRef::setRow(uchar arow) { QChar(*this).setRow(arow); }
-inline void QCharRef::setCell(uchar acell) { QChar(*this).setCell(acell); }
-
-
-inline QString::QString() Q_DECL_NOTHROW : d(Data::sharedNull()) {}
-inline QString::~QString() { if (!d->ref.deref()) Data::deallocate(d); }
-
-inline void QString::reserve(int asize)
-{
- if (d->ref.isShared() || uint(asize) >= d->alloc)
- reallocData(qMax(asize, d->size) + 1u);
-
- if (!d->capacityReserved) {
- // cannot set unconditionally, since d could be the shared_null/shared_empty (which is const)
- d->capacityReserved = true;
- }
-}
-
-inline void QString::squeeze()
-{
- if (d->ref.isShared() || uint(d->size) + 1u < d->alloc)
- reallocData(uint(d->size) + 1u);
-
- if (d->capacityReserved) {
- // cannot set unconditionally, since d could be shared_null or
- // otherwise static.
- d->capacityReserved = false;
- }
-}
-
-inline QString &QString::setUtf16(const ushort *autf16, int asize)
-{ return setUnicode(reinterpret_cast<const QChar *>(autf16), asize); }
-inline QCharRef QString::operator[](int i)
-{ Q_ASSERT(i >= 0); return QCharRef(*this, i); }
-inline QCharRef QString::operator[](uint i)
-{ return QCharRef(*this, i); }
-inline QCharRef QString::front() { return operator[](0); }
-inline QCharRef QString::back() { return operator[](size() - 1); }
-inline QString::iterator QString::begin()
-{ detach(); return reinterpret_cast<QChar*>(d->data()); }
-inline QString::const_iterator QString::begin() const
-{ return reinterpret_cast<const QChar*>(d->data()); }
-inline QString::const_iterator QString::cbegin() const
-{ return reinterpret_cast<const QChar*>(d->data()); }
-inline QString::const_iterator QString::constBegin() const
-{ return reinterpret_cast<const QChar*>(d->data()); }
-inline QString::iterator QString::end()
-{ detach(); return reinterpret_cast<QChar*>(d->data() + d->size); }
-inline QString::const_iterator QString::end() const
-{ return reinterpret_cast<const QChar*>(d->data() + d->size); }
-inline QString::const_iterator QString::cend() const
-{ return reinterpret_cast<const QChar*>(d->data() + d->size); }
-inline QString::const_iterator QString::constEnd() const
-{ return reinterpret_cast<const QChar*>(d->data() + d->size); }
-inline bool QString::contains(const QString &s, Qt::CaseSensitivity cs) const
-{ return indexOf(s, 0, cs) != -1; }
-inline bool QString::contains(const QStringRef &s, Qt::CaseSensitivity cs) const
-{ return indexOf(s, 0, cs) != -1; }
-inline bool QString::contains(QLatin1String s, Qt::CaseSensitivity cs) const
-{ return indexOf(s, 0, cs) != -1; }
-inline bool QString::contains(QChar c, Qt::CaseSensitivity cs) const
-{ return indexOf(c, 0, cs) != -1; }
-
-#if QT_DEPRECATED_SINCE(5, 9)
-inline bool operator==(QString::Null, QString::Null) { return true; }
-QT_DEPRECATED_X("use QString::isNull()")
-inline bool operator==(QString::Null, const QString &s) { return s.isNull(); }
-QT_DEPRECATED_X("use QString::isNull()")
-inline bool operator==(const QString &s, QString::Null) { return s.isNull(); }
-inline bool operator!=(QString::Null, QString::Null) { return false; }
-QT_DEPRECATED_X("use !QString::isNull()")
-inline bool operator!=(QString::Null, const QString &s) { return !s.isNull(); }
-QT_DEPRECATED_X("use !QString::isNull()")
-inline bool operator!=(const QString &s, QString::Null) { return !s.isNull(); }
-#endif
-
-inline bool operator==(QLatin1String s1, QLatin1String s2) Q_DECL_NOTHROW
-{ return s1.size() == s2.size() && (!s1.size() || !memcmp(s1.latin1(), s2.latin1(), s1.size())); }
-inline bool operator!=(QLatin1String s1, QLatin1String s2) Q_DECL_NOTHROW
-{ return !operator==(s1, s2); }
-inline bool operator<(QLatin1String s1, QLatin1String s2) Q_DECL_NOTHROW
-{
- const int len = qMin(s1.size(), s2.size());
- const int r = len ? memcmp(s1.latin1(), s2.latin1(), len) : 0;
- return r < 0 || (r == 0 && s1.size() < s2.size());
-}
-inline bool operator>(QLatin1String s1, QLatin1String s2) Q_DECL_NOTHROW
-{ return operator<(s2, s1); }
-inline bool operator<=(QLatin1String s1, QLatin1String s2) Q_DECL_NOTHROW
-{ return !operator>(s1, s2); }
-inline bool operator>=(QLatin1String s1, QLatin1String s2) Q_DECL_NOTHROW
-{ return !operator<(s1, s2); }
-
-inline bool QLatin1String::operator==(const QString &s) const Q_DECL_NOTHROW
-{ return s == *this; }
-inline bool QLatin1String::operator!=(const QString &s) const Q_DECL_NOTHROW
-{ return s != *this; }
-inline bool QLatin1String::operator>(const QString &s) const Q_DECL_NOTHROW
-{ return s < *this; }
-inline bool QLatin1String::operator<(const QString &s) const Q_DECL_NOTHROW
-{ return s > *this; }
-inline bool QLatin1String::operator>=(const QString &s) const Q_DECL_NOTHROW
-{ return s <= *this; }
-inline bool QLatin1String::operator<=(const QString &s) const Q_DECL_NOTHROW
-{ return s >= *this; }
-
-#if !defined(QT_NO_CAST_FROM_ASCII) && !defined(QT_RESTRICTED_CAST_FROM_ASCII)
-inline bool QString::operator==(const char *s) const
-{ return QString::compare_helper(constData(), size(), s, -1) == 0; }
-inline bool QString::operator!=(const char *s) const
-{ return QString::compare_helper(constData(), size(), s, -1) != 0; }
-inline bool QString::operator<(const char *s) const
-{ return QString::compare_helper(constData(), size(), s, -1) < 0; }
-inline bool QString::operator>(const char *s) const
-{ return QString::compare_helper(constData(), size(), s, -1) > 0; }
-inline bool QString::operator<=(const char *s) const
-{ return QString::compare_helper(constData(), size(), s, -1) <= 0; }
-inline bool QString::operator>=(const char *s) const
-{ return QString::compare_helper(constData(), size(), s, -1) >= 0; }
-
-inline QT_ASCII_CAST_WARN bool operator==(const char *s1, const QString &s2)
-{ return QString::compare_helper(s2.constData(), s2.size(), s1, -1) == 0; }
-inline QT_ASCII_CAST_WARN bool operator!=(const char *s1, const QString &s2)
-{ return QString::compare_helper(s2.constData(), s2.size(), s1, -1) != 0; }
-inline QT_ASCII_CAST_WARN bool operator<(const char *s1, const QString &s2)
-{ return QString::compare_helper(s2.constData(), s2.size(), s1, -1) > 0; }
-inline QT_ASCII_CAST_WARN bool operator>(const char *s1, const QString &s2)
-{ return QString::compare_helper(s2.constData(), s2.size(), s1, -1) < 0; }
-inline QT_ASCII_CAST_WARN bool operator<=(const char *s1, const QString &s2)
-{ return QString::compare_helper(s2.constData(), s2.size(), s1, -1) >= 0; }
-inline QT_ASCII_CAST_WARN bool operator>=(const char *s1, const QString &s2)
-{ return QString::compare_helper(s2.constData(), s2.size(), s1, -1) <= 0; }
-
-inline QT_ASCII_CAST_WARN bool operator==(const char *s1, QLatin1String s2)
-{ return QString::fromUtf8(s1) == s2; }
-inline QT_ASCII_CAST_WARN bool operator!=(const char *s1, QLatin1String s2)
-{ return QString::fromUtf8(s1) != s2; }
-inline QT_ASCII_CAST_WARN bool operator<(const char *s1, QLatin1String s2)
-{ return (QString::fromUtf8(s1) < s2); }
-inline QT_ASCII_CAST_WARN bool operator>(const char *s1, QLatin1String s2)
-{ return (QString::fromUtf8(s1) > s2); }
-inline QT_ASCII_CAST_WARN bool operator<=(const char *s1, QLatin1String s2)
-{ return (QString::fromUtf8(s1) <= s2); }
-inline QT_ASCII_CAST_WARN bool operator>=(const char *s1, QLatin1String s2)
-{ return (QString::fromUtf8(s1) >= s2); }
-
-inline QT_ASCII_CAST_WARN bool QLatin1String::operator==(const char *s) const
-{ return QString::fromUtf8(s) == *this; }
-inline QT_ASCII_CAST_WARN bool QLatin1String::operator!=(const char *s) const
-{ return QString::fromUtf8(s) != *this; }
-inline QT_ASCII_CAST_WARN bool QLatin1String::operator<(const char *s) const
-{ return QString::fromUtf8(s) > *this; }
-inline QT_ASCII_CAST_WARN bool QLatin1String::operator>(const char *s) const
-{ return QString::fromUtf8(s) < *this; }
-inline QT_ASCII_CAST_WARN bool QLatin1String::operator<=(const char *s) const
-{ return QString::fromUtf8(s) >= *this; }
-inline QT_ASCII_CAST_WARN bool QLatin1String::operator>=(const char *s) const
-{ return QString::fromUtf8(s) <= *this; }
-
-inline QT_ASCII_CAST_WARN bool QLatin1String::operator==(const QByteArray &s) const
-{ return QString::fromUtf8(s) == *this; }
-inline QT_ASCII_CAST_WARN bool QLatin1String::operator!=(const QByteArray &s) const
-{ return QString::fromUtf8(s) != *this; }
-inline QT_ASCII_CAST_WARN bool QLatin1String::operator<(const QByteArray &s) const
-{ return QString::fromUtf8(s) > *this; }
-inline QT_ASCII_CAST_WARN bool QLatin1String::operator>(const QByteArray &s) const
-{ return QString::fromUtf8(s) < *this; }
-inline QT_ASCII_CAST_WARN bool QLatin1String::operator<=(const QByteArray &s) const
-{ return QString::fromUtf8(s) >= *this; }
-inline QT_ASCII_CAST_WARN bool QLatin1String::operator>=(const QByteArray &s) const
-{ return QString::fromUtf8(s) <= *this; }
-
-inline QT_ASCII_CAST_WARN bool QString::operator==(const QByteArray &s) const
-{ return QString::compare_helper(constData(), size(), s.constData(), qstrnlen(s.constData(), s.size())) == 0; }
-inline QT_ASCII_CAST_WARN bool QString::operator!=(const QByteArray &s) const
-{ return QString::compare_helper(constData(), size(), s.constData(), qstrnlen(s.constData(), s.size())) != 0; }
-inline QT_ASCII_CAST_WARN bool QString::operator<(const QByteArray &s) const
-{ return QString::compare_helper(constData(), size(), s.constData(), s.size()) < 0; }
-inline QT_ASCII_CAST_WARN bool QString::operator>(const QByteArray &s) const
-{ return QString::compare_helper(constData(), size(), s.constData(), s.size()) > 0; }
-inline QT_ASCII_CAST_WARN bool QString::operator<=(const QByteArray &s) const
-{ return QString::compare_helper(constData(), size(), s.constData(), s.size()) <= 0; }
-inline QT_ASCII_CAST_WARN bool QString::operator>=(const QByteArray &s) const
-{ return QString::compare_helper(constData(), size(), s.constData(), s.size()) >= 0; }
-
-inline bool QByteArray::operator==(const QString &s) const
-{ return QString::compare_helper(s.constData(), s.size(), constData(), qstrnlen(constData(), size())) == 0; }
-inline bool QByteArray::operator!=(const QString &s) const
-{ return QString::compare_helper(s.constData(), s.size(), constData(), qstrnlen(constData(), size())) != 0; }
-inline bool QByteArray::operator<(const QString &s) const
-{ return QString::compare_helper(s.constData(), s.size(), constData(), size()) > 0; }
-inline bool QByteArray::operator>(const QString &s) const
-{ return QString::compare_helper(s.constData(), s.size(), constData(), size()) < 0; }
-inline bool QByteArray::operator<=(const QString &s) const
-{ return QString::compare_helper(s.constData(), s.size(), constData(), size()) >= 0; }
-inline bool QByteArray::operator>=(const QString &s) const
-{ return QString::compare_helper(s.constData(), s.size(), constData(), size()) <= 0; }
-#endif // !defined(QT_NO_CAST_FROM_ASCII) && !defined(QT_RESTRICTED_CAST_FROM_ASCII)
-
-#ifndef QT_NO_CAST_TO_ASCII
-inline QByteArray &QByteArray::append(const QString &s)
-{ return append(s.toUtf8()); }
-inline QByteArray &QByteArray::insert(int i, const QString &s)
-{ return insert(i, s.toUtf8()); }
-inline QByteArray &QByteArray::replace(char c, const QString &after)
-{ return replace(c, after.toUtf8()); }
-inline QByteArray &QByteArray::replace(const QString &before, const char *after)
-{ return replace(before.toUtf8(), after); }
-inline QByteArray &QByteArray::replace(const QString &before, const QByteArray &after)
-{ return replace(before.toUtf8(), after); }
-inline QByteArray &QByteArray::operator+=(const QString &s)
-{ return operator+=(s.toUtf8()); }
-inline int QByteArray::indexOf(const QString &s, int from) const
-{ return indexOf(s.toUtf8(), from); }
-inline int QByteArray::lastIndexOf(const QString &s, int from) const
-{ return lastIndexOf(s.toUtf8(), from); }
-#endif // QT_NO_CAST_TO_ASCII
-
-#if !defined(QT_USE_FAST_OPERATOR_PLUS) && !defined(QT_USE_QSTRINGBUILDER)
-inline const QString operator+(const QString &s1, const QString &s2)
-{ QString t(s1); t += s2; return t; }
-inline const QString operator+(const QString &s1, QChar s2)
-{ QString t(s1); t += s2; return t; }
-inline const QString operator+(QChar s1, const QString &s2)
-{ QString t(s1); t += s2; return t; }
-# if !defined(QT_NO_CAST_FROM_ASCII) && !defined(QT_RESTRICTED_CAST_FROM_ASCII)
-inline QT_ASCII_CAST_WARN const QString operator+(const QString &s1, const char *s2)
-{ QString t(s1); t += QString::fromUtf8(s2); return t; }
-inline QT_ASCII_CAST_WARN const QString operator+(const char *s1, const QString &s2)
-{ QString t = QString::fromUtf8(s1); t += s2; return t; }
-inline QT_ASCII_CAST_WARN const QString operator+(char c, const QString &s)
-{ QString t = s; t.prepend(QChar::fromLatin1(c)); return t; }
-inline QT_ASCII_CAST_WARN const QString operator+(const QString &s, char c)
-{ QString t = s; t += QChar::fromLatin1(c); return t; }
-inline QT_ASCII_CAST_WARN const QString operator+(const QByteArray &ba, const QString &s)
-{ QString t = QString::fromUtf8(ba); t += s; return t; }
-inline QT_ASCII_CAST_WARN const QString operator+(const QString &s, const QByteArray &ba)
-{ QString t(s); t += QString::fromUtf8(ba); return t; }
-# endif // QT_NO_CAST_FROM_ASCII
-#endif // QT_USE_QSTRINGBUILDER
-
-inline std::string QString::toStdString() const
-{ return toUtf8().toStdString(); }
-
-inline QString QString::fromStdString(const std::string &s)
-{ return fromUtf8(s.data(), int(s.size())); }
-
-inline std::wstring QString::toStdWString() const
-{
- std::wstring str;
- str.resize(length());
-
-#ifdef Q_CC_MSVC
- // VS2005 crashes if the string is empty
- if (!length())
- return str;
-#endif
-
- str.resize(toWCharArray(&(*str.begin())));
- return str;
-}
-
-inline QString QString::fromStdWString(const std::wstring &s)
-{ return fromWCharArray(s.data(), int(s.size())); }
-
-#if defined(Q_STDLIB_UNICODE_STRINGS)
-inline QString QString::fromStdU16String(const std::u16string &s)
-{ return fromUtf16(s.data(), int(s.size())); }
-
-inline std::u16string QString::toStdU16String() const
-{ return std::u16string(reinterpret_cast<const char16_t*>(utf16()), length()); }
-
-inline QString QString::fromStdU32String(const std::u32string &s)
-{ return fromUcs4(s.data(), int(s.size())); }
-
-inline std::u32string QString::toStdU32String() const
-{
- std::u32string u32str(length(), char32_t(0));
- int len = toUcs4_helper(d->data(), length(), reinterpret_cast<uint*>(&u32str[0]));
- u32str.resize(len);
- return u32str;
-}
-#endif
-
-#if !defined(QT_NO_DATASTREAM) || (defined(QT_BOOTSTRAPPED) && !defined(QT_BUILD_QMAKE))
-Q_CORE_EXPORT QDataStream &operator<<(QDataStream &, const QString &);
-Q_CORE_EXPORT QDataStream &operator>>(QDataStream &, QString &);
-#endif
-
-Q_DECLARE_SHARED(QString)
-Q_DECLARE_OPERATORS_FOR_FLAGS(QString::SectionFlags)
-
-
-class Q_CORE_EXPORT QStringRef {
- const QString *m_string;
- int m_position;
- int m_size;
-public:
- typedef QString::size_type size_type;
- typedef QString::value_type value_type;
- typedef const QChar *const_iterator;
- typedef std::reverse_iterator<const_iterator> const_reverse_iterator;
- typedef QString::const_pointer const_pointer;
- typedef QString::const_reference const_reference;
-
- // ### Qt 6: make this constructor constexpr, after the destructor is made trivial
- inline QStringRef() : m_string(nullptr), m_position(0), m_size(0) {}
- inline QStringRef(const QString *string, int position, int size);
- inline QStringRef(const QString *string);
-
-#if QT_VERSION < QT_VERSION_CHECK(6,0,0)
- // ### Qt 6: remove all of these, the implicit ones are fine
- QStringRef(const QStringRef &other) Q_DECL_NOTHROW
- :m_string(other.m_string), m_position(other.m_position), m_size(other.m_size)
- {}
-#ifdef Q_COMPILER_RVALUE_REFS
- QStringRef(QStringRef &&other) Q_DECL_NOTHROW : m_string(other.m_string), m_position(other.m_position), m_size(other.m_size) {}
- QStringRef &operator=(QStringRef &&other) Q_DECL_NOTHROW { return *this = other; }
-#endif
- QStringRef &operator=(const QStringRef &other) Q_DECL_NOTHROW
- {
- m_string = other.m_string; m_position = other.m_position;
- m_size = other.m_size; return *this;
- }
- inline ~QStringRef(){}
-#endif // Qt < 6.0.0
-
- inline const QString *string() const { return m_string; }
- inline int position() const { return m_position; }
- inline int size() const { return m_size; }
- inline int count() const { return m_size; }
- inline int length() const { return m_size; }
-
- int indexOf(const QString &str, int from = 0, Qt::CaseSensitivity cs = Qt::CaseSensitive) const;
- int indexOf(QChar ch, int from = 0, Qt::CaseSensitivity cs = Qt::CaseSensitive) const;
- int indexOf(QLatin1String str, int from = 0, Qt::CaseSensitivity cs = Qt::CaseSensitive) const;
- int indexOf(const QStringRef &str, int from = 0, Qt::CaseSensitivity cs = Qt::CaseSensitive) const;
- int lastIndexOf(const QString &str, int from = -1, Qt::CaseSensitivity cs = Qt::CaseSensitive) const;
- int lastIndexOf(QChar ch, int from = -1, Qt::CaseSensitivity cs = Qt::CaseSensitive) const;
- int lastIndexOf(QLatin1String str, int from = -1, Qt::CaseSensitivity cs = Qt::CaseSensitive) const;
- int lastIndexOf(const QStringRef &str, int from = -1, Qt::CaseSensitivity cs = Qt::CaseSensitive) const;
-
- inline bool contains(const QString &str, Qt::CaseSensitivity cs = Qt::CaseSensitive) const;
- inline bool contains(QChar ch, Qt::CaseSensitivity cs = Qt::CaseSensitive) const;
- inline bool contains(QLatin1String str, Qt::CaseSensitivity cs = Qt::CaseSensitive) const;
- inline bool contains(const QStringRef &str, Qt::CaseSensitivity cs = Qt::CaseSensitive) const;
-
- int count(const QString &s, Qt::CaseSensitivity cs = Qt::CaseSensitive) const;
- int count(QChar c, Qt::CaseSensitivity cs = Qt::CaseSensitive) const;
- int count(const QStringRef &s, Qt::CaseSensitivity cs = Qt::CaseSensitive) const;
-
- Q_REQUIRED_RESULT QVector<QStringRef> split(const QString &sep, QString::SplitBehavior behavior = QString::KeepEmptyParts,
- Qt::CaseSensitivity cs = Qt::CaseSensitive) const;
- Q_REQUIRED_RESULT QVector<QStringRef> split(QChar sep, QString::SplitBehavior behavior = QString::KeepEmptyParts,
- Qt::CaseSensitivity cs = Qt::CaseSensitive) const;
-
- Q_REQUIRED_RESULT QStringRef left(int n) const;
- Q_REQUIRED_RESULT QStringRef right(int n) const;
- Q_REQUIRED_RESULT QStringRef mid(int pos, int n = -1) const;
- Q_REQUIRED_RESULT QStringRef chopped(int n) const
- { Q_ASSERT(n >= 0); Q_ASSERT(n <= size()); return left(size() - n); }
-
- void truncate(int pos) Q_DECL_NOTHROW { m_size = qBound(0, pos, m_size); }
- void chop(int n) Q_DECL_NOTHROW
- {
- if (n >= m_size)
- m_size = 0;
- else if (n > 0)
- m_size -= n;
- }
-
- bool isRightToLeft() const;
-
- Q_REQUIRED_RESULT bool startsWith(QStringView s, Qt::CaseSensitivity cs = Qt::CaseSensitive) const Q_DECL_NOTHROW
- { return QtPrivate::startsWith(*this, s, cs); }
- bool startsWith(QLatin1String s, Qt::CaseSensitivity cs = Qt::CaseSensitive) const;
- bool startsWith(QChar c, Qt::CaseSensitivity cs = Qt::CaseSensitive) const;
-#if QT_STRINGVIEW_LEVEL < 2
- bool startsWith(const QString &s, Qt::CaseSensitivity cs = Qt::CaseSensitive) const;
- bool startsWith(const QStringRef &c, Qt::CaseSensitivity cs = Qt::CaseSensitive) const;
-#endif
-
- Q_REQUIRED_RESULT bool endsWith(QStringView s, Qt::CaseSensitivity cs = Qt::CaseSensitive) const Q_DECL_NOTHROW
- { return QtPrivate::endsWith(*this, s, cs); }
- bool endsWith(QLatin1String s, Qt::CaseSensitivity cs = Qt::CaseSensitive) const;
- bool endsWith(QChar c, Qt::CaseSensitivity cs = Qt::CaseSensitive) const;
-#if QT_STRINGVIEW_LEVEL < 2
- bool endsWith(const QString &s, Qt::CaseSensitivity cs = Qt::CaseSensitive) const;
- bool endsWith(const QStringRef &c, Qt::CaseSensitivity cs = Qt::CaseSensitive) const;
-#endif
-
- inline QStringRef &operator=(const QString *string);
-
- inline const QChar *unicode() const
- {
- if (!m_string)
- return reinterpret_cast<const QChar *>(QString::Data::sharedNull()->data());
- return m_string->unicode() + m_position;
- }
- inline const QChar *data() const { return unicode(); }
- inline const QChar *constData() const { return unicode(); }
-
- inline const_iterator begin() const { return unicode(); }
- inline const_iterator cbegin() const { return unicode(); }
- inline const_iterator constBegin() const { return unicode(); }
- inline const_iterator end() const { return unicode() + size(); }
- inline const_iterator cend() const { return unicode() + size(); }
- inline const_iterator constEnd() const { return unicode() + size(); }
- inline const_reverse_iterator rbegin() const { return const_reverse_iterator(end()); }
- inline const_reverse_iterator crbegin() const { return rbegin(); }
- inline const_reverse_iterator rend() const { return const_reverse_iterator(begin()); }
- inline const_reverse_iterator crend() const { return rend(); }
-
-#if QT_DEPRECATED_SINCE(5, 0)
- Q_REQUIRED_RESULT QT_DEPRECATED QByteArray toAscii() const
- { return toLatin1(); }
-#endif
- Q_REQUIRED_RESULT QByteArray toLatin1() const;
- Q_REQUIRED_RESULT QByteArray toUtf8() const;
- Q_REQUIRED_RESULT QByteArray toLocal8Bit() const;
- Q_REQUIRED_RESULT QVector<uint> toUcs4() const;
-
- inline void clear() { m_string = nullptr; m_position = m_size = 0; }
- QString toString() const;
- inline bool isEmpty() const { return m_size == 0; }
- inline bool isNull() const { return m_string == nullptr || m_string->isNull(); }
-
- QStringRef appendTo(QString *string) const;
-
- inline const QChar at(int i) const
- { Q_ASSERT(uint(i) < uint(size())); return m_string->at(i + m_position); }
- QChar operator[](int i) const { return at(i); }
- Q_REQUIRED_RESULT QChar front() const { return at(0); }
- Q_REQUIRED_RESULT QChar back() const { return at(size() - 1); }
-
-#if !defined(QT_NO_CAST_FROM_ASCII) && !defined(QT_RESTRICTED_CAST_FROM_ASCII)
- // ASCII compatibility
- inline QT_ASCII_CAST_WARN bool operator==(const char *s) const;
- inline QT_ASCII_CAST_WARN bool operator!=(const char *s) const;
- inline QT_ASCII_CAST_WARN bool operator<(const char *s) const;
- inline QT_ASCII_CAST_WARN bool operator<=(const char *s) const;
- inline QT_ASCII_CAST_WARN bool operator>(const char *s) const;
- inline QT_ASCII_CAST_WARN bool operator>=(const char *s) const;
-#endif
-
- int compare(const QString &s, Qt::CaseSensitivity cs = Qt::CaseSensitive) const Q_DECL_NOTHROW;
- int compare(const QStringRef &s, Qt::CaseSensitivity cs = Qt::CaseSensitive) const Q_DECL_NOTHROW;
- int compare(QLatin1String s, Qt::CaseSensitivity cs = Qt::CaseSensitive) const Q_DECL_NOTHROW;
-#if !defined(QT_NO_CAST_FROM_ASCII) && !defined(QT_RESTRICTED_CAST_FROM_ASCII)
- int compare(const QByteArray &s, Qt::CaseSensitivity cs = Qt::CaseSensitive) const
- { return QString::compare_helper(unicode(), size(), s.data(), qstrnlen(s.data(), s.size()), cs); }
-#endif
- static int compare(const QStringRef &s1, const QString &s2,
- Qt::CaseSensitivity = Qt::CaseSensitive) Q_DECL_NOTHROW;
- static int compare(const QStringRef &s1, const QStringRef &s2,
- Qt::CaseSensitivity = Qt::CaseSensitive) Q_DECL_NOTHROW;
- static int compare(const QStringRef &s1, QLatin1String s2,
- Qt::CaseSensitivity cs = Qt::CaseSensitive) Q_DECL_NOTHROW;
-
- int localeAwareCompare(const QString &s) const;
- int localeAwareCompare(const QStringRef &s) const;
- static int localeAwareCompare(const QStringRef &s1, const QString &s2);
- static int localeAwareCompare(const QStringRef &s1, const QStringRef &s2);
-
- Q_REQUIRED_RESULT QStringRef trimmed() const;
- short toShort(bool *ok = nullptr, int base = 10) const;
- ushort toUShort(bool *ok = nullptr, int base = 10) const;
- int toInt(bool *ok = nullptr, int base = 10) const;
- uint toUInt(bool *ok = nullptr, int base = 10) const;
- long toLong(bool *ok = nullptr, int base = 10) const;
- ulong toULong(bool *ok = nullptr, int base = 10) const;
- qlonglong toLongLong(bool *ok = nullptr, int base = 10) const;
- qulonglong toULongLong(bool *ok = nullptr, int base = 10) const;
- float toFloat(bool *ok = nullptr) const;
- double toDouble(bool *ok = nullptr) const;
-};
-Q_DECLARE_TYPEINFO(QStringRef, Q_PRIMITIVE_TYPE);
-
-inline QStringRef &QStringRef::operator=(const QString *aString)
-{ m_string = aString; m_position = 0; m_size = aString?aString->size():0; return *this; }
-
-inline QStringRef::QStringRef(const QString *aString, int aPosition, int aSize)
- :m_string(aString), m_position(aPosition), m_size(aSize){}
-
-inline QStringRef::QStringRef(const QString *aString)
- :m_string(aString), m_position(0), m_size(aString?aString->size() : 0){}
-
-// QStringRef <> QStringRef
-Q_CORE_EXPORT bool operator==(const QStringRef &s1, const QStringRef &s2) Q_DECL_NOTHROW;
-inline bool operator!=(const QStringRef &s1, const QStringRef &s2) Q_DECL_NOTHROW
-{ return !(s1 == s2); }
-Q_CORE_EXPORT bool operator<(const QStringRef &s1, const QStringRef &s2) Q_DECL_NOTHROW;
-inline bool operator>(const QStringRef &s1, const QStringRef &s2) Q_DECL_NOTHROW
-{ return s2 < s1; }
-inline bool operator<=(const QStringRef &s1, const QStringRef &s2) Q_DECL_NOTHROW
-{ return !(s1 > s2); }
-inline bool operator>=(const QStringRef &s1, const QStringRef &s2) Q_DECL_NOTHROW
-{ return !(s1 < s2); }
-
-// QString <> QStringRef
-Q_CORE_EXPORT bool operator==(const QString &lhs, const QStringRef &rhs) Q_DECL_NOTHROW;
-inline bool operator!=(const QString &lhs, const QStringRef &rhs) Q_DECL_NOTHROW { return lhs.compare(rhs) != 0; }
-inline bool operator< (const QString &lhs, const QStringRef &rhs) Q_DECL_NOTHROW { return lhs.compare(rhs) < 0; }
-inline bool operator> (const QString &lhs, const QStringRef &rhs) Q_DECL_NOTHROW { return lhs.compare(rhs) > 0; }
-inline bool operator<=(const QString &lhs, const QStringRef &rhs) Q_DECL_NOTHROW { return lhs.compare(rhs) <= 0; }
-inline bool operator>=(const QString &lhs, const QStringRef &rhs) Q_DECL_NOTHROW { return lhs.compare(rhs) >= 0; }
-
-inline bool operator==(const QStringRef &lhs, const QString &rhs) Q_DECL_NOTHROW { return rhs == lhs; }
-inline bool operator!=(const QStringRef &lhs, const QString &rhs) Q_DECL_NOTHROW { return rhs != lhs; }
-inline bool operator< (const QStringRef &lhs, const QString &rhs) Q_DECL_NOTHROW { return rhs > lhs; }
-inline bool operator> (const QStringRef &lhs, const QString &rhs) Q_DECL_NOTHROW { return rhs < lhs; }
-inline bool operator<=(const QStringRef &lhs, const QString &rhs) Q_DECL_NOTHROW { return rhs >= lhs; }
-inline bool operator>=(const QStringRef &lhs, const QString &rhs) Q_DECL_NOTHROW { return rhs <= lhs; }
-
-#if QT_STRINGVIEW_LEVEL < 2
-inline int QString::compare(const QStringRef &s, Qt::CaseSensitivity cs) const Q_DECL_NOTHROW
-{ return QString::compare_helper(constData(), length(), s.constData(), s.length(), cs); }
-#endif
-inline int QString::compare(QStringView s, Qt::CaseSensitivity cs) const Q_DECL_NOTHROW
-{ return -s.compare(*this, cs); }
-inline int QString::compare(const QString &s1, const QStringRef &s2, Qt::CaseSensitivity cs) Q_DECL_NOTHROW
-{ return QString::compare_helper(s1.constData(), s1.length(), s2.constData(), s2.length(), cs); }
-inline int QStringRef::compare(const QString &s, Qt::CaseSensitivity cs) const Q_DECL_NOTHROW
-{ return QString::compare_helper(constData(), length(), s.constData(), s.length(), cs); }
-inline int QStringRef::compare(const QStringRef &s, Qt::CaseSensitivity cs) const Q_DECL_NOTHROW
-{ return QString::compare_helper(constData(), length(), s.constData(), s.length(), cs); }
-inline int QStringRef::compare(QLatin1String s, Qt::CaseSensitivity cs) const Q_DECL_NOTHROW
-{ return QString::compare_helper(constData(), length(), s, cs); }
-inline int QStringRef::compare(const QStringRef &s1, const QString &s2, Qt::CaseSensitivity cs) Q_DECL_NOTHROW
-{ return QString::compare_helper(s1.constData(), s1.length(), s2.constData(), s2.length(), cs); }
-inline int QStringRef::compare(const QStringRef &s1, const QStringRef &s2, Qt::CaseSensitivity cs) Q_DECL_NOTHROW
-{ return QString::compare_helper(s1.constData(), s1.length(), s2.constData(), s2.length(), cs); }
-inline int QStringRef::compare(const QStringRef &s1, QLatin1String s2, Qt::CaseSensitivity cs) Q_DECL_NOTHROW
-{ return QString::compare_helper(s1.constData(), s1.length(), s2, cs); }
-
-// QLatin1String <> QStringRef
-Q_CORE_EXPORT bool operator==(QLatin1String lhs, const QStringRef &rhs) Q_DECL_NOTHROW;
-inline bool operator!=(QLatin1String lhs, const QStringRef &rhs) Q_DECL_NOTHROW { return rhs.compare(lhs) != 0; }
-inline bool operator< (QLatin1String lhs, const QStringRef &rhs) Q_DECL_NOTHROW { return rhs.compare(lhs) > 0; }
-inline bool operator> (QLatin1String lhs, const QStringRef &rhs) Q_DECL_NOTHROW { return rhs.compare(lhs) < 0; }
-inline bool operator<=(QLatin1String lhs, const QStringRef &rhs) Q_DECL_NOTHROW { return rhs.compare(lhs) >= 0; }
-inline bool operator>=(QLatin1String lhs, const QStringRef &rhs) Q_DECL_NOTHROW { return rhs.compare(lhs) <= 0; }
-
-inline bool operator==(const QStringRef &lhs, QLatin1String rhs) Q_DECL_NOTHROW { return rhs == lhs; }
-inline bool operator!=(const QStringRef &lhs, QLatin1String rhs) Q_DECL_NOTHROW { return rhs != lhs; }
-inline bool operator< (const QStringRef &lhs, QLatin1String rhs) Q_DECL_NOTHROW { return rhs > lhs; }
-inline bool operator> (const QStringRef &lhs, QLatin1String rhs) Q_DECL_NOTHROW { return rhs < lhs; }
-inline bool operator<=(const QStringRef &lhs, QLatin1String rhs) Q_DECL_NOTHROW { return rhs >= lhs; }
-inline bool operator>=(const QStringRef &lhs, QLatin1String rhs) Q_DECL_NOTHROW { return rhs <= lhs; }
-
-// QChar <> QString
-inline bool operator==(QChar lhs, const QString &rhs) Q_DECL_NOTHROW
-{ return rhs.size() == 1 && lhs == rhs.front(); }
-inline bool operator< (QChar lhs, const QString &rhs) Q_DECL_NOTHROW
-{ return QString::compare_helper(&lhs, 1, rhs.data(), rhs.size()) < 0; }
-inline bool operator> (QChar lhs, const QString &rhs) Q_DECL_NOTHROW
-{ return QString::compare_helper(&lhs, 1, rhs.data(), rhs.size()) > 0; }
-
-inline bool operator!=(QChar lhs, const QString &rhs) Q_DECL_NOTHROW { return !(lhs == rhs); }
-inline bool operator<=(QChar lhs, const QString &rhs) Q_DECL_NOTHROW { return !(lhs > rhs); }
-inline bool operator>=(QChar lhs, const QString &rhs) Q_DECL_NOTHROW { return !(lhs < rhs); }
-
-inline bool operator==(const QString &lhs, QChar rhs) Q_DECL_NOTHROW { return rhs == lhs; }
-inline bool operator!=(const QString &lhs, QChar rhs) Q_DECL_NOTHROW { return !(rhs == lhs); }
-inline bool operator< (const QString &lhs, QChar rhs) Q_DECL_NOTHROW { return rhs > lhs; }
-inline bool operator> (const QString &lhs, QChar rhs) Q_DECL_NOTHROW { return rhs < lhs; }
-inline bool operator<=(const QString &lhs, QChar rhs) Q_DECL_NOTHROW { return !(rhs < lhs); }
-inline bool operator>=(const QString &lhs, QChar rhs) Q_DECL_NOTHROW { return !(rhs > lhs); }
-
-// QChar <> QStringRef
-inline bool operator==(QChar lhs, const QStringRef &rhs) Q_DECL_NOTHROW
-{ return rhs.size() == 1 && lhs == rhs.front(); }
-inline bool operator< (QChar lhs, const QStringRef &rhs) Q_DECL_NOTHROW
-{ return QString::compare_helper(&lhs, 1, rhs.data(), rhs.size()) < 0; }
-inline bool operator> (QChar lhs, const QStringRef &rhs) Q_DECL_NOTHROW
-{ return QString::compare_helper(&lhs, 1, rhs.data(), rhs.size()) > 0; }
-
-inline bool operator!=(QChar lhs, const QStringRef &rhs) Q_DECL_NOTHROW { return !(lhs == rhs); }
-inline bool operator<=(QChar lhs, const QStringRef &rhs) Q_DECL_NOTHROW { return !(lhs > rhs); }
-inline bool operator>=(QChar lhs, const QStringRef &rhs) Q_DECL_NOTHROW { return !(lhs < rhs); }
-
-inline bool operator==(const QStringRef &lhs, QChar rhs) Q_DECL_NOTHROW { return rhs == lhs; }
-inline bool operator!=(const QStringRef &lhs, QChar rhs) Q_DECL_NOTHROW { return !(rhs == lhs); }
-inline bool operator< (const QStringRef &lhs, QChar rhs) Q_DECL_NOTHROW { return rhs > lhs; }
-inline bool operator> (const QStringRef &lhs, QChar rhs) Q_DECL_NOTHROW { return rhs < lhs; }
-inline bool operator<=(const QStringRef &lhs, QChar rhs) Q_DECL_NOTHROW { return !(rhs < lhs); }
-inline bool operator>=(const QStringRef &lhs, QChar rhs) Q_DECL_NOTHROW { return !(rhs > lhs); }
-
-// QChar <> QLatin1String
-inline bool operator==(QChar lhs, QLatin1String rhs) Q_DECL_NOTHROW
-{ return rhs.size() == 1 && lhs == rhs.front(); }
-inline bool operator< (QChar lhs, QLatin1String rhs) Q_DECL_NOTHROW
-{ return QString::compare_helper(&lhs, 1, rhs) < 0; }
-inline bool operator> (QChar lhs, QLatin1String rhs) Q_DECL_NOTHROW
-{ return QString::compare_helper(&lhs, 1, rhs) > 0; }
-
-inline bool operator!=(QChar lhs, QLatin1String rhs) Q_DECL_NOTHROW { return !(lhs == rhs); }
-inline bool operator<=(QChar lhs, QLatin1String rhs) Q_DECL_NOTHROW { return !(lhs > rhs); }
-inline bool operator>=(QChar lhs, QLatin1String rhs) Q_DECL_NOTHROW { return !(lhs < rhs); }
-
-inline bool operator==(QLatin1String lhs, QChar rhs) Q_DECL_NOTHROW { return rhs == lhs; }
-inline bool operator!=(QLatin1String lhs, QChar rhs) Q_DECL_NOTHROW { return !(rhs == lhs); }
-inline bool operator< (QLatin1String lhs, QChar rhs) Q_DECL_NOTHROW { return rhs > lhs; }
-inline bool operator> (QLatin1String lhs, QChar rhs) Q_DECL_NOTHROW { return rhs < lhs; }
-inline bool operator<=(QLatin1String lhs, QChar rhs) Q_DECL_NOTHROW { return !(rhs < lhs); }
-inline bool operator>=(QLatin1String lhs, QChar rhs) Q_DECL_NOTHROW { return !(rhs > lhs); }
-
-// QStringView <> QStringView
-inline bool operator==(QStringView lhs, QStringView rhs) Q_DECL_NOTHROW { return lhs.size() == rhs.size() && QtPrivate::compareStrings(lhs, rhs) == 0; }
-inline bool operator!=(QStringView lhs, QStringView rhs) Q_DECL_NOTHROW { return !(lhs == rhs); }
-inline bool operator< (QStringView lhs, QStringView rhs) Q_DECL_NOTHROW { return QtPrivate::compareStrings(lhs, rhs) < 0; }
-inline bool operator<=(QStringView lhs, QStringView rhs) Q_DECL_NOTHROW { return QtPrivate::compareStrings(lhs, rhs) <= 0; }
-inline bool operator> (QStringView lhs, QStringView rhs) Q_DECL_NOTHROW { return QtPrivate::compareStrings(lhs, rhs) > 0; }
-inline bool operator>=(QStringView lhs, QStringView rhs) Q_DECL_NOTHROW { return QtPrivate::compareStrings(lhs, rhs) >= 0; }
-
-// QStringView <> QChar
-inline bool operator==(QStringView lhs, QChar rhs) Q_DECL_NOTHROW { return lhs == QStringView(&rhs, 1); }
-inline bool operator!=(QStringView lhs, QChar rhs) Q_DECL_NOTHROW { return lhs != QStringView(&rhs, 1); }
-inline bool operator< (QStringView lhs, QChar rhs) Q_DECL_NOTHROW { return lhs < QStringView(&rhs, 1); }
-inline bool operator<=(QStringView lhs, QChar rhs) Q_DECL_NOTHROW { return lhs <= QStringView(&rhs, 1); }
-inline bool operator> (QStringView lhs, QChar rhs) Q_DECL_NOTHROW { return lhs > QStringView(&rhs, 1); }
-inline bool operator>=(QStringView lhs, QChar rhs) Q_DECL_NOTHROW { return lhs >= QStringView(&rhs, 1); }
-
-inline bool operator==(QChar lhs, QStringView rhs) Q_DECL_NOTHROW { return QStringView(&lhs, 1) == rhs; }
-inline bool operator!=(QChar lhs, QStringView rhs) Q_DECL_NOTHROW { return QStringView(&lhs, 1) != rhs; }
-inline bool operator< (QChar lhs, QStringView rhs) Q_DECL_NOTHROW { return QStringView(&lhs, 1) < rhs; }
-inline bool operator<=(QChar lhs, QStringView rhs) Q_DECL_NOTHROW { return QStringView(&lhs, 1) <= rhs; }
-inline bool operator> (QChar lhs, QStringView rhs) Q_DECL_NOTHROW { return QStringView(&lhs, 1) > rhs; }
-inline bool operator>=(QChar lhs, QStringView rhs) Q_DECL_NOTHROW { return QStringView(&lhs, 1) >= rhs; }
-
-// QStringView <> QLatin1String
-inline bool operator==(QStringView lhs, QLatin1String rhs) Q_DECL_NOTHROW { return lhs.size() == rhs.size() && QtPrivate::compareStrings(lhs, rhs) == 0; }
-inline bool operator!=(QStringView lhs, QLatin1String rhs) Q_DECL_NOTHROW { return !(lhs == rhs); }
-inline bool operator< (QStringView lhs, QLatin1String rhs) Q_DECL_NOTHROW { return QtPrivate::compareStrings(lhs, rhs) < 0; }
-inline bool operator<=(QStringView lhs, QLatin1String rhs) Q_DECL_NOTHROW { return QtPrivate::compareStrings(lhs, rhs) <= 0; }
-inline bool operator> (QStringView lhs, QLatin1String rhs) Q_DECL_NOTHROW { return QtPrivate::compareStrings(lhs, rhs) > 0; }
-inline bool operator>=(QStringView lhs, QLatin1String rhs) Q_DECL_NOTHROW { return QtPrivate::compareStrings(lhs, rhs) >= 0; }
-
-inline bool operator==(QLatin1String lhs, QStringView rhs) Q_DECL_NOTHROW { return lhs.size() == rhs.size() && QtPrivate::compareStrings(lhs, rhs) == 0; }
-inline bool operator!=(QLatin1String lhs, QStringView rhs) Q_DECL_NOTHROW { return !(lhs == rhs); }
-inline bool operator< (QLatin1String lhs, QStringView rhs) Q_DECL_NOTHROW { return QtPrivate::compareStrings(lhs, rhs) < 0; }
-inline bool operator<=(QLatin1String lhs, QStringView rhs) Q_DECL_NOTHROW { return QtPrivate::compareStrings(lhs, rhs) <= 0; }
-inline bool operator> (QLatin1String lhs, QStringView rhs) Q_DECL_NOTHROW { return QtPrivate::compareStrings(lhs, rhs) > 0; }
-inline bool operator>=(QLatin1String lhs, QStringView rhs) Q_DECL_NOTHROW { return QtPrivate::compareStrings(lhs, rhs) >= 0; }
-
-#if !defined(QT_NO_CAST_FROM_ASCII) && !defined(QT_RESTRICTED_CAST_FROM_ASCII)
-// QStringRef <> QByteArray
-inline QT_ASCII_CAST_WARN bool operator==(const QStringRef &lhs, const QByteArray &rhs) { return lhs.compare(rhs) == 0; }
-inline QT_ASCII_CAST_WARN bool operator!=(const QStringRef &lhs, const QByteArray &rhs) { return lhs.compare(rhs) != 0; }
-inline QT_ASCII_CAST_WARN bool operator< (const QStringRef &lhs, const QByteArray &rhs) { return lhs.compare(rhs) < 0; }
-inline QT_ASCII_CAST_WARN bool operator> (const QStringRef &lhs, const QByteArray &rhs) { return lhs.compare(rhs) > 0; }
-inline QT_ASCII_CAST_WARN bool operator<=(const QStringRef &lhs, const QByteArray &rhs) { return lhs.compare(rhs) <= 0; }
-inline QT_ASCII_CAST_WARN bool operator>=(const QStringRef &lhs, const QByteArray &rhs) { return lhs.compare(rhs) >= 0; }
-
-inline QT_ASCII_CAST_WARN bool operator==(const QByteArray &lhs, const QStringRef &rhs) { return rhs.compare(lhs) == 0; }
-inline QT_ASCII_CAST_WARN bool operator!=(const QByteArray &lhs, const QStringRef &rhs) { return rhs.compare(lhs) != 0; }
-inline QT_ASCII_CAST_WARN bool operator< (const QByteArray &lhs, const QStringRef &rhs) { return rhs.compare(lhs) > 0; }
-inline QT_ASCII_CAST_WARN bool operator> (const QByteArray &lhs, const QStringRef &rhs) { return rhs.compare(lhs) < 0; }
-inline QT_ASCII_CAST_WARN bool operator<=(const QByteArray &lhs, const QStringRef &rhs) { return rhs.compare(lhs) >= 0; }
-inline QT_ASCII_CAST_WARN bool operator>=(const QByteArray &lhs, const QStringRef &rhs) { return rhs.compare(lhs) <= 0; }
-
-// QStringRef <> const char *
-inline QT_ASCII_CAST_WARN bool QStringRef::operator==(const char *s) const
-{ return QString::compare_helper(constData(), size(), s, -1) == 0; }
-inline QT_ASCII_CAST_WARN bool QStringRef::operator!=(const char *s) const
-{ return QString::compare_helper(constData(), size(), s, -1) != 0; }
-inline QT_ASCII_CAST_WARN bool QStringRef::operator<(const char *s) const
-{ return QString::compare_helper(constData(), size(), s, -1) < 0; }
-inline QT_ASCII_CAST_WARN bool QStringRef::operator<=(const char *s) const
-{ return QString::compare_helper(constData(), size(), s, -1) <= 0; }
-inline QT_ASCII_CAST_WARN bool QStringRef::operator>(const char *s) const
-{ return QString::compare_helper(constData(), size(), s, -1) > 0; }
-inline QT_ASCII_CAST_WARN bool QStringRef::operator>=(const char *s) const
-{ return QString::compare_helper(constData(), size(), s, -1) >= 0; }
-
-inline QT_ASCII_CAST_WARN bool operator==(const char *s1, const QStringRef &s2)
-{ return QString::compare_helper(s2.constData(), s2.size(), s1, -1) == 0; }
-inline QT_ASCII_CAST_WARN bool operator!=(const char *s1, const QStringRef &s2)
-{ return QString::compare_helper(s2.constData(), s2.size(), s1, -1) != 0; }
-inline QT_ASCII_CAST_WARN bool operator<(const char *s1, const QStringRef &s2)
-{ return QString::compare_helper(s2.constData(), s2.size(), s1, -1) > 0; }
-inline QT_ASCII_CAST_WARN bool operator<=(const char *s1, const QStringRef &s2)
-{ return QString::compare_helper(s2.constData(), s2.size(), s1, -1) >= 0; }
-inline QT_ASCII_CAST_WARN bool operator>(const char *s1, const QStringRef &s2)
-{ return QString::compare_helper(s2.constData(), s2.size(), s1, -1) < 0; }
-inline QT_ASCII_CAST_WARN bool operator>=(const char *s1, const QStringRef &s2)
-{ return QString::compare_helper(s2.constData(), s2.size(), s1, -1) <= 0; }
-#endif // !defined(QT_NO_CAST_FROM_ASCII) && !defined(QT_RESTRICTED_CAST_FROM_ASCII)
-
-inline int QString::localeAwareCompare(const QStringRef &s) const
-{ return localeAwareCompare_helper(constData(), length(), s.constData(), s.length()); }
-inline int QString::localeAwareCompare(const QString& s1, const QStringRef& s2)
-{ return localeAwareCompare_helper(s1.constData(), s1.length(), s2.constData(), s2.length()); }
-inline int QStringRef::localeAwareCompare(const QString &s) const
-{ return QString::localeAwareCompare_helper(constData(), length(), s.constData(), s.length()); }
-inline int QStringRef::localeAwareCompare(const QStringRef &s) const
-{ return QString::localeAwareCompare_helper(constData(), length(), s.constData(), s.length()); }
-inline int QStringRef::localeAwareCompare(const QStringRef &s1, const QString &s2)
-{ return QString::localeAwareCompare_helper(s1.constData(), s1.length(), s2.constData(), s2.length()); }
-inline int QStringRef::localeAwareCompare(const QStringRef &s1, const QStringRef &s2)
-{ return QString::localeAwareCompare_helper(s1.constData(), s1.length(), s2.constData(), s2.length()); }
-
-inline bool QStringRef::contains(const QString &s, Qt::CaseSensitivity cs) const
-{ return indexOf(s, 0, cs) != -1; }
-inline bool QStringRef::contains(QLatin1String s, Qt::CaseSensitivity cs) const
-{ return indexOf(s, 0, cs) != -1; }
-inline bool QStringRef::contains(QChar c, Qt::CaseSensitivity cs) const
-{ return indexOf(c, 0, cs) != -1; }
-inline bool QStringRef::contains(const QStringRef &s, Qt::CaseSensitivity cs) const
-{ return indexOf(s, 0, cs) != -1; }
-
-inline QString &QString::insert(int i, const QStringRef &s)
-{ return insert(i, s.constData(), s.length()); }
-
-#if !defined(QT_USE_FAST_OPERATOR_PLUS) && !defined(QT_USE_QSTRINGBUILDER)
-inline QString operator+(const QString &s1, const QStringRef &s2)
-{ QString t; t.reserve(s1.size() + s2.size()); t += s1; t += s2; return t; }
-inline QString operator+(const QStringRef &s1, const QString &s2)
-{ QString t; t.reserve(s1.size() + s2.size()); t += s1; t += s2; return t; }
-inline QString operator+(const QStringRef &s1, QLatin1String s2)
-{ QString t; t.reserve(s1.size() + s2.size()); t += s1; t += s2; return t; }
-inline QString operator+(QLatin1String s1, const QStringRef &s2)
-{ QString t; t.reserve(s1.size() + s2.size()); t += s1; t += s2; return t; }
-inline QString operator+(const QStringRef &s1, const QStringRef &s2)
-{ QString t; t.reserve(s1.size() + s2.size()); t += s1; t += s2; return t; }
-inline QString operator+(const QStringRef &s1, QChar s2)
-{ QString t; t.reserve(s1.size() + 1); t += s1; t += s2; return t; }
-inline QString operator+(QChar s1, const QStringRef &s2)
-{ QString t; t.reserve(1 + s2.size()); t += s1; t += s2; return t; }
-#endif // !(QT_USE_FAST_OPERATOR_PLUS || QT_USE_QSTRINGBUILDER)
-
-namespace Qt {
-#if QT_DEPRECATED_SINCE(5, 0)
-QT_DEPRECATED inline QString escape(const QString &plain) {
- return plain.toHtmlEscaped();
-}
-#endif
-}
-
-namespace QtPrivate {
-// used by qPrintable() and qUtf8Printable() macros
-inline const QString &asString(const QString &s) { return s; }
-inline QString &&asString(QString &&s) { return std::move(s); }
-}
-
-QT_END_NAMESPACE
-
-#if defined(QT_USE_FAST_OPERATOR_PLUS) || defined(QT_USE_QSTRINGBUILDER)
-#include <QtCore/qstringbuilder.h>
-#endif
-
-#endif // QSTRING_H
diff --git a/src/corelib/tools/qstring_compat.cpp b/src/corelib/tools/qstring_compat.cpp
deleted file mode 100644
index 45bb816e4b..0000000000
--- a/src/corelib/tools/qstring_compat.cpp
+++ /dev/null
@@ -1,112 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 Intel Corporation.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#if defined(QSTRING_H) || defined(QBYTEARRAY_H)
-# error "This file cannot be compiled with pre-compiled headers"
-#endif
-#define QT_COMPILING_QSTRING_COMPAT_CPP
-
-#include "qbytearray.h"
-#include "qstring.h"
-
-QT_BEGIN_NAMESPACE
-
-// all these implementations must be the same as the inline versions in qstring.h
-QString QString::trimmed() const
-{
- return trimmed_helper(*this);
-}
-
-QString QString::simplified() const
-{
- return simplified_helper(*this);
-}
-
-QString QString::toLower() const
-{
- return toLower_helper(*this);
-}
-
-QString QString::toCaseFolded() const
-{
- return toCaseFolded_helper(*this);
-}
-
-QString QString::toUpper() const
-{
- return toUpper_helper(*this);
-}
-
-QByteArray QString::toLatin1() const
-{
- return toLatin1_helper(*this);
-}
-
-QByteArray QString::toLocal8Bit() const
-{
- return toLocal8Bit_helper(isNull() ? nullptr : constData(), size());
-}
-
-QByteArray QString::toUtf8() const
-{
- return toUtf8_helper(*this);
-}
-
-// ditto, for qbytearray.h (because we're lazy)
-QByteArray QByteArray::toLower() const
-{
- return toLower_helper(*this);
-}
-
-QByteArray QByteArray::toUpper() const
-{
- return toUpper_helper(*this);
-}
-
-QByteArray QByteArray::trimmed() const
-{
- return trimmed_helper(*this);
-}
-
-QByteArray QByteArray::simplified() const
-{
- return simplified_helper(*this);
-}
-
-QT_END_NAMESPACE
diff --git a/src/corelib/tools/qstring_mips_dsp_asm.S b/src/corelib/tools/qstring_mips_dsp_asm.S
deleted file mode 100644
index 202f322310..0000000000
--- a/src/corelib/tools/qstring_mips_dsp_asm.S
+++ /dev/null
@@ -1,447 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2013 Imagination Technologies Limited, www.imgtec.com
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#include "../../gui/painting/qt_mips_asm_dsp_p.h"
-
-.macro EXTRACT_HALVES_x2 src1, src2, hi_1, hi_2
-#if defined(__MIPSEL) && __MIPSEL
- srl \hi_1, \src1, 16
- ext \src1, \src1, 0, 16
- srl \hi_2, \src2, 16
- ext \src2, \src2, 0, 16
-#else
- ext \hi_1, \src1, 0, 16
- srl \src1, \src1, 16
- ext \hi_2, \src2, 0, 16
- srl \src2, \src2, 16
-#endif
-.endm
-
-
-LEAF_MIPS_DSP(qt_ucstrncmp_mips_dsp_asm)
-/*
- * Arguments:
- * a0 - string_a (uint16_t*)
- * a1 - string_b (uint16_t*)
- * a2 - length (uint32_t)
- *
- * Register usage:
- * t0 - batches
- */
-
- move v0, zero /* result = 0 */
- andi t0, a0, 0x3 /* t1 = string_a % 4 */
- andi t1, a1, 0x3 /* t0 = string_b % 4 */
- or t2, t0, t1 /* t2 = t0 | t1 */
-
- beqz t2, 5f /* both aligned */
- and t2, t0 ,t1
- beqz t2, 6f /* one aligned */
- nop
-
- /*
- * Both strings are unaligned: read 1 halfword from each,
- * then fall-off to continue with the both-aligned case.
- */
- lhu t0, 0 (a0)
- lhu t1, 0 (a1)
- addiu a2, a2, -1 /* len-- */
- sub v0, t0, t1 /* v0 = t0-t1 */
- addiu a0, a0, 2 /* string_a++ */
- bnez v0, 0f /* if (t0-t1): return */
- addiu a1, a1, 2 /* string_b++ */
- beqz a2, 0f /* if !len: return */
- /* next instruction (srl) fills delay branch slot */
-
-5: /* Both string pointers are aligned */
- srl t0, a2, 3 /* batches = length / 8 */
- beqz t0, 9f /* if !batches: tail */
- andi a2, a2, 0x7 /* length = length % 8 */
-
- SAVE_REGS_ON_STACK 0, s0, s1, s2, s3
-
-1: lw t1, 0 (a0) /* [a0 a1] */
- lw t3, 4 (a0) /* [a2 a3] */
- lw t5, 8 (a0) /* [a4 a5] */
- lw t7, 12 (a0) /* [a6 a7] */
-
- lw t2, 0 (a1) /* [b0 b1] */
- lw t4, 4 (a1) /* [b2 b3] */
- lw t6, 8 (a1) /* [b4 b5] */
- lw t8, 12 (a1) /* [b6 b7] */
-
- /*
- * Subtract elements one by one, if the result is zero
- * both halves of the registers (shorts) are equal.
- */
- subq.ph s0, t1, t2 /* [a0-b0 a1-b1] */
- subq.ph s1, t3, t4 /* [a2-b2 a3-b3] */
-
- bnez s0, 1f
- subq.ph s2, t5, t6 /* [a4-b4 a5-b5] */
- bnez s1, 2f
- subq.ph s3, t7, t8 /* [a6-b6 a7-b7] */
- bnez s2, 3f
- addiu t0, t0, -1 /* batches-- */
- bnez s3, 4f
- addiu a0, a0, 8*2 /* string_a += 8 */
-
- bnez t0, 1b /* if batches: loop */
- addiu a1, a1, 8*2 /* string_b += 8 */
-
- RESTORE_REGS_FROM_STACK 0, s0, s1, s2, s3
-
- bnez a2, 9f /* if length: tail */
- nop
- jr ra
- nop
-
-
- 1: /* Check t1 [a0 a1] vs. t2 [b0 b1] */
- EXTRACT_HALVES_x2 t1, t2, t3, t4 /* a0, b0, a1, b1 */
- sub v0, t1, t2
- RESTORE_REGS_FROM_STACK 0, s0, s1, s2, s3
- bnez v0, 0f /* if (a0-b0): return */
- nop
- jr ra
- sub v0, t3, t4 /* return a1-b1 */
-
- 2: /* Check t3 [a2 a3] vs. t4 [b2 b3] */
- EXTRACT_HALVES_x2 t3, t4, t1, t2 /* a2, b2, a3, b3 */
- sub v0, t3, t4
- RESTORE_REGS_FROM_STACK 0, s0, s1, s2, s3
- bnez v0, 0f /* if (a2-b2): return */
- nop
- jr ra
- sub v0, t1, t2 /* return a3-b3 */
-
- 3: /* Check t5 [a4 a5] vs. t6 [b4 b5] */
- EXTRACT_HALVES_x2 t5, t6, t1, t2 /* a4, b4, a5, b5 */
- sub v0, t5, t6
- RESTORE_REGS_FROM_STACK 0, s0, s1, s2, s3
- bnez v0, 0f /* if (a4-b4): return */
- nop
- jr ra
- sub v0, t1, t2 /* return a5-b5 */
-
- 4: /* Check t7 [a6 a7] vs. t8 [b6 b7] */
- EXTRACT_HALVES_x2 t7, t8, t1, t2 /* a6, b6, a7, b7 */
- sub v0, t7, t8
- RESTORE_REGS_FROM_STACK 0, s0, s1, s2, s3
- bnez v0, 0f /* if (a6-b6): return */
- nop
- jr ra
- sub v0, t1, t2
-
-
- /* Process remaining tail items. */
-9: lhu t1, 0 (a0) /* a */
- lhu t2, 0 (a1) /* b */
- addiu a2, a2, -1 /* length-- */
- sub v0, t1, t2 /* result = (a - b) */
-
- bnez v0, 0f /* if (a - b): return */
- addiu a0, a0, 2 /* string_a++ */
-
- bnez a2, 9b /* if length: loop */
- addiu a1, a1, 2 /* string_b++ */
-
-0: jr ra
- nop
-
-
- /* One of the inputs is unaligned, do unrolled half-word loads */
-6: srl t0, a2, 3 /* batches = length / 8 */
- andi a2, a2, 0x7 /* length = length % 8 */
-
-1: lhu t1, 0 (a0)
- lhu t2, 0 (a1)
- lhu t3, 2 (a0)
- lhu t4, 2 (a1)
- lhu t5, 4 (a0)
- lhu t6, 4 (a1)
- lhu t7, 6 (a0)
- lhu t8, 6 (a1)
-
- sub v0, t1, t2
- sub t1, t3, t4
-
- bnez v0, 0f
- sub t2, t5, t6
- bnez t1, 2f
- sub t3, t7, t8
- bnez t2, 3f
- lhu t1, 8 (a0)
- bnez t3, 4f
- lhu t2, 8 (a1)
-
- lhu t3, 10 (a0)
- lhu t4, 10 (a1)
- lhu t5, 12 (a0)
- lhu t6, 12 (a1)
- lhu t7, 14 (a0)
- lhu t8, 14 (a1)
-
- sub v0, t1, t2
- sub t1, t3, t4
-
- bnez v0, 0f
- sub t2, t5, t6
- bnez t1, 2f
- sub t3, t7, t8
- bnez t2, 3f
- addiu t0, t0, -1 /* batches-- */
- bnez t3, 4f
- addiu a0, a0, 8*2 /* string_a += 8 */
-
- bnez t0, 1b
- addiu a1, a1, 8*2 /* string_b += 8 */
-
- bnez a2, 9b /* if length: tail */
- nop
-
-0: jr ra
- nop
-2: jr ra
- move v0, t1
-3: jr ra
- move v0, t2
-4: jr ra
- move v0, t3
-
-END(qt_ucstrncmp_mips_dsp_asm)
-
-
-#if defined(__mips_dspr2)
-LEAF_MIPS_DSPR2(qt_fromlatin1_mips_asm_unroll8)
-#else
-LEAF_MIPS_DSP(qt_fromlatin1_mips_asm_unroll8)
-#endif
-
- andi t0, a1, 0x3
- beqz t0, 9f /* check that src is aligned */
- nop
-
-1: lbu t1, 0 (a1)
- addiu a1, a1, 1
- addiu a2, a2, -1
- sh t1, 0 (a0)
- beqz a2, 0f
- andi t0, a1, 0x3
- bnez t0, 1b
- addiu a0, a0, 2
-
-9: /* source pointer is aligned: do batches of 8 elements */
- andi t0, a0, 3 /* check if dst is aligned */
- bnez t0, 6f
- srl t0, a2, 3 /* batches = len / 8 */
- andi a2, a2, 0x7 /* tail = len % 8 */
-
- beqz t0, 8f /* if !batches: tail */
- nop
-
-1: lw t1, 0 (a1)
- lw t2, 4 (a1)
-
- addiu a1, a1, 8*1
- addiu t0, t0, -1
-
- preceu.ph.qbl t3, t1
- preceu.ph.qbr t1, t1
- preceu.ph.qbl t4, t2
- preceu.ph.qbr t2, t2
-
-#if defined(__MIPSEL) && __MIPSEL
- sw t1, 0 (a0)
- sw t3, 4 (a0)
- sw t2, 8 (a0)
- sw t4, 12 (a0)
-#else
- sw t3, 0 (a0)
- sw t1, 4 (a0)
- sw t4, 8 (a0)
- sw t2, 12 (a0)
-#endif
-
- bnez t0, 1b
- addiu a0, a0, 8*2
-
-8: /* process tail items */
- beqz a2, 0f
- nop
-
-1: lbu t1, 0 (a1)
- addiu a2, a2, -1
- sh t1, 0 (a0)
- addiu a1, a1, 1
- bnez a2, 1b
- addiu a0, a0, 2
-
-0: jr ra
- nop
-
-6: beqz t0, 8b
- andi a2, a2, 7
-7: lw t1, 0(a1)
- lw t2, 4(a1)
- addiu t0, t0, -1
- addiu a1, a1, 8
- andi t3, t1, 0xff
-#if defined(__mips_dspr2)
- prepend t1, t2, 8
-#else
- sll t4, t4, 24
- srl t1, t1, 8
- or t1, t1, t4
-#endif
- srl t2, t2, 8
- preceu.ph.qbr t4, t1
- preceu.ph.qbl t1, t1
- preceu.ph.qbr t5, t2
- srl t2, t2, 16
- sh t3, 0(a0)
- sw t4, 2(a0)
- sw t1, 6(a0)
- sw t5, 10(a0)
- sh t2, 14(a0)
- bnez t0, 7b
- addiu a0, a0, 16
- bnez a2, 1b
- nop
-
- jr ra
- nop
-
-END(qt_fromlatin1_mips_asm_unroll8)
-
-
-LEAF_MIPS_DSP(qt_fromlatin1_mips_asm_unroll4)
-/*
- * Arguments:
- * a0 - dst (uint16_t*)
- * a1 - src (const char*)
- * a2 - len (unsigned int)
- */
-
- /*
- * QString::fromLatin1_helper() already handles the len==0
- * case: assume that len is never zero.
- */
- srl t0, a2, 2
- beqz t0, 9f
- andi a2, a2, 0x3
-
-1: lbu t1, 0(a1)
- lbu t2, 1(a1)
- lbu t3, 2(a1)
- lbu t4, 3(a1)
- sh t1, 0(a0)
- sh t2, 2(a0)
- sh t3, 4(a0)
- sh t4, 6(a0)
- addiu t0, t0, -1
- addiu a1, a1, 4
- bnez t0, 1b
- addiu a0, a0, 8
-
-8: beqz a2, 0f
- nop
-
-9: lbu t1, 0(a1)
- addiu a2, a2, -1
- addiu a1, a1, 1
- sh t1, 0(a0)
- bnez a2, 9b
- addiu a0, a0, 2
-
-0: jr ra
- nop
-
-END(qt_fromlatin1_mips_asm_unroll4)
-
-
-LEAF_MIPS_DSP(qt_toLatin1_mips_dsp_asm)
- /*
- * a0 - dst
- * a1 - src
- * a2 - length
- */
-
- addiu t9, zero, 0x3f
- srl t8, a2, 2
- beqz t8, 2f
- andi a2, a2, 3
-1:
- lhu t0, 0(a1)
- lhu t1, 2(a1)
- lhu t2, 4(a1)
- lhu t3, 6(a1)
- srl t4, t0, 8
- srl t5, t1, 8
- srl t6, t2, 8
- srl t7, t3, 8
- movn t0, t9, t4
- movn t1, t9, t5
- movn t2, t9, t6
- movn t3, t9, t7
- addiu a1, a1, 8
- addiu t8, t8, -1
- sb t0, 0(a0)
- sb t1, 1(a0)
- sb t2, 2(a0)
- sb t3, 3(a0)
- bgtz t8, 1b
- addiu a0, a0, 4
-2: beqz a2, 4f
- nop
-3:
- lhu t0, 0(a1)
- addiu a1, a1, 2
- addiu a2, a2, -1
- srl t1, t0, 8
- movn t0, t9, t1
- sb t0, 0(a0)
- bgtz a2, 3b
- addiu a0, a0, 1
-4:
- jr ra
- nop
-
-END(qt_toLatin1_mips_dsp_asm)
-
diff --git a/src/corelib/tools/qstringalgorithms.h b/src/corelib/tools/qstringalgorithms.h
deleted file mode 100644
index cc0eda71f3..0000000000
--- a/src/corelib/tools/qstringalgorithms.h
+++ /dev/null
@@ -1,95 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2017 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.com, author Marc Mutz <marc.mutz@kdab.com>
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#ifndef QSTRINGALGORITHMS_H
-#define QSTRINGALGORITHMS_H
-
-#include <QtCore/qnamespace.h>
-
-#if 0
-#pragma qt_class(QStringAlgorithms)
-#endif
-
-QT_BEGIN_NAMESPACE
-
-class QByteArray;
-class QLatin1String;
-class QStringView;
-template <typename T> class QVector;
-
-namespace QtPrivate {
-
-Q_REQUIRED_RESULT Q_CORE_EXPORT Q_DECL_PURE_FUNCTION qsizetype qustrlen(const ushort *str) Q_DECL_NOTHROW;
-Q_REQUIRED_RESULT Q_CORE_EXPORT Q_DECL_PURE_FUNCTION const ushort *qustrchr(QStringView str, ushort ch) noexcept;
-
-Q_REQUIRED_RESULT Q_CORE_EXPORT Q_DECL_PURE_FUNCTION int compareStrings(QStringView lhs, QStringView rhs, Qt::CaseSensitivity cs = Qt::CaseSensitive) Q_DECL_NOTHROW;
-Q_REQUIRED_RESULT Q_CORE_EXPORT Q_DECL_PURE_FUNCTION int compareStrings(QStringView lhs, QLatin1String rhs, Qt::CaseSensitivity cs = Qt::CaseSensitive) Q_DECL_NOTHROW;
-Q_REQUIRED_RESULT Q_CORE_EXPORT Q_DECL_PURE_FUNCTION int compareStrings(QLatin1String lhs, QStringView rhs, Qt::CaseSensitivity cs = Qt::CaseSensitive) Q_DECL_NOTHROW;
-Q_REQUIRED_RESULT Q_CORE_EXPORT Q_DECL_PURE_FUNCTION int compareStrings(QLatin1String lhs, QLatin1String rhs, Qt::CaseSensitivity cs = Qt::CaseSensitive) Q_DECL_NOTHROW;
-
-
-Q_REQUIRED_RESULT Q_CORE_EXPORT Q_DECL_PURE_FUNCTION bool startsWith(QStringView haystack, QStringView needle, Qt::CaseSensitivity cs = Qt::CaseSensitive) Q_DECL_NOTHROW;
-Q_REQUIRED_RESULT Q_CORE_EXPORT Q_DECL_PURE_FUNCTION bool startsWith(QStringView haystack, QLatin1String needle, Qt::CaseSensitivity cs = Qt::CaseSensitive) Q_DECL_NOTHROW;
-Q_REQUIRED_RESULT Q_CORE_EXPORT Q_DECL_PURE_FUNCTION bool startsWith(QLatin1String haystack, QStringView needle, Qt::CaseSensitivity cs = Qt::CaseSensitive) Q_DECL_NOTHROW;
-Q_REQUIRED_RESULT Q_CORE_EXPORT Q_DECL_PURE_FUNCTION bool startsWith(QLatin1String haystack, QLatin1String needle, Qt::CaseSensitivity cs = Qt::CaseSensitive) Q_DECL_NOTHROW;
-
-Q_REQUIRED_RESULT Q_CORE_EXPORT Q_DECL_PURE_FUNCTION bool endsWith(QStringView haystack, QStringView needle, Qt::CaseSensitivity cs = Qt::CaseSensitive) Q_DECL_NOTHROW;
-Q_REQUIRED_RESULT Q_CORE_EXPORT Q_DECL_PURE_FUNCTION bool endsWith(QStringView haystack, QLatin1String needle, Qt::CaseSensitivity cs = Qt::CaseSensitive) Q_DECL_NOTHROW;
-Q_REQUIRED_RESULT Q_CORE_EXPORT Q_DECL_PURE_FUNCTION bool endsWith(QLatin1String haystack, QStringView needle, Qt::CaseSensitivity cs = Qt::CaseSensitive) Q_DECL_NOTHROW;
-Q_REQUIRED_RESULT Q_CORE_EXPORT Q_DECL_PURE_FUNCTION bool endsWith(QLatin1String haystack, QLatin1String needle, Qt::CaseSensitivity cs = Qt::CaseSensitive) Q_DECL_NOTHROW;
-
-Q_REQUIRED_RESULT Q_CORE_EXPORT Q_DECL_PURE_FUNCTION QStringView trimmed(QStringView s) Q_DECL_NOTHROW;
-Q_REQUIRED_RESULT Q_CORE_EXPORT Q_DECL_PURE_FUNCTION QLatin1String trimmed(QLatin1String s) Q_DECL_NOTHROW;
-
-Q_REQUIRED_RESULT Q_CORE_EXPORT QByteArray convertToLatin1(QStringView str);
-Q_REQUIRED_RESULT Q_CORE_EXPORT QByteArray convertToUtf8(QStringView str);
-Q_REQUIRED_RESULT Q_CORE_EXPORT QByteArray convertToLocal8Bit(QStringView str);
-Q_REQUIRED_RESULT Q_CORE_EXPORT QVector<uint> convertToUcs4(QStringView str);
-Q_REQUIRED_RESULT Q_CORE_EXPORT bool isRightToLeft(QStringView string);
-
-Q_REQUIRED_RESULT Q_CORE_EXPORT bool isAscii(QLatin1String s) Q_DECL_NOTHROW;
-Q_REQUIRED_RESULT Q_CORE_EXPORT bool isAscii(QStringView s) Q_DECL_NOTHROW;
-Q_REQUIRED_RESULT bool isLatin1(QLatin1String s) Q_DECL_NOTHROW; // in qstring.h
-Q_REQUIRED_RESULT Q_CORE_EXPORT bool isLatin1(QStringView s) Q_DECL_NOTHROW;
-
-} // namespace QtPRivate
-
-QT_END_NAMESPACE
-
-#endif // QSTRINGALGORTIHMS_H
diff --git a/src/corelib/tools/qstringalgorithms_p.h b/src/corelib/tools/qstringalgorithms_p.h
deleted file mode 100644
index 4bcf697f78..0000000000
--- a/src/corelib/tools/qstringalgorithms_p.h
+++ /dev/null
@@ -1,152 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 Intel Corporation.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#ifndef QSTRINGALGORITHMS_P_H
-#define QSTRINGALGORITHMS_P_H
-
-//
-// W A R N I N G
-// -------------
-//
-// This file is not part of the Qt API. It exists for the convenience
-// of internal files. This header file may change from version to version
-// without notice, or even be removed.
-//
-// We mean it.
-//
-
-#include "qstring.h"
-#include "qlocale_p.h" // for ascii_isspace
-
-QT_BEGIN_NAMESPACE
-
-template <typename StringType> struct QStringAlgorithms
-{
- typedef typename StringType::value_type Char;
- typedef typename StringType::size_type size_type;
- typedef typename std::remove_cv<StringType>::type NakedStringType;
- static const bool isConst = std::is_const<StringType>::value;
-
- static inline bool isSpace(char ch) { return ascii_isspace(ch); }
- static inline bool isSpace(QChar ch) { return ch.isSpace(); }
-
- // Surrogate pairs are not handled in either of the functions below. That is
- // not a problem because there are no space characters (Zs, Zl, Zp) outside the
- // Basic Multilingual Plane.
-
- static inline StringType trimmed_helper_inplace(NakedStringType &str, const Char *begin, const Char *end)
- {
- // in-place trimming:
- Char *data = const_cast<Char *>(str.cbegin());
- if (begin != data)
- memmove(data, begin, (end - begin) * sizeof(Char));
- str.resize(end - begin);
- return qMove(str);
- }
-
- static inline StringType trimmed_helper_inplace(const NakedStringType &, const Char *, const Char *)
- {
- // can't happen
- Q_UNREACHABLE();
- return StringType();
- }
-
- static inline void trimmed_helper_positions(const Char *&begin, const Char *&end)
- {
- // skip white space from end
- while (begin < end && isSpace(end[-1]))
- --end;
- // skip white space from start
- while (begin < end && isSpace(*begin))
- begin++;
- }
-
- static inline StringType trimmed_helper(StringType &str)
- {
- const Char *begin = str.cbegin();
- const Char *end = str.cend();
- trimmed_helper_positions(begin, end);
-
- if (begin == str.cbegin() && end == str.cend())
- return str;
- if (!isConst && str.isDetached())
- return trimmed_helper_inplace(str, begin, end);
- return StringType(begin, end - begin);
- }
-
- static inline StringType simplified_helper(StringType &str)
- {
- if (str.isEmpty())
- return str;
- const Char *src = str.cbegin();
- const Char *end = str.cend();
- NakedStringType result = isConst || !str.isDetached() ?
- StringType(str.size(), Qt::Uninitialized) :
- qMove(str);
-
- Char *dst = const_cast<Char *>(result.cbegin());
- Char *ptr = dst;
- bool unmodified = true;
- forever {
- while (src != end && isSpace(*src))
- ++src;
- while (src != end && !isSpace(*src))
- *ptr++ = *src++;
- if (src == end)
- break;
- if (*src != QChar::Space)
- unmodified = false;
- *ptr++ = QChar::Space;
- }
- if (ptr != dst && ptr[-1] == QChar::Space)
- --ptr;
-
- int newlen = ptr - dst;
- if (isConst && newlen == str.size() && unmodified) {
- // nothing happened, return the original
- return str;
- }
- result.resize(newlen);
- return result;
- }
-};
-
-QT_END_NAMESPACE
-
-#endif // QSTRINGALGORITHMS_P_H
diff --git a/src/corelib/tools/qstringbuilder.cpp b/src/corelib/tools/qstringbuilder.cpp
deleted file mode 100644
index 8afc83819b..0000000000
--- a/src/corelib/tools/qstringbuilder.cpp
+++ /dev/null
@@ -1,137 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#include "qstringbuilder.h"
-#include <private/qutfcodec_p.h>
-
-QT_BEGIN_NAMESPACE
-
-/*!
- \class QStringBuilder
- \inmodule QtCore
- \internal
- \reentrant
- \since 4.6
-
- \brief The QStringBuilder class is a template class that provides a facility to build up QStrings and QByteArrays from smaller chunks.
-
- \ingroup tools
- \ingroup shared
- \ingroup string-processing
-
-
- To build a QString by multiple concatenations, QString::operator+()
- is typically used. This causes \e{n - 1} allocations when building
- a string from \e{n} chunks. The same is true for QByteArray.
-
- QStringBuilder uses expression templates to collect the individual
- chunks, compute the total size, allocate the required amount of
- memory for the final string object, and copy the chunks into the
- allocated memory.
-
- The QStringBuilder class is not to be used explicitly in user
- code. Instances of the class are created as return values of the
- operator%() function, acting on objects of the following types:
-
- For building QStrings:
-
- \list
- \li QString, QStringRef, (since 5.10:) QStringView
- \li QChar, QCharRef, QLatin1Char, (since 5.10:) \c char16_t,
- \li QLatin1String,
- \li (since 5.10:) \c{const char16_t[]} (\c{u"foo"}),
- \li QByteArray, \c char, \c{const char[]}.
- \endlist
-
- The types in the last list point are only available when
- \c QT_NO_CAST_FROM_ASCII is not defined.
-
- For building QByteArrays:
-
- \list
- \li QByteArray, \c char, \c{const char[]}.
- \endlist
-
- Concatenating strings with operator%() generally yields better
- performance than using \c QString::operator+() on the same chunks
- if there are three or more of them, and performs equally well in other
- cases.
-
- \sa QLatin1String, QString
-*/
-
-/*! \fn template <typename A, typename B> QStringBuilder<A, B>::QStringBuilder(const A &a, const B &b)
- Constructs a QStringBuilder from \a a and \a b.
- */
-
-/* \fn template <typename A, typename B> QStringBuilder<A, B>::operator%(const A &a, const B &b)
-
- Returns a \c QStringBuilder object that is converted to a QString object
- when assigned to a variable of QString type or passed to a function that
- takes a QString parameter.
-
- This function is usable with arguments of type \c QString,
- \c QLatin1String, \c QStringRef,
- \c QChar, \c QCharRef, \c QLatin1Char, and \c char.
-*/
-
-/* \fn template <typename A, typename B> QByteArray QStringBuilder<A, B>::toLatin1() const
- Returns a Latin-1 representation of the string as a QByteArray. The
- returned byte array is undefined if the string contains non-Latin1
- characters.
- */
-/* \fn template <typename A, typename B> QByteArray QStringBuilder<A, B>::toUtf8() const
- Returns a UTF-8 representation of the string as a QByteArray.
- */
-
-
-/*!
- \internal
- */
-void QAbstractConcatenable::convertFromAscii(const char *a, int len, QChar *&out) Q_DECL_NOTHROW
-{
- if (Q_UNLIKELY(len == -1)) {
- if (!a)
- return;
- len = int(strlen(a));
- }
- out = QUtf8::convertToUnicode(out, a, len);
-}
-
-QT_END_NAMESPACE
diff --git a/src/corelib/tools/qstringbuilder.h b/src/corelib/tools/qstringbuilder.h
deleted file mode 100644
index 1d96d70637..0000000000
--- a/src/corelib/tools/qstringbuilder.h
+++ /dev/null
@@ -1,494 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#ifndef QSTRINGBUILDER_H
-#define QSTRINGBUILDER_H
-
-#if 0
-// syncqt can not handle the templates in this file, and it doesn't need to
-// process them anyway because they are internal.
-#pragma qt_class(QStringBuilder)
-#pragma qt_sync_stop_processing
-#endif
-
-#include <QtCore/qstring.h>
-#include <QtCore/qbytearray.h>
-
-#include <string.h>
-
-QT_BEGIN_NAMESPACE
-
-
-struct Q_CORE_EXPORT QAbstractConcatenable
-{
-protected:
- static void convertFromAscii(const char *a, int len, QChar *&out) Q_DECL_NOTHROW;
- static inline void convertFromAscii(char a, QChar *&out) Q_DECL_NOTHROW
- {
- *out++ = QLatin1Char(a);
- }
- static void appendLatin1To(const char *a, int len, QChar *out) Q_DECL_NOTHROW;
-};
-
-template <typename T> struct QConcatenable {};
-
-namespace QtStringBuilder {
- template <typename A, typename B> struct ConvertToTypeHelper
- { typedef A ConvertTo; };
- template <typename T> struct ConvertToTypeHelper<T, QString>
- { typedef QString ConvertTo; };
-}
-
-template<typename Builder, typename T>
-struct QStringBuilderCommon
-{
- T toUpper() const { return resolved().toUpper(); }
- T toLower() const { return resolved().toLower(); }
-
-protected:
- T resolved() const { return *static_cast<const Builder*>(this); }
-};
-
-template<typename Builder, typename T>
-struct QStringBuilderBase : public QStringBuilderCommon<Builder, T>
-{
-};
-
-template<typename Builder>
-struct QStringBuilderBase<Builder, QString> : public QStringBuilderCommon<Builder, QString>
-{
- QByteArray toLatin1() const { return this->resolved().toLatin1(); }
- QByteArray toUtf8() const { return this->resolved().toUtf8(); }
- QByteArray toLocal8Bit() const { return this->resolved().toLocal8Bit(); }
-};
-
-template <typename A, typename B>
-class QStringBuilder : public QStringBuilderBase<QStringBuilder<A, B>, typename QtStringBuilder::ConvertToTypeHelper<typename QConcatenable<A>::ConvertTo, typename QConcatenable<B>::ConvertTo>::ConvertTo>
-{
-public:
- QStringBuilder(const A &a_, const B &b_) : a(a_), b(b_) {}
-private:
- friend class QByteArray;
- friend class QString;
- template <typename T> T convertTo() const
- {
- const uint len = QConcatenable< QStringBuilder<A, B> >::size(*this);
- T s(len, Qt::Uninitialized);
-
- // we abuse const_cast / constData here because we know we've just
- // allocated the data and we're the only reference count
- typename T::iterator d = const_cast<typename T::iterator>(s.constData());
- typename T::const_iterator const start = d;
- QConcatenable< QStringBuilder<A, B> >::appendTo(*this, d);
-
- if (!QConcatenable< QStringBuilder<A, B> >::ExactSize && int(len) != d - start) {
- // this resize is necessary since we allocate a bit too much
- // when dealing with variable sized 8-bit encodings
- s.resize(d - start);
- }
- return s;
- }
-
- typedef QConcatenable<QStringBuilder<A, B> > Concatenable;
- typedef typename Concatenable::ConvertTo ConvertTo;
-public:
- operator ConvertTo() const { return convertTo<ConvertTo>(); }
-
- int size() const { return Concatenable::size(*this); }
-
- const A &a;
- const B &b;
-};
-
-template <>
-class QStringBuilder <QString, QString> : public QStringBuilderBase<QStringBuilder<QString, QString>, QString>
-{
- public:
- QStringBuilder(const QString &a_, const QString &b_) : a(a_), b(b_) {}
- QStringBuilder(const QStringBuilder &other) : a(other.a), b(other.b) {}
-
- operator QString() const
- { QString r(a); r += b; return r; }
-
- const QString &a;
- const QString &b;
-
- private:
- QStringBuilder &operator=(const QStringBuilder &) Q_DECL_EQ_DELETE;
-};
-
-template <>
-class QStringBuilder <QByteArray, QByteArray> : public QStringBuilderBase<QStringBuilder<QByteArray, QByteArray>, QByteArray>
-{
- public:
- QStringBuilder(const QByteArray &a_, const QByteArray &b_) : a(a_), b(b_) {}
- QStringBuilder(const QStringBuilder &other) : a(other.a), b(other.b) {}
-
- operator QByteArray() const
- { QByteArray r(a); r += b; return r; }
-
- const QByteArray &a;
- const QByteArray &b;
-
- private:
- QStringBuilder &operator=(const QStringBuilder &) Q_DECL_EQ_DELETE;
-};
-
-
-template <> struct QConcatenable<char> : private QAbstractConcatenable
-{
- typedef char type;
- typedef QByteArray ConvertTo;
- enum { ExactSize = true };
- static int size(const char) { return 1; }
-#ifndef QT_NO_CAST_FROM_ASCII
- static inline QT_ASCII_CAST_WARN void appendTo(const char c, QChar *&out)
- {
- QAbstractConcatenable::convertFromAscii(c, out);
- }
-#endif
- static inline void appendTo(const char c, char *&out)
- { *out++ = c; }
-};
-
-#if defined(Q_COMPILER_UNICODE_STRINGS)
-template <> struct QConcatenable<char16_t> : private QAbstractConcatenable
-{
- typedef char16_t type;
- typedef QString ConvertTo;
- enum { ExactSize = true };
- static Q_DECL_CONSTEXPR int size(char16_t) { return 1; }
- static inline void appendTo(char16_t c, QChar *&out)
- { *out++ = c; }
-};
-#endif
-
-template <> struct QConcatenable<QLatin1Char>
-{
- typedef QLatin1Char type;
- typedef QString ConvertTo;
- enum { ExactSize = true };
- static int size(const QLatin1Char) { return 1; }
- static inline void appendTo(const QLatin1Char c, QChar *&out)
- { *out++ = c; }
- static inline void appendTo(const QLatin1Char c, char *&out)
- { *out++ = c.toLatin1(); }
-};
-
-template <> struct QConcatenable<QChar> : private QAbstractConcatenable
-{
- typedef QChar type;
- typedef QString ConvertTo;
- enum { ExactSize = true };
- static int size(const QChar) { return 1; }
- static inline void appendTo(const QChar c, QChar *&out)
- { *out++ = c; }
-};
-
-template <> struct QConcatenable<QChar::SpecialCharacter> : private QAbstractConcatenable
-{
- typedef QChar::SpecialCharacter type;
- typedef QString ConvertTo;
- enum { ExactSize = true };
- static int size(const QChar::SpecialCharacter) { return 1; }
- static inline void appendTo(const QChar::SpecialCharacter c, QChar *&out)
- { *out++ = c; }
-};
-
-template <> struct QConcatenable<QCharRef> : private QAbstractConcatenable
-{
- typedef QCharRef type;
- typedef QString ConvertTo;
- enum { ExactSize = true };
- static int size(QCharRef) { return 1; }
- static inline void appendTo(QCharRef c, QChar *&out)
- { *out++ = QChar(c); }
-};
-
-template <> struct QConcatenable<QLatin1String> : private QAbstractConcatenable
-{
- typedef QLatin1String type;
- typedef QString ConvertTo;
- enum { ExactSize = true };
- static int size(const QLatin1String a) { return a.size(); }
- static inline void appendTo(const QLatin1String a, QChar *&out)
- {
- appendLatin1To(a.latin1(), a.size(), out);
- out += a.size();
- }
- static inline void appendTo(const QLatin1String a, char *&out)
- {
- if (const char *data = a.data()) {
- memcpy(out, data, a.size());
- out += a.size();
- }
- }
-};
-
-template <> struct QConcatenable<QString> : private QAbstractConcatenable
-{
- typedef QString type;
- typedef QString ConvertTo;
- enum { ExactSize = true };
- static int size(const QString &a) { return a.size(); }
- static inline void appendTo(const QString &a, QChar *&out)
- {
- const int n = a.size();
- memcpy(out, reinterpret_cast<const char*>(a.constData()), sizeof(QChar) * n);
- out += n;
- }
-};
-
-template <> struct QConcatenable<QStringRef> : private QAbstractConcatenable
-{
- typedef QStringRef type;
- typedef QString ConvertTo;
- enum { ExactSize = true };
- static int size(const QStringRef &a) { return a.size(); }
- static inline void appendTo(const QStringRef &a, QChar *&out)
- {
- const int n = a.size();
- memcpy(out, reinterpret_cast<const char*>(a.constData()), sizeof(QChar) * n);
- out += n;
- }
-};
-
-template <> struct QConcatenable<QStringView> : private QAbstractConcatenable
-{
- typedef QStringView type;
- typedef QString ConvertTo;
- enum { ExactSize = true };
- static int size(QStringView a) { return a.length(); }
- static inline void appendTo(QStringView a, QChar *&out)
- {
- const auto n = a.size();
- memcpy(out, a.data(), sizeof(QChar) * n);
- out += n;
- }
-};
-
-template <int N> struct QConcatenable<const char[N]> : private QAbstractConcatenable
-{
- typedef const char type[N];
- typedef QByteArray ConvertTo;
- enum { ExactSize = false };
- static int size(const char[N]) { return N - 1; }
-#ifndef QT_NO_CAST_FROM_ASCII
- static inline void QT_ASCII_CAST_WARN appendTo(const char a[N], QChar *&out)
- {
- QAbstractConcatenable::convertFromAscii(a, N - 1, out);
- }
-#endif
- static inline void appendTo(const char a[N], char *&out)
- {
- while (*a)
- *out++ = *a++;
- }
-};
-
-template <int N> struct QConcatenable<char[N]> : QConcatenable<const char[N]>
-{
- typedef char type[N];
-};
-
-template <> struct QConcatenable<const char *> : private QAbstractConcatenable
-{
- typedef const char *type;
- typedef QByteArray ConvertTo;
- enum { ExactSize = false };
- static int size(const char *a) { return qstrlen(a); }
-#ifndef QT_NO_CAST_FROM_ASCII
- static inline void QT_ASCII_CAST_WARN appendTo(const char *a, QChar *&out)
- { QAbstractConcatenable::convertFromAscii(a, -1, out); }
-#endif
- static inline void appendTo(const char *a, char *&out)
- {
- if (!a)
- return;
- while (*a)
- *out++ = *a++;
- }
-};
-
-template <> struct QConcatenable<char *> : QConcatenable<const char*>
-{
- typedef char *type;
-};
-
-#if defined(Q_COMPILER_UNICODE_STRINGS)
-template <int N> struct QConcatenable<const char16_t[N]> : private QAbstractConcatenable
-{
- using type = const char16_t[N];
- using ConvertTo = QString;
- enum { ExactSize = true };
- static int size(const char16_t[N]) { return N - 1; }
- static void appendTo(const char16_t a[N], QChar *&out)
- {
- memcpy(out, a, (N - 1) * sizeof(char16_t));
- out += N - 1;
- }
-};
-
-template <int N> struct QConcatenable<char16_t[N]> : QConcatenable<const char16_t[N]>
-{
- using type = char16_t[N];
-};
-
-template <> struct QConcatenable<const char16_t *> : private QAbstractConcatenable
-{
- using type = const char16_t *;
- using ConvertTo = QString;
- enum { ExactSize = true };
- static int size(const char16_t *a) { return QStringView(a).length(); };
- static inline void QT_ASCII_CAST_WARN appendTo(const char16_t *a, QChar *&out)
- {
- if (!a)
- return;
- while (*a)
- *out++ = *a++;
- }
-};
-
-template <> struct QConcatenable<char16_t *> : QConcatenable<const char16_t*>
-{
- typedef char16_t *type;
-};
-#endif // UNICODE_STRINGS
-
-template <> struct QConcatenable<QByteArray> : private QAbstractConcatenable
-{
- typedef QByteArray type;
- typedef QByteArray ConvertTo;
- enum { ExactSize = false };
- static int size(const QByteArray &ba) { return ba.size(); }
-#ifndef QT_NO_CAST_FROM_ASCII
- static inline QT_ASCII_CAST_WARN void appendTo(const QByteArray &ba, QChar *&out)
- {
- QAbstractConcatenable::convertFromAscii(ba.constData(), ba.size(), out);
- }
-#endif
- static inline void appendTo(const QByteArray &ba, char *&out)
- {
- const char *a = ba.constData();
- const char * const end = ba.end();
- while (a != end)
- *out++ = *a++;
- }
-};
-
-
-template <typename A, typename B>
-struct QConcatenable< QStringBuilder<A, B> >
-{
- typedef QStringBuilder<A, B> type;
- typedef typename QtStringBuilder::ConvertToTypeHelper<typename QConcatenable<A>::ConvertTo, typename QConcatenable<B>::ConvertTo>::ConvertTo ConvertTo;
- enum { ExactSize = QConcatenable<A>::ExactSize && QConcatenable<B>::ExactSize };
- static int size(const type &p)
- {
- return QConcatenable<A>::size(p.a) + QConcatenable<B>::size(p.b);
- }
- template<typename T> static inline void appendTo(const type &p, T *&out)
- {
- QConcatenable<A>::appendTo(p.a, out);
- QConcatenable<B>::appendTo(p.b, out);
- }
-};
-
-template <typename A, typename B>
-QStringBuilder<typename QConcatenable<A>::type, typename QConcatenable<B>::type>
-operator%(const A &a, const B &b)
-{
- return QStringBuilder<typename QConcatenable<A>::type, typename QConcatenable<B>::type>(a, b);
-}
-
-// QT_USE_FAST_OPERATOR_PLUS was introduced in 4.7, QT_USE_QSTRINGBUILDER is to be used from 4.8 onwards
-// QT_USE_FAST_OPERATOR_PLUS does not remove the normal operator+ for QByteArray
-#if defined(QT_USE_FAST_OPERATOR_PLUS) || defined(QT_USE_QSTRINGBUILDER)
-template <typename A, typename B>
-QStringBuilder<typename QConcatenable<A>::type, typename QConcatenable<B>::type>
-operator+(const A &a, const B &b)
-{
- return QStringBuilder<typename QConcatenable<A>::type, typename QConcatenable<B>::type>(a, b);
-}
-#endif
-
-namespace QtStringBuilder {
-template <typename A, typename B>
-QByteArray &appendToByteArray(QByteArray &a, const QStringBuilder<A, B> &b, char)
-{
- // append 8-bit data to a byte array
- int len = a.size() + QConcatenable< QStringBuilder<A, B> >::size(b);
- a.reserve(len);
- char *it = a.data() + a.size();
- QConcatenable< QStringBuilder<A, B> >::appendTo(b, it);
- a.resize(len); //we need to resize after the appendTo for the case str+=foo+str
- return a;
-}
-
-#ifndef QT_NO_CAST_TO_ASCII
-template <typename A, typename B>
-QByteArray &appendToByteArray(QByteArray &a, const QStringBuilder<A, B> &b, QChar)
-{
- return a += QString(b).toUtf8();
-}
-#endif
-}
-
-template <typename A, typename B>
-QByteArray &operator+=(QByteArray &a, const QStringBuilder<A, B> &b)
-{
- return QtStringBuilder::appendToByteArray(a, b,
- typename QConcatenable< QStringBuilder<A, B> >::ConvertTo::value_type());
-}
-
-template <typename A, typename B>
-QString &operator+=(QString &a, const QStringBuilder<A, B> &b)
-{
- int len = a.size() + QConcatenable< QStringBuilder<A, B> >::size(b);
- a.reserve(len);
- QChar *it = a.data() + a.size();
- QConcatenable< QStringBuilder<A, B> >::appendTo(b, it);
- a.resize(int(it - a.constData())); //may be smaller than len if there was conversion from utf8
- return a;
-}
-
-
-QT_END_NAMESPACE
-
-#endif // QSTRINGBUILDER_H
diff --git a/src/corelib/tools/qstringiterator.qdoc b/src/corelib/tools/qstringiterator.qdoc
deleted file mode 100644
index 9d7c54ce9f..0000000000
--- a/src/corelib/tools/qstringiterator.qdoc
+++ /dev/null
@@ -1,314 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2014 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.com, author Giuseppe D'Angelo <giuseppe.dangelo@kdab.com>
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the documentation of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:FDL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Free Documentation License Usage
-** Alternatively, this file may be used under the terms of the GNU Free
-** Documentation License version 1.3 as published by the Free Software
-** Foundation and appearing in the file included in the packaging of
-** this file. Please review the following information to ensure
-** the GNU Free Documentation License version 1.3 requirements
-** will be met: https://www.gnu.org/licenses/fdl-1.3.html.
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-/*!
- \class QStringIterator
- \since 5.3
- \inmodule QtCore
- \ingroup tools
-
- \internal
-
- \brief The QStringIterator class provides a Unicode-aware iterator over QString.
-
- \reentrant
-
- QStringIterator is a Java-like, bidirectional, const iterator over the contents of a
- QString. Unlike QString's own iterators, which manage the individual UTF-16 code units,
- QStringIterator is Unicode-aware: it will transparently handle the \e{surrogate pairs}
- that may be present in a QString, and return the individual Unicode code points.
-
- You can create a QStringIterator that iterates over a given
- QStringView by passing the string to the QStringIterator's constructor:
-
- \snippet code/src_corelib_tools_qstringiterator.cpp 0
-
- A newly created QStringIterator will point before the first position in the
- string. It is possible to check whether the iterator can be advanced by
- calling hasNext(), and actually advance it (and obtain the next code point)
- by calling next():
-
- \snippet code/src_corelib_tools_qstringiterator.cpp 1
-
- Similarly, the hasPrevious() and previous() functions can be used to iterate backwards.
-
- The peekNext() and peekPrevious() functions will return the code point
- respectively after and behind the iterator's current position, but unlike
- next() and previous() they will not move the iterator.
- Similarly, the advance() and recede() functions will move the iterator
- respectively after and behind the iterator's current position, but they
- will not return the code point the iterator has moved through.
-
- \section1 Unicode Handling
-
- QString and all of its functions work in terms of UTF-16 code units. Unicode code points
- that fall outside the Basic Multilingual Plane (U+10000 to U+10FFFF) will therefore
- be represented by \e{surrogate pairs} in a QString, that is, a sequence of two
- UTF-16 code units that encode a single code point.
-
- QStringIterator will automatically handle surrogate pairs inside a QString,
- and return the correctly decoded code point, while also moving the iterator by
- the right amount of code units to match the decoded code points.
-
- For instance:
-
- \snippet code/src_corelib_tools_qstringiterator.cpp 2
-
- If the iterator is not able to decode the next code point (or the previous
- one, when iterating backwards), then it will return \c{0xFFFD}, that is,
- Unicode's replacement character (see QChar::ReplacementCharacter).
- It is possible to make QStringIterator return another value when it encounters
- a decoding problem; please refer to the each function documentation for
- more details.
-
- \section1 Unchecked Iteration
-
- It is possible to optimize iterating over a QString contents by skipping
- some checks. This is in general not safe to do, because a QString is allowed
- to contain malformed UTF-16 data; however, if we can trust a given QString,
- then we can use the optimized \e{unchecked} functions.
-
- QStringIterator provides the \e{unchecked} counterparts for next(),
- peekNext(), advance(), previous(), peekPrevious(), and recede():
- they're called, respectively,
- nextUnchecked(), peekNextUnchecked(), advanceUnchecked(),
- previousUnchecked(), peekPreviousUnchecked(), recedeUnchecked().
- The counterparts work exactly like the original ones,
- but they're faster as they're allowed to make certain assumptions about
- the string contents.
-
- \note please be extremely careful when using QStringIterator's unchecked functions,
- as using them on a string containing malformed data leads to undefined behavior.
-
- \sa QString, QChar
-*/
-
-/*!
- \fn QStringIterator::QStringIterator(QStringView string, qsizetype idx)
-
- Constructs an iterator over the contents of \a string. The iterator will point
- before position \a idx in the string.
-
- The string view \a string must remain valid while the iterator is being used.
-*/
-
-/*!
- \fn QStringIterator::QStringIterator(const QChar *begin, const QChar *end)
-
- Constructs an iterator which iterates over the range from \a begin to \a end.
- The iterator will point before \a begin.
-
- The range from \a begin to \a end must remain valid while the iterator is being used.
-*/
-
-/*!
- \fn QString::const_iterator QStringIterator::position() const
-
- Returns the current position of the iterator.
-*/
-
-/*!
- \fn void QStringIterator::setPosition(QString::const_iterator position)
-
- Sets the iterator's current position to \a position, which must be inside
- of the iterable range.
-*/
-
-/*!
- \fn bool QStringIterator::hasNext() const
-
- Returns true if the iterator has not reached the end of the valid iterable range
- and therefore can move forward; false otherwise.
-
- \sa next()
-*/
-
-/*!
- \fn void QStringIterator::advance()
-
- Advances the iterator by one Unicode code point.
-
- \note calling this function when the iterator is past the end of the iterable range
- leads to undefined behavior.
-
- \sa next(), hasNext()
-*/
-
-/*!
- \fn void QStringIterator::advanceUnchecked()
-
- Advances the iterator by one Unicode code point.
-
- \note calling this function when the iterator is past the end of the iterable range
- or on a QString containing malformed UTF-16 data leads to undefined behavior.
-
- \sa advance(), next(), hasNext()
-*/
-
-/*!
- \fn uint QStringIterator::peekNextUnchecked() const
-
- Returns the Unicode code point that is immediately after the iterator's current
- position. The current position is not changed.
-
- \note calling this function when the iterator is past the end of the iterable range
- or on a QString containing malformed UTF-16 data leads to undefined behavior.
-
- \sa peekNext(), next(), hasNext()
-*/
-
-/*!
- \fn uint QStringIterator::peekNext(uint invalidAs = QChar::ReplacementCharacter) const
-
- Returns the Unicode code point that is immediately after the iterator's current
- position. The current position is not changed.
-
- If the iterator is not able to decode the UTF-16 data after the iterator's current
- position, this function returns \a invalidAs (by default, QChar::ReplacementCharacter,
- which corresponds to \c{U+FFFD}).
-
- \note calling this function when the iterator is past the end of the iterable range
- leads to undefined behavior.
-
- \sa next(), hasNext()
-*/
-
-/*!
- \fn uint QStringIterator::nextUnchecked()
-
- Advances the iterator's current position by one Unicode code point,
- and returns the Unicode code point that gets pointed by the iterator.
-
- \note calling this function when the iterator is past the end of the iterable range
- or on a QString containing malformed UTF-16 data leads to undefined behavior.
-
- \sa next(), hasNext()
-*/
-
-/*!
- \fn uint QStringIterator::next(uint invalidAs = QChar::ReplacementCharacter)
-
- Advances the iterator's current position by one Unicode code point,
- and returns the Unicode code point that gets pointed by the iterator.
-
- If the iterator is not able to decode the UTF-16 data at the iterator's current
- position, this function returns \a invalidAs (by default, QChar::ReplacementCharacter,
- which corresponds to \c{U+FFFD}).
-
- \note calling this function when the iterator is past the end of the iterable range
- leads to undefined behavior.
-
- \sa peekNext(), hasNext()
-*/
-
-
-/*!
- \fn bool QStringIterator::hasPrevious() const
-
- Returns true if the iterator is after the beginning of the valid iterable range
- and therefore can move backwards; false otherwise.
-
- \sa previous()
-*/
-
-/*!
- \fn void QStringIterator::recede()
-
- Moves the iterator back by one Unicode code point.
-
- \note calling this function when the iterator is before the beginning of the iterable range
- leads to undefined behavior.
-
- \sa previous(), hasPrevious()
-*/
-
-/*!
- \fn void QStringIterator::recedeUnchecked()
-
- Moves the iterator back by one Unicode code point.
-
- \note calling this function when the iterator is before the beginning of the iterable range
- or on a QString containing malformed UTF-16 data leads to undefined behavior.
-
- \sa recede(), previous(), hasPrevious()
-*/
-
-/*!
- \fn uint QStringIterator::peekPreviousUnchecked() const
-
- Returns the Unicode code point that is immediately before the iterator's current
- position. The current position is not changed.
-
- \note calling this function when the iterator is before the beginning of the iterable range
- or on a QString containing malformed UTF-16 data leads to undefined behavior.
-
- \sa previous(), hasPrevious()
-*/
-
-/*!
- \fn uint QStringIterator::peekPrevious(uint invalidAs = QChar::ReplacementCharacter) const
-
- Returns the Unicode code point that is immediately before the iterator's current
- position. The current position is not changed.
-
- If the iterator is not able to decode the UTF-16 data before the iterator's current
- position, this function returns \a invalidAs (by default, QChar::ReplacementCharacter,
- which corresponds to \c{U+FFFD}).
-
- \note calling this function when the iterator is before the beginning of the iterable range
- leads to undefined behavior.
-
- \sa previous(), hasPrevious()
-*/
-
-/*!
- \fn uint QStringIterator::previousUnchecked()
-
- Moves the iterator's current position back by one Unicode code point,
- and returns the Unicode code point that gets pointed by the iterator.
-
- \note calling this function when the iterator is before the beginning of the iterable range
- or on a QString containing malformed UTF-16 data leads to undefined behavior.
-
- \sa previous(), hasPrevious()
-*/
-
-/*!
- \fn uint QStringIterator::previous(uint invalidAs = QChar::ReplacementCharacter)
-
- Moves the iterator's current position back by one Unicode code point,
- and returns the Unicode code point that gets pointed by the iterator.
-
- If the iterator is not able to decode the UTF-16 data at the iterator's current
- position, this function returns \a invalidAs (by default, QChar::ReplacementCharacter,
- which corresponds to \c{U+FFFD}).
-
- \note calling this function when the iterator is before the beginning of the iterable range
- leads to undefined behavior.
-
- \sa peekPrevious(), hasPrevious()
-*/
diff --git a/src/corelib/tools/qstringiterator_p.h b/src/corelib/tools/qstringiterator_p.h
deleted file mode 100644
index 219589b6e4..0000000000
--- a/src/corelib/tools/qstringiterator_p.h
+++ /dev/null
@@ -1,255 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Copyright (C) 2014 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.com, author Giuseppe D'Angelo <giuseppe.dangelo@kdab.com>
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#ifndef QSTRINGITERATOR_H
-#define QSTRINGITERATOR_H
-
-//
-// W A R N I N G
-// -------------
-//
-// This file is not part of the Qt API. It exists purely as an
-// implementation detail. This header file may change from version to
-// version without notice, or even be removed.
-//
-// We mean it.
-//
-
-#include <QtCore/private/qglobal_p.h>
-#include <QtCore/qstring.h>
-
-QT_BEGIN_NAMESPACE
-
-class QStringIterator
-{
- QString::const_iterator i, pos, e;
- Q_STATIC_ASSERT((std::is_same<QString::const_iterator, const QChar *>::value));
-public:
- explicit QStringIterator(QStringView string, qsizetype idx = 0)
- : i(string.begin()),
- pos(i + idx),
- e(string.end())
- {
- }
-
- inline explicit QStringIterator(const QChar *begin, const QChar *end)
- : i(begin),
- pos(begin),
- e(end)
- {
- }
-
- inline explicit QStringIterator(const QChar *begin, int idx, const QChar *end)
- : i(begin),
- pos(begin + idx),
- e(end)
- {
- }
-
- inline QString::const_iterator position() const
- {
- return pos;
- }
-
- inline int index() const
- {
- return pos - i;
- }
-
- inline void setPosition(QString::const_iterator position)
- {
- Q_ASSERT_X(i <= position && position <= e, Q_FUNC_INFO, "position out of bounds");
- pos = position;
- }
-
- // forward iteration
-
- inline bool hasNext() const
- {
- return pos < e;
- }
-
- inline void advance()
- {
- Q_ASSERT_X(hasNext(), Q_FUNC_INFO, "iterator hasn't a next item");
-
- if (Q_UNLIKELY((pos++)->isHighSurrogate())) {
- if (Q_LIKELY(pos != e && pos->isLowSurrogate()))
- ++pos;
- }
- }
-
- inline void advanceUnchecked()
- {
- Q_ASSERT_X(hasNext(), Q_FUNC_INFO, "iterator hasn't a next item");
-
- if (Q_UNLIKELY((pos++)->isHighSurrogate()))
- ++pos;
- }
-
- inline uint peekNextUnchecked() const
- {
- Q_ASSERT_X(hasNext(), Q_FUNC_INFO, "iterator hasn't a next item");
-
- if (Q_UNLIKELY(pos->isHighSurrogate()))
- return QChar::surrogateToUcs4(pos[0], pos[1]);
-
- return pos->unicode();
- }
-
- inline uint peekNext(uint invalidAs = QChar::ReplacementCharacter) const
- {
- Q_ASSERT_X(hasNext(), Q_FUNC_INFO, "iterator hasn't a next item");
-
- if (Q_UNLIKELY(pos->isSurrogate())) {
- if (Q_LIKELY(pos->isHighSurrogate())) {
- const QChar *low = pos + 1;
- if (Q_LIKELY(low != e && low->isLowSurrogate()))
- return QChar::surrogateToUcs4(*pos, *low);
- }
- return invalidAs;
- }
-
- return pos->unicode();
- }
-
- inline uint nextUnchecked()
- {
- Q_ASSERT_X(hasNext(), Q_FUNC_INFO, "iterator hasn't a next item");
-
- const QChar cur = *pos++;
- if (Q_UNLIKELY(cur.isHighSurrogate()))
- return QChar::surrogateToUcs4(cur, *pos++);
- return cur.unicode();
- }
-
- inline uint next(uint invalidAs = QChar::ReplacementCharacter)
- {
- Q_ASSERT_X(hasNext(), Q_FUNC_INFO, "iterator hasn't a next item");
-
- const QChar uc = *pos++;
- if (Q_UNLIKELY(uc.isSurrogate())) {
- if (Q_LIKELY(uc.isHighSurrogate() && pos < e && pos->isLowSurrogate()))
- return QChar::surrogateToUcs4(uc, *pos++);
- return invalidAs;
- }
-
- return uc.unicode();
- }
-
- // backwards iteration
-
- inline bool hasPrevious() const
- {
- return pos > i;
- }
-
- inline void recede()
- {
- Q_ASSERT_X(hasPrevious(), Q_FUNC_INFO, "iterator hasn't a previous item");
-
- if (Q_UNLIKELY((--pos)->isLowSurrogate())) {
- const QChar *high = pos - 1;
- if (Q_LIKELY(high != i - 1 && high->isHighSurrogate()))
- --pos;
- }
- }
-
- inline void recedeUnchecked()
- {
- Q_ASSERT_X(hasPrevious(), Q_FUNC_INFO, "iterator hasn't a previous item");
-
- if (Q_UNLIKELY((--pos)->isLowSurrogate()))
- --pos;
- }
-
- inline uint peekPreviousUnchecked() const
- {
- Q_ASSERT_X(hasPrevious(), Q_FUNC_INFO, "iterator hasn't a previous item");
-
- if (Q_UNLIKELY(pos[-1].isLowSurrogate()))
- return QChar::surrogateToUcs4(pos[-2], pos[-1]);
- return pos[-1].unicode();
- }
-
- inline uint peekPrevious(uint invalidAs = QChar::ReplacementCharacter) const
- {
- Q_ASSERT_X(hasPrevious(), Q_FUNC_INFO, "iterator hasn't a previous item");
-
- if (Q_UNLIKELY(pos[-1].isSurrogate())) {
- if (Q_LIKELY(pos[-1].isLowSurrogate())) {
- const QChar *high = pos - 2;
- if (Q_LIKELY(high != i - 1 && high->isHighSurrogate()))
- return QChar::surrogateToUcs4(*high, pos[-1]);
- }
- return invalidAs;
- }
-
- return pos[-1].unicode();
- }
-
- inline uint previousUnchecked()
- {
- Q_ASSERT_X(hasPrevious(), Q_FUNC_INFO, "iterator hasn't a previous item");
-
- const QChar cur = *--pos;
- if (Q_UNLIKELY(cur.isLowSurrogate()))
- return QChar::surrogateToUcs4(*--pos, cur);
- return cur.unicode();
- }
-
- inline uint previous(uint invalidAs = QChar::ReplacementCharacter)
- {
- Q_ASSERT_X(hasPrevious(), Q_FUNC_INFO, "iterator hasn't a previous item");
-
- const QChar uc = *--pos;
- if (Q_UNLIKELY(uc.isSurrogate())) {
- if (Q_LIKELY(uc.isLowSurrogate() && pos > i && pos[-1].isHighSurrogate()))
- return QChar::surrogateToUcs4(*--pos, uc);
- return invalidAs;
- }
-
- return uc.unicode();
- }
-};
-
-QT_END_NAMESPACE
-
-#endif // QSTRINGITERATOR_H
diff --git a/src/corelib/tools/qstringlist.cpp b/src/corelib/tools/qstringlist.cpp
deleted file mode 100644
index cc6eaf8ad2..0000000000
--- a/src/corelib/tools/qstringlist.cpp
+++ /dev/null
@@ -1,851 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#include <qstringlist.h>
-#include <qset.h>
-#if QT_CONFIG(regularexpression)
-# include <qregularexpression.h>
-#endif
-
-#include <algorithm>
-
-QT_BEGIN_NAMESPACE
-
-/*! \typedef QStringListIterator
- \relates QStringList
-
- The QStringListIterator type definition provides a Java-style const
- iterator for QStringList.
-
- QStringList provides both \l{Java-style iterators} and
- \l{STL-style iterators}. The Java-style const iterator is simply
- a type definition for QListIterator<QString>.
-
- \sa QMutableStringListIterator, QStringList::const_iterator
-*/
-
-/*! \typedef QMutableStringListIterator
- \relates QStringList
-
- The QStringListIterator type definition provides a Java-style
- non-const iterator for QStringList.
-
- QStringList provides both \l{Java-style iterators} and
- \l{STL-style iterators}. The Java-style non-const iterator is
- simply a type definition for QMutableListIterator<QString>.
-
- \sa QStringListIterator, QStringList::iterator
-*/
-
-/*!
- \class QStringList
- \inmodule QtCore
- \brief The QStringList class provides a list of strings.
-
- \ingroup tools
- \ingroup shared
- \ingroup string-processing
-
- \reentrant
-
- QStringList inherits from QList<QString>. Like QList, QStringList is
- \l{implicitly shared}. It provides fast index-based access as well as fast
- insertions and removals. Passing string lists as value parameters is both
- fast and safe.
-
- All of QList's functionality also applies to QStringList. For example, you
- can use isEmpty() to test whether the list is empty, and you can call
- functions like append(), prepend(), insert(), replace(), removeAll(),
- removeAt(), removeFirst(), removeLast(), and removeOne() to modify a
- QStringList. In addition, QStringList provides a few convenience
- functions that make handling lists of strings easier:
-
- \tableofcontents
-
- \section1 Initializing
-
- The default constructor creates an empty list. You can use the
- initializer-list constructor to create a list with elements:
-
- \snippet qstringlist/main.cpp 0a
-
- \section1 Adding Strings
-
- Strings can be added to a list using the \l
- {QList::insert()}{insert()} \l
- {QList::append()}{append()}, \l
- {QList::operator+=()}{operator+=()} and \l
- {operator<<()} functions.
-
- \l{operator<<()} can be used to
- conveniently add multiple elements to a list:
-
- \snippet qstringlist/main.cpp 0b
-
- \section1 Iterating Over the Strings
-
- To iterate over a list, you can either use index positions or
- QList's Java-style and STL-style iterator types:
-
- Indexing:
-
- \snippet qstringlist/main.cpp 1
-
- Java-style iterator:
-
- \snippet qstringlist/main.cpp 2
-
- STL-style iterator:
-
- \snippet qstringlist/main.cpp 3
-
- The QStringListIterator class is simply a type definition for
- QListIterator<QString>. QStringList also provide the
- QMutableStringListIterator class which is a type definition for
- QMutableListIterator<QString>.
-
- \section1 Manipulating the Strings
-
- QStringList provides several functions allowing you to manipulate
- the contents of a list. You can concatenate all the strings in a
- string list into a single string (with an optional separator)
- using the join() function. For example:
-
- \snippet qstringlist/main.cpp 4
-
- The argument to join can be a single character or a string.
-
- To break up a string into a string list, use the QString::split()
- function:
-
- \snippet qstringlist/main.cpp 6
-
- The argument to split can be a single character, a string, a
- QRegularExpression or a (deprecated) QRegExp.
-
- In addition, the \l {QStringList::operator+()}{operator+()}
- function allows you to concatenate two string lists into one. To
- sort a string list, use the sort() function.
-
- QString list also provides the filter() function which lets you
- to extract a new list which contains only those strings which
- contain a particular substring (or match a particular regular
- expression):
-
- \snippet qstringlist/main.cpp 7
-
- The contains() function tells you whether the list contains a
- given string, while the indexOf() function returns the index of
- the first occurrence of the given string. The lastIndexOf()
- function on the other hand, returns the index of the last
- occurrence of the string.
-
- Finally, the replaceInStrings() function calls QString::replace()
- on each string in the string list in turn. For example:
-
- \snippet qstringlist/main.cpp 8
-
- \sa QString
-*/
-
-/*!
- \fn QStringList::QStringList()
-
- Constructs an empty string list.
-*/
-
-/*!
- \fn QStringList::QStringList(const QString &str)
-
- Constructs a string list that contains the given string, \a
- str. Longer lists are easily created like this:
-
- \snippet qstringlist/main.cpp 9
-
- \sa append()
-*/
-
-/*!
- \fn QStringList::QStringList(const QList<QString> &other)
-
- Constructs a copy of \a other.
-
- This operation takes \l{constant time}, because QStringList is
- \l{implicitly shared}. This makes returning a QStringList from a
- function very fast. If a shared instance is modified, it will be
- copied (copy-on-write), and that takes \l{linear time}.
-
- \sa operator=()
-*/
-
-/*!
- \fn QStringList::QStringList(QList<QString> &&other)
- \overload
- \since 5.4
-
- Move-constructs from QList<QString>.
-
- After a successful construction, \a other will be empty.
-*/
-
-/*!
- \fn QStringList &QStringList::operator=(const QList<QString> &other)
- \since 5.4
-
- Copy assignment operator from QList<QString>. Assigns the \a other
- list of strings to this string list.
-
- After the operation, \a other and \c *this will be equal.
-*/
-
-/*!
- \fn QStringList &QStringList::operator=(QList<QString> &&other)
- \overload
- \since 5.4
-
- Move assignment operator from QList<QString>. Moves the \a other
- list of strings to this string list.
-
- After the operation, \a other will be empty.
-*/
-
-/*!
- \fn void QStringList::sort(Qt::CaseSensitivity cs)
-
- Sorts the list of strings in ascending order.
- If \a cs is \l Qt::CaseSensitive (the default), the string comparison
- is case sensitive; otherwise the comparison is case insensitive.
-
- Sorting is performed using the STL's std::sort() algorithm,
- which averages \l{linear-logarithmic time}, i.e. O(\e{n} log \e{n}).
-
- If you want to sort your strings in an arbitrary order, consider
- using the QMap class. For example, you could use a QMap<QString,
- QString> to create a case-insensitive ordering (e.g. with the keys
- being lower-case versions of the strings, and the values being the
- strings), or a QMap<int, QString> to sort the strings by some
- integer index.
-*/
-
-namespace {
-struct CaseInsensitiveLessThan {
- typedef bool result_type;
- result_type operator()(const QString &s1, const QString &s2) const
- {
- return s1.compare(s2, Qt::CaseInsensitive) < 0;
- }
-};
-}
-
-void QtPrivate::QStringList_sort(QStringList *that, Qt::CaseSensitivity cs)
-{
- if (cs == Qt::CaseSensitive)
- std::sort(that->begin(), that->end());
- else
- std::sort(that->begin(), that->end(), CaseInsensitiveLessThan());
-}
-
-
-/*!
- \fn QStringList QStringList::filter(const QString &str, Qt::CaseSensitivity cs) const
-
- Returns a list of all the strings containing the substring \a str.
-
- If \a cs is \l Qt::CaseSensitive (the default), the string
- comparison is case sensitive; otherwise the comparison is case
- insensitive.
-
- \snippet qstringlist/main.cpp 5
- \snippet qstringlist/main.cpp 10
-
- This is equivalent to
-
- \snippet qstringlist/main.cpp 11
- \snippet qstringlist/main.cpp 12
-
- \sa contains()
-*/
-QStringList QtPrivate::QStringList_filter(const QStringList *that, const QString &str,
- Qt::CaseSensitivity cs)
-{
- QStringMatcher matcher(str, cs);
- QStringList res;
- for (int i = 0; i < that->size(); ++i)
- if (matcher.indexIn(that->at(i)) != -1)
- res << that->at(i);
- return res;
-}
-
-template<typename T>
-static bool stringList_contains(const QStringList &stringList, const T &str, Qt::CaseSensitivity cs)
-{
- for (const auto &string : stringList) {
- if (string.size() == str.size() && string.compare(str, cs) == 0)
- return true;
- }
- return false;
-}
-
-
-#if QT_STRINGVIEW_LEVEL < 2
-/*!
- \fn bool QStringList::contains(const QString &str, Qt::CaseSensitivity cs) const
-
- Returns \c true if the list contains the string \a str; otherwise
- returns \c false. The search is case insensitive if \a cs is
- Qt::CaseInsensitive; the search is case sensitive by default.
-
- \sa indexOf(), lastIndexOf(), QString::contains()
- */
-#endif
-
-#if QT_VERSION < QT_VERSION_CHECK(6, 0, 0)
-/// Not really needed anymore, but kept for binary compatibility
-bool QtPrivate::QStringList_contains(const QStringList *that, const QString &str,
- Qt::CaseSensitivity cs)
-{
- return stringList_contains(*that, str, cs);
-}
-#endif
-
-/*!
- \fn bool QStringList::contains(QStringView str, Qt::CaseSensitivity cs) const
- \overload
- \since 5.12
-
- Returns \c true if the list contains the string \a str; otherwise
- returns \c false. The search is case insensitive if \a cs is
- Qt::CaseInsensitive; the search is case sensitive by default.
- */
-bool QtPrivate::QStringList_contains(const QStringList *that, QStringView str,
- Qt::CaseSensitivity cs)
-{
- return stringList_contains(*that, str, cs);
-}
-
-/*!
- \fn bool QStringList::contains(QLatin1String str, Qt::CaseSensitivity cs) const
- \overload
- \since 5.10
-
- Returns \c true if the list contains the string \a str; otherwise
- returns \c false. The search is case insensitive if \a cs is
- Qt::CaseInsensitive; the search is case sensitive by default.
-
- \sa indexOf(), lastIndexOf(), QString::contains()
- */
-bool QtPrivate::QStringList_contains(const QStringList *that, QLatin1String str,
- Qt::CaseSensitivity cs)
-{
- return stringList_contains(*that, str, cs);
-}
-
-/*!
- \fn bool QStringList::indexOf(QStringView str, int from) const
- \overload
- \since 5.13
-
- Returns the index position of the first occurrence of \a str in
- the list, searching forward from index position \a from. Returns
- -1 if no item matched.
-
- \sa lastIndexOf(), contains()
- */
-
-/*!
- \fn bool QStringList::indexOf(QLatin1String str, int from) const
- \overload
- \since 5.13
-
- Returns the index position of the first occurrence of \a str in
- the list, searching forward from index position \a from. Returns
- -1 if no item matched.
-
- \sa lastIndexOf(), contains()
- */
-
-/*!
- \fn bool QStringList::lastIndexOf(QStringView str, int from) const
- \overload
- \since 5.13
-
- Returns the index position of the last occurrence of \a str in
- the list, searching backward from index position \a from. If \a
- from is -1 (the default), the search starts at the last item.
- Returns -1 if no item matched.
-
- \sa indexOf(), contains()
- */
-
-/*!
- \fn bool QStringList::lastIndexOf(QLatin1String str, int from) const
- \overload
- \since 5.13
-
- Returns the index position of the last occurrence of \a str in
- the list, searching backward from index position \a from. If \a
- from is -1 (the default), the search starts at the last item.
- Returns -1 if no item matched.
-
- \sa indexOf(), contains()
- */
-
-#ifndef QT_NO_REGEXP
-/*!
- \fn QStringList QStringList::filter(const QRegExp &rx) const
-
- \overload
-
- Returns a list of all the strings that match the regular
- expression \a rx.
-*/
-QStringList QtPrivate::QStringList_filter(const QStringList *that, const QRegExp &rx)
-{
- QStringList res;
- for (int i = 0; i < that->size(); ++i)
- if (that->at(i).contains(rx))
- res << that->at(i);
- return res;
-}
-#endif
-
-#if QT_CONFIG(regularexpression)
-/*!
- \fn QStringList QStringList::filter(const QRegularExpression &re) const
- \overload
- \since 5.0
-
- Returns a list of all the strings that match the regular
- expression \a re.
-*/
-QStringList QtPrivate::QStringList_filter(const QStringList *that, const QRegularExpression &re)
-{
- QStringList res;
- for (int i = 0; i < that->size(); ++i) {
- if (that->at(i).contains(re))
- res << that->at(i);
- }
- return res;
-}
-#endif // QT_CONFIG(regularexpression)
-
-/*!
- \fn QStringList &QStringList::replaceInStrings(const QString &before, const QString &after, Qt::CaseSensitivity cs)
-
- Returns a string list where every string has had the \a before
- text replaced with the \a after text wherever the \a before text
- is found. The \a before text is matched case-sensitively or not
- depending on the \a cs flag.
-
- For example:
-
- \snippet qstringlist/main.cpp 5
- \snippet qstringlist/main.cpp 13
-
- \sa QString::replace()
-*/
-void QtPrivate::QStringList_replaceInStrings(QStringList *that, const QString &before,
- const QString &after, Qt::CaseSensitivity cs)
-{
- for (int i = 0; i < that->size(); ++i)
- (*that)[i].replace(before, after, cs);
-}
-
-
-#ifndef QT_NO_REGEXP
-/*!
- \fn QStringList &QStringList::replaceInStrings(const QRegExp &rx, const QString &after)
- \overload
-
- Replaces every occurrence of the regexp \a rx, in each of the
- string lists's strings, with \a after. Returns a reference to the
- string list.
-
- For example:
-
- \snippet qstringlist/main.cpp 5
- \snippet qstringlist/main.cpp 14
-
- For regular expressions that contain \l{capturing parentheses},
- occurrences of \b{\\1}, \b{\\2}, ..., in \a after are
- replaced with \a{rx}.cap(1), \a{rx}.cap(2), ...
-
- For example:
-
- \snippet qstringlist/main.cpp 5
- \snippet qstringlist/main.cpp 15
-*/
-void QtPrivate::QStringList_replaceInStrings(QStringList *that, const QRegExp &rx, const QString &after)
-{
- for (int i = 0; i < that->size(); ++i)
- (*that)[i].replace(rx, after);
-}
-#endif
-
-#if QT_CONFIG(regularexpression)
-/*!
- \fn QStringList &QStringList::replaceInStrings(const QRegularExpression &re, const QString &after)
- \overload
- \since 5.0
-
- Replaces every occurrence of the regular expression \a re, in each of the
- string lists's strings, with \a after. Returns a reference to the string
- list.
-
- For example:
-
- \snippet qstringlist/main.cpp 5
- \snippet qstringlist/main.cpp 16
-
- For regular expressions that contain capturing groups,
- occurrences of \b{\\1}, \b{\\2}, ..., in \a after are
- replaced with the string captured by the corresponding capturing group.
-
- For example:
-
- \snippet qstringlist/main.cpp 5
- \snippet qstringlist/main.cpp 17
-*/
-void QtPrivate::QStringList_replaceInStrings(QStringList *that, const QRegularExpression &re, const QString &after)
-{
- for (int i = 0; i < that->size(); ++i)
- (*that)[i].replace(re, after);
-}
-#endif // QT_CONFIG(regularexpression)
-
-static int accumulatedSize(const QStringList &list, int seplen)
-{
- int result = 0;
- if (!list.isEmpty()) {
- for (const auto &e : list)
- result += e.size() + seplen;
- result -= seplen;
- }
- return result;
-}
-
-/*!
- \fn QString QStringList::join(const QString &separator) const
-
- Joins all the string list's strings into a single string with each
- element separated by the given \a separator (which can be an
- empty string).
-
- \sa QString::split()
-*/
-
-/*!
- \fn QString QStringList::join(QChar separator) const
- \since 5.0
- \overload join()
-*/
-QString QtPrivate::QStringList_join(const QStringList *that, const QChar *sep, int seplen)
-{
- const int totalLength = accumulatedSize(*that, seplen);
- const int size = that->size();
-
- QString res;
- if (totalLength == 0)
- return res;
- res.reserve(totalLength);
- for (int i = 0; i < size; ++i) {
- if (i)
- res.append(sep, seplen);
- res += that->at(i);
- }
- return res;
-}
-
-/*!
- \fn QString QStringList::join(QLatin1String separator) const
- \since 5.8
- \overload join()
-*/
-QString QtPrivate::QStringList_join(const QStringList &list, QLatin1String sep)
-{
- QString result;
- if (!list.isEmpty()) {
- result.reserve(accumulatedSize(list, sep.size()));
- const auto end = list.end();
- auto it = list.begin();
- result += *it;
- while (++it != end) {
- result += sep;
- result += *it;
- }
- }
- return result;
-}
-
-/*!
- \fn QStringList QStringList::operator+(const QStringList &other) const
-
- Returns a string list that is the concatenation of this string
- list with the \a other string list.
-
- \sa append()
-*/
-
-/*!
- \fn QStringList &QStringList::operator<<(const QString &str)
-
- Appends the given string, \a str, to this string list and returns
- a reference to the string list.
-
- \sa append()
-*/
-
-/*!
- \fn QStringList &QStringList::operator<<(const QStringList &other)
-
- \overload
-
- Appends the \a other string list to the string list and returns a reference to
- the latter string list.
-*/
-
-/*!
- \fn QStringList &QStringList::operator<<(const QList<QString> &other)
- \since 5.4
-
- \overload
-
- Appends the \a other string list to the string list and returns a reference to
- the latter string list.
-*/
-
-#ifndef QT_NO_REGEXP
-static int indexOfMutating(const QStringList *that, QRegExp &rx, int from)
-{
- if (from < 0)
- from = qMax(from + that->size(), 0);
- for (int i = from; i < that->size(); ++i) {
- if (rx.exactMatch(that->at(i)))
- return i;
- }
- return -1;
-}
-
-static int lastIndexOfMutating(const QStringList *that, QRegExp &rx, int from)
-{
- if (from < 0)
- from += that->size();
- else if (from >= that->size())
- from = that->size() - 1;
- for (int i = from; i >= 0; --i) {
- if (rx.exactMatch(that->at(i)))
- return i;
- }
- return -1;
-}
-
-/*!
- \fn int QStringList::indexOf(const QRegExp &rx, int from) const
-
- Returns the index position of the first exact match of \a rx in
- the list, searching forward from index position \a from. Returns
- -1 if no item matched.
-
- \sa lastIndexOf(), contains(), QRegExp::exactMatch()
-*/
-int QtPrivate::QStringList_indexOf(const QStringList *that, const QRegExp &rx, int from)
-{
- QRegExp rx2(rx);
- return indexOfMutating(that, rx2, from);
-}
-
-/*!
- \fn int QStringList::indexOf(QRegExp &rx, int from) const
- \overload indexOf()
- \since 4.5
-
- Returns the index position of the first exact match of \a rx in
- the list, searching forward from index position \a from. Returns
- -1 if no item matched.
-
- If an item matched, the \a rx regular expression will contain the
- matched objects (see QRegExp::matchedLength, QRegExp::cap).
-
- \sa lastIndexOf(), contains(), QRegExp::exactMatch()
-*/
-int QtPrivate::QStringList_indexOf(const QStringList *that, QRegExp &rx, int from)
-{
- return indexOfMutating(that, rx, from);
-}
-
-/*!
- \fn int QStringList::lastIndexOf(const QRegExp &rx, int from) const
-
- Returns the index position of the last exact match of \a rx in
- the list, searching backward from index position \a from. If \a
- from is -1 (the default), the search starts at the last item.
- Returns -1 if no item matched.
-
- \sa indexOf(), contains(), QRegExp::exactMatch()
-*/
-int QtPrivate::QStringList_lastIndexOf(const QStringList *that, const QRegExp &rx, int from)
-{
- QRegExp rx2(rx);
- return lastIndexOfMutating(that, rx2, from);
-}
-
-/*!
- \fn int QStringList::lastIndexOf(QRegExp &rx, int from) const
- \overload lastIndexOf()
- \since 4.5
-
- Returns the index position of the last exact match of \a rx in
- the list, searching backward from index position \a from. If \a
- from is -1 (the default), the search starts at the last item.
- Returns -1 if no item matched.
-
- If an item matched, the \a rx regular expression will contain the
- matched objects (see QRegExp::matchedLength, QRegExp::cap).
-
- \sa indexOf(), contains(), QRegExp::exactMatch()
-*/
-int QtPrivate::QStringList_lastIndexOf(const QStringList *that, QRegExp &rx, int from)
-{
- return lastIndexOfMutating(that, rx, from);
-}
-#endif
-
-#if QT_CONFIG(regularexpression)
-/*!
- \fn int QStringList::indexOf(const QRegularExpression &re, int from) const
- \overload
- \since 5.0
-
- Returns the index position of the first exact match of \a re in
- the list, searching forward from index position \a from. Returns
- -1 if no item matched.
-
- \sa lastIndexOf()
-*/
-int QtPrivate::QStringList_indexOf(const QStringList *that, const QRegularExpression &re, int from)
-{
- if (from < 0)
- from = qMax(from + that->size(), 0);
-
- QString exactPattern = QRegularExpression::anchoredPattern(re.pattern());
- QRegularExpression exactRe(exactPattern, re.patternOptions());
-
- for (int i = from; i < that->size(); ++i) {
- QRegularExpressionMatch m = exactRe.match(that->at(i));
- if (m.hasMatch())
- return i;
- }
- return -1;
-}
-
-/*!
- \fn int QStringList::lastIndexOf(const QRegularExpression &re, int from) const
- \overload
- \since 5.0
-
- Returns the index position of the last exact match of \a re in
- the list, searching backward from index position \a from. If \a
- from is -1 (the default), the search starts at the last item.
- Returns -1 if no item matched.
-
- \sa indexOf()
-*/
-int QtPrivate::QStringList_lastIndexOf(const QStringList *that, const QRegularExpression &re, int from)
-{
- if (from < 0)
- from += that->size();
- else if (from >= that->size())
- from = that->size() - 1;
-
- QString exactPattern = QRegularExpression::anchoredPattern(re.pattern());
- QRegularExpression exactRe(exactPattern, re.patternOptions());
-
- for (int i = from; i >= 0; --i) {
- QRegularExpressionMatch m = exactRe.match(that->at(i));
- if (m.hasMatch())
- return i;
- }
- return -1;
-}
-#endif // QT_CONFIG(regularexpression)
-
-/*!
- \fn int QStringList::removeDuplicates()
-
- \since 4.5
-
- This function removes duplicate entries from a list.
- The entries do not have to be sorted. They will retain their
- original order.
-
- Returns the number of removed entries.
-*/
-int QtPrivate::QStringList_removeDuplicates(QStringList *that)
-{
- int n = that->size();
- int j = 0;
- QSet<QString> seen;
- seen.reserve(n);
- int setSize = 0;
- for (int i = 0; i < n; ++i) {
- const QString &s = that->at(i);
- seen.insert(s);
- if (setSize == seen.size()) // unchanged size => was already seen
- continue;
- ++setSize;
- if (j != i)
- that->swapItemsAt(i, j);
- ++j;
- }
- if (n != j)
- that->erase(that->begin() + j, that->end());
- return n - j;
-}
-
-/*! \fn QStringList::QStringList(std::initializer_list<QString> args)
- \since 4.8
-
- Construct a list from a std::initializer_list given by \a args.
-
- This constructor is only enabled if the compiler supports C++11 initializer
- lists.
-*/
-
-
-QT_END_NAMESPACE
diff --git a/src/corelib/tools/qstringlist.h b/src/corelib/tools/qstringlist.h
deleted file mode 100644
index 6b04b7aef1..0000000000
--- a/src/corelib/tools/qstringlist.h
+++ /dev/null
@@ -1,337 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Copyright (C) 2016 Intel Corporation.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#include <QtCore/qlist.h>
-
-#ifndef QSTRINGLIST_H
-#define QSTRINGLIST_H
-
-#include <QtCore/qalgorithms.h>
-#include <QtCore/qregexp.h>
-#include <QtCore/qstring.h>
-#include <QtCore/qstringmatcher.h>
-
-QT_BEGIN_NAMESPACE
-
-class QRegExp;
-class QRegularExpression;
-
-typedef QListIterator<QString> QStringListIterator;
-typedef QMutableListIterator<QString> QMutableStringListIterator;
-
-class QStringList;
-
-#ifdef Q_QDOC
-class QStringList : public QList<QString>
-#else
-template <> struct QListSpecialMethods<QString>
-#endif
-{
-#ifndef Q_QDOC
-protected:
- ~QListSpecialMethods() = default;
-#endif
-public:
- inline void sort(Qt::CaseSensitivity cs = Qt::CaseSensitive);
- inline int removeDuplicates();
-
- inline QString join(const QString &sep) const;
- inline QString join(QLatin1String sep) const;
- inline QString join(QChar sep) const;
-
- inline QStringList filter(const QString &str, Qt::CaseSensitivity cs = Qt::CaseSensitive) const;
- inline QStringList &replaceInStrings(const QString &before, const QString &after, Qt::CaseSensitivity cs = Qt::CaseSensitive);
-
-#ifndef QT_NO_REGEXP
- inline QStringList filter(const QRegExp &rx) const;
- inline QStringList &replaceInStrings(const QRegExp &rx, const QString &after);
-#endif
-
-#if QT_CONFIG(regularexpression)
- inline QStringList filter(const QRegularExpression &re) const;
- inline QStringList &replaceInStrings(const QRegularExpression &re, const QString &after);
-#endif // QT_CONFIG(regularexpression)
-
-#ifndef Q_QDOC
-private:
- inline QStringList *self();
- inline const QStringList *self() const;
-};
-
-// ### Qt6: check if there's a better way
-class QStringList : public QList<QString>
-{
-#endif
-public:
- inline QStringList() Q_DECL_NOTHROW { }
- inline explicit QStringList(const QString &i) { append(i); }
- inline QStringList(const QList<QString> &l) : QList<QString>(l) { }
-#ifdef Q_COMPILER_RVALUE_REFS
- inline QStringList(QList<QString> &&l) Q_DECL_NOTHROW : QList<QString>(std::move(l)) { }
-#endif
-#ifdef Q_COMPILER_INITIALIZER_LISTS
- inline QStringList(std::initializer_list<QString> args) : QList<QString>(args) { }
-#endif
-
- QStringList &operator=(const QList<QString> &other)
- { QList<QString>::operator=(other); return *this; }
-#ifdef Q_COMPILER_RVALUE_REFS
- QStringList &operator=(QList<QString> &&other) Q_DECL_NOTHROW
- { QList<QString>::operator=(std::move(other)); return *this; }
-#endif
-
-#if QT_STRINGVIEW_LEVEL < 2
- inline bool contains(const QString &str, Qt::CaseSensitivity cs = Qt::CaseSensitive) const;
-#endif
- inline bool contains(QLatin1String str, Qt::CaseSensitivity cs = Qt::CaseSensitive) const;
- inline bool contains(QStringView str, Qt::CaseSensitivity cs = Qt::CaseSensitive) const;
-
- inline QStringList operator+(const QStringList &other) const
- { QStringList n = *this; n += other; return n; }
- inline QStringList &operator<<(const QString &str)
- { append(str); return *this; }
- inline QStringList &operator<<(const QStringList &l)
- { *this += l; return *this; }
- inline QStringList &operator<<(const QList<QString> &l)
- { *this += l; return *this; }
-
- inline int indexOf(QStringView str, int from = 0) const;
- inline int indexOf(QLatin1String str, int from = 0) const;
-
- inline int lastIndexOf(QStringView str, int from = -1) const;
- inline int lastIndexOf(QLatin1String str, int from = -1) const;
-
-#ifndef QT_NO_REGEXP
- inline int indexOf(const QRegExp &rx, int from = 0) const;
- inline int lastIndexOf(const QRegExp &rx, int from = -1) const;
- inline int indexOf(QRegExp &rx, int from = 0) const;
- inline int lastIndexOf(QRegExp &rx, int from = -1) const;
-#endif
-
-#if QT_CONFIG(regularexpression)
- inline int indexOf(const QRegularExpression &re, int from = 0) const;
- inline int lastIndexOf(const QRegularExpression &re, int from = -1) const;
-#endif // QT_CONFIG(regularexpression)
-
- using QList<QString>::indexOf;
- using QList<QString>::lastIndexOf;
-};
-
-Q_DECLARE_TYPEINFO(QStringList, Q_MOVABLE_TYPE);
-
-#ifndef Q_QDOC
-inline QStringList *QListSpecialMethods<QString>::self()
-{ return static_cast<QStringList *>(this); }
-inline const QStringList *QListSpecialMethods<QString>::self() const
-{ return static_cast<const QStringList *>(this); }
-
-namespace QtPrivate {
- void Q_CORE_EXPORT QStringList_sort(QStringList *that, Qt::CaseSensitivity cs);
- int Q_CORE_EXPORT QStringList_removeDuplicates(QStringList *that);
- QString Q_CORE_EXPORT QStringList_join(const QStringList *that, const QChar *sep, int seplen);
- Q_CORE_EXPORT QString QStringList_join(const QStringList &list, QLatin1String sep);
- QStringList Q_CORE_EXPORT QStringList_filter(const QStringList *that, const QString &str,
- Qt::CaseSensitivity cs);
-
-#if QT_VERSION < QT_VERSION_CHECK(6, 0, 0)
- bool Q_CORE_EXPORT QStringList_contains(const QStringList *that, const QString &str, Qt::CaseSensitivity cs);
-#endif
- bool Q_CORE_EXPORT QStringList_contains(const QStringList *that, QStringView str, Qt::CaseSensitivity cs);
- bool Q_CORE_EXPORT QStringList_contains(const QStringList *that, QLatin1String str, Qt::CaseSensitivity cs);
- void Q_CORE_EXPORT QStringList_replaceInStrings(QStringList *that, const QString &before, const QString &after,
- Qt::CaseSensitivity cs);
-
-#ifndef QT_NO_REGEXP
- void Q_CORE_EXPORT QStringList_replaceInStrings(QStringList *that, const QRegExp &rx, const QString &after);
- QStringList Q_CORE_EXPORT QStringList_filter(const QStringList *that, const QRegExp &re);
- int Q_CORE_EXPORT QStringList_indexOf(const QStringList *that, const QRegExp &rx, int from);
- int Q_CORE_EXPORT QStringList_lastIndexOf(const QStringList *that, const QRegExp &rx, int from);
- int Q_CORE_EXPORT QStringList_indexOf(const QStringList *that, QRegExp &rx, int from);
- int Q_CORE_EXPORT QStringList_lastIndexOf(const QStringList *that, QRegExp &rx, int from);
-#endif
-
-#if QT_CONFIG(regularexpression)
- void Q_CORE_EXPORT QStringList_replaceInStrings(QStringList *that, const QRegularExpression &rx, const QString &after);
- QStringList Q_CORE_EXPORT QStringList_filter(const QStringList *that, const QRegularExpression &re);
- int Q_CORE_EXPORT QStringList_indexOf(const QStringList *that, const QRegularExpression &re, int from);
- int Q_CORE_EXPORT QStringList_lastIndexOf(const QStringList *that, const QRegularExpression &re, int from);
-#endif // QT_CONFIG(regularexpression)
-}
-
-inline void QListSpecialMethods<QString>::sort(Qt::CaseSensitivity cs)
-{
- QtPrivate::QStringList_sort(self(), cs);
-}
-
-inline int QListSpecialMethods<QString>::removeDuplicates()
-{
- return QtPrivate::QStringList_removeDuplicates(self());
-}
-
-inline QString QListSpecialMethods<QString>::join(const QString &sep) const
-{
- return QtPrivate::QStringList_join(self(), sep.constData(), sep.length());
-}
-
-QString QListSpecialMethods<QString>::join(QLatin1String sep) const
-{
- return QtPrivate::QStringList_join(*self(), sep);
-}
-
-inline QString QListSpecialMethods<QString>::join(QChar sep) const
-{
- return QtPrivate::QStringList_join(self(), &sep, 1);
-}
-
-inline QStringList QListSpecialMethods<QString>::filter(const QString &str, Qt::CaseSensitivity cs) const
-{
- return QtPrivate::QStringList_filter(self(), str, cs);
-}
-
-#if QT_STRINGVIEW_LEVEL < 2
-inline bool QStringList::contains(const QString &str, Qt::CaseSensitivity cs) const
-{
- return QtPrivate::QStringList_contains(this, str, cs);
-}
-#endif
-
-inline bool QStringList::contains(QLatin1String str, Qt::CaseSensitivity cs) const
-{
- return QtPrivate::QStringList_contains(this, str, cs);
-}
-
-inline bool QStringList::contains(QStringView str, Qt::CaseSensitivity cs) const
-{
- return QtPrivate::QStringList_contains(this, str, cs);
-}
-
-inline QStringList &QListSpecialMethods<QString>::replaceInStrings(const QString &before, const QString &after, Qt::CaseSensitivity cs)
-{
- QtPrivate::QStringList_replaceInStrings(self(), before, after, cs);
- return *self();
-}
-
-inline QStringList operator+(const QList<QString> &one, const QStringList &other)
-{
- QStringList n = one;
- n += other;
- return n;
-}
-
-inline int QStringList::indexOf(QStringView string, int from) const
-{
- return QtPrivate::indexOf<QString, QStringView>(*this, string, from);
-}
-
-inline int QStringList::indexOf(QLatin1String string, int from) const
-{
- return QtPrivate::indexOf<QString, QLatin1String>(*this, string, from);
-}
-
-inline int QStringList::lastIndexOf(QStringView string, int from) const
-{
- return QtPrivate::lastIndexOf<QString, QStringView>(*this, string, from);
-}
-
-inline int QStringList::lastIndexOf(QLatin1String string, int from) const
-{
- return QtPrivate::lastIndexOf<QString, QLatin1String>(*this, string, from);
-}
-
-#ifndef QT_NO_REGEXP
-inline QStringList &QListSpecialMethods<QString>::replaceInStrings(const QRegExp &rx, const QString &after)
-{
- QtPrivate::QStringList_replaceInStrings(self(), rx, after);
- return *self();
-}
-
-inline QStringList QListSpecialMethods<QString>::filter(const QRegExp &rx) const
-{
- return QtPrivate::QStringList_filter(self(), rx);
-}
-
-inline int QStringList::indexOf(const QRegExp &rx, int from) const
-{
- return QtPrivate::QStringList_indexOf(this, rx, from);
-}
-
-inline int QStringList::lastIndexOf(const QRegExp &rx, int from) const
-{
- return QtPrivate::QStringList_lastIndexOf(this, rx, from);
-}
-
-inline int QStringList::indexOf(QRegExp &rx, int from) const
-{
- return QtPrivate::QStringList_indexOf(this, rx, from);
-}
-
-inline int QStringList::lastIndexOf(QRegExp &rx, int from) const
-{
- return QtPrivate::QStringList_lastIndexOf(this, rx, from);
-}
-#endif
-
-#if QT_CONFIG(regularexpression)
-inline QStringList &QListSpecialMethods<QString>::replaceInStrings(const QRegularExpression &rx, const QString &after)
-{
- QtPrivate::QStringList_replaceInStrings(self(), rx, after);
- return *self();
-}
-
-inline QStringList QListSpecialMethods<QString>::filter(const QRegularExpression &rx) const
-{
- return QtPrivate::QStringList_filter(self(), rx);
-}
-
-inline int QStringList::indexOf(const QRegularExpression &rx, int from) const
-{
- return QtPrivate::QStringList_indexOf(this, rx, from);
-}
-
-inline int QStringList::lastIndexOf(const QRegularExpression &rx, int from) const
-{
- return QtPrivate::QStringList_lastIndexOf(this, rx, from);
-}
-#endif // QT_CONFIG(regularexpression)
-#endif // Q_QDOC
-
-QT_END_NAMESPACE
-
-#endif // QSTRINGLIST_H
diff --git a/src/corelib/tools/qstringliteral.h b/src/corelib/tools/qstringliteral.h
deleted file mode 100644
index 64296b89fc..0000000000
--- a/src/corelib/tools/qstringliteral.h
+++ /dev/null
@@ -1,112 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Copyright (C) 2016 Intel Corporation.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#ifndef QSTRINGLITERAL_H
-#define QSTRINGLITERAL_H
-
-#include <QtCore/qarraydata.h>
-
-#if 0
-#pragma qt_class(QStringLiteral)
-#endif
-
-QT_BEGIN_NAMESPACE
-
-typedef QTypedArrayData<ushort> QStringData;
-
-// all our supported compilers support Unicode string literals,
-// even if their Q_COMPILER_UNICODE_STRING has been revoked due
-// to lacking stdlib support. But QStringLiteral only needs the
-// core language feature, so just use u"" here unconditionally:
-
-typedef char16_t qunicodechar;
-
-Q_STATIC_ASSERT_X(sizeof(qunicodechar) == 2,
- "qunicodechar must typedef an integral type of size 2");
-
-#define QT_UNICODE_LITERAL(str) u"" str
-#define QStringLiteral(str) \
- ([]() Q_DECL_NOEXCEPT -> QString { \
- enum { Size = sizeof(QT_UNICODE_LITERAL(str))/2 - 1 }; \
- static const QStaticStringData<Size> qstring_literal = { \
- Q_STATIC_STRING_DATA_HEADER_INITIALIZER(Size), \
- QT_UNICODE_LITERAL(str) }; \
- QStringDataPtr holder = { qstring_literal.data_ptr() }; \
- const QString qstring_literal_temp(holder); \
- return qstring_literal_temp; \
- }()) \
- /**/
-
-#define Q_STATIC_STRING_DATA_HEADER_INITIALIZER_WITH_OFFSET(size, offset) \
- { Q_REFCOUNT_INITIALIZE_STATIC, size, 0, 0, offset } \
- /**/
-
-#define Q_STATIC_STRING_DATA_HEADER_INITIALIZER(size) \
- Q_STATIC_STRING_DATA_HEADER_INITIALIZER_WITH_OFFSET(size, sizeof(QStringData)) \
- /**/
-
-#ifndef QT_NO_UNICODE_LITERAL
-# ifndef QT_UNICODE_LITERAL
-# error "If you change QStringLiteral, please change QStringViewLiteral, too"
-# endif
-# define QStringViewLiteral(str) QStringView(QT_UNICODE_LITERAL(str))
-#endif
-
-template <int N>
-struct QStaticStringData
-{
- QArrayData str;
- qunicodechar data[N + 1];
-
- QStringData *data_ptr() const
- {
- Q_ASSERT(str.ref.isStatic());
- return const_cast<QStringData *>(static_cast<const QStringData*>(&str));
- }
-};
-
-struct QStringDataPtr
-{
- QStringData *ptr;
-};
-
-QT_END_NAMESPACE
-
-#endif // QSTRINGLITERAL_H
diff --git a/src/corelib/tools/qstringmatcher.cpp b/src/corelib/tools/qstringmatcher.cpp
deleted file mode 100644
index 67d3f0ebc8..0000000000
--- a/src/corelib/tools/qstringmatcher.cpp
+++ /dev/null
@@ -1,322 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#include "qstringmatcher.h"
-
-QT_BEGIN_NAMESPACE
-
-static void bm_init_skiptable(const ushort *uc, int len, uchar *skiptable, Qt::CaseSensitivity cs)
-{
- int l = qMin(len, 255);
- memset(skiptable, l, 256*sizeof(uchar));
- uc += len - l;
- if (cs == Qt::CaseSensitive) {
- while (l--) {
- skiptable[*uc & 0xff] = l;
- uc++;
- }
- } else {
- const ushort *start = uc;
- while (l--) {
- skiptable[foldCase(uc, start) & 0xff] = l;
- uc++;
- }
- }
-}
-
-static inline int bm_find(const ushort *uc, uint l, int index, const ushort *puc, uint pl,
- const uchar *skiptable, Qt::CaseSensitivity cs)
-{
- if (pl == 0)
- return index > (int)l ? -1 : index;
- const uint pl_minus_one = pl - 1;
-
- const ushort *current = uc + index + pl_minus_one;
- const ushort *end = uc + l;
- if (cs == Qt::CaseSensitive) {
- while (current < end) {
- uint skip = skiptable[*current & 0xff];
- if (!skip) {
- // possible match
- while (skip < pl) {
- if (*(current - skip) != puc[pl_minus_one-skip])
- break;
- skip++;
- }
- if (skip > pl_minus_one) // we have a match
- return (current - uc) - pl_minus_one;
-
- // in case we don't have a match we are a bit inefficient as we only skip by one
- // when we have the non matching char in the string.
- if (skiptable[*(current - skip) & 0xff] == pl)
- skip = pl - skip;
- else
- skip = 1;
- }
- if (current > end - skip)
- break;
- current += skip;
- }
- } else {
- while (current < end) {
- uint skip = skiptable[foldCase(current, uc) & 0xff];
- if (!skip) {
- // possible match
- while (skip < pl) {
- if (foldCase(current - skip, uc) != foldCase(puc + pl_minus_one - skip, puc))
- break;
- skip++;
- }
- if (skip > pl_minus_one) // we have a match
- return (current - uc) - pl_minus_one;
- // in case we don't have a match we are a bit inefficient as we only skip by one
- // when we have the non matching char in the string.
- if (skiptable[foldCase(current - skip, uc) & 0xff] == pl)
- skip = pl - skip;
- else
- skip = 1;
- }
- if (current > end - skip)
- break;
- current += skip;
- }
- }
- return -1; // not found
-}
-
-/*!
- \class QStringMatcher
- \inmodule QtCore
- \brief The QStringMatcher class holds a sequence of characters that
- can be quickly matched in a Unicode string.
-
- \ingroup tools
- \ingroup string-processing
-
- This class is useful when you have a sequence of \l{QChar}s that
- you want to repeatedly match against some strings (perhaps in a
- loop), or when you want to search for the same sequence of
- characters multiple times in the same string. Using a matcher
- object and indexIn() is faster than matching a plain QString with
- QString::indexOf() if repeated matching takes place. This class
- offers no benefit if you are doing one-off string matches.
-
- Create the QStringMatcher with the QString you want to search
- for. Then call indexIn() on the QString that you want to search.
-
- \sa QString, QByteArrayMatcher, QRegExp
-*/
-
-/*!
- Constructs an empty string matcher that won't match anything.
- Call setPattern() to give it a pattern to match.
-*/
-QStringMatcher::QStringMatcher()
- : d_ptr(0), q_cs(Qt::CaseSensitive)
-{
- memset(q_data, 0, sizeof(q_data));
-}
-
-/*!
- Constructs a string matcher that will search for \a pattern, with
- case sensitivity \a cs.
-
- Call indexIn() to perform a search.
-*/
-QStringMatcher::QStringMatcher(const QString &pattern, Qt::CaseSensitivity cs)
- : d_ptr(0), q_pattern(pattern), q_cs(cs)
-{
- p.uc = pattern.unicode();
- p.len = pattern.size();
- bm_init_skiptable((const ushort *)p.uc, p.len, p.q_skiptable, cs);
-}
-
-/*!
- \fn QStringMatcher::QStringMatcher(const QChar *uc, int length, Qt::CaseSensitivity cs)
- \since 4.5
-
- Constructs a string matcher that will search for the pattern referred to
- by \a uc with the given \a length and case sensitivity specified by \a cs.
-*/
-QStringMatcher::QStringMatcher(const QChar *uc, int len, Qt::CaseSensitivity cs)
- : d_ptr(0), q_cs(cs)
-{
- p.uc = uc;
- p.len = len;
- bm_init_skiptable((const ushort *)p.uc, len, p.q_skiptable, cs);
-}
-
-/*!
- Copies the \a other string matcher to this string matcher.
-*/
-QStringMatcher::QStringMatcher(const QStringMatcher &other)
- : d_ptr(0)
-{
- operator=(other);
-}
-
-/*!
- Destroys the string matcher.
-*/
-QStringMatcher::~QStringMatcher()
-{
- Q_UNUSED(d_ptr);
-}
-
-/*!
- Assigns the \a other string matcher to this string matcher.
-*/
-QStringMatcher &QStringMatcher::operator=(const QStringMatcher &other)
-{
- if (this != &other) {
- q_pattern = other.q_pattern;
- q_cs = other.q_cs;
- memcpy(q_data, other.q_data, sizeof(q_data));
- }
- return *this;
-}
-
-/*!
- Sets the string that this string matcher will search for to \a
- pattern.
-
- \sa pattern(), setCaseSensitivity(), indexIn()
-*/
-void QStringMatcher::setPattern(const QString &pattern)
-{
- q_pattern = pattern;
- p.uc = pattern.unicode();
- p.len = pattern.size();
- bm_init_skiptable((const ushort *)pattern.unicode(), pattern.size(), p.q_skiptable, q_cs);
-}
-
-/*!
- \fn QString QStringMatcher::pattern() const
-
- Returns the string pattern that this string matcher will search
- for.
-
- \sa setPattern()
-*/
-
-QString QStringMatcher::pattern() const
-{
- if (!q_pattern.isEmpty())
- return q_pattern;
- return QString(p.uc, p.len);
-}
-
-/*!
- Sets the case sensitivity setting of this string matcher to \a
- cs.
-
- \sa caseSensitivity(), setPattern(), indexIn()
-*/
-void QStringMatcher::setCaseSensitivity(Qt::CaseSensitivity cs)
-{
- if (cs == q_cs)
- return;
- bm_init_skiptable((const ushort *)p.uc, p.len, p.q_skiptable, cs);
- q_cs = cs;
-}
-
-/*!
- Searches the string \a str from character position \a from
- (default 0, i.e. from the first character), for the string
- pattern() that was set in the constructor or in the most recent
- call to setPattern(). Returns the position where the pattern()
- matched in \a str, or -1 if no match was found.
-
- \sa setPattern(), setCaseSensitivity()
-*/
-int QStringMatcher::indexIn(const QString &str, int from) const
-{
- if (from < 0)
- from = 0;
- return bm_find((const ushort *)str.unicode(), str.size(), from,
- (const ushort *)p.uc, p.len,
- p.q_skiptable, q_cs);
-}
-
-/*!
- \since 4.5
-
- Searches the string starting at \a str (of length \a length) from
- character position \a from (default 0, i.e. from the first
- character), for the string pattern() that was set in the
- constructor or in the most recent call to setPattern(). Returns
- the position where the pattern() matched in \a str, or -1 if no
- match was found.
-
- \sa setPattern(), setCaseSensitivity()
-*/
-int QStringMatcher::indexIn(const QChar *str, int length, int from) const
-{
- if (from < 0)
- from = 0;
- return bm_find((const ushort *)str, length, from,
- (const ushort *)p.uc, p.len,
- p.q_skiptable, q_cs);
-}
-
-/*!
- \fn Qt::CaseSensitivity QStringMatcher::caseSensitivity() const
-
- Returns the case sensitivity setting for this string matcher.
-
- \sa setCaseSensitivity()
-*/
-
-/*!
- \internal
-*/
-
-int qFindStringBoyerMoore(
- const QChar *haystack, int haystackLen, int haystackOffset,
- const QChar *needle, int needleLen, Qt::CaseSensitivity cs)
-{
- uchar skiptable[256];
- bm_init_skiptable((const ushort *)needle, needleLen, skiptable, cs);
- if (haystackOffset < 0)
- haystackOffset = 0;
- return bm_find((const ushort *)haystack, haystackLen, haystackOffset,
- (const ushort *)needle, needleLen, skiptable, cs);
-}
-
-QT_END_NAMESPACE
diff --git a/src/corelib/tools/qstringmatcher.h b/src/corelib/tools/qstringmatcher.h
deleted file mode 100644
index 549bff9f29..0000000000
--- a/src/corelib/tools/qstringmatcher.h
+++ /dev/null
@@ -1,88 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#ifndef QSTRINGMATCHER_H
-#define QSTRINGMATCHER_H
-
-#include <QtCore/qstring.h>
-
-QT_BEGIN_NAMESPACE
-
-
-class QStringMatcherPrivate;
-
-class Q_CORE_EXPORT QStringMatcher
-{
-public:
- QStringMatcher();
- explicit QStringMatcher(const QString &pattern,
- Qt::CaseSensitivity cs = Qt::CaseSensitive);
- QStringMatcher(const QChar *uc, int len,
- Qt::CaseSensitivity cs = Qt::CaseSensitive);
- QStringMatcher(const QStringMatcher &other);
- ~QStringMatcher();
-
- QStringMatcher &operator=(const QStringMatcher &other);
-
- void setPattern(const QString &pattern);
- void setCaseSensitivity(Qt::CaseSensitivity cs);
-
- int indexIn(const QString &str, int from = 0) const;
- int indexIn(const QChar *str, int length, int from = 0) const;
- QString pattern() const;
- inline Qt::CaseSensitivity caseSensitivity() const { return q_cs; }
-
-private:
- QStringMatcherPrivate *d_ptr;
- QString q_pattern;
- Qt::CaseSensitivity q_cs;
- struct Data {
- uchar q_skiptable[256];
- const QChar *uc;
- int len;
- };
- union {
- uint q_data[256];
- Data p;
- };
-};
-
-QT_END_NAMESPACE
-
-#endif // QSTRINGMATCHER_H
diff --git a/src/corelib/tools/qstringview.cpp b/src/corelib/tools/qstringview.cpp
deleted file mode 100644
index b97e989110..0000000000
--- a/src/corelib/tools/qstringview.cpp
+++ /dev/null
@@ -1,797 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2017 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.com, author Marc Mutz <marc.mutz@kdab.com>
-** Contact: http://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#include "qstringview.h"
-
-QT_BEGIN_NAMESPACE
-
-/*!
- \class QStringView
- \inmodule QtCore
- \since 5.10
- \brief The QStringView class provides a unified view on UTF-16 strings with a read-only subset of the QString API.
- \reentrant
- \ingroup tools
- \ingroup string-processing
-
- A QStringView references a contiguous portion of a UTF-16 string it does
- not own. It acts as an interface type to all kinds of UTF-16 string,
- without the need to construct a QString first.
-
- The UTF-16 string may be represented as an array (or an array-compatible
- data-structure such as QString,
- std::basic_string, etc.) of QChar, \c ushort, \c char16_t (on compilers that
- support C++11 Unicode strings) or (on platforms, such as Windows,
- where it is a 16-bit type) \c wchar_t.
-
- QStringView is designed as an interface type; its main use-case is
- as a function parameter type. When QStringViews are used as automatic
- variables or data members, care must be taken to ensure that the referenced
- string data (for example, owned by a QString) outlives the QStringView on all code paths,
- lest the string view ends up referencing deleted data.
-
- When used as an interface type, QStringView allows a single function to accept
- a wide variety of UTF-16 string data sources. One function accepting QStringView
- thus replaces three function overloads (taking QString, QStringRef, and
- \c{(const QChar*, int)}), while at the same time enabling even more string data
- sources to be passed to the function, such as \c{u"Hello World"}, a \c char16_t
- string literal.
-
- QStringViews should be passed by value, not by reference-to-const:
- \snippet code/src_corelib_tools_qstringview.cpp 0
-
- If you want to give your users maximum freedom in what strings they can pass
- to your function, accompany the QStringView overload with overloads for
-
- \list
- \li \e QChar: this overload can delegate to the QStringView version:
- \snippet code/src_corelib_tools_qstringview.cpp 1
- even though, for technical reasons, QStringView cannot provide a
- QChar constructor by itself.
- \li \e QString: if you store an unmodified copy of the string and thus would
- like to take advantage of QString's implicit sharing.
- \li QLatin1String: if you can implement the function without converting the
- QLatin1String to UTF-16 first; users expect a function overloaded on
- QLatin1String to perform strictly less memory allocations than the
- semantically equivalent call of the QStringView version, involving
- construction of a QString from the QLatin1String.
- \endlist
-
- QStringView can also be used as the return value of a function. If you call a
- function returning QStringView, take extra care to not keep the QStringView
- around longer than the function promises to keep the referenced string data alive.
- If in doubt, obtain a strong reference to the data by calling toString() to convert
- the QStringView into a QString.
-
- QStringView is a \e{Literal Type}, but since it stores data as \c{char16_t}, iteration
- is not \c constexpr (casts from \c{const char16_t*} to \c{const QChar*}, which is not
- allowed in \c constexpr functions). You can use an indexed loop and/or utf16() in
- \c constexpr contexts instead.
-
- \note We strongly discourage the use of QList<QStringView>,
- because QList is a very inefficient container for QStringViews (it would heap-allocate
- every element). Use QVector (or std::vector) to hold QStringViews instead.
-
- \sa QString, QStringRef
-*/
-
-/*!
- \typedef QStringView::storage_type
-
- Alias for \c{char16_t} for non-Windows or if Q_COMPILER_UNICODE_STRINGS
- is defined. Otherwise, alias for \c{wchar_t}.
-*/
-
-/*!
- \typedef QStringView::value_type
-
- Alias for \c{const QChar}. Provided for compatibility with the STL.
-*/
-
-/*!
- \typedef QStringView::difference_type
-
- Alias for \c{std::ptrdiff_t}. Provided for compatibility with the STL.
-*/
-
-/*!
- \typedef QStringView::size_type
-
- Alias for qsizetype. Provided for compatibility with the STL.
-
- Unlike other Qt classes, QStringView uses qsizetype as its \c size_type, to allow
- accepting data from \c{std::basic_string} without truncation. The Qt API functions,
- for example length(), return \c int, while the STL-compatible functions, for example
- size(), return \c size_type.
-*/
-
-/*!
- \typedef QStringView::reference
-
- Alias for \c{value_type &}. Provided for compatibility with the STL.
-
- QStringView does not support mutable references, so this is the same
- as const_reference.
-*/
-
-/*!
- \typedef QStringView::const_reference
-
- Alias for \c{value_type &}. Provided for compatibility with the STL.
-*/
-
-/*!
- \typedef QStringView::pointer
-
- Alias for \c{value_type *}. Provided for compatibility with the STL.
-
- QStringView does not support mutable pointers, so this is the same
- as const_pointer.
-*/
-
-/*!
- \typedef QStringView::const_pointer
-
- Alias for \c{value_type *}. Provided for compatibility with the STL.
-*/
-
-/*!
- \typedef QStringView::iterator
-
- This typedef provides an STL-style const iterator for QStringView.
-
- QStringView does not support mutable iterators, so this is the same
- as const_iterator.
-
- \sa const_iterator, reverse_iterator
-*/
-
-/*!
- \typedef QStringView::const_iterator
-
- This typedef provides an STL-style const iterator for QStringView.
-
- \sa iterator, const_reverse_iterator
-*/
-
-/*!
- \typedef QStringView::reverse_iterator
-
- This typedef provides an STL-style const reverse iterator for QStringView.
-
- QStringView does not support mutable reverse iterators, so this is the
- same as const_reverse_iterator.
-
- \sa const_reverse_iterator, iterator
-*/
-
-/*!
- \typedef QStringView::const_reverse_iterator
-
- This typedef provides an STL-style const reverse iterator for QStringView.
-
- \sa reverse_iterator, const_iterator
-*/
-
-/*!
- \fn QStringView::QStringView()
-
- Constructs a null string view.
-
- \sa isNull()
-*/
-
-/*!
- \fn QStringView::QStringView(std::nullptr_t)
-
- Constructs a null string view.
-
- \sa isNull()
-*/
-
-/*!
- \fn template <typename Char> QStringView::QStringView(const Char *str, qsizetype len)
-
- Constructs a string view on \a str with length \a len.
-
- The range \c{[str,len)} must remain valid for the lifetime of this string view object.
-
- Passing \nullptr as \a str is safe if \a len is 0, too, and results in a null string view.
-
- The behavior is undefined if \a len is negative or, when positive, if \a str is \nullptr.
-
- This constructor only participates in overload resolution if \c Char is a compatible
- character type. The compatible character types are: \c QChar, \c ushort, \c char16_t and
- (on platforms, such as Windows, where it is a 16-bit type) \c wchar_t.
-*/
-
-/*!
- \fn template <typename Char> QStringView::QStringView(const Char *first, const Char *last)
-
- Constructs a string view on \a first with length (\a last - \a first).
-
- The range \c{[first,last)} must remain valid for the lifetime of
- this string view object.
-
- Passing \c \nullptr as \a first is safe if \a last is \nullptr, too,
- and results in a null string view.
-
- The behavior is undefined if \a last precedes \a first, or \a first
- is \nullptr and \a last is not.
-
- This constructor only participates in overload resolution if \c Char
- is a compatible character type. The compatible character types
- are: \c QChar, \c ushort, \c char16_t and (on platforms, such as
- Windows, where it is a 16-bit type) \c wchar_t.
-*/
-
-/*!
- \fn template <typename Char> QStringView::QStringView(const Char *str)
-
- Constructs a string view on \a str. The length is determined
- by scanning for the first \c{Char(0)}.
-
- \a str must remain valid for the lifetime of this string view object.
-
- Passing \nullptr as \a str is safe and results in a null string view.
-
- This constructor only participates in overload resolution if \a
- str is not an array and if \c Char is a compatible character
- type. The compatible character types are: \c QChar, \c ushort, \c
- char16_t and (on platforms, such as Windows, where it is a 16-bit
- type) \c wchar_t.
-*/
-
-/*!
- \fn template <typename Char, size_t N> QStringView::QStringView(const Char (&string)[N])
-
- Constructs a string view on the character string literal \a string.
- The length is set to \c{N-1}, excluding the trailing \{Char(0)}.
- If you need the full array, use the constructor from pointer and
- size instead:
-
- \snippet code/src_corelib_tools_qstringview.cpp 2
-
- \a string must remain valid for the lifetime of this string view
- object.
-
- This constructor only participates in overload resolution if \a
- string is an actual array and \c Char is a compatible character
- type. The compatible character types are: \c QChar, \c ushort, \c
- char16_t and (on platforms, such as Windows, where it is a 16-bit
- type) \c wchar_t.
-*/
-
-/*!
- \fn QStringView::QStringView(const QString &str)
-
- Constructs a string view on \a str.
-
- \c{str.data()} must remain valid for the lifetime of this string view object.
-
- The string view will be null if and only if \c{str.isNull()}.
-*/
-
-/*!
- \fn QStringView::QStringView(const QStringRef &str)
-
- Constructs a string view on \a str.
-
- \c{str.data()} must remain valid for the lifetime of this string view object.
-
- The string view will be null if and only if \c{str.isNull()}.
-*/
-
-/*!
- \fn template <typename StdBasicString> QStringView::QStringView(const StdBasicString &str)
-
- Constructs a string view on \a str. The length is taken from \c{str.size()}.
-
- \c{str.data()} must remain valid for the lifetime of this string view object.
-
- This constructor only participates in overload resolution if \c StdBasicString is an
- instantiation of \c std::basic_string with a compatible character type. The
- compatible character types are: \c QChar, \c ushort, \c char16_t and
- (on platforms, such as Windows, where it is a 16-bit type) \c wchar_t.
-
- The string view will be empty if and only if \c{str.empty()}. It is unspecified
- whether this constructor can result in a null string view (\c{str.data()} would
- have to return \nullptr for this).
-
- \sa isNull(), isEmpty()
-*/
-
-/*!
- \fn QString QStringView::toString() const
-
- Returns a deep copy of this string view's data as a QString.
-
- The return value will be the null QString if and only if this string view is null.
-
- \warning QStringView can store strings with more than 2\sup{30} characters
- while QString cannot. Calling this function on a string view for which size()
- returns a value greater than \c{INT_MAX / 2} constitutes undefined behavior.
-*/
-
-/*!
- \fn const QChar *QStringView::data() const
-
- Returns a const pointer to the first character in the string.
-
- \note The character array represented by the return value is \e not null-terminated.
-
- \sa begin(), end(), utf16()
-*/
-
-/*!
- \fn const storage_type *QStringView::utf16() const
-
- Returns a const pointer to the first character in the string.
-
- \c{storage_type} is \c{char16_t}.
-
- \note The character array represented by the return value is \e not null-terminated.
-
- \sa begin(), end(), data()
-*/
-
-/*!
- \fn QStringView::const_iterator QStringView::begin() const
-
- Returns a const \l{STL-style iterators}{STL-style iterator} pointing to the first character in
- the string.
-
- This function is provided for STL compatibility.
-
- \sa end(), cbegin(), rbegin(), data()
-*/
-
-/*!
- \fn QStringView::const_iterator QStringView::cbegin() const
-
- Same as begin().
-
- This function is provided for STL compatibility.
-
- \sa cend(), begin(), crbegin(), data()
-*/
-
-/*!
- \fn QStringView::const_iterator QStringView::end() const
-
- Returns a const \l{STL-style iterators}{STL-style iterator} pointing to the imaginary
- character after the last character in the list.
-
- This function is provided for STL compatibility.
-
- \sa begin(), cend(), rend()
-*/
-
-/*! \fn QStringView::const_iterator QStringView::cend() const
-
- Same as end().
-
- This function is provided for STL compatibility.
-
- \sa cbegin(), end(), crend()
-*/
-
-/*!
- \fn QStringView::const_reverse_iterator QStringView::rbegin() const
-
- Returns a const \l{STL-style iterators}{STL-style} reverse iterator pointing to the first
- character in the string, in reverse order.
-
- This function is provided for STL compatibility.
-
- \sa rend(), crbegin(), begin()
-*/
-
-/*!
- \fn QStringView::const_reverse_iterator QStringView::crbegin() const
-
- Same as rbegin().
-
- This function is provided for STL compatibility.
-
- \sa crend(), rbegin(), cbegin()
-*/
-
-/*!
- \fn QStringView::const_reverse_iterator QStringView::rend() const
-
- Returns a \l{STL-style iterators}{STL-style} reverse iterator pointing to one past
- the last character in the string, in reverse order.
-
- This function is provided for STL compatibility.
-
- \sa rbegin(), crend(), end()
-*/
-
-/*!
- \fn QStringView::const_reverse_iterator QStringView::crend() const
-
- Same as rend().
-
- This function is provided for STL compatibility.
-
- \sa crbegin(), rend(), cend()
-*/
-
-/*!
- \fn bool QStringView::empty() const
-
- Returns whether this string view is empty - that is, whether \c{size() == 0}.
-
- This function is provided for STL compatibility.
-
- \sa isEmpty(), isNull(), size(), length()
-*/
-
-/*!
- \fn bool QStringView::isEmpty() const
-
- Returns whether this string view is empty - that is, whether \c{size() == 0}.
-
- This function is provided for compatibility with other Qt containers.
-
- \sa empty(), isNull(), size(), length()
-*/
-
-/*!
- \fn bool QStringView::isNull() const
-
- Returns whether this string view is null - that is, whether \c{data() == nullptr}.
-
- This functions is provided for compatibility with other Qt containers.
-
- \sa empty(), isEmpty(), size(), length()
-*/
-
-/*!
- \fn qsizetype QStringView::size() const
-
- Returns the size of this string view, in UTF-16 code points (that is,
- surrogate pairs count as two for the purposes of this function, the same
- as in QString and QStringRef).
-
- \sa empty(), isEmpty(), isNull(), length()
-*/
-
-/*!
- \fn int QStringView::length() const
-
- Same as size(), except returns the result as an \c int.
-
- This function is provided for compatibility with other Qt containers.
-
- \warning QStringView can represent strings with more than 2\sup{31} characters.
- Calling this function on a string view for which size() returns a value greater
- than \c{INT_MAX} constitutes undefined behavior.
-
- \sa empty(), isEmpty(), isNull(), size()
-*/
-
-/*!
- \fn QChar QStringView::operator[](qsizetype n) const
-
- Returns the character at position \a n in this string view.
-
- The behavior is undefined if \a n is negative or not less than size().
-
- \sa at(), front(), back()
-*/
-
-/*!
- \fn QChar QStringView::at(qsizetype n) const
-
- Returns the character at position \a n in this string view.
-
- The behavior is undefined if \a n is negative or not less than size().
-
- \sa operator[](), front(), back()
-*/
-
-/*!
- \fn QChar QStringView::front() const
-
- Returns the first character in the string. Same as first().
-
- This function is provided for STL compatibility.
-
- \warning Calling this function on an empty string view constitutes
- undefined behavior.
-
- \sa back(), first(), last()
-*/
-
-/*!
- \fn QChar QStringView::back() const
-
- Returns the last character in the string. Same as last().
-
- This function is provided for STL compatibility.
-
- \warning Calling this function on an empty string view constitutes
- undefined behavior.
-
- \sa front(), first(), last()
-*/
-
-/*!
- \fn QChar QStringView::first() const
-
- Returns the first character in the string. Same as front().
-
- This function is provided for compatibility with other Qt containers.
-
- \warning Calling this function on an empty string view constitutes
- undefined behavior.
-
- \sa front(), back(), last()
-*/
-
-/*!
- \fn QChar QStringView::last() const
-
- Returns the last character in the string. Same as back().
-
- This function is provided for compatibility with other Qt containers.
-
- \warning Calling this function on an empty string view constitutes
- undefined behavior.
-
- \sa back(), front(), first()
-*/
-
-/*!
- \fn QStringView QStringView::mid(qsizetype start) const
-
- Returns the substring starting at position \a start in this object,
- and extending to the end of the string.
-
- \note The behavior is undefined when \a start < 0 or \a start > size().
-
- \sa left(), right(), chopped(), chop(), truncate()
-*/
-
-/*!
- \fn QStringView QStringView::mid(qsizetype start, qsizetype length) const
- \overload
-
- Returns the substring of length \a length starting at position
- \a start in this object.
-
- \note The behavior is undefined when \a start < 0, \a length < 0,
- or \a start + \a length > size().
-
- \sa left(), right(), chopped(), chop(), truncate()
-*/
-
-/*!
- \fn QStringView QStringView::left(qsizetype length) const
-
- Returns the substring of length \a length starting at position
- 0 in this object.
-
- \note The behavior is undefined when \a length < 0 or \a length > size().
-
- \sa mid(), right(), chopped(), chop(), truncate()
-*/
-
-/*!
- \fn QStringView QStringView::right(qsizetype length) const
-
- Returns the substring of length \a length starting at position
- size() - \a length in this object.
-
- \note The behavior is undefined when \a length < 0 or \a length > size().
-
- \sa mid(), left(), chopped(), chop(), truncate()
-*/
-
-/*!
- \fn QStringView QStringView::chopped(qsizetype length) const
-
- Returns the substring of length size() - \a length starting at the
- beginning of this object.
-
- Same as \c{left(size() - length)}.
-
- \note The behavior is undefined when \a length < 0 or \a length > size().
-
- \sa mid(), left(), right(), chop(), truncate()
-*/
-
-/*!
- \fn void QStringView::truncate(qsizetype length)
-
- Truncates this string view to length \a length.
-
- Same as \c{*this = left(length)}.
-
- \note The behavior is undefined when \a length < 0 or \a length > size().
-
- \sa mid(), left(), right(), chopped(), chop()
-*/
-
-/*!
- \fn void QStringView::chop(qsizetype length)
-
- Truncates this string view by \a length characters.
-
- Same as \c{*this = left(size() - length)}.
-
- \note The behavior is undefined when \a length < 0 or \a length > size().
-
- \sa mid(), left(), right(), chopped(), truncate()
-*/
-
-/*!
- \fn QStringView QStringView::trimmed() const
-
- Strips leading and trailing whitespace and returns the result.
-
- Whitespace means any character for which QChar::isSpace() returns
- \c true. This includes the ASCII characters '\\t', '\\n', '\\v',
- '\\f', '\\r', and ' '.
-*/
-
-/*!
- \fn int QStringView::compare(QStringView other, Qt::CaseSensitivity cs) const
- \since 5.12
-
- Compares this string-view with the \a other string-view and returns an
- integer less than, equal to, or greater than zero if this string-view
- is less than, equal to, or greater than the other string-view.
-
- If \a cs is Qt::CaseSensitive, the comparison is case sensitive;
- otherwise the comparison is case insensitive.
-
- \sa operator==(), operator<(), operator>()
-*/
-
-/*!
- \fn bool QStringView::startsWith(QStringView str, Qt::CaseSensitivity cs) const
- \fn bool QStringView::startsWith(QLatin1String l1, Qt::CaseSensitivity cs) const
- \fn bool QStringView::startsWith(QChar ch) const
- \fn bool QStringView::startsWith(QChar ch, Qt::CaseSensitivity cs) const
-
- Returns \c true if this string-view starts with string-view \a str,
- Latin-1 string \a l1, or character \a ch, respectively;
- otherwise returns \c false.
-
- If \a cs is Qt::CaseSensitive (the default), the search is case-sensitive;
- otherwise the search is case-insensitive.
-
- \sa endsWith()
-*/
-
-/*!
- \fn bool QStringView::endsWith(QStringView str, Qt::CaseSensitivity cs) const
- \fn bool QStringView::endsWith(QLatin1String l1, Qt::CaseSensitivity cs) const
- \fn bool QStringView::endsWith(QChar ch) const
- \fn bool QStringView::endsWith(QChar ch, Qt::CaseSensitivity cs) const
-
- Returns \c true if this string-view ends with string-view \a str,
- Latin-1 string \a l1, or character \a ch, respectively;
- otherwise returns \c false.
-
- If \a cs is Qt::CaseSensitive (the default), the search is case-sensitive;
- otherwise the search is case-insensitive.
-
- \sa startsWith()
-*/
-
-/*!
- \fn QByteArray QStringView::toLatin1() const
-
- Returns a Latin-1 representation of the string as a QByteArray.
-
- The behavior is undefined if the string contains non-Latin1 characters.
-
- \sa toUtf8(), toLocal8Bit(), QTextCodec
-*/
-
-/*!
- \fn QByteArray QStringView::toLocal8Bit() const
-
- Returns a local 8-bit representation of the string as a QByteArray.
-
- QTextCodec::codecForLocale() is used to perform the conversion from
- Unicode. If the locale's encoding could not be determined, this function
- does the same as toLatin1().
-
- The behavior is undefined if the string contains characters not
- supported by the locale's 8-bit encoding.
-
- \sa toLatin1(), toUtf8(), QTextCodec
-*/
-
-/*!
- \fn QByteArray QStringView::toUtf8() const
-
- Returns a UTF-8 representation of the string as a QByteArray.
-
- UTF-8 is a Unicode codec and can represent all characters in a Unicode
- string like QString.
-
- \sa toLatin1(), toLocal8Bit(), QTextCodec
-*/
-
-/*!
- \fn QVector<uint> QStringView::toUcs4() const
-
- Returns a UCS-4/UTF-32 representation of the string as a QVector<uint>.
-
- UCS-4 is a Unicode codec and therefore it is lossless. All characters from
- this string will be encoded in UCS-4. Any invalid sequence of code units in
- this string is replaced by the Unicode replacement character
- (QChar::ReplacementCharacter, which corresponds to \c{U+FFFD}).
-
- The returned vector is not 0-terminated.
-
- \sa toUtf8(), toLatin1(), toLocal8Bit(), QTextCodec
-*/
-
-/*!
- \fn template <typename QStringLike> qToStringViewIgnoringNull(const QStringLike &s);
- \since 5.10
- \internal
-
- Convert \a s to a QStringView ignoring \c{s.isNull()}.
-
- Returns a string-view that references \a{s}' data, but is never null.
-
- This is a faster way to convert a QString or QStringRef to a QStringView,
- if null QStrings can legitimately be treated as empty ones.
-
- \sa QString::isNull(), QStringRef::isNull(), QStringView
-*/
-
-/*!
- \fn bool QStringView::isRightToLeft() const
- \since 5.11
-
- Returns \c true if the string is read right to left.
-
- \sa QString::isRightToLeft()
-*/
-
-QT_END_NAMESPACE
diff --git a/src/corelib/tools/qstringview.h b/src/corelib/tools/qstringview.h
deleted file mode 100644
index 2e95c2b218..0000000000
--- a/src/corelib/tools/qstringview.h
+++ /dev/null
@@ -1,314 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2017 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.com, author Marc Mutz <marc.mutz@kdab.com>
-** Contact: http://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-#ifndef QSTRINGVIEW_H
-#define QSTRINGVIEW_H
-
-#ifndef QT_STRINGVIEW_LEVEL
-# define QT_STRINGVIEW_LEVEL 1
-#endif
-
-#include <QtCore/qchar.h>
-#include <QtCore/qbytearray.h>
-#include <QtCore/qstringliteral.h>
-#include <QtCore/qstringalgorithms.h>
-
-#include <string>
-
-QT_BEGIN_NAMESPACE
-
-class QString;
-class QStringRef;
-
-namespace QtPrivate {
-template <typename Char>
-struct IsCompatibleCharTypeHelper
- : std::integral_constant<bool,
- std::is_same<Char, QChar>::value ||
- std::is_same<Char, ushort>::value ||
-#if defined(Q_COMPILER_UNICODE_STRINGS)
- std::is_same<Char, char16_t>::value ||
-#endif
- (std::is_same<Char, wchar_t>::value && sizeof(wchar_t) == sizeof(QChar))> {};
-template <typename Char>
-struct IsCompatibleCharType
- : IsCompatibleCharTypeHelper<typename std::remove_cv<typename std::remove_reference<Char>::type>::type> {};
-
-template <typename Array>
-struct IsCompatibleArrayHelper : std::false_type {};
-template <typename Char, size_t N>
-struct IsCompatibleArrayHelper<Char[N]>
- : IsCompatibleCharType<Char> {};
-template <typename Array>
-struct IsCompatibleArray
- : IsCompatibleArrayHelper<typename std::remove_cv<typename std::remove_reference<Array>::type>::type> {};
-
-template <typename Pointer>
-struct IsCompatiblePointerHelper : std::false_type {};
-template <typename Char>
-struct IsCompatiblePointerHelper<Char*>
- : IsCompatibleCharType<Char> {};
-template <typename Pointer>
-struct IsCompatiblePointer
- : IsCompatiblePointerHelper<typename std::remove_cv<typename std::remove_reference<Pointer>::type>::type> {};
-
-template <typename T>
-struct IsCompatibleStdBasicStringHelper : std::false_type {};
-template <typename Char, typename...Args>
-struct IsCompatibleStdBasicStringHelper<std::basic_string<Char, Args...> >
- : IsCompatibleCharType<Char> {};
-
-template <typename T>
-struct IsCompatibleStdBasicString
- : IsCompatibleStdBasicStringHelper<
- typename std::remove_cv<typename std::remove_reference<T>::type>::type
- > {};
-
-} // namespace QtPrivate
-
-class QStringView
-{
-public:
-#if defined(Q_OS_WIN) && !defined(Q_COMPILER_UNICODE_STRINGS)
- typedef wchar_t storage_type;
-#else
- typedef char16_t storage_type;
-#endif
- typedef const QChar value_type;
- typedef std::ptrdiff_t difference_type;
- typedef qsizetype size_type;
- typedef value_type &reference;
- typedef value_type &const_reference;
- typedef value_type *pointer;
- typedef value_type *const_pointer;
-
- typedef pointer iterator;
- typedef const_pointer const_iterator;
- typedef std::reverse_iterator<iterator> reverse_iterator;
- typedef std::reverse_iterator<const_iterator> const_reverse_iterator;
-
-private:
- template <typename Char>
- using if_compatible_char = typename std::enable_if<QtPrivate::IsCompatibleCharType<Char>::value, bool>::type;
-
- template <typename Array>
- using if_compatible_array = typename std::enable_if<QtPrivate::IsCompatibleArray<Array>::value, bool>::type;
-
- template <typename Pointer>
- using if_compatible_pointer = typename std::enable_if<QtPrivate::IsCompatiblePointer<Pointer>::value, bool>::type;
-
- template <typename T>
- using if_compatible_string = typename std::enable_if<QtPrivate::IsCompatibleStdBasicString<T>::value, bool>::type;
-
- template <typename T>
- using if_compatible_qstring_like = typename std::enable_if<std::is_same<T, QString>::value || std::is_same<T, QStringRef>::value, bool>::type;
-
- template <typename Char, size_t N>
- static Q_DECL_CONSTEXPR qsizetype lengthHelperArray(const Char (&)[N]) Q_DECL_NOTHROW
- {
- return qsizetype(N - 1);
- }
-
- template <typename Char>
- static qsizetype lengthHelperPointer(const Char *str) Q_DECL_NOTHROW
- {
-#if defined(Q_CC_GNU) && !defined(Q_CC_CLANG) && !defined(Q_CC_INTEL)
- if (__builtin_constant_p(*str)) {
- qsizetype result = 0;
- while (*str++)
- ++result;
- return result;
- }
-#endif
- return QtPrivate::qustrlen(reinterpret_cast<const ushort *>(str));
- }
- static qsizetype lengthHelperPointer(const QChar *str) Q_DECL_NOTHROW
- {
- return QtPrivate::qustrlen(reinterpret_cast<const ushort *>(str));
- }
-
- template <typename Char>
- static const storage_type *castHelper(const Char *str) Q_DECL_NOTHROW
- { return reinterpret_cast<const storage_type*>(str); }
- static Q_DECL_CONSTEXPR const storage_type *castHelper(const storage_type *str) Q_DECL_NOTHROW
- { return str; }
-
-public:
- Q_DECL_CONSTEXPR QStringView() Q_DECL_NOTHROW
- : m_size(0), m_data(nullptr) {}
- Q_DECL_CONSTEXPR QStringView(std::nullptr_t) Q_DECL_NOTHROW
- : QStringView() {}
-
- template <typename Char, if_compatible_char<Char> = true>
- Q_DECL_CONSTEXPR QStringView(const Char *str, qsizetype len)
- : m_size((Q_ASSERT(len >= 0), Q_ASSERT(str || !len), len)),
- m_data(castHelper(str)) {}
-
- template <typename Char, if_compatible_char<Char> = true>
- Q_DECL_CONSTEXPR QStringView(const Char *f, const Char *l)
- : QStringView(f, l - f) {}
-
-#ifdef Q_CLANG_QDOC
- template <typename Char, size_t N>
- Q_DECL_CONSTEXPR QStringView(const Char (&array)[N]) Q_DECL_NOTHROW;
-
- template <typename Char>
- Q_DECL_CONSTEXPR QStringView(const Char *str) Q_DECL_NOTHROW;
-#else
- template <typename Array, if_compatible_array<Array> = true>
- Q_DECL_CONSTEXPR QStringView(const Array &str) Q_DECL_NOTHROW
- : QStringView(str, lengthHelperArray(str)) {}
-
- template <typename Pointer, if_compatible_pointer<Pointer> = true>
- Q_DECL_CONSTEXPR QStringView(const Pointer &str) Q_DECL_NOTHROW
- : QStringView(str, str ? lengthHelperPointer(str) : 0) {}
-#endif
-
-#ifdef Q_CLANG_QDOC
- QStringView(const QString &str) Q_DECL_NOTHROW;
- QStringView(const QStringRef &str) Q_DECL_NOTHROW;
-#else
- template <typename String, if_compatible_qstring_like<String> = true>
- QStringView(const String &str) Q_DECL_NOTHROW
- : QStringView(str.isNull() ? nullptr : str.data(), qsizetype(str.size())) {}
-#endif
-
- template <typename StdBasicString, if_compatible_string<StdBasicString> = true>
- QStringView(const StdBasicString &str) Q_DECL_NOTHROW
- : QStringView(str.data(), qsizetype(str.size())) {}
-
- Q_REQUIRED_RESULT inline QString toString() const; // defined in qstring.h
-
- Q_REQUIRED_RESULT Q_DECL_CONSTEXPR qsizetype size() const Q_DECL_NOTHROW { return m_size; }
- Q_REQUIRED_RESULT const_pointer data() const Q_DECL_NOTHROW { return reinterpret_cast<const_pointer>(m_data); }
- Q_REQUIRED_RESULT Q_DECL_CONSTEXPR const storage_type *utf16() const Q_DECL_NOTHROW { return m_data; }
-
- Q_REQUIRED_RESULT Q_DECL_CONSTEXPR QChar operator[](qsizetype n) const
- { return Q_ASSERT(n >= 0), Q_ASSERT(n < size()), QChar(m_data[n]); }
-
- //
- // QString API
- //
-
- Q_REQUIRED_RESULT QByteArray toLatin1() const { return QtPrivate::convertToLatin1(*this); }
- Q_REQUIRED_RESULT QByteArray toUtf8() const { return QtPrivate::convertToUtf8(*this); }
- Q_REQUIRED_RESULT QByteArray toLocal8Bit() const { return QtPrivate::convertToLocal8Bit(*this); }
- Q_REQUIRED_RESULT inline QVector<uint> toUcs4() const; // defined in qvector.h
-
- Q_REQUIRED_RESULT Q_DECL_CONSTEXPR QChar at(qsizetype n) const { return (*this)[n]; }
-
- Q_REQUIRED_RESULT Q_DECL_CONSTEXPR QStringView mid(qsizetype pos) const
- { return Q_ASSERT(pos >= 0), Q_ASSERT(pos <= size()), QStringView(m_data + pos, m_size - pos); }
- Q_REQUIRED_RESULT Q_DECL_CONSTEXPR QStringView mid(qsizetype pos, qsizetype n) const
- { return Q_ASSERT(pos >= 0), Q_ASSERT(n >= 0), Q_ASSERT(pos + n <= size()), QStringView(m_data + pos, n); }
- Q_REQUIRED_RESULT Q_DECL_CONSTEXPR QStringView left(qsizetype n) const
- { return Q_ASSERT(n >= 0), Q_ASSERT(n <= size()), QStringView(m_data, n); }
- Q_REQUIRED_RESULT Q_DECL_CONSTEXPR QStringView right(qsizetype n) const
- { return Q_ASSERT(n >= 0), Q_ASSERT(n <= size()), QStringView(m_data + m_size - n, n); }
- Q_REQUIRED_RESULT Q_DECL_CONSTEXPR QStringView chopped(qsizetype n) const
- { return Q_ASSERT(n >= 0), Q_ASSERT(n <= size()), QStringView(m_data, m_size - n); }
-
- Q_DECL_RELAXED_CONSTEXPR void truncate(qsizetype n)
- { Q_ASSERT(n >= 0); Q_ASSERT(n <= size()); m_size = n; }
- Q_DECL_RELAXED_CONSTEXPR void chop(qsizetype n)
- { Q_ASSERT(n >= 0); Q_ASSERT(n <= size()); m_size -= n; }
-
- Q_REQUIRED_RESULT QStringView trimmed() const Q_DECL_NOTHROW { return QtPrivate::trimmed(*this); }
-
- Q_REQUIRED_RESULT int compare(QStringView other, Qt::CaseSensitivity cs = Qt::CaseSensitive) const Q_DECL_NOTHROW
- { return QtPrivate::compareStrings(*this, other, cs); }
-
- Q_REQUIRED_RESULT bool startsWith(QStringView s, Qt::CaseSensitivity cs = Qt::CaseSensitive) const Q_DECL_NOTHROW
- { return QtPrivate::startsWith(*this, s, cs); }
- Q_REQUIRED_RESULT inline bool startsWith(QLatin1String s, Qt::CaseSensitivity cs = Qt::CaseSensitive) const Q_DECL_NOTHROW;
- Q_REQUIRED_RESULT bool startsWith(QChar c) const Q_DECL_NOTHROW
- { return !empty() && front() == c; }
- Q_REQUIRED_RESULT bool startsWith(QChar c, Qt::CaseSensitivity cs) const Q_DECL_NOTHROW
- { return QtPrivate::startsWith(*this, QStringView(&c, 1), cs); }
-
- Q_REQUIRED_RESULT bool endsWith(QStringView s, Qt::CaseSensitivity cs = Qt::CaseSensitive) const Q_DECL_NOTHROW
- { return QtPrivate::endsWith(*this, s, cs); }
- Q_REQUIRED_RESULT inline bool endsWith(QLatin1String s, Qt::CaseSensitivity cs = Qt::CaseSensitive) const Q_DECL_NOTHROW;
- Q_REQUIRED_RESULT bool endsWith(QChar c) const Q_DECL_NOTHROW
- { return !empty() && back() == c; }
- Q_REQUIRED_RESULT bool endsWith(QChar c, Qt::CaseSensitivity cs) const Q_DECL_NOTHROW
- { return QtPrivate::endsWith(*this, QStringView(&c, 1), cs); }
-
- Q_REQUIRED_RESULT bool isRightToLeft() const Q_DECL_NOTHROW
- { return QtPrivate::isRightToLeft(*this); }
-
- //
- // STL compatibility API:
- //
- Q_REQUIRED_RESULT const_iterator begin() const Q_DECL_NOTHROW { return data(); }
- Q_REQUIRED_RESULT const_iterator end() const Q_DECL_NOTHROW { return data() + size(); }
- Q_REQUIRED_RESULT const_iterator cbegin() const Q_DECL_NOTHROW { return begin(); }
- Q_REQUIRED_RESULT const_iterator cend() const Q_DECL_NOTHROW { return end(); }
- Q_REQUIRED_RESULT const_reverse_iterator rbegin() const Q_DECL_NOTHROW { return const_reverse_iterator(end()); }
- Q_REQUIRED_RESULT const_reverse_iterator rend() const Q_DECL_NOTHROW { return const_reverse_iterator(begin()); }
- Q_REQUIRED_RESULT const_reverse_iterator crbegin() const Q_DECL_NOTHROW { return rbegin(); }
- Q_REQUIRED_RESULT const_reverse_iterator crend() const Q_DECL_NOTHROW { return rend(); }
-
- Q_REQUIRED_RESULT Q_DECL_CONSTEXPR bool empty() const Q_DECL_NOTHROW { return size() == 0; }
- Q_REQUIRED_RESULT Q_DECL_CONSTEXPR QChar front() const { return Q_ASSERT(!empty()), QChar(m_data[0]); }
- Q_REQUIRED_RESULT Q_DECL_CONSTEXPR QChar back() const { return Q_ASSERT(!empty()), QChar(m_data[m_size - 1]); }
-
- //
- // Qt compatibility API:
- //
- Q_REQUIRED_RESULT Q_DECL_CONSTEXPR bool isNull() const Q_DECL_NOTHROW { return !m_data; }
- Q_REQUIRED_RESULT Q_DECL_CONSTEXPR bool isEmpty() const Q_DECL_NOTHROW { return empty(); }
- Q_REQUIRED_RESULT Q_DECL_CONSTEXPR int length() const /* not nothrow! */
- { return Q_ASSERT(int(size()) == size()), int(size()); }
- Q_REQUIRED_RESULT Q_DECL_CONSTEXPR QChar first() const { return front(); }
- Q_REQUIRED_RESULT Q_DECL_CONSTEXPR QChar last() const { return back(); }
-private:
- qsizetype m_size;
- const storage_type *m_data;
-};
-Q_DECLARE_TYPEINFO(QStringView, Q_PRIMITIVE_TYPE);
-
-template <typename QStringLike, typename std::enable_if<
- std::is_same<QStringLike, QString>::value || std::is_same<QStringLike, QStringRef>::value,
- bool>::type = true>
-inline QStringView qToStringViewIgnoringNull(const QStringLike &s) Q_DECL_NOTHROW
-{ return QStringView(s.data(), s.size()); }
-
-QT_END_NAMESPACE
-
-#endif /* QSTRINGVIEW_H */
diff --git a/src/corelib/tools/qt_attribution.json b/src/corelib/tools/qt_attribution.json
deleted file mode 100644
index 912da3f22c..0000000000
--- a/src/corelib/tools/qt_attribution.json
+++ /dev/null
@@ -1,39 +0,0 @@
-[
-{
- "Id": "unicode-character-database",
- "Name": "Unicode Character Database (UCD)",
- "QDocModule": "qtcore",
- "QtUsage": "Qt Core uses data obtained from UCD files for working with characters and strings.",
- "Files": "For update, see qtbase/util/unicode/README",
- "Files": "qunicodetables_p.h qunicodetables.cpp",
-
- "Description": "The Unicode Character Database (UCD) is a set of files that
- define the Unicode character properties and internal mappings.",
- "Homepage": "https://www.unicode.org/ucd/",
- "Version": "Don't use the Unicode standard version; UCD has its own 'Revision' numbers",
- "Version": "20",
- "License": "Unicode License Agreement - Data Files and Software (2016)",
- "LicenseId": "Unicode-DFS-2016",
- "LicenseFile": "UNICODE_LICENSE.txt",
- "Copyright": "Copyright (C) 1991-2018 Unicode, Inc."
-},
-{
- "Id": "unicode-cldr",
- "Name": "Unicode Common Locale Data Repository (CLDR)",
- "QDocModule": "qtcore",
- "QtUsage": "Used in Qt Core (QTimeZone, QLocale).",
- "Files": "For update, see qtbase/util/local_database/cldr2qlocalexml.py",
- "Files": "qlocale_data_p.h qtimezoneprivate_data_p.h",
-
- "Description": "The Unicode CLDR provides key building blocks for software to support the
- world's languages, with the largest and most extensive standard repository of locale data
- available.",
- "Homepage": "http://cldr.unicode.org/",
- "Version": "v35.1",
- "License": "// as specified in https://spdx.org/licenses/Unicode-DFS-2016.html",
- "License": "Unicode License Agreement - Data Files and Software (2016)",
- "LicenseId": "Unicode-DFS-2016",
- "LicenseFile": "UNICODE_LICENSE.txt",
- "Copyright": "Copyright (C) 1991-2018 Unicode, Inc."
-}
-]
diff --git a/src/corelib/tools/qtextboundaryfinder.cpp b/src/corelib/tools/qtextboundaryfinder.cpp
deleted file mode 100644
index 67dd15377b..0000000000
--- a/src/corelib/tools/qtextboundaryfinder.cpp
+++ /dev/null
@@ -1,511 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-#include <QtCore/qtextboundaryfinder.h>
-#include <QtCore/qvarlengtharray.h>
-
-#include <private/qunicodetools_p.h>
-
-QT_BEGIN_NAMESPACE
-
-class QTextBoundaryFinderPrivate
-{
-public:
- QCharAttributes attributes[1];
-};
-
-static void init(QTextBoundaryFinder::BoundaryType type, const QChar *chars, int length, QCharAttributes *attributes)
-{
- const ushort *string = reinterpret_cast<const ushort *>(chars);
-
- QVarLengthArray<QUnicodeTools::ScriptItem> scriptItems;
- {
- QVarLengthArray<uchar> scripts(length);
-
- QUnicodeTools::initScripts(string, length, scripts.data());
-
- int start = 0;
- for (int i = start + 1; i <= length; ++i) {
- if (i == length || scripts[i] != scripts[start]) {
- QUnicodeTools::ScriptItem item;
- item.position = start;
- item.script = scripts[start];
- scriptItems.append(item);
- start = i;
- }
- }
- }
-
- QUnicodeTools::CharAttributeOptions options = 0;
- switch (type) {
- case QTextBoundaryFinder::Grapheme: options |= QUnicodeTools::GraphemeBreaks; break;
- case QTextBoundaryFinder::Word: options |= QUnicodeTools::WordBreaks; break;
- case QTextBoundaryFinder::Sentence: options |= QUnicodeTools::SentenceBreaks; break;
- case QTextBoundaryFinder::Line: options |= QUnicodeTools::LineBreaks; break;
- default: break;
- }
- QUnicodeTools::initCharAttributes(string, length, scriptItems.data(), scriptItems.count(), attributes, options);
-}
-
-/*!
- \class QTextBoundaryFinder
- \inmodule QtCore
-
- \brief The QTextBoundaryFinder class provides a way of finding Unicode text boundaries in a string.
-
- \since 4.4
- \ingroup tools
- \ingroup shared
- \ingroup string-processing
- \reentrant
-
- QTextBoundaryFinder allows to find Unicode text boundaries in a
- string, accordingly to the Unicode text boundary specification (see
- \l{http://www.unicode.org/reports/tr14/}{Unicode Standard Annex #14} and
- \l{http://www.unicode.org/reports/tr29/}{Unicode Standard Annex #29}).
-
- QTextBoundaryFinder can operate on a QString in four possible
- modes depending on the value of \a BoundaryType.
-
- Units of Unicode characters that make up what the user thinks of
- as a character or basic unit of the language are here called
- Grapheme clusters. The two unicode characters 'A' + diaeresis do
- for example form one grapheme cluster as the user thinks of them
- as one character, yet it is in this case represented by two
- unicode code points
- (see \l{http://www.unicode.org/reports/tr29/#Grapheme_Cluster_Boundaries}).
-
- Word boundaries are there to locate the start and end of what a
- language considers to be a word
- (see \l{http://www.unicode.org/reports/tr29/#Word_Boundaries}).
-
- Line break boundaries give possible places where a line break
- might happen and sentence boundaries will show the beginning and
- end of whole sentences
- (see \l{http://www.unicode.org/reports/tr29/#Sentence_Boundaries} and
- \l{http://www.unicode.org/reports/tr14/}).
-
- The first position in a string is always a valid boundary and
- refers to the position before the first character. The last
- position at the length of the string is also valid and refers
- to the position after the last character.
-*/
-
-/*!
- \enum QTextBoundaryFinder::BoundaryType
-
- \value Grapheme Finds a grapheme which is the smallest boundary. It
- including letters, punctuation marks, numerals and more.
- \value Word Finds a word.
- \value Line Finds possible positions for breaking the text into multiple
- lines.
- \value Sentence Finds sentence boundaries. These include periods, question
- marks etc.
-*/
-
-/*!
- \enum QTextBoundaryFinder::BoundaryReason
-
- \value NotAtBoundary The boundary finder is not at a boundary position.
- \value BreakOpportunity The boundary finder is at a break opportunity position.
- Such a break opportunity might also be an item boundary
- (either StartOfItem, EndOfItem, or combination of both),
- a mandatory line break, or a soft hyphen.
- \value StartOfItem Since 5.0. The boundary finder is at the start of
- a grapheme, a word, a sentence, or a line.
- \value EndOfItem Since 5.0. The boundary finder is at the end of
- a grapheme, a word, a sentence, or a line.
- \value MandatoryBreak Since 5.0. The boundary finder is at the end of line
- (can occur for a Line boundary type only).
- \value SoftHyphen The boundary finder is at the soft hyphen
- (can occur for a Line boundary type only).
-*/
-
-/*!
- Constructs an invalid QTextBoundaryFinder object.
-*/
-QTextBoundaryFinder::QTextBoundaryFinder()
- : t(Grapheme)
- , chars(0)
- , length(0)
- , freePrivate(true)
- , d(0)
-{
-}
-
-/*!
- Copies the QTextBoundaryFinder object, \a other.
-*/
-QTextBoundaryFinder::QTextBoundaryFinder(const QTextBoundaryFinder &other)
- : t(other.t)
- , s(other.s)
- , chars(other.chars)
- , length(other.length)
- , pos(other.pos)
- , freePrivate(true)
- , d(0)
-{
- if (other.d) {
- Q_ASSERT(length > 0);
- d = (QTextBoundaryFinderPrivate *) malloc((length + 1) * sizeof(QCharAttributes));
- Q_CHECK_PTR(d);
- memcpy(d, other.d, (length + 1) * sizeof(QCharAttributes));
- }
-}
-
-/*!
- Assigns the object, \a other, to another QTextBoundaryFinder object.
-*/
-QTextBoundaryFinder &QTextBoundaryFinder::operator=(const QTextBoundaryFinder &other)
-{
- if (&other == this)
- return *this;
-
- if (other.d) {
- Q_ASSERT(other.length > 0);
- uint newCapacity = (other.length + 1) * sizeof(QCharAttributes);
- QTextBoundaryFinderPrivate *newD = (QTextBoundaryFinderPrivate *) realloc(freePrivate ? d : 0, newCapacity);
- Q_CHECK_PTR(newD);
- freePrivate = true;
- d = newD;
- }
-
- t = other.t;
- s = other.s;
- chars = other.chars;
- length = other.length;
- pos = other.pos;
-
- if (other.d) {
- memcpy(d, other.d, (length + 1) * sizeof(QCharAttributes));
- } else {
- if (freePrivate)
- free(d);
- d = 0;
- }
-
- return *this;
-}
-
-/*!
- Destructs the QTextBoundaryFinder object.
-*/
-QTextBoundaryFinder::~QTextBoundaryFinder()
-{
- Q_UNUSED(unused);
- if (freePrivate)
- free(d);
-}
-
-/*!
- Creates a QTextBoundaryFinder object of \a type operating on \a string.
-*/
-QTextBoundaryFinder::QTextBoundaryFinder(BoundaryType type, const QString &string)
- : t(type)
- , s(string)
- , chars(string.unicode())
- , length(string.length())
- , pos(0)
- , freePrivate(true)
- , d(0)
-{
- if (length > 0) {
- d = (QTextBoundaryFinderPrivate *) malloc((length + 1) * sizeof(QCharAttributes));
- Q_CHECK_PTR(d);
- init(t, chars, length, d->attributes);
- }
-}
-
-/*!
- Creates a QTextBoundaryFinder object of \a type operating on \a chars
- with \a length.
-
- \a buffer is an optional working buffer of size \a bufferSize you can pass to
- the QTextBoundaryFinder. If the buffer is large enough to hold the working
- data required (bufferSize >= length + 1), it will use this
- instead of allocating its own buffer.
-
- \warning QTextBoundaryFinder does not create a copy of \a chars. It is the
- application programmer's responsibility to ensure the array is allocated for
- as long as the QTextBoundaryFinder object stays alive. The same applies to
- \a buffer.
-*/
-QTextBoundaryFinder::QTextBoundaryFinder(BoundaryType type, const QChar *chars, int length, unsigned char *buffer, int bufferSize)
- : t(type)
- , chars(chars)
- , length(length)
- , pos(0)
- , freePrivate(true)
- , d(0)
-{
- if (!chars) {
- length = 0;
- } else if (length > 0) {
- if (buffer && (uint)bufferSize >= (length + 1) * sizeof(QCharAttributes)) {
- d = (QTextBoundaryFinderPrivate *)buffer;
- freePrivate = false;
- } else {
- d = (QTextBoundaryFinderPrivate *) malloc((length + 1) * sizeof(QCharAttributes));
- Q_CHECK_PTR(d);
- }
- init(t, chars, length, d->attributes);
- }
-}
-
-/*!
- Moves the finder to the start of the string. This is equivalent to setPosition(0).
-
- \sa setPosition(), position()
-*/
-void QTextBoundaryFinder::toStart()
-{
- pos = 0;
-}
-
-/*!
- Moves the finder to the end of the string. This is equivalent to setPosition(string.length()).
-
- \sa setPosition(), position()
-*/
-void QTextBoundaryFinder::toEnd()
-{
- pos = length;
-}
-
-/*!
- Returns the current position of the QTextBoundaryFinder.
-
- The range is from 0 (the beginning of the string) to the length of
- the string inclusive.
-
- \sa setPosition()
-*/
-int QTextBoundaryFinder::position() const
-{
- return pos;
-}
-
-/*!
- Sets the current position of the QTextBoundaryFinder to \a position.
-
- If \a position is out of bounds, it will be bound to only valid
- positions. In this case, valid positions are from 0 to the length of
- the string inclusive.
-
- \sa position()
-*/
-void QTextBoundaryFinder::setPosition(int position)
-{
- pos = qBound(0, position, length);
-}
-
-/*! \fn QTextBoundaryFinder::BoundaryType QTextBoundaryFinder::type() const
-
- Returns the type of the QTextBoundaryFinder.
-*/
-
-/*! \fn bool QTextBoundaryFinder::isValid() const
-
- Returns \c true if the text boundary finder is valid; otherwise returns \c false.
- A default QTextBoundaryFinder is invalid.
-*/
-
-/*!
- Returns the string the QTextBoundaryFinder object operates on.
-*/
-QString QTextBoundaryFinder::string() const
-{
- if (chars == s.unicode() && length == s.length())
- return s;
- return QString(chars, length);
-}
-
-
-/*!
- Moves the QTextBoundaryFinder to the next boundary position and returns that position.
-
- Returns -1 if there is no next boundary.
-*/
-int QTextBoundaryFinder::toNextBoundary()
-{
- if (!d || pos < 0 || pos >= length) {
- pos = -1;
- return pos;
- }
-
- ++pos;
- switch(t) {
- case Grapheme:
- while (pos < length && !d->attributes[pos].graphemeBoundary)
- ++pos;
- break;
- case Word:
- while (pos < length && !d->attributes[pos].wordBreak)
- ++pos;
- break;
- case Sentence:
- while (pos < length && !d->attributes[pos].sentenceBoundary)
- ++pos;
- break;
- case Line:
- while (pos < length && !d->attributes[pos].lineBreak)
- ++pos;
- break;
- }
-
- return pos;
-}
-
-/*!
- Moves the QTextBoundaryFinder to the previous boundary position and returns that position.
-
- Returns -1 if there is no previous boundary.
-*/
-int QTextBoundaryFinder::toPreviousBoundary()
-{
- if (!d || pos <= 0 || pos > length) {
- pos = -1;
- return pos;
- }
-
- --pos;
- switch(t) {
- case Grapheme:
- while (pos > 0 && !d->attributes[pos].graphemeBoundary)
- --pos;
- break;
- case Word:
- while (pos > 0 && !d->attributes[pos].wordBreak)
- --pos;
- break;
- case Sentence:
- while (pos > 0 && !d->attributes[pos].sentenceBoundary)
- --pos;
- break;
- case Line:
- while (pos > 0 && !d->attributes[pos].lineBreak)
- --pos;
- break;
- }
-
- return pos;
-}
-
-/*!
- Returns \c true if the object's position() is currently at a valid text boundary.
-*/
-bool QTextBoundaryFinder::isAtBoundary() const
-{
- if (!d || pos < 0 || pos > length)
- return false;
-
- switch(t) {
- case Grapheme:
- return d->attributes[pos].graphemeBoundary;
- case Word:
- return d->attributes[pos].wordBreak;
- case Sentence:
- return d->attributes[pos].sentenceBoundary;
- case Line:
- // ### TR#14 LB2 prohibits break at sot
- return d->attributes[pos].lineBreak || pos == 0;
- }
- return false;
-}
-
-/*!
- Returns the reasons for the boundary finder to have chosen the current position as a boundary.
-*/
-QTextBoundaryFinder::BoundaryReasons QTextBoundaryFinder::boundaryReasons() const
-{
- BoundaryReasons reasons = NotAtBoundary;
- if (!d || pos < 0 || pos > length)
- return reasons;
-
- const QCharAttributes attr = d->attributes[pos];
- switch (t) {
- case Grapheme:
- if (attr.graphemeBoundary) {
- reasons |= BreakOpportunity | StartOfItem | EndOfItem;
- if (pos == 0)
- reasons &= (~EndOfItem);
- else if (pos == length)
- reasons &= (~StartOfItem);
- }
- break;
- case Word:
- if (attr.wordBreak) {
- reasons |= BreakOpportunity;
- if (attr.wordStart)
- reasons |= StartOfItem;
- if (attr.wordEnd)
- reasons |= EndOfItem;
- }
- break;
- case Sentence:
- if (attr.sentenceBoundary) {
- reasons |= BreakOpportunity | StartOfItem | EndOfItem;
- if (pos == 0)
- reasons &= (~EndOfItem);
- else if (pos == length)
- reasons &= (~StartOfItem);
- }
- break;
- case Line:
- // ### TR#14 LB2 prohibits break at sot
- if (attr.lineBreak || pos == 0) {
- reasons |= BreakOpportunity;
- if (attr.mandatoryBreak || pos == 0) {
- reasons |= MandatoryBreak | StartOfItem | EndOfItem;
- if (pos == 0)
- reasons &= (~EndOfItem);
- else if (pos == length)
- reasons &= (~StartOfItem);
- } else if (pos > 0 && chars[pos - 1].unicode() == QChar::SoftHyphen) {
- reasons |= SoftHyphen;
- }
- }
- break;
- default:
- break;
- }
-
- return reasons;
-}
-
-QT_END_NAMESPACE
diff --git a/src/corelib/tools/qtextboundaryfinder.h b/src/corelib/tools/qtextboundaryfinder.h
deleted file mode 100644
index b1e5008f54..0000000000
--- a/src/corelib/tools/qtextboundaryfinder.h
+++ /dev/null
@@ -1,111 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#ifndef QTEXTBOUNDARYFINDER_H
-#define QTEXTBOUNDARYFINDER_H
-
-#include <QtCore/qchar.h>
-#include <QtCore/qstring.h>
-
-QT_BEGIN_NAMESPACE
-
-
-class QTextBoundaryFinderPrivate;
-
-class Q_CORE_EXPORT QTextBoundaryFinder
-{
-public:
- QTextBoundaryFinder();
- QTextBoundaryFinder(const QTextBoundaryFinder &other);
- QTextBoundaryFinder &operator=(const QTextBoundaryFinder &other);
- ~QTextBoundaryFinder();
-
- enum BoundaryType {
- Grapheme,
- Word,
- Sentence,
- Line
- };
-
- enum BoundaryReason {
- NotAtBoundary = 0,
- BreakOpportunity = 0x1f,
- StartOfItem = 0x20,
- EndOfItem = 0x40,
- MandatoryBreak = 0x80,
- SoftHyphen = 0x100
- };
- Q_DECLARE_FLAGS( BoundaryReasons, BoundaryReason )
-
- QTextBoundaryFinder(BoundaryType type, const QString &string);
- QTextBoundaryFinder(BoundaryType type, const QChar *chars, int length, unsigned char *buffer = nullptr, int bufferSize = 0);
-
- inline bool isValid() const { return d; }
-
- inline BoundaryType type() const { return t; }
- QString string() const;
-
- void toStart();
- void toEnd();
- int position() const;
- void setPosition(int position);
-
- int toNextBoundary();
- int toPreviousBoundary();
-
- bool isAtBoundary() const;
- BoundaryReasons boundaryReasons() const;
-
-private:
- BoundaryType t;
- QString s;
- const QChar *chars;
- int length;
- int pos;
- uint freePrivate : 1;
- uint unused : 31;
- QTextBoundaryFinderPrivate *d;
-};
-
-Q_DECLARE_OPERATORS_FOR_FLAGS(QTextBoundaryFinder::BoundaryReasons)
-
-QT_END_NAMESPACE
-
-#endif
-
diff --git a/src/corelib/tools/qtimeline.cpp b/src/corelib/tools/qtimeline.cpp
index fa6c45aa11..0b11e7c77b 100644
--- a/src/corelib/tools/qtimeline.cpp
+++ b/src/corelib/tools/qtimeline.cpp
@@ -526,29 +526,24 @@ QTimeLine::CurveShape QTimeLine::curveShape() const
return EaseInOutCurve;
}
-void QTimeLine::setCurveShape(CurveShape shape)
+static QEasingCurve::Type convert(QTimeLine::CurveShape shape)
{
switch (shape) {
- default:
- case EaseInOutCurve:
- setEasingCurve(QEasingCurve(QEasingCurve::InOutSine));
- break;
- case EaseInCurve:
- setEasingCurve(QEasingCurve(QEasingCurve::InCurve));
- break;
- case EaseOutCurve:
- setEasingCurve(QEasingCurve(QEasingCurve::OutCurve));
- break;
- case LinearCurve:
- setEasingCurve(QEasingCurve(QEasingCurve::Linear));
- break;
- case SineCurve:
- setEasingCurve(QEasingCurve(QEasingCurve::SineCurve));
- break;
- case CosineCurve:
- setEasingCurve(QEasingCurve(QEasingCurve::CosineCurve));
- break;
+#define CASE(x, y) case QTimeLine::x: return QEasingCurve::y
+ CASE(EaseInOutCurve, InOutSine);
+ CASE(EaseInCurve, InCurve);
+ CASE(EaseOutCurve, OutCurve);
+ CASE(LinearCurve, Linear);
+ CASE(SineCurve, SineCurve);
+ CASE(CosineCurve, CosineCurve);
+#undef CASE
}
+ Q_UNREACHABLE();
+}
+
+void QTimeLine::setCurveShape(CurveShape shape)
+{
+ setEasingCurve(convert(shape));
}
/*!
diff --git a/src/corelib/tools/qtimeline.h b/src/corelib/tools/qtimeline.h
index d9982bdb58..9a60cd679f 100644
--- a/src/corelib/tools/qtimeline.h
+++ b/src/corelib/tools/qtimeline.h
@@ -40,6 +40,10 @@
#ifndef QTIMELINE_H
#define QTIMELINE_H
+#include <QtCore/qglobal.h>
+
+QT_REQUIRE_CONFIG(easingcurve);
+
#include <QtCore/qeasingcurve.h>
#include <QtCore/qobject.h>
diff --git a/src/corelib/tools/qtimezone.cpp b/src/corelib/tools/qtimezone.cpp
deleted file mode 100644
index cbc6b50c98..0000000000
--- a/src/corelib/tools/qtimezone.cpp
+++ /dev/null
@@ -1,997 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2013 John Layt <jlayt@kde.org>
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-
-#include "qtimezone.h"
-#include "qtimezoneprivate_p.h"
-
-#include <QtCore/qdatastream.h>
-#include <QtCore/qdatetime.h>
-
-#include <qdebug.h>
-
-#include <algorithm>
-
-QT_BEGIN_NAMESPACE
-
-// Create default time zone using appropriate backend
-static QTimeZonePrivate *newBackendTimeZone()
-{
-#ifdef QT_NO_SYSTEMLOCALE
-#if QT_CONFIG(icu)
- return new QIcuTimeZonePrivate();
-#else
- return new QUtcTimeZonePrivate();
-#endif
-#else
-#if defined Q_OS_MAC
- return new QMacTimeZonePrivate();
-#elif defined(Q_OS_ANDROID) && !defined(Q_OS_ANDROID_EMBEDDED)
- return new QAndroidTimeZonePrivate();
-#elif defined(Q_OS_UNIX) || defined(Q_OS_ANDROID_EMBEDDED)
- return new QTzTimeZonePrivate();
-#elif QT_CONFIG(icu)
- return new QIcuTimeZonePrivate();
-#elif defined Q_OS_WIN
- return new QWinTimeZonePrivate();
-#else
- return new QUtcTimeZonePrivate();
-#endif // System Locales
-#endif // QT_NO_SYSTEMLOCALE
-}
-
-// Create named time zone using appropriate backend
-static QTimeZonePrivate *newBackendTimeZone(const QByteArray &ianaId)
-{
-#ifdef QT_NO_SYSTEMLOCALE
-#if QT_CONFIG(icu)
- return new QIcuTimeZonePrivate(ianaId);
-#else
- return new QUtcTimeZonePrivate(ianaId);
-#endif
-#else
-#if defined Q_OS_MAC
- return new QMacTimeZonePrivate(ianaId);
-#elif defined(Q_OS_ANDROID) && !defined(Q_OS_ANDROID_EMBEDDED)
- return new QAndroidTimeZonePrivate(ianaId);
-#elif defined(Q_OS_UNIX) || defined(Q_OS_ANDROID_EMBEDDED)
- return new QTzTimeZonePrivate(ianaId);
-#elif QT_CONFIG(icu)
- return new QIcuTimeZonePrivate(ianaId);
-#elif defined Q_OS_WIN
- return new QWinTimeZonePrivate(ianaId);
-#else
- return new QUtcTimeZonePrivate(ianaId);
-#endif // System Locales
-#endif // QT_NO_SYSTEMLOCALE
-}
-
-class QTimeZoneSingleton
-{
-public:
- QTimeZoneSingleton() : backend(newBackendTimeZone()) {}
-
- // The backend_tz is the tz to use in static methods such as availableTimeZoneIds() and
- // isTimeZoneIdAvailable() and to create named IANA time zones. This is usually the host
- // system, but may be different if the host resources are insufficient or if
- // QT_NO_SYSTEMLOCALE is set. A simple UTC backend is used if no alternative is available.
- QSharedDataPointer<QTimeZonePrivate> backend;
-};
-
-Q_GLOBAL_STATIC(QTimeZoneSingleton, global_tz);
-
-/*!
- \class QTimeZone
- \inmodule QtCore
- \since 5.2
-
- \brief The QTimeZone class converts between UTC and local time in a specific
- time zone.
-
- \threadsafe
-
- This class provides a stateless calculator for time zone conversions
- between UTC and the local time in a specific time zone. By default it uses
- the host system time zone data to perform these conversions.
-
- This class is primarily designed for use in QDateTime; most applications
- will not need to access this class directly and should instead use
- QDateTime with a Qt::TimeSpec of Qt::TimeZone.
-
- \note For consistency with QDateTime, QTimeZone does not account for leap
- seconds.
-
- \section1 Remarks
-
- \section2 IANA Time Zone IDs
-
- QTimeZone uses the IANA time zone IDs as defined in the IANA Time Zone
- Database (http://www.iana.org/time-zones). This is to ensure a standard ID
- across all supported platforms. Most platforms support the IANA IDs
- and the IANA Database natively, but for Windows a mapping is required to
- the native IDs. See below for more details.
-
- The IANA IDs can and do change on a regular basis, and can vary depending
- on how recently the host system data was updated. As such you cannot rely
- on any given ID existing on any host system. You must use
- availableTimeZoneIds() to determine what IANA IDs are available.
-
- The IANA IDs and database are also know as the Olson IDs and database,
- named after their creator.
-
- \section2 UTC Offset Time Zones
-
- A default UTC time zone backend is provided which is always guaranteed to
- be available. This provides a set of generic Offset From UTC time zones
- in the range UTC-14:00 to UTC+14:00. These time zones can be created
- using either the standard ISO format names "UTC+00:00" as listed by
- availableTimeZoneIds(), or using the number of offset seconds.
-
- \section2 Windows Time Zones
-
- Windows native time zone support is severely limited compared to the
- standard IANA TZ Database. Windows time zones cover larger geographic
- areas and are thus less accurate in their conversions. They also do not
- support as much historic conversion data and so may only be accurate for
- the current year.
-
- QTimeZone uses a conversion table derived form the Unicode CLDR data to map
- between IANA IDs and Windows IDs. Depending on your version of Windows
- and Qt, this table may not be able to provide a valid conversion, in which
- "UTC" will be returned.
-
- QTimeZone provides a public API to use this conversion table. The Windows ID
- used is the Windows Registry Key for the time zone which is also the MS
- Exchange EWS ID as well, but is different to the Time Zone Name (TZID) and
- COD code used by MS Exchange in versions before 2007.
-
- \section2 System Time Zone
-
- QTimeZone does not support any concept of a system or default time zone.
- If you require a QDateTime that uses the current system time zone at any
- given moment then you should use a Qt::TimeSpec of Qt::LocalTime.
-
- The method systemTimeZoneId() returns the current system IANA time zone
- ID which on Unix-like systems will always be correct. On Windows this ID is
- translated from the Windows system ID using an internal translation
- table and the user's selected country. As a consequence there is a small
- chance any Windows install may have IDs not known by Qt, in which case
- "UTC" will be returned.
-
- Creating a new QTimeZone instance using the system time zone ID will only
- produce a fixed named copy of the time zone, it will not change if the
- system time zone changes.
-
- \section2 Time Zone Offsets
-
- The difference between UTC and the local time in a time zone is expressed
- as an offset in seconds from UTC, i.e. the number of seconds to add to UTC
- to obtain the local time. The total offset is comprised of two component
- parts, the standard time offset and the daylight-saving time offset. The
- standard time offset is the number of seconds to add to UTC to obtain
- standard time in the time zone. The daylight-saving time offset is the
- number of seconds to add to the standard time offset to obtain
- daylight-saving time (abbreviated DST and sometimes called "daylight time"
- or "summer time") in the time zone.
-
- Note that the standard and DST offsets for a time zone may change over time
- as countries have changed DST laws or even their standard time offset.
-
- \section2 License
-
- This class includes data obtained from the CLDR data files under the terms
- of the Unicode Data Files and Software License. See
- \l{Unicode Common Locale Data Repository (CLDR)} for details.
-
- \sa QDateTime
-*/
-
-/*!
- \enum QTimeZone::anonymous
-
- Sane UTC offsets range from -14 to +14 hours.
- No known zone > 12 hrs West of Greenwich (Baker Island, USA).
- No known zone > 14 hrs East of Greenwich (Kiritimati, Christmas Island, Kiribati).
-
- \value MinUtcOffsetSecs
- -14 * 3600,
-
- \value MaxUtcOffsetSecs
- +14 * 3600
-*/
-
-/*!
- \enum QTimeZone::TimeType
-
- The type of time zone time, for example when requesting the name. In time
- zones that do not apply DST, all three values may return the same result.
-
- \value StandardTime
- The standard time in a time zone, i.e. when Daylight-Saving is not
- in effect.
- For example when formatting a display name this will show something
- like "Pacific Standard Time".
- \value DaylightTime
- A time when Daylight-Saving is in effect.
- For example when formatting a display name this will show something
- like "Pacific daylight-saving time".
- \value GenericTime
- A time which is not specifically Standard or Daylight-Saving time,
- either an unknown time or a neutral form.
- For example when formatting a display name this will show something
- like "Pacific Time".
-*/
-
-/*!
- \enum QTimeZone::NameType
-
- The type of time zone name.
-
- \value DefaultName
- The default form of the time zone name, e.g. LongName, ShortName or OffsetName
- \value LongName
- The long form of the time zone name, e.g. "Central European Time"
- \value ShortName
- The short form of the time zone name, usually an abbreviation, e.g. "CET"
- \value OffsetName
- The standard ISO offset form of the time zone name, e.g. "UTC+01:00"
-*/
-
-/*!
- \class QTimeZone::OffsetData
- \inmodule QtCore
-
- The time zone offset data for a given moment in time, i.e. the time zone
- offsets and abbreviation to use at that moment in time.
-
- \list
- \li OffsetData::atUtc The datetime of the offset data in UTC time.
- \li OffsetData::offsetFromUtc The total offset from UTC in effect at the datetime.
- \li OffsetData::standardTimeOffset The standard time offset component of the total offset.
- \li OffsetData::daylightTimeOffset The DST offset component of the total offset.
- \li OffsetData::abbreviation The abbreviation in effect at the datetime.
- \endlist
-
- For example, for time zone "Europe/Berlin" the OffsetDate in standard and DST might be:
-
- \list
- \li atUtc = QDateTime(QDate(2013, 1, 1), QTime(0, 0, 0), Qt::UTC)
- \li offsetFromUtc = 3600
- \li standardTimeOffset = 3600
- \li daylightTimeOffset = 0
- \li abbreviation = "CET"
- \endlist
-
- \list
- \li atUtc = QDateTime(QDate(2013, 6, 1), QTime(0, 0, 0), Qt::UTC)
- \li offsetFromUtc = 7200
- \li standardTimeOffset = 3600
- \li daylightTimeOffset = 3600
- \li abbreviation = "CEST"
- \endlist
-*/
-
-/*!
- \typedef QTimeZone::OffsetDataList
-
- Synonym for QVector<OffsetData>.
-*/
-
-/*!
- Create a null/invalid time zone instance.
-*/
-
-QTimeZone::QTimeZone() Q_DECL_NOTHROW
- : d(0)
-{
-}
-
-/*!
- Creates an instance of the requested time zone \a ianaId.
-
- The ID must be one of the available system IDs otherwise an invalid
- time zone will be returned.
-
- \sa availableTimeZoneIds()
-*/
-
-QTimeZone::QTimeZone(const QByteArray &ianaId)
-{
- // Try and see if it's a valid UTC offset ID, just as quick to try create as look-up
- d = new QUtcTimeZonePrivate(ianaId);
- // If not a valid UTC offset ID then try create it with the system backend
- // Relies on backend not creating valid tz with invalid name
- if (!d->isValid())
- d = newBackendTimeZone(ianaId);
-}
-
-/*!
- Creates an instance of a time zone with the requested Offset from UTC of
- \a offsetSeconds.
-
- The \a offsetSeconds from UTC must be in the range -14 hours to +14 hours
- otherwise an invalid time zone will be returned.
-*/
-
-QTimeZone::QTimeZone(int offsetSeconds)
- : d((offsetSeconds >= MinUtcOffsetSecs && offsetSeconds <= MaxUtcOffsetSecs)
- ? new QUtcTimeZonePrivate(offsetSeconds) : nullptr)
-{
-}
-
-/*!
- Creates a custom time zone with an ID of \a ianaId and an offset from UTC
- of \a offsetSeconds. The \a name will be the name used by displayName()
- for the LongName, the \a abbreviation will be used by displayName() for the
- ShortName and by abbreviation(), and the optional \a country will be used
- by country(). The \a comment is an optional note that may be displayed in
- a GUI to assist users in selecting a time zone.
-
- The \a ianaId must not be one of the available system IDs returned by
- availableTimeZoneIds(). The \a offsetSeconds from UTC must be in the range
- -14 hours to +14 hours.
-
- If the custom time zone does not have a specific country then set it to the
- default value of QLocale::AnyCountry.
-*/
-
-QTimeZone::QTimeZone(const QByteArray &ianaId, int offsetSeconds, const QString &name,
- const QString &abbreviation, QLocale::Country country, const QString &comment)
- : d()
-{
- if (!isTimeZoneIdAvailable(ianaId))
- d = new QUtcTimeZonePrivate(ianaId, offsetSeconds, name, abbreviation, country, comment);
-}
-
-/*!
- \internal
-
- Private. Create time zone with given private backend
-*/
-
-QTimeZone::QTimeZone(QTimeZonePrivate &dd)
- : d(&dd)
-{
-}
-
-/*!
- Copy constructor, copy \a other to this.
-*/
-
-QTimeZone::QTimeZone(const QTimeZone &other)
- : d(other.d)
-{
-}
-
-/*!
- Destroys the time zone.
-*/
-
-QTimeZone::~QTimeZone()
-{
-}
-
-/*!
- \fn QTimeZone::swap(QTimeZone &other)
-
- Swaps this time zone instance with \a other. This function is very
- fast and never fails.
-*/
-
-/*!
- Assignment operator, assign \a other to this.
-*/
-
-QTimeZone &QTimeZone::operator=(const QTimeZone &other)
-{
- d = other.d;
- return *this;
-}
-
-/*
- \fn void QTimeZone::swap(QTimeZone &other)
-
- Swaps this timezone with \a other. This function is very fast and
- never fails.
-*/
-
-/*!
- \fn QTimeZone &QTimeZone::operator=(QTimeZone &&other)
-
- Move-assigns \a other to this QTimeZone instance, transferring the
- ownership of the managed pointer to this instance.
-*/
-
-/*!
- Returns \c true if this time zone is equal to the \a other time zone.
-*/
-
-bool QTimeZone::operator==(const QTimeZone &other) const
-{
- if (d && other.d)
- return (*d == *other.d);
- else
- return (d == other.d);
-}
-
-/*!
- Returns \c true if this time zone is not equal to the \a other time zone.
-*/
-
-bool QTimeZone::operator!=(const QTimeZone &other) const
-{
- if (d && other.d)
- return (*d != *other.d);
- else
- return (d != other.d);
-}
-
-/*!
- Returns \c true if this time zone is valid.
-*/
-
-bool QTimeZone::isValid() const
-{
- if (d)
- return d->isValid();
- else
- return false;
-}
-
-/*!
- Returns the IANA ID for the time zone.
-
- IANA IDs are used on all platforms. On Windows these are translated
- from the Windows ID into the closest IANA ID for the time zone and country.
-*/
-
-QByteArray QTimeZone::id() const
-{
- if (d)
- return d->id();
- else
- return QByteArray();
-}
-
-/*!
- Returns the country for the time zone.
-*/
-
-QLocale::Country QTimeZone::country() const
-{
- if (isValid())
- return d->country();
- else
- return QLocale::AnyCountry;
-}
-
-/*!
- Returns any comment for the time zone.
-
- A comment may be provided by the host platform to assist users in
- choosing the correct time zone. Depending on the platform this may not
- be localized.
-*/
-
-QString QTimeZone::comment() const
-{
- if (isValid())
- return d->comment();
- else
- return QString();
-}
-
-/*!
- Returns the localized time zone display name at the given \a atDateTime
- for the given \a nameType in the given \a locale. The \a nameType and
- \a locale requested may not be supported on all platforms, in which case
- the best available option will be returned.
-
- If the \a locale is not provided then the application default locale will
- be used.
-
- The display name may change depending on DST or historical events.
-
- \sa abbreviation()
-*/
-
-QString QTimeZone::displayName(const QDateTime &atDateTime, NameType nameType,
- const QLocale &locale) const
-{
- if (isValid())
- return d->displayName(atDateTime.toMSecsSinceEpoch(), nameType, locale);
- else
- return QString();
-}
-
-/*!
- Returns the localized time zone display name for the given \a timeType
- and \a nameType in the given \a locale. The \a nameType and \a locale
- requested may not be supported on all platforms, in which case the best
- available option will be returned.
-
- If the \a locale is not provided then the application default locale will
- be used.
-
- Where the time zone display names have changed over time then the most
- recent names will be used.
-
- \sa abbreviation()
-*/
-
-QString QTimeZone::displayName(TimeType timeType, NameType nameType,
- const QLocale &locale) const
-{
- if (isValid())
- return d->displayName(timeType, nameType, locale);
- else
- return QString();
-}
-
-/*!
- Returns the time zone abbreviation at the given \a atDateTime. The
- abbreviation may change depending on DST or even historical events.
-
- Note that the abbreviation is not guaranteed to be unique to this time zone
- and should not be used in place of the ID or display name.
-
- \sa displayName()
-*/
-
-QString QTimeZone::abbreviation(const QDateTime &atDateTime) const
-{
- if (isValid())
- return d->abbreviation(atDateTime.toMSecsSinceEpoch());
- else
- return QString();
-}
-
-/*!
- Returns the total effective offset at the given \a atDateTime, i.e. the
- number of seconds to add to UTC to obtain the local time. This includes
- any DST offset that may be in effect, i.e. it is the sum of
- standardTimeOffset() and daylightTimeOffset() for the given datetime.
-
- For example, for the time zone "Europe/Berlin" the standard time offset is
- +3600 seconds and the DST offset is +3600 seconds. During standard time
- offsetFromUtc() will return +3600 (UTC+01:00), and during DST it will
- return +7200 (UTC+02:00).
-
- \sa standardTimeOffset(), daylightTimeOffset()
-*/
-
-int QTimeZone::offsetFromUtc(const QDateTime &atDateTime) const
-{
- if (isValid())
- return d->offsetFromUtc(atDateTime.toMSecsSinceEpoch());
- else
- return 0;
-}
-
-/*!
- Returns the standard time offset at the given \a atDateTime, i.e. the
- number of seconds to add to UTC to obtain the local Standard Time. This
- excludes any DST offset that may be in effect.
-
- For example, for the time zone "Europe/Berlin" the standard time offset is
- +3600 seconds. During both standard and DST offsetFromUtc() will return
- +3600 (UTC+01:00).
-
- \sa offsetFromUtc(), daylightTimeOffset()
-*/
-
-int QTimeZone::standardTimeOffset(const QDateTime &atDateTime) const
-{
- if (isValid())
- return d->standardTimeOffset(atDateTime.toMSecsSinceEpoch());
- else
- return 0;
-}
-
-/*!
- Returns the daylight-saving time offset at the given \a atDateTime,
- i.e. the number of seconds to add to the standard time offset to obtain the
- local daylight-saving time.
-
- For example, for the time zone "Europe/Berlin" the DST offset is +3600
- seconds. During standard time daylightTimeOffset() will return 0, and when
- daylight-saving is in effect it will return +3600.
-
- \sa offsetFromUtc(), standardTimeOffset()
-*/
-
-int QTimeZone::daylightTimeOffset(const QDateTime &atDateTime) const
-{
- if (hasDaylightTime())
- return d->daylightTimeOffset(atDateTime.toMSecsSinceEpoch());
- else
- return 0;
-}
-
-/*!
- Returns \c true if the time zone has practiced daylight-saving at any time.
-
- \sa isDaylightTime(), daylightTimeOffset()
-*/
-
-bool QTimeZone::hasDaylightTime() const
-{
- if (isValid())
- return d->hasDaylightTime();
- else
- return false;
-}
-
-/*!
- Returns \c true if daylight-saving was in effect at the given \a atDateTime.
-
- \sa hasDaylightTime(), daylightTimeOffset()
-*/
-
-bool QTimeZone::isDaylightTime(const QDateTime &atDateTime) const
-{
- if (hasDaylightTime())
- return d->isDaylightTime(atDateTime.toMSecsSinceEpoch());
- else
- return false;
-}
-
-/*!
- Returns the effective offset details at the given \a forDateTime. This is
- the equivalent of calling offsetFromUtc(), abbreviation(), etc individually but is
- more efficient.
-
- \sa offsetFromUtc(), standardTimeOffset(), daylightTimeOffset(), abbreviation()
-*/
-
-QTimeZone::OffsetData QTimeZone::offsetData(const QDateTime &forDateTime) const
-{
- if (hasTransitions())
- return QTimeZonePrivate::toOffsetData(d->data(forDateTime.toMSecsSinceEpoch()));
- else
- return QTimeZonePrivate::invalidOffsetData();
-}
-
-/*!
- Returns \c true if the system backend supports obtaining transitions.
-
- Transitions are changes in the time-zone: these happen when DST turns on or
- off and when authorities alter the offsets for the time-zone.
-
- \sa nextTransition(), previousTransition(), transitions()
-*/
-
-bool QTimeZone::hasTransitions() const
-{
- if (isValid())
- return d->hasTransitions();
- else
- return false;
-}
-
-/*!
- Returns the first time zone Transition after the given \a afterDateTime.
- This is most useful when you have a Transition time and wish to find the
- Transition after it.
-
- If there is no transition after the given \a afterDateTime then an invalid
- OffsetData will be returned with an invalid QDateTime.
-
- The given \a afterDateTime is exclusive.
-
- \sa hasTransitions(), previousTransition(), transitions()
-*/
-
-QTimeZone::OffsetData QTimeZone::nextTransition(const QDateTime &afterDateTime) const
-{
- if (hasTransitions())
- return QTimeZonePrivate::toOffsetData(d->nextTransition(afterDateTime.toMSecsSinceEpoch()));
- else
- return QTimeZonePrivate::invalidOffsetData();
-}
-
-/*!
- Returns the first time zone Transition before the given \a beforeDateTime.
- This is most useful when you have a Transition time and wish to find the
- Transition before it.
-
- If there is no transition before the given \a beforeDateTime then an invalid
- OffsetData will be returned with an invalid QDateTime.
-
- The given \a beforeDateTime is exclusive.
-
- \sa hasTransitions(), nextTransition(), transitions()
-*/
-
-QTimeZone::OffsetData QTimeZone::previousTransition(const QDateTime &beforeDateTime) const
-{
- if (hasTransitions())
- return QTimeZonePrivate::toOffsetData(d->previousTransition(beforeDateTime.toMSecsSinceEpoch()));
- else
- return QTimeZonePrivate::invalidOffsetData();
-}
-
-/*!
- Returns a list of all time zone transitions between the given datetimes.
-
- The given \a fromDateTime and \a toDateTime are inclusive.
-
- \sa hasTransitions(), nextTransition(), previousTransition()
-*/
-
-QTimeZone::OffsetDataList QTimeZone::transitions(const QDateTime &fromDateTime,
- const QDateTime &toDateTime) const
-{
- OffsetDataList list;
- if (hasTransitions()) {
- const QTimeZonePrivate::DataList plist = d->transitions(fromDateTime.toMSecsSinceEpoch(),
- toDateTime.toMSecsSinceEpoch());
- list.reserve(plist.count());
- for (const QTimeZonePrivate::Data &pdata : plist)
- list.append(QTimeZonePrivate::toOffsetData(pdata));
- }
- return list;
-}
-
-// Static methods
-
-/*!
- Returns the current system time zone IANA ID.
-
- On Windows this ID is translated from the Windows ID using an internal
- translation table and the user's selected country. As a consequence there
- is a small chance any Windows install may have IDs not known by Qt, in
- which case "UTC" will be returned.
-*/
-
-QByteArray QTimeZone::systemTimeZoneId()
-{
- return global_tz->backend->systemTimeZoneId();
-}
-
-/*!
- \since 5.5
- Returns a QTimeZone object that refers to the local system time, as
- specified by systemTimeZoneId().
-
- \sa utc()
-*/
-QTimeZone QTimeZone::systemTimeZone()
-{
- return QTimeZone(QTimeZone::systemTimeZoneId());
-}
-
-/*!
- \since 5.5
- Returns a QTimeZone object that refers to UTC (Universal Time Coordinated).
-
- \sa systemTimeZone()
-*/
-QTimeZone QTimeZone::utc()
-{
- return QTimeZone(QTimeZonePrivate::utcQByteArray());
-}
-
-/*!
- Returns \c true if a given time zone \a ianaId is available on this system.
-
- \sa availableTimeZoneIds()
-*/
-
-bool QTimeZone::isTimeZoneIdAvailable(const QByteArray &ianaId)
-{
- // isValidId is not strictly required, but faster to weed out invalid
- // IDs as availableTimeZoneIds() may be slow
- if (!QTimeZonePrivate::isValidId(ianaId))
- return false;
- return QUtcTimeZonePrivate().isTimeZoneIdAvailable(ianaId) ||
- global_tz->backend->isTimeZoneIdAvailable(ianaId);
-}
-
-static QList<QByteArray> set_union(const QList<QByteArray> &l1, const QList<QByteArray> &l2)
-{
- QList<QByteArray> result;
- result.reserve(l1.size() + l2.size());
- std::set_union(l1.begin(), l1.end(),
- l2.begin(), l2.end(),
- std::back_inserter(result));
- return result;
-}
-
-/*!
- Returns a list of all available IANA time zone IDs on this system.
-
- \sa isTimeZoneIdAvailable()
-*/
-
-QList<QByteArray> QTimeZone::availableTimeZoneIds()
-{
- return set_union(QUtcTimeZonePrivate().availableTimeZoneIds(),
- global_tz->backend->availableTimeZoneIds());
-}
-
-/*!
- Returns a list of all available IANA time zone IDs for a given \a country.
-
- As a special case, a \a country of Qt::AnyCountry returns those time zones
- that do not have any country related to them, such as UTC. If you require
- a list of all time zone IDs for all countries then use the standard
- availableTimeZoneIds() method.
-
- \sa isTimeZoneIdAvailable()
-*/
-
-QList<QByteArray> QTimeZone::availableTimeZoneIds(QLocale::Country country)
-{
- return set_union(QUtcTimeZonePrivate().availableTimeZoneIds(country),
- global_tz->backend->availableTimeZoneIds(country));
-}
-
-/*!
- Returns a list of all available IANA time zone IDs with a given standard
- time offset of \a offsetSeconds.
-
- \sa isTimeZoneIdAvailable()
-*/
-
-QList<QByteArray> QTimeZone::availableTimeZoneIds(int offsetSeconds)
-{
- return set_union(QUtcTimeZonePrivate().availableTimeZoneIds(offsetSeconds),
- global_tz->backend->availableTimeZoneIds(offsetSeconds));
-}
-
-/*!
- Returns the Windows ID equivalent to the given \a ianaId.
-
- \sa windowsIdToDefaultIanaId(), windowsIdToIanaIds()
-*/
-
-QByteArray QTimeZone::ianaIdToWindowsId(const QByteArray &ianaId)
-{
- return QTimeZonePrivate::ianaIdToWindowsId(ianaId);
-}
-
-/*!
- Returns the default IANA ID for a given \a windowsId.
-
- Because a Windows ID can cover several IANA IDs in several different
- countries, this function returns the most frequently used IANA ID with no
- regard for the country and should thus be used with care. It is usually
- best to request the default for a specific country.
-
- \sa ianaIdToWindowsId(), windowsIdToIanaIds()
-*/
-
-QByteArray QTimeZone::windowsIdToDefaultIanaId(const QByteArray &windowsId)
-{
- return QTimeZonePrivate::windowsIdToDefaultIanaId(windowsId);
-}
-
-/*!
- Returns the default IANA ID for a given \a windowsId and \a country.
-
- Because a Windows ID can cover several IANA IDs within a given country,
- the most frequently used IANA ID in that country is returned.
-
- As a special case, QLocale::AnyCountry returns the default of those IANA IDs
- that do not have any specific country.
-
- \sa ianaIdToWindowsId(), windowsIdToIanaIds()
-*/
-
-QByteArray QTimeZone::windowsIdToDefaultIanaId(const QByteArray &windowsId,
- QLocale::Country country)
-{
- return QTimeZonePrivate::windowsIdToDefaultIanaId(windowsId, country);
-}
-
-/*!
- Returns all the IANA IDs for a given \a windowsId.
-
- The returned list is sorted alphabetically.
-
- \sa ianaIdToWindowsId(), windowsIdToDefaultIanaId()
-*/
-
-QList<QByteArray> QTimeZone::windowsIdToIanaIds(const QByteArray &windowsId)
-{
- return QTimeZonePrivate::windowsIdToIanaIds(windowsId);
-}
-
-/*!
- Returns all the IANA IDs for a given \a windowsId and \a country.
-
- As a special case QLocale::AnyCountry returns those IANA IDs that do
- not have any specific country.
-
- The returned list is in order of frequency of usage, i.e. larger zones
- within a country are listed first.
-
- \sa ianaIdToWindowsId(), windowsIdToDefaultIanaId()
-*/
-
-QList<QByteArray> QTimeZone::windowsIdToIanaIds(const QByteArray &windowsId,
- QLocale::Country country)
-{
- return QTimeZonePrivate::windowsIdToIanaIds(windowsId, country);
-}
-
-#ifndef QT_NO_DATASTREAM
-QDataStream &operator<<(QDataStream &ds, const QTimeZone &tz)
-{
- tz.d->serialize(ds);
- return ds;
-}
-
-QDataStream &operator>>(QDataStream &ds, QTimeZone &tz)
-{
- QString ianaId;
- ds >> ianaId;
- if (ianaId == QLatin1String("OffsetFromUtc")) {
- int utcOffset;
- QString name;
- QString abbreviation;
- int country;
- QString comment;
- ds >> ianaId >> utcOffset >> name >> abbreviation >> country >> comment;
- // Try creating as a system timezone, which succeeds (producing a valid
- // zone) iff ianaId is valid; we can then ignore the other data.
- tz = QTimeZone(ianaId.toUtf8());
- // If not, then construct a custom timezone using all the saved values:
- if (!tz.isValid())
- tz = QTimeZone(ianaId.toUtf8(), utcOffset, name, abbreviation,
- QLocale::Country(country), comment);
- } else {
- tz = QTimeZone(ianaId.toUtf8());
- }
- return ds;
-}
-#endif // QT_NO_DATASTREAM
-
-#ifndef QT_NO_DEBUG_STREAM
-QDebug operator<<(QDebug dbg, const QTimeZone &tz)
-{
- QDebugStateSaver saver(dbg);
- //TODO Include backend and data version details?
- dbg.nospace() << "QTimeZone(" << QString::fromUtf8(tz.id()) << ')';
- return dbg;
-}
-#endif
-
-QT_END_NAMESPACE
diff --git a/src/corelib/tools/qtimezone.h b/src/corelib/tools/qtimezone.h
deleted file mode 100644
index 29d8a4dbe5..0000000000
--- a/src/corelib/tools/qtimezone.h
+++ /dev/null
@@ -1,190 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2013 John Layt <jlayt@kde.org>
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-
-#ifndef QTIMEZONE_H
-#define QTIMEZONE_H
-
-#include <QtCore/qshareddata.h>
-#include <QtCore/qlocale.h>
-#include <QtCore/qdatetime.h>
-
-QT_REQUIRE_CONFIG(timezone);
-
-#if (defined(Q_OS_DARWIN) || defined(Q_QDOC)) && !defined(QT_NO_SYSTEMLOCALE)
-Q_FORWARD_DECLARE_CF_TYPE(CFTimeZone);
-Q_FORWARD_DECLARE_OBJC_CLASS(NSTimeZone);
-#endif
-
-QT_BEGIN_NAMESPACE
-
-class QTimeZonePrivate;
-
-class Q_CORE_EXPORT QTimeZone
-{
-public:
- // Sane UTC offsets range from -14 to +14 hours:
- enum {
- // No known zone > 12 hrs West of Greenwich (Baker Island, USA)
- MinUtcOffsetSecs = -14 * 3600,
- // No known zone > 14 hrs East of Greenwich (Kiritimati, Christmas Island, Kiribati)
- MaxUtcOffsetSecs = +14 * 3600
- };
-
- enum TimeType {
- StandardTime = 0,
- DaylightTime = 1,
- GenericTime = 2
- };
-
- enum NameType {
- DefaultName = 0,
- LongName = 1,
- ShortName = 2,
- OffsetName = 3
- };
-
- struct OffsetData {
- QString abbreviation;
- QDateTime atUtc;
- int offsetFromUtc;
- int standardTimeOffset;
- int daylightTimeOffset;
- };
- typedef QVector<OffsetData> OffsetDataList;
-
- QTimeZone() Q_DECL_NOTHROW;
- explicit QTimeZone(const QByteArray &ianaId);
- explicit QTimeZone(int offsetSeconds);
- /*implicit*/ QTimeZone(const QByteArray &zoneId, int offsetSeconds, const QString &name,
- const QString &abbreviation, QLocale::Country country = QLocale::AnyCountry,
- const QString &comment = QString());
- QTimeZone(const QTimeZone &other);
- ~QTimeZone();
-
- QTimeZone &operator=(const QTimeZone &other);
- #ifdef Q_COMPILER_RVALUE_REFS
- QTimeZone &operator=(QTimeZone &&other) Q_DECL_NOTHROW { swap(other); return *this; }
-#endif
-
- void swap(QTimeZone &other) Q_DECL_NOTHROW
- { d.swap(other.d); }
-
- bool operator==(const QTimeZone &other) const;
- bool operator!=(const QTimeZone &other) const;
-
- bool isValid() const;
-
- QByteArray id() const;
- QLocale::Country country() const;
- QString comment() const;
-
- QString displayName(const QDateTime &atDateTime,
- QTimeZone::NameType nameType = QTimeZone::DefaultName,
- const QLocale &locale = QLocale()) const;
- QString displayName(QTimeZone::TimeType timeType,
- QTimeZone::NameType nameType = QTimeZone::DefaultName,
- const QLocale &locale = QLocale()) const;
- QString abbreviation(const QDateTime &atDateTime) const;
-
- int offsetFromUtc(const QDateTime &atDateTime) const;
- int standardTimeOffset(const QDateTime &atDateTime) const;
- int daylightTimeOffset(const QDateTime &atDateTime) const;
-
- bool hasDaylightTime() const;
- bool isDaylightTime(const QDateTime &atDateTime) const;
-
- OffsetData offsetData(const QDateTime &forDateTime) const;
-
- bool hasTransitions() const;
- OffsetData nextTransition(const QDateTime &afterDateTime) const;
- OffsetData previousTransition(const QDateTime &beforeDateTime) const;
- OffsetDataList transitions(const QDateTime &fromDateTime, const QDateTime &toDateTime) const;
-
- static QByteArray systemTimeZoneId();
- static QTimeZone systemTimeZone();
- static QTimeZone utc();
-
- static bool isTimeZoneIdAvailable(const QByteArray &ianaId);
-
- static QList<QByteArray> availableTimeZoneIds();
- static QList<QByteArray> availableTimeZoneIds(QLocale::Country country);
- static QList<QByteArray> availableTimeZoneIds(int offsetSeconds);
-
- static QByteArray ianaIdToWindowsId(const QByteArray &ianaId);
- static QByteArray windowsIdToDefaultIanaId(const QByteArray &windowsId);
- static QByteArray windowsIdToDefaultIanaId(const QByteArray &windowsId,
- QLocale::Country country);
- static QList<QByteArray> windowsIdToIanaIds(const QByteArray &windowsId);
- static QList<QByteArray> windowsIdToIanaIds(const QByteArray &windowsId,
- QLocale::Country country);
-
-#if (defined(Q_OS_DARWIN) || defined(Q_QDOC)) && !defined(QT_NO_SYSTEMLOCALE)
- static QTimeZone fromCFTimeZone(CFTimeZoneRef timeZone);
- CFTimeZoneRef toCFTimeZone() const Q_DECL_CF_RETURNS_RETAINED;
- static QTimeZone fromNSTimeZone(const NSTimeZone *timeZone);
- NSTimeZone *toNSTimeZone() const Q_DECL_NS_RETURNS_AUTORELEASED;
-#endif
-
-private:
- QTimeZone(QTimeZonePrivate &dd);
-#ifndef QT_NO_DATASTREAM
- friend Q_CORE_EXPORT QDataStream &operator<<(QDataStream &ds, const QTimeZone &tz);
-#endif
- friend class QTimeZonePrivate;
- friend class QDateTime;
- friend class QDateTimePrivate;
- QSharedDataPointer<QTimeZonePrivate> d;
-};
-
-Q_DECLARE_TYPEINFO(QTimeZone::OffsetData, Q_MOVABLE_TYPE);
-Q_DECLARE_SHARED(QTimeZone)
-
-#ifndef QT_NO_DATASTREAM
-Q_CORE_EXPORT QDataStream &operator<<(QDataStream &ds, const QTimeZone &tz);
-Q_CORE_EXPORT QDataStream &operator>>(QDataStream &ds, QTimeZone &tz);
-#endif
-
-#ifndef QT_NO_DEBUG_STREAM
-Q_CORE_EXPORT QDebug operator<<(QDebug dbg, const QTimeZone &tz);
-#endif
-
-QT_END_NAMESPACE
-
-#endif // QTIMEZONE_H
diff --git a/src/corelib/tools/qtimezoneprivate.cpp b/src/corelib/tools/qtimezoneprivate.cpp
deleted file mode 100644
index 569b343187..0000000000
--- a/src/corelib/tools/qtimezoneprivate.cpp
+++ /dev/null
@@ -1,926 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2013 John Layt <jlayt@kde.org>
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-
-#include "qtimezone.h"
-#include "qtimezoneprivate_p.h"
-#include "qtimezoneprivate_data_p.h"
-
-#include <qdatastream.h>
-#include <qdebug.h>
-
-#include <algorithm>
-
-QT_BEGIN_NAMESPACE
-
-/*
- Static utilities for looking up Windows ID tables
-*/
-
-static const int windowsDataTableSize = sizeof(windowsDataTable) / sizeof(QWindowsData) - 1;
-static const int zoneDataTableSize = sizeof(zoneDataTable) / sizeof(QZoneData) - 1;
-static const int utcDataTableSize = sizeof(utcDataTable) / sizeof(QUtcData) - 1;
-
-
-static const QZoneData *zoneData(quint16 index)
-{
- Q_ASSERT(index < zoneDataTableSize);
- return &zoneDataTable[index];
-}
-
-static const QWindowsData *windowsData(quint16 index)
-{
- Q_ASSERT(index < windowsDataTableSize);
- return &windowsDataTable[index];
-}
-
-static const QUtcData *utcData(quint16 index)
-{
- Q_ASSERT(index < utcDataTableSize);
- return &utcDataTable[index];
-}
-
-// Return the Windows ID literal for a given QWindowsData
-static QByteArray windowsId(const QWindowsData *windowsData)
-{
- return (windowsIdData + windowsData->windowsIdIndex);
-}
-
-// Return the IANA ID literal for a given QWindowsData
-static QByteArray ianaId(const QWindowsData *windowsData)
-{
- return (ianaIdData + windowsData->ianaIdIndex);
-}
-
-// Return the IANA ID literal for a given QZoneData
-static QByteArray ianaId(const QZoneData *zoneData)
-{
- return (ianaIdData + zoneData->ianaIdIndex);
-}
-
-static QByteArray utcId(const QUtcData *utcData)
-{
- return (ianaIdData + utcData->ianaIdIndex);
-}
-
-static quint16 toWindowsIdKey(const QByteArray &winId)
-{
- for (quint16 i = 0; i < windowsDataTableSize; ++i) {
- const QWindowsData *data = windowsData(i);
- if (windowsId(data) == winId)
- return data->windowsIdKey;
- }
- return 0;
-}
-
-static QByteArray toWindowsIdLiteral(quint16 windowsIdKey)
-{
- for (quint16 i = 0; i < windowsDataTableSize; ++i) {
- const QWindowsData *data = windowsData(i);
- if (data->windowsIdKey == windowsIdKey)
- return windowsId(data);
- }
- return QByteArray();
-}
-
-/*
- Base class implementing common utility routines, only intantiate for a null tz.
-*/
-
-QTimeZonePrivate::QTimeZonePrivate()
-{
-}
-
-QTimeZonePrivate::QTimeZonePrivate(const QTimeZonePrivate &other)
- : QSharedData(other), m_id(other.m_id)
-{
-}
-
-QTimeZonePrivate::~QTimeZonePrivate()
-{
-}
-
-QTimeZonePrivate *QTimeZonePrivate::clone() const
-{
- return new QTimeZonePrivate(*this);
-}
-
-bool QTimeZonePrivate::operator==(const QTimeZonePrivate &other) const
-{
- // TODO Too simple, but need to solve problem of comparing different derived classes
- // Should work for all System and ICU classes as names guaranteed unique, but not for Simple.
- // Perhaps once all classes have working transitions can compare full list?
- return (m_id == other.m_id);
-}
-
-bool QTimeZonePrivate::operator!=(const QTimeZonePrivate &other) const
-{
- return !(*this == other);
-}
-
-bool QTimeZonePrivate::isValid() const
-{
- return !m_id.isEmpty();
-}
-
-QByteArray QTimeZonePrivate::id() const
-{
- return m_id;
-}
-
-QLocale::Country QTimeZonePrivate::country() const
-{
- // Default fall-back mode, use the zoneTable to find Region of known Zones
- for (int i = 0; i < zoneDataTableSize; ++i) {
- const QZoneData *data = zoneData(i);
- if (ianaId(data).split(' ').contains(m_id))
- return (QLocale::Country)data->country;
- }
- return QLocale::AnyCountry;
-}
-
-QString QTimeZonePrivate::comment() const
-{
- return QString();
-}
-
-QString QTimeZonePrivate::displayName(qint64 atMSecsSinceEpoch,
- QTimeZone::NameType nameType,
- const QLocale &locale) const
-{
- if (nameType == QTimeZone::OffsetName)
- return isoOffsetFormat(offsetFromUtc(atMSecsSinceEpoch));
-
- if (isDaylightTime(atMSecsSinceEpoch))
- return displayName(QTimeZone::DaylightTime, nameType, locale);
- else
- return displayName(QTimeZone::StandardTime, nameType, locale);
-}
-
-QString QTimeZonePrivate::displayName(QTimeZone::TimeType timeType,
- QTimeZone::NameType nameType,
- const QLocale &locale) const
-{
- Q_UNUSED(timeType)
- Q_UNUSED(nameType)
- Q_UNUSED(locale)
- return QString();
-}
-
-QString QTimeZonePrivate::abbreviation(qint64 atMSecsSinceEpoch) const
-{
- Q_UNUSED(atMSecsSinceEpoch)
- return QString();
-}
-
-int QTimeZonePrivate::offsetFromUtc(qint64 atMSecsSinceEpoch) const
-{
- return standardTimeOffset(atMSecsSinceEpoch) + daylightTimeOffset(atMSecsSinceEpoch);
-}
-
-int QTimeZonePrivate::standardTimeOffset(qint64 atMSecsSinceEpoch) const
-{
- Q_UNUSED(atMSecsSinceEpoch)
- return invalidSeconds();
-}
-
-int QTimeZonePrivate::daylightTimeOffset(qint64 atMSecsSinceEpoch) const
-{
- Q_UNUSED(atMSecsSinceEpoch)
- return invalidSeconds();
-}
-
-bool QTimeZonePrivate::hasDaylightTime() const
-{
- return false;
-}
-
-bool QTimeZonePrivate::isDaylightTime(qint64 atMSecsSinceEpoch) const
-{
- Q_UNUSED(atMSecsSinceEpoch)
- return false;
-}
-
-QTimeZonePrivate::Data QTimeZonePrivate::data(qint64 forMSecsSinceEpoch) const
-{
- Q_UNUSED(forMSecsSinceEpoch)
- return invalidData();
-}
-
-// Private only method for use by QDateTime to convert local msecs to epoch msecs
-QTimeZonePrivate::Data QTimeZonePrivate::dataForLocalTime(qint64 forLocalMSecs, int hint) const
-{
- if (!hasDaylightTime()) // No DST means same offset for all local msecs
- return data(forLocalMSecs - standardTimeOffset(forLocalMSecs) * 1000);
-
- /*
- We need a UTC time at which to ask for the offset, in order to be able to
- add that offset to forLocalMSecs, to get the UTC time we
- need. Fortunately, no time-zone offset is more than 14 hours; and DST
- transitions happen (much) more than thirty-two hours apart. So sampling
- offset sixteen hours each side gives us information we can be sure
- brackets the correct time and at most one DST transition.
- */
- const qint64 sixteenHoursInMSecs(16 * 3600 * 1000);
- Q_STATIC_ASSERT(-sixteenHoursInMSecs / 1000 < QTimeZone::MinUtcOffsetSecs
- && sixteenHoursInMSecs / 1000 > QTimeZone::MaxUtcOffsetSecs);
- const qint64 recent = forLocalMSecs - sixteenHoursInMSecs;
- const qint64 imminent = forLocalMSecs + sixteenHoursInMSecs;
- /*
- Offsets are Local - UTC, positive to the east of Greenwich, negative to
- the west; DST offset always exceeds standard offset, when DST applies.
- When we have offsets on either side of a transition, the lower one is
- standard, the higher is DST.
-
- Non-DST transitions (jurisdictions changing time-zone and time-zones
- changing their standard offset, typically) are described below as if they
- were DST transitions (since these are more usual and familiar); the code
- mostly concerns itself with offsets from UTC, described in terms of the
- common case for changes in that. If there is no actual change in offset
- (e.g. a DST transition cancelled by a standard offset change), this code
- should handle it gracefully; without transitions, it'll see early == late
- and take the easy path; with transitions, tran and nextTran get the
- correct UTC time as atMSecsSinceEpoch so comparing to nextStart selects
- the right one. In all other cases, the transition changes offset and the
- reasoning that applies to DST applies just the same. Aside from hinting,
- the only thing that looks at DST-ness at all, other than inferred from
- offset changes, is the case without transition data handling an invalid
- time in the gap that a transition passed over.
-
- The handling of hint (see below) is apt to go wrong in non-DST
- transitions. There isn't really a great deal we can hope to do about that
- without adding yet more unreliable complexity to the heuristics in use for
- already obscure corner-cases.
- */
-
- /*
- The hint (really a QDateTimePrivate::DaylightStatus) is > 0 if caller
- thinks we're in DST, 0 if in standard. A value of -2 means never-DST, so
- should have been handled above; if it slips through, it's wrong but we
- should probably treat it as standard anyway (never-DST means
- always-standard, after all). If the hint turns out to be wrong, fall back
- on trying the other possibility: which makes it harmless to treat -1
- (meaning unknown) as standard (i.e. try standard first, then try DST). In
- practice, away from a transition, the only difference hint makes is to
- which candidate we try first: if the hint is wrong (or unknown and
- standard fails), we'll try the other candidate and it'll work.
-
- For the obscure (and invalid) case where forLocalMSecs falls in a
- spring-forward's missing hour, a common case is that we started with a
- date/time for which the hint was valid and adjusted it naively; for that
- case, we should correct the adjustment by shunting across the transition
- into where hint is wrong. So half-way through the gap, arrived at from
- the DST side, should be read as an hour earlier, in standard time; but, if
- arrived at from the standard side, should be read as an hour later, in
- DST. (This shall be wrong in some cases; for example, when a country
- changes its transition dates and changing a date/time by more than six
- months lands it on a transition. However, these cases are even more
- obscure than those where the heuristic is good.)
- */
-
- if (hasTransitions()) {
- /*
- We have transitions.
-
- Each transition gives the offsets to use until the next; so we need the
- most recent transition before the time forLocalMSecs describes. If it
- describes a time *in* a transition, we'll need both that transition and
- the one before it. So find one transition that's probably after (and not
- much before, otherwise) and another that's definitely before, then work
- out which one to use. When both or neither work on forLocalMSecs, use
- hint to disambiguate.
- */
-
- // Get a transition definitely before the local MSecs; usually all we need.
- // Only around the transition times might we need another.
- Data tran = previousTransition(recent);
- Q_ASSERT(forLocalMSecs < 0 || // Pre-epoch TZ info may be unavailable
- forLocalMSecs - tran.offsetFromUtc * 1000 >= tran.atMSecsSinceEpoch);
- Data nextTran = nextTransition(tran.atMSecsSinceEpoch);
- /*
- Now walk those forward until they bracket forLocalMSecs with transitions.
-
- One of the transitions should then be telling us the right offset to use.
- In a transition, we need the transition before it (to describe the run-up
- to the transition) and the transition itself; so we need to stop when
- nextTran is that transition.
- */
- while (nextTran.atMSecsSinceEpoch != invalidMSecs()
- && forLocalMSecs > nextTran.atMSecsSinceEpoch + nextTran.offsetFromUtc * 1000) {
- Data newTran = nextTransition(nextTran.atMSecsSinceEpoch);
- if (newTran.atMSecsSinceEpoch == invalidMSecs()
- || newTran.atMSecsSinceEpoch + newTran.offsetFromUtc * 1000 > imminent) {
- // Definitely not a relevant tansition: too far in the future.
- break;
- }
- tran = nextTran;
- nextTran = newTran;
- }
-
- // Check we do *really* have transitions for this zone:
- if (tran.atMSecsSinceEpoch != invalidMSecs()) {
-
- /*
- So now tran is definitely before and nextTran is either after or only
- slightly before. One is standard time; we interpret the other as DST
- (although the transition might in fact by a change in standard offset). Our
- hint tells us which of those to use (defaulting to standard if no hint): try
- it first; if that fails, try the other; if both fail, life's tricky.
- */
- Q_ASSERT(forLocalMSecs < 0
- || forLocalMSecs - tran.offsetFromUtc * 1000 > tran.atMSecsSinceEpoch);
- const qint64 nextStart = nextTran.atMSecsSinceEpoch;
- // Work out the UTC values it might make sense to return:
- nextTran.atMSecsSinceEpoch = forLocalMSecs - nextTran.offsetFromUtc * 1000;
- tran.atMSecsSinceEpoch = forLocalMSecs - tran.offsetFromUtc * 1000;
-
- // If both or neither have zero DST, treat the one with lower offset as standard:
- const bool nextIsDst = !nextTran.daylightTimeOffset == !tran.daylightTimeOffset
- ? tran.offsetFromUtc < nextTran.offsetFromUtc : nextTran.daylightTimeOffset;
- // If that agrees with hint > 0, our first guess is to use nextTran; else tran.
- const bool nextFirst = nextIsDst == (hint > 0) && nextStart != invalidMSecs();
- for (int i = 0; i < 2; i++) {
- /*
- On the first pass, the case we consider is what hint told us to expect
- (except when hint was -1 and didn't actually tell us what to expect),
- so it's likely right. We only get a second pass if the first failed,
- by which time the second case, that we're trying, is likely right. If
- an overwhelming majority of calls have hint == -1, the Q_LIKELY here
- shall be wrong half the time; otherwise, its errors shall be rarer
- than that.
- */
- if (nextFirst ? i == 0 : i) {
- Q_ASSERT(nextStart != invalidMSecs());
- if (Q_LIKELY(nextStart <= nextTran.atMSecsSinceEpoch))
- return nextTran;
- } else {
- // If next is invalid, nextFirst is false, to route us here first:
- if (nextStart == invalidMSecs() || Q_LIKELY(nextStart > tran.atMSecsSinceEpoch))
- return tran;
- }
- }
-
- /*
- Neither is valid (e.g. in a spring-forward's gap) and
- nextTran.atMSecsSinceEpoch < nextStart <= tran.atMSecsSinceEpoch, so
- 0 < tran.atMSecsSinceEpoch - nextTran.atMSecsSinceEpoch
- = (nextTran.offsetFromUtc - tran.offsetFromUtc) * 1000
- */
- int dstStep = (nextTran.offsetFromUtc - tran.offsetFromUtc) * 1000;
- Q_ASSERT(dstStep > 0); // How else could we get here ?
- if (nextFirst) { // hint thought we needed nextTran, so use tran
- tran.atMSecsSinceEpoch -= dstStep;
- return tran;
- }
- nextTran.atMSecsSinceEpoch += dstStep;
- return nextTran;
- }
- // System has transitions but not for this zone.
- // Try falling back to offsetFromUtc
- }
-
- /* Bracket and refine to discover offset. */
- qint64 utcEpochMSecs;
-
- int early = offsetFromUtc(recent);
- int late = offsetFromUtc(imminent);
- if (Q_LIKELY(early == late)) { // > 99% of the time
- utcEpochMSecs = forLocalMSecs - early * 1000;
- } else {
- // Close to a DST transition: early > late is near a fall-back,
- // early < late is near a spring-forward.
- const int offsetInDst = qMax(early, late);
- const int offsetInStd = qMin(early, late);
- // Candidate values for utcEpochMSecs (if forLocalMSecs is valid):
- const qint64 forDst = forLocalMSecs - offsetInDst * 1000;
- const qint64 forStd = forLocalMSecs - offsetInStd * 1000;
- // Best guess at the answer:
- const qint64 hinted = hint > 0 ? forDst : forStd;
- if (Q_LIKELY(offsetFromUtc(hinted) == (hint > 0 ? offsetInDst : offsetInStd))) {
- utcEpochMSecs = hinted;
- } else if (hint <= 0 && offsetFromUtc(forDst) == offsetInDst) {
- utcEpochMSecs = forDst;
- } else if (hint > 0 && offsetFromUtc(forStd) == offsetInStd) {
- utcEpochMSecs = forStd;
- } else {
- // Invalid forLocalMSecs: in spring-forward gap.
- const int dstStep = daylightTimeOffset(early < late ? imminent : recent) * 1000;
- Q_ASSERT(dstStep); // There can't be a transition without it !
- utcEpochMSecs = (hint > 0) ? forStd - dstStep : forDst + dstStep;
- }
- }
-
- return data(utcEpochMSecs);
-}
-
-bool QTimeZonePrivate::hasTransitions() const
-{
- return false;
-}
-
-QTimeZonePrivate::Data QTimeZonePrivate::nextTransition(qint64 afterMSecsSinceEpoch) const
-{
- Q_UNUSED(afterMSecsSinceEpoch)
- return invalidData();
-}
-
-QTimeZonePrivate::Data QTimeZonePrivate::previousTransition(qint64 beforeMSecsSinceEpoch) const
-{
- Q_UNUSED(beforeMSecsSinceEpoch)
- return invalidData();
-}
-
-QTimeZonePrivate::DataList QTimeZonePrivate::transitions(qint64 fromMSecsSinceEpoch,
- qint64 toMSecsSinceEpoch) const
-{
- DataList list;
- if (toMSecsSinceEpoch >= fromMSecsSinceEpoch) {
- // fromMSecsSinceEpoch is inclusive but nextTransitionTime() is exclusive so go back 1 msec
- Data next = nextTransition(fromMSecsSinceEpoch - 1);
- while (next.atMSecsSinceEpoch != invalidMSecs()
- && next.atMSecsSinceEpoch <= toMSecsSinceEpoch) {
- list.append(next);
- next = nextTransition(next.atMSecsSinceEpoch);
- }
- }
- return list;
-}
-
-QByteArray QTimeZonePrivate::systemTimeZoneId() const
-{
- return QByteArray();
-}
-
-bool QTimeZonePrivate::isTimeZoneIdAvailable(const QByteArray& ianaId) const
-{
- // Fall-back implementation, can be made faster in subclasses
- const QList<QByteArray> tzIds = availableTimeZoneIds();
- return std::binary_search(tzIds.begin(), tzIds.end(), ianaId);
-}
-
-QList<QByteArray> QTimeZonePrivate::availableTimeZoneIds() const
-{
- return QList<QByteArray>();
-}
-
-QList<QByteArray> QTimeZonePrivate::availableTimeZoneIds(QLocale::Country country) const
-{
- // Default fall-back mode, use the zoneTable to find Region of know Zones
- QList<QByteArray> regions;
-
- // First get all Zones in the Zones table belonging to the Region
- for (int i = 0; i < zoneDataTableSize; ++i) {
- if (zoneData(i)->country == country)
- regions += ianaId(zoneData(i)).split(' ');
- }
-
- std::sort(regions.begin(), regions.end());
- regions.erase(std::unique(regions.begin(), regions.end()), regions.end());
-
- // Then select just those that are available
- const QList<QByteArray> all = availableTimeZoneIds();
- QList<QByteArray> result;
- result.reserve(qMin(all.size(), regions.size()));
- std::set_intersection(all.begin(), all.end(), regions.cbegin(), regions.cend(),
- std::back_inserter(result));
- return result;
-}
-
-QList<QByteArray> QTimeZonePrivate::availableTimeZoneIds(int offsetFromUtc) const
-{
- // Default fall-back mode, use the zoneTable to find Offset of know Zones
- QList<QByteArray> offsets;
- // First get all Zones in the table using the Offset
- for (int i = 0; i < windowsDataTableSize; ++i) {
- const QWindowsData *winData = windowsData(i);
- if (winData->offsetFromUtc == offsetFromUtc) {
- for (int j = 0; j < zoneDataTableSize; ++j) {
- const QZoneData *data = zoneData(j);
- if (data->windowsIdKey == winData->windowsIdKey)
- offsets += ianaId(data).split(' ');
- }
- }
- }
-
- std::sort(offsets.begin(), offsets.end());
- offsets.erase(std::unique(offsets.begin(), offsets.end()), offsets.end());
-
- // Then select just those that are available
- const QList<QByteArray> all = availableTimeZoneIds();
- QList<QByteArray> result;
- result.reserve(qMin(all.size(), offsets.size()));
- std::set_intersection(all.begin(), all.end(), offsets.cbegin(), offsets.cend(),
- std::back_inserter(result));
- return result;
-}
-
-#ifndef QT_NO_DATASTREAM
-void QTimeZonePrivate::serialize(QDataStream &ds) const
-{
- ds << QString::fromUtf8(m_id);
-}
-#endif // QT_NO_DATASTREAM
-
-// Static Utility Methods
-
-QTimeZonePrivate::Data QTimeZonePrivate::invalidData()
-{
- Data data;
- data.atMSecsSinceEpoch = invalidMSecs();
- data.offsetFromUtc = invalidSeconds();
- data.standardTimeOffset = invalidSeconds();
- data.daylightTimeOffset = invalidSeconds();
- return data;
-}
-
-QTimeZone::OffsetData QTimeZonePrivate::invalidOffsetData()
-{
- QTimeZone::OffsetData offsetData;
- offsetData.atUtc = QDateTime();
- offsetData.offsetFromUtc = invalidSeconds();
- offsetData.standardTimeOffset = invalidSeconds();
- offsetData.daylightTimeOffset = invalidSeconds();
- return offsetData;
-}
-
-QTimeZone::OffsetData QTimeZonePrivate::toOffsetData(const QTimeZonePrivate::Data &data)
-{
- QTimeZone::OffsetData offsetData = invalidOffsetData();
- if (data.atMSecsSinceEpoch != invalidMSecs()) {
- offsetData.atUtc = QDateTime::fromMSecsSinceEpoch(data.atMSecsSinceEpoch, Qt::UTC);
- offsetData.offsetFromUtc = data.offsetFromUtc;
- offsetData.standardTimeOffset = data.standardTimeOffset;
- offsetData.daylightTimeOffset = data.daylightTimeOffset;
- offsetData.abbreviation = data.abbreviation;
- }
- return offsetData;
-}
-
-// Is the format of the ID valid ?
-bool QTimeZonePrivate::isValidId(const QByteArray &ianaId)
-{
- /*
- Main rules for defining TZ/IANA names as per ftp://ftp.iana.org/tz/code/Theory
- 1. Use only valid POSIX file name components
- 2. Within a file name component, use only ASCII letters, `.', `-' and `_'.
- 3. Do not use digits (except in a [+-]\d+ suffix, when used).
- 4. A file name component must not exceed 14 characters or start with `-'
- However, the rules are really guidelines - a later one says
- - Do not change established names if they only marginally violate the
- above rules.
- We may, therefore, need to be a bit slack in our check here, if we hit
- legitimate exceptions in real time-zone databases.
-
- In particular, aliases such as "Etc/GMT+7" and "SystemV/EST5EDT" are valid
- so we need to accept digits, ':', and '+'; aliases typically have the form
- of POSIX TZ strings, which allow a suffix to a proper IANA name. A POSIX
- suffix starts with an offset (as in GMT+7) and may continue with another
- name (as in EST5EDT, giving the DST name of the zone); a further offset is
- allowed (for DST). The ("hard to describe and [...] error-prone in
- practice") POSIX form even allows a suffix giving the dates (and
- optionally times) of the annual DST transitions. Hopefully, no TZ aliases
- go that far, but we at least need to accept an offset and (single
- fragment) DST-name.
-
- But for the legacy complications, the following would be preferable if
- QRegExp would work on QByteArrays directly:
- const QRegExp rx(QStringLiteral("[a-z+._][a-z+._-]{,13}"
- "(?:/[a-z+._][a-z+._-]{,13})*"
- // Optional suffix:
- "(?:[+-]?\d{1,2}(?::\d{1,2}){,2}" // offset
- // one name fragment (DST):
- "(?:[a-z+._][a-z+._-]{,13})?)"),
- Qt::CaseInsensitive);
- return rx.exactMatch(ianaId);
- */
-
- // Somewhat slack hand-rolled version:
- const int MinSectionLength = 1;
- const int MaxSectionLength = 14;
- int sectionLength = 0;
- for (const char *it = ianaId.begin(), * const end = ianaId.end(); it != end; ++it, ++sectionLength) {
- const char ch = *it;
- if (ch == '/') {
- if (sectionLength < MinSectionLength || sectionLength > MaxSectionLength)
- return false; // violates (4)
- sectionLength = -1;
- } else if (ch == '-') {
- if (sectionLength == 0)
- return false; // violates (4)
- } else if (!(ch >= 'a' && ch <= 'z')
- && !(ch >= 'A' && ch <= 'Z')
- && !(ch == '_')
- && !(ch == '.')
- // Should ideally check these only happen as an offset:
- && !(ch >= '0' && ch <= '9')
- && !(ch == '+')
- && !(ch == ':')) {
- return false; // violates (2)
- }
- }
- if (sectionLength < MinSectionLength || sectionLength > MaxSectionLength)
- return false; // violates (4)
- return true;
-}
-
-QString QTimeZonePrivate::isoOffsetFormat(int offsetFromUtc)
-{
- const int mins = offsetFromUtc / 60;
- return QString::fromUtf8("UTC%1%2:%3").arg(mins >= 0 ? QLatin1Char('+') : QLatin1Char('-'))
- .arg(qAbs(mins) / 60, 2, 10, QLatin1Char('0'))
- .arg(qAbs(mins) % 60, 2, 10, QLatin1Char('0'));
-}
-
-QByteArray QTimeZonePrivate::ianaIdToWindowsId(const QByteArray &id)
-{
- for (int i = 0; i < zoneDataTableSize; ++i) {
- const QZoneData *data = zoneData(i);
- if (ianaId(data).split(' ').contains(id))
- return toWindowsIdLiteral(data->windowsIdKey);
- }
- return QByteArray();
-}
-
-QByteArray QTimeZonePrivate::windowsIdToDefaultIanaId(const QByteArray &windowsId)
-{
- const quint16 windowsIdKey = toWindowsIdKey(windowsId);
- for (int i = 0; i < windowsDataTableSize; ++i) {
- const QWindowsData *data = windowsData(i);
- if (data->windowsIdKey == windowsIdKey)
- return ianaId(data);
- }
- return QByteArray();
-}
-
-QByteArray QTimeZonePrivate::windowsIdToDefaultIanaId(const QByteArray &windowsId,
- QLocale::Country country)
-{
- const QList<QByteArray> list = windowsIdToIanaIds(windowsId, country);
- if (list.count() > 0)
- return list.first();
- else
- return QByteArray();
-}
-
-QList<QByteArray> QTimeZonePrivate::windowsIdToIanaIds(const QByteArray &windowsId)
-{
- const quint16 windowsIdKey = toWindowsIdKey(windowsId);
- QList<QByteArray> list;
-
- for (int i = 0; i < zoneDataTableSize; ++i) {
- const QZoneData *data = zoneData(i);
- if (data->windowsIdKey == windowsIdKey)
- list << ianaId(data).split(' ');
- }
-
- // Return the full list in alpha order
- std::sort(list.begin(), list.end());
- return list;
-}
-
-QList<QByteArray> QTimeZonePrivate::windowsIdToIanaIds(const QByteArray &windowsId,
- QLocale::Country country)
-{
- const quint16 windowsIdKey = toWindowsIdKey(windowsId);
- for (int i = 0; i < zoneDataTableSize; ++i) {
- const QZoneData *data = zoneData(i);
- // Return the region matches in preference order
- if (data->windowsIdKey == windowsIdKey && data->country == (quint16) country)
- return ianaId(data).split(' ');
- }
-
- return QList<QByteArray>();
-}
-
-// Define template for derived classes to reimplement so QSharedDataPointer clone() works correctly
-template<> QTimeZonePrivate *QSharedDataPointer<QTimeZonePrivate>::clone()
-{
- return d->clone();
-}
-
-/*
- UTC Offset implementation, used when QT_NO_SYSTEMLOCALE set and ICU is not being used,
- or for QDateTimes with a Qt:Spec of Qt::OffsetFromUtc.
-*/
-
-// Create default UTC time zone
-QUtcTimeZonePrivate::QUtcTimeZonePrivate()
-{
- const QString name = utcQString();
- init(utcQByteArray(), 0, name, name, QLocale::AnyCountry, name);
-}
-
-// Create a named UTC time zone
-QUtcTimeZonePrivate::QUtcTimeZonePrivate(const QByteArray &id)
-{
- // Look for the name in the UTC list, if found set the values
- for (int i = 0; i < utcDataTableSize; ++i) {
- const QUtcData *data = utcData(i);
- const QByteArray uid = utcId(data);
- if (uid == id) {
- QString name = QString::fromUtf8(id);
- init(id, data->offsetFromUtc, name, name, QLocale::AnyCountry, name);
- break;
- }
- }
-}
-
-// Create offset from UTC
-QUtcTimeZonePrivate::QUtcTimeZonePrivate(qint32 offsetSeconds)
-{
- QString utcId;
-
- if (offsetSeconds == 0)
- utcId = utcQString();
- else
- utcId = isoOffsetFormat(offsetSeconds);
-
- init(utcId.toUtf8(), offsetSeconds, utcId, utcId, QLocale::AnyCountry, utcId);
-}
-
-QUtcTimeZonePrivate::QUtcTimeZonePrivate(const QByteArray &zoneId, int offsetSeconds,
- const QString &name, const QString &abbreviation,
- QLocale::Country country, const QString &comment)
-{
- init(zoneId, offsetSeconds, name, abbreviation, country, comment);
-}
-
-QUtcTimeZonePrivate::QUtcTimeZonePrivate(const QUtcTimeZonePrivate &other)
- : QTimeZonePrivate(other), m_name(other.m_name),
- m_abbreviation(other.m_abbreviation),
- m_comment(other.m_comment),
- m_country(other.m_country),
- m_offsetFromUtc(other.m_offsetFromUtc)
-{
-}
-
-QUtcTimeZonePrivate::~QUtcTimeZonePrivate()
-{
-}
-
-QUtcTimeZonePrivate *QUtcTimeZonePrivate::clone() const
-{
- return new QUtcTimeZonePrivate(*this);
-}
-
-QTimeZonePrivate::Data QUtcTimeZonePrivate::data(qint64 forMSecsSinceEpoch) const
-{
- Data d;
- d.abbreviation = m_abbreviation;
- d.atMSecsSinceEpoch = forMSecsSinceEpoch;
- d.standardTimeOffset = d.offsetFromUtc = m_offsetFromUtc;
- d.daylightTimeOffset = 0;
- return d;
-}
-
-void QUtcTimeZonePrivate::init(const QByteArray &zoneId)
-{
- m_id = zoneId;
-}
-
-void QUtcTimeZonePrivate::init(const QByteArray &zoneId, int offsetSeconds, const QString &name,
- const QString &abbreviation, QLocale::Country country,
- const QString &comment)
-{
- m_id = zoneId;
- m_offsetFromUtc = offsetSeconds;
- m_name = name;
- m_abbreviation = abbreviation;
- m_country = country;
- m_comment = comment;
-}
-
-QLocale::Country QUtcTimeZonePrivate::country() const
-{
- return m_country;
-}
-
-QString QUtcTimeZonePrivate::comment() const
-{
- return m_comment;
-}
-
-QString QUtcTimeZonePrivate::displayName(QTimeZone::TimeType timeType,
- QTimeZone::NameType nameType,
- const QLocale &locale) const
-{
- Q_UNUSED(timeType)
- Q_UNUSED(locale)
- if (nameType == QTimeZone::ShortName)
- return m_abbreviation;
- else if (nameType == QTimeZone::OffsetName)
- return isoOffsetFormat(m_offsetFromUtc);
- return m_name;
-}
-
-QString QUtcTimeZonePrivate::abbreviation(qint64 atMSecsSinceEpoch) const
-{
- Q_UNUSED(atMSecsSinceEpoch)
- return m_abbreviation;
-}
-
-qint32 QUtcTimeZonePrivate::standardTimeOffset(qint64 atMSecsSinceEpoch) const
-{
- Q_UNUSED(atMSecsSinceEpoch)
- return m_offsetFromUtc;
-}
-
-qint32 QUtcTimeZonePrivate::daylightTimeOffset(qint64 atMSecsSinceEpoch) const
-{
- Q_UNUSED(atMSecsSinceEpoch)
- return 0;
-}
-
-QByteArray QUtcTimeZonePrivate::systemTimeZoneId() const
-{
- return utcQByteArray();
-}
-
-bool QUtcTimeZonePrivate::isTimeZoneIdAvailable(const QByteArray &ianaId) const
-{
- for (int i = 0; i < utcDataTableSize; ++i) {
- const QUtcData *data = utcData(i);
- if (utcId(data) == ianaId) {
- return true;
- }
- }
- return false;
-}
-
-QList<QByteArray> QUtcTimeZonePrivate::availableTimeZoneIds() const
-{
- QList<QByteArray> result;
- result.reserve(utcDataTableSize);
- for (int i = 0; i < utcDataTableSize; ++i)
- result << utcId(utcData(i));
- std::sort(result.begin(), result.end()); // ### or already sorted??
- // ### assuming no duplicates
- return result;
-}
-
-QList<QByteArray> QUtcTimeZonePrivate::availableTimeZoneIds(QLocale::Country country) const
-{
- // If AnyCountry then is request for all non-region offset codes
- if (country == QLocale::AnyCountry)
- return availableTimeZoneIds();
- return QList<QByteArray>();
-}
-
-QList<QByteArray> QUtcTimeZonePrivate::availableTimeZoneIds(qint32 offsetSeconds) const
-{
- QList<QByteArray> result;
- for (int i = 0; i < utcDataTableSize; ++i) {
- const QUtcData *data = utcData(i);
- if (data->offsetFromUtc == offsetSeconds)
- result << utcId(data);
- }
- std::sort(result.begin(), result.end()); // ### or already sorted??
- // ### assuming no duplicates
- return result;
-}
-
-#ifndef QT_NO_DATASTREAM
-void QUtcTimeZonePrivate::serialize(QDataStream &ds) const
-{
- ds << QStringLiteral("OffsetFromUtc") << QString::fromUtf8(m_id) << m_offsetFromUtc << m_name
- << m_abbreviation << (qint32) m_country << m_comment;
-}
-#endif // QT_NO_DATASTREAM
-
-QT_END_NAMESPACE
diff --git a/src/corelib/tools/qtimezoneprivate_android.cpp b/src/corelib/tools/qtimezoneprivate_android.cpp
deleted file mode 100644
index be4f374fdd..0000000000
--- a/src/corelib/tools/qtimezoneprivate_android.cpp
+++ /dev/null
@@ -1,257 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2014 Drew Parsons <dparsons@emerall.com>
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#include <QtCore/QSet>
-#include "qtimezone.h"
-#include "qtimezoneprivate_p.h"
-
-QT_BEGIN_NAMESPACE
-
-/*
- Private
-
- Android implementation
-*/
-
-// Create the system default time zone
-QAndroidTimeZonePrivate::QAndroidTimeZonePrivate()
- : QTimeZonePrivate()
-{
- // start with system time zone
- androidTimeZone = QJNIObjectPrivate::callStaticObjectMethod("java.util.TimeZone", "getDefault", "()Ljava/util/TimeZone;");
- init("UTC");
-}
-
-// Create a named time zone
-QAndroidTimeZonePrivate::QAndroidTimeZonePrivate(const QByteArray &ianaId)
- : QTimeZonePrivate()
-{
- init(ianaId);
-}
-
-QAndroidTimeZonePrivate::QAndroidTimeZonePrivate(const QAndroidTimeZonePrivate &other)
- : QTimeZonePrivate(other)
-{
- androidTimeZone = other.androidTimeZone;
- m_id = other.id();
-}
-
-QAndroidTimeZonePrivate::~QAndroidTimeZonePrivate()
-{
-}
-
-
-void QAndroidTimeZonePrivate::init(const QByteArray &ianaId)
-{
- QJNIObjectPrivate jo_ianaId = QJNIObjectPrivate::fromString( QString::fromUtf8(ianaId) );
- androidTimeZone = QJNIObjectPrivate::callStaticObjectMethod( "java.util.TimeZone", "getTimeZone", "(Ljava/lang/String;)Ljava/util/TimeZone;", static_cast<jstring>(jo_ianaId.object()) );
-
- // Painfully, JNI gives us back a default zone object if it doesn't
- // recognize the name; so check for whether ianaId is a recognized name of
- // the zone object we got and ignore the zone if not.
- // Try checking ianaId against getID(), getDisplayName():
- QJNIObjectPrivate jname = androidTimeZone.callObjectMethod("getID", "()Ljava/lang/String;");
- bool found = (jname.toString().toUtf8() == ianaId);
- for (int style = 1; !found && style-- > 0;) {
- for (int dst = 1; !found && dst-- > 0;) {
- jname = androidTimeZone.callObjectMethod("getDisplayName", "(ZI;)Ljava/lang/String;",
- bool(dst), style);
- found = (jname.toString().toUtf8() == ianaId);
- }
- }
-
- if (!found)
- m_id.clear();
- else if (ianaId.isEmpty())
- m_id = systemTimeZoneId();
- else
- m_id = ianaId;
-}
-
-QAndroidTimeZonePrivate *QAndroidTimeZonePrivate::clone() const
-{
- return new QAndroidTimeZonePrivate(*this);
-}
-
-
-QString QAndroidTimeZonePrivate::displayName(QTimeZone::TimeType timeType, QTimeZone::NameType nameType,
- const QLocale &locale) const
-{
- QString name;
-
- if (androidTimeZone.isValid()) {
- jboolean daylightTime = (timeType == QTimeZone::DaylightTime); // treat QTimeZone::GenericTime as QTimeZone::StandardTime
-
- // treat all NameTypes as java TimeZone style LONG (value 1), except of course QTimeZone::ShortName which is style SHORT (value 0);
- jint style = (nameType == QTimeZone::ShortName ? 0 : 1);
-
- QJNIObjectPrivate jlanguage = QJNIObjectPrivate::fromString(QLocale::languageToString(locale.language()));
- QJNIObjectPrivate jcountry = QJNIObjectPrivate::fromString(QLocale::countryToString(locale.country()));
- QJNIObjectPrivate jvariant = QJNIObjectPrivate::fromString(QLocale::scriptToString(locale.script()));
- QJNIObjectPrivate jlocale("java.util.Locale", "(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V", static_cast<jstring>(jlanguage.object()), static_cast<jstring>(jcountry.object()), static_cast<jstring>(jvariant.object()));
-
- QJNIObjectPrivate jname = androidTimeZone.callObjectMethod("getDisplayName", "(ZILjava/util/Locale;)Ljava/lang/String;", daylightTime, style, jlocale.object());
-
- name = jname.toString();
- }
-
- return name;
-}
-
-QString QAndroidTimeZonePrivate::abbreviation(qint64 atMSecsSinceEpoch) const
-{
- if ( isDaylightTime( atMSecsSinceEpoch ) )
- return displayName(QTimeZone::DaylightTime, QTimeZone::ShortName, QLocale() );
- else
- return displayName(QTimeZone::StandardTime, QTimeZone::ShortName, QLocale() );
-}
-
-int QAndroidTimeZonePrivate::offsetFromUtc(qint64 atMSecsSinceEpoch) const
-{
- // offsetFromUtc( ) is invoked when androidTimeZone may not yet be set at startup,
- // so a validity test is needed here
- if ( androidTimeZone.isValid() )
- // the java method getOffset() returns milliseconds, but QTimeZone returns seconds
- return androidTimeZone.callMethod<jint>( "getOffset", "(J)I", static_cast<jlong>(atMSecsSinceEpoch) ) / 1000;
- else
- return 0;
-}
-
-int QAndroidTimeZonePrivate::standardTimeOffset(qint64 atMSecsSinceEpoch) const
-{
- // the java method does not use a reference time
- Q_UNUSED( atMSecsSinceEpoch );
- if ( androidTimeZone.isValid() )
- // the java method getRawOffset() returns milliseconds, but QTimeZone returns seconds
- return androidTimeZone.callMethod<jint>( "getRawOffset" ) / 1000;
- else
- return 0;
-}
-
-int QAndroidTimeZonePrivate::daylightTimeOffset(qint64 atMSecsSinceEpoch) const
-{
- return ( offsetFromUtc(atMSecsSinceEpoch) - standardTimeOffset(atMSecsSinceEpoch) );
-}
-
-bool QAndroidTimeZonePrivate::hasDaylightTime() const
-{
- if ( androidTimeZone.isValid() )
- /* note: the Java function only tests for future DST transtions, not past */
- return androidTimeZone.callMethod<jboolean>("useDaylightTime" );
- else
- return false;
-}
-
-bool QAndroidTimeZonePrivate::isDaylightTime(qint64 atMSecsSinceEpoch) const
-{
- if ( androidTimeZone.isValid() ) {
- QJNIObjectPrivate jDate( "java/util/Date", "(J)V", static_cast<jlong>(atMSecsSinceEpoch) );
- return androidTimeZone.callMethod<jboolean>("inDaylightTime", "(Ljava/util/Date;)Z", jDate.object() );
- }
- else
- return false;
-}
-
-QTimeZonePrivate::Data QAndroidTimeZonePrivate::data(qint64 forMSecsSinceEpoch) const
-{
- if (androidTimeZone.isValid()) {
- Data data;
- data.atMSecsSinceEpoch = forMSecsSinceEpoch;
- data.standardTimeOffset = standardTimeOffset(forMSecsSinceEpoch);
- data.offsetFromUtc = offsetFromUtc(forMSecsSinceEpoch);
- data.daylightTimeOffset = data.offsetFromUtc - data.standardTimeOffset;
- data.abbreviation = abbreviation(forMSecsSinceEpoch);
- return data;
- } else {
- return invalidData();
- }
-}
-
-bool QAndroidTimeZonePrivate::hasTransitions() const
-{
- // java.util.TimeZone does not directly provide transitions
- return false;
-}
-
-QTimeZonePrivate::Data QAndroidTimeZonePrivate::nextTransition(qint64 afterMSecsSinceEpoch) const
-{
- // transitions not available on Android, so return an invalid data object
- Q_UNUSED( afterMSecsSinceEpoch );
- return invalidData();
-}
-
-QTimeZonePrivate::Data QAndroidTimeZonePrivate::previousTransition(qint64 beforeMSecsSinceEpoch) const
-{
- // transitions not available on Android, so return an invalid data object
- Q_UNUSED( beforeMSecsSinceEpoch );
- return invalidData();
-}
-
-QByteArray QAndroidTimeZonePrivate::systemTimeZoneId() const
-{
- QJNIObjectPrivate androidSystemTimeZone = QJNIObjectPrivate::callStaticObjectMethod("java.util.TimeZone", "getDefault", "()Ljava/util/TimeZone;");
- QJNIObjectPrivate systemTZIdAndroid = androidSystemTimeZone.callObjectMethod<jstring>("getID");
- QByteArray systemTZid = systemTZIdAndroid.toString().toUtf8();
-
- return systemTZid;
-}
-
-QList<QByteArray> QAndroidTimeZonePrivate::availableTimeZoneIds() const
-{
- QList<QByteArray> availableTimeZoneIdList;
- QJNIObjectPrivate androidAvailableIdList = QJNIObjectPrivate::callStaticObjectMethod("java.util.TimeZone", "getAvailableIDs", "()[Ljava/lang/String;");
-
- QJNIEnvironmentPrivate jniEnv;
- int androidTZcount = jniEnv->GetArrayLength( static_cast<jarray>(androidAvailableIdList.object()) );
-
- // need separate jobject and QAndroidJniObject here so that we can delete (DeleteLocalRef) the reference to the jobject
- // (or else the JNI reference table fills after 512 entries from GetObjectArrayElement)
- jobject androidTZobject;
- QJNIObjectPrivate androidTZ;
- for (int i=0; i<androidTZcount; i++ ) {
- androidTZobject = jniEnv->GetObjectArrayElement( static_cast<jobjectArray>( androidAvailableIdList.object() ), i );
- androidTZ = androidTZobject;
- availableTimeZoneIdList.append( androidTZ.toString().toUtf8() );
- jniEnv->DeleteLocalRef(androidTZobject);
- }
-
- return availableTimeZoneIdList;
-}
-
-QT_END_NAMESPACE
diff --git a/src/corelib/tools/qtimezoneprivate_data_p.h b/src/corelib/tools/qtimezoneprivate_data_p.h
deleted file mode 100644
index 69b9417f19..0000000000
--- a/src/corelib/tools/qtimezoneprivate_data_p.h
+++ /dev/null
@@ -1,1154 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2013 John Layt <jlayt@kde.org>
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-
-#ifndef QTIMEZONEPRIVATE_DATA_P_H
-#define QTIMEZONEPRIVATE_DATA_P_H
-
-//
-// W A R N I N G
-// -------------
-//
-// This file is not part of the Qt API. It exists for the convenience
-// of internal files. This header file may change from version to version
-// without notice, or even be removed.
-//
-// We mean it.
-//
-
-#include <QtCore/private/qglobal_p.h>
-
-QT_BEGIN_NAMESPACE
-
-/*
- Windows Zone ID support, included in default base class build so can be used on all platforms,
- e.g. an app running on Linux may need to communicate with a Windows Outlook server. These
- tables can also be used to look-up Region Codes and UTC Offsets on platforms that don't directly
- support them., e.g. Mac does not support availableTimeZones() filtering by region or offset.
-
- Another data table is provided for generic UTC+00:00 format time zones to be used as a
- fall-back if no system time zones are available (QT_NO_SYSTEMLOCALE is set) or for QDateTimes
- with a QT:Spec of OffsetFromUTC
-
- These tables are automatically adapted from the CLDR supplemental/windowsZones.xml data file
- using a script in qtbase/util/local_database. Please do not edit this data directly. In the
- future if ICU is made a hard dependency then the ICU resource can be used directly and this
- table removed
-*/
-
-struct QZoneData {
- quint16 windowsIdKey; // Windows ID Key
- quint16 country; // Country of IANA ID's, AnyCountry means No Country
- quint16 ianaIdIndex; // All IANA ID's for the Windows ID and Country, space separated
-};
-
-struct QWindowsData {
- quint16 windowsIdKey; // Windows ID Key
- quint16 windowsIdIndex; // Windows ID Literal
- quint16 ianaIdIndex; // Default IANA ID for the Windows ID
- qint32 offsetFromUtc; // Standard Time Offset from UTC, used for quick look-ups
-};
-
-struct QUtcData {
- quint16 ianaIdIndex; // IANA ID's
- qint32 offsetFromUtc; // Offset form UTC is seconds
-};
-
-/*
- COPYRIGHT AND PERMISSION NOTICE
-
- Copyright © 1991-2012 Unicode, Inc. All rights reserved. Distributed under
- the Terms of Use in http://www.unicode.org/copyright.html.
-
- Permission is hereby granted, free of charge, to any person obtaining a
- copy of the Unicode data files and any associated documentation (the "Data
- Files") or Unicode software and any associated documentation (the "Software")
- to deal in the Data Files or Software without restriction, including without
- limitation the rights to use, copy, modify, merge, publish, distribute, and/or
- sell copies of the Data Files or Software, and to permit persons to whom the
- Data Files or Software are furnished to do so, provided that (a) the above
- copyright notice(s) and this permission notice appear with all copies of the
- Data Files or Software, (b) both the above copyright notice(s) and this
- permission notice appear in associated documentation, and (c) there is clear
- notice in each modified Data File or in the Software as well as in the
- documentation associated with the Data File(s) or Software that the data or
- software has been modified.
-*/
-
-// GENERATED PART STARTS HERE
-
-/*
- This part of the file was generated on 2017-05-23 from the
- Common Locale Data Repository v29 supplemental/windowsZones.xml file $Revision: 12348 $
-
- http://www.unicode.org/cldr/
-
- Do not edit this code: run cldr2qtimezone.py on updated (or
- edited) CLDR data; see qtbase/util/local_database/.
-*/
-
-// Windows ID Key, Country Enum, IANA ID Index
-static const QZoneData zoneDataTable[] = {
- { 22, 57, 0 }, // Central Europe Standard Time / CzechRepublic
- { 69, 139, 14 }, // Pacific Standard Time / Mexico
- { 53, 188, 51 }, // Mauritius Standard Time / Seychelles
- { 50, 122, 63 }, // Libya Standard Time / Libya
- { 79, 38, 78 }, // SA Western Standard Time / Canada
- { 83, 35, 99 }, // South Africa Standard Time / Burundi
- { 102, 205, 116 }, // W. Europe Standard Time / Sweden
- { 89, 213, 133 }, // Tonga Standard Time / Tokelau
- { 77, 76, 149 }, // SA Eastern Standard Time / FrenchGuiana
- { 79, 215, 165 }, // SA Western Standard Time / TrinidadAndTobago
- { 69, 38, 187 }, // Pacific Standard Time / Canada
- { 97, 0, 239 }, // UTC+12 / AnyCountry
- { 19, 65, 250 }, // Central America Standard Time / ElSalvador
- { 82, 101, 270 }, // Singapore Standard Time / Indonesia
- { 37, 248, 284 }, // FLE Standard Time / AlandIslands
- { 16, 0, 301 }, // Cape Verde Standard Time / AnyCountry
- { 97, 220, 311 }, // UTC+12 / Tuvalu
- { 79, 182, 328 }, // SA Western Standard Time / SaintVincentAndTheGrenadines
- { 83, 179, 347 }, // South Africa Standard Time / Rwanda
- { 102, 125, 361 }, // W. Europe Standard Time / Luxembourg
- { 41, 34, 379 }, // Greenwich Standard Time / BurkinaFaso
- { 20, 116, 398 }, // Central Asia Standard Time / Kyrgyzstan
- { 101, 216, 411 }, // W. Central Africa Standard Time / Tunisia
- { 101, 79, 424 }, // W. Central Africa Standard Time / Gabon
- { 19, 96, 442 }, // Central America Standard Time / Honduras
- { 81, 36, 462 }, // SE Asia Standard Time / Cambodia
- { 82, 170, 478 }, // Singapore Standard Time / Philippines
- { 101, 41, 490 }, // W. Central Africa Standard Time / CentralAfricanRepublic
- { 5, 103, 504 }, // Arabic Standard Time / Iraq
- { 72, 21, 517 }, // Romance Standard Time / Belgium
- { 74, 178, 533 }, // Russia Time Zone 10 / Russia
- { 20, 44, 552 }, // Central Asia Standard Time / China
- { 3, 17, 564 }, // Arab Standard Time / Bahrain
- { 88, 62, 577 }, // Tokyo Standard Time / EastTimor
- { 37, 68, 587 }, // FLE Standard Time / Estonia
- { 41, 136, 602 }, // Greenwich Standard Time / Mauritania
- { 83, 49, 620 }, // South Africa Standard Time / CongoKinshasa
- { 72, 74, 638 }, // Romance Standard Time / France
- { 35, 178, 651 }, // Ekaterinburg Standard Time / Russia
- { 32, 16, 670 }, // Eastern Standard Time / Bahamas
- { 94, 30, 685 }, // UTC-02 / Brazil
- { 12, 30, 701 }, // Bahia Standard Time / Brazil
- { 82, 0, 715 }, // Singapore Standard Time / AnyCountry
- { 29, 201, 725 }, // E. Africa Standard Time / Sudan
- { 24, 229, 741 }, // Central Pacific Standard Time / Vanuatu
- { 55, 227, 755 }, // Montevideo Standard Time / Uruguay
- { 79, 233, 774 }, // SA Western Standard Time / BritishVirginIslands
- { 29, 221, 790 }, // E. Africa Standard Time / Uganda
- { 101, 6, 805 }, // W. Central Africa Standard Time / Angola
- { 68, 141, 819 }, // E. Europe Standard Time / Moldova
- { 51, 112, 835 }, // Line Islands Standard Time / Kiribati
- { 89, 0, 854 }, // Tonga Standard Time / AnyCountry
- { 79, 61, 865 }, // SA Western Standard Time / DominicanRepublic
- { 39, 75, 887 }, // GMT Standard Time / Guernsey
- { 37, 222, 903 }, // FLE Standard Time / Ukraine
- { 83, 28, 949 }, // South Africa Standard Time / Botswana
- { 82, 130, 965 }, // Singapore Standard Time / Malaysia
- { 95, 4, 996 }, // UTC-11 / AmericanSamoa
- { 41, 189, 1014 }, // Greenwich Standard Time / SierraLeone
- { 29, 194, 1030 }, // E. Africa Standard Time / Somalia
- { 94, 196, 1047 }, // UTC-02 / SouthGeorgiaAndTheSouthSandwichIslands
- { 96, 0, 1070 }, // UTC / AnyCountry
- { 101, 37, 1078 }, // W. Central Africa Standard Time / Cameroon
- { 13, 25, 1092 }, // Bangladesh Standard Time / Bhutan
- { 102, 151, 1105 }, // W. Europe Standard Time / Netherlands
- { 37, 118, 1122 }, // FLE Standard Time / Latvia
- { 29, 48, 1134 }, // E. Africa Standard Time / Comoros
- { 60, 178, 1148 }, // N. Central Asia Standard Time / Russia
- { 81, 117, 1175 }, // SE Asia Standard Time / Laos
- { 22, 242, 1190 }, // Central Europe Standard Time / Montenegro
- { 37, 33, 1207 }, // FLE Standard Time / Bulgaria
- { 11, 173, 1220 }, // Azores Standard Time / Portugal
- { 97, 149, 1236 }, // UTC+12 / Nauru
- { 83, 146, 1250 }, // South Africa Standard Time / Mozambique
- { 102, 82, 1264 }, // W. Europe Standard Time / Germany
- { 79, 255, 1294 }, // SA Western Standard Time / Bonaire
- { 24, 153, 1313 }, // Central Pacific Standard Time / NewCaledonia
- { 45, 102, 1328 }, // Iran Standard Time / Iran
- { 13, 18, 1340 }, // Bangladesh Standard Time / Bangladesh
- { 69, 225, 1351 }, // Pacific Standard Time / UnitedStates
- { 102, 142, 1371 }, // W. Europe Standard Time / Monaco
- { 29, 128, 1385 }, // E. Africa Standard Time / Madagascar
- { 65, 178, 1405 }, // North Asia East Standard Time / Russia
- { 20, 8, 1418 }, // Central Asia Standard Time / Antarctica
- { 22, 2, 1436 }, // Central Europe Standard Time / Albania
- { 79, 87, 1450 }, // SA Western Standard Time / Grenada
- { 81, 0, 1466 }, // SE Asia Standard Time / AnyCountry
- { 39, 173, 1476 }, // GMT Standard Time / Portugal
- { 103, 228, 1507 }, // West Asia Standard Time / Uzbekistan
- { 58, 139, 1536 }, // Mountain Standard Time / Mexico
- { 83, 129, 1552 }, // South Africa Standard Time / Malawi
- { 78, 107, 1568 }, // SA Pacific Standard Time / Jamaica
- { 41, 91, 1584 }, // Greenwich Standard Time / Guinea
- { 101, 49, 1599 }, // W. Central Africa Standard Time / CongoKinshasa
- { 43, 226, 1615 }, // Hawaiian Standard Time / UnitedStatesMinorOutlyingIslands
- { 77, 8, 1632 }, // SA Eastern Standard Time / Antarctica
- { 97, 235, 1651 }, // UTC+12 / WallisAndFutunaIslands
- { 81, 232, 1666 }, // SE Asia Standard Time / Vietnam
- { 34, 64, 1678 }, // Egypt Standard Time / Egypt
- { 102, 106, 1691 }, // W. Europe Standard Time / Italy
- { 79, 256, 1703 }, // SA Western Standard Time / SintMaarten
- { 59, 147, 1725 }, // Myanmar Standard Time / Myanmar
- { 78, 166, 1738 }, // SA Pacific Standard Time / Panama
- { 56, 236, 1753 }, // Morocco Standard Time / WesternSahara
- { 24, 193, 1769 }, // Central Pacific Standard Time / SolomonIslands
- { 48, 178, 1789 }, // Kaliningrad Standard Time / Russia
- { 47, 109, 1808 }, // Jordan Standard Time / Jordan
- { 42, 177, 1819 }, // GTB Standard Time / Romania
- { 41, 92, 1836 }, // Greenwich Standard Time / GuineaBissau
- { 102, 184, 1850 }, // W. Europe Standard Time / SanMarino
- { 103, 209, 1868 }, // West Asia Standard Time / Tajikistan
- { 75, 178, 1882 }, // Russia Time Zone 11 / Russia
- { 101, 157, 1909 }, // W. Central Africa Standard Time / Nigeria
- { 79, 152, 1922 }, // SA Western Standard Time / CuraSao
- { 57, 139, 1938 }, // Mountain Standard Time (Mexico) / Mexico
- { 4, 162, 1973 }, // Arabian Standard Time / Oman
- { 78, 169, 1985 }, // SA Pacific Standard Time / Peru
- { 102, 206, 1998 }, // W. Europe Standard Time / Switzerland
- { 41, 99, 2012 }, // Greenwich Standard Time / Iceland
- { 33, 139, 2031 }, // Eastern Standard Time (Mexico) / Mexico
- { 58, 225, 2046 }, // Mountain Standard Time / UnitedStates
- { 100, 8, 2075 }, // W. Australia Standard Time / Antarctica
- { 79, 30, 2092 }, // SA Western Standard Time / Brazil
- { 101, 23, 2145 }, // W. Central Africa Standard Time / Benin
- { 78, 43, 2163 }, // SA Pacific Standard Time / Chile
- { 104, 0, 2178 }, // West Pacific Standard Time / AnyCountry
- { 79, 181, 2189 }, // SA Western Standard Time / SaintLucia
- { 27, 126, 2206 }, // China Standard Time / Macau
- { 101, 66, 2217 }, // W. Central Africa Standard Time / EquatorialGuinea
- { 43, 51, 2231 }, // Hawaiian Standard Time / CookIslands
- { 41, 80, 2249 }, // Greenwich Standard Time / Gambia
- { 51, 0, 2263 }, // Line Islands Standard Time / AnyCountry
- { 52, 178, 2274 }, // Magadan Standard Time / Russia
- { 22, 191, 2287 }, // Central Europe Standard Time / Slovakia
- { 102, 5, 2305 }, // W. Europe Standard Time / Andorra
- { 81, 211, 2320 }, // SE Asia Standard Time / Thailand
- { 103, 0, 2333 }, // West Asia Standard Time / AnyCountry
- { 24, 167, 2343 }, // Central Pacific Standard Time / PapuaNewGuinea
- { 102, 230, 2364 }, // W. Europe Standard Time / VaticanCityState
- { 58, 38, 2379 }, // Mountain Standard Time / Canada
- { 77, 202, 2453 }, // SA Eastern Standard Time / Suriname
- { 9, 13, 2472 }, // AUS Eastern Standard Time / Australia
- { 29, 210, 2509 }, // E. Africa Standard Time / Tanzania
- { 58, 0, 2530 }, // Mountain Standard Time / AnyCountry
- { 83, 120, 2538 }, // South Africa Standard Time / Lesotho
- { 97, 134, 2552 }, // UTC+12 / MarshallIslands
- { 29, 111, 2585 }, // E. Africa Standard Time / Kenya
- { 103, 218, 2600 }, // West Asia Standard Time / Turkmenistan
- { 27, 97, 2614 }, // China Standard Time / HongKong
- { 29, 0, 2629 }, // E. Africa Standard Time / AnyCountry
- { 19, 22, 2639 }, // Central America Standard Time / Belize
- { 31, 30, 2654 }, // E. South America Standard Time / Brazil
- { 72, 197, 2672 }, // Romance Standard Time / Spain
- { 81, 101, 2699 }, // SE Asia Standard Time / Indonesia
- { 88, 0, 2727 }, // Tokyo Standard Time / AnyCountry
- { 2, 225, 2737 }, // Alaskan Standard Time / UnitedStates
- { 72, 58, 2832 }, // Romance Standard Time / Denmark
- { 63, 8, 2850 }, // New Zealand Standard Time / Antarctica
- { 3, 175, 2869 }, // Arab Standard Time / Qatar
- { 79, 245, 2880 }, // SA Western Standard Time / Saint Martin
- { 79, 19, 2896 }, // SA Western Standard Time / Barbados
- { 97, 226, 2913 }, // UTC+12 / UnitedStatesMinorOutlyingIslands
- { 37, 73, 2926 }, // FLE Standard Time / Finland
- { 29, 138, 2942 }, // E. Africa Standard Time / Mayotte
- { 39, 71, 2957 }, // GMT Standard Time / FaroeIslands
- { 78, 38, 2973 }, // SA Pacific Standard Time / Canada
- { 43, 0, 2995 }, // Hawaiian Standard Time / AnyCountry
- { 23, 27, 3006 }, // Central European Standard Time / BosniaAndHerzegowina
- { 38, 81, 3022 }, // Georgian Standard Time / Georgia
- { 95, 0, 3035 }, // UTC-11 / AnyCountry
- { 24, 13, 3046 }, // Central Pacific Standard Time / Australia
- { 104, 167, 3067 }, // West Pacific Standard Time / PapuaNewGuinea
- { 71, 168, 3088 }, // Paraguay Standard Time / Paraguay
- { 43, 77, 3105 }, // Hawaiian Standard Time / FrenchPolynesia
- { 41, 212, 3120 }, // Greenwich Standard Time / Togo
- { 39, 197, 3132 }, // GMT Standard Time / Spain
- { 83, 195, 3148 }, // South Africa Standard Time / SouthAfrica
- { 18, 13, 3168 }, // Cen. Australia Standard Time / Australia
- { 104, 160, 3209 }, // West Pacific Standard Time / NorthernMarianaIslands
- { 77, 70, 3224 }, // SA Eastern Standard Time / FalklandIslands
- { 42, 56, 3241 }, // GTB Standard Time / Cyprus
- { 4, 223, 3254 }, // Arabian Standard Time / UnitedArabEmirates
- { 103, 78, 3265 }, // West Asia Standard Time / FrenchSouthernTerritories
- { 101, 42, 3282 }, // W. Central Africa Standard Time / Chad
- { 23, 127, 3298 }, // Central European Standard Time / Macedonia
- { 3, 237, 3312 }, // Arab Standard Time / Yemen
- { 80, 183, 3322 }, // Samoa Standard Time / Samoa
- { 43, 225, 3335 }, // Hawaiian Standard Time / UnitedStates
- { 28, 0, 3352 }, // Dateline Standard Time / AnyCountry
- { 93, 139, 3363 }, // US Mountain Standard Time / Mexico
- { 64, 38, 3382 }, // Newfoundland Standard Time / Canada
- { 63, 154, 3399 }, // New Zealand Standard Time / NewZealand
- { 76, 178, 3416 }, // Russian Standard Time / Russia
- { 82, 190, 3465 }, // Singapore Standard Time / Singapore
- { 1, 1, 3480 }, // Afghanistan Standard Time / Afghanistan
- { 102, 133, 3491 }, // W. Europe Standard Time / Malta
- { 79, 12, 3504 }, // SA Western Standard Time / Aruba
- { 25, 139, 3518 }, // Central Standard Time (Mexico) / Mexico
- { 39, 251, 3594 }, // GMT Standard Time / IsleOfMan
- { 102, 123, 3613 }, // W. Europe Standard Time / Liechtenstein
- { 77, 30, 3626 }, // SA Eastern Standard Time / Brazil
- { 49, 114, 3723 }, // Korea Standard Time / SouthKorea
- { 79, 88, 3734 }, // SA Western Standard Time / Guadeloupe
- { 94, 0, 3753 }, // UTC-02 / AnyCountry
- { 59, 46, 3763 }, // Myanmar Standard Time / CocosIslands
- { 102, 203, 3776 }, // W. Europe Standard Time / SvalbardAndJanMayenIslands
- { 29, 69, 3796 }, // E. Africa Standard Time / Ethiopia
- { 73, 178, 3815 }, // Russia Time Zone 3 / Russia
- { 83, 240, 3829 }, // South Africa Standard Time / Zimbabwe
- { 100, 13, 3843 }, // W. Australia Standard Time / Australia
- { 101, 0, 3859 }, // W. Central Africa Standard Time / AnyCountry
- { 32, 55, 3869 }, // Eastern Standard Time / Cuba
- { 56, 145, 3884 }, // Morocco Standard Time / Morocco
- { 17, 11, 3902 }, // Caucasus Standard Time / Armenia
- { 7, 24, 3915 }, // Atlantic Standard Time / Bermuda
- { 86, 208, 3932 }, // Taipei Standard Time / Taiwan
- { 20, 0, 3944 }, // Central Asia Standard Time / AnyCountry
- { 40, 86, 3954 }, // Greenland Standard Time / Greenland
- { 23, 172, 3970 }, // Central European Standard Time / Poland
- { 89, 214, 3984 }, // Tonga Standard Time / Tonga
- { 20, 110, 4002 }, // Central Asia Standard Time / Kazakhstan
- { 81, 8, 4029 }, // SE Asia Standard Time / Antarctica
- { 54, 119, 4046 }, // Middle East Standard Time / Lebanon
- { 19, 90, 4058 }, // Central America Standard Time / Guatemala
- { 70, 163, 4076 }, // Pakistan Standard Time / Pakistan
- { 41, 83, 4089 }, // Greenwich Standard Time / Ghana
- { 79, 174, 4102 }, // SA Western Standard Time / PuertoRico
- { 79, 26, 4122 }, // SA Western Standard Time / Bolivia
- { 32, 225, 4137 }, // Eastern Standard Time / UnitedStates
- { 85, 207, 4294 }, // Syria Standard Time / Syria
- { 97, 112, 4308 }, // UTC+12 / Kiribati
- { 79, 0, 4323 }, // SA Western Standard Time / AnyCountry
- { 78, 47, 4333 }, // SA Pacific Standard Time / Colombia
- { 16, 39, 4348 }, // Cape Verde Standard Time / CapeVerde
- { 8, 13, 4368 }, // AUS Central Standard Time / Australia
- { 106, 113, 4385 }, // North Korea Standard Time / NorthKorea
- { 10, 15, 4400 }, // Azerbaijan Standard Time / Azerbaijan
- { 102, 84, 4410 }, // W. Europe Standard Time / Gibraltar
- { 46, 105, 4427 }, // Israel Standard Time / Israel
- { 22, 192, 4442 }, // Central Europe Standard Time / Slovenia
- { 24, 159, 4459 }, // Central Pacific Standard Time / NorfolkIsland
- { 82, 32, 4475 }, // Singapore Standard Time / Brunei
- { 101, 50, 4487 }, // W. Central Africa Standard Time / CongoBrazzaville
- { 62, 150, 4506 }, // Nepal Standard Time / Nepal
- { 44, 100, 4520 }, // India Standard Time / India
- { 79, 9, 4534 }, // SA Western Standard Time / AntiguaAndBarbuda
- { 39, 252, 4550 }, // GMT Standard Time / Jersey
- { 79, 144, 4564 }, // SA Western Standard Time / Montserrat
- { 93, 0, 4583 }, // US Mountain Standard Time / AnyCountry
- { 79, 93, 4593 }, // SA Western Standard Time / Guyana
- { 41, 187, 4608 }, // Greenwich Standard Time / Senegal
- { 102, 161, 4621 }, // W. Europe Standard Time / Norway
- { 42, 85, 4633 }, // GTB Standard Time / Greece
- { 3, 115, 4647 }, // Arab Standard Time / Kuwait
- { 24, 140, 4659 }, // Central Pacific Standard Time / Micronesia
- { 19, 52, 4689 }, // Central America Standard Time / CostaRica
- { 79, 60, 4708 }, // SA Western Standard Time / Dominica
- { 83, 204, 4725 }, // South Africa Standard Time / Swaziland
- { 79, 135, 4740 }, // SA Western Standard Time / Martinique
- { 53, 176, 4759 }, // Mauritius Standard Time / Reunion
- { 19, 0, 4774 }, // Central America Standard Time / AnyCountry
- { 90, 217, 4784 }, // Turkey Standard Time / Turkey
- { 66, 178, 4800 }, // North Asia Standard Time / Russia
- { 41, 53, 4835 }, // Greenwich Standard Time / IvoryCoast
- { 78, 30, 4850 }, // SA Pacific Standard Time / Brazil
- { 26, 0, 4886 }, // Central Standard Time / AnyCountry
- { 93, 225, 4894 }, // US Mountain Standard Time / UnitedStates
- { 15, 38, 4910 }, // Canada Central Standard Time / Canada
- { 78, 0, 4947 }, // SA Pacific Standard Time / AnyCountry
- { 103, 8, 4957 }, // West Asia Standard Time / Antarctica
- { 103, 131, 4975 }, // West Asia Standard Time / Maldives
- { 22, 243, 4991 }, // Central Europe Standard Time / Serbia
- { 29, 67, 5007 }, // E. Africa Standard Time / Eritrea
- { 93, 38, 5021 }, // US Mountain Standard Time / Canada
- { 22, 98, 5078 }, // Central Europe Standard Time / Hungary
- { 61, 148, 5094 }, // Namibia Standard Time / Namibia
- { 88, 101, 5110 }, // Tokyo Standard Time / Indonesia
- { 30, 13, 5124 }, // E. Australia Standard Time / Australia
- { 4, 0, 5162 }, // Arabian Standard Time / AnyCountry
- { 98, 231, 5172 }, // Venezuela Standard Time / Venezuela
- { 29, 8, 5188 }, // E. Africa Standard Time / Antarctica
- { 23, 54, 5205 }, // Central European Standard Time / Croatia
- { 6, 10, 5219 }, // Argentina Standard Time / Argentina
- { 67, 8, 5492 }, // Pacific SA Standard Time / Antarctica
- { 32, 38, 5510 }, // Eastern Standard Time / Canada
- { 41, 132, 5615 }, // Greenwich Standard Time / Mali
- { 3, 186, 5629 }, // Arab Standard Time / SaudiArabia
- { 104, 140, 5641 }, // West Pacific Standard Time / Micronesia
- { 88, 108, 5654 }, // Tokyo Standard Time / Japan
- { 89, 112, 5665 }, // Tonga Standard Time / Kiribati
- { 39, 224, 5683 }, // GMT Standard Time / UnitedKingdom
- { 92, 225, 5697 }, // US Eastern Standard Time / UnitedStates
- { 84, 198, 5764 }, // Sri Lanka Standard Time / SriLanka
- { 26, 38, 5777 }, // Central Standard Time / Canada
- { 29, 59, 5852 }, // E. Africa Standard Time / Djibouti
- { 7, 38, 5868 }, // Atlantic Standard Time / Canada
- { 41, 185, 5936 }, // Greenwich Standard Time / SaoTomeAndPrincipe
- { 79, 234, 5952 }, // SA Western Standard Time / UnitedStatesVirginIslands
- { 83, 239, 5970 }, // South Africa Standard Time / Zambia
- { 32, 94, 5984 }, // Eastern Standard Time / Haiti
- { 101, 156, 6007 }, // W. Central Africa Standard Time / Niger
- { 77, 0, 6021 }, // SA Eastern Standard Time / AnyCountry
- { 101, 3, 6031 }, // W. Central Africa Standard Time / Algeria
- { 78, 63, 6046 }, // SA Pacific Standard Time / Ecuador
- { 20, 31, 6064 }, // Central Asia Standard Time / BritishIndianOceanTerritory
- { 27, 44, 6078 }, // China Standard Time / China
- { 21, 30, 6092 }, // Central Brazilian Standard Time / Brazil
- { 95, 226, 6128 }, // UTC-11 / UnitedStatesMinorOutlyingIslands
- { 32, 0, 6143 }, // Eastern Standard Time / AnyCountry
- { 81, 45, 6151 }, // SE Asia Standard Time / ChristmasIsland
- { 19, 63, 6168 }, // Central America Standard Time / Ecuador
- { 79, 7, 6186 }, // SA Western Standard Time / Anguilla
- { 78, 40, 6203 }, // SA Pacific Standard Time / CaymanIslands
- { 79, 180, 6218 }, // SA Western Standard Time / SaintKittsAndNevis
- { 67, 43, 6235 }, // Pacific SA Standard Time / Chile
- { 88, 164, 6252 }, // Tokyo Standard Time / Palau
- { 105, 178, 6266 }, // Yakutsk Standard Time / Russia
- { 37, 124, 6304 }, // FLE Standard Time / Lithuania
- { 41, 121, 6319 }, // Greenwich Standard Time / Liberia
- { 104, 89, 6335 }, // West Pacific Standard Time / Guam
- { 96, 86, 6348 }, // UTC / Greenland
- { 36, 72, 6369 }, // Fiji Standard Time / Fiji
- { 19, 155, 6382 }, // Central America Standard Time / Nicaragua
- { 11, 86, 6398 }, // Azores Standard Time / Greenland
- { 79, 244, 6419 }, // SA Western Standard Time / Saint Barthelemy
- { 69, 0, 6441 }, // Pacific Standard Time / AnyCountry
- { 79, 219, 6449 }, // SA Western Standard Time / TurksAndCaicosIslands
- { 103, 110, 6468 }, // West Asia Standard Time / Kazakhstan
- { 26, 225, 6501 }, // Central Standard Time / UnitedStates
- { 26, 139, 6669 }, // Central Standard Time / Mexico
- { 7, 86, 6687 }, // Atlantic Standard Time / Greenland
- { 24, 0, 6701 }, // Central Pacific Standard Time / AnyCountry
- { 41, 199, 6712 }, // Greenwich Standard Time / SaintHelena
- { 95, 158, 6731 }, // UTC-11 / Niue
- { 53, 137, 6744 }, // Mauritius Standard Time / Mauritius
- { 91, 143, 6761 }, // Ulaanbaatar Standard Time / Mongolia
- { 83, 0, 6794 }, // South Africa Standard Time / AnyCountry
- { 14, 20, 6804 }, // Belarus Standard Time / Belarus
- { 29, 254, 6817 }, // E. Africa Standard Time / SouthSudan
- { 87, 13, 6829 }, // Tasmania Standard Time / Australia
- { 99, 178, 6863 }, // Vladivostok Standard Time / Russia
- { 104, 8, 6908 }, // West Pacific Standard Time / Antarctica
- { 39, 104, 6934 }, // GMT Standard Time / Ireland
- { 102, 14, 6948 }, // W. Europe Standard Time / Austria
- { 0, 0, 0 } // Trailing zeroes
-};
-
-// Windows ID Key, Windows ID Index, IANA ID Index, UTC Offset
-static const QWindowsData windowsDataTable[] = {
- { 1, 0, 3480, 16200 }, // Afghanistan Standard Time
- { 2, 26, 6962,-32400 }, // Alaskan Standard Time
- { 3, 48, 5629, 10800 }, // Arab Standard Time
- { 4, 67, 3254, 14400 }, // Arabian Standard Time
- { 5, 89, 504, 10800 }, // Arabic Standard Time
- { 6, 110, 6980,-10800 }, // Argentina Standard Time
- { 7, 134, 7001,-14400 }, // Atlantic Standard Time
- { 8, 157, 4368, 34200 }, // AUS Central Standard Time
- { 9, 183, 7017, 36000 }, // AUS Eastern Standard Time
- { 10, 209, 4400, 14400 }, // Azerbaijan Standard Time
- { 11, 234, 1220, -3600 }, // Azores Standard Time
- { 12, 255, 701,-10800 }, // Bahia Standard Time
- { 13, 275, 1340, 21600 }, // Bangladesh Standard Time
- { 14, 300, 6804, 10800 }, // Belarus Standard Time
- { 15, 322, 7034,-21600 }, // Canada Central Standard Time
- { 16, 351, 4348, -3600 }, // Cape Verde Standard Time
- { 17, 376, 3902, 14400 }, // Caucasus Standard Time
- { 18, 399, 7049, 34200 }, // Cen. Australia Standard Time
- { 19, 428, 4058,-21600 }, // Central America Standard Time
- { 20, 458, 7068, 21600 }, // Central Asia Standard Time
- { 21, 485, 7080,-14400 }, // Central Brazilian Standard Time
- { 22, 517, 5078, 3600 }, // Central Europe Standard Time
- { 23, 546, 3970, 3600 }, // Central European Standard Time
- { 24, 577, 1769, 39600 }, // Central Pacific Standard Time
- { 25, 607, 7095,-21600 }, // Central Standard Time (Mexico)
- { 26, 638, 7115,-21600 }, // Central Standard Time
- { 27, 660, 6078, 28800 }, // China Standard Time
- { 28, 680, 3352,-43200 }, // Dateline Standard Time
- { 29, 703, 2585, 10800 }, // E. Africa Standard Time
- { 30, 727, 7131, 36000 }, // E. Australia Standard Time
- { 31, 754, 2654,-10800 }, // E. South America Standard Time
- { 32, 785, 7150,-18000 }, // Eastern Standard Time
- { 33, 807, 2031,-18000 }, // Eastern Standard Time (Mexico)
- { 34, 838, 1678, 7200 }, // Egypt Standard Time
- { 35, 858, 651, 18000 }, // Ekaterinburg Standard Time
- { 36, 885, 6369, 43200 }, // Fiji Standard Time
- { 37, 904, 7167, 7200 }, // FLE Standard Time
- { 38, 922, 3022, 14400 }, // Georgian Standard Time
- { 39, 945, 5683, 0 }, // GMT Standard Time
- { 40, 963, 3954,-10800 }, // Greenland Standard Time
- { 41, 987, 2012, 0 }, // Greenwich Standard Time
- { 42, 1011, 1819, 7200 }, // GTB Standard Time
- { 43, 1029, 3335,-36000 }, // Hawaiian Standard Time
- { 44, 1052, 4520, 19800 }, // India Standard Time
- { 45, 1072, 1328, 12600 }, // Iran Standard Time
- { 46, 1091, 4427, 7200 }, // Israel Standard Time
- { 47, 1112, 1808, 7200 }, // Jordan Standard Time
- { 48, 1133, 1789, 7200 }, // Kaliningrad Standard Time
- { 49, 1159, 3723, 32400 }, // Korea Standard Time
- { 50, 1179, 63, 7200 }, // Libya Standard Time
- { 51, 1199, 835, 50400 }, // Line Islands Standard Time
- { 52, 1226, 2274, 36000 }, // Magadan Standard Time
- { 53, 1248, 6744, 14400 }, // Mauritius Standard Time
- { 54, 1272, 4046, 7200 }, // Middle East Standard Time
- { 55, 1298, 755,-10800 }, // Montevideo Standard Time
- { 56, 1323, 3884, 0 }, // Morocco Standard Time
- { 57, 1345, 7179,-25200 }, // Mountain Standard Time (Mexico)
- { 58, 1377, 7197,-25200 }, // Mountain Standard Time
- { 59, 1400, 1725, 23400 }, // Myanmar Standard Time
- { 60, 1422, 7212, 21600 }, // N. Central Asia Standard Time
- { 61, 1452, 5094, 3600 }, // Namibia Standard Time
- { 62, 1474, 4506, 20700 }, // Nepal Standard Time
- { 63, 1494, 3399, 43200 }, // New Zealand Standard Time
- { 64, 1520, 3382,-12600 }, // Newfoundland Standard Time
- { 65, 1547, 1405, 28800 }, // North Asia East Standard Time
- { 66, 1577, 7229, 25200 }, // North Asia Standard Time
- { 67, 1602, 6235,-10800 }, // Pacific SA Standard Time
- { 68, 1627, 819, 7200 }, // E. Europe Standard Time
- { 69, 1651, 1351,-28800 }, // Pacific Standard Time
- { 70, 1673, 4076, 18000 }, // Pakistan Standard Time
- { 71, 1696, 3088,-14400 }, // Paraguay Standard Time
- { 72, 1719, 638, 3600 }, // Romance Standard Time
- { 73, 1741, 3815, 14400 }, // Russia Time Zone 3
- { 74, 1760, 533, 39600 }, // Russia Time Zone 10
- { 75, 1780, 7246, 43200 }, // Russia Time Zone 11
- { 76, 1800, 7261, 10800 }, // Russian Standard Time
- { 77, 1822, 149,-10800 }, // SA Eastern Standard Time
- { 78, 1847, 4333,-18000 }, // SA Pacific Standard Time
- { 79, 1872, 4122,-14400 }, // SA Western Standard Time
- { 80, 1897, 3322, 46800 }, // Samoa Standard Time
- { 81, 1917, 2320, 25200 }, // SE Asia Standard Time
- { 82, 1939, 3465, 28800 }, // Singapore Standard Time
- { 83, 1963, 3148, 7200 }, // South Africa Standard Time
- { 84, 1990, 5764, 19800 }, // Sri Lanka Standard Time
- { 85, 2014, 4294, 7200 }, // Syria Standard Time
- { 86, 2034, 3932, 28800 }, // Taipei Standard Time
- { 87, 2055, 7275, 36000 }, // Tasmania Standard Time
- { 88, 2078, 5654, 32400 }, // Tokyo Standard Time
- { 89, 2098, 3984, 46800 }, // Tonga Standard Time
- { 90, 2118, 4784, 7200 }, // Turkey Standard Time
- { 91, 2139, 7292, 28800 }, // Ulaanbaatar Standard Time
- { 92, 2165, 7309,-18000 }, // US Eastern Standard Time
- { 93, 2190, 4894,-25200 }, // US Mountain Standard Time
- { 94, 2216, 3753, -7200 }, // UTC-02
- { 95, 2223, 3035,-39600 }, // UTC-11
- { 96, 2230, 1070, 0 }, // UTC
- { 97, 2234, 239, 43200 }, // UTC+12
- { 98, 2241, 5172,-16200 }, // Venezuela Standard Time
- { 99, 2265, 7330, 36000 }, // Vladivostok Standard Time
- { 100, 2291, 3843, 28800 }, // W. Australia Standard Time
- { 101, 2318, 1909, 3600 }, // W. Central Africa Standard Time
- { 102, 2350, 7347, 3600 }, // W. Europe Standard Time
- { 103, 2374, 7361, 18000 }, // West Asia Standard Time
- { 104, 2398, 3067, 36000 }, // West Pacific Standard Time
- { 105, 2425, 7375, 32400 }, // Yakutsk Standard Time
- { 106, 2447, 4385, 30600 }, // North Korea Standard Time
- { 0, 0, 0, 0 } // Trailing zeroes
-};
-
-// IANA ID Index, UTC Offset
-static const QUtcData utcDataTable[] = {
- { 7388, 0 }, // UTC
- { 7392,-50400 }, // UTC-14:00
- { 7402,-46800 }, // UTC-13:00
- { 7412,-43200 }, // UTC-12:00
- { 7422,-39600 }, // UTC-11:00
- { 7432,-36000 }, // UTC-10:00
- { 7442,-32400 }, // UTC-09:00
- { 7452,-28800 }, // UTC-08:00
- { 7462,-25200 }, // UTC-07:00
- { 7472,-21600 }, // UTC-06:00
- { 7482,-18000 }, // UTC-05:00
- { 7492,-16200 }, // UTC-04:30
- { 7502,-14400 }, // UTC-04:00
- { 7512,-12600 }, // UTC-03:30
- { 7522,-10800 }, // UTC-03:00
- { 7532, -7200 }, // UTC-02:00
- { 7542, -3600 }, // UTC-01:00
- { 7552, 0 }, // UTC-00:00
- { 7562, 0 }, // UTC+00:00
- { 7572, 3600 }, // UTC+01:00
- { 7582, 7200 }, // UTC+02:00
- { 7592, 10800 }, // UTC+03:00
- { 7602, 12600 }, // UTC+03:30
- { 7612, 14400 }, // UTC+04:00
- { 7622, 16200 }, // UTC+04:30
- { 7632, 18000 }, // UTC+05:00
- { 7642, 19800 }, // UTC+05:30
- { 7652, 20700 }, // UTC+05:45
- { 7662, 21600 }, // UTC+06:00
- { 7672, 23400 }, // UTC+06:30
- { 7682, 25200 }, // UTC+07:00
- { 7692, 28800 }, // UTC+08:00
- { 7702, 32400 }, // UTC+09:00
- { 7712, 34200 }, // UTC+09:30
- { 7722, 36000 }, // UTC+10:00
- { 7732, 39600 }, // UTC+11:00
- { 7742, 43200 }, // UTC+12:00
- { 7752, 46800 }, // UTC+13:00
- { 7762, 50400 }, // UTC+14:00
- { 7772, 30600 }, // UTC+08:30
- { 0, 0 } // Trailing zeroes
-};
-
-static const char windowsIdData[] = {
-0x41, 0x66, 0x67, 0x68, 0x61, 0x6e, 0x69, 0x73, 0x74, 0x61, 0x6e, 0x20, 0x53, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64,
-0x20, 0x54, 0x69, 0x6d, 0x65, 0x0, 0x41, 0x6c, 0x61, 0x73, 0x6b, 0x61, 0x6e, 0x20, 0x53, 0x74, 0x61, 0x6e, 0x64, 0x61,
-0x72, 0x64, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x0, 0x41, 0x72, 0x61, 0x62, 0x20, 0x53, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72,
-0x64, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x0, 0x41, 0x72, 0x61, 0x62, 0x69, 0x61, 0x6e, 0x20, 0x53, 0x74, 0x61, 0x6e, 0x64,
-0x61, 0x72, 0x64, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x0, 0x41, 0x72, 0x61, 0x62, 0x69, 0x63, 0x20, 0x53, 0x74, 0x61, 0x6e,
-0x64, 0x61, 0x72, 0x64, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x0, 0x41, 0x72, 0x67, 0x65, 0x6e, 0x74, 0x69, 0x6e, 0x61, 0x20,
-0x53, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x0, 0x41, 0x74, 0x6c, 0x61, 0x6e, 0x74,
-0x69, 0x63, 0x20, 0x53, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x0, 0x41, 0x55, 0x53,
-0x20, 0x43, 0x65, 0x6e, 0x74, 0x72, 0x61, 0x6c, 0x20, 0x53, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x20, 0x54, 0x69,
-0x6d, 0x65, 0x0, 0x41, 0x55, 0x53, 0x20, 0x45, 0x61, 0x73, 0x74, 0x65, 0x72, 0x6e, 0x20, 0x53, 0x74, 0x61, 0x6e, 0x64,
-0x61, 0x72, 0x64, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x0, 0x41, 0x7a, 0x65, 0x72, 0x62, 0x61, 0x69, 0x6a, 0x61, 0x6e, 0x20,
-0x53, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x0, 0x41, 0x7a, 0x6f, 0x72, 0x65, 0x73,
-0x20, 0x53, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x0, 0x42, 0x61, 0x68, 0x69, 0x61,
-0x20, 0x53, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x0, 0x42, 0x61, 0x6e, 0x67, 0x6c,
-0x61, 0x64, 0x65, 0x73, 0x68, 0x20, 0x53, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x0,
-0x42, 0x65, 0x6c, 0x61, 0x72, 0x75, 0x73, 0x20, 0x53, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x20, 0x54, 0x69, 0x6d,
-0x65, 0x0, 0x43, 0x61, 0x6e, 0x61, 0x64, 0x61, 0x20, 0x43, 0x65, 0x6e, 0x74, 0x72, 0x61, 0x6c, 0x20, 0x53, 0x74, 0x61,
-0x6e, 0x64, 0x61, 0x72, 0x64, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x0, 0x43, 0x61, 0x70, 0x65, 0x20, 0x56, 0x65, 0x72, 0x64,
-0x65, 0x20, 0x53, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x0, 0x43, 0x61, 0x75, 0x63,
-0x61, 0x73, 0x75, 0x73, 0x20, 0x53, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x0, 0x43,
-0x65, 0x6e, 0x2e, 0x20, 0x41, 0x75, 0x73, 0x74, 0x72, 0x61, 0x6c, 0x69, 0x61, 0x20, 0x53, 0x74, 0x61, 0x6e, 0x64, 0x61,
-0x72, 0x64, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x0, 0x43, 0x65, 0x6e, 0x74, 0x72, 0x61, 0x6c, 0x20, 0x41, 0x6d, 0x65, 0x72,
-0x69, 0x63, 0x61, 0x20, 0x53, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x0, 0x43, 0x65,
-0x6e, 0x74, 0x72, 0x61, 0x6c, 0x20, 0x41, 0x73, 0x69, 0x61, 0x20, 0x53, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x20,
-0x54, 0x69, 0x6d, 0x65, 0x0, 0x43, 0x65, 0x6e, 0x74, 0x72, 0x61, 0x6c, 0x20, 0x42, 0x72, 0x61, 0x7a, 0x69, 0x6c, 0x69,
-0x61, 0x6e, 0x20, 0x53, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x0, 0x43, 0x65, 0x6e,
-0x74, 0x72, 0x61, 0x6c, 0x20, 0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x20, 0x53, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64,
-0x20, 0x54, 0x69, 0x6d, 0x65, 0x0, 0x43, 0x65, 0x6e, 0x74, 0x72, 0x61, 0x6c, 0x20, 0x45, 0x75, 0x72, 0x6f, 0x70, 0x65,
-0x61, 0x6e, 0x20, 0x53, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x0, 0x43, 0x65, 0x6e,
-0x74, 0x72, 0x61, 0x6c, 0x20, 0x50, 0x61, 0x63, 0x69, 0x66, 0x69, 0x63, 0x20, 0x53, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72,
-0x64, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x0, 0x43, 0x65, 0x6e, 0x74, 0x72, 0x61, 0x6c, 0x20, 0x53, 0x74, 0x61, 0x6e, 0x64,
-0x61, 0x72, 0x64, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x20, 0x28, 0x4d, 0x65, 0x78, 0x69, 0x63, 0x6f, 0x29, 0x0, 0x43, 0x65,
-0x6e, 0x74, 0x72, 0x61, 0x6c, 0x20, 0x53, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x0,
-0x43, 0x68, 0x69, 0x6e, 0x61, 0x20, 0x53, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x0,
-0x44, 0x61, 0x74, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x20, 0x53, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x20, 0x54, 0x69,
-0x6d, 0x65, 0x0, 0x45, 0x2e, 0x20, 0x41, 0x66, 0x72, 0x69, 0x63, 0x61, 0x20, 0x53, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72,
-0x64, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x0, 0x45, 0x2e, 0x20, 0x41, 0x75, 0x73, 0x74, 0x72, 0x61, 0x6c, 0x69, 0x61, 0x20,
-0x53, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x0, 0x45, 0x2e, 0x20, 0x53, 0x6f, 0x75,
-0x74, 0x68, 0x20, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x20, 0x53, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x20,
-0x54, 0x69, 0x6d, 0x65, 0x0, 0x45, 0x61, 0x73, 0x74, 0x65, 0x72, 0x6e, 0x20, 0x53, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72,
-0x64, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x0, 0x45, 0x61, 0x73, 0x74, 0x65, 0x72, 0x6e, 0x20, 0x53, 0x74, 0x61, 0x6e, 0x64,
-0x61, 0x72, 0x64, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x20, 0x28, 0x4d, 0x65, 0x78, 0x69, 0x63, 0x6f, 0x29, 0x0, 0x45, 0x67,
-0x79, 0x70, 0x74, 0x20, 0x53, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x0, 0x45, 0x6b,
-0x61, 0x74, 0x65, 0x72, 0x69, 0x6e, 0x62, 0x75, 0x72, 0x67, 0x20, 0x53, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x20,
-0x54, 0x69, 0x6d, 0x65, 0x0, 0x46, 0x69, 0x6a, 0x69, 0x20, 0x53, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x20, 0x54,
-0x69, 0x6d, 0x65, 0x0, 0x46, 0x4c, 0x45, 0x20, 0x53, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x20, 0x54, 0x69, 0x6d,
-0x65, 0x0, 0x47, 0x65, 0x6f, 0x72, 0x67, 0x69, 0x61, 0x6e, 0x20, 0x53, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x20,
-0x54, 0x69, 0x6d, 0x65, 0x0, 0x47, 0x4d, 0x54, 0x20, 0x53, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x20, 0x54, 0x69,
-0x6d, 0x65, 0x0, 0x47, 0x72, 0x65, 0x65, 0x6e, 0x6c, 0x61, 0x6e, 0x64, 0x20, 0x53, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72,
-0x64, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x0, 0x47, 0x72, 0x65, 0x65, 0x6e, 0x77, 0x69, 0x63, 0x68, 0x20, 0x53, 0x74, 0x61,
-0x6e, 0x64, 0x61, 0x72, 0x64, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x0, 0x47, 0x54, 0x42, 0x20, 0x53, 0x74, 0x61, 0x6e, 0x64,
-0x61, 0x72, 0x64, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x0, 0x48, 0x61, 0x77, 0x61, 0x69, 0x69, 0x61, 0x6e, 0x20, 0x53, 0x74,
-0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x0, 0x49, 0x6e, 0x64, 0x69, 0x61, 0x20, 0x53, 0x74,
-0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x0, 0x49, 0x72, 0x61, 0x6e, 0x20, 0x53, 0x74, 0x61,
-0x6e, 0x64, 0x61, 0x72, 0x64, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x0, 0x49, 0x73, 0x72, 0x61, 0x65, 0x6c, 0x20, 0x53, 0x74,
-0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x0, 0x4a, 0x6f, 0x72, 0x64, 0x61, 0x6e, 0x20, 0x53,
-0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x0, 0x4b, 0x61, 0x6c, 0x69, 0x6e, 0x69, 0x6e,
-0x67, 0x72, 0x61, 0x64, 0x20, 0x53, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x0, 0x4b,
-0x6f, 0x72, 0x65, 0x61, 0x20, 0x53, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x0, 0x4c,
-0x69, 0x62, 0x79, 0x61, 0x20, 0x53, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x0, 0x4c,
-0x69, 0x6e, 0x65, 0x20, 0x49, 0x73, 0x6c, 0x61, 0x6e, 0x64, 0x73, 0x20, 0x53, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64,
-0x20, 0x54, 0x69, 0x6d, 0x65, 0x0, 0x4d, 0x61, 0x67, 0x61, 0x64, 0x61, 0x6e, 0x20, 0x53, 0x74, 0x61, 0x6e, 0x64, 0x61,
-0x72, 0x64, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x0, 0x4d, 0x61, 0x75, 0x72, 0x69, 0x74, 0x69, 0x75, 0x73, 0x20, 0x53, 0x74,
-0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x0, 0x4d, 0x69, 0x64, 0x64, 0x6c, 0x65, 0x20, 0x45,
-0x61, 0x73, 0x74, 0x20, 0x53, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x0, 0x4d, 0x6f,
-0x6e, 0x74, 0x65, 0x76, 0x69, 0x64, 0x65, 0x6f, 0x20, 0x53, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x20, 0x54, 0x69,
-0x6d, 0x65, 0x0, 0x4d, 0x6f, 0x72, 0x6f, 0x63, 0x63, 0x6f, 0x20, 0x53, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x20,
-0x54, 0x69, 0x6d, 0x65, 0x0, 0x4d, 0x6f, 0x75, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x20, 0x53, 0x74, 0x61, 0x6e, 0x64, 0x61,
-0x72, 0x64, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x20, 0x28, 0x4d, 0x65, 0x78, 0x69, 0x63, 0x6f, 0x29, 0x0, 0x4d, 0x6f, 0x75,
-0x6e, 0x74, 0x61, 0x69, 0x6e, 0x20, 0x53, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x0,
-0x4d, 0x79, 0x61, 0x6e, 0x6d, 0x61, 0x72, 0x20, 0x53, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x20, 0x54, 0x69, 0x6d,
-0x65, 0x0, 0x4e, 0x2e, 0x20, 0x43, 0x65, 0x6e, 0x74, 0x72, 0x61, 0x6c, 0x20, 0x41, 0x73, 0x69, 0x61, 0x20, 0x53, 0x74,
-0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x0, 0x4e, 0x61, 0x6d, 0x69, 0x62, 0x69, 0x61, 0x20,
-0x53, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x0, 0x4e, 0x65, 0x70, 0x61, 0x6c, 0x20,
-0x53, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x0, 0x4e, 0x65, 0x77, 0x20, 0x5a, 0x65,
-0x61, 0x6c, 0x61, 0x6e, 0x64, 0x20, 0x53, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x0,
-0x4e, 0x65, 0x77, 0x66, 0x6f, 0x75, 0x6e, 0x64, 0x6c, 0x61, 0x6e, 0x64, 0x20, 0x53, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72,
-0x64, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x0, 0x4e, 0x6f, 0x72, 0x74, 0x68, 0x20, 0x41, 0x73, 0x69, 0x61, 0x20, 0x45, 0x61,
-0x73, 0x74, 0x20, 0x53, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x0, 0x4e, 0x6f, 0x72,
-0x74, 0x68, 0x20, 0x41, 0x73, 0x69, 0x61, 0x20, 0x53, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x20, 0x54, 0x69, 0x6d,
-0x65, 0x0, 0x50, 0x61, 0x63, 0x69, 0x66, 0x69, 0x63, 0x20, 0x53, 0x41, 0x20, 0x53, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72,
-0x64, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x0, 0x45, 0x2e, 0x20, 0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x20, 0x53, 0x74, 0x61,
-0x6e, 0x64, 0x61, 0x72, 0x64, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x0, 0x50, 0x61, 0x63, 0x69, 0x66, 0x69, 0x63, 0x20, 0x53,
-0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x0, 0x50, 0x61, 0x6b, 0x69, 0x73, 0x74, 0x61,
-0x6e, 0x20, 0x53, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x0, 0x50, 0x61, 0x72, 0x61,
-0x67, 0x75, 0x61, 0x79, 0x20, 0x53, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x0, 0x52,
-0x6f, 0x6d, 0x61, 0x6e, 0x63, 0x65, 0x20, 0x53, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x20, 0x54, 0x69, 0x6d, 0x65,
-0x0, 0x52, 0x75, 0x73, 0x73, 0x69, 0x61, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x20, 0x5a, 0x6f, 0x6e, 0x65, 0x20, 0x33, 0x0,
-0x52, 0x75, 0x73, 0x73, 0x69, 0x61, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x20, 0x5a, 0x6f, 0x6e, 0x65, 0x20, 0x31, 0x30, 0x0,
-0x52, 0x75, 0x73, 0x73, 0x69, 0x61, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x20, 0x5a, 0x6f, 0x6e, 0x65, 0x20, 0x31, 0x31, 0x0,
-0x52, 0x75, 0x73, 0x73, 0x69, 0x61, 0x6e, 0x20, 0x53, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x20, 0x54, 0x69, 0x6d,
-0x65, 0x0, 0x53, 0x41, 0x20, 0x45, 0x61, 0x73, 0x74, 0x65, 0x72, 0x6e, 0x20, 0x53, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72,
-0x64, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x0, 0x53, 0x41, 0x20, 0x50, 0x61, 0x63, 0x69, 0x66, 0x69, 0x63, 0x20, 0x53, 0x74,
-0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x0, 0x53, 0x41, 0x20, 0x57, 0x65, 0x73, 0x74, 0x65,
-0x72, 0x6e, 0x20, 0x53, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x0, 0x53, 0x61, 0x6d,
-0x6f, 0x61, 0x20, 0x53, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x0, 0x53, 0x45, 0x20,
-0x41, 0x73, 0x69, 0x61, 0x20, 0x53, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x0, 0x53,
-0x69, 0x6e, 0x67, 0x61, 0x70, 0x6f, 0x72, 0x65, 0x20, 0x53, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x20, 0x54, 0x69,
-0x6d, 0x65, 0x0, 0x53, 0x6f, 0x75, 0x74, 0x68, 0x20, 0x41, 0x66, 0x72, 0x69, 0x63, 0x61, 0x20, 0x53, 0x74, 0x61, 0x6e,
-0x64, 0x61, 0x72, 0x64, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x0, 0x53, 0x72, 0x69, 0x20, 0x4c, 0x61, 0x6e, 0x6b, 0x61, 0x20,
-0x53, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x0, 0x53, 0x79, 0x72, 0x69, 0x61, 0x20,
-0x53, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x0, 0x54, 0x61, 0x69, 0x70, 0x65, 0x69,
-0x20, 0x53, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x0, 0x54, 0x61, 0x73, 0x6d, 0x61,
-0x6e, 0x69, 0x61, 0x20, 0x53, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x0, 0x54, 0x6f,
-0x6b, 0x79, 0x6f, 0x20, 0x53, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x0, 0x54, 0x6f,
-0x6e, 0x67, 0x61, 0x20, 0x53, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x0, 0x54, 0x75,
-0x72, 0x6b, 0x65, 0x79, 0x20, 0x53, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x0, 0x55,
-0x6c, 0x61, 0x61, 0x6e, 0x62, 0x61, 0x61, 0x74, 0x61, 0x72, 0x20, 0x53, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x20,
-0x54, 0x69, 0x6d, 0x65, 0x0, 0x55, 0x53, 0x20, 0x45, 0x61, 0x73, 0x74, 0x65, 0x72, 0x6e, 0x20, 0x53, 0x74, 0x61, 0x6e,
-0x64, 0x61, 0x72, 0x64, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x0, 0x55, 0x53, 0x20, 0x4d, 0x6f, 0x75, 0x6e, 0x74, 0x61, 0x69,
-0x6e, 0x20, 0x53, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x0, 0x55, 0x54, 0x43, 0x2d,
-0x30, 0x32, 0x0, 0x55, 0x54, 0x43, 0x2d, 0x31, 0x31, 0x0, 0x55, 0x54, 0x43, 0x0, 0x55, 0x54, 0x43, 0x2b, 0x31, 0x32,
-0x0, 0x56, 0x65, 0x6e, 0x65, 0x7a, 0x75, 0x65, 0x6c, 0x61, 0x20, 0x53, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x20,
-0x54, 0x69, 0x6d, 0x65, 0x0, 0x56, 0x6c, 0x61, 0x64, 0x69, 0x76, 0x6f, 0x73, 0x74, 0x6f, 0x6b, 0x20, 0x53, 0x74, 0x61,
-0x6e, 0x64, 0x61, 0x72, 0x64, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x0, 0x57, 0x2e, 0x20, 0x41, 0x75, 0x73, 0x74, 0x72, 0x61,
-0x6c, 0x69, 0x61, 0x20, 0x53, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x0, 0x57, 0x2e,
-0x20, 0x43, 0x65, 0x6e, 0x74, 0x72, 0x61, 0x6c, 0x20, 0x41, 0x66, 0x72, 0x69, 0x63, 0x61, 0x20, 0x53, 0x74, 0x61, 0x6e,
-0x64, 0x61, 0x72, 0x64, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x0, 0x57, 0x2e, 0x20, 0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x20,
-0x53, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x0, 0x57, 0x65, 0x73, 0x74, 0x20, 0x41,
-0x73, 0x69, 0x61, 0x20, 0x53, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x0, 0x57, 0x65,
-0x73, 0x74, 0x20, 0x50, 0x61, 0x63, 0x69, 0x66, 0x69, 0x63, 0x20, 0x53, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x20,
-0x54, 0x69, 0x6d, 0x65, 0x0, 0x59, 0x61, 0x6b, 0x75, 0x74, 0x73, 0x6b, 0x20, 0x53, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72,
-0x64, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x0, 0x4e, 0x6f, 0x72, 0x74, 0x68, 0x20, 0x4b, 0x6f, 0x72, 0x65, 0x61, 0x20, 0x53,
-0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x0
-};
-
-static const char ianaIdData[] = {
-0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f, 0x50, 0x72, 0x61, 0x67, 0x75, 0x65, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63,
-0x61, 0x2f, 0x54, 0x69, 0x6a, 0x75, 0x61, 0x6e, 0x61, 0x20, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x53, 0x61,
-0x6e, 0x74, 0x61, 0x5f, 0x49, 0x73, 0x61, 0x62, 0x65, 0x6c, 0x0, 0x49, 0x6e, 0x64, 0x69, 0x61, 0x6e, 0x2f, 0x4d, 0x61,
-0x68, 0x65, 0x0, 0x41, 0x66, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x54, 0x72, 0x69, 0x70, 0x6f, 0x6c, 0x69, 0x0, 0x41, 0x6d,
-0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x42, 0x6c, 0x61, 0x6e, 0x63, 0x2d, 0x53, 0x61, 0x62, 0x6c, 0x6f, 0x6e, 0x0, 0x41,
-0x66, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x42, 0x75, 0x6a, 0x75, 0x6d, 0x62, 0x75, 0x72, 0x61, 0x0, 0x45, 0x75, 0x72, 0x6f,
-0x70, 0x65, 0x2f, 0x53, 0x74, 0x6f, 0x63, 0x6b, 0x68, 0x6f, 0x6c, 0x6d, 0x0, 0x50, 0x61, 0x63, 0x69, 0x66, 0x69, 0x63,
-0x2f, 0x46, 0x61, 0x6b, 0x61, 0x6f, 0x66, 0x6f, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x43, 0x61, 0x79,
-0x65, 0x6e, 0x6e, 0x65, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x50, 0x6f, 0x72, 0x74, 0x5f, 0x6f, 0x66,
-0x5f, 0x53, 0x70, 0x61, 0x69, 0x6e, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x56, 0x61, 0x6e, 0x63, 0x6f,
-0x75, 0x76, 0x65, 0x72, 0x20, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x44, 0x61, 0x77, 0x73, 0x6f, 0x6e, 0x20,
-0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x57, 0x68, 0x69, 0x74, 0x65, 0x68, 0x6f, 0x72, 0x73, 0x65, 0x0, 0x45,
-0x74, 0x63, 0x2f, 0x47, 0x4d, 0x54, 0x2d, 0x31, 0x32, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x45, 0x6c,
-0x5f, 0x53, 0x61, 0x6c, 0x76, 0x61, 0x64, 0x6f, 0x72, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x4d, 0x61, 0x6b, 0x61, 0x73,
-0x73, 0x61, 0x72, 0x0, 0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f, 0x4d, 0x61, 0x72, 0x69, 0x65, 0x68, 0x61, 0x6d, 0x6e,
-0x0, 0x45, 0x74, 0x63, 0x2f, 0x47, 0x4d, 0x54, 0x2b, 0x31, 0x0, 0x50, 0x61, 0x63, 0x69, 0x66, 0x69, 0x63, 0x2f, 0x46,
-0x75, 0x6e, 0x61, 0x66, 0x75, 0x74, 0x69, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x53, 0x74, 0x5f, 0x56,
-0x69, 0x6e, 0x63, 0x65, 0x6e, 0x74, 0x0, 0x41, 0x66, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x4b, 0x69, 0x67, 0x61, 0x6c, 0x69,
-0x0, 0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f, 0x4c, 0x75, 0x78, 0x65, 0x6d, 0x62, 0x6f, 0x75, 0x72, 0x67, 0x0, 0x41,
-0x66, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x4f, 0x75, 0x61, 0x67, 0x61, 0x64, 0x6f, 0x75, 0x67, 0x6f, 0x75, 0x0, 0x41, 0x73,
-0x69, 0x61, 0x2f, 0x42, 0x69, 0x73, 0x68, 0x6b, 0x65, 0x6b, 0x0, 0x41, 0x66, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x54, 0x75,
-0x6e, 0x69, 0x73, 0x0, 0x41, 0x66, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x4c, 0x69, 0x62, 0x72, 0x65, 0x76, 0x69, 0x6c, 0x6c,
-0x65, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x54, 0x65, 0x67, 0x75, 0x63, 0x69, 0x67, 0x61, 0x6c, 0x70,
-0x61, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x50, 0x68, 0x6e, 0x6f, 0x6d, 0x5f, 0x50, 0x65, 0x6e, 0x68, 0x0, 0x41, 0x73,
-0x69, 0x61, 0x2f, 0x4d, 0x61, 0x6e, 0x69, 0x6c, 0x61, 0x0, 0x41, 0x66, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x42, 0x61, 0x6e,
-0x67, 0x75, 0x69, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x42, 0x61, 0x67, 0x68, 0x64, 0x61, 0x64, 0x0, 0x45, 0x75, 0x72,
-0x6f, 0x70, 0x65, 0x2f, 0x42, 0x72, 0x75, 0x73, 0x73, 0x65, 0x6c, 0x73, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x53, 0x72,
-0x65, 0x64, 0x6e, 0x65, 0x6b, 0x6f, 0x6c, 0x79, 0x6d, 0x73, 0x6b, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x55, 0x72, 0x75,
-0x6d, 0x71, 0x69, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x42, 0x61, 0x68, 0x72, 0x61, 0x69, 0x6e, 0x0, 0x41, 0x73, 0x69,
-0x61, 0x2f, 0x44, 0x69, 0x6c, 0x69, 0x0, 0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f, 0x54, 0x61, 0x6c, 0x6c, 0x69, 0x6e,
-0x6e, 0x0, 0x41, 0x66, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x4e, 0x6f, 0x75, 0x61, 0x6b, 0x63, 0x68, 0x6f, 0x74, 0x74, 0x0,
-0x41, 0x66, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x4c, 0x75, 0x62, 0x75, 0x6d, 0x62, 0x61, 0x73, 0x68, 0x69, 0x0, 0x45, 0x75,
-0x72, 0x6f, 0x70, 0x65, 0x2f, 0x50, 0x61, 0x72, 0x69, 0x73, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x59, 0x65, 0x6b, 0x61,
-0x74, 0x65, 0x72, 0x69, 0x6e, 0x62, 0x75, 0x72, 0x67, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x4e, 0x61,
-0x73, 0x73, 0x61, 0x75, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x4e, 0x6f, 0x72, 0x6f, 0x6e, 0x68, 0x61,
-0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x42, 0x61, 0x68, 0x69, 0x61, 0x0, 0x45, 0x74, 0x63, 0x2f, 0x47,
-0x4d, 0x54, 0x2d, 0x38, 0x0, 0x41, 0x66, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x4b, 0x68, 0x61, 0x72, 0x74, 0x6f, 0x75, 0x6d,
-0x0, 0x50, 0x61, 0x63, 0x69, 0x66, 0x69, 0x63, 0x2f, 0x45, 0x66, 0x61, 0x74, 0x65, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69,
-0x63, 0x61, 0x2f, 0x4d, 0x6f, 0x6e, 0x74, 0x65, 0x76, 0x69, 0x64, 0x65, 0x6f, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63,
-0x61, 0x2f, 0x54, 0x6f, 0x72, 0x74, 0x6f, 0x6c, 0x61, 0x0, 0x41, 0x66, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x4b, 0x61, 0x6d,
-0x70, 0x61, 0x6c, 0x61, 0x0, 0x41, 0x66, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x4c, 0x75, 0x61, 0x6e, 0x64, 0x61, 0x0, 0x45,
-0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f, 0x43, 0x68, 0x69, 0x73, 0x69, 0x6e, 0x61, 0x75, 0x0, 0x50, 0x61, 0x63, 0x69, 0x66,
-0x69, 0x63, 0x2f, 0x4b, 0x69, 0x72, 0x69, 0x74, 0x69, 0x6d, 0x61, 0x74, 0x69, 0x0, 0x45, 0x74, 0x63, 0x2f, 0x47, 0x4d,
-0x54, 0x2d, 0x31, 0x33, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x53, 0x61, 0x6e, 0x74, 0x6f, 0x5f, 0x44,
-0x6f, 0x6d, 0x69, 0x6e, 0x67, 0x6f, 0x0, 0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f, 0x47, 0x75, 0x65, 0x72, 0x6e, 0x73,
-0x65, 0x79, 0x0, 0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f, 0x4b, 0x69, 0x65, 0x76, 0x20, 0x45, 0x75, 0x72, 0x6f, 0x70,
-0x65, 0x2f, 0x55, 0x7a, 0x68, 0x67, 0x6f, 0x72, 0x6f, 0x64, 0x20, 0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f, 0x5a, 0x61,
-0x70, 0x6f, 0x72, 0x6f, 0x7a, 0x68, 0x79, 0x65, 0x0, 0x41, 0x66, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x47, 0x61, 0x62, 0x6f,
-0x72, 0x6f, 0x6e, 0x65, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x4b, 0x75, 0x61, 0x6c, 0x61, 0x5f, 0x4c, 0x75, 0x6d, 0x70,
-0x75, 0x72, 0x20, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x4b, 0x75, 0x63, 0x68, 0x69, 0x6e, 0x67, 0x0, 0x50, 0x61, 0x63, 0x69,
-0x66, 0x69, 0x63, 0x2f, 0x50, 0x61, 0x67, 0x6f, 0x5f, 0x50, 0x61, 0x67, 0x6f, 0x0, 0x41, 0x66, 0x72, 0x69, 0x63, 0x61,
-0x2f, 0x46, 0x72, 0x65, 0x65, 0x74, 0x6f, 0x77, 0x6e, 0x0, 0x41, 0x66, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x4d, 0x6f, 0x67,
-0x61, 0x64, 0x69, 0x73, 0x68, 0x75, 0x0, 0x41, 0x74, 0x6c, 0x61, 0x6e, 0x74, 0x69, 0x63, 0x2f, 0x53, 0x6f, 0x75, 0x74,
-0x68, 0x5f, 0x47, 0x65, 0x6f, 0x72, 0x67, 0x69, 0x61, 0x0, 0x45, 0x74, 0x63, 0x2f, 0x47, 0x4d, 0x54, 0x0, 0x41, 0x66,
-0x72, 0x69, 0x63, 0x61, 0x2f, 0x44, 0x6f, 0x75, 0x61, 0x6c, 0x61, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x54, 0x68, 0x69,
-0x6d, 0x70, 0x68, 0x75, 0x0, 0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f, 0x41, 0x6d, 0x73, 0x74, 0x65, 0x72, 0x64, 0x61,
-0x6d, 0x0, 0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f, 0x52, 0x69, 0x67, 0x61, 0x0, 0x49, 0x6e, 0x64, 0x69, 0x61, 0x6e,
-0x2f, 0x43, 0x6f, 0x6d, 0x6f, 0x72, 0x6f, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x4e, 0x6f, 0x76, 0x6f, 0x73, 0x69, 0x62,
-0x69, 0x72, 0x73, 0x6b, 0x20, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x4f, 0x6d, 0x73, 0x6b, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f,
-0x56, 0x69, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6e, 0x65, 0x0, 0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f, 0x50, 0x6f, 0x64,
-0x67, 0x6f, 0x72, 0x69, 0x63, 0x61, 0x0, 0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f, 0x53, 0x6f, 0x66, 0x69, 0x61, 0x0,
-0x41, 0x74, 0x6c, 0x61, 0x6e, 0x74, 0x69, 0x63, 0x2f, 0x41, 0x7a, 0x6f, 0x72, 0x65, 0x73, 0x0, 0x50, 0x61, 0x63, 0x69,
-0x66, 0x69, 0x63, 0x2f, 0x4e, 0x61, 0x75, 0x72, 0x75, 0x0, 0x41, 0x66, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x4d, 0x61, 0x70,
-0x75, 0x74, 0x6f, 0x0, 0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f, 0x42, 0x65, 0x72, 0x6c, 0x69, 0x6e, 0x20, 0x45, 0x75,
-0x72, 0x6f, 0x70, 0x65, 0x2f, 0x42, 0x75, 0x73, 0x69, 0x6e, 0x67, 0x65, 0x6e, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63,
-0x61, 0x2f, 0x4b, 0x72, 0x61, 0x6c, 0x65, 0x6e, 0x64, 0x69, 0x6a, 0x6b, 0x0, 0x50, 0x61, 0x63, 0x69, 0x66, 0x69, 0x63,
-0x2f, 0x4e, 0x6f, 0x75, 0x6d, 0x65, 0x61, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x54, 0x65, 0x68, 0x72, 0x61, 0x6e, 0x0,
-0x41, 0x73, 0x69, 0x61, 0x2f, 0x44, 0x68, 0x61, 0x6b, 0x61, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x4c,
-0x6f, 0x73, 0x5f, 0x41, 0x6e, 0x67, 0x65, 0x6c, 0x65, 0x73, 0x0, 0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f, 0x4d, 0x6f,
-0x6e, 0x61, 0x63, 0x6f, 0x0, 0x49, 0x6e, 0x64, 0x69, 0x61, 0x6e, 0x2f, 0x41, 0x6e, 0x74, 0x61, 0x6e, 0x61, 0x6e, 0x61,
-0x72, 0x69, 0x76, 0x6f, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x49, 0x72, 0x6b, 0x75, 0x74, 0x73, 0x6b, 0x0, 0x41, 0x6e,
-0x74, 0x61, 0x72, 0x63, 0x74, 0x69, 0x63, 0x61, 0x2f, 0x56, 0x6f, 0x73, 0x74, 0x6f, 0x6b, 0x0, 0x45, 0x75, 0x72, 0x6f,
-0x70, 0x65, 0x2f, 0x54, 0x69, 0x72, 0x61, 0x6e, 0x65, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x47, 0x72,
-0x65, 0x6e, 0x61, 0x64, 0x61, 0x0, 0x45, 0x74, 0x63, 0x2f, 0x47, 0x4d, 0x54, 0x2d, 0x37, 0x0, 0x45, 0x75, 0x72, 0x6f,
-0x70, 0x65, 0x2f, 0x4c, 0x69, 0x73, 0x62, 0x6f, 0x6e, 0x20, 0x41, 0x74, 0x6c, 0x61, 0x6e, 0x74, 0x69, 0x63, 0x2f, 0x4d,
-0x61, 0x64, 0x65, 0x69, 0x72, 0x61, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x54, 0x61, 0x73, 0x68, 0x6b, 0x65, 0x6e, 0x74,
-0x20, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x53, 0x61, 0x6d, 0x61, 0x72, 0x6b, 0x61, 0x6e, 0x64, 0x0, 0x41, 0x6d, 0x65, 0x72,
-0x69, 0x63, 0x61, 0x2f, 0x4f, 0x6a, 0x69, 0x6e, 0x61, 0x67, 0x61, 0x0, 0x41, 0x66, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x42,
-0x6c, 0x61, 0x6e, 0x74, 0x79, 0x72, 0x65, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x4a, 0x61, 0x6d, 0x61,
-0x69, 0x63, 0x61, 0x0, 0x41, 0x66, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x43, 0x6f, 0x6e, 0x61, 0x6b, 0x72, 0x79, 0x0, 0x41,
-0x66, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x4b, 0x69, 0x6e, 0x73, 0x68, 0x61, 0x73, 0x61, 0x0, 0x50, 0x61, 0x63, 0x69, 0x66,
-0x69, 0x63, 0x2f, 0x4a, 0x6f, 0x68, 0x6e, 0x73, 0x74, 0x6f, 0x6e, 0x0, 0x41, 0x6e, 0x74, 0x61, 0x72, 0x63, 0x74, 0x69,
-0x63, 0x61, 0x2f, 0x52, 0x6f, 0x74, 0x68, 0x65, 0x72, 0x61, 0x0, 0x50, 0x61, 0x63, 0x69, 0x66, 0x69, 0x63, 0x2f, 0x57,
-0x61, 0x6c, 0x6c, 0x69, 0x73, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x53, 0x61, 0x69, 0x67, 0x6f, 0x6e, 0x0, 0x41, 0x66,
-0x72, 0x69, 0x63, 0x61, 0x2f, 0x43, 0x61, 0x69, 0x72, 0x6f, 0x0, 0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f, 0x52, 0x6f,
-0x6d, 0x65, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x4c, 0x6f, 0x77, 0x65, 0x72, 0x5f, 0x50, 0x72, 0x69,
-0x6e, 0x63, 0x65, 0x73, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x52, 0x61, 0x6e, 0x67, 0x6f, 0x6f, 0x6e, 0x0, 0x41, 0x6d,
-0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x50, 0x61, 0x6e, 0x61, 0x6d, 0x61, 0x0, 0x41, 0x66, 0x72, 0x69, 0x63, 0x61, 0x2f,
-0x45, 0x6c, 0x5f, 0x41, 0x61, 0x69, 0x75, 0x6e, 0x0, 0x50, 0x61, 0x63, 0x69, 0x66, 0x69, 0x63, 0x2f, 0x47, 0x75, 0x61,
-0x64, 0x61, 0x6c, 0x63, 0x61, 0x6e, 0x61, 0x6c, 0x0, 0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f, 0x4b, 0x61, 0x6c, 0x69,
-0x6e, 0x69, 0x6e, 0x67, 0x72, 0x61, 0x64, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x41, 0x6d, 0x6d, 0x61, 0x6e, 0x0, 0x45,
-0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f, 0x42, 0x75, 0x63, 0x68, 0x61, 0x72, 0x65, 0x73, 0x74, 0x0, 0x41, 0x66, 0x72, 0x69,
-0x63, 0x61, 0x2f, 0x42, 0x69, 0x73, 0x73, 0x61, 0x75, 0x0, 0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f, 0x53, 0x61, 0x6e,
-0x5f, 0x4d, 0x61, 0x72, 0x69, 0x6e, 0x6f, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x44, 0x75, 0x73, 0x68, 0x61, 0x6e, 0x62,
-0x65, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x4b, 0x61, 0x6d, 0x63, 0x68, 0x61, 0x74, 0x6b, 0x61, 0x20, 0x41, 0x73, 0x69,
-0x61, 0x2f, 0x41, 0x6e, 0x61, 0x64, 0x79, 0x72, 0x0, 0x41, 0x66, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x4c, 0x61, 0x67, 0x6f,
-0x73, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x43, 0x75, 0x72, 0x61, 0x63, 0x61, 0x6f, 0x0, 0x41, 0x6d,
-0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x43, 0x68, 0x69, 0x68, 0x75, 0x61, 0x68, 0x75, 0x61, 0x20, 0x41, 0x6d, 0x65, 0x72,
-0x69, 0x63, 0x61, 0x2f, 0x4d, 0x61, 0x7a, 0x61, 0x74, 0x6c, 0x61, 0x6e, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x4d, 0x75,
-0x73, 0x63, 0x61, 0x74, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x4c, 0x69, 0x6d, 0x61, 0x0, 0x45, 0x75,
-0x72, 0x6f, 0x70, 0x65, 0x2f, 0x5a, 0x75, 0x72, 0x69, 0x63, 0x68, 0x0, 0x41, 0x74, 0x6c, 0x61, 0x6e, 0x74, 0x69, 0x63,
-0x2f, 0x52, 0x65, 0x79, 0x6b, 0x6a, 0x61, 0x76, 0x69, 0x6b, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x43,
-0x61, 0x6e, 0x63, 0x75, 0x6e, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x44, 0x65, 0x6e, 0x76, 0x65, 0x72,
-0x20, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x42, 0x6f, 0x69, 0x73, 0x65, 0x0, 0x41, 0x6e, 0x74, 0x61, 0x72,
-0x63, 0x74, 0x69, 0x63, 0x61, 0x2f, 0x43, 0x61, 0x73, 0x65, 0x79, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f,
-0x4d, 0x61, 0x6e, 0x61, 0x75, 0x73, 0x20, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x42, 0x6f, 0x61, 0x5f, 0x56,
-0x69, 0x73, 0x74, 0x61, 0x20, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x50, 0x6f, 0x72, 0x74, 0x6f, 0x5f, 0x56,
-0x65, 0x6c, 0x68, 0x6f, 0x0, 0x41, 0x66, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x50, 0x6f, 0x72, 0x74, 0x6f, 0x2d, 0x4e, 0x6f,
-0x76, 0x6f, 0x0, 0x50, 0x61, 0x63, 0x69, 0x66, 0x69, 0x63, 0x2f, 0x45, 0x61, 0x73, 0x74, 0x65, 0x72, 0x0, 0x45, 0x74,
-0x63, 0x2f, 0x47, 0x4d, 0x54, 0x2d, 0x31, 0x30, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x53, 0x74, 0x5f,
-0x4c, 0x75, 0x63, 0x69, 0x61, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x4d, 0x61, 0x63, 0x61, 0x75, 0x0, 0x41, 0x66, 0x72,
-0x69, 0x63, 0x61, 0x2f, 0x4d, 0x61, 0x6c, 0x61, 0x62, 0x6f, 0x0, 0x50, 0x61, 0x63, 0x69, 0x66, 0x69, 0x63, 0x2f, 0x52,
-0x61, 0x72, 0x6f, 0x74, 0x6f, 0x6e, 0x67, 0x61, 0x0, 0x41, 0x66, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x42, 0x61, 0x6e, 0x6a,
-0x75, 0x6c, 0x0, 0x45, 0x74, 0x63, 0x2f, 0x47, 0x4d, 0x54, 0x2d, 0x31, 0x34, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x4d,
-0x61, 0x67, 0x61, 0x64, 0x61, 0x6e, 0x0, 0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f, 0x42, 0x72, 0x61, 0x74, 0x69, 0x73,
-0x6c, 0x61, 0x76, 0x61, 0x0, 0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f, 0x41, 0x6e, 0x64, 0x6f, 0x72, 0x72, 0x61, 0x0,
-0x41, 0x73, 0x69, 0x61, 0x2f, 0x42, 0x61, 0x6e, 0x67, 0x6b, 0x6f, 0x6b, 0x0, 0x45, 0x74, 0x63, 0x2f, 0x47, 0x4d, 0x54,
-0x2d, 0x35, 0x0, 0x50, 0x61, 0x63, 0x69, 0x66, 0x69, 0x63, 0x2f, 0x42, 0x6f, 0x75, 0x67, 0x61, 0x69, 0x6e, 0x76, 0x69,
-0x6c, 0x6c, 0x65, 0x0, 0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f, 0x56, 0x61, 0x74, 0x69, 0x63, 0x61, 0x6e, 0x0, 0x41,
-0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x45, 0x64, 0x6d, 0x6f, 0x6e, 0x74, 0x6f, 0x6e, 0x20, 0x41, 0x6d, 0x65, 0x72,
-0x69, 0x63, 0x61, 0x2f, 0x43, 0x61, 0x6d, 0x62, 0x72, 0x69, 0x64, 0x67, 0x65, 0x5f, 0x42, 0x61, 0x79, 0x20, 0x41, 0x6d,
-0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x49, 0x6e, 0x75, 0x76, 0x69, 0x6b, 0x20, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61,
-0x2f, 0x59, 0x65, 0x6c, 0x6c, 0x6f, 0x77, 0x6b, 0x6e, 0x69, 0x66, 0x65, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61,
-0x2f, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x61, 0x72, 0x69, 0x62, 0x6f, 0x0, 0x41, 0x75, 0x73, 0x74, 0x72, 0x61, 0x6c, 0x69,
-0x61, 0x2f, 0x53, 0x79, 0x64, 0x6e, 0x65, 0x79, 0x20, 0x41, 0x75, 0x73, 0x74, 0x72, 0x61, 0x6c, 0x69, 0x61, 0x2f, 0x4d,
-0x65, 0x6c, 0x62, 0x6f, 0x75, 0x72, 0x6e, 0x65, 0x0, 0x41, 0x66, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x44, 0x61, 0x72, 0x5f,
-0x65, 0x73, 0x5f, 0x53, 0x61, 0x6c, 0x61, 0x61, 0x6d, 0x0, 0x4d, 0x53, 0x54, 0x37, 0x4d, 0x44, 0x54, 0x0, 0x41, 0x66,
-0x72, 0x69, 0x63, 0x61, 0x2f, 0x4d, 0x61, 0x73, 0x65, 0x72, 0x75, 0x0, 0x50, 0x61, 0x63, 0x69, 0x66, 0x69, 0x63, 0x2f,
-0x4d, 0x61, 0x6a, 0x75, 0x72, 0x6f, 0x20, 0x50, 0x61, 0x63, 0x69, 0x66, 0x69, 0x63, 0x2f, 0x4b, 0x77, 0x61, 0x6a, 0x61,
-0x6c, 0x65, 0x69, 0x6e, 0x0, 0x41, 0x66, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x4e, 0x61, 0x69, 0x72, 0x6f, 0x62, 0x69, 0x0,
-0x41, 0x73, 0x69, 0x61, 0x2f, 0x41, 0x73, 0x68, 0x67, 0x61, 0x62, 0x61, 0x74, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x48,
-0x6f, 0x6e, 0x67, 0x5f, 0x4b, 0x6f, 0x6e, 0x67, 0x0, 0x45, 0x74, 0x63, 0x2f, 0x47, 0x4d, 0x54, 0x2d, 0x33, 0x0, 0x41,
-0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x42, 0x65, 0x6c, 0x69, 0x7a, 0x65, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63,
-0x61, 0x2f, 0x53, 0x61, 0x6f, 0x5f, 0x50, 0x61, 0x75, 0x6c, 0x6f, 0x0, 0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f, 0x4d,
-0x61, 0x64, 0x72, 0x69, 0x64, 0x20, 0x41, 0x66, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x43, 0x65, 0x75, 0x74, 0x61, 0x0, 0x41,
-0x73, 0x69, 0x61, 0x2f, 0x4a, 0x61, 0x6b, 0x61, 0x72, 0x74, 0x61, 0x20, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x50, 0x6f, 0x6e,
-0x74, 0x69, 0x61, 0x6e, 0x61, 0x6b, 0x0, 0x45, 0x74, 0x63, 0x2f, 0x47, 0x4d, 0x54, 0x2d, 0x39, 0x0, 0x41, 0x6d, 0x65,
-0x72, 0x69, 0x63, 0x61, 0x2f, 0x41, 0x6e, 0x63, 0x68, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x20, 0x41, 0x6d, 0x65, 0x72, 0x69,
-0x63, 0x61, 0x2f, 0x4a, 0x75, 0x6e, 0x65, 0x61, 0x75, 0x20, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x4d, 0x65,
-0x74, 0x6c, 0x61, 0x6b, 0x61, 0x74, 0x6c, 0x61, 0x20, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x4e, 0x6f, 0x6d,
-0x65, 0x20, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x53, 0x69, 0x74, 0x6b, 0x61, 0x20, 0x41, 0x6d, 0x65, 0x72,
-0x69, 0x63, 0x61, 0x2f, 0x59, 0x61, 0x6b, 0x75, 0x74, 0x61, 0x74, 0x0, 0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f, 0x43,
-0x6f, 0x70, 0x65, 0x6e, 0x68, 0x61, 0x67, 0x65, 0x6e, 0x0, 0x41, 0x6e, 0x74, 0x61, 0x72, 0x63, 0x74, 0x69, 0x63, 0x61,
-0x2f, 0x4d, 0x63, 0x4d, 0x75, 0x72, 0x64, 0x6f, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x51, 0x61, 0x74, 0x61, 0x72, 0x0,
-0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x4d, 0x61, 0x72, 0x69, 0x67, 0x6f, 0x74, 0x0, 0x41, 0x6d, 0x65, 0x72,
-0x69, 0x63, 0x61, 0x2f, 0x42, 0x61, 0x72, 0x62, 0x61, 0x64, 0x6f, 0x73, 0x0, 0x50, 0x61, 0x63, 0x69, 0x66, 0x69, 0x63,
-0x2f, 0x57, 0x61, 0x6b, 0x65, 0x0, 0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f, 0x48, 0x65, 0x6c, 0x73, 0x69, 0x6e, 0x6b,
-0x69, 0x0, 0x49, 0x6e, 0x64, 0x69, 0x61, 0x6e, 0x2f, 0x4d, 0x61, 0x79, 0x6f, 0x74, 0x74, 0x65, 0x0, 0x41, 0x74, 0x6c,
-0x61, 0x6e, 0x74, 0x69, 0x63, 0x2f, 0x46, 0x61, 0x65, 0x72, 0x6f, 0x65, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61,
-0x2f, 0x43, 0x6f, 0x72, 0x61, 0x6c, 0x5f, 0x48, 0x61, 0x72, 0x62, 0x6f, 0x75, 0x72, 0x0, 0x45, 0x74, 0x63, 0x2f, 0x47,
-0x4d, 0x54, 0x2b, 0x31, 0x30, 0x0, 0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f, 0x53, 0x61, 0x72, 0x61, 0x6a, 0x65, 0x76,
-0x6f, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x54, 0x62, 0x69, 0x6c, 0x69, 0x73, 0x69, 0x0, 0x45, 0x74, 0x63, 0x2f, 0x47,
-0x4d, 0x54, 0x2b, 0x31, 0x31, 0x0, 0x41, 0x6e, 0x74, 0x61, 0x72, 0x63, 0x74, 0x69, 0x63, 0x61, 0x2f, 0x4d, 0x61, 0x63,
-0x71, 0x75, 0x61, 0x72, 0x69, 0x65, 0x0, 0x50, 0x61, 0x63, 0x69, 0x66, 0x69, 0x63, 0x2f, 0x50, 0x6f, 0x72, 0x74, 0x5f,
-0x4d, 0x6f, 0x72, 0x65, 0x73, 0x62, 0x79, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x41, 0x73, 0x75, 0x6e,
-0x63, 0x69, 0x6f, 0x6e, 0x0, 0x50, 0x61, 0x63, 0x69, 0x66, 0x69, 0x63, 0x2f, 0x54, 0x61, 0x68, 0x69, 0x74, 0x69, 0x0,
-0x41, 0x66, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x4c, 0x6f, 0x6d, 0x65, 0x0, 0x41, 0x74, 0x6c, 0x61, 0x6e, 0x74, 0x69, 0x63,
-0x2f, 0x43, 0x61, 0x6e, 0x61, 0x72, 0x79, 0x0, 0x41, 0x66, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x4a, 0x6f, 0x68, 0x61, 0x6e,
-0x6e, 0x65, 0x73, 0x62, 0x75, 0x72, 0x67, 0x0, 0x41, 0x75, 0x73, 0x74, 0x72, 0x61, 0x6c, 0x69, 0x61, 0x2f, 0x41, 0x64,
-0x65, 0x6c, 0x61, 0x69, 0x64, 0x65, 0x20, 0x41, 0x75, 0x73, 0x74, 0x72, 0x61, 0x6c, 0x69, 0x61, 0x2f, 0x42, 0x72, 0x6f,
-0x6b, 0x65, 0x6e, 0x5f, 0x48, 0x69, 0x6c, 0x6c, 0x0, 0x50, 0x61, 0x63, 0x69, 0x66, 0x69, 0x63, 0x2f, 0x53, 0x61, 0x69,
-0x70, 0x61, 0x6e, 0x0, 0x41, 0x74, 0x6c, 0x61, 0x6e, 0x74, 0x69, 0x63, 0x2f, 0x53, 0x74, 0x61, 0x6e, 0x6c, 0x65, 0x79,
-0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x4e, 0x69, 0x63, 0x6f, 0x73, 0x69, 0x61, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x44,
-0x75, 0x62, 0x61, 0x69, 0x0, 0x49, 0x6e, 0x64, 0x69, 0x61, 0x6e, 0x2f, 0x4b, 0x65, 0x72, 0x67, 0x75, 0x65, 0x6c, 0x65,
-0x6e, 0x0, 0x41, 0x66, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x4e, 0x64, 0x6a, 0x61, 0x6d, 0x65, 0x6e, 0x61, 0x0, 0x45, 0x75,
-0x72, 0x6f, 0x70, 0x65, 0x2f, 0x53, 0x6b, 0x6f, 0x70, 0x6a, 0x65, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x41, 0x64, 0x65,
-0x6e, 0x0, 0x50, 0x61, 0x63, 0x69, 0x66, 0x69, 0x63, 0x2f, 0x41, 0x70, 0x69, 0x61, 0x0, 0x50, 0x61, 0x63, 0x69, 0x66,
-0x69, 0x63, 0x2f, 0x48, 0x6f, 0x6e, 0x6f, 0x6c, 0x75, 0x6c, 0x75, 0x0, 0x45, 0x74, 0x63, 0x2f, 0x47, 0x4d, 0x54, 0x2b,
-0x31, 0x32, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x48, 0x65, 0x72, 0x6d, 0x6f, 0x73, 0x69, 0x6c, 0x6c,
-0x6f, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x53, 0x74, 0x5f, 0x4a, 0x6f, 0x68, 0x6e, 0x73, 0x0, 0x50,
-0x61, 0x63, 0x69, 0x66, 0x69, 0x63, 0x2f, 0x41, 0x75, 0x63, 0x6b, 0x6c, 0x61, 0x6e, 0x64, 0x0, 0x45, 0x75, 0x72, 0x6f,
-0x70, 0x65, 0x2f, 0x4d, 0x6f, 0x73, 0x63, 0x6f, 0x77, 0x20, 0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f, 0x53, 0x69, 0x6d,
-0x66, 0x65, 0x72, 0x6f, 0x70, 0x6f, 0x6c, 0x20, 0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f, 0x56, 0x6f, 0x6c, 0x67, 0x6f,
-0x67, 0x72, 0x61, 0x64, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x53, 0x69, 0x6e, 0x67, 0x61, 0x70, 0x6f, 0x72, 0x65, 0x0,
-0x41, 0x73, 0x69, 0x61, 0x2f, 0x4b, 0x61, 0x62, 0x75, 0x6c, 0x0, 0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f, 0x4d, 0x61,
-0x6c, 0x74, 0x61, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x41, 0x72, 0x75, 0x62, 0x61, 0x0, 0x41, 0x6d,
-0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x4d, 0x65, 0x78, 0x69, 0x63, 0x6f, 0x5f, 0x43, 0x69, 0x74, 0x79, 0x20, 0x41, 0x6d,
-0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x42, 0x61, 0x68, 0x69, 0x61, 0x5f, 0x42, 0x61, 0x6e, 0x64, 0x65, 0x72, 0x61, 0x73,
-0x20, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x4d, 0x65, 0x72, 0x69, 0x64, 0x61, 0x20, 0x41, 0x6d, 0x65, 0x72,
-0x69, 0x63, 0x61, 0x2f, 0x4d, 0x6f, 0x6e, 0x74, 0x65, 0x72, 0x72, 0x65, 0x79, 0x0, 0x45, 0x75, 0x72, 0x6f, 0x70, 0x65,
-0x2f, 0x49, 0x73, 0x6c, 0x65, 0x5f, 0x6f, 0x66, 0x5f, 0x4d, 0x61, 0x6e, 0x0, 0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f,
-0x56, 0x61, 0x64, 0x75, 0x7a, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x46, 0x6f, 0x72, 0x74, 0x61, 0x6c,
-0x65, 0x7a, 0x61, 0x20, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x41, 0x72, 0x61, 0x67, 0x75, 0x61, 0x69, 0x6e,
-0x61, 0x20, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x42, 0x65, 0x6c, 0x65, 0x6d, 0x20, 0x41, 0x6d, 0x65, 0x72,
-0x69, 0x63, 0x61, 0x2f, 0x4d, 0x61, 0x63, 0x65, 0x69, 0x6f, 0x20, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x52,
-0x65, 0x63, 0x69, 0x66, 0x65, 0x20, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x53, 0x61, 0x6e, 0x74, 0x61, 0x72,
-0x65, 0x6d, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x53, 0x65, 0x6f, 0x75, 0x6c, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63,
-0x61, 0x2f, 0x47, 0x75, 0x61, 0x64, 0x65, 0x6c, 0x6f, 0x75, 0x70, 0x65, 0x0, 0x45, 0x74, 0x63, 0x2f, 0x47, 0x4d, 0x54,
-0x2b, 0x32, 0x0, 0x49, 0x6e, 0x64, 0x69, 0x61, 0x6e, 0x2f, 0x43, 0x6f, 0x63, 0x6f, 0x73, 0x0, 0x41, 0x72, 0x63, 0x74,
-0x69, 0x63, 0x2f, 0x4c, 0x6f, 0x6e, 0x67, 0x79, 0x65, 0x61, 0x72, 0x62, 0x79, 0x65, 0x6e, 0x0, 0x41, 0x66, 0x72, 0x69,
-0x63, 0x61, 0x2f, 0x41, 0x64, 0x64, 0x69, 0x73, 0x5f, 0x41, 0x62, 0x61, 0x62, 0x61, 0x0, 0x45, 0x75, 0x72, 0x6f, 0x70,
-0x65, 0x2f, 0x53, 0x61, 0x6d, 0x61, 0x72, 0x61, 0x0, 0x41, 0x66, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x48, 0x61, 0x72, 0x61,
-0x72, 0x65, 0x0, 0x41, 0x75, 0x73, 0x74, 0x72, 0x61, 0x6c, 0x69, 0x61, 0x2f, 0x50, 0x65, 0x72, 0x74, 0x68, 0x0, 0x45,
-0x74, 0x63, 0x2f, 0x47, 0x4d, 0x54, 0x2d, 0x31, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x48, 0x61, 0x76,
-0x61, 0x6e, 0x61, 0x0, 0x41, 0x66, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x43, 0x61, 0x73, 0x61, 0x62, 0x6c, 0x61, 0x6e, 0x63,
-0x61, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x59, 0x65, 0x72, 0x65, 0x76, 0x61, 0x6e, 0x0, 0x41, 0x74, 0x6c, 0x61, 0x6e,
-0x74, 0x69, 0x63, 0x2f, 0x42, 0x65, 0x72, 0x6d, 0x75, 0x64, 0x61, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x54, 0x61, 0x69,
-0x70, 0x65, 0x69, 0x0, 0x45, 0x74, 0x63, 0x2f, 0x47, 0x4d, 0x54, 0x2d, 0x36, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63,
-0x61, 0x2f, 0x47, 0x6f, 0x64, 0x74, 0x68, 0x61, 0x62, 0x0, 0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f, 0x57, 0x61, 0x72,
-0x73, 0x61, 0x77, 0x0, 0x50, 0x61, 0x63, 0x69, 0x66, 0x69, 0x63, 0x2f, 0x54, 0x6f, 0x6e, 0x67, 0x61, 0x74, 0x61, 0x70,
-0x75, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x41, 0x6c, 0x6d, 0x61, 0x74, 0x79, 0x20, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x51,
-0x79, 0x7a, 0x79, 0x6c, 0x6f, 0x72, 0x64, 0x61, 0x0, 0x41, 0x6e, 0x74, 0x61, 0x72, 0x63, 0x74, 0x69, 0x63, 0x61, 0x2f,
-0x44, 0x61, 0x76, 0x69, 0x73, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x42, 0x65, 0x69, 0x72, 0x75, 0x74, 0x0, 0x41, 0x6d,
-0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x47, 0x75, 0x61, 0x74, 0x65, 0x6d, 0x61, 0x6c, 0x61, 0x0, 0x41, 0x73, 0x69, 0x61,
-0x2f, 0x4b, 0x61, 0x72, 0x61, 0x63, 0x68, 0x69, 0x0, 0x41, 0x66, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x41, 0x63, 0x63, 0x72,
-0x61, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x50, 0x75, 0x65, 0x72, 0x74, 0x6f, 0x5f, 0x52, 0x69, 0x63,
-0x6f, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x4c, 0x61, 0x5f, 0x50, 0x61, 0x7a, 0x0, 0x41, 0x6d, 0x65,
-0x72, 0x69, 0x63, 0x61, 0x2f, 0x4e, 0x65, 0x77, 0x5f, 0x59, 0x6f, 0x72, 0x6b, 0x20, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63,
-0x61, 0x2f, 0x44, 0x65, 0x74, 0x72, 0x6f, 0x69, 0x74, 0x20, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x49, 0x6e,
-0x64, 0x69, 0x61, 0x6e, 0x61, 0x2f, 0x50, 0x65, 0x74, 0x65, 0x72, 0x73, 0x62, 0x75, 0x72, 0x67, 0x20, 0x41, 0x6d, 0x65,
-0x72, 0x69, 0x63, 0x61, 0x2f, 0x49, 0x6e, 0x64, 0x69, 0x61, 0x6e, 0x61, 0x2f, 0x56, 0x69, 0x6e, 0x63, 0x65, 0x6e, 0x6e,
-0x65, 0x73, 0x20, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x49, 0x6e, 0x64, 0x69, 0x61, 0x6e, 0x61, 0x2f, 0x57,
-0x69, 0x6e, 0x61, 0x6d, 0x61, 0x63, 0x20, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x4b, 0x65, 0x6e, 0x74, 0x75,
-0x63, 0x6b, 0x79, 0x2f, 0x4d, 0x6f, 0x6e, 0x74, 0x69, 0x63, 0x65, 0x6c, 0x6c, 0x6f, 0x20, 0x41, 0x6d, 0x65, 0x72, 0x69,
-0x63, 0x61, 0x2f, 0x4c, 0x6f, 0x75, 0x69, 0x73, 0x76, 0x69, 0x6c, 0x6c, 0x65, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x44,
-0x61, 0x6d, 0x61, 0x73, 0x63, 0x75, 0x73, 0x0, 0x50, 0x61, 0x63, 0x69, 0x66, 0x69, 0x63, 0x2f, 0x54, 0x61, 0x72, 0x61,
-0x77, 0x61, 0x0, 0x45, 0x74, 0x63, 0x2f, 0x47, 0x4d, 0x54, 0x2b, 0x34, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61,
-0x2f, 0x42, 0x6f, 0x67, 0x6f, 0x74, 0x61, 0x0, 0x41, 0x74, 0x6c, 0x61, 0x6e, 0x74, 0x69, 0x63, 0x2f, 0x43, 0x61, 0x70,
-0x65, 0x5f, 0x56, 0x65, 0x72, 0x64, 0x65, 0x0, 0x41, 0x75, 0x73, 0x74, 0x72, 0x61, 0x6c, 0x69, 0x61, 0x2f, 0x44, 0x61,
-0x72, 0x77, 0x69, 0x6e, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x50, 0x79, 0x6f, 0x6e, 0x67, 0x79, 0x61, 0x6e, 0x67, 0x0,
-0x41, 0x73, 0x69, 0x61, 0x2f, 0x42, 0x61, 0x6b, 0x75, 0x0, 0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f, 0x47, 0x69, 0x62,
-0x72, 0x61, 0x6c, 0x74, 0x61, 0x72, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x4a, 0x65, 0x72, 0x75, 0x73, 0x61, 0x6c, 0x65,
-0x6d, 0x0, 0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f, 0x4c, 0x6a, 0x75, 0x62, 0x6c, 0x6a, 0x61, 0x6e, 0x61, 0x0, 0x50,
-0x61, 0x63, 0x69, 0x66, 0x69, 0x63, 0x2f, 0x4e, 0x6f, 0x72, 0x66, 0x6f, 0x6c, 0x6b, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f,
-0x42, 0x72, 0x75, 0x6e, 0x65, 0x69, 0x0, 0x41, 0x66, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x42, 0x72, 0x61, 0x7a, 0x7a, 0x61,
-0x76, 0x69, 0x6c, 0x6c, 0x65, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x4b, 0x61, 0x74, 0x6d, 0x61, 0x6e, 0x64, 0x75, 0x0,
-0x41, 0x73, 0x69, 0x61, 0x2f, 0x43, 0x61, 0x6c, 0x63, 0x75, 0x74, 0x74, 0x61, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63,
-0x61, 0x2f, 0x41, 0x6e, 0x74, 0x69, 0x67, 0x75, 0x61, 0x0, 0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f, 0x4a, 0x65, 0x72,
-0x73, 0x65, 0x79, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x4d, 0x6f, 0x6e, 0x74, 0x73, 0x65, 0x72, 0x72,
-0x61, 0x74, 0x0, 0x45, 0x74, 0x63, 0x2f, 0x47, 0x4d, 0x54, 0x2b, 0x37, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61,
-0x2f, 0x47, 0x75, 0x79, 0x61, 0x6e, 0x61, 0x0, 0x41, 0x66, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x44, 0x61, 0x6b, 0x61, 0x72,
-0x0, 0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f, 0x4f, 0x73, 0x6c, 0x6f, 0x0, 0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f,
-0x41, 0x74, 0x68, 0x65, 0x6e, 0x73, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x4b, 0x75, 0x77, 0x61, 0x69, 0x74, 0x0, 0x50,
-0x61, 0x63, 0x69, 0x66, 0x69, 0x63, 0x2f, 0x50, 0x6f, 0x6e, 0x61, 0x70, 0x65, 0x20, 0x50, 0x61, 0x63, 0x69, 0x66, 0x69,
-0x63, 0x2f, 0x4b, 0x6f, 0x73, 0x72, 0x61, 0x65, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x43, 0x6f, 0x73,
-0x74, 0x61, 0x5f, 0x52, 0x69, 0x63, 0x61, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x44, 0x6f, 0x6d, 0x69,
-0x6e, 0x69, 0x63, 0x61, 0x0, 0x41, 0x66, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x4d, 0x62, 0x61, 0x62, 0x61, 0x6e, 0x65, 0x0,
-0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x4d, 0x61, 0x72, 0x74, 0x69, 0x6e, 0x69, 0x71, 0x75, 0x65, 0x0, 0x49,
-0x6e, 0x64, 0x69, 0x61, 0x6e, 0x2f, 0x52, 0x65, 0x75, 0x6e, 0x69, 0x6f, 0x6e, 0x0, 0x45, 0x74, 0x63, 0x2f, 0x47, 0x4d,
-0x54, 0x2b, 0x36, 0x0, 0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f, 0x49, 0x73, 0x74, 0x61, 0x6e, 0x62, 0x75, 0x6c, 0x0,
-0x41, 0x73, 0x69, 0x61, 0x2f, 0x4b, 0x72, 0x61, 0x73, 0x6e, 0x6f, 0x79, 0x61, 0x72, 0x73, 0x6b, 0x20, 0x41, 0x73, 0x69,
-0x61, 0x2f, 0x4e, 0x6f, 0x76, 0x6f, 0x6b, 0x75, 0x7a, 0x6e, 0x65, 0x74, 0x73, 0x6b, 0x0, 0x41, 0x66, 0x72, 0x69, 0x63,
-0x61, 0x2f, 0x41, 0x62, 0x69, 0x64, 0x6a, 0x61, 0x6e, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x52, 0x69,
-0x6f, 0x5f, 0x42, 0x72, 0x61, 0x6e, 0x63, 0x6f, 0x20, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x45, 0x69, 0x72,
-0x75, 0x6e, 0x65, 0x70, 0x65, 0x0, 0x43, 0x53, 0x54, 0x36, 0x43, 0x44, 0x54, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63,
-0x61, 0x2f, 0x50, 0x68, 0x6f, 0x65, 0x6e, 0x69, 0x78, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x52, 0x65,
-0x67, 0x69, 0x6e, 0x61, 0x20, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x53, 0x77, 0x69, 0x66, 0x74, 0x5f, 0x43,
-0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x0, 0x45, 0x74, 0x63, 0x2f, 0x47, 0x4d, 0x54, 0x2b, 0x35, 0x0, 0x41, 0x6e, 0x74,
-0x61, 0x72, 0x63, 0x74, 0x69, 0x63, 0x61, 0x2f, 0x4d, 0x61, 0x77, 0x73, 0x6f, 0x6e, 0x0, 0x49, 0x6e, 0x64, 0x69, 0x61,
-0x6e, 0x2f, 0x4d, 0x61, 0x6c, 0x64, 0x69, 0x76, 0x65, 0x73, 0x0, 0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f, 0x42, 0x65,
-0x6c, 0x67, 0x72, 0x61, 0x64, 0x65, 0x0, 0x41, 0x66, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x41, 0x73, 0x6d, 0x65, 0x72, 0x61,
-0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x44, 0x61, 0x77, 0x73, 0x6f, 0x6e, 0x5f, 0x43, 0x72, 0x65, 0x65,
-0x6b, 0x20, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x43, 0x72, 0x65, 0x73, 0x74, 0x6f, 0x6e, 0x20, 0x41, 0x6d,
-0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x46, 0x6f, 0x72, 0x74, 0x5f, 0x4e, 0x65, 0x6c, 0x73, 0x6f, 0x6e, 0x0, 0x45, 0x75,
-0x72, 0x6f, 0x70, 0x65, 0x2f, 0x42, 0x75, 0x64, 0x61, 0x70, 0x65, 0x73, 0x74, 0x0, 0x41, 0x66, 0x72, 0x69, 0x63, 0x61,
-0x2f, 0x57, 0x69, 0x6e, 0x64, 0x68, 0x6f, 0x65, 0x6b, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x4a, 0x61, 0x79, 0x61, 0x70,
-0x75, 0x72, 0x61, 0x0, 0x41, 0x75, 0x73, 0x74, 0x72, 0x61, 0x6c, 0x69, 0x61, 0x2f, 0x42, 0x72, 0x69, 0x73, 0x62, 0x61,
-0x6e, 0x65, 0x20, 0x41, 0x75, 0x73, 0x74, 0x72, 0x61, 0x6c, 0x69, 0x61, 0x2f, 0x4c, 0x69, 0x6e, 0x64, 0x65, 0x6d, 0x61,
-0x6e, 0x0, 0x45, 0x74, 0x63, 0x2f, 0x47, 0x4d, 0x54, 0x2d, 0x34, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f,
-0x43, 0x61, 0x72, 0x61, 0x63, 0x61, 0x73, 0x0, 0x41, 0x6e, 0x74, 0x61, 0x72, 0x63, 0x74, 0x69, 0x63, 0x61, 0x2f, 0x53,
-0x79, 0x6f, 0x77, 0x61, 0x0, 0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f, 0x5a, 0x61, 0x67, 0x72, 0x65, 0x62, 0x0, 0x41,
-0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x42, 0x75, 0x65, 0x6e, 0x6f, 0x73, 0x5f, 0x41, 0x69, 0x72, 0x65, 0x73, 0x20,
-0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x41, 0x72, 0x67, 0x65, 0x6e, 0x74, 0x69, 0x6e, 0x61, 0x2f, 0x4c, 0x61,
-0x5f, 0x52, 0x69, 0x6f, 0x6a, 0x61, 0x20, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x41, 0x72, 0x67, 0x65, 0x6e,
-0x74, 0x69, 0x6e, 0x61, 0x2f, 0x52, 0x69, 0x6f, 0x5f, 0x47, 0x61, 0x6c, 0x6c, 0x65, 0x67, 0x6f, 0x73, 0x20, 0x41, 0x6d,
-0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x41, 0x72, 0x67, 0x65, 0x6e, 0x74, 0x69, 0x6e, 0x61, 0x2f, 0x53, 0x61, 0x6c, 0x74,
-0x61, 0x20, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x41, 0x72, 0x67, 0x65, 0x6e, 0x74, 0x69, 0x6e, 0x61, 0x2f,
-0x53, 0x61, 0x6e, 0x5f, 0x4a, 0x75, 0x61, 0x6e, 0x20, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x41, 0x72, 0x67,
-0x65, 0x6e, 0x74, 0x69, 0x6e, 0x61, 0x2f, 0x53, 0x61, 0x6e, 0x5f, 0x4c, 0x75, 0x69, 0x73, 0x20, 0x41, 0x6d, 0x65, 0x72,
-0x69, 0x63, 0x61, 0x2f, 0x41, 0x72, 0x67, 0x65, 0x6e, 0x74, 0x69, 0x6e, 0x61, 0x2f, 0x54, 0x75, 0x63, 0x75, 0x6d, 0x61,
-0x6e, 0x20, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x41, 0x72, 0x67, 0x65, 0x6e, 0x74, 0x69, 0x6e, 0x61, 0x2f,
-0x55, 0x73, 0x68, 0x75, 0x61, 0x69, 0x61, 0x20, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x43, 0x61, 0x74, 0x61,
-0x6d, 0x61, 0x72, 0x63, 0x61, 0x20, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x43, 0x6f, 0x72, 0x64, 0x6f, 0x62,
-0x61, 0x20, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x4a, 0x75, 0x6a, 0x75, 0x79, 0x20, 0x41, 0x6d, 0x65, 0x72,
-0x69, 0x63, 0x61, 0x2f, 0x4d, 0x65, 0x6e, 0x64, 0x6f, 0x7a, 0x61, 0x0, 0x41, 0x6e, 0x74, 0x61, 0x72, 0x63, 0x74, 0x69,
-0x63, 0x61, 0x2f, 0x50, 0x61, 0x6c, 0x6d, 0x65, 0x72, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x54, 0x6f,
-0x72, 0x6f, 0x6e, 0x74, 0x6f, 0x20, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x49, 0x71, 0x61, 0x6c, 0x75, 0x69,
-0x74, 0x20, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x4d, 0x6f, 0x6e, 0x74, 0x72, 0x65, 0x61, 0x6c, 0x20, 0x41,
-0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x4e, 0x69, 0x70, 0x69, 0x67, 0x6f, 0x6e, 0x20, 0x41, 0x6d, 0x65, 0x72, 0x69,
-0x63, 0x61, 0x2f, 0x50, 0x61, 0x6e, 0x67, 0x6e, 0x69, 0x72, 0x74, 0x75, 0x6e, 0x67, 0x20, 0x41, 0x6d, 0x65, 0x72, 0x69,
-0x63, 0x61, 0x2f, 0x54, 0x68, 0x75, 0x6e, 0x64, 0x65, 0x72, 0x5f, 0x42, 0x61, 0x79, 0x0, 0x41, 0x66, 0x72, 0x69, 0x63,
-0x61, 0x2f, 0x42, 0x61, 0x6d, 0x61, 0x6b, 0x6f, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x52, 0x69, 0x79, 0x61, 0x64, 0x68,
-0x0, 0x50, 0x61, 0x63, 0x69, 0x66, 0x69, 0x63, 0x2f, 0x54, 0x72, 0x75, 0x6b, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x54,
-0x6f, 0x6b, 0x79, 0x6f, 0x0, 0x50, 0x61, 0x63, 0x69, 0x66, 0x69, 0x63, 0x2f, 0x45, 0x6e, 0x64, 0x65, 0x72, 0x62, 0x75,
-0x72, 0x79, 0x0, 0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f, 0x4c, 0x6f, 0x6e, 0x64, 0x6f, 0x6e, 0x0, 0x41, 0x6d, 0x65,
-0x72, 0x69, 0x63, 0x61, 0x2f, 0x49, 0x6e, 0x64, 0x69, 0x61, 0x6e, 0x61, 0x70, 0x6f, 0x6c, 0x69, 0x73, 0x20, 0x41, 0x6d,
-0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x49, 0x6e, 0x64, 0x69, 0x61, 0x6e, 0x61, 0x2f, 0x4d, 0x61, 0x72, 0x65, 0x6e, 0x67,
-0x6f, 0x20, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x49, 0x6e, 0x64, 0x69, 0x61, 0x6e, 0x61, 0x2f, 0x56, 0x65,
-0x76, 0x61, 0x79, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x43, 0x6f, 0x6c, 0x6f, 0x6d, 0x62, 0x6f, 0x0, 0x41, 0x6d, 0x65,
-0x72, 0x69, 0x63, 0x61, 0x2f, 0x57, 0x69, 0x6e, 0x6e, 0x69, 0x70, 0x65, 0x67, 0x20, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63,
-0x61, 0x2f, 0x52, 0x61, 0x69, 0x6e, 0x79, 0x5f, 0x52, 0x69, 0x76, 0x65, 0x72, 0x20, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63,
-0x61, 0x2f, 0x52, 0x61, 0x6e, 0x6b, 0x69, 0x6e, 0x5f, 0x49, 0x6e, 0x6c, 0x65, 0x74, 0x20, 0x41, 0x6d, 0x65, 0x72, 0x69,
-0x63, 0x61, 0x2f, 0x52, 0x65, 0x73, 0x6f, 0x6c, 0x75, 0x74, 0x65, 0x0, 0x41, 0x66, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x44,
-0x6a, 0x69, 0x62, 0x6f, 0x75, 0x74, 0x69, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x48, 0x61, 0x6c, 0x69,
-0x66, 0x61, 0x78, 0x20, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x47, 0x6c, 0x61, 0x63, 0x65, 0x5f, 0x42, 0x61,
-0x79, 0x20, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x47, 0x6f, 0x6f, 0x73, 0x65, 0x5f, 0x42, 0x61, 0x79, 0x20,
-0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x4d, 0x6f, 0x6e, 0x63, 0x74, 0x6f, 0x6e, 0x0, 0x41, 0x66, 0x72, 0x69,
-0x63, 0x61, 0x2f, 0x53, 0x61, 0x6f, 0x5f, 0x54, 0x6f, 0x6d, 0x65, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f,
-0x53, 0x74, 0x5f, 0x54, 0x68, 0x6f, 0x6d, 0x61, 0x73, 0x0, 0x41, 0x66, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x4c, 0x75, 0x73,
-0x61, 0x6b, 0x61, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x50, 0x6f, 0x72, 0x74, 0x2d, 0x61, 0x75, 0x2d,
-0x50, 0x72, 0x69, 0x6e, 0x63, 0x65, 0x0, 0x41, 0x66, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x4e, 0x69, 0x61, 0x6d, 0x65, 0x79,
-0x0, 0x45, 0x74, 0x63, 0x2f, 0x47, 0x4d, 0x54, 0x2b, 0x33, 0x0, 0x41, 0x66, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x41, 0x6c,
-0x67, 0x69, 0x65, 0x72, 0x73, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x47, 0x75, 0x61, 0x79, 0x61, 0x71,
-0x75, 0x69, 0x6c, 0x0, 0x49, 0x6e, 0x64, 0x69, 0x61, 0x6e, 0x2f, 0x43, 0x68, 0x61, 0x67, 0x6f, 0x73, 0x0, 0x41, 0x73,
-0x69, 0x61, 0x2f, 0x53, 0x68, 0x61, 0x6e, 0x67, 0x68, 0x61, 0x69, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f,
-0x43, 0x75, 0x69, 0x61, 0x62, 0x61, 0x20, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x43, 0x61, 0x6d, 0x70, 0x6f,
-0x5f, 0x47, 0x72, 0x61, 0x6e, 0x64, 0x65, 0x0, 0x50, 0x61, 0x63, 0x69, 0x66, 0x69, 0x63, 0x2f, 0x4d, 0x69, 0x64, 0x77,
-0x61, 0x79, 0x0, 0x45, 0x53, 0x54, 0x35, 0x45, 0x44, 0x54, 0x0, 0x49, 0x6e, 0x64, 0x69, 0x61, 0x6e, 0x2f, 0x43, 0x68,
-0x72, 0x69, 0x73, 0x74, 0x6d, 0x61, 0x73, 0x0, 0x50, 0x61, 0x63, 0x69, 0x66, 0x69, 0x63, 0x2f, 0x47, 0x61, 0x6c, 0x61,
-0x70, 0x61, 0x67, 0x6f, 0x73, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x41, 0x6e, 0x67, 0x75, 0x69, 0x6c,
-0x6c, 0x61, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x43, 0x61, 0x79, 0x6d, 0x61, 0x6e, 0x0, 0x41, 0x6d,
-0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x53, 0x74, 0x5f, 0x4b, 0x69, 0x74, 0x74, 0x73, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69,
-0x63, 0x61, 0x2f, 0x53, 0x61, 0x6e, 0x74, 0x69, 0x61, 0x67, 0x6f, 0x0, 0x50, 0x61, 0x63, 0x69, 0x66, 0x69, 0x63, 0x2f,
-0x50, 0x61, 0x6c, 0x61, 0x75, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x59, 0x61, 0x6b, 0x75, 0x74, 0x73, 0x6b, 0x20, 0x41,
-0x73, 0x69, 0x61, 0x2f, 0x43, 0x68, 0x69, 0x74, 0x61, 0x20, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x4b, 0x68, 0x61, 0x6e, 0x64,
-0x79, 0x67, 0x61, 0x0, 0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f, 0x56, 0x69, 0x6c, 0x6e, 0x69, 0x75, 0x73, 0x0, 0x41,
-0x66, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x4d, 0x6f, 0x6e, 0x72, 0x6f, 0x76, 0x69, 0x61, 0x0, 0x50, 0x61, 0x63, 0x69, 0x66,
-0x69, 0x63, 0x2f, 0x47, 0x75, 0x61, 0x6d, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x44, 0x61, 0x6e, 0x6d,
-0x61, 0x72, 0x6b, 0x73, 0x68, 0x61, 0x76, 0x6e, 0x0, 0x50, 0x61, 0x63, 0x69, 0x66, 0x69, 0x63, 0x2f, 0x46, 0x69, 0x6a,
-0x69, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x4d, 0x61, 0x6e, 0x61, 0x67, 0x75, 0x61, 0x0, 0x41, 0x6d,
-0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x53, 0x63, 0x6f, 0x72, 0x65, 0x73, 0x62, 0x79, 0x73, 0x75, 0x6e, 0x64, 0x0, 0x41,
-0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x53, 0x74, 0x5f, 0x42, 0x61, 0x72, 0x74, 0x68, 0x65, 0x6c, 0x65, 0x6d, 0x79,
-0x0, 0x50, 0x53, 0x54, 0x38, 0x50, 0x44, 0x54, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x47, 0x72, 0x61,
-0x6e, 0x64, 0x5f, 0x54, 0x75, 0x72, 0x6b, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x4f, 0x72, 0x61, 0x6c, 0x20, 0x41, 0x73,
-0x69, 0x61, 0x2f, 0x41, 0x71, 0x74, 0x61, 0x75, 0x20, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x41, 0x71, 0x74, 0x6f, 0x62, 0x65,
-0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x43, 0x68, 0x69, 0x63, 0x61, 0x67, 0x6f, 0x20, 0x41, 0x6d, 0x65,
-0x72, 0x69, 0x63, 0x61, 0x2f, 0x49, 0x6e, 0x64, 0x69, 0x61, 0x6e, 0x61, 0x2f, 0x4b, 0x6e, 0x6f, 0x78, 0x20, 0x41, 0x6d,
-0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x49, 0x6e, 0x64, 0x69, 0x61, 0x6e, 0x61, 0x2f, 0x54, 0x65, 0x6c, 0x6c, 0x5f, 0x43,
-0x69, 0x74, 0x79, 0x20, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x4d, 0x65, 0x6e, 0x6f, 0x6d, 0x69, 0x6e, 0x65,
-0x65, 0x20, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x4e, 0x6f, 0x72, 0x74, 0x68, 0x5f, 0x44, 0x61, 0x6b, 0x6f,
-0x74, 0x61, 0x2f, 0x42, 0x65, 0x75, 0x6c, 0x61, 0x68, 0x20, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x4e, 0x6f,
-0x72, 0x74, 0x68, 0x5f, 0x44, 0x61, 0x6b, 0x6f, 0x74, 0x61, 0x2f, 0x43, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x20, 0x41, 0x6d,
-0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x4e, 0x6f, 0x72, 0x74, 0x68, 0x5f, 0x44, 0x61, 0x6b, 0x6f, 0x74, 0x61, 0x2f, 0x4e,
-0x65, 0x77, 0x5f, 0x53, 0x61, 0x6c, 0x65, 0x6d, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x4d, 0x61, 0x74,
-0x61, 0x6d, 0x6f, 0x72, 0x6f, 0x73, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x54, 0x68, 0x75, 0x6c, 0x65,
-0x0, 0x45, 0x74, 0x63, 0x2f, 0x47, 0x4d, 0x54, 0x2d, 0x31, 0x31, 0x0, 0x41, 0x74, 0x6c, 0x61, 0x6e, 0x74, 0x69, 0x63,
-0x2f, 0x53, 0x74, 0x5f, 0x48, 0x65, 0x6c, 0x65, 0x6e, 0x61, 0x0, 0x50, 0x61, 0x63, 0x69, 0x66, 0x69, 0x63, 0x2f, 0x4e,
-0x69, 0x75, 0x65, 0x0, 0x49, 0x6e, 0x64, 0x69, 0x61, 0x6e, 0x2f, 0x4d, 0x61, 0x75, 0x72, 0x69, 0x74, 0x69, 0x75, 0x73,
-0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x55, 0x6c, 0x61, 0x61, 0x6e, 0x62, 0x61, 0x61, 0x74, 0x61, 0x72, 0x20, 0x41, 0x73,
-0x69, 0x61, 0x2f, 0x43, 0x68, 0x6f, 0x69, 0x62, 0x61, 0x6c, 0x73, 0x61, 0x6e, 0x0, 0x45, 0x74, 0x63, 0x2f, 0x47, 0x4d,
-0x54, 0x2d, 0x32, 0x0, 0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f, 0x4d, 0x69, 0x6e, 0x73, 0x6b, 0x0, 0x41, 0x66, 0x72,
-0x69, 0x63, 0x61, 0x2f, 0x4a, 0x75, 0x62, 0x61, 0x0, 0x41, 0x75, 0x73, 0x74, 0x72, 0x61, 0x6c, 0x69, 0x61, 0x2f, 0x48,
-0x6f, 0x62, 0x61, 0x72, 0x74, 0x20, 0x41, 0x75, 0x73, 0x74, 0x72, 0x61, 0x6c, 0x69, 0x61, 0x2f, 0x43, 0x75, 0x72, 0x72,
-0x69, 0x65, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x56, 0x6c, 0x61, 0x64, 0x69, 0x76, 0x6f, 0x73, 0x74, 0x6f, 0x6b, 0x20,
-0x41, 0x73, 0x69, 0x61, 0x2f, 0x53, 0x61, 0x6b, 0x68, 0x61, 0x6c, 0x69, 0x6e, 0x20, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x55,
-0x73, 0x74, 0x2d, 0x4e, 0x65, 0x72, 0x61, 0x0, 0x41, 0x6e, 0x74, 0x61, 0x72, 0x63, 0x74, 0x69, 0x63, 0x61, 0x2f, 0x44,
-0x75, 0x6d, 0x6f, 0x6e, 0x74, 0x44, 0x55, 0x72, 0x76, 0x69, 0x6c, 0x6c, 0x65, 0x0, 0x45, 0x75, 0x72, 0x6f, 0x70, 0x65,
-0x2f, 0x44, 0x75, 0x62, 0x6c, 0x69, 0x6e, 0x0, 0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f, 0x56, 0x69, 0x65, 0x6e, 0x6e,
-0x61, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x41, 0x6e, 0x63, 0x68, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x0,
-0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x42, 0x75, 0x65, 0x6e, 0x6f, 0x73, 0x5f, 0x41, 0x69, 0x72, 0x65, 0x73,
-0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x48, 0x61, 0x6c, 0x69, 0x66, 0x61, 0x78, 0x0, 0x41, 0x75, 0x73,
-0x74, 0x72, 0x61, 0x6c, 0x69, 0x61, 0x2f, 0x53, 0x79, 0x64, 0x6e, 0x65, 0x79, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63,
-0x61, 0x2f, 0x52, 0x65, 0x67, 0x69, 0x6e, 0x61, 0x0, 0x41, 0x75, 0x73, 0x74, 0x72, 0x61, 0x6c, 0x69, 0x61, 0x2f, 0x41,
-0x64, 0x65, 0x6c, 0x61, 0x69, 0x64, 0x65, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x41, 0x6c, 0x6d, 0x61, 0x74, 0x79, 0x0,
-0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x43, 0x75, 0x69, 0x61, 0x62, 0x61, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69,
-0x63, 0x61, 0x2f, 0x4d, 0x65, 0x78, 0x69, 0x63, 0x6f, 0x5f, 0x43, 0x69, 0x74, 0x79, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69,
-0x63, 0x61, 0x2f, 0x43, 0x68, 0x69, 0x63, 0x61, 0x67, 0x6f, 0x0, 0x41, 0x75, 0x73, 0x74, 0x72, 0x61, 0x6c, 0x69, 0x61,
-0x2f, 0x42, 0x72, 0x69, 0x73, 0x62, 0x61, 0x6e, 0x65, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x4e, 0x65,
-0x77, 0x5f, 0x59, 0x6f, 0x72, 0x6b, 0x0, 0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f, 0x4b, 0x69, 0x65, 0x76, 0x0, 0x41,
-0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x43, 0x68, 0x69, 0x68, 0x75, 0x61, 0x68, 0x75, 0x61, 0x0, 0x41, 0x6d, 0x65,
-0x72, 0x69, 0x63, 0x61, 0x2f, 0x44, 0x65, 0x6e, 0x76, 0x65, 0x72, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x4e, 0x6f, 0x76,
-0x6f, 0x73, 0x69, 0x62, 0x69, 0x72, 0x73, 0x6b, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x4b, 0x72, 0x61, 0x73, 0x6e, 0x6f,
-0x79, 0x61, 0x72, 0x73, 0x6b, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x4b, 0x61, 0x6d, 0x63, 0x68, 0x61, 0x74, 0x6b, 0x61,
-0x0, 0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f, 0x4d, 0x6f, 0x73, 0x63, 0x6f, 0x77, 0x0, 0x41, 0x75, 0x73, 0x74, 0x72,
-0x61, 0x6c, 0x69, 0x61, 0x2f, 0x48, 0x6f, 0x62, 0x61, 0x72, 0x74, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x55, 0x6c, 0x61,
-0x61, 0x6e, 0x62, 0x61, 0x61, 0x74, 0x61, 0x72, 0x0, 0x41, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2f, 0x49, 0x6e, 0x64,
-0x69, 0x61, 0x6e, 0x61, 0x70, 0x6f, 0x6c, 0x69, 0x73, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x56, 0x6c, 0x61, 0x64, 0x69,
-0x76, 0x6f, 0x73, 0x74, 0x6f, 0x6b, 0x0, 0x45, 0x75, 0x72, 0x6f, 0x70, 0x65, 0x2f, 0x42, 0x65, 0x72, 0x6c, 0x69, 0x6e,
-0x0, 0x41, 0x73, 0x69, 0x61, 0x2f, 0x54, 0x61, 0x73, 0x68, 0x6b, 0x65, 0x6e, 0x74, 0x0, 0x41, 0x73, 0x69, 0x61, 0x2f,
-0x59, 0x61, 0x6b, 0x75, 0x74, 0x73, 0x6b, 0x0, 0x55, 0x54, 0x43, 0x0, 0x55, 0x54, 0x43, 0x2d, 0x31, 0x34, 0x3a, 0x30,
-0x30, 0x0, 0x55, 0x54, 0x43, 0x2d, 0x31, 0x33, 0x3a, 0x30, 0x30, 0x0, 0x55, 0x54, 0x43, 0x2d, 0x31, 0x32, 0x3a, 0x30,
-0x30, 0x0, 0x55, 0x54, 0x43, 0x2d, 0x31, 0x31, 0x3a, 0x30, 0x30, 0x0, 0x55, 0x54, 0x43, 0x2d, 0x31, 0x30, 0x3a, 0x30,
-0x30, 0x0, 0x55, 0x54, 0x43, 0x2d, 0x30, 0x39, 0x3a, 0x30, 0x30, 0x0, 0x55, 0x54, 0x43, 0x2d, 0x30, 0x38, 0x3a, 0x30,
-0x30, 0x0, 0x55, 0x54, 0x43, 0x2d, 0x30, 0x37, 0x3a, 0x30, 0x30, 0x0, 0x55, 0x54, 0x43, 0x2d, 0x30, 0x36, 0x3a, 0x30,
-0x30, 0x0, 0x55, 0x54, 0x43, 0x2d, 0x30, 0x35, 0x3a, 0x30, 0x30, 0x0, 0x55, 0x54, 0x43, 0x2d, 0x30, 0x34, 0x3a, 0x33,
-0x30, 0x0, 0x55, 0x54, 0x43, 0x2d, 0x30, 0x34, 0x3a, 0x30, 0x30, 0x0, 0x55, 0x54, 0x43, 0x2d, 0x30, 0x33, 0x3a, 0x33,
-0x30, 0x0, 0x55, 0x54, 0x43, 0x2d, 0x30, 0x33, 0x3a, 0x30, 0x30, 0x0, 0x55, 0x54, 0x43, 0x2d, 0x30, 0x32, 0x3a, 0x30,
-0x30, 0x0, 0x55, 0x54, 0x43, 0x2d, 0x30, 0x31, 0x3a, 0x30, 0x30, 0x0, 0x55, 0x54, 0x43, 0x2d, 0x30, 0x30, 0x3a, 0x30,
-0x30, 0x0, 0x55, 0x54, 0x43, 0x2b, 0x30, 0x30, 0x3a, 0x30, 0x30, 0x0, 0x55, 0x54, 0x43, 0x2b, 0x30, 0x31, 0x3a, 0x30,
-0x30, 0x0, 0x55, 0x54, 0x43, 0x2b, 0x30, 0x32, 0x3a, 0x30, 0x30, 0x0, 0x55, 0x54, 0x43, 0x2b, 0x30, 0x33, 0x3a, 0x30,
-0x30, 0x0, 0x55, 0x54, 0x43, 0x2b, 0x30, 0x33, 0x3a, 0x33, 0x30, 0x0, 0x55, 0x54, 0x43, 0x2b, 0x30, 0x34, 0x3a, 0x30,
-0x30, 0x0, 0x55, 0x54, 0x43, 0x2b, 0x30, 0x34, 0x3a, 0x33, 0x30, 0x0, 0x55, 0x54, 0x43, 0x2b, 0x30, 0x35, 0x3a, 0x30,
-0x30, 0x0, 0x55, 0x54, 0x43, 0x2b, 0x30, 0x35, 0x3a, 0x33, 0x30, 0x0, 0x55, 0x54, 0x43, 0x2b, 0x30, 0x35, 0x3a, 0x34,
-0x35, 0x0, 0x55, 0x54, 0x43, 0x2b, 0x30, 0x36, 0x3a, 0x30, 0x30, 0x0, 0x55, 0x54, 0x43, 0x2b, 0x30, 0x36, 0x3a, 0x33,
-0x30, 0x0, 0x55, 0x54, 0x43, 0x2b, 0x30, 0x37, 0x3a, 0x30, 0x30, 0x0, 0x55, 0x54, 0x43, 0x2b, 0x30, 0x38, 0x3a, 0x30,
-0x30, 0x0, 0x55, 0x54, 0x43, 0x2b, 0x30, 0x39, 0x3a, 0x30, 0x30, 0x0, 0x55, 0x54, 0x43, 0x2b, 0x30, 0x39, 0x3a, 0x33,
-0x30, 0x0, 0x55, 0x54, 0x43, 0x2b, 0x31, 0x30, 0x3a, 0x30, 0x30, 0x0, 0x55, 0x54, 0x43, 0x2b, 0x31, 0x31, 0x3a, 0x30,
-0x30, 0x0, 0x55, 0x54, 0x43, 0x2b, 0x31, 0x32, 0x3a, 0x30, 0x30, 0x0, 0x55, 0x54, 0x43, 0x2b, 0x31, 0x33, 0x3a, 0x30,
-0x30, 0x0, 0x55, 0x54, 0x43, 0x2b, 0x31, 0x34, 0x3a, 0x30, 0x30, 0x0, 0x55, 0x54, 0x43, 0x2b, 0x30, 0x38, 0x3a, 0x33,
-0x30, 0x0
-};
-// GENERATED PART ENDS HERE
-
-QT_END_NAMESPACE
-
-#endif // QTIMEZONEPRIVATE_DATA_P_H
diff --git a/src/corelib/tools/qtimezoneprivate_icu.cpp b/src/corelib/tools/qtimezoneprivate_icu.cpp
deleted file mode 100644
index 5570ce7571..0000000000
--- a/src/corelib/tools/qtimezoneprivate_icu.cpp
+++ /dev/null
@@ -1,508 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2013 John Layt <jlayt@kde.org>
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#include "qtimezone.h"
-#include "qtimezoneprivate_p.h"
-
-#include <unicode/ucal.h>
-
-#include <qdebug.h>
-#include <qlist.h>
-
-#include <algorithm>
-
-QT_BEGIN_NAMESPACE
-
-/*
- Private
-
- ICU implementation
-*/
-
-// ICU utilities
-
-// Convert TimeType and NameType into ICU UCalendarDisplayNameType
-static UCalendarDisplayNameType ucalDisplayNameType(QTimeZone::TimeType timeType, QTimeZone::NameType nameType)
-{
- // TODO ICU C UCalendarDisplayNameType does not support full set of C++ TimeZone::EDisplayType
- switch (nameType) {
- case QTimeZone::ShortName :
- case QTimeZone::OffsetName :
- if (timeType == QTimeZone::DaylightTime)
- return UCAL_SHORT_DST;
- // Includes GenericTime
- return UCAL_SHORT_STANDARD;
- case QTimeZone::DefaultName :
- case QTimeZone::LongName :
- if (timeType == QTimeZone::DaylightTime)
- return UCAL_DST;
- // Includes GenericTime
- return UCAL_STANDARD;
- }
- return UCAL_STANDARD;
-}
-
-// Qt wrapper around ucal_getDefaultTimeZone()
-static QByteArray ucalDefaultTimeZoneId()
-{
- int32_t size = 30;
- QString result(size, Qt::Uninitialized);
- UErrorCode status = U_ZERO_ERROR;
-
- // size = ucal_getDefaultTimeZone(result, resultLength, status)
- size = ucal_getDefaultTimeZone(reinterpret_cast<UChar *>(result.data()), size, &status);
-
- // If overflow, then resize and retry
- if (status == U_BUFFER_OVERFLOW_ERROR) {
- result.resize(size);
- status = U_ZERO_ERROR;
- size = ucal_getDefaultTimeZone(reinterpret_cast<UChar *>(result.data()), size, &status);
- }
-
- // If successful on first or second go, resize and return
- if (U_SUCCESS(status)) {
- result.resize(size);
- return std::move(result).toUtf8();
- }
-
- return QByteArray();
-}
-
-// Qt wrapper around ucal_getTimeZoneDisplayName()
-static QString ucalTimeZoneDisplayName(UCalendar *ucal, QTimeZone::TimeType timeType,
- QTimeZone::NameType nameType,
- const QString &localeCode)
-{
- int32_t size = 50;
- QString result(size, Qt::Uninitialized);
- UErrorCode status = U_ZERO_ERROR;
-
- // size = ucal_getTimeZoneDisplayName(cal, type, locale, result, resultLength, status)
- size = ucal_getTimeZoneDisplayName(ucal,
- ucalDisplayNameType(timeType, nameType),
- localeCode.toUtf8(),
- reinterpret_cast<UChar *>(result.data()),
- size,
- &status);
-
- // If overflow, then resize and retry
- if (status == U_BUFFER_OVERFLOW_ERROR) {
- result.resize(size);
- status = U_ZERO_ERROR;
- size = ucal_getTimeZoneDisplayName(ucal,
- ucalDisplayNameType(timeType, nameType),
- localeCode.toUtf8(),
- reinterpret_cast<UChar *>(result.data()),
- size,
- &status);
- }
-
- // If successful on first or second go, resize and return
- if (U_SUCCESS(status)) {
- result.resize(size);
- return result;
- }
-
- return QString();
-}
-
-// Qt wrapper around ucal_get() for offsets
-static bool ucalOffsetsAtTime(UCalendar *m_ucal, qint64 atMSecsSinceEpoch,
- int *utcOffset, int *dstOffset)
-{
- *utcOffset = 0;
- *dstOffset = 0;
-
- // Clone the ucal so we don't change the shared object
- UErrorCode status = U_ZERO_ERROR;
- UCalendar *ucal = ucal_clone(m_ucal, &status);
- if (!U_SUCCESS(status))
- return false;
-
- // Set the date to find the offset for
- status = U_ZERO_ERROR;
- ucal_setMillis(ucal, atMSecsSinceEpoch, &status);
-
- int32_t utc = 0;
- if (U_SUCCESS(status)) {
- status = U_ZERO_ERROR;
- // Returns msecs
- utc = ucal_get(ucal, UCAL_ZONE_OFFSET, &status) / 1000;
- }
-
- int32_t dst = 0;
- if (U_SUCCESS(status)) {
- status = U_ZERO_ERROR;
- // Returns msecs
- dst = ucal_get(ucal, UCAL_DST_OFFSET, &status) / 1000;
- }
-
- ucal_close(ucal);
- if (U_SUCCESS(status)) {
- *utcOffset = utc;
- *dstOffset = dst;
- return true;
- }
- return false;
-}
-
-// ICU Draft api in v50, should be stable in ICU v51. Available in C++ api from ICU v3.8
-#if U_ICU_VERSION_MAJOR_NUM == 50
-// Qt wrapper around qt_ucal_getTimeZoneTransitionDate & ucal_get
-static QTimeZonePrivate::Data ucalTimeZoneTransition(UCalendar *m_ucal,
- UTimeZoneTransitionType type,
- qint64 atMSecsSinceEpoch)
-{
- QTimeZonePrivate::Data tran = QTimeZonePrivate::invalidData();
-
- // Clone the ucal so we don't change the shared object
- UErrorCode status = U_ZERO_ERROR;
- UCalendar *ucal = ucal_clone(m_ucal, &status);
- if (!U_SUCCESS(status))
- return tran;
-
- // Set the date to find the transition for
- status = U_ZERO_ERROR;
- ucal_setMillis(ucal, atMSecsSinceEpoch, &status);
-
- // Find the transition time
- UDate tranMSecs = 0;
- status = U_ZERO_ERROR;
- bool ok = ucal_getTimeZoneTransitionDate(ucal, type, &tranMSecs, &status);
-
- // Set the transition time to find the offsets for
- if (U_SUCCESS(status) && ok) {
- status = U_ZERO_ERROR;
- ucal_setMillis(ucal, tranMSecs, &status);
- }
-
- int32_t utc = 0;
- if (U_SUCCESS(status) && ok) {
- status = U_ZERO_ERROR;
- utc = ucal_get(ucal, UCAL_ZONE_OFFSET, &status) / 1000;
- }
-
- int32_t dst = 0;
- if (U_SUCCESS(status) && ok) {
- status = U_ZERO_ERROR;
- dst = ucal_get(ucal, UCAL_DST_OFFSET, &status) / 1000;
- }
-
- ucal_close(ucal);
- if (!U_SUCCESS(status) || !ok)
- return tran;
- tran.atMSecsSinceEpoch = tranMSecs;
- tran.offsetFromUtc = utc + dst;
- tran.standardTimeOffset = utc;
- tran.daylightTimeOffset = dst;
- // TODO No ICU API, use short name instead
- if (dst == 0)
- tran.abbreviation = ucalTimeZoneDisplayName(m_ucal, QTimeZone::StandardTime,
- QTimeZone::ShortName, QLocale().name());
- else
- tran.abbreviation = ucalTimeZoneDisplayName(m_ucal, QTimeZone::DaylightTime,
- QTimeZone::ShortName, QLocale().name());
- return tran;
-}
-#endif // U_ICU_VERSION_SHORT
-
-// Convert a uenum to a QList<QByteArray>
-static QList<QByteArray> uenumToIdList(UEnumeration *uenum)
-{
- QList<QByteArray> list;
- int32_t size = 0;
- UErrorCode status = U_ZERO_ERROR;
- // TODO Perhaps use uenum_unext instead?
- QByteArray result = uenum_next(uenum, &size, &status);
- while (U_SUCCESS(status) && !result.isEmpty()) {
- list << result;
- status = U_ZERO_ERROR;
- result = uenum_next(uenum, &size, &status);
- }
- std::sort(list.begin(), list.end());
- list.erase(std::unique(list.begin(), list.end()), list.end());
- return list;
-}
-
-// Qt wrapper around ucal_getDSTSavings()
-static int ucalDaylightOffset(const QByteArray &id)
-{
- UErrorCode status = U_ZERO_ERROR;
- const int32_t dstMSecs = ucal_getDSTSavings(reinterpret_cast<const UChar *>(id.data()), &status);
- if (U_SUCCESS(status))
- return (dstMSecs / 1000);
- else
- return 0;
-}
-
-// Create the system default time zone
-QIcuTimeZonePrivate::QIcuTimeZonePrivate()
- : m_ucal(0)
-{
- // TODO No ICU C API to obtain sysem tz, assume default hasn't been changed
- init(ucalDefaultTimeZoneId());
-}
-
-// Create a named time zone
-QIcuTimeZonePrivate::QIcuTimeZonePrivate(const QByteArray &ianaId)
- : m_ucal(0)
-{
- // Need to check validity here as ICu will create a GMT tz if name is invalid
- if (availableTimeZoneIds().contains(ianaId))
- init(ianaId);
-}
-
-QIcuTimeZonePrivate::QIcuTimeZonePrivate(const QIcuTimeZonePrivate &other)
- : QTimeZonePrivate(other), m_ucal(0)
-{
- // Clone the ucal so we don't close the shared object
- UErrorCode status = U_ZERO_ERROR;
- m_ucal = ucal_clone(other.m_ucal, &status);
- if (!U_SUCCESS(status)) {
- m_id.clear();
- m_ucal = 0;
- }
-}
-
-QIcuTimeZonePrivate::~QIcuTimeZonePrivate()
-{
- ucal_close(m_ucal);
-}
-
-QIcuTimeZonePrivate *QIcuTimeZonePrivate::clone() const
-{
- return new QIcuTimeZonePrivate(*this);
-}
-
-void QIcuTimeZonePrivate::init(const QByteArray &ianaId)
-{
- m_id = ianaId;
-
- const QString id = QString::fromUtf8(m_id);
- UErrorCode status = U_ZERO_ERROR;
- //TODO Use UCAL_GREGORIAN for now to match QLocale, change to UCAL_DEFAULT once full ICU support
- m_ucal = ucal_open(reinterpret_cast<const UChar *>(id.data()), id.size(),
- QLocale().name().toUtf8(), UCAL_GREGORIAN, &status);
-
- if (!U_SUCCESS(status)) {
- m_id.clear();
- m_ucal = 0;
- }
-}
-
-QString QIcuTimeZonePrivate::displayName(QTimeZone::TimeType timeType,
- QTimeZone::NameType nameType,
- const QLocale &locale) const
-{
- // Return standard offset format name as ICU C api doesn't support it yet
- if (nameType == QTimeZone::OffsetName) {
- const Data nowData = data(QDateTime::currentMSecsSinceEpoch());
- // We can't use transitions reliably to find out right dst offset
- // Instead use dst offset api to try get it if needed
- if (timeType == QTimeZone::DaylightTime)
- return isoOffsetFormat(nowData.standardTimeOffset + ucalDaylightOffset(m_id));
- else
- return isoOffsetFormat(nowData.standardTimeOffset);
- }
- return ucalTimeZoneDisplayName(m_ucal, timeType, nameType, locale.name());
-}
-
-QString QIcuTimeZonePrivate::abbreviation(qint64 atMSecsSinceEpoch) const
-{
- // TODO No ICU API, use short name instead
- if (isDaylightTime(atMSecsSinceEpoch))
- return displayName(QTimeZone::DaylightTime, QTimeZone::ShortName, QString());
- else
- return displayName(QTimeZone::StandardTime, QTimeZone::ShortName, QString());
-}
-
-int QIcuTimeZonePrivate::offsetFromUtc(qint64 atMSecsSinceEpoch) const
-{
- int stdOffset = 0;
- int dstOffset = 0;
- ucalOffsetsAtTime(m_ucal, atMSecsSinceEpoch, &stdOffset, & dstOffset);
- return stdOffset + dstOffset;
-}
-
-int QIcuTimeZonePrivate::standardTimeOffset(qint64 atMSecsSinceEpoch) const
-{
- int stdOffset = 0;
- int dstOffset = 0;
- ucalOffsetsAtTime(m_ucal, atMSecsSinceEpoch, &stdOffset, & dstOffset);
- return stdOffset;
-}
-
-int QIcuTimeZonePrivate::daylightTimeOffset(qint64 atMSecsSinceEpoch) const
-{
- int stdOffset = 0;
- int dstOffset = 0;
- ucalOffsetsAtTime(m_ucal, atMSecsSinceEpoch, &stdOffset, & dstOffset);
- return dstOffset;
-}
-
-bool QIcuTimeZonePrivate::hasDaylightTime() const
-{
- // TODO No direct ICU C api, work-around below not reliable? Find a better way?
- return (ucalDaylightOffset(m_id) != 0);
-}
-
-bool QIcuTimeZonePrivate::isDaylightTime(qint64 atMSecsSinceEpoch) const
-{
- // Clone the ucal so we don't change the shared object
- UErrorCode status = U_ZERO_ERROR;
- UCalendar *ucal = ucal_clone(m_ucal, &status);
- if (!U_SUCCESS(status))
- return false;
-
- // Set the date to find the offset for
- status = U_ZERO_ERROR;
- ucal_setMillis(ucal, atMSecsSinceEpoch, &status);
-
- bool result = false;
- if (U_SUCCESS(status)) {
- status = U_ZERO_ERROR;
- result = ucal_inDaylightTime(ucal, &status);
- }
-
- ucal_close(ucal);
- return result;
-}
-
-QTimeZonePrivate::Data QIcuTimeZonePrivate::data(qint64 forMSecsSinceEpoch) const
-{
- // Available in ICU C++ api, and draft C api in v50
- // TODO When v51 released see if api is stable
- QTimeZonePrivate::Data data = invalidData();
-#if U_ICU_VERSION_MAJOR_NUM == 50
- data = ucalTimeZoneTransition(m_ucal, UCAL_TZ_TRANSITION_PREVIOUS_INCLUSIVE,
- forMSecsSinceEpoch);
-#else
- ucalOffsetsAtTime(m_ucal, forMSecsSinceEpoch, &data.standardTimeOffset,
- &data.daylightTimeOffset);
- data.offsetFromUtc = data.standardTimeOffset + data.daylightTimeOffset;
- data.abbreviation = abbreviation(forMSecsSinceEpoch);
-#endif // U_ICU_VERSION_MAJOR_NUM == 50
- data.atMSecsSinceEpoch = forMSecsSinceEpoch;
- return data;
-}
-
-bool QIcuTimeZonePrivate::hasTransitions() const
-{
- // Available in ICU C++ api, and draft C api in v50
- // TODO When v51 released see if api is stable
-#if U_ICU_VERSION_MAJOR_NUM == 50
- return true;
-#else
- return false;
-#endif // U_ICU_VERSION_MAJOR_NUM == 50
-}
-
-QTimeZonePrivate::Data QIcuTimeZonePrivate::nextTransition(qint64 afterMSecsSinceEpoch) const
-{
- // Available in ICU C++ api, and draft C api in v50
- // TODO When v51 released see if api is stable
-#if U_ICU_VERSION_MAJOR_NUM == 50
- return ucalTimeZoneTransition(m_ucal, UCAL_TZ_TRANSITION_NEXT, afterMSecsSinceEpoch);
-#else
- Q_UNUSED(afterMSecsSinceEpoch)
- return invalidData();
-#endif // U_ICU_VERSION_MAJOR_NUM == 50
-}
-
-QTimeZonePrivate::Data QIcuTimeZonePrivate::previousTransition(qint64 beforeMSecsSinceEpoch) const
-{
- // Available in ICU C++ api, and draft C api in v50
- // TODO When v51 released see if api is stable
-#if U_ICU_VERSION_MAJOR_NUM == 50
- return ucalTimeZoneTransition(m_ucal, UCAL_TZ_TRANSITION_PREVIOUS, beforeMSecsSinceEpoch);
-#else
- Q_UNUSED(beforeMSecsSinceEpoch)
- return invalidData();
-#endif // U_ICU_VERSION_MAJOR_NUM == 50
-}
-
-QByteArray QIcuTimeZonePrivate::systemTimeZoneId() const
-{
- // No ICU C API to obtain sysem tz
- // TODO Assume default hasn't been changed and is the latests system
- return ucalDefaultTimeZoneId();
-}
-
-QList<QByteArray> QIcuTimeZonePrivate::availableTimeZoneIds() const
-{
- UErrorCode status = U_ZERO_ERROR;
- UEnumeration *uenum = ucal_openTimeZones(&status);
- QList<QByteArray> result;
- if (U_SUCCESS(status))
- result = uenumToIdList(uenum);
- uenum_close(uenum);
- return result;
-}
-
-QList<QByteArray> QIcuTimeZonePrivate::availableTimeZoneIds(QLocale::Country country) const
-{
- const QLatin1String regionCode = QLocalePrivate::countryToCode(country);
- const QByteArray regionCodeUtf8 = QString(regionCode).toUtf8();
- UErrorCode status = U_ZERO_ERROR;
- UEnumeration *uenum = ucal_openCountryTimeZones(regionCodeUtf8.data(), &status);
- QList<QByteArray> result;
- if (U_SUCCESS(status))
- result = uenumToIdList(uenum);
- uenum_close(uenum);
- return result;
-}
-
-QList<QByteArray> QIcuTimeZonePrivate::availableTimeZoneIds(int offsetFromUtc) const
-{
-// TODO Available directly in C++ api but not C api, from 4.8 onwards new filter method works
-#if U_ICU_VERSION_MAJOR_NUM >= 49 || (U_ICU_VERSION_MAJOR_NUM == 4 && U_ICU_VERSION_MINOR_NUM == 8)
- UErrorCode status = U_ZERO_ERROR;
- UEnumeration *uenum = ucal_openTimeZoneIDEnumeration(UCAL_ZONE_TYPE_ANY, 0,
- &offsetFromUtc, &status);
- QList<QByteArray> result;
- if (U_SUCCESS(status))
- result = uenumToIdList(uenum);
- uenum_close(uenum);
- return result;
-#else
- return QTimeZonePrivate::availableTimeZoneIds(offsetFromUtc);
-#endif
-}
-
-QT_END_NAMESPACE
diff --git a/src/corelib/tools/qtimezoneprivate_mac.mm b/src/corelib/tools/qtimezoneprivate_mac.mm
deleted file mode 100644
index d3c4fbe5da..0000000000
--- a/src/corelib/tools/qtimezoneprivate_mac.mm
+++ /dev/null
@@ -1,333 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2013 John Layt <jlayt@kde.org>
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#include "qtimezone.h"
-#include "qtimezoneprivate_p.h"
-
-#include "private/qcore_mac_p.h"
-#include "qstringlist.h"
-
-#include <Foundation/NSTimeZone.h>
-
-#include <qdebug.h>
-
-#include <algorithm>
-
-QT_BEGIN_NAMESPACE
-
-/*
- Private
-
- OS X system implementation
-*/
-
-// Create the system default time zone
-QMacTimeZonePrivate::QMacTimeZonePrivate()
- : m_nstz(0)
-{
- init(systemTimeZoneId());
-}
-
-// Create a named time zone
-QMacTimeZonePrivate::QMacTimeZonePrivate(const QByteArray &ianaId)
- : m_nstz(0)
-{
- init(ianaId);
-}
-
-QMacTimeZonePrivate::QMacTimeZonePrivate(const QMacTimeZonePrivate &other)
- : QTimeZonePrivate(other), m_nstz(0)
-{
- m_nstz = [other.m_nstz copy];
-}
-
-QMacTimeZonePrivate::~QMacTimeZonePrivate()
-{
- [m_nstz release];
-}
-
-QMacTimeZonePrivate *QMacTimeZonePrivate::clone() const
-{
- return new QMacTimeZonePrivate(*this);
-}
-
-void QMacTimeZonePrivate::init(const QByteArray &ianaId)
-{
- if (availableTimeZoneIds().contains(ianaId)) {
- m_nstz = [[NSTimeZone timeZoneWithName:QString::fromUtf8(ianaId).toNSString()] retain];
- if (m_nstz)
- m_id = ianaId;
- }
-}
-
-QString QMacTimeZonePrivate::comment() const
-{
- return QString::fromNSString([m_nstz description]);
-}
-
-QString QMacTimeZonePrivate::displayName(QTimeZone::TimeType timeType,
- QTimeZone::NameType nameType,
- const QLocale &locale) const
-{
- // TODO Mac doesn't support OffsetName yet so use standard offset name
- if (nameType == QTimeZone::OffsetName) {
- const Data nowData = data(QDateTime::currentMSecsSinceEpoch());
- // TODO Cheat for now, assume if has dst the offset if 1 hour
- if (timeType == QTimeZone::DaylightTime && hasDaylightTime())
- return isoOffsetFormat(nowData.standardTimeOffset + 3600);
- else
- return isoOffsetFormat(nowData.standardTimeOffset);
- }
-
- NSTimeZoneNameStyle style = NSTimeZoneNameStyleStandard;
-
- switch (nameType) {
- case QTimeZone::ShortName :
- if (timeType == QTimeZone::DaylightTime)
- style = NSTimeZoneNameStyleShortDaylightSaving;
- else if (timeType == QTimeZone::GenericTime)
- style = NSTimeZoneNameStyleShortGeneric;
- else
- style = NSTimeZoneNameStyleShortStandard;
- break;
- case QTimeZone::DefaultName :
- case QTimeZone::LongName :
- if (timeType == QTimeZone::DaylightTime)
- style = NSTimeZoneNameStyleDaylightSaving;
- else if (timeType == QTimeZone::GenericTime)
- style = NSTimeZoneNameStyleGeneric;
- else
- style = NSTimeZoneNameStyleStandard;
- break;
- case QTimeZone::OffsetName :
- // Unreachable
- break;
- }
-
- NSString *macLocaleCode = locale.name().toNSString();
- NSLocale *macLocale = [[NSLocale alloc] initWithLocaleIdentifier:macLocaleCode];
- const QString result = QString::fromNSString([m_nstz localizedName:style locale:macLocale]);
- [macLocale release];
- return result;
-}
-
-QString QMacTimeZonePrivate::abbreviation(qint64 atMSecsSinceEpoch) const
-{
- const NSTimeInterval seconds = atMSecsSinceEpoch / 1000.0;
- return QString::fromNSString([m_nstz abbreviationForDate:[NSDate dateWithTimeIntervalSince1970:seconds]]);
-}
-
-int QMacTimeZonePrivate::offsetFromUtc(qint64 atMSecsSinceEpoch) const
-{
- const NSTimeInterval seconds = atMSecsSinceEpoch / 1000.0;
- return [m_nstz secondsFromGMTForDate:[NSDate dateWithTimeIntervalSince1970:seconds]];
-}
-
-int QMacTimeZonePrivate::standardTimeOffset(qint64 atMSecsSinceEpoch) const
-{
- return offsetFromUtc(atMSecsSinceEpoch) - daylightTimeOffset(atMSecsSinceEpoch);
-}
-
-int QMacTimeZonePrivate::daylightTimeOffset(qint64 atMSecsSinceEpoch) const
-{
- const NSTimeInterval seconds = atMSecsSinceEpoch / 1000.0;
- return [m_nstz daylightSavingTimeOffsetForDate:[NSDate dateWithTimeIntervalSince1970:seconds]];
-}
-
-bool QMacTimeZonePrivate::hasDaylightTime() const
-{
- // TODO No Mac API, assume if has transitions
- return hasTransitions();
-}
-
-bool QMacTimeZonePrivate::isDaylightTime(qint64 atMSecsSinceEpoch) const
-{
- const NSTimeInterval seconds = atMSecsSinceEpoch / 1000.0;
- return [m_nstz isDaylightSavingTimeForDate:[NSDate dateWithTimeIntervalSince1970:seconds]];
-}
-
-QTimeZonePrivate::Data QMacTimeZonePrivate::data(qint64 forMSecsSinceEpoch) const
-{
- const NSTimeInterval seconds = forMSecsSinceEpoch / 1000.0;
- NSDate *date = [NSDate dateWithTimeIntervalSince1970:seconds];
- Data data;
- data.atMSecsSinceEpoch = forMSecsSinceEpoch;
- data.offsetFromUtc = [m_nstz secondsFromGMTForDate:date];
- data.daylightTimeOffset = [m_nstz daylightSavingTimeOffsetForDate:date];
- data.standardTimeOffset = data.offsetFromUtc - data.daylightTimeOffset;
- data.abbreviation = QString::fromNSString([m_nstz abbreviationForDate:date]);
- return data;
-}
-
-bool QMacTimeZonePrivate::hasTransitions() const
-{
- // TODO No direct Mac API, so return if has next after 1970, i.e. since start of tz
- // TODO Not sure what is returned in event of no transitions, assume will be before requested date
- NSDate *epoch = [NSDate dateWithTimeIntervalSince1970:0];
- const NSDate *date = [m_nstz nextDaylightSavingTimeTransitionAfterDate:epoch];
- const bool result = ([date timeIntervalSince1970] > [epoch timeIntervalSince1970]);
- return result;
-}
-
-QTimeZonePrivate::Data QMacTimeZonePrivate::nextTransition(qint64 afterMSecsSinceEpoch) const
-{
- QTimeZonePrivate::Data tran;
- const NSTimeInterval seconds = afterMSecsSinceEpoch / 1000.0;
- NSDate *nextDate = [NSDate dateWithTimeIntervalSince1970:seconds];
- nextDate = [m_nstz nextDaylightSavingTimeTransitionAfterDate:nextDate];
- const NSTimeInterval nextSecs = [nextDate timeIntervalSince1970];
- if (nextDate == nil || nextSecs <= seconds) {
- [nextDate release];
- return invalidData();
- }
- tran.atMSecsSinceEpoch = nextSecs * 1000;
- tran.offsetFromUtc = [m_nstz secondsFromGMTForDate:nextDate];
- tran.daylightTimeOffset = [m_nstz daylightSavingTimeOffsetForDate:nextDate];
- tran.standardTimeOffset = tran.offsetFromUtc - tran.daylightTimeOffset;
- tran.abbreviation = QString::fromNSString([m_nstz abbreviationForDate:nextDate]);
- return tran;
-}
-
-QTimeZonePrivate::Data QMacTimeZonePrivate::previousTransition(qint64 beforeMSecsSinceEpoch) const
-{
- // The native API only lets us search forward, so we need to find an early-enough start:
- const NSTimeInterval lowerBound = std::numeric_limits<NSTimeInterval>::lowest();
- const qint64 endSecs = beforeMSecsSinceEpoch / 1000;
- const int year = 366 * 24 * 3600; // a (long) year, in seconds
- NSTimeInterval prevSecs = endSecs; // sentinel for later check
- NSTimeInterval nextSecs = prevSecs - year;
- NSTimeInterval tranSecs = lowerBound; // time at a transition; may be > endSecs
-
- NSDate *nextDate = [NSDate dateWithTimeIntervalSince1970:nextSecs];
- nextDate = [m_nstz nextDaylightSavingTimeTransitionAfterDate:nextDate];
- if (nextDate != nil
- && (tranSecs = [nextDate timeIntervalSince1970]) < endSecs) {
- // There's a transition within the last year before endSecs:
- nextSecs = tranSecs;
- } else {
- // Need to start our search earlier:
- nextDate = [NSDate dateWithTimeIntervalSince1970:lowerBound];
- nextDate = [m_nstz nextDaylightSavingTimeTransitionAfterDate:nextDate];
- if (nextDate != nil) {
- NSTimeInterval lateSecs = nextSecs;
- nextSecs = [nextDate timeIntervalSince1970];
- Q_ASSERT(nextSecs <= endSecs - year || nextSecs == tranSecs);
- /*
- We're looking at the first ever transition for our zone, at
- nextSecs (and our zone *does* have at least one transition). If
- it's later than endSecs - year, then we must have found it on the
- initial check and therefore set tranSecs to the same transition
- time (which, we can infer here, is >= endSecs). In this case, we
- won't enter the binary-chop loop, below.
-
- In the loop, nextSecs < lateSecs < endSecs: we have a transition
- at nextSecs and there is no transition between lateSecs and
- endSecs. The loop narrows the interval between nextSecs and
- lateSecs by looking for a transition after their mid-point; if it
- finds one < endSecs, nextSecs moves to this transition; otherwise,
- lateSecs moves to the mid-point. This soon enough narrows the gap
- to within a year, after which walking forward one transition at a
- time (the "Wind through" loop, below) is good enough.
- */
-
- // Binary chop to within a year of last transition before endSecs:
- while (nextSecs + year < lateSecs) {
- // Careful about overflow, not fussy about rounding errors:
- NSTimeInterval middle = nextSecs / 2 + lateSecs / 2;
- NSDate *split = [NSDate dateWithTimeIntervalSince1970:middle];
- split = [m_nstz nextDaylightSavingTimeTransitionAfterDate:split];
- if (split != nil
- && (tranSecs = [split timeIntervalSince1970]) < endSecs) {
- nextDate = split;
- nextSecs = tranSecs;
- } else {
- lateSecs = middle;
- }
- }
- Q_ASSERT(nextDate != nil);
- // ... and nextSecs < endSecs unless first transition ever was >= endSecs.
- } // else: we have no data - prevSecs is still endSecs, nextDate is still nil
- }
- // Either nextDate is nil or nextSecs is at its transition.
-
- // Wind through remaining transitions (spanning at most a year), one at a time:
- while (nextDate != nil && nextSecs < endSecs) {
- prevSecs = nextSecs;
- nextDate = [m_nstz nextDaylightSavingTimeTransitionAfterDate:nextDate];
- nextSecs = [nextDate timeIntervalSince1970];
- if (nextSecs <= prevSecs) // presumably no later data available
- break;
- }
- if (prevSecs < endSecs) // i.e. we did make it into that while loop
- return data(qint64(prevSecs * 1e3));
-
- // No transition data; or first transition later than requested time.
- return invalidData();
-}
-
-QByteArray QMacTimeZonePrivate::systemTimeZoneId() const
-{
- // Reset the cached system tz then return the name
- [NSTimeZone resetSystemTimeZone];
- return QString::fromNSString([[NSTimeZone systemTimeZone] name]).toUtf8();
-}
-
-QList<QByteArray> QMacTimeZonePrivate::availableTimeZoneIds() const
-{
- NSEnumerator *enumerator = [[NSTimeZone knownTimeZoneNames] objectEnumerator];
- QByteArray tzid = QString::fromNSString([enumerator nextObject]).toUtf8();
-
- QList<QByteArray> list;
- while (!tzid.isEmpty()) {
- list << tzid;
- tzid = QString::fromNSString([enumerator nextObject]).toUtf8();
- }
-
- std::sort(list.begin(), list.end());
- list.erase(std::unique(list.begin(), list.end()), list.end());
-
- return list;
-}
-
-NSTimeZone *QMacTimeZonePrivate::nsTimeZone() const
-{
- return m_nstz;
-}
-
-QT_END_NAMESPACE
diff --git a/src/corelib/tools/qtimezoneprivate_p.h b/src/corelib/tools/qtimezoneprivate_p.h
deleted file mode 100644
index 24a9a00f11..0000000000
--- a/src/corelib/tools/qtimezoneprivate_p.h
+++ /dev/null
@@ -1,493 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2013 John Layt <jlayt@kde.org>
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-
-#ifndef QTIMEZONEPRIVATE_P_H
-#define QTIMEZONEPRIVATE_P_H
-
-//
-// W A R N I N G
-// -------------
-//
-// This file is not part of the Qt API. It exists for the convenience
-// of internal files. This header file may change from version to version
-// without notice, or even be removed.
-//
-// We mean it.
-//
-
-#include "qtimezone.h"
-#include "qlocale_p.h"
-#include "qvector.h"
-
-#if QT_CONFIG(icu)
-#include <unicode/ucal.h>
-#endif
-
-#ifdef Q_OS_DARWIN
-Q_FORWARD_DECLARE_OBJC_CLASS(NSTimeZone);
-#endif // Q_OS_DARWIN
-
-#ifdef Q_OS_WIN
-#include <qt_windows.h>
-#endif // Q_OS_WIN
-
-#if defined(Q_OS_ANDROID) && !defined(Q_OS_ANDROID_EMBEDDED)
-#include <QtCore/private/qjni_p.h>
-#endif
-
-QT_BEGIN_NAMESPACE
-
-class Q_AUTOTEST_EXPORT QTimeZonePrivate : public QSharedData
-{
-public:
- //Version of QTimeZone::OffsetData struct using msecs for efficiency
- struct Data {
- QString abbreviation;
- qint64 atMSecsSinceEpoch;
- int offsetFromUtc;
- int standardTimeOffset;
- int daylightTimeOffset;
- };
- typedef QVector<Data> DataList;
-
- // Create null time zone
- QTimeZonePrivate();
- QTimeZonePrivate(const QTimeZonePrivate &other);
- virtual ~QTimeZonePrivate();
-
- virtual QTimeZonePrivate *clone() const;
-
- bool operator==(const QTimeZonePrivate &other) const;
- bool operator!=(const QTimeZonePrivate &other) const;
-
- bool isValid() const;
-
- QByteArray id() const;
- virtual QLocale::Country country() const;
- virtual QString comment() const;
-
- virtual QString displayName(qint64 atMSecsSinceEpoch,
- QTimeZone::NameType nameType,
- const QLocale &locale) const;
- virtual QString displayName(QTimeZone::TimeType timeType,
- QTimeZone::NameType nameType,
- const QLocale &locale) const;
- virtual QString abbreviation(qint64 atMSecsSinceEpoch) const;
-
- virtual int offsetFromUtc(qint64 atMSecsSinceEpoch) const;
- virtual int standardTimeOffset(qint64 atMSecsSinceEpoch) const;
- virtual int daylightTimeOffset(qint64 atMSecsSinceEpoch) const;
-
- virtual bool hasDaylightTime() const;
- virtual bool isDaylightTime(qint64 atMSecsSinceEpoch) const;
-
- virtual Data data(qint64 forMSecsSinceEpoch) const;
- Data dataForLocalTime(qint64 forLocalMSecs, int hint) const;
-
- virtual bool hasTransitions() const;
- virtual Data nextTransition(qint64 afterMSecsSinceEpoch) const;
- virtual Data previousTransition(qint64 beforeMSecsSinceEpoch) const;
- DataList transitions(qint64 fromMSecsSinceEpoch, qint64 toMSecsSinceEpoch) const;
-
- virtual QByteArray systemTimeZoneId() const;
-
- virtual bool isTimeZoneIdAvailable(const QByteArray &ianaId) const;
- virtual QList<QByteArray> availableTimeZoneIds() const;
- virtual QList<QByteArray> availableTimeZoneIds(QLocale::Country country) const;
- virtual QList<QByteArray> availableTimeZoneIds(int utcOffset) const;
-
- virtual void serialize(QDataStream &ds) const;
-
- // Static Utility Methods
- static inline qint64 maxMSecs() { return std::numeric_limits<qint64>::max(); }
- static inline qint64 minMSecs() { return std::numeric_limits<qint64>::min() + 1; }
- static inline qint64 invalidMSecs() { return std::numeric_limits<qint64>::min(); }
- static inline qint64 invalidSeconds() { return std::numeric_limits<int>::min(); }
- static Data invalidData();
- static QTimeZone::OffsetData invalidOffsetData();
- static QTimeZone::OffsetData toOffsetData(const Data &data);
- static bool isValidId(const QByteArray &ianaId);
- static QString isoOffsetFormat(int offsetFromUtc);
-
- static QByteArray ianaIdToWindowsId(const QByteArray &ianaId);
- static QByteArray windowsIdToDefaultIanaId(const QByteArray &windowsId);
- static QByteArray windowsIdToDefaultIanaId(const QByteArray &windowsId,
- QLocale::Country country);
- static QList<QByteArray> windowsIdToIanaIds(const QByteArray &windowsId);
- static QList<QByteArray> windowsIdToIanaIds(const QByteArray &windowsId,
- QLocale::Country country);
-
- // returns "UTC" QString and QByteArray
- Q_REQUIRED_RESULT static inline QString utcQString()
- {
- return QStringLiteral("UTC");
- }
-
- Q_REQUIRED_RESULT static inline QByteArray utcQByteArray()
- {
- return QByteArrayLiteral("UTC");
- }
-
-protected:
- QByteArray m_id;
-};
-Q_DECLARE_TYPEINFO(QTimeZonePrivate::Data, Q_MOVABLE_TYPE);
-
-template<> QTimeZonePrivate *QSharedDataPointer<QTimeZonePrivate>::clone();
-
-class Q_AUTOTEST_EXPORT QUtcTimeZonePrivate final : public QTimeZonePrivate
-{
-public:
- // Create default UTC time zone
- QUtcTimeZonePrivate();
- // Create named time zone
- QUtcTimeZonePrivate(const QByteArray &utcId);
- // Create offset from UTC
- QUtcTimeZonePrivate(int offsetSeconds);
- // Create custom offset from UTC
- QUtcTimeZonePrivate(const QByteArray &zoneId, int offsetSeconds, const QString &name,
- const QString &abbreviation, QLocale::Country country,
- const QString &comment);
- QUtcTimeZonePrivate(const QUtcTimeZonePrivate &other);
- virtual ~QUtcTimeZonePrivate();
-
- QUtcTimeZonePrivate *clone() const override;
-
- Data data(qint64 forMSecsSinceEpoch) const override;
-
- QLocale::Country country() const override;
- QString comment() const override;
-
- QString displayName(QTimeZone::TimeType timeType,
- QTimeZone::NameType nameType,
- const QLocale &locale) const override;
- QString abbreviation(qint64 atMSecsSinceEpoch) const override;
-
- int standardTimeOffset(qint64 atMSecsSinceEpoch) const override;
- int daylightTimeOffset(qint64 atMSecsSinceEpoch) const override;
-
- QByteArray systemTimeZoneId() const override;
-
- bool isTimeZoneIdAvailable(const QByteArray &ianaId) const override;
- QList<QByteArray> availableTimeZoneIds() const override;
- QList<QByteArray> availableTimeZoneIds(QLocale::Country country) const override;
- QList<QByteArray> availableTimeZoneIds(int utcOffset) const override;
-
- void serialize(QDataStream &ds) const override;
-
-private:
- void init(const QByteArray &zoneId);
- void init(const QByteArray &zoneId, int offsetSeconds, const QString &name,
- const QString &abbreviation, QLocale::Country country,
- const QString &comment);
-
- QString m_name;
- QString m_abbreviation;
- QString m_comment;
- QLocale::Country m_country;
- int m_offsetFromUtc;
-};
-
-#if QT_CONFIG(icu)
-class Q_AUTOTEST_EXPORT QIcuTimeZonePrivate final : public QTimeZonePrivate
-{
-public:
- // Create default time zone
- QIcuTimeZonePrivate();
- // Create named time zone
- QIcuTimeZonePrivate(const QByteArray &ianaId);
- QIcuTimeZonePrivate(const QIcuTimeZonePrivate &other);
- ~QIcuTimeZonePrivate();
-
- QIcuTimeZonePrivate *clone() const override;
-
- QString displayName(QTimeZone::TimeType timeType, QTimeZone::NameType nameType,
- const QLocale &locale) const override;
- QString abbreviation(qint64 atMSecsSinceEpoch) const override;
-
- int offsetFromUtc(qint64 atMSecsSinceEpoch) const override;
- int standardTimeOffset(qint64 atMSecsSinceEpoch) const override;
- int daylightTimeOffset(qint64 atMSecsSinceEpoch) const override;
-
- bool hasDaylightTime() const override;
- bool isDaylightTime(qint64 atMSecsSinceEpoch) const override;
-
- Data data(qint64 forMSecsSinceEpoch) const override;
-
- bool hasTransitions() const override;
- Data nextTransition(qint64 afterMSecsSinceEpoch) const override;
- Data previousTransition(qint64 beforeMSecsSinceEpoch) const override;
-
- QByteArray systemTimeZoneId() const override;
-
- QList<QByteArray> availableTimeZoneIds() const override;
- QList<QByteArray> availableTimeZoneIds(QLocale::Country country) const override;
- QList<QByteArray> availableTimeZoneIds(int offsetFromUtc) const override;
-
-private:
- void init(const QByteArray &ianaId);
-
- UCalendar *m_ucal;
-};
-#endif
-
-#if defined(Q_OS_UNIX) && !defined(Q_OS_DARWIN) && (!defined(Q_OS_ANDROID) || defined(Q_OS_ANDROID_EMBEDDED))
-struct QTzTransitionTime
-{
- qint64 atMSecsSinceEpoch;
- quint8 ruleIndex;
-};
-Q_DECLARE_TYPEINFO(QTzTransitionTime, Q_PRIMITIVE_TYPE);
-struct QTzTransitionRule
-{
- int stdOffset;
- int dstOffset;
- quint8 abbreviationIndex;
-};
-Q_DECLARE_TYPEINFO(QTzTransitionRule, Q_PRIMITIVE_TYPE);
-Q_DECL_CONSTEXPR inline bool operator==(const QTzTransitionRule &lhs, const QTzTransitionRule &rhs) Q_DECL_NOTHROW
-{ return lhs.stdOffset == rhs.stdOffset && lhs.dstOffset == rhs.dstOffset && lhs.abbreviationIndex == rhs.abbreviationIndex; }
-Q_DECL_CONSTEXPR inline bool operator!=(const QTzTransitionRule &lhs, const QTzTransitionRule &rhs) Q_DECL_NOTHROW
-{ return !operator==(lhs, rhs); }
-
-class Q_AUTOTEST_EXPORT QTzTimeZonePrivate final : public QTimeZonePrivate
-{
- QTzTimeZonePrivate(const QTzTimeZonePrivate &) = default;
-public:
- // Create default time zone
- QTzTimeZonePrivate();
- // Create named time zone
- QTzTimeZonePrivate(const QByteArray &ianaId);
- ~QTzTimeZonePrivate();
-
- QTzTimeZonePrivate *clone() const override;
-
- QLocale::Country country() const override;
- QString comment() const override;
-
- QString displayName(qint64 atMSecsSinceEpoch,
- QTimeZone::NameType nameType,
- const QLocale &locale) const override;
- QString displayName(QTimeZone::TimeType timeType,
- QTimeZone::NameType nameType,
- const QLocale &locale) const override;
- QString abbreviation(qint64 atMSecsSinceEpoch) const override;
-
- int offsetFromUtc(qint64 atMSecsSinceEpoch) const override;
- int standardTimeOffset(qint64 atMSecsSinceEpoch) const override;
- int daylightTimeOffset(qint64 atMSecsSinceEpoch) const override;
-
- bool hasDaylightTime() const override;
- bool isDaylightTime(qint64 atMSecsSinceEpoch) const override;
-
- Data data(qint64 forMSecsSinceEpoch) const override;
-
- bool hasTransitions() const override;
- Data nextTransition(qint64 afterMSecsSinceEpoch) const override;
- Data previousTransition(qint64 beforeMSecsSinceEpoch) const override;
-
- QByteArray systemTimeZoneId() const override;
-
- bool isTimeZoneIdAvailable(const QByteArray &ianaId) const override;
- QList<QByteArray> availableTimeZoneIds() const override;
- QList<QByteArray> availableTimeZoneIds(QLocale::Country country) const override;
-
-private:
- void init(const QByteArray &ianaId);
- QVector<QTimeZonePrivate::Data> getPosixTransitions(qint64 msNear) const;
-
- Data dataForTzTransition(QTzTransitionTime tran) const;
- QVector<QTzTransitionTime> m_tranTimes;
- QVector<QTzTransitionRule> m_tranRules;
- QList<QByteArray> m_abbreviations;
-#if QT_CONFIG(icu)
- mutable QSharedDataPointer<QTimeZonePrivate> m_icu;
-#endif
- QByteArray m_posixRule;
-};
-#endif // Q_OS_UNIX
-
-#ifdef Q_OS_MAC
-class Q_AUTOTEST_EXPORT QMacTimeZonePrivate final : public QTimeZonePrivate
-{
-public:
- // Create default time zone
- QMacTimeZonePrivate();
- // Create named time zone
- QMacTimeZonePrivate(const QByteArray &ianaId);
- QMacTimeZonePrivate(const QMacTimeZonePrivate &other);
- ~QMacTimeZonePrivate();
-
- QMacTimeZonePrivate *clone() const override;
-
- QString comment() const override;
-
- QString displayName(QTimeZone::TimeType timeType, QTimeZone::NameType nameType,
- const QLocale &locale) const override;
- QString abbreviation(qint64 atMSecsSinceEpoch) const override;
-
- int offsetFromUtc(qint64 atMSecsSinceEpoch) const override;
- int standardTimeOffset(qint64 atMSecsSinceEpoch) const override;
- int daylightTimeOffset(qint64 atMSecsSinceEpoch) const override;
-
- bool hasDaylightTime() const override;
- bool isDaylightTime(qint64 atMSecsSinceEpoch) const override;
-
- Data data(qint64 forMSecsSinceEpoch) const override;
-
- bool hasTransitions() const override;
- Data nextTransition(qint64 afterMSecsSinceEpoch) const override;
- Data previousTransition(qint64 beforeMSecsSinceEpoch) const override;
-
- QByteArray systemTimeZoneId() const override;
-
- QList<QByteArray> availableTimeZoneIds() const override;
-
- NSTimeZone *nsTimeZone() const;
-
-private:
- void init(const QByteArray &zoneId);
-
- NSTimeZone *m_nstz;
-};
-#endif // Q_OS_MAC
-
-#ifdef Q_OS_WIN
-class Q_AUTOTEST_EXPORT QWinTimeZonePrivate final : public QTimeZonePrivate
-{
-public:
- struct QWinTransitionRule {
- int startYear;
- int standardTimeBias;
- int daylightTimeBias;
- SYSTEMTIME standardTimeRule;
- SYSTEMTIME daylightTimeRule;
- };
-
- // Create default time zone
- QWinTimeZonePrivate();
- // Create named time zone
- QWinTimeZonePrivate(const QByteArray &ianaId);
- QWinTimeZonePrivate(const QWinTimeZonePrivate &other);
- ~QWinTimeZonePrivate();
-
- QWinTimeZonePrivate *clone() const override;
-
- QString comment() const override;
-
- QString displayName(QTimeZone::TimeType timeType, QTimeZone::NameType nameType,
- const QLocale &locale) const override;
- QString abbreviation(qint64 atMSecsSinceEpoch) const override;
-
- int offsetFromUtc(qint64 atMSecsSinceEpoch) const override;
- int standardTimeOffset(qint64 atMSecsSinceEpoch) const override;
- int daylightTimeOffset(qint64 atMSecsSinceEpoch) const override;
-
- bool hasDaylightTime() const override;
- bool isDaylightTime(qint64 atMSecsSinceEpoch) const override;
-
- Data data(qint64 forMSecsSinceEpoch) const override;
-
- bool hasTransitions() const override;
- Data nextTransition(qint64 afterMSecsSinceEpoch) const override;
- Data previousTransition(qint64 beforeMSecsSinceEpoch) const override;
-
- QByteArray systemTimeZoneId() const override;
-
- QList<QByteArray> availableTimeZoneIds() const override;
-
-private:
- void init(const QByteArray &ianaId);
- QTimeZonePrivate::Data ruleToData(const QWinTransitionRule &rule, qint64 atMSecsSinceEpoch,
- QTimeZone::TimeType type, bool fakeDst = false) const;
-
- QByteArray m_windowsId;
- QString m_displayName;
- QString m_standardName;
- QString m_daylightName;
- QList<QWinTransitionRule> m_tranRules;
-};
-#endif // Q_OS_WIN
-
-#if defined(Q_OS_ANDROID) && !defined(Q_OS_ANDROID_EMBEDDED)
-class QAndroidTimeZonePrivate final : public QTimeZonePrivate
-{
-public:
- // Create default time zone
- QAndroidTimeZonePrivate();
- // Create named time zone
- QAndroidTimeZonePrivate(const QByteArray &ianaId);
- QAndroidTimeZonePrivate(const QAndroidTimeZonePrivate &other);
- ~QAndroidTimeZonePrivate();
-
- QAndroidTimeZonePrivate *clone() const override;
-
- QString displayName(QTimeZone::TimeType timeType, QTimeZone::NameType nameType,
- const QLocale &locale) const override;
- QString abbreviation(qint64 atMSecsSinceEpoch) const override;
-
- int offsetFromUtc(qint64 atMSecsSinceEpoch) const override;
- int standardTimeOffset(qint64 atMSecsSinceEpoch) const override;
- int daylightTimeOffset(qint64 atMSecsSinceEpoch) const override;
-
- bool hasDaylightTime() const override;
- bool isDaylightTime(qint64 atMSecsSinceEpoch) const override;
-
- Data data(qint64 forMSecsSinceEpoch) const override;
-
- bool hasTransitions() const override;
- Data nextTransition(qint64 afterMSecsSinceEpoch) const override;
- Data previousTransition(qint64 beforeMSecsSinceEpoch) const override;
-
- QByteArray systemTimeZoneId() const override;
-
- QList<QByteArray> availableTimeZoneIds() const override;
-
-private:
- void init(const QByteArray &zoneId);
-
- QJNIObjectPrivate androidTimeZone;
-
-};
-#endif // Q_OS_ANDROID
-
-QT_END_NAMESPACE
-
-#endif // QTIMEZONEPRIVATE_P_H
diff --git a/src/corelib/tools/qtimezoneprivate_tz.cpp b/src/corelib/tools/qtimezoneprivate_tz.cpp
deleted file mode 100644
index 57bc000af5..0000000000
--- a/src/corelib/tools/qtimezoneprivate_tz.cpp
+++ /dev/null
@@ -1,1168 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2013 John Layt <jlayt@kde.org>
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#include "qtimezone.h"
-#include "qtimezoneprivate_p.h"
-#include "qdatetime_p.h" // ### Qt 5.14: remove once YearRange is on QDateTime
-
-#include <QtCore/QFile>
-#include <QtCore/QHash>
-#include <QtCore/QDataStream>
-#include <QtCore/QDateTime>
-
-#include <qdebug.h>
-
-#include "qlocale_tools_p.h"
-
-#include <algorithm>
-#include <errno.h>
-#include <limits.h>
-#if !defined(Q_OS_INTEGRITY)
-#include <sys/param.h> // to use MAXSYMLINKS constant
-#endif
-#include <unistd.h> // to use _SC_SYMLOOP_MAX constant
-
-QT_BEGIN_NAMESPACE
-
-/*
- Private
-
- tz file implementation
-*/
-
-struct QTzTimeZone {
- QLocale::Country country;
- QByteArray comment;
-};
-
-// Define as a type as Q_GLOBAL_STATIC doesn't like it
-typedef QHash<QByteArray, QTzTimeZone> QTzTimeZoneHash;
-
-// Parse zone.tab table, assume lists all installed zones, if not will need to read directories
-static QTzTimeZoneHash loadTzTimeZones()
-{
- QString path = QStringLiteral("/usr/share/zoneinfo/zone.tab");
- if (!QFile::exists(path))
- path = QStringLiteral("/usr/lib/zoneinfo/zone.tab");
-
- QFile tzif(path);
- if (!tzif.open(QIODevice::ReadOnly))
- return QTzTimeZoneHash();
-
- QTzTimeZoneHash zonesHash;
- // TODO QTextStream inefficient, replace later
- QTextStream ts(&tzif);
- while (!ts.atEnd()) {
- const QString line = ts.readLine();
- // Comment lines are prefixed with a #
- if (!line.isEmpty() && line.at(0) != '#') {
- // Data rows are tab-separated columns Region, Coordinates, ID, Optional Comments
- const auto parts = line.splitRef(QLatin1Char('\t'));
- QTzTimeZone zone;
- zone.country = QLocalePrivate::codeToCountry(parts.at(0));
- if (parts.size() > 3)
- zone.comment = parts.at(3).toUtf8();
- zonesHash.insert(parts.at(2).toUtf8(), zone);
- }
- }
- return zonesHash;
-}
-
-// Hash of available system tz files as loaded by loadTzTimeZones()
-Q_GLOBAL_STATIC_WITH_ARGS(const QTzTimeZoneHash, tzZones, (loadTzTimeZones()));
-
-/*
- The following is copied and modified from tzfile.h which is in the public domain.
- Copied as no compatibility guarantee and is never system installed.
- See https://github.com/eggert/tz/blob/master/tzfile.h
-*/
-
-#define TZ_MAGIC "TZif"
-#define TZ_MAX_TIMES 1200
-#define TZ_MAX_TYPES 256 // Limited by what (unsigned char)'s can hold
-#define TZ_MAX_CHARS 50 // Maximum number of abbreviation characters
-#define TZ_MAX_LEAPS 50 // Maximum number of leap second corrections
-
-struct QTzHeader {
- char tzh_magic[4]; // TZ_MAGIC
- char tzh_version; // '\0' or '2' as of 2005
- char tzh_reserved[15]; // reserved--must be zero
- quint32 tzh_ttisgmtcnt; // number of trans. time flags
- quint32 tzh_ttisstdcnt; // number of trans. time flags
- quint32 tzh_leapcnt; // number of leap seconds
- quint32 tzh_timecnt; // number of transition times
- quint32 tzh_typecnt; // number of local time types
- quint32 tzh_charcnt; // number of abbr. chars
-};
-
-struct QTzTransition {
- qint64 tz_time; // Transition time
- quint8 tz_typeind; // Type Index
-};
-Q_DECLARE_TYPEINFO(QTzTransition, Q_PRIMITIVE_TYPE);
-
-struct QTzType {
- int tz_gmtoff; // UTC offset in seconds
- bool tz_isdst; // Is DST
- quint8 tz_abbrind; // abbreviation list index
-};
-Q_DECLARE_TYPEINFO(QTzType, Q_PRIMITIVE_TYPE);
-
-
-// TZ File parsing
-
-static QTzHeader parseTzHeader(QDataStream &ds, bool *ok)
-{
- QTzHeader hdr;
- quint8 ch;
- *ok = false;
-
- // Parse Magic, 4 bytes
- ds.readRawData(hdr.tzh_magic, 4);
-
- if (memcmp(hdr.tzh_magic, TZ_MAGIC, 4) != 0 || ds.status() != QDataStream::Ok)
- return hdr;
-
- // Parse Version, 1 byte, before 2005 was '\0', since 2005 a '2', since 2013 a '3'
- ds >> ch;
- hdr.tzh_version = ch;
- if (ds.status() != QDataStream::Ok
- || (hdr.tzh_version != '2' && hdr.tzh_version != '\0' && hdr.tzh_version != '3')) {
- return hdr;
- }
-
- // Parse reserved space, 15 bytes
- ds.readRawData(hdr.tzh_reserved, 15);
- if (ds.status() != QDataStream::Ok)
- return hdr;
-
- // Parse rest of header, 6 x 4-byte transition counts
- ds >> hdr.tzh_ttisgmtcnt >> hdr.tzh_ttisstdcnt >> hdr.tzh_leapcnt >> hdr.tzh_timecnt
- >> hdr.tzh_typecnt >> hdr.tzh_charcnt;
-
- // Check defined maximums
- if (ds.status() != QDataStream::Ok
- || hdr.tzh_timecnt > TZ_MAX_TIMES
- || hdr.tzh_typecnt > TZ_MAX_TYPES
- || hdr.tzh_charcnt > TZ_MAX_CHARS
- || hdr.tzh_leapcnt > TZ_MAX_LEAPS
- || hdr.tzh_ttisgmtcnt > hdr.tzh_typecnt
- || hdr.tzh_ttisstdcnt > hdr.tzh_typecnt) {
- return hdr;
- }
-
- *ok = true;
- return hdr;
-}
-
-static QVector<QTzTransition> parseTzTransitions(QDataStream &ds, int tzh_timecnt, bool longTran)
-{
- QVector<QTzTransition> transitions(tzh_timecnt);
-
- if (longTran) {
- // Parse tzh_timecnt x 8-byte transition times
- for (int i = 0; i < tzh_timecnt && ds.status() == QDataStream::Ok; ++i) {
- ds >> transitions[i].tz_time;
- if (ds.status() != QDataStream::Ok)
- transitions.resize(i);
- }
- } else {
- // Parse tzh_timecnt x 4-byte transition times
- qint32 val;
- for (int i = 0; i < tzh_timecnt && ds.status() == QDataStream::Ok; ++i) {
- ds >> val;
- transitions[i].tz_time = val;
- if (ds.status() != QDataStream::Ok)
- transitions.resize(i);
- }
- }
-
- // Parse tzh_timecnt x 1-byte transition type index
- for (int i = 0; i < tzh_timecnt && ds.status() == QDataStream::Ok; ++i) {
- quint8 typeind;
- ds >> typeind;
- if (ds.status() == QDataStream::Ok)
- transitions[i].tz_typeind = typeind;
- }
-
- return transitions;
-}
-
-static QVector<QTzType> parseTzTypes(QDataStream &ds, int tzh_typecnt)
-{
- QVector<QTzType> types(tzh_typecnt);
-
- // Parse tzh_typecnt x transition types
- for (int i = 0; i < tzh_typecnt && ds.status() == QDataStream::Ok; ++i) {
- QTzType &type = types[i];
- // Parse UTC Offset, 4 bytes
- ds >> type.tz_gmtoff;
- // Parse Is DST flag, 1 byte
- if (ds.status() == QDataStream::Ok)
- ds >> type.tz_isdst;
- // Parse Abbreviation Array Index, 1 byte
- if (ds.status() == QDataStream::Ok)
- ds >> type.tz_abbrind;
- if (ds.status() != QDataStream::Ok)
- types.resize(i);
- }
-
- return types;
-}
-
-static QMap<int, QByteArray> parseTzAbbreviations(QDataStream &ds, int tzh_charcnt, const QVector<QTzType> &types)
-{
- // Parse the abbreviation list which is tzh_charcnt long with '\0' separated strings. The
- // QTzType.tz_abbrind index points to the first char of the abbreviation in the array, not the
- // occurrence in the list. It can also point to a partial string so we need to use the actual typeList
- // index values when parsing. By using a map with tz_abbrind as ordered key we get both index
- // methods in one data structure and can convert the types afterwards.
- QMap<int, QByteArray> map;
- quint8 ch;
- QByteArray input;
- // First parse the full abbrev string
- for (int i = 0; i < tzh_charcnt && ds.status() == QDataStream::Ok; ++i) {
- ds >> ch;
- if (ds.status() == QDataStream::Ok)
- input.append(char(ch));
- else
- return map;
- }
- // Then extract all the substrings pointed to by types
- for (const QTzType &type : types) {
- QByteArray abbrev;
- for (int i = type.tz_abbrind; input.at(i) != '\0'; ++i)
- abbrev.append(input.at(i));
- // Have reached end of an abbreviation, so add to map
- map[type.tz_abbrind] = abbrev;
- }
- return map;
-}
-
-static void parseTzLeapSeconds(QDataStream &ds, int tzh_leapcnt, bool longTran)
-{
- // Parse tzh_leapcnt x pairs of leap seconds
- // We don't use leap seconds, so only read and don't store
- qint32 val;
- if (longTran) {
- // v2 file format, each entry is 12 bytes long
- qint64 time;
- for (int i = 0; i < tzh_leapcnt && ds.status() == QDataStream::Ok; ++i) {
- // Parse Leap Occurrence Time, 8 bytes
- ds >> time;
- // Parse Leap Seconds To Apply, 4 bytes
- if (ds.status() == QDataStream::Ok)
- ds >> val;
- }
- } else {
- // v0 file format, each entry is 8 bytes long
- for (int i = 0; i < tzh_leapcnt && ds.status() == QDataStream::Ok; ++i) {
- // Parse Leap Occurrence Time, 4 bytes
- ds >> val;
- // Parse Leap Seconds To Apply, 4 bytes
- if (ds.status() == QDataStream::Ok)
- ds >> val;
- }
- }
-}
-
-static QVector<QTzType> parseTzIndicators(QDataStream &ds, const QVector<QTzType> &types, int tzh_ttisstdcnt, int tzh_ttisgmtcnt)
-{
- QVector<QTzType> result = types;
- bool temp;
- /*
- Scan and discard indicators.
-
- These indicators are only of use (by the date program) when "handling
- POSIX-style time zone environment variables". The flags here say whether
- the *specification* of the zone gave the time in UTC, local standard time
- or local wall time; but whatever was specified has been digested for us,
- already, by the zone-info compiler (zic), so that the tz_time values read
- from the file (by parseTzTransitions) are all in UTC.
- */
-
- // Scan tzh_ttisstdcnt x 1-byte standard/wall indicators
- for (int i = 0; i < tzh_ttisstdcnt && ds.status() == QDataStream::Ok; ++i)
- ds >> temp;
-
- // Scan tzh_ttisgmtcnt x 1-byte UTC/local indicators
- for (int i = 0; i < tzh_ttisgmtcnt && ds.status() == QDataStream::Ok; ++i)
- ds >> temp;
-
- return result;
-}
-
-static QByteArray parseTzPosixRule(QDataStream &ds)
-{
- // Parse POSIX rule, variable length '\n' enclosed
- QByteArray rule;
-
- quint8 ch;
- ds >> ch;
- if (ch != '\n' || ds.status() != QDataStream::Ok)
- return rule;
- ds >> ch;
- while (ch != '\n' && ds.status() == QDataStream::Ok) {
- rule.append((char)ch);
- ds >> ch;
- }
-
- return rule;
-}
-
-static QDate calculateDowDate(int year, int month, int dayOfWeek, int week)
-{
- QDate date(year, month, 1);
- int startDow = date.dayOfWeek();
- if (startDow <= dayOfWeek)
- date = date.addDays(dayOfWeek - startDow - 7);
- else
- date = date.addDays(dayOfWeek - startDow);
- date = date.addDays(week * 7);
- while (date.month() != month)
- date = date.addDays(-7);
- return date;
-}
-
-static QDate calculatePosixDate(const QByteArray &dateRule, int year)
-{
- // Can start with M, J, or a digit
- if (dateRule.at(0) == 'M') {
- // nth week in month format "Mmonth.week.dow"
- QList<QByteArray> dateParts = dateRule.split('.');
- int month = dateParts.at(0).mid(1).toInt();
- int week = dateParts.at(1).toInt();
- int dow = dateParts.at(2).toInt();
- if (dow == 0)
- ++dow;
- return calculateDowDate(year, month, dow, week);
- } else if (dateRule.at(0) == 'J') {
- // Day of Year ignores Feb 29
- int doy = dateRule.mid(1).toInt();
- QDate date = QDate(year, 1, 1).addDays(doy - 1);
- if (QDate::isLeapYear(date.year()))
- date = date.addDays(-1);
- return date;
- } else {
- // Day of Year includes Feb 29
- int doy = dateRule.toInt();
- return QDate(year, 1, 1).addDays(doy - 1);
- }
-}
-
-// returns the time in seconds, INT_MIN if we failed to parse
-static int parsePosixTime(const char *begin, const char *end)
-{
- // Format "hh[:mm[:ss]]"
- int hour, min = 0, sec = 0;
-
- // Note that the calls to qstrtoll do *not* check the end pointer, which
- // means they proceed until they find a non-digit. We check that we're
- // still in range at the end, but we may have read from past end. It's the
- // caller's responsibility to ensure that begin is part of a
- // null-terminated string.
-
- bool ok = false;
- hour = qstrtoll(begin, &begin, 10, &ok);
- if (!ok || hour < 0)
- return INT_MIN;
- if (begin < end && *begin == ':') {
- // minutes
- ++begin;
- min = qstrtoll(begin, &begin, 10, &ok);
- if (!ok || min < 0)
- return INT_MIN;
-
- if (begin < end && *begin == ':') {
- // seconds
- ++begin;
- sec = qstrtoll(begin, &begin, 10, &ok);
- if (!ok || sec < 0)
- return INT_MIN;
- }
- }
-
- // we must have consumed everything
- if (begin != end)
- return INT_MIN;
-
- return (hour * 60 + min) * 60 + sec;
-}
-
-static QTime parsePosixTransitionTime(const QByteArray &timeRule)
-{
- // Format "hh[:mm[:ss]]"
- int value = parsePosixTime(timeRule.constBegin(), timeRule.constEnd());
- if (value == INT_MIN) {
- // if we failed to parse, return 02:00
- return QTime(2, 0, 0);
- }
- return QTime::fromMSecsSinceStartOfDay(value * 1000);
-}
-
-static int parsePosixOffset(const char *begin, const char *end)
-{
- // Format "[+|-]hh[:mm[:ss]]"
- // note that the sign is inverted because POSIX counts in hours West of GMT
- bool negate = true;
- if (*begin == '+') {
- ++begin;
- } else if (*begin == '-') {
- negate = false;
- ++begin;
- }
-
- int value = parsePosixTime(begin, end);
- if (value == INT_MIN)
- return value;
- return negate ? -value : value;
-}
-
-static inline bool asciiIsLetter(char ch)
-{
- ch |= 0x20; // lowercases if it is a letter, otherwise just corrupts ch
- return ch >= 'a' && ch <= 'z';
-}
-
-namespace {
-
-struct PosixZone
-{
- enum {
- InvalidOffset = INT_MIN,
- };
-
- QString name;
- int offset;
-
- static PosixZone invalid() { return {QString(), InvalidOffset}; }
- static PosixZone parse(const char *&pos, const char *end);
-
- bool hasValidOffset() const Q_DECL_NOTHROW { return offset != InvalidOffset; }
-};
-
-} // unnamed namespace
-
-// Returns the zone name, the offset (in seconds) and advances \a begin to
-// where the parsing ended. Returns a zone of INT_MIN in case an offset
-// couldn't be read.
-PosixZone PosixZone::parse(const char *&pos, const char *end)
-{
- static const char offsetChars[] = "0123456789:";
-
- const char *nameBegin = pos;
- const char *nameEnd;
- Q_ASSERT(pos < end);
-
- if (*pos == '<') {
- nameBegin = pos + 1; // skip the '<'
- nameEnd = nameBegin;
- while (nameEnd < end && *nameEnd != '>') {
- // POSIX says only alphanumeric, but we allow anything
- ++nameEnd;
- }
- pos = nameEnd + 1; // skip the '>'
- } else {
- nameBegin = pos;
- nameEnd = nameBegin;
- while (nameEnd < end && asciiIsLetter(*nameEnd))
- ++nameEnd;
- pos = nameEnd;
- }
- if (nameEnd - nameBegin < 3)
- return invalid(); // name must be at least 3 characters long
-
- // zone offset, form [+-]hh:mm:ss
- const char *zoneBegin = pos;
- const char *zoneEnd = pos;
- if (zoneEnd < end && (zoneEnd[0] == '+' || zoneEnd[0] == '-'))
- ++zoneEnd;
- while (zoneEnd < end) {
- if (strchr(offsetChars, char(*zoneEnd)) == NULL)
- break;
- ++zoneEnd;
- }
-
- QString name = QString::fromUtf8(nameBegin, nameEnd - nameBegin);
- const int offset = zoneEnd > zoneBegin ? parsePosixOffset(zoneBegin, zoneEnd) : InvalidOffset;
- pos = zoneEnd;
- return {std::move(name), offset};
-}
-
-static QVector<QTimeZonePrivate::Data> calculatePosixTransitions(const QByteArray &posixRule,
- int startYear, int endYear,
- qint64 lastTranMSecs)
-{
- QVector<QTimeZonePrivate::Data> result;
-
- // POSIX Format is like "TZ=CST6CDT,M3.2.0/2:00:00,M11.1.0/2:00:00"
- // i.e. "std offset dst [offset],start[/time],end[/time]"
- // See the section about TZ at
- // http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap08.html
- QList<QByteArray> parts = posixRule.split(',');
-
- PosixZone stdZone, dstZone = PosixZone::invalid();
- {
- const QByteArray &zoneinfo = parts.at(0);
- const char *begin = zoneinfo.constBegin();
-
- stdZone = PosixZone::parse(begin, zoneinfo.constEnd());
- if (!stdZone.hasValidOffset()) {
- stdZone.offset = 0; // reset to UTC if we failed to parse
- } else if (begin < zoneinfo.constEnd()) {
- dstZone = PosixZone::parse(begin, zoneinfo.constEnd());
- if (!dstZone.hasValidOffset()) {
- // if the dst offset isn't provided, it is 1 hour ahead of the standard offset
- dstZone.offset = stdZone.offset + (60 * 60);
- }
- }
- }
-
- // If only the name part then no transitions
- if (parts.count() == 1) {
- QTimeZonePrivate::Data data;
- data.atMSecsSinceEpoch = lastTranMSecs;
- data.offsetFromUtc = stdZone.offset;
- data.standardTimeOffset = stdZone.offset;
- data.daylightTimeOffset = 0;
- data.abbreviation = stdZone.name;
- result << data;
- return result;
- }
-
-
- // Get the std to dst transtion details
- QList<QByteArray> dstParts = parts.at(1).split('/');
- QByteArray dstDateRule = dstParts.at(0);
- QTime dstTime;
- if (dstParts.count() > 1)
- dstTime = parsePosixTransitionTime(dstParts.at(1));
- else
- dstTime = QTime(2, 0, 0);
-
- // Get the dst to std transtion details
- QList<QByteArray> stdParts = parts.at(2).split('/');
- QByteArray stdDateRule = stdParts.at(0);
- QTime stdTime;
- if (stdParts.count() > 1)
- stdTime = parsePosixTransitionTime(stdParts.at(1));
- else
- stdTime = QTime(2, 0, 0);
-
- // Limit year to the range QDateTime can represent:
- const int minYear = int(QDateTimePrivate::YearRange::First);
- const int maxYear = int(QDateTimePrivate::YearRange::Last);
- startYear = qBound(minYear, startYear, maxYear);
- endYear = qBound(minYear, endYear, maxYear);
- Q_ASSERT(startYear <= endYear);
-
- for (int year = startYear; year <= endYear; ++year) {
- QTimeZonePrivate::Data dstData;
- QDateTime dst(calculatePosixDate(dstDateRule, year), dstTime, Qt::UTC);
- dstData.atMSecsSinceEpoch = dst.toMSecsSinceEpoch() - (stdZone.offset * 1000);
- dstData.offsetFromUtc = dstZone.offset;
- dstData.standardTimeOffset = stdZone.offset;
- dstData.daylightTimeOffset = dstZone.offset - stdZone.offset;
- dstData.abbreviation = dstZone.name;
- QTimeZonePrivate::Data stdData;
- QDateTime std(calculatePosixDate(stdDateRule, year), stdTime, Qt::UTC);
- stdData.atMSecsSinceEpoch = std.toMSecsSinceEpoch() - (dstZone.offset * 1000);
- stdData.offsetFromUtc = stdZone.offset;
- stdData.standardTimeOffset = stdZone.offset;
- stdData.daylightTimeOffset = 0;
- stdData.abbreviation = stdZone.name;
- // Part of maxYear will overflow (likewise for minYear, below):
- if (year == maxYear && (dstData.atMSecsSinceEpoch < 0 || stdData.atMSecsSinceEpoch < 0)) {
- if (dstData.atMSecsSinceEpoch > 0) {
- result << dstData;
- } else if (stdData.atMSecsSinceEpoch > 0) {
- result << stdData;
- }
- } else if (year < 1970) { // We ignore DST before the epoch.
- if (year > minYear || stdData.atMSecsSinceEpoch != QTimeZonePrivate::invalidMSecs())
- result << stdData;
- } else if (dst < std) {
- result << dstData << stdData;
- } else {
- result << stdData << dstData;
- }
- }
- return result;
-}
-
-// Create the system default time zone
-QTzTimeZonePrivate::QTzTimeZonePrivate()
-{
- init(systemTimeZoneId());
-}
-
-// Create a named time zone
-QTzTimeZonePrivate::QTzTimeZonePrivate(const QByteArray &ianaId)
-{
- init(ianaId);
-}
-
-QTzTimeZonePrivate::~QTzTimeZonePrivate()
-{
-}
-
-QTzTimeZonePrivate *QTzTimeZonePrivate::clone() const
-{
- return new QTzTimeZonePrivate(*this);
-}
-
-void QTzTimeZonePrivate::init(const QByteArray &ianaId)
-{
- QFile tzif;
- if (ianaId.isEmpty()) {
- // Open system tz
- tzif.setFileName(QStringLiteral("/etc/localtime"));
- if (!tzif.open(QIODevice::ReadOnly))
- return;
- } else {
- // Open named tz, try modern path first, if fails try legacy path
- tzif.setFileName(QLatin1String("/usr/share/zoneinfo/") + QString::fromLocal8Bit(ianaId));
- if (!tzif.open(QIODevice::ReadOnly)) {
- tzif.setFileName(QLatin1String("/usr/lib/zoneinfo/") + QString::fromLocal8Bit(ianaId));
- if (!tzif.open(QIODevice::ReadOnly))
- return;
- }
- }
-
- QDataStream ds(&tzif);
-
- // Parse the old version block of data
- bool ok = false;
- QTzHeader hdr = parseTzHeader(ds, &ok);
- if (!ok || ds.status() != QDataStream::Ok)
- return;
- QVector<QTzTransition> tranList = parseTzTransitions(ds, hdr.tzh_timecnt, false);
- if (ds.status() != QDataStream::Ok)
- return;
- QVector<QTzType> typeList = parseTzTypes(ds, hdr.tzh_typecnt);
- if (ds.status() != QDataStream::Ok)
- return;
- QMap<int, QByteArray> abbrevMap = parseTzAbbreviations(ds, hdr.tzh_charcnt, typeList);
- if (ds.status() != QDataStream::Ok)
- return;
- parseTzLeapSeconds(ds, hdr.tzh_leapcnt, false);
- if (ds.status() != QDataStream::Ok)
- return;
- typeList = parseTzIndicators(ds, typeList, hdr.tzh_ttisstdcnt, hdr.tzh_ttisgmtcnt);
- if (ds.status() != QDataStream::Ok)
- return;
-
- // If version 2 then parse the second block of data
- if (hdr.tzh_version == '2' || hdr.tzh_version == '3') {
- ok = false;
- QTzHeader hdr2 = parseTzHeader(ds, &ok);
- if (!ok || ds.status() != QDataStream::Ok)
- return;
- tranList = parseTzTransitions(ds, hdr2.tzh_timecnt, true);
- if (ds.status() != QDataStream::Ok)
- return;
- typeList = parseTzTypes(ds, hdr2.tzh_typecnt);
- if (ds.status() != QDataStream::Ok)
- return;
- abbrevMap = parseTzAbbreviations(ds, hdr2.tzh_charcnt, typeList);
- if (ds.status() != QDataStream::Ok)
- return;
- parseTzLeapSeconds(ds, hdr2.tzh_leapcnt, true);
- if (ds.status() != QDataStream::Ok)
- return;
- typeList = parseTzIndicators(ds, typeList, hdr2.tzh_ttisstdcnt, hdr2.tzh_ttisgmtcnt);
- if (ds.status() != QDataStream::Ok)
- return;
- m_posixRule = parseTzPosixRule(ds);
- if (ds.status() != QDataStream::Ok)
- return;
- }
-
- // Translate the TZ file into internal format
-
- // Translate the array index based tz_abbrind into list index
- const int size = abbrevMap.size();
- m_abbreviations.clear();
- m_abbreviations.reserve(size);
- QVector<int> abbrindList;
- abbrindList.reserve(size);
- for (auto it = abbrevMap.cbegin(), end = abbrevMap.cend(); it != end; ++it) {
- m_abbreviations.append(it.value());
- abbrindList.append(it.key());
- }
- for (int i = 0; i < typeList.size(); ++i)
- typeList[i].tz_abbrind = abbrindList.indexOf(typeList.at(i).tz_abbrind);
-
- // Offsets are stored as total offset, want to know separate UTC and DST offsets
- // so find the first non-dst transition to use as base UTC Offset
- int utcOffset = 0;
- for (const QTzTransition &tran : qAsConst(tranList)) {
- if (!typeList.at(tran.tz_typeind).tz_isdst) {
- utcOffset = typeList.at(tran.tz_typeind).tz_gmtoff;
- break;
- }
- }
-
- // Now for each transition time calculate and store our rule:
- const int tranCount = tranList.count();;
- m_tranTimes.reserve(tranCount);
- // The DST offset when in effect: usually stable, usually an hour:
- int lastDstOff = 3600;
- for (int i = 0; i < tranCount; i++) {
- const QTzTransition &tz_tran = tranList.at(i);
- QTzTransitionTime tran;
- QTzTransitionRule rule;
- const QTzType tz_type = typeList.at(tz_tran.tz_typeind);
-
- // Calculate the associated Rule
- if (!tz_type.tz_isdst) {
- utcOffset = tz_type.tz_gmtoff;
- } else if (Q_UNLIKELY(tz_type.tz_gmtoff != utcOffset + lastDstOff)) {
- /*
- This might be a genuine change in DST offset, but could also be
- DST starting at the same time as the standard offset changed. See
- if DST's end gives a more plausible utcOffset (i.e. one closer to
- the last we saw, or a simple whole hour):
- */
- // Standard offset inferred from net offset and expected DST offset:
- const int inferStd = tz_type.tz_gmtoff - lastDstOff; // != utcOffset
- for (int j = i + 1; j < tranCount; j++) {
- const QTzType new_type = typeList.at(tranList.at(j).tz_typeind);
- if (!new_type.tz_isdst) {
- const int newUtc = new_type.tz_gmtoff;
- if (newUtc == utcOffset) {
- // DST-end can't help us, avoid lots of messy checks.
- // else: See if the end matches the familiar DST offset:
- } else if (newUtc == inferStd) {
- utcOffset = newUtc;
- // else: let either end shift us to one hour as DST offset:
- } else if (tz_type.tz_gmtoff - 3600 == utcOffset) {
- // Start does it
- } else if (tz_type.tz_gmtoff - 3600 == newUtc) {
- utcOffset = newUtc; // End does it
- // else: prefer whichever end gives DST offset closer to
- // last, but consider any offset > 0 "closer" than any <= 0:
- } else if (newUtc < tz_type.tz_gmtoff
- ? (utcOffset >= tz_type.tz_gmtoff
- || qAbs(newUtc - inferStd) < qAbs(utcOffset - inferStd))
- : (utcOffset >= tz_type.tz_gmtoff
- && qAbs(newUtc - inferStd) < qAbs(utcOffset - inferStd))) {
- utcOffset = newUtc;
- }
- break;
- }
- }
- lastDstOff = tz_type.tz_gmtoff - utcOffset;
- }
- rule.stdOffset = utcOffset;
- rule.dstOffset = tz_type.tz_gmtoff - utcOffset;
- rule.abbreviationIndex = tz_type.tz_abbrind;
-
- // If the rule already exist then use that, otherwise add it
- int ruleIndex = m_tranRules.indexOf(rule);
- if (ruleIndex == -1) {
- m_tranRules.append(rule);
- tran.ruleIndex = m_tranRules.size() - 1;
- } else {
- tran.ruleIndex = ruleIndex;
- }
-
- tran.atMSecsSinceEpoch = tz_tran.tz_time * 1000;
- m_tranTimes.append(tran);
- }
- if (m_tranTimes.isEmpty() && m_posixRule.isEmpty())
- return; // Invalid after all !
-
- if (ianaId.isEmpty())
- m_id = systemTimeZoneId();
- else
- m_id = ianaId;
-}
-
-QLocale::Country QTzTimeZonePrivate::country() const
-{
- return tzZones->value(m_id).country;
-}
-
-QString QTzTimeZonePrivate::comment() const
-{
- return QString::fromUtf8(tzZones->value(m_id).comment);
-}
-
-QString QTzTimeZonePrivate::displayName(qint64 atMSecsSinceEpoch,
- QTimeZone::NameType nameType,
- const QLocale &locale) const
-{
-#if QT_CONFIG(icu)
- if (!m_icu)
- m_icu = new QIcuTimeZonePrivate(m_id);
- // TODO small risk may not match if tran times differ due to outdated files
- // TODO Some valid TZ names are not valid ICU names, use translation table?
- if (m_icu->isValid())
- return m_icu->displayName(atMSecsSinceEpoch, nameType, locale);
-#else
- Q_UNUSED(nameType)
- Q_UNUSED(locale)
-#endif
- return abbreviation(atMSecsSinceEpoch);
-}
-
-QString QTzTimeZonePrivate::displayName(QTimeZone::TimeType timeType,
- QTimeZone::NameType nameType,
- const QLocale &locale) const
-{
-#if QT_CONFIG(icu)
- if (!m_icu)
- m_icu = new QIcuTimeZonePrivate(m_id);
- // TODO small risk may not match if tran times differ due to outdated files
- // TODO Some valid TZ names are not valid ICU names, use translation table?
- if (m_icu->isValid())
- return m_icu->displayName(timeType, nameType, locale);
-#else
- Q_UNUSED(timeType)
- Q_UNUSED(nameType)
- Q_UNUSED(locale)
-#endif
- // If no ICU available then have to use abbreviations instead
- // Abbreviations don't have GenericTime
- if (timeType == QTimeZone::GenericTime)
- timeType = QTimeZone::StandardTime;
-
- // Get current tran, if valid and is what we want, then use it
- const qint64 currentMSecs = QDateTime::currentMSecsSinceEpoch();
- QTimeZonePrivate::Data tran = data(currentMSecs);
- if (tran.atMSecsSinceEpoch != invalidMSecs()
- && ((timeType == QTimeZone::DaylightTime && tran.daylightTimeOffset != 0)
- || (timeType == QTimeZone::StandardTime && tran.daylightTimeOffset == 0))) {
- return tran.abbreviation;
- }
-
- // Otherwise get next tran and if valid and is what we want, then use it
- tran = nextTransition(currentMSecs);
- if (tran.atMSecsSinceEpoch != invalidMSecs()
- && ((timeType == QTimeZone::DaylightTime && tran.daylightTimeOffset != 0)
- || (timeType == QTimeZone::StandardTime && tran.daylightTimeOffset == 0))) {
- return tran.abbreviation;
- }
-
- // Otherwise get prev tran and if valid and is what we want, then use it
- tran = previousTransition(currentMSecs);
- if (tran.atMSecsSinceEpoch != invalidMSecs())
- tran = previousTransition(tran.atMSecsSinceEpoch);
- if (tran.atMSecsSinceEpoch != invalidMSecs()
- && ((timeType == QTimeZone::DaylightTime && tran.daylightTimeOffset != 0)
- || (timeType == QTimeZone::StandardTime && tran.daylightTimeOffset == 0))) {
- return tran.abbreviation;
- }
-
- // Otherwise is strange sequence, so work backwards through trans looking for first match, if any
- auto it = std::partition_point(m_tranTimes.cbegin(), m_tranTimes.cend(),
- [currentMSecs](const QTzTransitionTime &at) {
- return at.atMSecsSinceEpoch <= currentMSecs;
- });
-
- while (it != m_tranTimes.cbegin()) {
- --it;
- tran = dataForTzTransition(*it);
- int offset = tran.daylightTimeOffset;
- if ((timeType == QTimeZone::DaylightTime) != (offset == 0))
- return tran.abbreviation;
- }
-
- // Otherwise if no match use current data
- return data(currentMSecs).abbreviation;
-}
-
-QString QTzTimeZonePrivate::abbreviation(qint64 atMSecsSinceEpoch) const
-{
- return data(atMSecsSinceEpoch).abbreviation;
-}
-
-int QTzTimeZonePrivate::offsetFromUtc(qint64 atMSecsSinceEpoch) const
-{
- const QTimeZonePrivate::Data tran = data(atMSecsSinceEpoch);
- return tran.offsetFromUtc; // == tran.standardTimeOffset + tran.daylightTimeOffset
-}
-
-int QTzTimeZonePrivate::standardTimeOffset(qint64 atMSecsSinceEpoch) const
-{
- return data(atMSecsSinceEpoch).standardTimeOffset;
-}
-
-int QTzTimeZonePrivate::daylightTimeOffset(qint64 atMSecsSinceEpoch) const
-{
- return data(atMSecsSinceEpoch).daylightTimeOffset;
-}
-
-bool QTzTimeZonePrivate::hasDaylightTime() const
-{
- // TODO Perhaps cache as frequently accessed?
- for (const QTzTransitionRule &rule : m_tranRules) {
- if (rule.dstOffset != 0)
- return true;
- }
- return false;
-}
-
-bool QTzTimeZonePrivate::isDaylightTime(qint64 atMSecsSinceEpoch) const
-{
- return (daylightTimeOffset(atMSecsSinceEpoch) != 0);
-}
-
-QTimeZonePrivate::Data QTzTimeZonePrivate::dataForTzTransition(QTzTransitionTime tran) const
-{
- QTimeZonePrivate::Data data;
- data.atMSecsSinceEpoch = tran.atMSecsSinceEpoch;
- QTzTransitionRule rule = m_tranRules.at(tran.ruleIndex);
- data.standardTimeOffset = rule.stdOffset;
- data.daylightTimeOffset = rule.dstOffset;
- data.offsetFromUtc = rule.stdOffset + rule.dstOffset;
- data.abbreviation = QString::fromUtf8(m_abbreviations.at(rule.abbreviationIndex));
- return data;
-}
-
-QVector<QTimeZonePrivate::Data> QTzTimeZonePrivate::getPosixTransitions(qint64 msNear) const
-{
- const int year = QDateTime::fromMSecsSinceEpoch(msNear, Qt::UTC).date().year();
- // The Data::atMSecsSinceEpoch of the single entry if zone is constant:
- qint64 atTime = m_tranTimes.isEmpty() ? msNear : m_tranTimes.last().atMSecsSinceEpoch;
- return calculatePosixTransitions(m_posixRule, year - 1, year + 1, atTime);
-}
-
-QTimeZonePrivate::Data QTzTimeZonePrivate::data(qint64 forMSecsSinceEpoch) const
-{
- // If the required time is after the last transition (or there were none)
- // and we have a POSIX rule, then use it:
- if (!m_posixRule.isEmpty()
- && (m_tranTimes.isEmpty() || m_tranTimes.last().atMSecsSinceEpoch < forMSecsSinceEpoch)) {
- QVector<QTimeZonePrivate::Data> posixTrans = getPosixTransitions(forMSecsSinceEpoch);
- auto it = std::partition_point(posixTrans.cbegin(), posixTrans.cend(),
- [forMSecsSinceEpoch] (const QTimeZonePrivate::Data &at) {
- return at.atMSecsSinceEpoch <= forMSecsSinceEpoch;
- });
- // Use most recent, if any in the past; or the first if we have no other rules:
- if (it > posixTrans.cbegin() || (m_tranTimes.isEmpty() && it < posixTrans.cend())) {
- QTimeZonePrivate::Data data = *(it > posixTrans.cbegin() ? it - 1 : it);
- data.atMSecsSinceEpoch = forMSecsSinceEpoch;
- return data;
- }
- }
- if (m_tranTimes.isEmpty()) // Only possible if !isValid()
- return invalidData();
-
- // Otherwise, use the rule for the most recent or first transition:
- auto last = std::partition_point(m_tranTimes.cbegin(), m_tranTimes.cend(),
- [forMSecsSinceEpoch] (const QTzTransitionTime &at) {
- return at.atMSecsSinceEpoch <= forMSecsSinceEpoch;
- });
- if (last > m_tranTimes.cbegin())
- --last;
- Data data = dataForTzTransition(*last);
- data.atMSecsSinceEpoch = forMSecsSinceEpoch;
- return data;
-}
-
-bool QTzTimeZonePrivate::hasTransitions() const
-{
- return true;
-}
-
-QTimeZonePrivate::Data QTzTimeZonePrivate::nextTransition(qint64 afterMSecsSinceEpoch) const
-{
- // If the required time is after the last transition (or there were none)
- // and we have a POSIX rule, then use it:
- if (!m_posixRule.isEmpty()
- && (m_tranTimes.isEmpty() || m_tranTimes.last().atMSecsSinceEpoch < afterMSecsSinceEpoch)) {
- QVector<QTimeZonePrivate::Data> posixTrans = getPosixTransitions(afterMSecsSinceEpoch);
- auto it = std::partition_point(posixTrans.cbegin(), posixTrans.cend(),
- [afterMSecsSinceEpoch] (const QTimeZonePrivate::Data &at) {
- return at.atMSecsSinceEpoch <= afterMSecsSinceEpoch;
- });
-
- return it == posixTrans.cend() ? invalidData() : *it;
- }
-
- // Otherwise, if we can find a valid tran, use its rule:
- auto last = std::partition_point(m_tranTimes.cbegin(), m_tranTimes.cend(),
- [afterMSecsSinceEpoch] (const QTzTransitionTime &at) {
- return at.atMSecsSinceEpoch <= afterMSecsSinceEpoch;
- });
- return last != m_tranTimes.cend() ? dataForTzTransition(*last) : invalidData();
-}
-
-QTimeZonePrivate::Data QTzTimeZonePrivate::previousTransition(qint64 beforeMSecsSinceEpoch) const
-{
- // If the required time is after the last transition (or there were none)
- // and we have a POSIX rule, then use it:
- if (!m_posixRule.isEmpty()
- && (m_tranTimes.isEmpty() || m_tranTimes.last().atMSecsSinceEpoch < beforeMSecsSinceEpoch)) {
- QVector<QTimeZonePrivate::Data> posixTrans = getPosixTransitions(beforeMSecsSinceEpoch);
- auto it = std::partition_point(posixTrans.cbegin(), posixTrans.cend(),
- [beforeMSecsSinceEpoch] (const QTimeZonePrivate::Data &at) {
- return at.atMSecsSinceEpoch < beforeMSecsSinceEpoch;
- });
- if (it > posixTrans.cbegin())
- return *--it;
- // It fell between the last transition (if any) and the first of the POSIX rule:
- return m_tranTimes.isEmpty() ? invalidData() : dataForTzTransition(m_tranTimes.last());
- }
-
- // Otherwise if we can find a valid tran then use its rule
- auto last = std::partition_point(m_tranTimes.cbegin(), m_tranTimes.cend(),
- [beforeMSecsSinceEpoch] (const QTzTransitionTime &at) {
- return at.atMSecsSinceEpoch < beforeMSecsSinceEpoch;
- });
- return last > m_tranTimes.cbegin() ? dataForTzTransition(*--last) : invalidData();
-}
-
-static long getSymloopMax()
-{
-#if defined(SYMLOOP_MAX)
- return SYMLOOP_MAX; // if defined, at runtime it can only be greater than this, so this is a safe bet
-#else
- errno = 0;
- long result = sysconf(_SC_SYMLOOP_MAX);
- if (result >= 0)
- return result;
- // result is -1, meaning either error or no limit
- Q_ASSERT(!errno); // ... but it can't be an error, POSIX mandates _SC_SYMLOOP_MAX
-
- // therefore we can make up our own limit
-# if defined(MAXSYMLINKS)
- return MAXSYMLINKS;
-# else
- return 8;
-# endif
-#endif
-}
-
-// TODO Could cache the value and monitor the required files for any changes
-QByteArray QTzTimeZonePrivate::systemTimeZoneId() const
-{
- // Check TZ env var first, if not populated try find it
- QByteArray ianaId = qgetenv("TZ");
- if (!ianaId.isEmpty() && ianaId.at(0) == ':')
- ianaId = ianaId.mid(1);
-
- // The TZ value can be ":/etc/localtime" which libc considers
- // to be a "default timezone", in which case it will be read
- // by one of the blocks below, so unset it here so it is not
- // considered as a valid/found ianaId
- if (ianaId == "/etc/localtime")
- ianaId.clear();
-
- // On most distros /etc/localtime is a symlink to a real file so extract name from the path
- if (ianaId.isEmpty()) {
- const QLatin1String zoneinfo("/zoneinfo/");
- QString path = QFile::symLinkTarget(QStringLiteral("/etc/localtime"));
- int index = -1;
- long iteration = getSymloopMax();
- // Symlink may point to another symlink etc. before being under zoneinfo/
- // We stop on the first path under /zoneinfo/, even if it is itself a
- // symlink, like America/Montreal pointing to America/Toronto
- while (iteration-- > 0 && !path.isEmpty() && (index = path.indexOf(zoneinfo)) < 0)
- path = QFile::symLinkTarget(path);
- if (index >= 0) {
- // /etc/localtime is a symlink to the current TZ file, so extract from path
- ianaId = path.mid(index + zoneinfo.size()).toUtf8();
- }
- }
-
- // On Debian Etch up to Jessie, /etc/localtime is a regular file while the actual name is in /etc/timezone
- if (ianaId.isEmpty()) {
- QFile tzif(QStringLiteral("/etc/timezone"));
- if (tzif.open(QIODevice::ReadOnly)) {
- // TODO QTextStream inefficient, replace later
- QTextStream ts(&tzif);
- if (!ts.atEnd())
- ianaId = ts.readLine().toUtf8();
- }
- }
-
- // On some Red Hat distros /etc/localtime is real file with name held in /etc/sysconfig/clock
- // in a line like ZONE="Europe/Oslo" or TIMEZONE="Europe/Oslo"
- if (ianaId.isEmpty()) {
- QFile tzif(QStringLiteral("/etc/sysconfig/clock"));
- if (tzif.open(QIODevice::ReadOnly)) {
- // TODO QTextStream inefficient, replace later
- QTextStream ts(&tzif);
- QString line;
- while (ianaId.isEmpty() && !ts.atEnd() && ts.status() == QTextStream::Ok) {
- line = ts.readLine();
- if (line.startsWith(QLatin1String("ZONE="))) {
- ianaId = line.mid(6, line.size() - 7).toUtf8();
- } else if (line.startsWith(QLatin1String("TIMEZONE="))) {
- ianaId = line.mid(10, line.size() - 11).toUtf8();
- }
- }
- }
- }
-
- // Give up for now and return UTC
- if (ianaId.isEmpty())
- ianaId = utcQByteArray();
-
- return ianaId;
-}
-
-bool QTzTimeZonePrivate::isTimeZoneIdAvailable(const QByteArray &ianaId) const
-{
- return tzZones->contains(ianaId);
-}
-
-QList<QByteArray> QTzTimeZonePrivate::availableTimeZoneIds() const
-{
- QList<QByteArray> result = tzZones->keys();
- std::sort(result.begin(), result.end());
- return result;
-}
-
-QList<QByteArray> QTzTimeZonePrivate::availableTimeZoneIds(QLocale::Country country) const
-{
- // TODO AnyCountry
- QList<QByteArray> result;
- for (auto it = tzZones->cbegin(), end = tzZones->cend(); it != end; ++it) {
- if (it.value().country == country)
- result << it.key();
- }
- std::sort(result.begin(), result.end());
- return result;
-}
-
-QT_END_NAMESPACE
diff --git a/src/corelib/tools/qtimezoneprivate_win.cpp b/src/corelib/tools/qtimezoneprivate_win.cpp
deleted file mode 100644
index 1bf2366748..0000000000
--- a/src/corelib/tools/qtimezoneprivate_win.cpp
+++ /dev/null
@@ -1,927 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2013 John Layt <jlayt@kde.org>
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#include "qtimezone.h"
-#include "qtimezoneprivate_p.h"
-
-#include "qdatetime.h"
-
-#include "qdebug.h"
-
-#include <algorithm>
-
-QT_BEGIN_NAMESPACE
-
-#ifndef Q_OS_WINRT
-// The registry-based timezone backend is not available on WinRT, which falls back to equivalent APIs.
-#define QT_USE_REGISTRY_TIMEZONE 1
-#endif
-
-/*
- Private
-
- Windows system implementation
-*/
-
-#define MAX_KEY_LENGTH 255
-#define FILETIME_UNIX_EPOCH Q_UINT64_C(116444736000000000)
-
-// MSDN home page for Time support
-// http://msdn.microsoft.com/en-us/library/windows/desktop/ms724962%28v=vs.85%29.aspx
-
-// For Windows XP and later refer to MSDN docs on TIME_ZONE_INFORMATION structure
-// http://msdn.microsoft.com/en-gb/library/windows/desktop/ms725481%28v=vs.85%29.aspx
-
-// Vista introduced support for historic data, see MSDN docs on DYNAMIC_TIME_ZONE_INFORMATION
-// http://msdn.microsoft.com/en-gb/library/windows/desktop/ms724253%28v=vs.85%29.aspx
-#ifdef QT_USE_REGISTRY_TIMEZONE
-static const char tzRegPath[] = "SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Time Zones";
-static const char currTzRegPath[] = "SYSTEM\\CurrentControlSet\\Control\\TimeZoneInformation";
-#endif
-
-enum {
- MIN_YEAR = -292275056,
- MAX_YEAR = 292278994,
- MSECS_PER_DAY = 86400000,
- TIME_T_MAX = 2145916799, // int maximum 2037-12-31T23:59:59 UTC
- JULIAN_DAY_FOR_EPOCH = 2440588 // result of julianDayFromDate(1970, 1, 1)
-};
-
-// Copied from MSDN, see above for link
-typedef struct _REG_TZI_FORMAT
-{
- LONG Bias;
- LONG StandardBias;
- LONG DaylightBias;
- SYSTEMTIME StandardDate;
- SYSTEMTIME DaylightDate;
-} REG_TZI_FORMAT;
-
-namespace {
-
-// Fast and reliable conversion from msecs to date for all values
-// Adapted from QDateTime msecsToDate
-QDate msecsToDate(qint64 msecs)
-{
- qint64 jd = JULIAN_DAY_FOR_EPOCH;
-
- if (qAbs(msecs) >= MSECS_PER_DAY) {
- jd += (msecs / MSECS_PER_DAY);
- msecs %= MSECS_PER_DAY;
- }
-
- if (msecs < 0) {
- qint64 ds = MSECS_PER_DAY - msecs - 1;
- jd -= ds / MSECS_PER_DAY;
- }
-
- return QDate::fromJulianDay(jd);
-}
-
-bool equalSystemtime(const SYSTEMTIME &t1, const SYSTEMTIME &t2)
-{
- return (t1.wYear == t2.wYear
- && t1.wMonth == t2.wMonth
- && t1.wDay == t2.wDay
- && t1.wDayOfWeek == t2.wDayOfWeek
- && t1.wHour == t2.wHour
- && t1.wMinute == t2.wMinute
- && t1.wSecond == t2.wSecond
- && t1.wMilliseconds == t2.wMilliseconds);
-}
-
-bool equalTzi(const TIME_ZONE_INFORMATION &tzi1, const TIME_ZONE_INFORMATION &tzi2)
-{
- return(tzi1.Bias == tzi2.Bias
- && tzi1.StandardBias == tzi2.StandardBias
- && equalSystemtime(tzi1.StandardDate, tzi2.StandardDate)
- && wcscmp(tzi1.StandardName, tzi2.StandardName) == 0
- && tzi1.DaylightBias == tzi2.DaylightBias
- && equalSystemtime(tzi1.DaylightDate, tzi2.DaylightDate)
- && wcscmp(tzi1.DaylightName, tzi2.DaylightName) == 0);
-}
-
-#ifdef QT_USE_REGISTRY_TIMEZONE
-bool openRegistryKey(const QString &keyPath, HKEY *key)
-{
- return RegOpenKeyEx(HKEY_LOCAL_MACHINE, reinterpret_cast<const wchar_t*>(keyPath.utf16()),
- 0, KEY_READ, key) == ERROR_SUCCESS;
-}
-
-QString readRegistryString(const HKEY &key, const wchar_t *value)
-{
- wchar_t buffer[MAX_PATH] = {0};
- DWORD size = sizeof(wchar_t) * MAX_PATH;
- RegQueryValueEx(key, value, nullptr, nullptr, reinterpret_cast<LPBYTE>(buffer), &size);
- return QString::fromWCharArray(buffer);
-}
-
-int readRegistryValue(const HKEY &key, const wchar_t *value)
-{
- DWORD buffer;
- DWORD size = sizeof(buffer);
- RegQueryValueEx(key, value, nullptr, nullptr, reinterpret_cast<LPBYTE>(&buffer), &size);
- return buffer;
-}
-
-QWinTimeZonePrivate::QWinTransitionRule readRegistryRule(const HKEY &key,
- const wchar_t *value, bool *ok)
-{
- *ok = false;
- QWinTimeZonePrivate::QWinTransitionRule rule;
- REG_TZI_FORMAT tzi;
- DWORD tziSize = sizeof(tzi);
- if (RegQueryValueEx(key, value, nullptr, nullptr, reinterpret_cast<BYTE *>(&tzi), &tziSize)
- == ERROR_SUCCESS) {
- rule.startYear = 0;
- rule.standardTimeBias = tzi.Bias + tzi.StandardBias;
- rule.daylightTimeBias = tzi.Bias + tzi.DaylightBias - rule.standardTimeBias;
- rule.standardTimeRule = tzi.StandardDate;
- rule.daylightTimeRule = tzi.DaylightDate;
- *ok = true;
- }
- return rule;
-}
-
-TIME_ZONE_INFORMATION getRegistryTzi(const QByteArray &windowsId, bool *ok)
-{
- *ok = false;
- TIME_ZONE_INFORMATION tzi;
- REG_TZI_FORMAT regTzi;
- DWORD regTziSize = sizeof(regTzi);
- HKEY key = NULL;
- const QString tziKeyPath = QString::fromUtf8(tzRegPath) + QLatin1Char('\\')
- + QString::fromUtf8(windowsId);
-
- if (openRegistryKey(tziKeyPath, &key)) {
-
- DWORD size = sizeof(tzi.DaylightName);
- RegQueryValueEx(key, L"Dlt", nullptr, nullptr, reinterpret_cast<LPBYTE>(tzi.DaylightName), &size);
-
- size = sizeof(tzi.StandardName);
- RegQueryValueEx(key, L"Std", nullptr, nullptr, reinterpret_cast<LPBYTE>(tzi.StandardName), &size);
-
- if (RegQueryValueEx(key, L"TZI", nullptr, nullptr, reinterpret_cast<BYTE *>(&regTzi), &regTziSize)
- == ERROR_SUCCESS) {
- tzi.Bias = regTzi.Bias;
- tzi.StandardBias = regTzi.StandardBias;
- tzi.DaylightBias = regTzi.DaylightBias;
- tzi.StandardDate = regTzi.StandardDate;
- tzi.DaylightDate = regTzi.DaylightDate;
- *ok = true;
- }
-
- RegCloseKey(key);
- }
-
- return tzi;
-}
-#else // QT_USE_REGISTRY_TIMEZONE
-struct QWinDynamicTimeZone
-{
- QString standardName;
- QString daylightName;
- QString timezoneName;
- qint32 bias;
- bool daylightTime;
-};
-
-typedef QHash<QByteArray, QWinDynamicTimeZone> QWinRTTimeZoneHash;
-
-Q_GLOBAL_STATIC(QWinRTTimeZoneHash, gTimeZones)
-
-void enumerateTimeZones()
-{
- DYNAMIC_TIME_ZONE_INFORMATION dtzInfo;
- quint32 index = 0;
- QString prevTimeZoneKeyName;
- while (SUCCEEDED(EnumDynamicTimeZoneInformation(index++, &dtzInfo))) {
- QWinDynamicTimeZone item;
- item.timezoneName = QString::fromWCharArray(dtzInfo.TimeZoneKeyName);
- // As soon as key name repeats, break. Some systems continue to always
- // return the last item independent of index being out of range
- if (item.timezoneName == prevTimeZoneKeyName)
- break;
- item.standardName = QString::fromWCharArray(dtzInfo.StandardName);
- item.daylightName = QString::fromWCharArray(dtzInfo.DaylightName);
- item.daylightTime = !dtzInfo.DynamicDaylightTimeDisabled;
- item.bias = dtzInfo.Bias;
- gTimeZones->insert(item.timezoneName.toUtf8(), item);
- prevTimeZoneKeyName = item.timezoneName;
- }
-}
-
-DYNAMIC_TIME_ZONE_INFORMATION dynamicInfoForId(const QByteArray &windowsId)
-{
- DYNAMIC_TIME_ZONE_INFORMATION dtzInfo;
- quint32 index = 0;
- QString prevTimeZoneKeyName;
- while (SUCCEEDED(EnumDynamicTimeZoneInformation(index++, &dtzInfo))) {
- const QString timeZoneName = QString::fromWCharArray(dtzInfo.TimeZoneKeyName);
- if (timeZoneName == QLatin1String(windowsId))
- break;
- if (timeZoneName == prevTimeZoneKeyName)
- break;
- prevTimeZoneKeyName = timeZoneName;
- }
- return dtzInfo;
-}
-
-QWinTimeZonePrivate::QWinTransitionRule
-readDynamicRule(DYNAMIC_TIME_ZONE_INFORMATION &dtzi, int year, bool *ok)
-{
- TIME_ZONE_INFORMATION tzi;
- QWinTimeZonePrivate::QWinTransitionRule rule;
- *ok = GetTimeZoneInformationForYear(year, &dtzi, &tzi);
- if (*ok) {
- rule.startYear = 0;
- rule.standardTimeBias = tzi.Bias + tzi.StandardBias;
- rule.daylightTimeBias = tzi.Bias + tzi.DaylightBias - rule.standardTimeBias;
- rule.standardTimeRule = tzi.StandardDate;
- rule.daylightTimeRule = tzi.DaylightDate;
- }
- return rule;
-}
-#endif // QT_USE_REGISTRY_TIMEZONE
-
-bool isSameRule(const QWinTimeZonePrivate::QWinTransitionRule &last,
- const QWinTimeZonePrivate::QWinTransitionRule &rule)
-{
- // In particular, when this is true and either wYear is 0, so is the other;
- // so if one rule is recurrent and they're equal, so is the other. If
- // either rule *isn't* recurrent, it has non-0 wYear which shall be
- // different from the other's. Note that we don't compare .startYear, since
- // that will always be different.
- return equalSystemtime(last.standardTimeRule, rule.standardTimeRule)
- && equalSystemtime(last.daylightTimeRule, rule.daylightTimeRule)
- && last.standardTimeBias == rule.standardTimeBias
- && last.daylightTimeBias == rule.daylightTimeBias;
-}
-
-QList<QByteArray> availableWindowsIds()
-{
-#ifdef QT_USE_REGISTRY_TIMEZONE
- // TODO Consider caching results in a global static, very unlikely to change.
- QList<QByteArray> list;
- HKEY key = NULL;
- if (openRegistryKey(QString::fromUtf8(tzRegPath), &key)) {
- DWORD idCount = 0;
- if (RegQueryInfoKey(key, 0, 0, 0, &idCount, 0, 0, 0, 0, 0, 0, 0) == ERROR_SUCCESS
- && idCount > 0) {
- for (DWORD i = 0; i < idCount; ++i) {
- DWORD maxLen = MAX_KEY_LENGTH;
- TCHAR buffer[MAX_KEY_LENGTH];
- if (RegEnumKeyEx(key, i, buffer, &maxLen, 0, 0, 0, 0) == ERROR_SUCCESS)
- list.append(QString::fromWCharArray(buffer).toUtf8());
- }
- }
- RegCloseKey(key);
- }
- return list;
-#else // QT_USE_REGISTRY_TIMEZONE
- if (gTimeZones->isEmpty())
- enumerateTimeZones();
- return gTimeZones->keys();
-#endif // QT_USE_REGISTRY_TIMEZONE
-}
-
-QByteArray windowsSystemZoneId()
-{
-#ifdef QT_USE_REGISTRY_TIMEZONE
- // On Vista and later is held in the value TimeZoneKeyName in key currTzRegPath
- QString id;
- HKEY key = NULL;
- QString tziKeyPath = QString::fromUtf8(currTzRegPath);
- if (openRegistryKey(tziKeyPath, &key)) {
- id = readRegistryString(key, L"TimeZoneKeyName");
- RegCloseKey(key);
- if (!id.isEmpty())
- return std::move(id).toUtf8();
- }
-
- // On XP we have to iterate over the zones until we find a match on
- // names/offsets with the current data
- TIME_ZONE_INFORMATION sysTzi;
- GetTimeZoneInformation(&sysTzi);
- bool ok = false;
- const auto winIds = availableWindowsIds();
- for (const QByteArray &winId : winIds) {
- if (equalTzi(getRegistryTzi(winId, &ok), sysTzi))
- return winId;
- }
-#else // QT_USE_REGISTRY_TIMEZONE
- DYNAMIC_TIME_ZONE_INFORMATION dtzi;
- if (SUCCEEDED(GetDynamicTimeZoneInformation(&dtzi)))
- return QString::fromWCharArray(dtzi.TimeZoneKeyName).toLocal8Bit();
-#endif // QT_USE_REGISTRY_TIMEZONE
-
- // If we can't determine the current ID use UTC
- return QTimeZonePrivate::utcQByteArray();
-}
-
-QDate calculateTransitionLocalDate(const SYSTEMTIME &rule, int year)
-{
- // If month is 0 then there is no date
- if (rule.wMonth == 0)
- return QDate();
-
- // Interpret SYSTEMTIME according to the slightly quirky rules in:
- // https://msdn.microsoft.com/en-us/library/windows/desktop/ms725481(v=vs.85).aspx
-
- // If the year is set, the rule gives an absolute date:
- if (rule.wYear)
- return QDate(rule.wYear, rule.wMonth, rule.wDay);
-
- // Otherwise, the rule date is annual and relative:
- const int dayOfWeek = rule.wDayOfWeek == 0 ? 7 : rule.wDayOfWeek;
- QDate date(year, rule.wMonth, 1);
- // How many days before was last dayOfWeek before target month ?
- int adjust = dayOfWeek - date.dayOfWeek(); // -6 <= adjust < 7
- if (adjust >= 0) // Ensure -7 <= adjust < 0:
- adjust -= 7;
- // Normally, wDay is day-within-month; but here it is 1 for the first
- // of the given dayOfWeek in the month, through 4 for the fourth or ...
- adjust += (rule.wDay < 1 ? 1 : rule.wDay > 4 ? 5 : rule.wDay) * 7;
- date = date.addDays(adjust);
- // ... 5 for the last; so back up by weeks to get within the month:
- if (date.month() != rule.wMonth) {
- Q_ASSERT(rule.wDay > 4);
- // (Note that, with adjust < 0, date <= 28th of our target month
- // is guaranteed when wDay <= 4, or after our first -7 here.)
- date = date.addDays(-7);
- Q_ASSERT(date.month() == rule.wMonth);
- }
- return date;
-}
-
-// Converts a date/time value into msecs
-inline qint64 timeToMSecs(const QDate &date, const QTime &time)
-{
- return ((date.toJulianDay() - JULIAN_DAY_FOR_EPOCH) * MSECS_PER_DAY)
- + time.msecsSinceStartOfDay();
-}
-
-qint64 calculateTransitionForYear(const SYSTEMTIME &rule, int year, int bias)
-{
- // TODO Consider caching the calculated values - i.e. replace SYSTEMTIME in
- // WinTransitionRule; do this in init() once and store the results.
- const QDate date = calculateTransitionLocalDate(rule, year);
- const QTime time = QTime(rule.wHour, rule.wMinute, rule.wSecond);
- if (date.isValid() && time.isValid())
- return timeToMSecs(date, time) + bias * 60000;
- return QTimeZonePrivate::invalidMSecs();
-}
-
-struct TransitionTimePair
-{
- // Transition times after the epoch, in ms:
- qint64 std, dst;
- // If either is invalidMSecs(), which shall then be < the other, there is no
- // DST and the other describes a change in actual standard offset.
-
- TransitionTimePair(const QWinTimeZonePrivate::QWinTransitionRule &rule,
- int year, int oldYearOffset)
- // The local time in Daylight Time of the switch to Standard Time
- : std(calculateTransitionForYear(rule.standardTimeRule, year,
- rule.standardTimeBias + rule.daylightTimeBias)),
- // The local time in Standard Time of the switch to Daylight Time
- dst(calculateTransitionForYear(rule.daylightTimeRule, year, rule.standardTimeBias))
- {
- /*
- Check for potential "fake DST", used by MS's APIs because the
- TIME_ZONE_INFORMATION spec either expresses no transitions in the
- year, or expresses a transition of each kind, even if standard time
- did change in a year with no DST. We've seen year-start fake-DST
- (whose offset matches prior standard offset, in which the previous
- year ended); and conjecture that similar might be used at a year-end.
- (This might be used for a southern-hemisphere zone, where the start of
- the year usually is in DST, when applicable.) Note that, here, wDay
- identifies an instance of a given day-of-week in the month, with 5
- meaning last.
-
- Either the alleged standardTimeRule or the alleged daylightTimeRule
- may be faked; either way, the transition is actually a change to the
- current standard offset; but the unfaked half of the rule contains the
- useful bias data, so we have to go along with its lies.
-
- Example: Russia/Moscow
- Format: -bias +( -stdBias, stdDate | -dstBias, dstDate ) notes
- Last year of DST, 2010: 180 +( 0, 0-10-5 3:0 | 60, 0-3-5 2:0 ) normal DST
- Zone change in 2011: 180 +( 0, 0-1-1 0:0 | 60 0-3-5 2:0 ) fake DST at transition
- Fixed standard in 2012: 240 +( 0, 0-0-0 0:0 | 60, 0-0-0 0:0 ) standard time years
- Zone change in 2014: 180 +( 0, 0-10-5 2:0 | 60, 0-1-1 0:0 ) fake DST at year-start
- The last of these is missing on Win7 VMs (too old to know about it).
- */
- if (rule.daylightTimeRule.wMonth == 1 && rule.daylightTimeRule.wDay == 1) {
- // Fake "DST transition" at start of year producing the same offset as
- // previous year ended in.
- if (rule.standardTimeBias + rule.daylightTimeBias == oldYearOffset)
- dst = QTimeZonePrivate::invalidMSecs();
- } else if (rule.daylightTimeRule.wMonth == 12 && rule.daylightTimeRule.wDay > 3) {
- // Similar, conjectured, for end of year, not changing offset.
- if (rule.daylightTimeBias == 0)
- dst = QTimeZonePrivate::invalidMSecs();
- }
- if (rule.standardTimeRule.wMonth == 1 && rule.standardTimeRule.wDay == 1) {
- // Fake "transition out of DST" at start of year producing the same
- // offset as previous year ended in.
- if (rule.standardTimeBias == oldYearOffset)
- std = QTimeZonePrivate::invalidMSecs();
- } else if (rule.standardTimeRule.wMonth == 12 && rule.standardTimeRule.wDay > 3) {
- // Similar, conjectured, for end of year, not changing offset.
- if (rule.daylightTimeBias == 0)
- std = QTimeZonePrivate::invalidMSecs();
- }
- }
-
- bool fakesDst() const
- {
- return std == QTimeZonePrivate::invalidMSecs()
- || dst == QTimeZonePrivate::invalidMSecs();
- }
-};
-
-int yearEndOffset(const QWinTimeZonePrivate::QWinTransitionRule &rule, int year)
-{
- int offset = rule.standardTimeBias;
- // Only needed to help another TransitionTimePair work out year + 1's start
- // offset; and the oldYearOffset we use only affects an alleged transition
- // at the *start* of this year, so it doesn't matter if we guess wrong here:
- TransitionTimePair pair(rule, year, offset);
- if (pair.dst > pair.std)
- offset += rule.daylightTimeBias;
- return offset;
-}
-
-QLocale::Country userCountry()
-{
- const GEOID id = GetUserGeoID(GEOCLASS_NATION);
- wchar_t code[3];
- const int size = GetGeoInfo(id, GEO_ISO2, code, 3, 0);
- return (size == 3) ? QLocalePrivate::codeToCountry(QStringView(code, size))
- : QLocale::AnyCountry;
-}
-
-// Index of last rule in rules with .startYear <= year:
-int ruleIndexForYear(const QList<QWinTimeZonePrivate::QWinTransitionRule> &rules, int year)
-{
- if (rules.last().startYear <= year)
- return rules.count() - 1;
- // We don't have a rule for before the first, but the first is the best we can offer:
- if (rules.first().startYear > year)
- return 0;
-
- // Otherwise, use binary chop:
- int lo = 0, hi = rules.count();
- // invariant: rules[i].startYear <= year < rules[hi].startYear
- // subject to treating rules[rules.count()] as "off the end of time"
- while (lo + 1 < hi) {
- const int mid = (lo + hi) / 2;
- // lo + 2 <= hi, so lo + 1 <= mid <= hi - 1, so lo < mid < hi
- // In particular, mid < rules.count()
- const int midYear = rules.at(mid).startYear;
- if (midYear > year)
- hi = mid;
- else if (midYear < year)
- lo = mid;
- else // No two rules have the same startYear:
- return mid;
- }
- return lo;
-}
-
-} // anonymous namespace
-
-// Create the system default time zone
-QWinTimeZonePrivate::QWinTimeZonePrivate()
- : QTimeZonePrivate()
-{
- init(QByteArray());
-}
-
-// Create a named time zone
-QWinTimeZonePrivate::QWinTimeZonePrivate(const QByteArray &ianaId)
- : QTimeZonePrivate()
-{
- init(ianaId);
-}
-
-QWinTimeZonePrivate::QWinTimeZonePrivate(const QWinTimeZonePrivate &other)
- : QTimeZonePrivate(other), m_windowsId(other.m_windowsId),
- m_displayName(other.m_displayName), m_standardName(other.m_standardName),
- m_daylightName(other.m_daylightName), m_tranRules(other.m_tranRules)
-{
-}
-
-QWinTimeZonePrivate::~QWinTimeZonePrivate()
-{
-}
-
-QWinTimeZonePrivate *QWinTimeZonePrivate::clone() const
-{
- return new QWinTimeZonePrivate(*this);
-}
-
-void QWinTimeZonePrivate::init(const QByteArray &ianaId)
-{
- if (ianaId.isEmpty()) {
- m_windowsId = windowsSystemZoneId();
- m_id = systemTimeZoneId();
- } else {
- m_windowsId = ianaIdToWindowsId(ianaId);
- m_id = ianaId;
- }
-
- bool badMonth = false; // Only warn once per zone, if at all.
- if (!m_windowsId.isEmpty()) {
-#ifdef QT_USE_REGISTRY_TIMEZONE
- // Open the base TZI for the time zone
- HKEY baseKey = NULL;
- const QString baseKeyPath = QString::fromUtf8(tzRegPath) + QLatin1Char('\\')
- + QString::fromUtf8(m_windowsId);
- if (openRegistryKey(baseKeyPath, &baseKey)) {
- // Load the localized names
- m_displayName = readRegistryString(baseKey, L"Display");
- m_standardName = readRegistryString(baseKey, L"Std");
- m_daylightName = readRegistryString(baseKey, L"Dlt");
- // On Vista and later the optional dynamic key holds historic data
- const QString dynamicKeyPath = baseKeyPath + QLatin1String("\\Dynamic DST");
- HKEY dynamicKey = NULL;
- if (openRegistryKey(dynamicKeyPath, &dynamicKey)) {
- // Find out the start and end years stored, then iterate over them
- int startYear = readRegistryValue(dynamicKey, L"FirstEntry");
- int endYear = readRegistryValue(dynamicKey, L"LastEntry");
- for (int year = startYear; year <= endYear; ++year) {
- bool ruleOk;
- QWinTransitionRule rule = readRegistryRule(dynamicKey,
- reinterpret_cast<LPCWSTR>(QString::number(year).utf16()),
- &ruleOk);
- if (ruleOk
- // Don't repeat a recurrent rule:
- && (m_tranRules.isEmpty()
- || !isSameRule(m_tranRules.last(), rule))) {
- if (!badMonth
- && (rule.standardTimeRule.wMonth == 0)
- != (rule.daylightTimeRule.wMonth == 0)) {
- badMonth = true;
- qWarning("MS registry TZ API violated its wMonth constraint;"
- "this may cause mistakes for %s from %d",
- ianaId.constData(), year);
- }
- rule.startYear = m_tranRules.isEmpty() ? MIN_YEAR : year;
- m_tranRules.append(rule);
- }
- }
- RegCloseKey(dynamicKey);
- } else {
- // No dynamic data so use the base data
- bool ruleOk;
- QWinTransitionRule rule = readRegistryRule(baseKey, L"TZI", &ruleOk);
- rule.startYear = MIN_YEAR;
- if (ruleOk)
- m_tranRules.append(rule);
- }
- RegCloseKey(baseKey);
- }
-#else // QT_USE_REGISTRY_TIMEZONE
- if (gTimeZones->isEmpty())
- enumerateTimeZones();
- QWinRTTimeZoneHash::const_iterator it = gTimeZones->find(m_windowsId);
- if (it != gTimeZones->constEnd()) {
- m_displayName = it->timezoneName;
- m_standardName = it->standardName;
- m_daylightName = it->daylightName;
- DWORD firstYear = 0;
- DWORD lastYear = 0;
- DYNAMIC_TIME_ZONE_INFORMATION dtzi = dynamicInfoForId(m_windowsId);
- if (GetDynamicTimeZoneInformationEffectiveYears(&dtzi, &firstYear, &lastYear)
- == ERROR_SUCCESS && firstYear < lastYear) {
- for (DWORD year = firstYear; year <= lastYear; ++year) {
- bool ok = false;
- QWinTransitionRule rule = readDynamicRule(dtzi, year, &ok);
- if (ok
- // Don't repeat a recurrent rule
- && (m_tranRules.isEmpty()
- || !isSameRule(m_tranRules.last(), rule))) {
- if (!badMonth
- && (rule.standardTimeRule.wMonth == 0)
- != (rule.daylightTimeRule.wMonth == 0)) {
- badMonth = true;
- qWarning("MS dynamic TZ API violated its wMonth constraint;"
- "this may cause mistakes for %s from %d",
- ianaId.constData(), year);
- }
- rule.startYear = m_tranRules.isEmpty() ? MIN_YEAR : year;
- m_tranRules.append(rule);
- }
- }
- } else {
- // At least try to get the non-dynamic data:
- dtzi.DynamicDaylightTimeDisabled = false;
- bool ok = false;
- QWinTransitionRule rule = readDynamicRule(dtzi, 1970, &ok);
- if (ok) {
- rule.startYear = MIN_YEAR;
- m_tranRules.append(rule);
- }
- }
- }
-#endif // QT_USE_REGISTRY_TIMEZONE
- }
-
- // If there are no rules then we failed to find a windowsId or any tzi info
- if (m_tranRules.size() == 0) {
- m_id.clear();
- m_windowsId.clear();
- m_displayName.clear();
- }
-}
-
-QString QWinTimeZonePrivate::comment() const
-{
- return m_displayName;
-}
-
-QString QWinTimeZonePrivate::displayName(QTimeZone::TimeType timeType,
- QTimeZone::NameType nameType,
- const QLocale &locale) const
-{
- // TODO Registry holds MUI keys, should be able to look up translations?
- Q_UNUSED(locale);
-
- if (nameType == QTimeZone::OffsetName) {
- const QWinTransitionRule &rule =
- m_tranRules.at(ruleIndexForYear(m_tranRules, QDate::currentDate().year()));
- int offset = rule.standardTimeBias;
- if (timeType == QTimeZone::DaylightTime)
- offset += rule.daylightTimeBias;
- return isoOffsetFormat(offset * -60);
- }
-
- switch (timeType) {
- case QTimeZone::DaylightTime :
- return m_daylightName;
- case QTimeZone::GenericTime :
- return m_displayName;
- case QTimeZone::StandardTime :
- return m_standardName;
- }
- return m_standardName;
-}
-
-QString QWinTimeZonePrivate::abbreviation(qint64 atMSecsSinceEpoch) const
-{
- return data(atMSecsSinceEpoch).abbreviation;
-}
-
-int QWinTimeZonePrivate::offsetFromUtc(qint64 atMSecsSinceEpoch) const
-{
- return data(atMSecsSinceEpoch).offsetFromUtc;
-}
-
-int QWinTimeZonePrivate::standardTimeOffset(qint64 atMSecsSinceEpoch) const
-{
- return data(atMSecsSinceEpoch).standardTimeOffset;
-}
-
-int QWinTimeZonePrivate::daylightTimeOffset(qint64 atMSecsSinceEpoch) const
-{
- return data(atMSecsSinceEpoch).daylightTimeOffset;
-}
-
-bool QWinTimeZonePrivate::hasDaylightTime() const
-{
- return hasTransitions();
-}
-
-bool QWinTimeZonePrivate::isDaylightTime(qint64 atMSecsSinceEpoch) const
-{
- return (data(atMSecsSinceEpoch).daylightTimeOffset != 0);
-}
-
-QTimeZonePrivate::Data QWinTimeZonePrivate::data(qint64 forMSecsSinceEpoch) const
-{
- int year = msecsToDate(forMSecsSinceEpoch).year();
- for (int ruleIndex = ruleIndexForYear(m_tranRules, year);
- ruleIndex >= 0; --ruleIndex) {
- const QWinTransitionRule &rule = m_tranRules.at(ruleIndex);
- // Does this rule's period include any transition at all ?
- if (rule.standardTimeRule.wMonth > 0 || rule.daylightTimeRule.wMonth > 0) {
- const int endYear = qMax(rule.startYear, year - 1);
- while (year >= endYear) {
- const int newYearOffset = (year <= rule.startYear && ruleIndex > 0)
- ? yearEndOffset(m_tranRules.at(ruleIndex - 1), year - 1)
- : yearEndOffset(rule, year - 1);
- const TransitionTimePair pair(rule, year, newYearOffset);
- bool isDst = false;
- if (pair.std != invalidMSecs() && pair.std <= forMSecsSinceEpoch) {
- isDst = pair.std < pair.dst && pair.dst <= forMSecsSinceEpoch;
- } else if (pair.dst != invalidMSecs() && pair.dst <= forMSecsSinceEpoch) {
- isDst = true;
- } else {
- --year; // Try an earlier year for this rule (once).
- continue;
- }
- return ruleToData(rule, forMSecsSinceEpoch,
- isDst ? QTimeZone::DaylightTime : QTimeZone::StandardTime,
- pair.fakesDst());
- }
- // Fell off start of rule, try previous rule.
- } else {
- // No transition, no DST, use the year's standard time.
- return ruleToData(rule, forMSecsSinceEpoch, QTimeZone::StandardTime);
- }
- if (year >= rule.startYear)
- year = rule.startYear - 1; // Seek last transition in new rule.
- }
- // We don't have relevant data :-(
- return invalidData();
-}
-
-bool QWinTimeZonePrivate::hasTransitions() const
-{
- for (const QWinTransitionRule &rule : m_tranRules) {
- if (rule.standardTimeRule.wMonth > 0 && rule.daylightTimeRule.wMonth > 0)
- return true;
- }
- return false;
-}
-
-QTimeZonePrivate::Data QWinTimeZonePrivate::nextTransition(qint64 afterMSecsSinceEpoch) const
-{
- int year = msecsToDate(afterMSecsSinceEpoch).year();
- for (int ruleIndex = ruleIndexForYear(m_tranRules, year);
- ruleIndex < m_tranRules.count(); ++ruleIndex) {
- const QWinTransitionRule &rule = m_tranRules.at(ruleIndex);
- // Does this rule's period include any transition at all ?
- if (rule.standardTimeRule.wMonth > 0 || rule.daylightTimeRule.wMonth > 0) {
- if (year < rule.startYear)
- year = rule.startYear; // Seek first transition in this rule.
- const int endYear = ruleIndex + 1 < m_tranRules.count()
- ? qMin(m_tranRules.at(ruleIndex + 1).startYear, year + 2) : (year + 2);
- int newYearOffset = (year <= rule.startYear && ruleIndex > 0)
- ? yearEndOffset(m_tranRules.at(ruleIndex - 1), year - 1)
- : yearEndOffset(rule, year - 1);
- while (year < endYear) {
- const TransitionTimePair pair(rule, year, newYearOffset);
- bool isDst = false;
- Q_ASSERT(invalidMSecs() <= afterMSecsSinceEpoch); // invalid is min qint64
- if (pair.std > afterMSecsSinceEpoch) {
- isDst = pair.std > pair.dst && pair.dst > afterMSecsSinceEpoch;
- } else if (pair.dst > afterMSecsSinceEpoch) {
- isDst = true;
- } else {
- newYearOffset = rule.standardTimeBias;
- if (pair.dst > pair.std)
- newYearOffset += rule.daylightTimeBias;
- ++year; // Try a later year for this rule (once).
- continue;
- }
-
- if (isDst)
- return ruleToData(rule, pair.dst, QTimeZone::DaylightTime, pair.fakesDst());
- return ruleToData(rule, pair.std, QTimeZone::StandardTime, pair.fakesDst());
- }
- // Fell off end of rule, try next rule.
- } // else: no transition during rule's period
- }
- // Apparently no transition after the given time:
- return invalidData();
-}
-
-QTimeZonePrivate::Data QWinTimeZonePrivate::previousTransition(qint64 beforeMSecsSinceEpoch) const
-{
- const qint64 startOfTime = invalidMSecs() + 1;
- if (beforeMSecsSinceEpoch <= startOfTime)
- return invalidData();
-
- int year = msecsToDate(beforeMSecsSinceEpoch).year();
- for (int ruleIndex = ruleIndexForYear(m_tranRules, year);
- ruleIndex >= 0; --ruleIndex) {
- const QWinTransitionRule &rule = m_tranRules.at(ruleIndex);
- // Does this rule's period include any transition at all ?
- if (rule.standardTimeRule.wMonth > 0 || rule.daylightTimeRule.wMonth > 0) {
- const int endYear = qMax(rule.startYear, year - 1);
- while (year >= endYear) {
- const int newYearOffset = (year <= rule.startYear && ruleIndex > 0)
- ? yearEndOffset(m_tranRules.at(ruleIndex - 1), year - 1)
- : yearEndOffset(rule, year - 1);
- const TransitionTimePair pair(rule, year, newYearOffset);
- bool isDst = false;
- if (pair.std != invalidMSecs() && pair.std < beforeMSecsSinceEpoch) {
- isDst = pair.std < pair.dst && pair.dst < beforeMSecsSinceEpoch;
- } else if (pair.dst != invalidMSecs() && pair.dst < beforeMSecsSinceEpoch) {
- isDst = true;
- } else {
- --year; // Try an earlier year for this rule (once).
- continue;
- }
- if (isDst)
- return ruleToData(rule, pair.dst, QTimeZone::DaylightTime, pair.fakesDst());
- return ruleToData(rule, pair.std, QTimeZone::StandardTime, pair.fakesDst());
- }
- // Fell off start of rule, try previous rule.
- } else if (ruleIndex == 0) {
- // Treat a no-transition first rule as a transition at the start of
- // time, so that a scan through all rules *does* see it as the first
- // rule:
- return ruleToData(rule, startOfTime, QTimeZone::StandardTime, false);
- } // else: no transition during rule's period
- if (year >= rule.startYear)
- year = rule.startYear - 1; // Seek last transition in new rule
- }
- // Apparently no transition before the given time:
- return invalidData();
-}
-
-QByteArray QWinTimeZonePrivate::systemTimeZoneId() const
-{
- const QLocale::Country country = userCountry();
- const QByteArray windowsId = windowsSystemZoneId();
- QByteArray ianaId;
- // If we have a real country, then try get a specific match for that country
- if (country != QLocale::AnyCountry)
- ianaId = windowsIdToDefaultIanaId(windowsId, country);
- // If we don't have a real country, or there wasn't a specific match, try the global default
- if (ianaId.isEmpty()) {
- ianaId = windowsIdToDefaultIanaId(windowsId);
- // If no global default then probably an unknown Windows ID so return UTC
- if (ianaId.isEmpty())
- return utcQByteArray();
- }
- return ianaId;
-}
-
-QList<QByteArray> QWinTimeZonePrivate::availableTimeZoneIds() const
-{
- QList<QByteArray> result;
- const auto winIds = availableWindowsIds();
- for (const QByteArray &winId : winIds)
- result += windowsIdToIanaIds(winId);
- std::sort(result.begin(), result.end());
- result.erase(std::unique(result.begin(), result.end()), result.end());
- return result;
-}
-
-QTimeZonePrivate::Data QWinTimeZonePrivate::ruleToData(const QWinTransitionRule &rule,
- qint64 atMSecsSinceEpoch,
- QTimeZone::TimeType type,
- bool fakeDst) const
-{
- Data tran = invalidData();
- tran.atMSecsSinceEpoch = atMSecsSinceEpoch;
- tran.standardTimeOffset = rule.standardTimeBias * -60;
- if (fakeDst) {
- tran.daylightTimeOffset = 0;
- tran.abbreviation = m_standardName;
- // Rule may claim we're in DST when it's actually a standard time change:
- if (type == QTimeZone::DaylightTime)
- tran.standardTimeOffset += rule.daylightTimeBias * -60;
- } else if (type == QTimeZone::DaylightTime) {
- tran.daylightTimeOffset = rule.daylightTimeBias * -60;
- tran.abbreviation = m_daylightName;
- } else {
- tran.daylightTimeOffset = 0;
- tran.abbreviation = m_standardName;
- }
- tran.offsetFromUtc = tran.standardTimeOffset + tran.daylightTimeOffset;
- return tran;
-}
-
-QT_END_NAMESPACE
diff --git a/src/corelib/tools/qtools_p.h b/src/corelib/tools/qtools_p.h
index 17d2ab852a..d48318b474 100644
--- a/src/corelib/tools/qtools_p.h
+++ b/src/corelib/tools/qtools_p.h
@@ -1,6 +1,6 @@
/****************************************************************************
**
-** Copyright (C) 2016 The Qt Company Ltd.
+** Copyright (C) 2019 The Qt Company Ltd.
** Contact: https://www.qt.io/licensing/
**
** This file is part of the QtCore module of the Qt Toolkit.
@@ -57,17 +57,17 @@
QT_BEGIN_NAMESPACE
namespace QtMiscUtils {
-Q_DECL_CONSTEXPR inline char toHexUpper(uint value) Q_DECL_NOTHROW
+Q_DECL_CONSTEXPR inline char toHexUpper(uint value) noexcept
{
return "0123456789ABCDEF"[value & 0xF];
}
-Q_DECL_CONSTEXPR inline char toHexLower(uint value) Q_DECL_NOTHROW
+Q_DECL_CONSTEXPR inline char toHexLower(uint value) noexcept
{
return "0123456789abcdef"[value & 0xF];
}
-Q_DECL_CONSTEXPR inline int fromHex(uint c) Q_DECL_NOTHROW
+Q_DECL_CONSTEXPR inline int fromHex(uint c) noexcept
{
return ((c >= '0') && (c <= '9')) ? int(c - '0') :
((c >= 'A') && (c <= 'F')) ? int(c - 'A' + 10) :
@@ -75,12 +75,12 @@ Q_DECL_CONSTEXPR inline int fromHex(uint c) Q_DECL_NOTHROW
/* otherwise */ -1;
}
-Q_DECL_CONSTEXPR inline char toOct(uint value) Q_DECL_NOTHROW
+Q_DECL_CONSTEXPR inline char toOct(uint value) noexcept
{
return '0' + char(value & 0x7);
}
-Q_DECL_CONSTEXPR inline int fromOct(uint c) Q_DECL_NOTHROW
+Q_DECL_CONSTEXPR inline int fromOct(uint c) noexcept
{
return ((c >= '0') && (c <= '7')) ? int(c - '0') : -1;
}
@@ -96,11 +96,11 @@ struct CalculateGrowingBlockSizeResult {
size_t elementCount;
};
-// implemented in qbytearray.cpp
+// Implemented in qarraydata.cpp:
size_t Q_CORE_EXPORT Q_DECL_CONST_FUNCTION
-qCalculateBlockSize(size_t elementCount, size_t elementSize, size_t headerSize = 0) Q_DECL_NOTHROW;
+qCalculateBlockSize(size_t elementCount, size_t elementSize, size_t headerSize = 0) noexcept;
CalculateGrowingBlockSizeResult Q_CORE_EXPORT Q_DECL_CONST_FUNCTION
-qCalculateGrowingBlockSize(size_t elementCount, size_t elementSize, size_t headerSize = 0) Q_DECL_NOTHROW ;
+qCalculateGrowingBlockSize(size_t elementCount, size_t elementSize, size_t headerSize = 0) noexcept ;
QT_END_NAMESPACE
diff --git a/src/corelib/tools/qunicodetables.cpp b/src/corelib/tools/qunicodetables.cpp
deleted file mode 100644
index 4c4821802d..0000000000
--- a/src/corelib/tools/qunicodetables.cpp
+++ /dev/null
@@ -1,13446 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-/* This file is autogenerated from the Unicode 10.0 database. Do not edit */
-
-#include "qunicodetables_p.h"
-
-QT_BEGIN_NAMESPACE
-
-namespace QUnicodeTables {
-
-static const unsigned short uc_property_trie[] = {
- // [0x0..0x11000)
-
- 6256, 6288, 6320, 6352, 6384, 6416, 6448, 6480,
- 6512, 6544, 6576, 6608, 6640, 6672, 6704, 6736,
- 6768, 6800, 6832, 6864, 6896, 6928, 6960, 6992,
- 7024, 7056, 7088, 7120, 7152, 7184, 7216, 7248,
- 7280, 7312, 7344, 7376, 7408, 7440, 7472, 7504,
- 7536, 7568, 7600, 7632, 7664, 7696, 7728, 7760,
- 7792, 7824, 7856, 7888, 7920, 7952, 7984, 8016,
- 8048, 8080, 8112, 8144, 8176, 8208, 8240, 8272,
- 8304, 8336, 8368, 8400, 8432, 8464, 8496, 8528,
- 8560, 8592, 8624, 8656, 8688, 8720, 8752, 8784,
- 8816, 8848, 8880, 8912, 8944, 8976, 9008, 9040,
- 9072, 9104, 9136, 9168, 9200, 9232, 9264, 9296,
- 9328, 9360, 9392, 9424, 9456, 9488, 9520, 9552,
- 9584, 9616, 9648, 9680, 9712, 9744, 9776, 9808,
- 9840, 9872, 9904, 9936, 9968, 10000, 10032, 9936,
- 10064, 10096, 10128, 10160, 10192, 10224, 10256, 9936,
-
- 10288, 10320, 10352, 10384, 10416, 10448, 10480, 10512,
- 10544, 10544, 10576, 10608, 10640, 10672, 10704, 10736,
- 10768, 10800, 10832, 10800, 10864, 10896, 10928, 10960,
- 10992, 10800, 11024, 11056, 11088, 11120, 11152, 11184,
- 11216, 11248, 11248, 11248, 11248, 11248, 11248, 11248,
- 11248, 11248, 11248, 11248, 11248, 11248, 11248, 11248,
- 11248, 11248, 11248, 11280, 11312, 11344, 11344, 11376,
- 11408, 11440, 11472, 11504, 11536, 11568, 11600, 11632,
- 11664, 11696, 11728, 11760, 11792, 11824, 11856, 11888,
- 11920, 11952, 11984, 12016, 12048, 12080, 12112, 12144,
- 12176, 12208, 12240, 12272, 12304, 12336, 9936, 9936,
- 12368, 12400, 12432, 12464, 12496, 12528, 12560, 12592,
- 12624, 12656, 12688, 12720, 12752, 9936, 12784, 12816,
- 12848, 12880, 12912, 12944, 12976, 13008, 13040, 13072,
- 13104, 13104, 13104, 13104, 13136, 13104, 13104, 13168,
- 13200, 13232, 13264, 13296, 13328, 13360, 13392, 13424,
-
- 13456, 13488, 13520, 13552, 13584, 13616, 13648, 13680,
- 13712, 13744, 13776, 13808, 13840, 13872, 13904, 13936,
- 13968, 14000, 14032, 14064, 14096, 14128, 14160, 14192,
- 14224, 14256, 14288, 14320, 14352, 14384, 14416, 14448,
- 14480, 14512, 14544, 14576, 14608, 14640, 14672, 14704,
- 14480, 14480, 14480, 14480, 14736, 14768, 14800, 14832,
- 14864, 14896, 14928, 14960, 14992, 15024, 15056, 15088,
- 15120, 15152, 15184, 15216, 15248, 15280, 15312, 15344,
- 15376, 15376, 15376, 15376, 15376, 15376, 15376, 15376,
- 15408, 15408, 15408, 15408, 15440, 15472, 15504, 15536,
- 15568, 15600, 15408, 15632, 15664, 15696, 15728, 15760,
- 15792, 15824, 15856, 15888, 15920, 15952, 15984, 16016,
- 16048, 16080, 16112, 16144, 16176, 16176, 16176, 16208,
- 16240, 16272, 16304, 16336, 16368, 16400, 16400, 16432,
- 16464, 16496, 16528, 9936, 16560, 16592, 16592, 16624,
- 16656, 16656, 16656, 16656, 16656, 16656, 16688, 16720,
-
- 16752, 16784, 16816, 16848, 16880, 16912, 16944, 16976,
- 17008, 17040, 17072, 17072, 17104, 17136, 17168, 17200,
- 17232, 17264, 17296, 17328, 17264, 17360, 17392, 17424,
- 17456, 17456, 17488, 17520, 17552, 17552, 17584, 17616,
- 17648, 17648, 17648, 17648, 17648, 17648, 17648, 17648,
- 17648, 17648, 17648, 17648, 17648, 17648, 17648, 17648,
- 17648, 17648, 17648, 17648, 17648, 17648, 17648, 17648,
- 17648, 17648, 17648, 17648, 17648, 17648, 17648, 17648,
- 17648, 17648, 17648, 17648, 17648, 17648, 17648, 17648,
- 17648, 17648, 17648, 17648, 17648, 17648, 17648, 17648,
- 17648, 17648, 17648, 17648, 17648, 17648, 17648, 17648,
- 17648, 17648, 17648, 17648, 17648, 17648, 17648, 17648,
- 17648, 17648, 17648, 17648, 17648, 17648, 17648, 17648,
- 17648, 17648, 17648, 17648, 17648, 17648, 17648, 17648,
- 17648, 17648, 17648, 17648, 17648, 17648, 17648, 17648,
- 17648, 17648, 17648, 17648, 17648, 17648, 17648, 17648,
-
- 17648, 17648, 17648, 17648, 17648, 17648, 17648, 17648,
- 17648, 17648, 17648, 17648, 17648, 17648, 17648, 17648,
- 17648, 17648, 17648, 17648, 17648, 17648, 17648, 17648,
- 17648, 17648, 17648, 17648, 17648, 17648, 17648, 17648,
- 17648, 17648, 17648, 17648, 17648, 17648, 17648, 17648,
- 17648, 17648, 17648, 17648, 17648, 17648, 17648, 17648,
- 17648, 17648, 17648, 17648, 17648, 17648, 17648, 17648,
- 17648, 17648, 17648, 17648, 17648, 17648, 17648, 17648,
- 17648, 17648, 17648, 17648, 17648, 17648, 17648, 17648,
- 17648, 17648, 17648, 17648, 17648, 17648, 17648, 17648,
- 17648, 17648, 17648, 17648, 17648, 17648, 17648, 17648,
- 17648, 17648, 17648, 17648, 17648, 17648, 17648, 17648,
- 17648, 17648, 17648, 17648, 17648, 17648, 17648, 17648,
- 17648, 17648, 17648, 17648, 17648, 17680, 17712, 17712,
- 17744, 17744, 17744, 17744, 17744, 17744, 17744, 17744,
- 17744, 17744, 17744, 17744, 17744, 17744, 17744, 17744,
-
- 17744, 17744, 17744, 17744, 17744, 17744, 17744, 17744,
- 17744, 17744, 17744, 17744, 17744, 17744, 17744, 17744,
- 17744, 17744, 17744, 17744, 17744, 17744, 17744, 17744,
- 17744, 17744, 17744, 17744, 17744, 17744, 17744, 17744,
- 17744, 17744, 17744, 17744, 17744, 17744, 17744, 17744,
- 17744, 17744, 17744, 17744, 17744, 17744, 17744, 17744,
- 17744, 17744, 17744, 17744, 17744, 17744, 17744, 17744,
- 17744, 17744, 17744, 17744, 17744, 17744, 17744, 17744,
- 17744, 17744, 17744, 17744, 17744, 17744, 17744, 17744,
- 17744, 17744, 17744, 17744, 17744, 17744, 17744, 17744,
- 17744, 17744, 17744, 17744, 17744, 17744, 17744, 17744,
- 17744, 17744, 17744, 17744, 17744, 17744, 17744, 17744,
- 17744, 17744, 17744, 17744, 17744, 17744, 17744, 17744,
- 17744, 17744, 17744, 17744, 17744, 17744, 17744, 17744,
- 17744, 17744, 17744, 17744, 17744, 17744, 17744, 17744,
- 17744, 17744, 17744, 17744, 17744, 17744, 17744, 17744,
-
- 17744, 17744, 17744, 17744, 17744, 17744, 17744, 17744,
- 17744, 17744, 17744, 17744, 17744, 17744, 17744, 17744,
- 17744, 17744, 17744, 17744, 17744, 17744, 17744, 17744,
- 17744, 17744, 17744, 17744, 17744, 17744, 17744, 17744,
- 17744, 17744, 17744, 17744, 17744, 17744, 17744, 17744,
- 17744, 17744, 17744, 17744, 17744, 17744, 17744, 17744,
- 17744, 17744, 17744, 17744, 17744, 17744, 17744, 17744,
- 17744, 17744, 17744, 17744, 17744, 17744, 17744, 17744,
- 17744, 17744, 17744, 17744, 17744, 17744, 17744, 17744,
- 17744, 17744, 17744, 17744, 17744, 17744, 17744, 17744,
- 17744, 17744, 17744, 17744, 17744, 17744, 17744, 17744,
- 17744, 17744, 17744, 17744, 17744, 17744, 17744, 17744,
- 17744, 17744, 17744, 17744, 17744, 17744, 17744, 17744,
- 17744, 17744, 17744, 17744, 17744, 17744, 17744, 17744,
- 17744, 17744, 17744, 17744, 17744, 17744, 17744, 17744,
- 17744, 17744, 17744, 17744, 17744, 17744, 17744, 17744,
-
- 17744, 17744, 17744, 17744, 17744, 17744, 17744, 17744,
- 17744, 17744, 17744, 17744, 17744, 17744, 17744, 17744,
- 17744, 17744, 17744, 17744, 17744, 17744, 17744, 17744,
- 17744, 17744, 17744, 17744, 17744, 17744, 17744, 17744,
- 17744, 17744, 17744, 17744, 17744, 17744, 17744, 17744,
- 17744, 17744, 17744, 17744, 17744, 17744, 17744, 17744,
- 17744, 17744, 17744, 17744, 17744, 17744, 17744, 17744,
- 17744, 17744, 17744, 17744, 17744, 17744, 17744, 17744,
- 17744, 17744, 17744, 17744, 17744, 17744, 17744, 17744,
- 17744, 17744, 17744, 17744, 17744, 17744, 17744, 17744,
- 17744, 17744, 17744, 17744, 17744, 17744, 17744, 17744,
- 17744, 17744, 17744, 17744, 17744, 17744, 17744, 17744,
- 17744, 17744, 17744, 17744, 17744, 17744, 17744, 17744,
- 17744, 17744, 17744, 17744, 17744, 17744, 17744, 17744,
- 17744, 17744, 17744, 17744, 17744, 17744, 17744, 17744,
- 17744, 17744, 17744, 17744, 17744, 17744, 17744, 17744,
-
- 17744, 17744, 17744, 17744, 17744, 17744, 17744, 17744,
- 17744, 17744, 17744, 17744, 17744, 17744, 17744, 17744,
- 17744, 17744, 17744, 17744, 17744, 17744, 17744, 17744,
- 17744, 17744, 17744, 17744, 17744, 17744, 17744, 17744,
- 17744, 17744, 17744, 17744, 17744, 17744, 17744, 17744,
- 17744, 17744, 17744, 17744, 17744, 17744, 17744, 17744,
- 17744, 17744, 17744, 17744, 17744, 17744, 17744, 17744,
- 17744, 17744, 17744, 17744, 17744, 17744, 17744, 17744,
- 17744, 17744, 17744, 17744, 17744, 17744, 17744, 17744,
- 17744, 17744, 17744, 17744, 17744, 17744, 17744, 17744,
- 17744, 17744, 17744, 17744, 17744, 17744, 17744, 17744,
- 17744, 17744, 17744, 17744, 17744, 17744, 17744, 17744,
- 17744, 17744, 17744, 17744, 17744, 17744, 17744, 17744,
- 17744, 17744, 17744, 17744, 17744, 17744, 17744, 17744,
- 17744, 17744, 17744, 17744, 17744, 17744, 17744, 17744,
- 17744, 17744, 17744, 17744, 17744, 17744, 17744, 17744,
-
- 17744, 17744, 17744, 17744, 17744, 17744, 17744, 17744,
- 17744, 17744, 17744, 17744, 17744, 17744, 17744, 17744,
- 17744, 17744, 17744, 17744, 17744, 17744, 17744, 17744,
- 17744, 17744, 17744, 17744, 17744, 17744, 17744, 17744,
- 17744, 17744, 17744, 17744, 17744, 17744, 17744, 17744,
- 17744, 17744, 17744, 17744, 17744, 17744, 17744, 17744,
- 17744, 17744, 17744, 17744, 17744, 17744, 17744, 17744,
- 17744, 17744, 17744, 17744, 17744, 17744, 17744, 17744,
- 17744, 17744, 17744, 17744, 17744, 17744, 17744, 17744,
- 17744, 17744, 17744, 17744, 17744, 17744, 17744, 17744,
- 17744, 17744, 17744, 17744, 17744, 17744, 17744, 17744,
- 17744, 17744, 17744, 17744, 17744, 17744, 17744, 17744,
- 17744, 17744, 17744, 17744, 17744, 17744, 17744, 17744,
- 17744, 17744, 17744, 17744, 17744, 17744, 17744, 17744,
- 17744, 17744, 17744, 17744, 17744, 17744, 17744, 17744,
- 17744, 17744, 17744, 17744, 17744, 17776, 17808, 17840,
-
- 17872, 17904, 17904, 17904, 17904, 17904, 17904, 17904,
- 17904, 17904, 17904, 17904, 17904, 17904, 17904, 17904,
- 17904, 17904, 17904, 17904, 17904, 17904, 17904, 17904,
- 17904, 17904, 17904, 17904, 17904, 17904, 17904, 17904,
- 17904, 17904, 17904, 17904, 17936, 17968, 18000, 18032,
- 18064, 18064, 18064, 18064, 18064, 18064, 18064, 18064,
- 18096, 18128, 18160, 18192, 18224, 18256, 18256, 18288,
- 18320, 18352, 18384, 18416, 18448, 18480, 9936, 18512,
- 18544, 18576, 18608, 18640, 18672, 18704, 18736, 18768,
- 18800, 18832, 18864, 18896, 18928, 18960, 18992, 19024,
- 19056, 19088, 19120, 19152, 19184, 19216, 19248, 19280,
- 19312, 19344, 19376, 19408, 19440, 19472, 19504, 19536,
- 19568, 19600, 19632, 19664, 19696, 19728, 19760, 19568,
- 19600, 19632, 19664, 19696, 19728, 19760, 19568, 19600,
- 19632, 19664, 19696, 19728, 19760, 19568, 19600, 19632,
- 19664, 19696, 19728, 19760, 19568, 19600, 19632, 19664,
-
- 19696, 19728, 19760, 19568, 19600, 19632, 19664, 19696,
- 19728, 19760, 19568, 19600, 19632, 19664, 19696, 19728,
- 19760, 19568, 19600, 19632, 19664, 19696, 19728, 19760,
- 19568, 19600, 19632, 19664, 19696, 19728, 19760, 19568,
- 19600, 19632, 19664, 19696, 19728, 19760, 19568, 19600,
- 19632, 19664, 19696, 19728, 19760, 19568, 19600, 19632,
- 19664, 19696, 19728, 19760, 19568, 19600, 19632, 19664,
- 19696, 19728, 19760, 19568, 19600, 19632, 19664, 19696,
- 19728, 19760, 19568, 19600, 19632, 19664, 19696, 19728,
- 19760, 19568, 19600, 19632, 19664, 19696, 19728, 19760,
- 19568, 19600, 19632, 19664, 19696, 19728, 19760, 19568,
- 19600, 19632, 19664, 19696, 19728, 19760, 19568, 19600,
- 19632, 19664, 19696, 19728, 19760, 19568, 19600, 19632,
- 19664, 19696, 19728, 19760, 19568, 19600, 19632, 19664,
- 19696, 19728, 19760, 19568, 19600, 19632, 19664, 19696,
- 19728, 19760, 19568, 19600, 19632, 19664, 19696, 19728,
-
- 19760, 19568, 19600, 19632, 19664, 19696, 19728, 19760,
- 19568, 19600, 19632, 19664, 19696, 19728, 19760, 19568,
- 19600, 19632, 19664, 19696, 19728, 19760, 19568, 19600,
- 19632, 19664, 19696, 19728, 19760, 19568, 19600, 19632,
- 19664, 19696, 19728, 19760, 19568, 19600, 19632, 19664,
- 19696, 19728, 19760, 19568, 19600, 19632, 19664, 19696,
- 19728, 19760, 19568, 19600, 19632, 19664, 19696, 19728,
- 19760, 19568, 19600, 19632, 19664, 19696, 19728, 19760,
- 19568, 19600, 19632, 19664, 19696, 19728, 19760, 19568,
- 19600, 19632, 19664, 19696, 19728, 19760, 19568, 19600,
- 19632, 19664, 19696, 19728, 19760, 19568, 19600, 19632,
- 19664, 19696, 19728, 19760, 19568, 19600, 19632, 19664,
- 19696, 19728, 19760, 19568, 19600, 19632, 19664, 19696,
- 19728, 19760, 19568, 19600, 19632, 19664, 19696, 19728,
- 19760, 19568, 19600, 19632, 19664, 19696, 19728, 19760,
- 19568, 19600, 19632, 19664, 19696, 19728, 19760, 19568,
-
- 19600, 19632, 19664, 19696, 19728, 19760, 19568, 19600,
- 19632, 19664, 19696, 19728, 19760, 19568, 19600, 19632,
- 19664, 19696, 19728, 19760, 19568, 19600, 19632, 19664,
- 19696, 19728, 19760, 19568, 19600, 19632, 19664, 19696,
- 19728, 19760, 19568, 19600, 19632, 19664, 19696, 19728,
- 19760, 19568, 19600, 19632, 19664, 19696, 19728, 19760,
- 19568, 19600, 19632, 19664, 19696, 19728, 19760, 19568,
- 19600, 19632, 19664, 19696, 19728, 19792, 19824, 19856,
- 19888, 19888, 19888, 19888, 19888, 19888, 19888, 19888,
- 19888, 19888, 19888, 19888, 19888, 19888, 19888, 19888,
- 19888, 19888, 19888, 19888, 19888, 19888, 19888, 19888,
- 19888, 19888, 19888, 19888, 19888, 19888, 19888, 19888,
- 19888, 19888, 19888, 19888, 19888, 19888, 19888, 19888,
- 19888, 19888, 19888, 19888, 19888, 19888, 19888, 19888,
- 19888, 19888, 19888, 19888, 19888, 19888, 19888, 19888,
- 19888, 19888, 19888, 19888, 19888, 19888, 19888, 19888,
-
- 19920, 19920, 19920, 19920, 19920, 19920, 19920, 19920,
- 19920, 19920, 19920, 19920, 19920, 19920, 19920, 19920,
- 19920, 19920, 19920, 19920, 19920, 19920, 19920, 19920,
- 19920, 19920, 19920, 19920, 19920, 19920, 19920, 19920,
- 19920, 19920, 19920, 19920, 19920, 19920, 19920, 19920,
- 19920, 19920, 19920, 19920, 19920, 19920, 19920, 19920,
- 19920, 19920, 19920, 19920, 19920, 19920, 19920, 19920,
- 19920, 19920, 19920, 19920, 19920, 19920, 19920, 19920,
- 19920, 19920, 19920, 19920, 19920, 19920, 19920, 19920,
- 19920, 19920, 19920, 19920, 19920, 19920, 19920, 19920,
- 19920, 19920, 19920, 19920, 19920, 19920, 19920, 19920,
- 19920, 19920, 19920, 19920, 19920, 19920, 19920, 19920,
- 19920, 19920, 19920, 19920, 19920, 19920, 19920, 19920,
- 19920, 19920, 19920, 19920, 19920, 19920, 19920, 19920,
- 19920, 19920, 19920, 19920, 19920, 19920, 19920, 19920,
- 19920, 19920, 19920, 19920, 19920, 19920, 19920, 19920,
-
- 19920, 19920, 19920, 19920, 19920, 19920, 19920, 19920,
- 19920, 19920, 19920, 19920, 19920, 19920, 19920, 19920,
- 19920, 19920, 19920, 19920, 19920, 19920, 19920, 19920,
- 19920, 19920, 19920, 19920, 19920, 19920, 19920, 19920,
- 19920, 19920, 19920, 19920, 19920, 19920, 19920, 19920,
- 19920, 19920, 19920, 19920, 19920, 19920, 19920, 19920,
- 19920, 19920, 19920, 19920, 19920, 19920, 19920, 19920,
- 19920, 19920, 19920, 19920, 19920, 19920, 19920, 19920,
- 19920, 19920, 19920, 19920, 19920, 19920, 19920, 19920,
- 19952, 19952, 19952, 19952, 19952, 19952, 19952, 19952,
- 19984, 20016, 20048, 20080, 20112, 20112, 20144, 20176,
- 20208, 20240, 20272, 20304, 20304, 20336, 20368, 20304,
- 20304, 20304, 20304, 20304, 20304, 20304, 20304, 20304,
- 20304, 20400, 20432, 20304, 20464, 20304, 20496, 20528,
- 20560, 20592, 20624, 20656, 20304, 20304, 20304, 20688,
- 20720, 20752, 20784, 20816, 20848, 20880, 20912, 20944,
-
- 20976, 21008, 21040, 9936, 21072, 21072, 21072, 21104,
- 21136, 21168, 21200, 21232, 21264, 21296, 21328, 21360,
- 9936, 9936, 9936, 9936, 21392, 21424, 21456, 21488,
- 21520, 21552, 21584, 21616, 21648, 21680, 21712, 9936,
- 21744, 21776, 21808, 21840, 21872, 21904, 21936, 21968,
- 22000, 22032, 22064, 22096, 9936, 9936, 9936, 9936,
- 22128, 22128, 22128, 22128, 22128, 22128, 22128, 22128,
- 22128, 22160, 22192, 22224, 9936, 9936, 9936, 9936,
- 22256, 22288, 22320, 22352, 22384, 22416, 8432, 22448,
- 22480, 22512, 8432, 8432, 22544, 22576, 22608, 22640,
- 22672, 22704, 22736, 22768, 22800, 8432, 22832, 22864,
- 22896, 22928, 22960, 22992, 23024, 23056, 8432, 8432,
- 23088, 23088, 23120, 8432, 23152, 23184, 23216, 23248,
- 8432, 8432, 8432, 8432, 8432, 8432, 8432, 8432,
- 8432, 8432, 8432, 23280, 8432, 8432, 8432, 8432,
- 8432, 8432, 8432, 8432, 8432, 8432, 8432, 8432,
-
- // [0x11000..0x110000)
-
- 23312, 23568, 23824, 24080, 24336, 24592, 24848, 25104,
- 25360, 25616, 25872, 25616, 26128, 26384, 25616, 25616,
- 26640, 26640, 26640, 26896, 27152, 27408, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 27664, 27664, 27920, 28176, 28432, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 28688, 28944, 29200, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 29456, 29456, 29712, 29968, 25616, 25616, 25616, 30224,
- 30480, 30480, 30480, 30480, 30480, 30480, 30480, 30480,
- 30480, 30480, 30480, 30480, 30480, 30480, 30480, 30480,
- 30480, 30480, 30480, 30480, 30480, 30480, 30480, 30736,
- 30480, 30480, 30992, 25616, 25616, 25616, 25616, 25616,
-
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 31248, 31504, 31760, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 32016, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 32272, 32528, 32784, 33040, 33296, 33552, 33808, 34064,
- 34320, 34320, 34576, 25616, 25616, 25616, 25616, 25616,
- 34832, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 35088, 35344, 35600, 35600, 35600, 35600, 35856, 35600,
- 36112, 36368, 36624, 36880, 37136, 37392, 37648, 37904,
- 38160, 38416, 38672, 38672, 38672, 38672, 38672, 38928,
- 39184, 39184, 39184, 39184, 39184, 39184, 39184, 39184,
- 39184, 39184, 39184, 39184, 39184, 39184, 39184, 39184,
- 39184, 39184, 39184, 39184, 39184, 39184, 39184, 39184,
- 39184, 39184, 39184, 39184, 39184, 39184, 39184, 39184,
- 39184, 39184, 39184, 39184, 39184, 39184, 39184, 39184,
- 39184, 39184, 39184, 39184, 39184, 39184, 39184, 39184,
- 39184, 39184, 39184, 39184, 39184, 39184, 39184, 39184,
- 39184, 39184, 39184, 39184, 39184, 39184, 39184, 39184,
- 39184, 39184, 39184, 39184, 39184, 39184, 39184, 39184,
- 39184, 39184, 39184, 39184, 39184, 39184, 39184, 39184,
- 39184, 39184, 39184, 39184, 39184, 39184, 39184, 39184,
- 39184, 39184, 39184, 39184, 39184, 39184, 39184, 39184,
- 39184, 39184, 39184, 39184, 39184, 39184, 39184, 39184,
- 39184, 39184, 39184, 39184, 39184, 39184, 39184, 39184,
- 39184, 39184, 39184, 39184, 39184, 39184, 39184, 39184,
- 39184, 39184, 39184, 39184, 39184, 39184, 39184, 39184,
- 39184, 39184, 39184, 39184, 39184, 39184, 39184, 39184,
- 39184, 39184, 39184, 39184, 39184, 39184, 39184, 39184,
-
- 39184, 39184, 39184, 39184, 39184, 39184, 39184, 39184,
- 39184, 39184, 39184, 39184, 39184, 39184, 39184, 39184,
- 39184, 39184, 39184, 39184, 39184, 39184, 39440, 39696,
- 39696, 39696, 39696, 39696, 39696, 39696, 39696, 39696,
- 39696, 39696, 39696, 39696, 39696, 39696, 39696, 39952,
- 40208, 40464, 40464, 40464, 40464, 40464, 40464, 40464,
- 40464, 40464, 40464, 40464, 40464, 40464, 40464, 40464,
- 40464, 40464, 40464, 40464, 40464, 40464, 40720, 40976,
- 40976, 40976, 40976, 40976, 40976, 40976, 40976, 40976,
- 40976, 40976, 40976, 40976, 40976, 40976, 40976, 40976,
- 40976, 40976, 40976, 40976, 40976, 40976, 40976, 40976,
- 40976, 40976, 40976, 41232, 38672, 38672, 38672, 38672,
- 38672, 38672, 38672, 38672, 38672, 38672, 38672, 38672,
- 41488, 41488, 41744, 38672, 38672, 38672, 38672, 38928,
- 38672, 38672, 38672, 38672, 38672, 38672, 38672, 38672,
- 38672, 38672, 38672, 38672, 38672, 38672, 38672, 38672,
- 38672, 38672, 38672, 38672, 38672, 38672, 38672, 38672,
- 38672, 38672, 38672, 38672, 38672, 38672, 38672, 38672,
- 38672, 38672, 38672, 38672, 38672, 38672, 38672, 38672,
- 38672, 38672, 38672, 38672, 38672, 38672, 38672, 38672,
- 38672, 38672, 38672, 38672, 38672, 38672, 38672, 38672,
- 38672, 38672, 38672, 38672, 38672, 38672, 38672, 38672,
- 38672, 38672, 38672, 38672, 38672, 38672, 38672, 38672,
- 38672, 38672, 38672, 38672, 38672, 38672, 38672, 38672,
- 38672, 38672, 38672, 38672, 38672, 38672, 38672, 38672,
- 38672, 38672, 38672, 38672, 38672, 38672, 38672, 38672,
- 38672, 38672, 38672, 38672, 38672, 38672, 38672, 38672,
- 38672, 38672, 38672, 38672, 38672, 38672, 38672, 38672,
- 38672, 38672, 38672, 38672, 38672, 38672, 38672, 38672,
- 38672, 38672, 38672, 38672, 38672, 38672, 38672, 38672,
- 38672, 38672, 38672, 38672, 38672, 38672, 38672, 38672,
- 38672, 38672, 38672, 38672, 38672, 38672, 38672, 38672,
-
- 38672, 38672, 38672, 38672, 38672, 38672, 38672, 38672,
- 38672, 38672, 38672, 38672, 38672, 38672, 38672, 38672,
- 38672, 38672, 38672, 38672, 38672, 38672, 38672, 38672,
- 38672, 38672, 38672, 38672, 38672, 38672, 38672, 38672,
- 38672, 38672, 38672, 38672, 38672, 38672, 38672, 38672,
- 38672, 38672, 38672, 38672, 38672, 38672, 38672, 38672,
- 38672, 38672, 38672, 38672, 38672, 38672, 38672, 38672,
- 38672, 38672, 38672, 38672, 38672, 38672, 38672, 38672,
- 38672, 38672, 38672, 38672, 38672, 38672, 38672, 38672,
- 38672, 38672, 38672, 38672, 38672, 38672, 38672, 38672,
- 38672, 38672, 38672, 38672, 38672, 38672, 38672, 38672,
- 38672, 38672, 38672, 38672, 38672, 38672, 38672, 38672,
- 38672, 38672, 38672, 38672, 38672, 38672, 38672, 38672,
- 38672, 38672, 38672, 38672, 38672, 38672, 38672, 38928,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
-
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 42000,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
-
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 42000,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
-
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 42000,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
-
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 42000,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
-
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 42000,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
-
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 42000,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
-
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 42000,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
-
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 42000,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
-
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 42000,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
-
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 42000,
- 42256, 42512, 42768, 42768, 42768, 42768, 42768, 42768,
- 42768, 42768, 42768, 42768, 42768, 42768, 42768, 42768,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
-
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 25616,
- 25616, 25616, 25616, 25616, 25616, 25616, 25616, 42000,
- 43024, 43024, 43024, 43024, 43024, 43024, 43024, 43024,
- 43024, 43024, 43024, 43024, 43024, 43024, 43024, 43024,
- 43024, 43024, 43024, 43024, 43024, 43024, 43024, 43024,
- 43024, 43024, 43024, 43024, 43024, 43024, 43024, 43024,
- 43024, 43024, 43024, 43024, 43024, 43024, 43024, 43024,
- 43024, 43024, 43024, 43024, 43024, 43024, 43024, 43024,
- 43024, 43024, 43024, 43024, 43024, 43024, 43024, 43024,
- 43024, 43024, 43024, 43024, 43024, 43024, 43024, 43024,
- 43024, 43024, 43024, 43024, 43024, 43024, 43024, 43024,
- 43024, 43024, 43024, 43024, 43024, 43024, 43024, 43024,
- 43024, 43024, 43024, 43024, 43024, 43024, 43024, 43024,
- 43024, 43024, 43024, 43024, 43024, 43024, 43024, 43024,
- 43024, 43024, 43024, 43024, 43024, 43024, 43024, 43024,
- 43024, 43024, 43024, 43024, 43024, 43024, 43024, 43024,
- 43024, 43024, 43024, 43024, 43024, 43024, 43024, 43024,
- 43024, 43024, 43024, 43024, 43024, 43024, 43024, 43024,
- 43024, 43024, 43024, 43024, 43024, 43024, 43024, 43024,
- 43024, 43024, 43024, 43024, 43024, 43024, 43024, 43024,
-
- 43024, 43024, 43024, 43024, 43024, 43024, 43024, 43024,
- 43024, 43024, 43024, 43024, 43024, 43024, 43024, 43024,
- 43024, 43024, 43024, 43024, 43024, 43024, 43024, 43024,
- 43024, 43024, 43024, 43024, 43024, 43024, 43024, 43024,
- 43024, 43024, 43024, 43024, 43024, 43024, 43024, 43024,
- 43024, 43024, 43024, 43024, 43024, 43024, 43024, 43024,
- 43024, 43024, 43024, 43024, 43024, 43024, 43024, 43024,
- 43024, 43024, 43024, 43024, 43024, 43024, 43024, 43024,
- 43024, 43024, 43024, 43024, 43024, 43024, 43024, 43024,
- 43024, 43024, 43024, 43024, 43024, 43024, 43024, 43024,
- 43024, 43024, 43024, 43024, 43024, 43024, 43024, 43024,
- 43024, 43024, 43024, 43024, 43024, 43024, 43024, 43024,
- 43024, 43024, 43024, 43024, 43024, 43024, 43024, 43024,
- 43024, 43024, 43024, 43024, 43024, 43024, 43024, 43280,
- 43024, 43024, 43024, 43024, 43024, 43024, 43024, 43024,
- 43024, 43024, 43024, 43024, 43024, 43024, 43024, 43024,
- 43024, 43024, 43024, 43024, 43024, 43024, 43024, 43024,
- 43024, 43024, 43024, 43024, 43024, 43024, 43024, 43024,
- 43024, 43024, 43024, 43024, 43024, 43024, 43024, 43024,
- 43024, 43024, 43024, 43024, 43024, 43024, 43024, 43024,
- 43024, 43024, 43024, 43024, 43024, 43024, 43024, 43024,
- 43024, 43024, 43024, 43024, 43024, 43024, 43024, 43024,
- 43024, 43024, 43024, 43024, 43024, 43024, 43024, 43024,
- 43024, 43024, 43024, 43024, 43024, 43024, 43024, 43024,
- 43024, 43024, 43024, 43024, 43024, 43024, 43024, 43024,
- 43024, 43024, 43024, 43024, 43024, 43024, 43024, 43024,
- 43024, 43024, 43024, 43024, 43024, 43024, 43024, 43024,
- 43024, 43024, 43024, 43024, 43024, 43024, 43024, 43024,
- 43024, 43024, 43024, 43024, 43024, 43024, 43024, 43024,
- 43024, 43024, 43024, 43024, 43024, 43024, 43024, 43024,
- 43024, 43024, 43024, 43024, 43024, 43024, 43024, 43024,
- 43024, 43024, 43024, 43024, 43024, 43024, 43024, 43024,
-
- 43024, 43024, 43024, 43024, 43024, 43024, 43024, 43024,
- 43024, 43024, 43024, 43024, 43024, 43024, 43024, 43024,
- 43024, 43024, 43024, 43024, 43024, 43024, 43024, 43024,
- 43024, 43024, 43024, 43024, 43024, 43024, 43024, 43024,
- 43024, 43024, 43024, 43024, 43024, 43024, 43024, 43024,
- 43024, 43024, 43024, 43024, 43024, 43024, 43024, 43024,
- 43024, 43024, 43024, 43024, 43024, 43024, 43024, 43024,
- 43024, 43024, 43024, 43024, 43024, 43024, 43024, 43024,
- 43024, 43024, 43024, 43024, 43024, 43024, 43024, 43024,
- 43024, 43024, 43024, 43024, 43024, 43024, 43024, 43024,
- 43024, 43024, 43024, 43024, 43024, 43024, 43024, 43024,
- 43024, 43024, 43024, 43024, 43024, 43024, 43024, 43024,
- 43024, 43024, 43024, 43024, 43024, 43024, 43024, 43024,
- 43024, 43024, 43024, 43024, 43024, 43024, 43024, 43280,
-
-
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 1, 2, 3, 4, 5, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 6, 6, 6, 7,
-
- 8, 9, 10, 11, 12, 13, 14, 15,
- 16, 17, 14, 18, 19, 20, 21, 22,
- 23, 24, 25, 26, 27, 28, 29, 30,
- 31, 32, 33, 34, 35, 36, 37, 9,
-
- 14, 38, 38, 38, 38, 38, 38, 38,
- 38, 38, 38, 38, 38, 38, 38, 38,
- 38, 38, 38, 38, 38, 38, 38, 38,
- 38, 38, 38, 39, 40, 41, 42, 43,
-
- 42, 44, 44, 44, 44, 44, 44, 44,
- 44, 44, 44, 44, 44, 44, 44, 44,
- 44, 44, 44, 44, 44, 44, 44, 44,
- 44, 44, 44, 39, 45, 46, 36, 0,
-
- 0, 0, 0, 0, 0, 47, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
-
- 48, 49, 50, 12, 12, 12, 51, 14,
- 52, 51, 53, 54, 36, 55, 51, 52,
- 56, 57, 58, 59, 60, 61, 14, 62,
- 52, 63, 53, 64, 65, 65, 65, 49,
-
- 66, 66, 66, 66, 66, 66, 38, 66,
- 66, 66, 66, 66, 66, 66, 66, 66,
- 38, 66, 66, 66, 66, 66, 66, 36,
- 38, 66, 66, 66, 66, 66, 38, 67,
-
- 68, 68, 68, 68, 68, 68, 44, 68,
- 68, 68, 68, 68, 68, 68, 68, 68,
- 44, 68, 68, 68, 68, 68, 68, 36,
- 44, 68, 68, 68, 68, 68, 44, 69,
-
- 70, 71, 70, 71, 70, 71, 70, 71,
- 70, 71, 70, 71, 70, 71, 70, 71,
- 72, 73, 70, 71, 70, 71, 70, 71,
- 70, 71, 70, 71, 70, 71, 70, 71,
-
- 70, 71, 70, 71, 70, 71, 72, 73,
- 70, 71, 70, 71, 70, 71, 70, 71,
- 74, 75, 76, 77, 70, 71, 70, 71,
- 78, 70, 71, 70, 71, 70, 71, 76,
-
- 77, 72, 73, 70, 71, 70, 71, 70,
- 71, 79, 72, 73, 70, 71, 70, 71,
- 70, 71, 72, 73, 70, 71, 70, 71,
- 70, 71, 70, 71, 70, 71, 70, 71,
-
- 70, 71, 70, 71, 70, 71, 72, 73,
- 70, 71, 70, 71, 70, 71, 70, 71,
- 70, 71, 70, 71, 70, 71, 70, 71,
- 80, 70, 71, 70, 71, 70, 71, 81,
-
- 82, 83, 72, 73, 72, 73, 84, 72,
- 73, 85, 85, 72, 73, 78, 86, 87,
- 88, 72, 73, 85, 89, 90, 91, 92,
- 72, 73, 93, 78, 91, 94, 95, 96,
-
- 70, 71, 72, 73, 72, 73, 97, 72,
- 73, 97, 78, 78, 72, 73, 97, 70,
- 71, 98, 98, 72, 73, 72, 73, 99,
- 72, 73, 78, 100, 72, 73, 78, 101,
-
- 100, 100, 100, 100, 102, 103, 104, 102,
- 103, 104, 102, 103, 104, 70, 71, 70,
- 71, 70, 71, 70, 71, 70, 71, 70,
- 71, 70, 71, 70, 71, 105, 70, 71,
-
- 70, 71, 70, 71, 72, 73, 70, 71,
- 70, 71, 70, 71, 70, 71, 70, 71,
- 106, 102, 103, 104, 70, 71, 107, 108,
- 109, 110, 70, 71, 70, 71, 70, 71,
-
- 70, 71, 70, 71, 70, 71, 70, 71,
- 70, 71, 70, 71, 70, 71, 70, 71,
- 70, 71, 70, 71, 70, 71, 70, 71,
- 109, 110, 109, 110, 111, 112, 109, 110,
-
- 113, 114, 111, 112, 111, 112, 109, 110,
- 109, 110, 109, 110, 109, 110, 109, 110,
- 109, 110, 109, 110, 114, 114, 114, 115,
- 115, 115, 116, 117, 118, 119, 120, 121,
-
- 122, 117, 123, 124, 125, 126, 127, 123,
- 127, 123, 127, 123, 127, 123, 127, 123,
- 128, 129, 130, 131, 132, 78, 133, 133,
- 78, 134, 78, 135, 136, 78, 78, 78,
-
- 133, 137, 78, 138, 78, 139, 140, 78,
- 141, 142, 143, 144, 145, 78, 78, 142,
- 78, 146, 147, 78, 78, 148, 78, 78,
- 78, 78, 78, 78, 78, 149, 78, 78,
-
- 150, 78, 78, 150, 78, 78, 78, 151,
- 150, 152, 153, 153, 154, 78, 78, 78,
- 78, 78, 155, 78, 100, 78, 78, 78,
- 78, 78, 78, 78, 78, 156, 157, 78,
-
- 78, 78, 78, 78, 78, 78, 78, 78,
- 78, 158, 158, 158, 158, 158, 114, 114,
- 159, 159, 159, 159, 159, 159, 159, 159,
- 159, 160, 160, 161, 161, 161, 161, 161,
-
- 162, 162, 163, 163, 163, 163, 160, 160,
- 164, 160, 160, 160, 164, 160, 160, 160,
- 161, 161, 163, 163, 163, 163, 163, 163,
- 52, 52, 52, 52, 52, 52, 163, 165,
-
- 159, 159, 159, 159, 159, 42, 42, 42,
- 42, 42, 166, 166, 167, 168, 169, 170,
- 170, 170, 170, 170, 170, 170, 170, 170,
- 170, 170, 170, 170, 170, 170, 170, 170,
-
- 171, 171, 171, 171, 171, 172, 171, 171,
- 171, 171, 171, 171, 171, 172, 172, 171,
- 172, 171, 172, 171, 171, 173, 174, 174,
- 174, 174, 173, 175, 174, 174, 174, 174,
-
- 174, 176, 176, 177, 177, 177, 177, 178,
- 178, 174, 174, 174, 174, 177, 177, 174,
- 177, 177, 174, 174, 179, 179, 179, 179,
- 180, 174, 174, 174, 174, 172, 172, 172,
-
- 181, 181, 171, 181, 181, 182, 183, 184,
- 184, 184, 183, 183, 183, 184, 184, 185,
- 186, 186, 186, 187, 187, 187, 187, 186,
- 188, 189, 189, 190, 191, 192, 192, 193,
-
- 194, 194, 195, 196, 196, 196, 196, 196,
- 196, 196, 196, 196, 196, 196, 196, 196,
- 197, 198, 197, 198, 199, 200, 197, 198,
- 201, 201, 202, 203, 203, 203, 204, 205,
-
- 201, 201, 201, 201, 206, 207, 208, 209,
- 210, 210, 210, 201, 211, 201, 212, 212,
- 213, 214, 214, 214, 214, 214, 214, 214,
- 214, 214, 214, 214, 214, 214, 214, 214,
-
- 214, 214, 201, 214, 214, 214, 214, 214,
- 214, 214, 215, 215, 216, 217, 217, 217,
- 218, 219, 219, 219, 219, 219, 219, 219,
- 219, 219, 219, 219, 219, 219, 219, 219,
-
- 219, 219, 220, 219, 219, 219, 219, 219,
- 219, 219, 221, 221, 222, 223, 223, 224,
- 225, 226, 227, 228, 228, 229, 230, 231,
- 232, 233, 234, 235, 234, 235, 234, 235,
-
- 234, 235, 236, 237, 236, 237, 236, 237,
- 236, 237, 236, 237, 236, 237, 236, 237,
- 238, 239, 240, 241, 242, 243, 244, 245,
- 246, 247, 245, 246, 248, 249, 249, 249,
-
- 250, 251, 252, 251, 252, 252, 252, 251,
- 252, 252, 252, 252, 251, 250, 251, 252,
- 253, 253, 253, 253, 253, 253, 253, 253,
- 253, 254, 253, 253, 253, 253, 253, 253,
-
- 253, 253, 253, 253, 253, 253, 253, 253,
- 253, 253, 253, 253, 253, 253, 253, 253,
- 255, 255, 255, 255, 255, 255, 255, 255,
- 255, 256, 255, 255, 255, 255, 255, 255,
-
- 255, 255, 255, 255, 255, 255, 255, 255,
- 255, 255, 255, 255, 255, 255, 255, 255,
- 257, 258, 259, 258, 259, 259, 259, 258,
- 259, 259, 259, 259, 258, 257, 258, 259,
-
- 260, 261, 260, 261, 260, 261, 260, 261,
- 260, 261, 260, 261, 260, 261, 260, 261,
- 260, 261, 260, 261, 260, 261, 262, 263,
- 260, 261, 260, 261, 260, 261, 260, 261,
-
- 260, 261, 264, 265, 265, 172, 172, 266,
- 267, 267, 268, 269, 270, 271, 270, 271,
- 260, 261, 260, 261, 260, 261, 260, 261,
- 260, 261, 260, 261, 260, 261, 260, 261,
-
- 260, 261, 260, 261, 260, 261, 260, 261,
- 260, 261, 260, 261, 260, 261, 260, 261,
- 260, 261, 260, 261, 260, 261, 260, 261,
- 260, 261, 260, 261, 260, 261, 260, 261,
-
- 272, 262, 263, 260, 261, 268, 269, 260,
- 261, 268, 269, 260, 261, 268, 269, 273,
- 262, 263, 262, 263, 260, 261, 262, 263,
- 260, 261, 262, 263, 262, 263, 262, 263,
-
- 260, 261, 262, 263, 262, 263, 262, 263,
- 260, 261, 262, 263, 274, 275, 262, 263,
- 262, 263, 262, 263, 262, 263, 276, 277,
- 262, 263, 278, 279, 278, 279, 278, 279,
-
- 268, 269, 268, 269, 268, 269, 268, 269,
- 268, 269, 268, 269, 268, 269, 268, 269,
- 278, 279, 278, 279, 280, 281, 280, 281,
- 280, 281, 280, 281, 280, 281, 280, 281,
-
- 280, 281, 280, 281, 282, 283, 284, 285,
- 286, 287, 286, 287, 286, 287, 286, 287,
- 201, 288, 288, 288, 288, 288, 288, 288,
- 288, 288, 288, 288, 288, 288, 288, 288,
-
- 288, 288, 288, 288, 288, 288, 288, 288,
- 288, 288, 288, 288, 288, 288, 288, 288,
- 288, 288, 288, 288, 288, 288, 288, 201,
- 201, 289, 290, 290, 290, 291, 290, 290,
-
- 201, 292, 292, 292, 292, 292, 292, 292,
- 292, 292, 292, 292, 292, 292, 292, 292,
- 292, 292, 292, 292, 292, 292, 292, 292,
- 292, 292, 292, 292, 292, 292, 292, 292,
-
- 292, 292, 292, 292, 292, 292, 292, 293,
- 201, 294, 295, 201, 201, 296, 296, 297,
- 298, 299, 300, 300, 300, 300, 299, 300,
- 300, 300, 301, 299, 300, 300, 300, 300,
-
- 300, 300, 302, 299, 299, 299, 299, 299,
- 300, 300, 299, 300, 300, 301, 303, 300,
- 304, 305, 306, 307, 308, 309, 310, 311,
- 312, 313, 314, 315, 316, 317, 318, 319,
-
- 320, 321, 322, 320, 300, 302, 323, 324,
- 298, 298, 298, 298, 298, 298, 298, 298,
- 325, 325, 325, 325, 325, 325, 325, 325,
- 325, 325, 325, 325, 325, 325, 325, 325,
-
- 325, 325, 325, 325, 325, 325, 325, 325,
- 325, 325, 325, 298, 298, 298, 298, 298,
- 325, 325, 325, 326, 327, 298, 298, 298,
- 298, 298, 298, 298, 298, 298, 298, 298,
-
- 328, 328, 328, 328, 329, 330, 331, 331,
- 332, 333, 333, 334, 19, 335, 336, 336,
- 337, 337, 337, 337, 337, 337, 338, 338,
- 339, 340, 341, 342, 343, 344, 345, 346,
-
- 347, 348, 349, 349, 349, 349, 350, 351,
- 352, 351, 352, 352, 352, 352, 352, 351,
- 351, 351, 351, 352, 352, 352, 352, 352,
- 352, 352, 352, 353, 353, 353, 353, 353,
-
- 354, 352, 352, 352, 352, 352, 352, 352,
- 351, 352, 352, 355, 356, 357, 358, 359,
- 360, 361, 362, 363, 363, 364, 365, 337,
- 337, 366, 366, 366, 367, 366, 366, 368,
-
- 369, 370, 371, 372, 373, 374, 375, 376,
- 377, 378, 379, 380, 381, 382, 383, 383,
- 384, 351, 351, 351, 348, 385, 385, 385,
- 386, 352, 352, 352, 352, 352, 352, 352,
-
- 352, 352, 352, 352, 352, 352, 352, 352,
- 351, 351, 351, 351, 351, 351, 351, 351,
- 351, 351, 351, 351, 351, 351, 351, 351,
- 351, 351, 352, 352, 352, 352, 352, 352,
-
- 352, 352, 352, 352, 352, 352, 352, 352,
- 352, 352, 352, 352, 352, 352, 352, 352,
- 352, 352, 352, 352, 352, 352, 352, 352,
- 387, 387, 352, 352, 352, 352, 352, 387,
-
- 349, 352, 350, 351, 351, 351, 351, 351,
- 351, 351, 351, 351, 352, 351, 352, 388,
- 352, 352, 351, 349, 389, 351, 390, 390,
- 390, 390, 390, 390, 390, 391, 392, 390,
-
- 390, 390, 390, 393, 390, 394, 394, 390,
- 390, 392, 393, 390, 390, 393, 395, 395,
- 396, 397, 398, 399, 400, 401, 402, 403,
- 404, 405, 387, 387, 387, 406, 406, 407,
-
- 408, 408, 408, 409, 409, 409, 409, 409,
- 409, 409, 409, 409, 409, 409, 344, 410,
- 411, 412, 413, 413, 413, 411, 411, 411,
- 411, 411, 413, 413, 413, 413, 411, 413,
-
- 413, 413, 413, 413, 413, 413, 413, 413,
- 411, 413, 411, 413, 411, 414, 414, 415,
- 416, 417, 416, 416, 417, 416, 416, 417,
- 417, 417, 416, 417, 417, 416, 417, 416,
-
- 416, 416, 417, 416, 417, 416, 417, 416,
- 417, 416, 416, 344, 344, 415, 414, 414,
- 418, 418, 418, 418, 418, 418, 418, 418,
- 418, 419, 419, 419, 418, 418, 418, 418,
-
- 418, 418, 418, 418, 418, 418, 418, 418,
- 418, 418, 418, 419, 419, 418, 353, 353,
- 353, 420, 353, 420, 420, 353, 353, 353,
- 420, 420, 353, 353, 353, 353, 353, 353,
-
- 421, 421, 421, 421, 421, 421, 421, 421,
- 421, 421, 421, 421, 421, 421, 421, 421,
- 421, 421, 421, 421, 421, 421, 421, 421,
- 421, 421, 421, 421, 421, 421, 421, 421,
-
- 421, 421, 421, 421, 421, 421, 422, 422,
- 422, 422, 422, 422, 422, 422, 422, 422,
- 422, 423, 344, 344, 344, 344, 344, 344,
- 344, 344, 344, 344, 344, 344, 344, 344,
-
- 424, 425, 426, 427, 428, 429, 430, 431,
- 432, 433, 434, 434, 434, 434, 434, 434,
- 434, 434, 434, 434, 434, 434, 434, 434,
- 434, 434, 434, 434, 434, 434, 434, 434,
-
- 434, 434, 434, 434, 434, 434, 434, 434,
- 434, 434, 434, 435, 435, 435, 435, 435,
- 435, 435, 436, 435, 437, 437, 438, 439,
- 440, 441, 442, 298, 298, 298, 298, 298,
-
- 443, 443, 443, 443, 443, 443, 443, 443,
- 443, 443, 443, 443, 443, 443, 443, 443,
- 443, 443, 443, 443, 443, 443, 444, 444,
- 444, 444, 445, 444, 444, 444, 444, 444,
-
- 444, 444, 444, 444, 445, 444, 444, 444,
- 445, 444, 444, 444, 444, 444, 298, 298,
- 446, 446, 446, 446, 446, 446, 446, 446,
- 446, 446, 446, 446, 446, 446, 446, 298,
-
- 447, 448, 448, 448, 448, 448, 447, 447,
- 448, 447, 448, 448, 448, 448, 448, 448,
- 448, 448, 448, 448, 447, 448, 449, 449,
- 449, 450, 450, 450, 298, 298, 451, 298,
-
- 452, 453, 452, 452, 452, 452, 453, 454,
- 452, 454, 454, 298, 298, 298, 298, 298,
- 298, 298, 298, 298, 298, 298, 298, 298,
- 298, 298, 298, 298, 298, 298, 298, 298,
-
- 298, 298, 298, 298, 298, 298, 298, 298,
- 298, 298, 298, 298, 298, 298, 298, 298,
- 298, 298, 298, 298, 298, 298, 298, 298,
- 298, 298, 298, 298, 298, 298, 298, 298,
-
- 455, 456, 455, 455, 455, 455, 455, 455,
- 455, 455, 457, 457, 457, 458, 459, 456,
- 456, 459, 459, 460, 460, 344, 461, 461,
- 461, 462, 461, 461, 461, 461, 344, 344,
-
- 344, 344, 344, 344, 344, 344, 344, 344,
- 344, 344, 344, 344, 344, 344, 344, 344,
- 344, 344, 344, 344, 463, 463, 463, 463,
- 463, 463, 463, 463, 463, 463, 463, 463,
-
- 463, 463, 464, 465, 466, 466, 467, 466,
- 466, 467, 466, 466, 466, 467, 467, 467,
- 468, 469, 470, 466, 466, 466, 467, 466,
- 466, 467, 467, 466, 466, 466, 466, 471,
-
- 472, 473, 473, 474, 475, 476, 476, 476,
- 476, 476, 476, 476, 476, 476, 476, 476,
- 476, 476, 476, 476, 476, 476, 476, 476,
- 476, 476, 476, 476, 476, 476, 476, 476,
-
- 476, 476, 476, 476, 476, 476, 476, 476,
- 476, 477, 476, 476, 476, 476, 476, 476,
- 476, 477, 476, 476, 477, 476, 476, 476,
- 476, 476, 478, 479, 480, 476, 474, 474,
-
- 474, 473, 473, 473, 473, 473, 473, 473,
- 473, 474, 474, 474, 474, 481, 482, 479,
- 476, 172, 174, 483, 483, 472, 478, 478,
- 484, 484, 484, 484, 484, 484, 484, 484,
-
- 476, 476, 473, 473, 485, 485, 486, 487,
- 488, 489, 490, 491, 492, 493, 494, 495,
- 496, 497, 498, 499, 499, 499, 499, 499,
- 500, 501, 501, 502, 502, 503, 502, 502,
-
- 504, 505, 506, 506, 201, 507, 507, 507,
- 507, 507, 507, 507, 507, 201, 201, 507,
- 507, 201, 201, 507, 507, 507, 507, 507,
- 507, 507, 507, 507, 507, 507, 507, 507,
-
- 507, 507, 507, 507, 507, 507, 507, 507,
- 507, 201, 507, 507, 507, 507, 507, 507,
- 507, 201, 507, 201, 201, 201, 507, 507,
- 507, 507, 201, 201, 508, 509, 510, 506,
-
- 506, 505, 505, 505, 505, 201, 201, 506,
- 506, 201, 201, 511, 511, 512, 513, 201,
- 201, 201, 201, 201, 201, 201, 201, 510,
- 201, 201, 201, 201, 514, 514, 201, 514,
-
- 507, 507, 505, 505, 201, 201, 515, 516,
- 517, 518, 519, 520, 521, 522, 523, 524,
- 507, 507, 525, 525, 526, 526, 526, 526,
- 526, 527, 528, 529, 530, 531, 201, 201,
-
- 201, 532, 533, 534, 201, 535, 535, 535,
- 535, 535, 535, 201, 201, 201, 201, 535,
- 535, 201, 201, 535, 535, 535, 535, 535,
- 535, 535, 535, 535, 535, 535, 535, 535,
-
- 535, 535, 535, 535, 535, 535, 535, 535,
- 535, 201, 535, 535, 535, 535, 535, 535,
- 535, 201, 535, 536, 201, 535, 536, 201,
- 535, 535, 201, 201, 537, 201, 538, 538,
-
- 538, 533, 533, 201, 201, 201, 201, 533,
- 533, 201, 201, 533, 533, 539, 201, 201,
- 201, 540, 201, 201, 201, 201, 201, 201,
- 201, 536, 536, 536, 535, 201, 536, 201,
-
- 201, 201, 201, 201, 201, 201, 541, 542,
- 543, 544, 545, 546, 547, 548, 549, 550,
- 533, 533, 535, 535, 535, 540, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
-
- 201, 551, 551, 552, 201, 553, 553, 553,
- 553, 553, 553, 553, 554, 553, 201, 553,
- 553, 553, 201, 553, 553, 553, 553, 553,
- 553, 553, 553, 553, 553, 553, 553, 553,
-
- 553, 553, 553, 553, 553, 553, 553, 553,
- 553, 201, 553, 553, 553, 553, 553, 553,
- 553, 201, 553, 553, 201, 553, 553, 553,
- 553, 553, 201, 201, 555, 553, 552, 552,
-
- 552, 551, 551, 551, 551, 551, 201, 551,
- 551, 552, 201, 552, 552, 556, 201, 201,
- 553, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
-
- 553, 554, 557, 557, 201, 201, 558, 559,
- 560, 561, 562, 563, 564, 565, 566, 567,
- 568, 569, 201, 201, 201, 201, 201, 201,
- 201, 570, 571, 571, 571, 571, 571, 571,
-
- 201, 572, 573, 573, 201, 574, 574, 574,
- 574, 574, 574, 574, 574, 201, 201, 574,
- 574, 201, 201, 574, 574, 574, 574, 574,
- 574, 574, 574, 574, 574, 574, 574, 574,
-
- 574, 574, 574, 574, 574, 574, 574, 574,
- 574, 201, 574, 574, 574, 574, 574, 574,
- 574, 201, 574, 574, 201, 575, 574, 574,
- 574, 574, 201, 201, 576, 574, 577, 572,
-
- 573, 572, 572, 572, 578, 201, 201, 573,
- 579, 201, 201, 579, 579, 580, 201, 201,
- 201, 201, 201, 201, 201, 201, 581, 577,
- 201, 201, 201, 201, 582, 582, 201, 574,
-
- 574, 574, 578, 578, 201, 201, 583, 584,
- 585, 586, 587, 588, 589, 590, 591, 592,
- 593, 575, 594, 594, 594, 594, 594, 594,
- 201, 201, 201, 201, 201, 201, 201, 201,
-
- 201, 201, 595, 596, 201, 596, 596, 596,
- 596, 596, 596, 201, 201, 201, 596, 596,
- 596, 201, 596, 596, 597, 596, 201, 201,
- 201, 596, 596, 201, 596, 201, 596, 596,
-
- 201, 201, 201, 596, 596, 201, 201, 201,
- 596, 596, 596, 201, 201, 201, 596, 596,
- 596, 596, 596, 596, 596, 596, 598, 596,
- 596, 596, 201, 201, 201, 201, 599, 600,
-
- 595, 600, 600, 201, 201, 201, 600, 600,
- 600, 201, 601, 601, 601, 602, 201, 201,
- 603, 201, 201, 201, 201, 201, 201, 599,
- 201, 201, 201, 201, 201, 201, 201, 201,
-
- 201, 201, 201, 201, 201, 201, 604, 605,
- 606, 607, 608, 609, 610, 611, 612, 613,
- 614, 614, 614, 615, 615, 615, 615, 615,
- 615, 616, 615, 201, 201, 201, 201, 201,
-
- 617, 618, 618, 618, 201, 619, 619, 619,
- 619, 619, 619, 619, 619, 201, 619, 619,
- 619, 201, 619, 619, 619, 619, 619, 619,
- 619, 619, 619, 619, 619, 619, 619, 619,
-
- 619, 619, 619, 619, 619, 619, 619, 619,
- 619, 201, 619, 619, 619, 619, 619, 619,
- 619, 619, 619, 619, 620, 619, 619, 619,
- 619, 619, 201, 201, 201, 621, 622, 622,
-
- 622, 618, 618, 618, 618, 201, 622, 622,
- 623, 201, 622, 622, 622, 624, 201, 201,
- 201, 201, 201, 201, 201, 625, 626, 201,
- 621, 621, 627, 201, 201, 201, 201, 201,
-
- 619, 619, 628, 628, 201, 201, 629, 630,
- 631, 632, 633, 634, 635, 636, 637, 638,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 639, 639, 639, 639, 639, 639, 639, 640,
-
- 641, 642, 643, 643, 201, 644, 644, 644,
- 644, 644, 644, 644, 644, 201, 644, 644,
- 644, 201, 644, 644, 644, 644, 644, 644,
- 644, 644, 644, 644, 644, 644, 644, 644,
-
- 644, 644, 644, 644, 644, 644, 644, 644,
- 644, 201, 644, 644, 644, 644, 644, 644,
- 644, 644, 644, 644, 201, 644, 644, 644,
- 644, 644, 201, 201, 645, 646, 643, 647,
-
- 648, 643, 649, 643, 643, 201, 647, 648,
- 648, 201, 648, 648, 650, 651, 201, 201,
- 201, 201, 201, 201, 201, 649, 649, 201,
- 201, 201, 201, 201, 201, 201, 644, 201,
-
- 644, 644, 652, 652, 201, 201, 653, 654,
- 655, 656, 657, 658, 659, 660, 661, 662,
- 201, 663, 663, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
-
- 664, 665, 666, 666, 201, 667, 667, 667,
- 667, 667, 667, 667, 667, 201, 667, 667,
- 667, 201, 667, 667, 667, 667, 667, 667,
- 667, 667, 667, 667, 667, 667, 667, 667,
-
- 667, 667, 667, 667, 667, 667, 667, 667,
- 667, 668, 667, 667, 667, 667, 667, 667,
- 667, 667, 667, 667, 667, 667, 667, 667,
- 667, 667, 668, 669, 669, 670, 671, 666,
-
- 666, 672, 672, 672, 673, 201, 666, 666,
- 666, 201, 674, 674, 674, 675, 676, 677,
- 201, 201, 201, 201, 678, 678, 678, 671,
- 679, 679, 679, 679, 679, 679, 679, 680,
-
- 667, 667, 673, 673, 201, 201, 681, 682,
- 683, 684, 685, 686, 687, 688, 689, 690,
- 691, 691, 691, 691, 691, 691, 679, 679,
- 679, 692, 670, 670, 670, 670, 670, 670,
-
- 201, 201, 693, 693, 201, 694, 694, 694,
- 694, 694, 694, 694, 694, 694, 694, 694,
- 694, 694, 694, 694, 694, 694, 694, 201,
- 201, 201, 694, 694, 694, 694, 694, 694,
-
- 694, 694, 694, 694, 694, 694, 694, 694,
- 694, 694, 694, 694, 694, 694, 694, 694,
- 694, 694, 201, 694, 694, 694, 694, 694,
- 694, 694, 694, 694, 201, 694, 201, 201,
-
- 694, 694, 694, 694, 694, 694, 694, 201,
- 201, 201, 695, 201, 201, 201, 201, 696,
- 693, 693, 697, 697, 697, 201, 697, 201,
- 693, 693, 698, 693, 698, 698, 698, 696,
-
- 201, 201, 201, 201, 201, 201, 699, 700,
- 701, 702, 703, 704, 705, 706, 707, 708,
- 201, 201, 693, 693, 709, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
-
- 201, 710, 710, 710, 710, 710, 710, 710,
- 710, 710, 710, 710, 710, 710, 710, 710,
- 710, 710, 710, 710, 710, 710, 710, 710,
- 710, 710, 710, 710, 710, 710, 710, 710,
-
- 710, 710, 710, 710, 710, 710, 710, 710,
- 710, 710, 710, 710, 710, 710, 710, 710,
- 710, 711, 710, 712, 711, 711, 711, 711,
- 713, 713, 714, 201, 201, 201, 201, 12,
-
- 710, 710, 710, 710, 710, 710, 715, 711,
- 716, 716, 716, 716, 711, 711, 711, 717,
- 718, 719, 720, 721, 722, 723, 724, 725,
- 726, 727, 728, 728, 201, 201, 201, 201,
-
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
-
- 201, 729, 729, 201, 729, 201, 201, 729,
- 729, 201, 729, 201, 201, 729, 201, 201,
- 201, 201, 201, 201, 729, 729, 729, 729,
- 201, 729, 729, 729, 729, 729, 729, 729,
-
- 201, 729, 729, 729, 201, 729, 201, 729,
- 201, 201, 729, 729, 201, 729, 729, 729,
- 729, 730, 729, 731, 730, 730, 730, 730,
- 732, 732, 201, 730, 730, 729, 201, 201,
-
- 729, 729, 729, 729, 729, 201, 733, 201,
- 734, 734, 734, 734, 730, 730, 201, 201,
- 735, 736, 737, 738, 739, 740, 741, 742,
- 743, 744, 201, 201, 745, 745, 746, 746,
-
- 747, 748, 748, 748, 749, 750, 749, 749,
- 751, 749, 749, 752, 753, 754, 754, 754,
- 754, 754, 751, 755, 754, 755, 755, 755,
- 756, 756, 755, 755, 755, 755, 755, 755,
-
- 757, 758, 759, 760, 761, 762, 763, 764,
- 765, 766, 767, 767, 767, 767, 767, 767,
- 767, 767, 767, 767, 768, 756, 755, 756,
- 755, 769, 770, 771, 770, 771, 772, 772,
-
- 747, 747, 747, 773, 747, 747, 747, 747,
- 201, 747, 747, 747, 747, 773, 747, 747,
- 747, 747, 773, 747, 747, 747, 747, 773,
- 747, 747, 747, 747, 773, 747, 747, 747,
-
- 747, 747, 747, 747, 747, 747, 747, 747,
- 747, 773, 774, 775, 775, 201, 201, 201,
- 201, 776, 777, 778, 779, 778, 778, 780,
- 778, 780, 777, 777, 777, 777, 781, 782,
-
- 777, 778, 783, 783, 784, 752, 783, 783,
- 747, 747, 747, 747, 785, 786, 786, 786,
- 781, 781, 781, 778, 781, 781, 787, 781,
- 201, 781, 781, 781, 781, 778, 781, 781,
-
- 781, 781, 778, 781, 781, 781, 781, 778,
- 781, 781, 781, 781, 778, 781, 787, 787,
- 787, 781, 781, 781, 781, 781, 781, 781,
- 787, 778, 787, 787, 787, 201, 788, 788,
-
- 789, 789, 789, 789, 789, 789, 790, 789,
- 789, 789, 789, 789, 789, 201, 791, 789,
- 792, 792, 793, 794, 795, 796, 796, 796,
- 796, 797, 797, 201, 201, 201, 201, 201,
-
- 798, 798, 798, 798, 798, 798, 798, 798,
- 798, 798, 798, 798, 798, 798, 798, 798,
- 798, 798, 798, 798, 798, 798, 798, 798,
- 798, 798, 798, 798, 798, 798, 798, 798,
-
- 798, 798, 799, 798, 798, 798, 800, 798,
- 799, 798, 798, 801, 802, 803, 804, 803,
- 803, 805, 803, 806, 806, 806, 803, 807,
- 802, 808, 809, 810, 810, 806, 806, 799,
-
- 811, 812, 813, 814, 815, 816, 817, 818,
- 819, 820, 821, 821, 822, 822, 822, 822,
- 798, 798, 798, 798, 798, 798, 805, 805,
- 803, 803, 799, 799, 799, 799, 806, 806,
-
- 806, 799, 801, 801, 801, 799, 799, 801,
- 801, 801, 801, 801, 801, 801, 799, 799,
- 799, 806, 806, 806, 806, 799, 799, 799,
- 799, 799, 799, 799, 799, 799, 799, 799,
-
- 799, 799, 806, 801, 810, 806, 806, 801,
- 801, 801, 801, 801, 801, 823, 799, 801,
- 824, 825, 826, 827, 828, 829, 830, 831,
- 832, 833, 834, 834, 834, 835, 836, 836,
-
- 837, 837, 837, 837, 837, 837, 837, 837,
- 837, 837, 837, 837, 837, 837, 837, 837,
- 837, 837, 837, 837, 837, 837, 837, 837,
- 837, 837, 837, 837, 837, 837, 837, 837,
-
- 837, 837, 837, 837, 837, 837, 201, 838,
- 201, 201, 201, 201, 201, 838, 201, 201,
- 839, 839, 839, 839, 839, 839, 839, 839,
- 839, 839, 839, 839, 839, 839, 839, 839,
-
- 839, 839, 839, 839, 839, 839, 839, 839,
- 839, 839, 839, 839, 839, 839, 839, 839,
- 839, 839, 839, 839, 839, 839, 839, 840,
- 840, 841, 841, 842, 843, 844, 844, 844,
-
- 845, 845, 845, 845, 845, 845, 845, 845,
- 845, 845, 845, 845, 845, 845, 845, 845,
- 845, 845, 845, 845, 845, 845, 845, 845,
- 845, 845, 845, 845, 845, 845, 845, 845,
-
- 845, 845, 845, 845, 845, 845, 845, 845,
- 845, 845, 845, 845, 845, 845, 845, 845,
- 845, 845, 845, 845, 845, 845, 845, 845,
- 845, 845, 846, 846, 846, 846, 846, 845,
-
- 847, 848, 848, 848, 848, 848, 848, 848,
- 848, 848, 848, 848, 848, 848, 848, 848,
- 848, 848, 848, 848, 848, 848, 847, 847,
- 847, 847, 847, 847, 847, 847, 847, 847,
-
- 847, 847, 847, 847, 847, 847, 847, 847,
- 847, 847, 847, 847, 847, 847, 847, 847,
- 847, 847, 847, 847, 847, 847, 847, 847,
- 847, 847, 847, 847, 847, 847, 847, 847,
-
- 847, 847, 847, 849, 849, 849, 849, 849,
- 850, 850, 850, 850, 850, 850, 850, 850,
- 850, 850, 850, 850, 850, 850, 850, 850,
- 850, 850, 850, 850, 850, 850, 850, 850,
-
- 850, 850, 850, 851, 851, 851, 851, 851,
- 851, 851, 851, 851, 851, 851, 851, 851,
- 851, 851, 851, 851, 851, 851, 851, 851,
- 851, 851, 851, 851, 851, 851, 851, 851,
-
- 851, 851, 851, 851, 851, 851, 851, 851,
- 851, 851, 851, 851, 851, 851, 851, 851,
- 851, 851, 851, 851, 851, 851, 851, 851,
- 851, 851, 852, 852, 852, 852, 852, 852,
-
- 853, 853, 853, 853, 853, 853, 853, 854,
- 853, 853, 853, 853, 853, 853, 853, 853,
- 853, 853, 853, 853, 853, 853, 853, 853,
- 853, 853, 853, 853, 853, 853, 853, 853,
-
- 853, 853, 853, 853, 853, 853, 853, 853,
- 853, 853, 853, 853, 853, 853, 853, 853,
- 853, 853, 853, 853, 853, 853, 853, 853,
- 853, 853, 853, 853, 853, 853, 853, 853,
-
- 853, 853, 853, 853, 853, 853, 853, 854,
- 853, 201, 853, 853, 853, 853, 201, 201,
- 853, 853, 853, 853, 853, 853, 853, 201,
- 853, 201, 853, 853, 853, 853, 201, 201,
-
- 853, 853, 853, 853, 853, 853, 853, 854,
- 853, 201, 853, 853, 853, 853, 201, 201,
- 853, 853, 853, 853, 853, 853, 853, 853,
- 853, 853, 853, 853, 853, 853, 853, 853,
-
- 853, 853, 853, 853, 853, 853, 853, 853,
- 853, 853, 853, 853, 853, 853, 853, 854,
- 853, 201, 853, 853, 853, 853, 201, 201,
- 853, 853, 853, 853, 853, 853, 853, 201,
-
- 853, 201, 853, 853, 853, 853, 201, 201,
- 853, 853, 853, 853, 853, 853, 853, 854,
- 853, 853, 853, 853, 853, 853, 853, 201,
- 853, 853, 853, 853, 853, 853, 853, 853,
-
- 853, 853, 853, 853, 853, 853, 853, 853,
- 853, 853, 853, 853, 853, 853, 853, 854,
- 853, 853, 853, 853, 853, 853, 853, 853,
- 853, 853, 853, 853, 853, 853, 853, 853,
-
- 853, 853, 853, 853, 853, 853, 853, 853,
- 853, 853, 853, 853, 853, 853, 853, 854,
- 853, 201, 853, 853, 853, 853, 201, 201,
- 853, 853, 853, 853, 853, 853, 853, 854,
-
- 853, 853, 853, 853, 853, 853, 853, 854,
- 853, 853, 853, 853, 853, 853, 853, 853,
- 853, 853, 853, 853, 853, 853, 853, 853,
- 853, 853, 853, 201, 201, 855, 855, 856,
-
- 857, 858, 859, 860, 860, 860, 860, 859,
- 859, 861, 862, 863, 864, 865, 866, 867,
- 868, 869, 870, 870, 870, 870, 870, 870,
- 870, 870, 870, 870, 870, 201, 201, 201,
-
- 854, 854, 854, 854, 854, 854, 854, 854,
- 854, 854, 854, 854, 854, 854, 854, 854,
- 871, 871, 871, 871, 871, 871, 871, 871,
- 871, 871, 201, 201, 201, 201, 201, 201,
-
- 872, 873, 874, 875, 876, 877, 878, 879,
- 880, 881, 882, 883, 884, 885, 886, 887,
- 888, 889, 890, 891, 892, 893, 894, 895,
- 896, 897, 898, 899, 900, 901, 902, 903,
-
- 904, 905, 906, 907, 908, 909, 910, 911,
- 912, 913, 914, 915, 916, 917, 918, 919,
- 920, 921, 922, 923, 924, 925, 926, 927,
- 928, 929, 930, 931, 932, 933, 934, 935,
-
- 936, 937, 938, 939, 940, 941, 942, 943,
- 944, 945, 946, 947, 948, 949, 950, 951,
- 952, 952, 952, 952, 952, 953, 201, 201,
- 954, 954, 954, 954, 954, 954, 201, 201,
-
- 955, 956, 956, 956, 956, 956, 956, 956,
- 956, 956, 956, 956, 956, 956, 956, 956,
- 956, 956, 956, 956, 956, 956, 956, 956,
- 956, 956, 956, 956, 956, 956, 956, 956,
-
- 956, 956, 956, 956, 956, 956, 956, 956,
- 956, 956, 956, 956, 956, 956, 956, 956,
- 956, 956, 956, 956, 956, 956, 956, 956,
- 956, 956, 956, 956, 956, 956, 956, 956,
-
- 956, 956, 956, 956, 956, 956, 956, 956,
- 956, 956, 956, 956, 956, 957, 958, 956,
- 956, 956, 956, 956, 956, 956, 956, 959,
- 959, 959, 959, 959, 959, 959, 959, 959,
-
- 960, 961, 961, 961, 961, 961, 961, 961,
- 961, 961, 961, 961, 961, 961, 961, 961,
- 961, 961, 961, 961, 961, 961, 961, 961,
- 961, 961, 961, 962, 963, 201, 201, 201,
-
- 964, 964, 964, 964, 964, 964, 964, 964,
- 964, 964, 964, 964, 964, 964, 964, 964,
- 964, 964, 964, 964, 964, 964, 964, 964,
- 964, 964, 964, 964, 964, 964, 964, 964,
-
- 964, 964, 964, 964, 964, 964, 964, 964,
- 964, 964, 964, 965, 965, 965, 966, 966,
- 966, 967, 967, 967, 967, 967, 967, 967,
- 967, 201, 201, 201, 201, 201, 201, 201,
-
- 968, 968, 968, 968, 968, 968, 968, 968,
- 968, 968, 968, 968, 968, 201, 968, 968,
- 968, 968, 969, 969, 970, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
-
- 971, 971, 971, 971, 971, 971, 971, 971,
- 971, 971, 971, 971, 971, 971, 971, 971,
- 971, 971, 972, 972, 973, 974, 974, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
-
- 975, 975, 975, 975, 975, 975, 975, 975,
- 975, 975, 975, 975, 975, 975, 975, 975,
- 975, 975, 976, 976, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
-
- 977, 977, 977, 977, 977, 977, 977, 977,
- 977, 977, 977, 977, 977, 201, 977, 977,
- 977, 201, 978, 978, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
-
- 979, 979, 979, 979, 979, 979, 979, 979,
- 979, 979, 979, 979, 979, 979, 979, 979,
- 979, 979, 979, 979, 979, 979, 979, 979,
- 979, 979, 979, 979, 979, 979, 979, 979,
-
- 979, 979, 979, 979, 979, 979, 979, 979,
- 979, 979, 979, 979, 979, 979, 979, 979,
- 979, 979, 979, 979, 980, 980, 981, 980,
- 980, 980, 980, 980, 980, 980, 981, 981,
-
- 981, 981, 981, 981, 981, 981, 980, 981,
- 981, 980, 980, 980, 980, 980, 980, 980,
- 980, 980, 982, 980, 983, 983, 984, 985,
- 983, 986, 983, 987, 979, 988, 201, 201,
-
- 989, 990, 991, 992, 993, 994, 995, 996,
- 997, 998, 201, 201, 201, 201, 201, 201,
- 999, 999, 999, 999, 999, 999, 999, 999,
- 999, 999, 201, 201, 201, 201, 201, 201,
-
- 1000, 1000, 1001, 1002, 1003, 1004, 1005, 1006,
- 1007, 1008, 1009, 1010, 1010, 1010, 1011, 201,
- 1012, 1013, 1014, 1015, 1016, 1017, 1018, 1019,
- 1020, 1021, 201, 201, 201, 201, 201, 201,
-
- 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022,
- 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022,
- 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022,
- 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022,
-
- 1022, 1022, 1022, 1023, 1022, 1022, 1022, 1022,
- 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022,
- 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022,
- 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022,
-
- 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022,
- 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022,
- 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022,
- 201, 201, 201, 201, 201, 201, 201, 201,
-
- 1024, 1024, 1024, 1024, 1024, 1010, 1010, 1022,
- 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022,
- 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022,
- 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022,
-
- 1022, 1022, 1022, 1022, 1022, 1022, 1022, 1022,
- 1022, 1025, 1026, 201, 201, 201, 201, 201,
- 959, 959, 959, 959, 959, 959, 959, 959,
- 959, 959, 959, 959, 959, 959, 959, 959,
-
- 959, 959, 959, 959, 959, 959, 959, 959,
- 959, 959, 959, 959, 959, 959, 959, 959,
- 959, 959, 959, 959, 959, 959, 959, 959,
- 959, 959, 959, 959, 959, 959, 959, 959,
-
- 959, 959, 959, 959, 959, 959, 959, 959,
- 959, 959, 959, 959, 959, 959, 959, 959,
- 959, 959, 959, 959, 959, 959, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
-
- 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027,
- 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027,
- 1027, 1027, 1027, 1027, 1027, 1027, 1027, 1027,
- 1027, 1027, 1027, 1027, 1027, 1028, 1028, 201,
-
- 1029, 1029, 1029, 1030, 1030, 1030, 1030, 1029,
- 1029, 1030, 1030, 1030, 201, 201, 201, 201,
- 1030, 1030, 1029, 1030, 1030, 1030, 1030, 1030,
- 1030, 1031, 1032, 1033, 201, 201, 201, 201,
-
- 1034, 201, 201, 201, 1035, 1035, 1036, 1037,
- 1038, 1039, 1040, 1041, 1042, 1043, 1044, 1045,
- 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046,
- 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046,
-
- 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046,
- 1046, 1046, 1046, 1046, 1046, 1046, 201, 201,
- 1046, 1046, 1046, 1046, 1046, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
-
- 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047,
- 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047,
- 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047,
- 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047,
-
- 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047,
- 1047, 1047, 1048, 1048, 201, 201, 201, 201,
- 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047,
- 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047,
-
- 1047, 1047, 1047, 1047, 1047, 1047, 1047, 1047,
- 1047, 1047, 201, 201, 201, 201, 201, 201,
- 1049, 1050, 1051, 1052, 1053, 1054, 1055, 1056,
- 1057, 1058, 1059, 201, 201, 201, 1060, 1060,
-
- 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061,
- 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061,
- 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061,
- 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061,
-
- 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062,
- 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062,
- 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1063,
- 1064, 1065, 1065, 1066, 201, 201, 1067, 1067,
-
- 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068,
- 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068,
- 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068,
- 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068,
-
- 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068,
- 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068,
- 1068, 1068, 1068, 1068, 1068, 1069, 1070, 1069,
- 1070, 1070, 1070, 1070, 1070, 1070, 1070, 201,
-
- 1071, 1072, 1070, 1072, 1072, 1070, 1070, 1070,
- 1070, 1070, 1070, 1070, 1070, 1069, 1069, 1069,
- 1069, 1069, 1069, 1070, 1070, 1073, 1073, 1073,
- 1073, 1073, 1073, 1073, 1073, 201, 201, 1074,
-
- 1075, 1076, 1077, 1078, 1079, 1080, 1081, 1082,
- 1083, 1084, 201, 201, 201, 201, 201, 201,
- 1075, 1076, 1077, 1078, 1079, 1080, 1081, 1082,
- 1083, 1084, 201, 201, 201, 201, 201, 201,
-
- 1085, 1085, 1085, 1085, 1085, 1085, 1085, 1086,
- 1087, 1087, 1087, 1087, 1085, 1085, 201, 201,
- 1088, 1088, 1088, 1088, 1088, 1089, 1089, 1089,
- 1089, 1089, 1089, 1088, 1088, 1089, 1090, 201,
-
- 1091, 1091, 1091, 1091, 1092, 1093, 1094, 1093,
- 1094, 1093, 1094, 1093, 1094, 1093, 1094, 1093,
- 1093, 1093, 1094, 1093, 1093, 1093, 1093, 1093,
- 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093,
-
- 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093,
- 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093,
- 1093, 1093, 1093, 1093, 1095, 1096, 1091, 1091,
- 1091, 1091, 1091, 1097, 1091, 1097, 1092, 1092,
-
- 1097, 1097, 1091, 1097, 1098, 1093, 1093, 1093,
- 1093, 1093, 1093, 1093, 201, 201, 201, 201,
- 1099, 1100, 1101, 1102, 1103, 1104, 1105, 1106,
- 1107, 1108, 1109, 1109, 1110, 1111, 1109, 1109,
-
- 1111, 1112, 1112, 1112, 1112, 1112, 1112, 1112,
- 1112, 1112, 1112, 1113, 1114, 1113, 1113, 1113,
- 1113, 1113, 1113, 1113, 1112, 1112, 1112, 1112,
- 1112, 1112, 1112, 1112, 1112, 201, 201, 201,
-
- 1115, 1115, 1116, 1117, 1117, 1117, 1117, 1117,
- 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117,
- 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117,
- 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117,
-
- 1117, 1116, 1115, 1115, 1115, 1115, 1116, 1116,
- 1115, 1115, 1118, 1119, 1120, 1120, 1117, 1117,
- 1121, 1122, 1123, 1124, 1125, 1126, 1127, 1128,
- 1129, 1130, 1131, 1131, 1131, 1131, 1131, 1131,
-
- 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132,
- 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132,
- 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132,
- 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132,
-
- 1132, 1132, 1132, 1132, 1132, 1132, 1133, 1134,
- 1135, 1135, 1134, 1134, 1134, 1135, 1134, 1135,
- 1135, 1135, 1136, 1136, 201, 201, 201, 201,
- 201, 201, 201, 201, 1137, 1137, 1137, 1137,
-
- 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138,
- 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138,
- 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138,
- 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138,
-
- 1138, 1138, 1138, 1138, 1139, 1139, 1139, 1139,
- 1139, 1139, 1139, 1139, 1140, 1140, 1140, 1140,
- 1140, 1140, 1140, 1140, 1139, 1139, 1140, 1141,
- 201, 201, 201, 1142, 1142, 1143, 1143, 1143,
-
- 1144, 1145, 1146, 1147, 1148, 1149, 1150, 1151,
- 1152, 1153, 201, 201, 201, 1138, 1138, 1138,
- 1154, 1155, 1156, 1157, 1158, 1159, 1160, 1161,
- 1162, 1163, 1164, 1164, 1164, 1164, 1164, 1164,
-
- 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164,
- 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164,
- 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164,
- 1165, 1165, 1165, 1165, 1165, 1165, 1166, 1166,
-
- 1167, 1168, 1169, 1170, 1170, 1171, 1172, 1173,
- 1174, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
-
- 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 1176, 1176, 1176, 1177, 1178, 1179, 1179, 1179,
- 1179, 1179, 1176, 1176, 1179, 1179, 1179, 1179,
-
- 1176, 1180, 1178, 1178, 1178, 1178, 1178, 1178,
- 1178, 1181, 1181, 1181, 1181, 1179, 1181, 1181,
- 1181, 1181, 1180, 1182, 1183, 1184, 1184, 1185,
- 1088, 1088, 201, 201, 201, 201, 201, 201,
-
- 114, 114, 114, 114, 114, 114, 114, 114,
- 114, 114, 114, 114, 114, 114, 114, 114,
- 114, 114, 114, 114, 114, 114, 114, 114,
- 114, 114, 114, 114, 114, 114, 114, 114,
-
- 114, 114, 114, 114, 114, 114, 1186, 1186,
- 1186, 1186, 1186, 1187, 1188, 1188, 1188, 1189,
- 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188,
- 1188, 1188, 1188, 1189, 1188, 1188, 1188, 1188,
-
- 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188,
- 1188, 1188, 1188, 1188, 1188, 1188, 1189, 1188,
- 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188,
- 1188, 1188, 1188, 1188, 1188, 1190, 1190, 1190,
-
- 1190, 1190, 1188, 1188, 1188, 1188, 1190, 1190,
- 1190, 1190, 1190, 114, 115, 115, 115, 115,
- 115, 115, 115, 115, 115, 115, 115, 115,
- 1191, 1192, 115, 115, 115, 1193, 115, 115,
-
- 115, 115, 115, 115, 115, 115, 115, 115,
- 115, 115, 115, 115, 115, 115, 115, 115,
- 115, 115, 115, 115, 115, 115, 115, 115,
- 115, 115, 115, 1194, 1194, 1194, 1194, 1194,
-
- 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194,
- 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194,
- 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194,
- 1194, 1194, 1194, 1194, 1194, 1194, 1194, 1195,
-
- 190, 190, 189, 190, 1196, 1196, 1196, 1196,
- 1196, 1196, 1197, 1198, 1198, 1199, 1200, 1201,
- 1202, 1198, 1198, 1198, 1198, 1198, 1198, 1198,
- 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198,
-
- 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1088,
- 1088, 1088, 1088, 1088, 1088, 1088, 1088, 1088,
- 1088, 1088, 1088, 1088, 1088, 1088, 1203, 1204,
- 1204, 1205, 201, 1206, 1207, 1179, 1196, 1197,
-
- 70, 71, 70, 71, 70, 71, 70, 71,
- 70, 71, 70, 71, 70, 71, 70, 71,
- 70, 71, 70, 71, 70, 71, 70, 71,
- 70, 71, 70, 71, 70, 71, 70, 71,
-
- 70, 71, 70, 71, 70, 71, 70, 71,
- 70, 71, 70, 71, 70, 71, 70, 71,
- 70, 71, 70, 71, 70, 71, 1208, 1209,
- 1210, 1211, 1212, 1213, 1214, 1214, 1215, 1214,
-
- 70, 71, 70, 71, 70, 71, 70, 71,
- 70, 71, 70, 71, 70, 71, 70, 71,
- 70, 71, 70, 71, 70, 71, 70, 71,
- 70, 71, 1216, 1217, 1216, 1217, 1216, 1217,
-
- 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218,
- 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219,
- 1218, 1218, 1218, 1218, 1218, 1218, 201, 201,
- 1219, 1219, 1219, 1219, 1219, 1219, 201, 201,
-
- 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218,
- 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219,
- 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218,
- 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219,
-
- 1218, 1218, 1218, 1218, 1218, 1218, 201, 201,
- 1219, 1219, 1219, 1219, 1219, 1219, 201, 201,
- 1220, 1218, 1221, 1218, 1222, 1218, 1223, 1218,
- 201, 1219, 201, 1219, 201, 1219, 201, 1219,
-
- 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218,
- 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219,
- 1224, 1225, 1226, 1227, 1226, 1227, 1228, 1229,
- 1230, 1231, 1232, 1233, 1234, 1235, 201, 201,
-
- 1236, 1237, 1238, 1239, 1240, 1241, 1242, 1243,
- 1244, 1245, 1246, 1247, 1248, 1249, 1250, 1251,
- 1252, 1253, 1254, 1255, 1256, 1257, 1258, 1259,
- 1260, 1261, 1262, 1263, 1264, 1265, 1266, 1267,
-
- 1268, 1269, 1270, 1271, 1272, 1273, 1274, 1275,
- 1276, 1277, 1278, 1279, 1280, 1281, 1282, 1283,
- 1218, 1218, 1284, 1285, 1286, 201, 1287, 1288,
- 1219, 1219, 1289, 1290, 1291, 206, 1292, 206,
-
- 206, 1293, 1294, 1295, 1296, 201, 1297, 1298,
- 1299, 1300, 1299, 1300, 1301, 1293, 1293, 1293,
- 1218, 1218, 1302, 1303, 201, 201, 1304, 1305,
- 1219, 1219, 1306, 1307, 201, 1293, 1293, 1293,
-
- 1218, 1218, 1308, 1309, 1310, 1311, 1312, 1313,
- 1219, 1219, 1314, 1315, 1316, 1293, 1317, 1317,
- 201, 201, 1318, 1319, 1320, 201, 1321, 1322,
- 1323, 1324, 1325, 1326, 1327, 1328, 206, 201,
-
- 1329, 1329, 1330, 1330, 1330, 1330, 1330, 1331,
- 1330, 1330, 1330, 1332, 1333, 1334, 1335, 1336,
- 1337, 1338, 1337, 1339, 1340, 1341, 14, 1342,
- 1343, 1344, 1345, 1346, 1346, 1347, 1345, 1346,
-
- 14, 14, 14, 14, 1348, 1349, 1349, 1350,
- 1351, 1352, 1353, 1354, 1355, 1356, 1357, 1358,
- 13, 13, 13, 1359, 1359, 1360, 1361, 1361,
- 14, 1362, 1363, 14, 1364, 1365, 1342, 43,
-
- 43, 14, 14, 14, 1366, 16, 1367, 1368,
- 1369, 1369, 1370, 1370, 1370, 1370, 1371, 1371,
- 1371, 1371, 1372, 1373, 1374, 1375, 1376, 1377,
- 1376, 1376, 1376, 1376, 1375, 1376, 1376, 1378,
-
- 1379, 1380, 1380, 1380, 1381, 1382, 1383, 1384,
- 1385, 1386, 1387, 1387, 1387, 1387, 1387, 1387,
- 1388, 1389, 201, 201, 1390, 1391, 1392, 1393,
- 1394, 1395, 1396, 1396, 1397, 1398, 1399, 159,
-
- 1388, 63, 58, 59, 1390, 1391, 1392, 1393,
- 1394, 1395, 1396, 1396, 1397, 1398, 1399, 201,
- 1194, 1194, 1194, 1194, 1194, 1400, 1400, 1400,
- 1400, 1400, 1400, 1400, 1400, 201, 201, 201,
-
- 12, 12, 12, 12, 12, 12, 12, 50,
- 1401, 12, 12, 1402, 1403, 1404, 1404, 1404,
- 1405, 1405, 1406, 1406, 1406, 1406, 1407, 1408,
- 1408, 1409, 1410, 1411, 1412, 1412, 1413, 1414,
-
- 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415,
- 1415, 1415, 1415, 1415, 1415, 1415, 1415, 1415,
- 172, 172, 179, 179, 172, 172, 172, 172,
- 179, 179, 179, 172, 172, 1416, 1416, 1416,
-
- 1416, 172, 1417, 1417, 1418, 1419, 1419, 196,
- 1420, 196, 1419, 1421, 1197, 1197, 1197, 1197,
- 1198, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
-
- 1422, 1422, 1423, 1424, 51, 1422, 1422, 1423,
- 51, 1424, 1425, 1423, 1423, 1423, 1425, 1425,
- 1423, 1423, 1423, 1425, 51, 1423, 1426, 51,
- 36, 1423, 1423, 1423, 1423, 1423, 51, 51,
-
- 1422, 1422, 1422, 51, 1423, 51, 1427, 51,
- 1423, 51, 1428, 1429, 1423, 1423, 1430, 1425,
- 1423, 1423, 1431, 1423, 1425, 1432, 1432, 1432,
- 1432, 1433, 1434, 1435, 1436, 1437, 1438, 1438,
-
- 1439, 1372, 1372, 1372, 1372, 1438, 1437, 1437,
- 1437, 1437, 1440, 1372, 1441, 1442, 1443, 1444,
- 1445, 1445, 1445, 65, 65, 65, 65, 65,
- 65, 65, 65, 65, 65, 65, 65, 65,
-
- 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446,
- 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446,
- 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447,
- 1447, 1447, 1447, 1447, 1447, 1447, 1447, 1447,
-
- 1448, 1448, 1448, 111, 123, 1449, 1449, 1449,
- 1449, 1445, 1450, 1450, 201, 201, 201, 201,
- 36, 36, 36, 36, 36, 51, 51, 51,
- 51, 51, 1451, 1451, 51, 51, 51, 51,
-
- 36, 51, 51, 36, 51, 51, 36, 51,
- 51, 51, 51, 51, 51, 51, 1451, 51,
- 51, 51, 51, 51, 51, 51, 51, 51,
- 51, 51, 51, 51, 51, 51, 51, 51,
-
- 51, 51, 51, 51, 51, 51, 51, 51,
- 51, 51, 51, 51, 51, 1452, 1451, 1451,
- 51, 51, 36, 51, 36, 51, 51, 51,
- 51, 51, 51, 51, 51, 51, 51, 51,
-
- 51, 51, 51, 51, 51, 51, 51, 51,
- 51, 51, 51, 1434, 1434, 1434, 1434, 1434,
- 1434, 1434, 1434, 1434, 1372, 1372, 1372, 1372,
- 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372,
-
- 36, 36, 36, 36, 1451, 36, 36, 36,
- 1453, 1454, 1453, 1455, 1456, 1455, 36, 36,
- 36, 36, 18, 57, 36, 1457, 36, 36,
- 36, 36, 36, 36, 36, 36, 36, 36,
-
- 36, 36, 36, 36, 1451, 36, 1451, 36,
- 36, 36, 36, 36, 1397, 1397, 36, 1397,
- 1397, 36, 36, 36, 36, 36, 36, 36,
- 36, 36, 36, 36, 1458, 1459, 36, 36,
-
- 36, 1451, 36, 1460, 1451, 36, 36, 1451,
- 36, 1451, 36, 36, 36, 36, 36, 36,
- 36, 36, 1458, 1459, 1458, 1459, 36, 36,
- 36, 36, 36, 36, 36, 36, 36, 36,
-
- 1451, 36, 1451, 36, 1458, 1459, 1458, 1459,
- 1458, 1459, 1458, 1459, 36, 1451, 1461, 1462,
- 1461, 1462, 1458, 1459, 1461, 1462, 1458, 1459,
- 1461, 1462, 1458, 1459, 1458, 1459, 1458, 1459,
-
- 1461, 1462, 1458, 1459, 1461, 1462, 1458, 1459,
- 1461, 1462, 1458, 1459, 36, 36, 36, 1458,
- 1459, 1458, 1459, 36, 36, 36, 36, 36,
- 1463, 36, 36, 36, 36, 36, 36, 36,
-
- 36, 36, 1458, 1459, 36, 36, 1464, 36,
- 1465, 1466, 36, 1466, 1451, 1451, 1451, 1451,
- 1458, 1459, 1458, 1459, 1458, 1459, 1458, 1459,
- 36, 36, 36, 36, 36, 36, 36, 36,
-
- 36, 36, 36, 36, 36, 36, 36, 36,
- 36, 1458, 1459, 1458, 1459, 1467, 36, 36,
- 1458, 1459, 36, 36, 36, 36, 1458, 1459,
- 1458, 1459, 1458, 1459, 1458, 1459, 1458, 1459,
-
- 1461, 1462, 1461, 1462, 1458, 1459, 1458, 1459,
- 1458, 1459, 1461, 1462, 1461, 1462, 36, 1468,
- 1458, 1459, 1469, 1469, 1469, 1372, 1470, 1470,
- 1372, 1372, 1471, 1471, 1471, 1472, 1472, 1372,
-
- 51, 1434, 51, 51, 51, 51, 51, 51,
- 16, 1367, 16, 1367, 51, 51, 51, 51,
- 51, 51, 51, 51, 51, 51, 51, 51,
- 51, 51, 1473, 1473, 51, 51, 51, 51,
-
- 36, 36, 51, 51, 51, 51, 51, 51,
- 51, 1474, 1475, 51, 51, 51, 51, 51,
- 51, 51, 51, 51, 51, 51, 1476, 1476,
- 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476,
-
- 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476,
- 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476,
- 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476,
- 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476,
-
- 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476,
- 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476,
- 1476, 1476, 1476, 1476, 1476, 1476, 1476, 1476,
- 1476, 1476, 1476, 1434, 1372, 1434, 1434, 1434,
-
- 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434,
- 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434,
- 1434, 1434, 1434, 1434, 1434, 1477, 1434, 1434,
- 1434, 1434, 1434, 1372, 1372, 1372, 1372, 1372,
-
- 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372,
- 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372,
- 1372, 1372, 1372, 1372, 1440, 1440, 1440, 1440,
- 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440,
-
- 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440,
- 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1478,
- 1478, 1441, 1441, 1441, 1441, 1441, 1441, 1441,
- 1441, 1441, 1441, 1441, 1479, 1479, 1479, 1479,
-
- 1479, 1479, 1442, 1442, 1442, 1442, 1442, 1442,
- 1480, 1481, 1481, 1481, 1481, 1481, 1481, 1481,
- 1482, 1482, 1482, 1482, 1483, 1483, 1483, 1483,
- 1483, 1483, 1483, 1484, 1484, 1484, 1484, 1485,
-
- 51, 51, 51, 51, 51, 51, 51, 51,
- 51, 51, 51, 51, 51, 51, 51, 51,
- 51, 51, 51, 51, 51, 51, 51, 51,
- 51, 51, 51, 51, 51, 51, 51, 51,
-
- 51, 51, 51, 51, 51, 1434, 1434, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
-
- 51, 51, 51, 51, 51, 51, 51, 51,
- 51, 51, 51, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
-
- 1486, 1487, 1488, 1489, 1490, 1491, 1492, 1493,
- 1494, 65, 65, 65, 65, 65, 65, 65,
- 65, 65, 65, 65, 1486, 1487, 1488, 1489,
- 1490, 1491, 1492, 1493, 1494, 65, 65, 65,
-
- 65, 65, 65, 65, 65, 65, 65, 65,
- 63, 58, 59, 1390, 1391, 1392, 1393, 1394,
- 1395, 1495, 1495, 1495, 1495, 1495, 1495, 1495,
- 1495, 1495, 1495, 1495, 1496, 1496, 1496, 1496,
-
- 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496,
- 1496, 1496, 1496, 1496, 1496, 1496, 1496, 1496,
- 1496, 1496, 1496, 1496, 1496, 1496, 1497, 1497,
- 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497,
-
- 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497,
- 1497, 1497, 1497, 1497, 1497, 1497, 1497, 1497,
- 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498,
- 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498,
-
- 1498, 1498, 1498, 1498, 1498, 1498, 1498, 1498,
- 1498, 1498, 1499, 1500, 1500, 1500, 1500, 1500,
- 1500, 1500, 1500, 1500, 1500, 1501, 1502, 1503,
- 1504, 1505, 1506, 1507, 1508, 1509, 1500, 1510,
-
- 51, 51, 51, 51, 51, 51, 51, 51,
- 51, 51, 51, 51, 51, 51, 51, 51,
- 51, 51, 51, 51, 51, 51, 1440, 1440,
- 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440,
-
- 51, 51, 51, 51, 51, 51, 51, 51,
- 51, 51, 51, 51, 51, 51, 51, 51,
- 51, 51, 51, 51, 51, 51, 51, 36,
- 51, 51, 51, 51, 51, 51, 51, 51,
-
- 51, 36, 51, 51, 51, 51, 51, 51,
- 51, 51, 51, 51, 51, 51, 51, 51,
- 51, 51, 51, 51, 51, 51, 51, 51,
- 51, 51, 51, 51, 51, 51, 51, 51,
-
- 51, 51, 51, 51, 51, 51, 51, 51,
- 51, 51, 51, 51, 51, 51, 51, 51,
- 1434, 1434, 1434, 1434, 1434, 1434, 1434, 1434,
- 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372,
-
- 1473, 1473, 1473, 1473, 51, 51, 51, 51,
- 51, 51, 51, 51, 51, 51, 51, 51,
- 51, 51, 51, 51, 1511, 1511, 1440, 1440,
- 1512, 1434, 1473, 1473, 1473, 1513, 1473, 1473,
-
- 51, 51, 51, 51, 51, 51, 51, 51,
- 51, 51, 51, 51, 51, 51, 51, 51,
- 51, 51, 51, 51, 51, 51, 51, 51,
- 51, 1473, 1473, 1473, 51, 51, 51, 51,
-
- 1514, 51, 1514, 51, 51, 51, 51, 51,
- 51, 51, 51, 51, 51, 51, 51, 51,
- 51, 51, 51, 51, 51, 51, 51, 51,
- 51, 51, 51, 51, 51, 51, 51, 51,
-
- 51, 51, 51, 51, 51, 51, 51, 51,
- 1473, 51, 51, 51, 51, 51, 51, 36,
- 1434, 1434, 1440, 1440, 1440, 1440, 1440, 1440,
- 1440, 1440, 1440, 1440, 1440, 1440, 1441, 1512,
-
- 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440,
- 1440, 1440, 1478, 1478, 1478, 1478, 1478, 1478,
- 1478, 1478, 1441, 1441, 1441, 1515, 1515, 1441,
- 1441, 1441, 1441, 1441, 1441, 1516, 1480, 1480,
-
- 1478, 1478, 1441, 1441, 1441, 1441, 1441, 1441,
- 1441, 1441, 1441, 1441, 1517, 1441, 1441, 1441,
- 1441, 1441, 1442, 1516, 1516, 1516, 1516, 1516,
- 1516, 1516, 1516, 1516, 1516, 1518, 1518, 1518,
-
- 1519, 1519, 1519, 1519, 1518, 1518, 1518, 1518,
- 1518, 1480, 1480, 1480, 1480, 1518, 1481, 1518,
- 1518, 1518, 1480, 1518, 1518, 1480, 1480, 1480,
- 1518, 1518, 1480, 1480, 1518, 1480, 1480, 1518,
-
- 1518, 1518, 1481, 1480, 1481, 1481, 1481, 1481,
- 1480, 1480, 1518, 1480, 1480, 1480, 1480, 1480,
- 1480, 1518, 1518, 1518, 1518, 1518, 1480, 1518,
- 1518, 1520, 1518, 1480, 1480, 1518, 1518, 1518,
-
- 1521, 1473, 1473, 1473, 1473, 1481, 51, 51,
- 1522, 1473, 1523, 1523, 1513, 1513, 51, 51,
- 51, 51, 51, 51, 51, 51, 51, 51,
- 51, 51, 51, 51, 51, 51, 51, 51,
-
- 51, 51, 51, 51, 51, 51, 51, 51,
- 1481, 51, 51, 51, 51, 51, 51, 51,
- 51, 51, 51, 51, 51, 51, 51, 51,
- 51, 51, 51, 51, 51, 51, 51, 51,
-
- 51, 51, 51, 51, 51, 51, 51, 51,
- 51, 51, 51, 51, 1481, 51, 1481, 51,
- 51, 51, 51, 1481, 1481, 1481, 51, 1480,
- 51, 51, 51, 1524, 1524, 1524, 1524, 1525,
-
- 1525, 51, 1526, 1526, 1522, 51, 51, 51,
- 1527, 1528, 1527, 1528, 1527, 1528, 1527, 1528,
- 1527, 1528, 1527, 1528, 1527, 1528, 1529, 1530,
- 1531, 1532, 1533, 1534, 1535, 1536, 1537, 1538,
-
- 1529, 1530, 1531, 1532, 1533, 1534, 1535, 1536,
- 1537, 1538, 1529, 1530, 1531, 1532, 1533, 1534,
- 1535, 1536, 1537, 1538, 51, 1481, 1481, 1481,
- 51, 51, 51, 51, 51, 51, 51, 51,
-
- 51, 51, 51, 51, 51, 51, 51, 51,
- 51, 51, 51, 51, 51, 51, 51, 51,
- 1481, 51, 51, 51, 51, 51, 51, 51,
- 51, 51, 51, 51, 51, 51, 51, 1481,
-
- 1539, 1539, 1539, 1540, 1541, 1542, 1543, 1479,
- 1544, 1545, 1479, 1546, 1547, 1548, 1549, 1549,
- 1372, 1372, 1372, 1372, 1372, 1550, 1551, 1372,
- 1372, 1372, 1372, 1372, 1372, 1550, 1551, 1372,
-
- 1372, 1372, 1550, 1551, 1550, 1551, 1527, 1528,
- 1527, 1528, 1527, 1528, 1552, 1553, 1552, 1553,
- 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372,
- 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372,
-
- 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554,
- 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554,
- 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554,
- 1554, 1554, 1554, 1554, 1554, 1554, 1554, 1554,
-
- 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372,
- 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372,
- 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372,
- 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372,
-
- 1372, 1372, 1372, 1527, 1528, 1527, 1528, 1527,
- 1528, 1527, 1528, 1527, 1528, 1555, 1556, 1557,
- 1558, 1527, 1528, 1527, 1528, 1527, 1528, 1527,
- 1528, 1372, 1372, 1372, 1372, 1372, 1372, 1372,
-
- 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372,
- 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372,
- 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372,
- 1559, 1372, 1372, 1372, 1372, 1372, 1372, 1372,
-
- 1550, 1551, 1372, 1372, 1550, 1551, 1372, 1372,
- 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1550,
- 1551, 1550, 1551, 1372, 1550, 1551, 1372, 1372,
- 1527, 1528, 1527, 1528, 1372, 1372, 1372, 1372,
-
- 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372,
- 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372,
- 1372, 1372, 1372, 1372, 1372, 1560, 1372, 1372,
- 1550, 1551, 1372, 1372, 1527, 1528, 1372, 1372,
-
- 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372,
- 1372, 1372, 1372, 1372, 1439, 1372, 1372, 1372,
- 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372,
- 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372,
-
- 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372,
- 1372, 1372, 1372, 1550, 1551, 1550, 1551, 1372,
- 1372, 1372, 1372, 1372, 1550, 1551, 1372, 1372,
- 1372, 1372, 1372, 1372, 1550, 1551, 1372, 1372,
-
- 1372, 1372, 1372, 1372, 1550, 1551, 1372, 1372,
- 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1372,
- 1372, 1372, 1372, 1372, 1439, 1439, 1439, 1372,
- 1372, 1550, 1551, 1372, 1372, 1550, 1551, 1550,
-
- 1551, 1550, 1551, 1550, 1551, 1372, 1372, 1372,
- 1372, 1372, 1372, 1550, 1551, 1372, 1372, 1372,
- 1372, 1550, 1551, 1550, 1551, 1550, 1551, 1550,
- 1551, 1550, 1551, 1550, 1551, 1372, 1372, 1372,
-
- 1372, 1550, 1551, 1372, 1372, 1372, 1550, 1551,
- 1550, 1551, 1550, 1551, 1550, 1551, 1372, 1550,
- 1551, 1372, 1372, 1550, 1551, 1372, 1372, 1372,
- 1372, 1372, 1372, 1550, 1551, 1550, 1551, 1550,
-
- 1551, 1550, 1551, 1550, 1551, 1550, 1551, 1372,
- 1372, 1372, 1372, 1372, 1372, 1550, 1551, 1550,
- 1551, 1550, 1551, 1550, 1551, 1550, 1551, 1372,
- 1372, 1372, 1372, 1372, 1561, 1372, 1562, 1372,
-
- 1372, 1372, 1372, 1563, 1564, 1563, 1372, 1372,
- 1372, 1372, 1372, 1372, 1550, 1551, 1372, 1372,
- 1372, 1372, 1372, 1372, 1372, 1372, 1372, 1550,
- 1551, 1550, 1551, 1372, 1372, 1372, 1372, 1372,
-
- 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478,
- 1478, 1478, 1478, 1478, 1478, 1478, 1441, 1441,
- 1441, 1441, 1441, 1441, 1442, 1442, 1442, 1442,
- 1442, 1442, 1442, 1516, 1516, 1516, 1516, 1516,
-
- 1442, 1442, 1442, 1442, 1516, 1516, 1516, 1516,
- 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516,
- 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547,
- 1547, 1547, 1547, 1547, 1547, 1547, 1547, 1547,
-
- 1547, 1547, 1547, 1547, 1547, 1516, 1516, 1547,
- 1547, 1547, 1547, 1547, 1547, 1483, 1483, 1483,
- 1516, 1516, 1516, 1516, 1516, 1480, 1480, 1480,
- 1480, 1480, 1483, 1483, 1483, 1483, 1483, 1483,
-
- 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483,
- 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483,
- 1483, 1483, 1483, 1483, 201, 201, 1483, 1483,
- 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483,
-
- 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483,
- 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483,
- 1483, 1483, 1483, 1483, 1483, 1483, 201, 201,
- 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483,
-
- 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483,
- 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483,
- 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483,
- 1483, 1483, 201, 201, 201, 1483, 1483, 1483,
-
- 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483,
- 1483, 201, 1483, 1483, 1483, 1483, 1483, 1483,
- 1483, 1483, 1485, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
-
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 1450, 1450, 1450, 1450,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
-
- 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565,
- 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565,
- 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565,
- 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565,
-
- 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565,
- 1565, 1565, 1565, 1565, 1565, 1565, 1565, 201,
- 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566,
- 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566,
-
- 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566,
- 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566,
- 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566,
- 1566, 1566, 1566, 1566, 1566, 1566, 1566, 201,
-
- 127, 123, 1567, 1568, 1569, 1570, 1571, 127,
- 123, 127, 123, 127, 123, 1572, 1573, 1574,
- 1575, 1214, 1216, 1217, 1576, 127, 123, 1576,
- 1214, 1214, 1214, 1214, 1577, 1577, 1578, 1579,
-
- 1580, 1581, 1580, 1581, 1580, 1581, 1580, 1581,
- 1580, 1581, 1580, 1581, 1580, 1581, 1580, 1581,
- 1580, 1581, 1580, 1581, 1580, 1581, 1580, 1581,
- 1580, 1581, 1580, 1581, 1580, 1581, 1580, 1581,
-
- 1580, 1581, 1580, 1581, 1582, 1583, 1583, 1583,
- 1583, 1583, 1583, 1584, 1585, 1584, 1585, 1586,
- 1586, 1586, 1587, 1588, 201, 201, 201, 201,
- 201, 1589, 1590, 1590, 1590, 1591, 1589, 1590,
-
- 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592,
- 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592,
- 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592,
- 1592, 1592, 1592, 1592, 1592, 1592, 1592, 1592,
-
- 1592, 1592, 1592, 1592, 1592, 1592, 201, 1593,
- 201, 201, 201, 201, 201, 1593, 201, 201,
- 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594,
- 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594,
-
- 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594,
- 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594,
- 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594,
- 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594,
-
- 1594, 1594, 1594, 1594, 1594, 1594, 1595, 1595,
- 201, 201, 201, 201, 201, 201, 201, 1596,
- 1597, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 1598,
-
- 854, 854, 854, 854, 854, 854, 854, 854,
- 854, 854, 854, 854, 854, 854, 854, 854,
- 854, 854, 854, 854, 854, 854, 854, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
-
- 854, 854, 854, 854, 854, 854, 854, 201,
- 854, 854, 854, 854, 854, 854, 854, 201,
- 854, 854, 854, 854, 854, 854, 854, 201,
- 854, 854, 854, 854, 854, 854, 854, 201,
-
- 266, 266, 266, 266, 266, 266, 266, 266,
- 266, 266, 266, 266, 266, 266, 266, 266,
- 266, 266, 266, 266, 266, 266, 266, 266,
- 266, 266, 266, 266, 266, 266, 266, 266,
-
- 1599, 1599, 1600, 1601, 1600, 1601, 1599, 1599,
- 1599, 1600, 1601, 1599, 1600, 1601, 1376, 1376,
- 1376, 1376, 1376, 1376, 1376, 1376, 1375, 1602,
- 1603, 1604, 1605, 1606, 1600, 1601, 1606, 1606,
-
- 1607, 1608, 1552, 1553, 1552, 1553, 1552, 1553,
- 1552, 1553, 1604, 1604, 1604, 1604, 1609, 1610,
- 1604, 1611, 1612, 1613, 1613, 1612, 1612, 1612,
- 1612, 1612, 1614, 1614, 1615, 1616, 1616, 1617,
-
- 1618, 1616, 1619, 1620, 1620, 1621, 1621, 1621,
- 1621, 1621, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
-
- 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622,
- 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622,
- 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622,
- 1622, 1622, 201, 1622, 1622, 1622, 1622, 1623,
-
- 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622,
- 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622,
- 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622,
- 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622,
-
- 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622,
- 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622,
- 1622, 1622, 1622, 1623, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
-
- 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623,
- 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623,
- 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623,
- 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623,
-
- 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623,
- 1623, 1623, 1623, 1623, 1623, 1623, 1623, 1623,
- 1623, 1623, 1623, 1623, 1623, 1623, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
-
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 1624, 1624, 1624, 1624, 1624, 1624, 1624, 1624,
- 1624, 1624, 1624, 1624, 201, 201, 201, 201,
-
- 1330, 1625, 1626, 1627, 1473, 1628, 1629, 1630,
- 16, 1367, 16, 1367, 16, 1367, 16, 1367,
- 16, 1367, 1473, 1473, 16, 1367, 16, 1367,
- 16, 1367, 16, 1367, 1631, 1345, 1632, 1632,
-
- 1473, 1630, 1630, 1630, 1630, 1630, 1630, 1630,
- 1630, 1630, 1633, 1634, 173, 1635, 1636, 1636,
- 1637, 1638, 1638, 1638, 1638, 1639, 1640, 1473,
- 1641, 1641, 1641, 1642, 1643, 1644, 1624, 1473,
-
- 201, 1645, 1646, 1645, 1646, 1645, 1646, 1645,
- 1646, 1645, 1646, 1646, 1647, 1646, 1647, 1646,
- 1647, 1646, 1647, 1646, 1647, 1646, 1647, 1646,
- 1647, 1646, 1647, 1646, 1647, 1646, 1647, 1646,
-
- 1647, 1646, 1647, 1645, 1646, 1647, 1646, 1647,
- 1646, 1647, 1646, 1646, 1646, 1646, 1646, 1646,
- 1647, 1647, 1646, 1647, 1647, 1646, 1647, 1647,
- 1646, 1647, 1647, 1646, 1647, 1647, 1646, 1646,
-
- 1646, 1646, 1646, 1645, 1646, 1645, 1646, 1645,
- 1646, 1646, 1646, 1646, 1646, 1646, 1645, 1646,
- 1646, 1646, 1646, 1646, 1647, 1648, 1648, 201,
- 201, 1649, 1649, 1650, 1650, 1651, 1652, 1653,
-
- 1654, 1655, 1656, 1655, 1656, 1655, 1656, 1655,
- 1656, 1655, 1656, 1656, 1657, 1656, 1657, 1656,
- 1657, 1656, 1657, 1656, 1657, 1656, 1657, 1656,
- 1657, 1656, 1657, 1656, 1657, 1656, 1657, 1656,
-
- 1657, 1656, 1657, 1655, 1656, 1657, 1656, 1657,
- 1656, 1657, 1656, 1656, 1656, 1656, 1656, 1656,
- 1657, 1657, 1656, 1657, 1657, 1656, 1657, 1657,
- 1656, 1657, 1657, 1656, 1657, 1657, 1656, 1656,
-
- 1656, 1656, 1656, 1655, 1656, 1655, 1656, 1655,
- 1656, 1656, 1656, 1656, 1656, 1656, 1655, 1656,
- 1656, 1656, 1656, 1656, 1657, 1655, 1655, 1657,
- 1657, 1657, 1657, 1658, 1659, 1660, 1661, 1662,
-
- 201, 201, 201, 201, 201, 1663, 1663, 1663,
- 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663,
- 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663,
- 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663,
-
- 1663, 1663, 1663, 1663, 1663, 1663, 1663, 1663,
- 1663, 1663, 1663, 1663, 1663, 1664, 1665, 201,
- 201, 1666, 1666, 1666, 1666, 1666, 1666, 1666,
- 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666,
-
- 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666,
- 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666,
- 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666,
- 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666,
-
- 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666,
- 1666, 1666, 1666, 1666, 1666, 1666, 1666, 201,
- 1667, 1667, 1668, 1668, 1668, 1668, 1669, 1669,
- 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669,
-
- 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670,
- 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670,
- 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670,
- 1671, 1671, 1671, 201, 201, 201, 201, 201,
-
- 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512,
- 1512, 1512, 1512, 1512, 1512, 1512, 1512, 1512,
- 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519,
- 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519,
-
- 1519, 1519, 1519, 1519, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672,
- 1672, 1672, 1672, 1672, 1672, 1672, 1672, 1672,
-
- 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673,
- 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673,
- 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673,
- 1673, 1673, 1673, 1673, 1673, 1674, 1674, 201,
-
- 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668,
- 1668, 1668, 1669, 1669, 1669, 1669, 1669, 1669,
- 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669,
- 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669,
-
- 1669, 1669, 1669, 1669, 1675, 1675, 1675, 1675,
- 1676, 1676, 1676, 1676, 1676, 1676, 1676, 1676,
- 1677, 1678, 1678, 1678, 1678, 1678, 1678, 1678,
- 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678,
-
- 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673,
- 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673,
- 1673, 1673, 1673, 1673, 1673, 1673, 1673, 1673,
- 1673, 1673, 1673, 1673, 1674, 1674, 1679, 1667,
-
- 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669,
- 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669,
- 1669, 1678, 1678, 1678, 1678, 1678, 1678, 1678,
- 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678,
-
- 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669,
- 1669, 1669, 1669, 1669, 1677, 1677, 1677, 1677,
- 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680,
- 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680,
-
- 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680,
- 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680,
- 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680,
- 1680, 1680, 1680, 1680, 1680, 1680, 1680, 201,
-
- 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680,
- 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680,
- 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680,
- 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680,
-
- 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680,
- 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680,
- 1680, 1680, 1680, 1680, 1680, 1680, 1680, 1680,
- 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669,
-
- 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669,
- 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669,
- 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1677,
- 1677, 1677, 1677, 1669, 1669, 1669, 1669, 1669,
-
- 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669,
- 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669,
- 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669,
- 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669,
-
- 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669,
- 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669,
- 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669,
- 1669, 1669, 1669, 1669, 1669, 1669, 1677, 1677,
-
- 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669,
- 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669,
- 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1669,
- 1669, 1669, 1669, 1669, 1669, 1669, 1669, 1677,
-
- 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681,
- 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681,
- 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681,
- 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681,
-
- 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681,
- 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681,
- 1681, 1681, 1681, 1681, 1681, 1681, 1682, 1682,
- 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682,
-
- 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478,
- 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478,
- 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478,
- 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478,
-
- 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683,
- 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683,
- 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683,
- 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683,
-
- 1683, 1683, 1683, 1683, 1683, 1683, 1684, 1684,
- 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684,
- 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684,
- 1684, 1684, 1684, 1684, 1685, 1685, 1685, 1685,
-
- 1685, 1685, 1685, 1685, 1686, 1686, 1686, 1686,
- 1686, 1686, 1686, 1686, 1687, 1688, 1688, 1688,
- 1688, 1688, 1688, 1688, 1688, 1688, 1689, 1689,
- 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689,
-
- 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689,
- 1689, 1689, 1689, 1682, 1682, 1682, 1682, 1682,
- 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682,
- 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682,
-
- 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690,
- 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690,
- 1690, 1690, 1690, 1690, 1690, 1691, 1690, 1690,
- 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690,
-
- 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690,
- 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690,
- 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690,
- 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690,
-
- 1690, 1690, 1690, 1690, 1690, 1690, 1690, 1690,
- 1690, 1690, 1690, 1690, 1690, 201, 201, 201,
- 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692,
- 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692,
-
- 1692, 1692, 1693, 1693, 1692, 1692, 1692, 1692,
- 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692,
- 1692, 1692, 1692, 1692, 1693, 1692, 1692, 1692,
- 1692, 1692, 1692, 1692, 1692, 1692, 1692, 1692,
-
- 1692, 1693, 1692, 1692, 1692, 1693, 1692, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694,
- 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694,
-
- 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694,
- 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694,
- 1694, 1694, 1694, 1694, 1694, 1694, 1694, 1694,
- 1695, 1695, 1695, 1695, 1695, 1695, 1696, 1697,
-
- 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698,
- 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698,
- 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698,
- 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698,
-
- 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698,
- 1698, 1698, 1698, 1698, 1699, 1700, 1701, 1702,
- 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698,
- 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698,
-
- 1703, 1704, 1705, 1706, 1707, 1708, 1709, 1710,
- 1711, 1712, 1698, 1698, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
-
- 280, 281, 280, 281, 280, 281, 280, 281,
- 280, 281, 280, 281, 280, 281, 280, 281,
- 280, 281, 280, 281, 280, 281, 280, 281,
- 280, 281, 280, 281, 280, 281, 280, 281,
-
- 284, 285, 280, 281, 280, 281, 280, 281,
- 280, 281, 280, 281, 280, 281, 1713, 266,
- 1714, 1714, 1714, 1715, 1716, 1716, 1716, 1716,
- 1716, 1716, 1716, 1716, 266, 266, 1715, 1717,
-
- 280, 281, 280, 281, 280, 281, 280, 281,
- 280, 281, 280, 281, 280, 281, 280, 281,
- 280, 281, 280, 281, 280, 281, 280, 281,
- 286, 287, 286, 287, 1718, 1718, 1719, 1716,
-
- 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720,
- 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720,
- 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720,
- 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720,
-
- 1720, 1720, 1720, 1720, 1720, 1720, 1721, 1721,
- 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721,
- 1722, 1722, 1723, 1724, 1725, 1725, 1725, 1724,
- 201, 201, 201, 201, 201, 201, 201, 201,
-
- 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726,
- 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1726,
- 1726, 1726, 1726, 1726, 1726, 1726, 1726, 1727,
- 1727, 1727, 1727, 1610, 1610, 1610, 1610, 1610,
-
- 1728, 1728, 1216, 1217, 1216, 1217, 1216, 1217,
- 1216, 1217, 1216, 1217, 1216, 1217, 1216, 1217,
- 1214, 1214, 1216, 1217, 1216, 1217, 1216, 1217,
- 1216, 1217, 1216, 1217, 1216, 1217, 1216, 1217,
-
- 1216, 1217, 1216, 1217, 1216, 1217, 1216, 1217,
- 1216, 1217, 1216, 1217, 1216, 1217, 1216, 1217,
- 1216, 1217, 1216, 1217, 1216, 1217, 1216, 1217,
- 1216, 1217, 1216, 1217, 1216, 1217, 1216, 1217,
-
- 1216, 1217, 1216, 1217, 1216, 1217, 1216, 1217,
- 1216, 1217, 1216, 1217, 1216, 1217, 1216, 1217,
- 1577, 1214, 1214, 1214, 1214, 1214, 1214, 1214,
- 1214, 1216, 1217, 1216, 1217, 1729, 1216, 1217,
-
- 1216, 1217, 1216, 1217, 1216, 1217, 1216, 1217,
- 1610, 1730, 1730, 1216, 1217, 1731, 1732, 1733,
- 1734, 1735, 1736, 1737, 1738, 1738, 1739, 1740,
- 1739, 1740, 1739, 1740, 1739, 1740, 1739, 1740,
-
- 1734, 1735, 1734, 1735, 1734, 1735, 1734, 1735,
- 1734, 1735, 1741, 1742, 1743, 1744, 1745, 201,
- 1746, 1747, 1748, 1749, 1750, 1751, 1750, 1751,
- 201, 201, 201, 201, 201, 201, 201, 201,
-
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 1752,
- 1753, 1753, 1732, 1754, 1754, 1754, 1754, 1754,
-
- 1755, 1755, 1756, 1755, 1755, 1755, 1757, 1755,
- 1755, 1755, 1755, 1756, 1755, 1755, 1755, 1755,
- 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755,
- 1755, 1755, 1755, 1755, 1755, 1755, 1755, 1755,
-
- 1755, 1755, 1755, 1758, 1758, 1756, 1756, 1758,
- 1759, 1759, 1759, 1759, 201, 201, 201, 201,
- 1676, 1676, 1676, 1676, 1676, 1676, 796, 796,
- 1407, 1760, 201, 201, 201, 201, 201, 201,
-
- 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761,
- 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761,
- 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761,
- 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761,
-
- 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761,
- 1761, 1761, 1761, 1761, 1761, 1761, 1761, 1761,
- 1761, 1761, 1762, 1763, 1764, 1764, 1765, 1765,
- 201, 201, 201, 201, 201, 201, 201, 201,
-
- 1766, 1766, 1767, 1767, 1767, 1767, 1767, 1767,
- 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767,
- 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767,
- 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767,
-
- 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767,
- 1767, 1767, 1767, 1767, 1767, 1767, 1767, 1767,
- 1767, 1767, 1767, 1767, 1766, 1766, 1766, 1766,
- 1766, 1766, 1766, 1766, 1766, 1766, 1766, 1766,
-
- 1766, 1766, 1766, 1766, 1768, 1769, 201, 201,
- 201, 201, 201, 201, 201, 201, 1770, 1770,
- 1771, 1772, 1773, 1774, 1775, 1776, 1777, 1778,
- 1779, 1780, 201, 201, 201, 201, 201, 201,
-
- 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781,
- 1781, 1781, 1781, 1781, 1781, 1781, 1781, 1781,
- 1781, 1781, 501, 501, 501, 501, 501, 501,
- 1782, 1782, 1782, 501, 1783, 1784, 201, 201,
-
- 1785, 1786, 1787, 1788, 1789, 1790, 1791, 1792,
- 1793, 1794, 1795, 1795, 1795, 1795, 1795, 1795,
- 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795,
- 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795,
-
- 1795, 1795, 1795, 1795, 1795, 1795, 1796, 1796,
- 1796, 1796, 1796, 1797, 1797, 1797, 1798, 1799,
- 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800,
- 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1800,
-
- 1800, 1800, 1800, 1800, 1800, 1800, 1800, 1801,
- 1801, 1801, 1801, 1801, 1801, 1801, 1801, 1801,
- 1801, 1801, 1802, 1803, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 1804,
-
- 846, 846, 846, 846, 846, 846, 846, 846,
- 846, 846, 846, 846, 846, 846, 846, 846,
- 846, 846, 846, 846, 846, 846, 846, 846,
- 846, 846, 846, 846, 846, 201, 201, 201,
-
- 1805, 1805, 1805, 1806, 1807, 1807, 1807, 1807,
- 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807,
- 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807,
- 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807,
-
- 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807,
- 1807, 1807, 1807, 1807, 1807, 1807, 1807, 1807,
- 1807, 1807, 1807, 1808, 1806, 1806, 1805, 1805,
- 1805, 1805, 1806, 1806, 1805, 1806, 1806, 1806,
-
- 1809, 1810, 1810, 1810, 1810, 1810, 1810, 1811,
- 1812, 1812, 1810, 1810, 1810, 1810, 201, 1813,
- 1814, 1815, 1816, 1817, 1818, 1819, 1820, 1821,
- 1822, 1823, 201, 201, 201, 201, 1810, 1810,
-
- 1824, 1824, 1824, 1824, 1824, 1825, 1826, 1824,
- 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824,
- 1827, 1828, 1829, 1830, 1831, 1832, 1833, 1834,
- 1835, 1836, 1824, 1824, 1824, 1824, 1824, 201,
-
- 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837,
- 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837,
- 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837,
- 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837,
-
- 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837,
- 1837, 1838, 1838, 1838, 1838, 1838, 1838, 1839,
- 1839, 1838, 1838, 1839, 1839, 1838, 1838, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
-
- 1837, 1837, 1837, 1838, 1837, 1837, 1837, 1837,
- 1837, 1837, 1837, 1837, 1838, 1839, 201, 201,
- 1840, 1841, 1842, 1843, 1844, 1845, 1846, 1847,
- 1848, 1849, 201, 201, 1850, 1851, 1851, 1851,
-
- 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852,
- 1852, 1852, 1852, 1852, 1852, 1852, 1852, 1852,
- 1853, 1852, 1852, 1852, 1852, 1852, 1852, 1854,
- 1854, 1854, 1852, 834, 1825, 1855, 1824, 1824,
-
- 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856,
- 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856,
- 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856,
- 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856,
-
- 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856,
- 1856, 1856, 1856, 1856, 1856, 1856, 1856, 1856,
- 1857, 1856, 1857, 1857, 1858, 1856, 1856, 1857,
- 1857, 1856, 1856, 1856, 1856, 1856, 1857, 1857,
-
- 1856, 1857, 1856, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 1856, 1856, 1859, 1860, 1860,
-
- 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861,
- 1861, 1861, 1861, 1862, 1863, 1863, 1862, 1862,
- 1864, 1864, 1861, 1865, 1865, 1862, 1866, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
-
- 201, 1867, 1867, 1867, 1867, 1867, 1867, 201,
- 201, 1867, 1867, 1867, 1867, 1867, 1867, 201,
- 201, 1867, 1867, 1867, 1867, 1867, 1867, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
-
- 1867, 1867, 1867, 1867, 1867, 1867, 1867, 201,
- 1867, 1867, 1867, 1867, 1867, 1867, 1867, 201,
- 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738,
- 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738,
-
- 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738,
- 1738, 1738, 1738, 1738, 1738, 1738, 1738, 1738,
- 1738, 1738, 1738, 1868, 1738, 1738, 1738, 1738,
- 1738, 1738, 1738, 1869, 1870, 1870, 1870, 1870,
-
- 1871, 1871, 1871, 1871, 1738, 1872, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 1873, 1874, 1875, 1876, 1877, 1878, 1879, 1880,
- 1881, 1882, 1883, 1884, 1885, 1886, 1887, 1888,
-
- 1889, 1890, 1891, 1892, 1893, 1894, 1895, 1896,
- 1897, 1898, 1899, 1900, 1901, 1902, 1903, 1904,
- 1905, 1906, 1907, 1908, 1909, 1910, 1911, 1912,
- 1913, 1914, 1915, 1916, 1917, 1918, 1919, 1920,
-
- 1921, 1922, 1923, 1924, 1925, 1926, 1927, 1928,
- 1929, 1930, 1931, 1932, 1933, 1934, 1935, 1936,
- 1937, 1938, 1939, 1940, 1941, 1942, 1943, 1944,
- 1945, 1946, 1947, 1948, 1949, 1950, 1951, 1952,
-
- 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953,
- 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953,
- 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953,
- 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953,
-
- 1953, 1953, 1953, 1954, 1954, 1955, 1954, 1954,
- 1955, 1954, 1954, 1956, 1954, 1957, 201, 201,
- 1958, 1959, 1960, 1961, 1962, 1963, 1964, 1965,
- 1966, 1967, 201, 201, 201, 201, 201, 201,
-
- 1968, 1969, 1969, 1969, 1969, 1969, 1969, 1969,
- 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969,
- 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969,
- 1969, 1969, 1969, 1969, 1968, 1969, 1969, 1969,
-
- 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969,
- 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969,
- 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969,
- 1968, 1969, 1969, 1969, 1969, 1969, 1969, 1969,
-
- 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969,
- 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969,
- 1969, 1969, 1969, 1969, 1968, 1969, 1969, 1969,
- 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969,
-
- 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969,
- 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969,
- 1968, 1969, 1969, 1969, 1969, 1969, 1969, 1969,
- 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969,
-
- 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969,
- 1969, 1969, 1969, 1969, 1968, 1969, 1969, 1969,
- 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969,
- 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969,
-
- 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969,
- 1968, 1969, 1969, 1969, 1969, 1969, 1969, 1969,
- 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969,
- 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969,
-
- 1969, 1969, 1969, 1969, 1968, 1969, 1969, 1969,
- 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969,
- 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969,
- 1969, 1969, 1969, 1969, 1969, 1969, 1969, 1969,
-
- 1969, 1969, 1969, 1969, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 849, 849, 849, 849, 849, 849, 849, 849,
- 849, 849, 849, 849, 849, 849, 849, 849,
-
- 849, 849, 849, 849, 849, 849, 849, 201,
- 201, 201, 201, 852, 852, 852, 852, 852,
- 852, 852, 852, 852, 852, 852, 852, 852,
- 852, 852, 852, 852, 852, 852, 852, 852,
-
- 852, 852, 852, 852, 852, 852, 852, 852,
- 852, 852, 852, 852, 852, 852, 852, 852,
- 852, 852, 852, 852, 852, 852, 852, 852,
- 852, 852, 852, 852, 201, 201, 201, 201,
-
- 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970,
- 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970,
- 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970,
- 1970, 1970, 1970, 1970, 1970, 1970, 1970, 1970,
-
- 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971,
- 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971,
- 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971,
- 1971, 1971, 1971, 1971, 1971, 1971, 1971, 1971,
-
- 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972,
- 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972,
- 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972,
- 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972,
-
- 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1972,
- 1972, 1972, 1972, 1972, 1972, 1972, 1683, 1683,
- 1972, 1683, 1972, 1683, 1683, 1972, 1972, 1972,
- 1972, 1972, 1972, 1972, 1972, 1972, 1972, 1683,
-
- 1972, 1683, 1972, 1683, 1683, 1972, 1972, 1683,
- 1683, 1683, 1972, 1972, 1972, 1972, 1973, 1973,
- 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974,
- 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974,
-
- 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974,
- 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974,
- 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974,
- 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974,
-
- 1974, 1974, 1974, 1974, 1974, 1974, 1974, 1974,
- 1974, 1974, 1974, 1975, 1975, 1975, 1682, 1682,
- 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976,
- 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976,
-
- 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976,
- 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976,
- 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976,
- 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976,
-
- 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976,
- 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976,
- 1976, 1976, 1976, 1976, 1976, 1976, 1976, 1976,
- 1976, 1976, 1682, 1682, 1682, 1682, 1682, 1682,
-
- 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682,
- 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682,
- 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682,
- 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682,
-
- 1977, 1978, 1979, 1980, 1981, 1982, 1982, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 1983, 1984, 1985, 1986, 1987,
- 201, 201, 201, 201, 201, 1988, 1989, 1990,
-
- 1991, 1991, 1991, 1991, 1991, 1991, 1991, 1991,
- 1991, 1992, 1990, 1990, 1990, 1990, 1990, 1990,
- 1990, 1990, 1990, 1990, 1990, 1990, 1990, 298,
- 1990, 1990, 1990, 1990, 1990, 298, 1990, 298,
-
- 1990, 1990, 298, 1990, 1990, 298, 1990, 1990,
- 1990, 1990, 1990, 1990, 1990, 1990, 1990, 1991,
- 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993,
- 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993,
-
- 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993,
- 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993,
- 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993,
- 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993,
-
- 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993,
- 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993,
- 1993, 1993, 1994, 1994, 1994, 1994, 1994, 1994,
- 1994, 1994, 1994, 1994, 1994, 1994, 1994, 1994,
-
- 1994, 1994, 344, 344, 344, 344, 344, 344,
- 344, 344, 344, 344, 344, 344, 344, 344,
- 344, 344, 344, 1993, 1993, 1993, 1993, 1993,
- 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993,
-
- 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993,
- 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993,
- 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993,
- 1993, 1993, 1993, 1993, 1993, 1993, 1632, 1345,
-
- 344, 344, 344, 344, 344, 344, 344, 344,
- 344, 344, 344, 344, 344, 344, 344, 344,
- 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993,
- 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993,
-
- 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993,
- 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993,
- 344, 344, 1993, 1993, 1993, 1993, 1993, 1993,
- 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993,
-
- 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993,
- 344, 344, 344, 344, 344, 344, 344, 344,
- 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995,
- 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995,
-
- 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995,
- 1995, 1995, 1995, 1995, 1995, 1995, 1995, 1995,
- 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993,
- 1993, 1993, 1993, 1993, 1996, 336, 344, 344,
-
- 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997,
- 1997, 1997, 1997, 1997, 1997, 1997, 1997, 1997,
- 1998, 1999, 2000, 2001, 2002, 2003, 2003, 2004,
- 2005, 2006, 201, 201, 201, 201, 201, 201,
-
- 172, 172, 172, 172, 1198, 1198, 1198, 1089,
- 1089, 1089, 1089, 1089, 1089, 1089, 1719, 1719,
- 2007, 2008, 2008, 2009, 2009, 2010, 2011, 2010,
- 2011, 2010, 2011, 2010, 2011, 2010, 2011, 2010,
-
- 2011, 2010, 2011, 2010, 2011, 1644, 1644, 2012,
- 2013, 2007, 2007, 2007, 2007, 2009, 2009, 2009,
- 2014, 2015, 2016, 201, 2017, 2018, 2019, 2019,
- 2008, 1398, 1399, 1398, 1399, 1398, 1399, 2020,
-
- 2007, 2007, 2021, 2022, 2023, 2024, 2025, 201,
- 2007, 1401, 1359, 2007, 201, 201, 201, 201,
- 1993, 1993, 1993, 2026, 1993, 344, 1993, 1993,
- 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993,
-
- 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993,
- 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993,
- 1993, 1993, 1993, 1993, 1993, 1993, 1993, 1993,
- 1993, 1993, 1993, 1993, 1993, 344, 344, 2027,
-
- 201, 2019, 2007, 2020, 1401, 1359, 2007, 2028,
- 1398, 1399, 2007, 2021, 2014, 2022, 2016, 2029,
- 2030, 2031, 2032, 2033, 2034, 2035, 2036, 2037,
- 2038, 2039, 2018, 2017, 2040, 2025, 2041, 2019,
-
- 2007, 2042, 2042, 2042, 2042, 2042, 2042, 2042,
- 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042,
- 2042, 2042, 2042, 2042, 2042, 2042, 2042, 2042,
- 2042, 2042, 2042, 2043, 2007, 2044, 2045, 2009,
-
- 2045, 2046, 2046, 2046, 2046, 2046, 2046, 2046,
- 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046,
- 2046, 2046, 2046, 2046, 2046, 2046, 2046, 2046,
- 2046, 2046, 2046, 2043, 2025, 2044, 2025, 2047,
-
- 2048, 2049, 1398, 1399, 2050, 2051, 2052, 2053,
- 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053,
- 2054, 2052, 2052, 2052, 2052, 2052, 2052, 2052,
- 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052,
-
- 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052,
- 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052,
- 2052, 2052, 2052, 2052, 2052, 2052, 2052, 2052,
- 2052, 2052, 2052, 2052, 2052, 2052, 2055, 2055,
-
- 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666,
- 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666,
- 1666, 1666, 1666, 1666, 1666, 1666, 1666, 1666,
- 1666, 1666, 1666, 1666, 1666, 1666, 1666, 201,
-
- 201, 201, 1666, 1666, 1666, 1666, 1666, 1666,
- 201, 201, 1666, 1666, 1666, 1666, 1666, 1666,
- 201, 201, 1666, 1666, 1666, 1666, 1666, 1666,
- 201, 201, 1666, 1666, 1666, 201, 201, 201,
-
- 2056, 1401, 2025, 2045, 1640, 1401, 1401, 201,
- 1422, 1397, 1397, 1397, 1397, 1422, 1422, 201,
- 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382,
- 1382, 2057, 2057, 2057, 2058, 51, 2059, 2059,
-
- 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060,
- 2060, 2060, 2060, 2060, 201, 2060, 2060, 2060,
- 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060,
- 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060,
-
- 2060, 2060, 2060, 2060, 2060, 2060, 2060, 201,
- 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060,
- 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060,
- 2060, 2060, 2060, 201, 2060, 2060, 201, 2060,
-
- 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060,
- 2060, 2060, 2060, 2060, 2060, 2060, 201, 201,
- 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060,
- 2060, 2060, 2060, 2060, 2060, 2060, 201, 201,
-
- 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060,
- 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060,
- 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060,
- 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060,
-
- 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060,
- 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060,
- 2060, 2060, 2060, 2060, 2060, 2060, 2060, 2060,
- 2060, 2060, 2060, 201, 201, 201, 201, 201,
-
- 2061, 2062, 2061, 201, 201, 201, 201, 2063,
- 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063,
- 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063,
- 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063,
-
- 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063,
- 2063, 2063, 2063, 2063, 2063, 2063, 2063, 2063,
- 2063, 2063, 2063, 2063, 201, 201, 201, 2064,
- 2064, 2064, 2064, 2064, 2064, 2064, 2064, 2064,
-
- 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065,
- 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065,
- 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065,
- 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065,
-
- 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065,
- 2065, 2065, 2065, 2065, 2065, 2065, 2065, 2065,
- 2065, 2065, 2065, 2065, 2065, 2066, 2066, 2066,
- 2066, 2067, 2067, 2067, 2067, 2067, 2067, 2067,
-
- 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067,
- 2067, 2067, 2066, 2068, 2069, 2070, 2070, 201,
- 1516, 1516, 1516, 1516, 1516, 1516, 1516, 1516,
- 1516, 1516, 1516, 1516, 201, 201, 201, 201,
-
- 2069, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
-
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444,
- 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444,
-
- 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444,
- 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444,
- 1444, 1444, 1444, 1444, 1444, 1444, 1444, 1444,
- 1444, 1444, 1444, 1444, 1444, 1201, 201, 201,
-
- 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071,
- 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071,
- 2071, 2071, 2071, 2071, 2071, 2071, 2071, 2071,
- 2071, 2071, 2071, 2071, 2071, 201, 201, 201,
-
- 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072,
- 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072,
- 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072,
- 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072,
-
- 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072,
- 2072, 2072, 2072, 2072, 2072, 2072, 2072, 2072,
- 2072, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
-
- 1089, 2073, 2073, 2073, 2073, 2073, 2073, 2073,
- 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073,
- 2073, 2073, 2073, 2073, 2073, 2073, 2073, 2073,
- 2073, 2073, 2073, 2073, 201, 201, 201, 201,
-
- 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074,
- 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074,
- 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2074,
- 2074, 2074, 2074, 2074, 2074, 2074, 2074, 2075,
-
- 2076, 2076, 2076, 2076, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 2077, 2077, 2077,
- 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078,
- 2078, 2078, 2078, 2078, 2078, 2078, 2078, 2078,
-
- 2078, 2079, 2078, 2078, 2078, 2078, 2078, 2078,
- 2078, 2078, 2079, 201, 201, 201, 201, 201,
- 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080,
- 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080,
-
- 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080,
- 2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080,
- 2080, 2080, 2080, 2080, 2080, 2080, 2081, 2081,
- 2081, 2081, 2081, 201, 201, 201, 201, 201,
-
- 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082,
- 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082,
- 2082, 2082, 2082, 2082, 2082, 2082, 2082, 2082,
- 2082, 2082, 2082, 2082, 2082, 2082, 201, 2083,
-
- 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084,
- 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084,
- 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084,
- 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084,
-
- 2084, 2084, 2084, 2084, 201, 201, 201, 201,
- 2084, 2084, 2084, 2084, 2084, 2084, 2084, 2084,
- 2085, 2086, 2086, 2086, 2086, 2086, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
-
- 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087,
- 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087,
- 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087,
- 2087, 2087, 2087, 2087, 2087, 2087, 2087, 2087,
-
- 2087, 2087, 2087, 2087, 2087, 2087, 2088, 2088,
- 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089,
- 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089,
- 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089,
-
- 2089, 2089, 2089, 2089, 2089, 2089, 2089, 2089,
- 2089, 2089, 2089, 2089, 2089, 2089, 2090, 2090,
- 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091,
- 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091,
-
- 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091,
- 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091,
- 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091,
- 2091, 2091, 2091, 2091, 2091, 2091, 2091, 2091,
-
- 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092,
- 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092,
- 2092, 2092, 2092, 2092, 2092, 2092, 2092, 2092,
- 2092, 2092, 2092, 2092, 2092, 2092, 201, 201,
-
- 2093, 2094, 2095, 2096, 2097, 2098, 2099, 2100,
- 2101, 2102, 201, 201, 201, 201, 201, 201,
- 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103,
- 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103,
-
- 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103,
- 2103, 2103, 2103, 2103, 2103, 2103, 2103, 2103,
- 2103, 2103, 2103, 2103, 201, 201, 201, 201,
- 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104,
-
- 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104,
- 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104,
- 2104, 2104, 2104, 2104, 2104, 2104, 2104, 2104,
- 2104, 2104, 2104, 2104, 201, 201, 201, 201,
-
- 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105,
- 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105,
- 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105,
- 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105,
-
- 2105, 2105, 2105, 2105, 2105, 2105, 2105, 2105,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106,
- 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106,
-
- 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106,
- 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106,
- 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106,
- 2106, 2106, 2106, 2106, 2106, 2106, 2106, 2106,
-
- 2106, 2106, 2106, 2106, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 2107,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
-
- 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108,
- 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108,
- 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108,
- 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108,
-
- 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108,
- 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108,
- 2108, 2108, 2108, 2108, 2108, 2108, 2108, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
-
- 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108,
- 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108,
- 2108, 2108, 2108, 2108, 2108, 2108, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
-
- 2108, 2108, 2108, 2108, 2108, 2108, 2108, 2108,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
-
- 2109, 2109, 2109, 2109, 2109, 2109, 298, 298,
- 2109, 298, 2109, 2109, 2109, 2109, 2109, 2109,
- 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109,
- 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109,
-
- 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109,
- 2109, 2109, 2109, 2109, 2109, 2109, 2109, 2109,
- 2109, 2109, 2109, 2109, 2109, 2109, 298, 2109,
- 2109, 298, 298, 298, 2109, 298, 298, 2109,
-
- 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110,
- 2110, 2110, 2110, 2110, 2110, 2110, 2110, 2110,
- 2110, 2110, 2110, 2110, 2110, 2110, 298, 2111,
- 2112, 2112, 2112, 2112, 2112, 2112, 2112, 2112,
-
- 2113, 2113, 2113, 2113, 2113, 2113, 2113, 2113,
- 2113, 2113, 2113, 2113, 2113, 2113, 2113, 2113,
- 2113, 2113, 2113, 2113, 2113, 2113, 2113, 2114,
- 2114, 2115, 2115, 2115, 2115, 2115, 2115, 2115,
-
- 2116, 2116, 2116, 2116, 2116, 2116, 2116, 2116,
- 2116, 2116, 2116, 2116, 2116, 2116, 2116, 2116,
- 2116, 2116, 2116, 2116, 2116, 2116, 2116, 2116,
- 2116, 2116, 2116, 2116, 2116, 2116, 2116, 298,
-
- 298, 298, 298, 298, 298, 298, 298, 2117,
- 2117, 2117, 2117, 2117, 2117, 2117, 2117, 2117,
- 298, 298, 298, 298, 298, 298, 298, 298,
- 298, 298, 298, 298, 298, 298, 298, 298,
-
- 2118, 2118, 2118, 2118, 2118, 2118, 2118, 2118,
- 2118, 2118, 2118, 2118, 2118, 2118, 2118, 2118,
- 2118, 2118, 2118, 298, 2118, 2118, 298, 298,
- 298, 298, 298, 2119, 2119, 2119, 2119, 2119,
-
- 2120, 2120, 2120, 2120, 2120, 2120, 2120, 2120,
- 2120, 2120, 2120, 2120, 2120, 2120, 2120, 2120,
- 2120, 2120, 2120, 2120, 2120, 2120, 2121, 2121,
- 2121, 2121, 2122, 2122, 298, 298, 298, 2123,
-
- 2124, 2124, 2124, 2124, 2124, 2124, 2124, 2124,
- 2124, 2124, 2124, 2124, 2124, 2124, 2124, 2124,
- 2124, 2124, 2124, 2124, 2124, 2124, 2124, 2124,
- 2124, 2124, 298, 298, 298, 298, 298, 2125,
-
- 2126, 2126, 2126, 2126, 2126, 2126, 2126, 2126,
- 2126, 2126, 2126, 2126, 2126, 2126, 2126, 2126,
- 2126, 2126, 2126, 2126, 2126, 2126, 2126, 2126,
- 2126, 2126, 2126, 2126, 2126, 2126, 2126, 2126,
-
- 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127,
- 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127,
- 2127, 2127, 2127, 2127, 2127, 2127, 2127, 2127,
- 298, 298, 298, 298, 2128, 2128, 2127, 2127,
-
- 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128,
- 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128,
- 298, 298, 2128, 2128, 2128, 2128, 2128, 2128,
- 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128,
-
- 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128,
- 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128,
- 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128,
- 2128, 2128, 2128, 2128, 2128, 2128, 2128, 2128,
-
- 2129, 2130, 2130, 2130, 298, 2130, 2130, 298,
- 298, 298, 298, 298, 2130, 2131, 2130, 2132,
- 2129, 2129, 2129, 2129, 298, 2129, 2129, 2129,
- 298, 2129, 2129, 2129, 2129, 2129, 2129, 2129,
-
- 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129,
- 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129,
- 2129, 2129, 2129, 2129, 298, 298, 298, 298,
- 2132, 2133, 2131, 298, 298, 298, 298, 2134,
-
- 2135, 2136, 2137, 2138, 2139, 2139, 2139, 2139,
- 298, 298, 298, 298, 298, 298, 298, 298,
- 2140, 2140, 2140, 2140, 2140, 2140, 2141, 2141,
- 2142, 298, 298, 298, 298, 298, 298, 298,
-
- 2143, 2143, 2143, 2143, 2143, 2143, 2143, 2143,
- 2143, 2143, 2143, 2143, 2143, 2143, 2143, 2143,
- 2143, 2143, 2143, 2143, 2143, 2143, 2143, 2143,
- 2143, 2143, 2143, 2143, 2143, 2144, 2144, 2145,
-
- 2146, 2146, 2146, 2146, 2146, 2146, 2146, 2146,
- 2146, 2146, 2146, 2146, 2146, 2146, 2146, 2146,
- 2146, 2146, 2146, 2146, 2146, 2146, 2146, 2146,
- 2146, 2146, 2146, 2146, 2146, 2147, 2147, 2147,
-
- 2148, 2148, 2148, 2148, 2148, 2149, 2150, 2149,
- 2151, 2149, 2149, 2150, 2150, 2152, 2149, 2149,
- 2149, 2149, 2149, 2148, 2148, 2148, 2148, 2152,
- 2148, 2148, 2148, 2148, 2148, 2149, 2148, 2148,
-
- 2148, 2149, 2150, 2150, 2149, 2153, 2154, 298,
- 298, 298, 298, 2155, 2155, 2155, 2155, 2156,
- 2157, 2157, 2157, 2157, 2157, 2157, 2158, 298,
- 298, 298, 298, 298, 298, 298, 298, 298,
-
- 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159,
- 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159,
- 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159,
- 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159,
-
- 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159,
- 2159, 2159, 2159, 2159, 2159, 2159, 2159, 2159,
- 2159, 2159, 2159, 2159, 2159, 2159, 298, 298,
- 298, 2160, 2160, 2160, 2160, 2160, 2160, 2160,
-
- 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161,
- 2161, 2161, 2161, 2161, 2161, 2161, 2161, 2161,
- 2161, 2161, 2161, 2161, 2161, 2161, 298, 298,
- 2162, 2162, 2162, 2162, 2162, 2162, 2162, 2162,
-
- 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163,
- 2163, 2163, 2163, 2163, 2163, 2163, 2163, 2163,
- 2163, 2163, 2163, 298, 298, 298, 298, 298,
- 2164, 2164, 2164, 2164, 2164, 2164, 2164, 2164,
-
- 2165, 2166, 2165, 2166, 2166, 2166, 2165, 2165,
- 2165, 2166, 2165, 2165, 2166, 2165, 2166, 2166,
- 2165, 2166, 298, 298, 298, 298, 298, 298,
- 298, 2167, 2167, 2167, 2167, 298, 298, 298,
-
- 298, 298, 298, 298, 298, 298, 298, 298,
- 298, 2168, 2168, 2168, 2168, 2169, 2169, 2170,
- 298, 298, 298, 298, 298, 298, 298, 298,
- 298, 298, 298, 298, 298, 298, 298, 298,
-
- 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171,
- 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171,
- 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171,
- 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171,
-
- 2171, 2171, 2171, 2171, 2171, 2171, 2171, 2171,
- 2171, 298, 298, 298, 298, 298, 298, 298,
- 298, 298, 298, 298, 298, 298, 298, 298,
- 298, 298, 298, 298, 298, 298, 298, 298,
-
- 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172,
- 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172,
- 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172,
- 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172,
-
- 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172,
- 2172, 2172, 2172, 2172, 2172, 2172, 2172, 2172,
- 2172, 2172, 2172, 298, 298, 298, 298, 298,
- 298, 298, 298, 298, 298, 298, 298, 298,
-
- 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173,
- 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173,
- 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173,
- 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173,
-
- 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173,
- 2173, 2173, 2173, 2173, 2173, 2173, 2173, 2173,
- 2173, 2173, 2173, 298, 298, 298, 298, 298,
- 298, 298, 2174, 2174, 2174, 2174, 2174, 2174,
-
- 2175, 2176, 2177, 2178, 2179, 2180, 2181, 2182,
- 2183, 2184, 2184, 2184, 2184, 2184, 2184, 2184,
- 2184, 2184, 2184, 2184, 2184, 2184, 2184, 2184,
- 2184, 2184, 2184, 2184, 2184, 2184, 2184, 298,
-
- 2185, 2186, 2185, 2187, 2187, 2187, 2187, 2187,
- 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187,
- 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187,
- 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187,
- 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187,
- 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187,
- 2187, 2187, 2187, 2187, 2187, 2187, 2187, 2187,
- 2186, 2186, 2186, 2186, 2186, 2186, 2186, 2186,
- 2186, 2186, 2186, 2186, 2186, 2186, 2188, 2189,
- 2189, 2190, 2190, 2190, 2190, 2190, 201, 201,
- 201, 201, 2191, 2192, 2193, 2194, 2195, 2196,
- 2197, 2198, 2199, 2200, 2200, 2200, 2200, 2200,
- 2200, 2200, 2200, 2200, 2200, 2200, 2201, 2202,
- 2203, 2204, 2205, 2206, 2207, 2208, 2209, 2210,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 2211,
- 2212, 2212, 2213, 2214, 2214, 2214, 2214, 2214,
- 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214,
- 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214,
- 2214, 2214, 2215, 2214, 2215, 2214, 2214, 2214,
- 2214, 2214, 2214, 2214, 2214, 2214, 2214, 2214,
- 2214, 2214, 2214, 2215, 2214, 2214, 2214, 2214,
- 2213, 2213, 2213, 2212, 2212, 2212, 2212, 2213,
- 2213, 2216, 2217, 2218, 2218, 2219, 2220, 2220,
- 2220, 2220, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221,
- 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221,
- 2221, 2221, 2221, 2221, 2221, 2221, 2221, 2221,
- 2221, 201, 201, 201, 201, 201, 201, 201,
- 2222, 2223, 2224, 2225, 2226, 2227, 2228, 2229,
- 2230, 2231, 201, 201, 201, 201, 201, 201,
-
- 2232, 2232, 2232, 2233, 2233, 2233, 2233, 2233,
- 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233,
- 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233,
- 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2233,
- 2233, 2233, 2233, 2233, 2233, 2233, 2233, 2234,
- 2235, 2235, 2235, 2235, 2236, 2235, 2237, 2237,
- 2235, 2235, 2235, 2238, 2238, 201, 2239, 2240,
- 2241, 2242, 2243, 2244, 2245, 2246, 2247, 2248,
- 2249, 2250, 2250, 2250, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251,
- 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251,
- 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251,
- 2251, 2251, 2251, 2251, 2251, 2251, 2251, 2251,
- 2251, 2251, 2251, 2252, 2253, 2254, 2251, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 2255, 2255, 2256, 2257, 2257, 2257, 2257, 2257,
- 2257, 2257, 2257, 2257, 2257, 2257, 2257, 2257,
- 2257, 2257, 2257, 2257, 2257, 2257, 2257, 2257,
- 2257, 2257, 2257, 2257, 2257, 2257, 2257, 2257,
- 2257, 2257, 2257, 2257, 2257, 2257, 2257, 2257,
- 2257, 2257, 2257, 2257, 2257, 2257, 2257, 2257,
- 2257, 2257, 2257, 2256, 2256, 2256, 2255, 2255,
- 2255, 2255, 2255, 2255, 2255, 2255, 2255, 2256,
- 2258, 2257, 2259, 2259, 2257, 2260, 2260, 2261,
- 2262, 2263, 2264, 2265, 2265, 2266, 201, 201,
- 2267, 2268, 2269, 2270, 2271, 2272, 2273, 2274,
- 2275, 2276, 2277, 2278, 2279, 2280, 2281, 2281,
- 201, 2282, 2282, 2282, 2282, 2282, 2282, 2282,
- 2282, 2282, 2282, 2282, 2282, 2282, 2282, 2282,
- 2282, 2282, 2282, 2282, 2282, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
-
- 2283, 2283, 2283, 2283, 2283, 2283, 2283, 2283,
- 2283, 2283, 2283, 2283, 2283, 2283, 2283, 2283,
- 2283, 2283, 201, 2283, 2283, 2283, 2283, 2283,
- 2283, 2283, 2283, 2283, 2283, 2283, 2283, 2283,
- 2283, 2283, 2283, 2283, 2283, 2283, 2283, 2283,
- 2283, 2283, 2283, 2283, 2284, 2284, 2284, 2285,
- 2285, 2285, 2284, 2284, 2285, 2286, 2287, 2285,
- 2288, 2288, 2289, 2288, 2288, 2289, 2290, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 2291, 2291, 2291, 2291, 2291, 2291, 2291, 201,
- 2291, 201, 2291, 2291, 2291, 2291, 201, 2291,
- 2291, 2291, 2291, 2291, 2291, 2291, 2291, 2291,
- 2291, 2291, 2291, 2291, 2291, 2291, 201, 2291,
- 2291, 2291, 2291, 2291, 2291, 2291, 2291, 2291,
- 2291, 2292, 201, 201, 201, 201, 201, 201,
- 2293, 2293, 2293, 2293, 2293, 2293, 2293, 2293,
- 2293, 2293, 2293, 2293, 2293, 2293, 2293, 2293,
- 2293, 2293, 2293, 2293, 2293, 2293, 2293, 2293,
- 2293, 2293, 2293, 2293, 2293, 2293, 2293, 2293,
- 2293, 2293, 2293, 2293, 2293, 2293, 2293, 2293,
- 2293, 2293, 2293, 2293, 2293, 2293, 2293, 2294,
- 2295, 2295, 2295, 2294, 2294, 2294, 2294, 2294,
- 2294, 2296, 2297, 201, 201, 201, 201, 201,
- 2298, 2299, 2300, 2301, 2302, 2303, 2304, 2305,
- 2306, 2307, 201, 201, 201, 201, 201, 201,
-
- 2308, 2309, 2310, 2310, 201, 2311, 2311, 2311,
- 2311, 2311, 2311, 2311, 2311, 201, 201, 2311,
- 2311, 201, 201, 2311, 2311, 2311, 2311, 2311,
- 2311, 2311, 2311, 2311, 2311, 2311, 2311, 2311,
- 2311, 2311, 2311, 2311, 2311, 2311, 2311, 2311,
- 2311, 201, 2311, 2311, 2311, 2311, 2311, 2311,
- 2311, 201, 2311, 2311, 201, 2311, 2311, 2311,
- 2311, 2311, 201, 201, 2312, 2311, 2313, 2310,
- 2309, 2310, 2310, 2310, 2310, 201, 201, 2310,
- 2310, 201, 201, 2314, 2314, 2315, 201, 201,
- 2316, 201, 201, 201, 201, 201, 201, 2313,
- 201, 201, 201, 201, 201, 2311, 2311, 2311,
- 2311, 2311, 2310, 2310, 201, 201, 2317, 2317,
- 2317, 2317, 2317, 2317, 2317, 201, 201, 201,
- 2317, 2317, 2317, 2317, 2317, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
-
- 2318, 2318, 2318, 2318, 2318, 2318, 2318, 2318,
- 2318, 2318, 2318, 2318, 2318, 2318, 2318, 2318,
- 2318, 2318, 2318, 2318, 2318, 2318, 2318, 2318,
- 2318, 2318, 2318, 2318, 2318, 2318, 2318, 2318,
- 2318, 2318, 2318, 2318, 2318, 2318, 2318, 2318,
- 2318, 2318, 2318, 2318, 2318, 2318, 2318, 2318,
- 2318, 2318, 2318, 2318, 2318, 2319, 2319, 2319,
- 2320, 2320, 2320, 2320, 2320, 2320, 2320, 2320,
- 2319, 2319, 2321, 2320, 2320, 2319, 2322, 2318,
- 2318, 2318, 2318, 2323, 2323, 2324, 2324, 2325,
- 2326, 2327, 2328, 2329, 2330, 2331, 2332, 2333,
- 2334, 2335, 201, 2324, 201, 2325, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336,
- 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336,
- 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336,
- 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336,
- 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336,
- 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336,
- 2337, 2338, 2338, 2339, 2339, 2339, 2339, 2339,
- 2339, 2338, 2340, 2341, 2341, 2337, 2341, 2339,
- 2339, 2338, 2342, 2343, 2336, 2336, 2344, 2336,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 2345, 2346, 2347, 2348, 2349, 2350, 2351, 2352,
- 2353, 2354, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
-
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 2355, 2355, 2355, 2355, 2355, 2355, 2355, 2355,
- 2355, 2355, 2355, 2355, 2355, 2355, 2355, 2355,
- 2355, 2355, 2355, 2355, 2355, 2355, 2355, 2355,
- 2355, 2355, 2355, 2355, 2355, 2355, 2355, 2355,
- 2355, 2355, 2355, 2355, 2355, 2355, 2355, 2355,
- 2355, 2355, 2355, 2355, 2355, 2355, 2355, 2356,
- 2357, 2357, 2358, 2358, 2358, 2358, 201, 201,
- 2357, 2357, 2359, 2359, 2358, 2358, 2357, 2360,
- 2361, 2362, 2363, 2363, 2364, 2364, 2365, 2365,
- 2365, 2363, 2366, 2366, 2366, 2366, 2366, 2366,
- 2366, 2366, 2366, 2366, 2366, 2366, 2366, 2366,
- 2367, 2367, 2367, 2367, 2368, 2368, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
-
- 2369, 2369, 2369, 2369, 2369, 2369, 2369, 2369,
- 2369, 2369, 2369, 2369, 2369, 2369, 2369, 2369,
- 2369, 2369, 2369, 2369, 2369, 2369, 2369, 2369,
- 2369, 2369, 2369, 2369, 2369, 2369, 2369, 2369,
- 2369, 2369, 2369, 2369, 2369, 2369, 2369, 2369,
- 2369, 2369, 2369, 2369, 2369, 2369, 2369, 2369,
- 2370, 2370, 2370, 2371, 2371, 2371, 2371, 2371,
- 2371, 2371, 2371, 2370, 2370, 2371, 2370, 2372,
- 2371, 2373, 2373, 2374, 2369, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 2375, 2376, 2377, 2378, 2379, 2380, 2381, 2382,
- 2383, 2384, 201, 201, 201, 201, 201, 201,
- 2385, 2385, 2385, 2385, 2385, 2385, 2385, 2385,
- 2385, 2385, 2385, 2385, 2385, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 2386, 2386, 2386, 2386, 2386, 2386, 2386, 2386,
- 2386, 2386, 2386, 2386, 2386, 2386, 2386, 2386,
- 2386, 2386, 2386, 2386, 2386, 2386, 2386, 2386,
- 2386, 2386, 2386, 2386, 2386, 2386, 2386, 2386,
- 2386, 2386, 2386, 2386, 2386, 2386, 2386, 2386,
- 2386, 2386, 2386, 2387, 2388, 2387, 2388, 2388,
- 2387, 2387, 2387, 2387, 2387, 2387, 2389, 2390,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 2391, 2392, 2393, 2394, 2395, 2396, 2397, 2398,
- 2399, 2400, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
-
- 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401,
- 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401,
- 2401, 2401, 2401, 2401, 2401, 2401, 2401, 2401,
- 2401, 2401, 201, 201, 201, 2402, 2402, 2402,
- 2403, 2403, 2402, 2402, 2402, 2402, 2403, 2402,
- 2402, 2402, 2402, 2404, 201, 201, 201, 201,
- 2405, 2406, 2407, 2408, 2409, 2410, 2411, 2412,
- 2413, 2414, 2415, 2415, 2416, 2416, 2416, 2417,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
-
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 2418, 2418, 2418, 2418, 2418, 2418, 2418, 2418,
- 2418, 2418, 2418, 2418, 2418, 2418, 2418, 2418,
- 2418, 2418, 2418, 2418, 2418, 2418, 2418, 2418,
- 2418, 2418, 2418, 2418, 2418, 2418, 2418, 2418,
- 2419, 2419, 2419, 2419, 2419, 2419, 2419, 2419,
- 2419, 2419, 2419, 2419, 2419, 2419, 2419, 2419,
- 2419, 2419, 2419, 2419, 2419, 2419, 2419, 2419,
- 2419, 2419, 2419, 2419, 2419, 2419, 2419, 2419,
- 2420, 2421, 2422, 2423, 2424, 2425, 2426, 2427,
- 2428, 2429, 2430, 2430, 2430, 2430, 2430, 2430,
- 2430, 2430, 2430, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 2431,
-
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
-
- 2432, 2433, 2433, 2433, 2433, 2433, 2433, 2434,
- 2434, 2433, 2433, 2432, 2432, 2432, 2432, 2432,
- 2432, 2432, 2432, 2432, 2432, 2432, 2432, 2432,
- 2432, 2432, 2432, 2432, 2432, 2432, 2432, 2432,
- 2432, 2432, 2432, 2432, 2432, 2432, 2432, 2432,
- 2432, 2432, 2432, 2432, 2432, 2432, 2432, 2432,
- 2432, 2432, 2432, 2433, 2435, 2433, 2433, 2433,
- 2433, 2434, 2436, 2433, 2433, 2433, 2433, 2437,
- 2438, 2439, 2440, 2440, 2439, 2437, 2438, 2435,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 2441, 2442, 2442, 2442, 2442, 2442, 2442, 2443,
- 2443, 2442, 2442, 2442, 2441, 2441, 2441, 2441,
- 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441,
- 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441,
- 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441,
- 2441, 2441, 2441, 2441, 2441, 2441, 2441, 2441,
- 2441, 2441, 2441, 2441, 201, 201, 2444, 2444,
- 2444, 2444, 2442, 2442, 2442, 2442, 2442, 2442,
- 2442, 2442, 2442, 2442, 2442, 2442, 2442, 2443,
- 2442, 2445, 2446, 2447, 2447, 201, 2448, 2448,
- 2448, 2446, 2446, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 2449, 2449, 2449, 2449, 2449, 2449, 2449, 2449,
- 2449, 2449, 2449, 2449, 2449, 2449, 2449, 2449,
- 2449, 2449, 2449, 2449, 2449, 2449, 2449, 2449,
- 2449, 2449, 2449, 2449, 2449, 2449, 2449, 2449,
- 2449, 2449, 2449, 2449, 2449, 2449, 2449, 2449,
- 2449, 2449, 2449, 2449, 2449, 2449, 2449, 2449,
- 2449, 2449, 2449, 2449, 2449, 2449, 2449, 2449,
- 2449, 201, 201, 201, 201, 201, 201, 201,
-
- 2450, 2450, 2450, 2450, 2450, 2450, 2450, 2450,
- 2450, 201, 2450, 2450, 2450, 2450, 2450, 2450,
- 2450, 2450, 2450, 2450, 2450, 2450, 2450, 2450,
- 2450, 2450, 2450, 2450, 2450, 2450, 2450, 2450,
- 2450, 2450, 2450, 2450, 2450, 2450, 2450, 2450,
- 2450, 2450, 2450, 2450, 2450, 2450, 2450, 2451,
- 2452, 2452, 2452, 2452, 2452, 2452, 2452, 201,
- 2452, 2452, 2452, 2452, 2452, 2452, 2451, 2453,
- 2450, 2454, 2454, 2455, 2455, 2455, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 2456, 2457, 2458, 2459, 2460, 2461, 2462, 2463,
- 2464, 2465, 2466, 2466, 2466, 2466, 2466, 2466,
- 2466, 2466, 2466, 2466, 2466, 2466, 2466, 2466,
- 2466, 2466, 2466, 2466, 2466, 201, 201, 201,
- 2467, 2468, 2469, 2469, 2469, 2469, 2469, 2469,
- 2469, 2469, 2469, 2469, 2469, 2469, 2469, 2469,
- 2469, 2469, 2469, 2469, 2469, 2469, 2469, 2469,
- 2469, 2469, 2469, 2469, 2469, 2469, 2469, 2469,
- 201, 201, 2470, 2470, 2470, 2470, 2470, 2470,
- 2470, 2470, 2470, 2470, 2470, 2470, 2470, 2470,
- 2470, 2470, 2470, 2470, 2470, 2470, 2470, 2470,
- 201, 2471, 2470, 2470, 2470, 2470, 2470, 2470,
- 2470, 2471, 2470, 2470, 2471, 2470, 2470, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
-
- 2472, 2472, 2472, 2472, 2472, 2472, 2472, 201,
- 2472, 2472, 201, 2472, 2472, 2472, 2472, 2472,
- 2472, 2472, 2472, 2472, 2472, 2472, 2472, 2472,
- 2472, 2472, 2472, 2472, 2472, 2472, 2472, 2472,
- 2472, 2472, 2472, 2472, 2472, 2472, 2472, 2472,
- 2472, 2472, 2472, 2472, 2472, 2472, 2472, 2472,
- 2472, 2473, 2473, 2473, 2473, 2473, 2473, 201,
- 201, 201, 2473, 201, 2473, 2473, 201, 2473,
- 2473, 2473, 2474, 2473, 2475, 2475, 2476, 2473,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 2477, 2478, 2479, 2480, 2481, 2482, 2483, 2484,
- 2485, 2486, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
-
- 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487,
- 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487,
- 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487,
- 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487,
- 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487,
- 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487,
- 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487,
- 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487,
- 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487,
- 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487,
- 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487,
- 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487,
- 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487,
- 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487,
- 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487,
- 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487,
- 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487,
- 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487,
- 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487,
- 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487,
- 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487,
- 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487,
- 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487,
- 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487,
- 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487,
- 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487,
- 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487,
- 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487,
- 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487,
- 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487,
- 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487,
- 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487,
-
- 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487,
- 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487,
- 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487,
- 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487,
- 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487,
- 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487,
- 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487,
- 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487,
- 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487,
- 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487,
- 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487,
- 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487,
- 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2487,
- 2487, 2487, 2487, 2487, 2487, 2487, 2487, 2488,
- 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488,
- 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488,
- 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488,
- 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488,
- 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488,
- 2488, 2489, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
-
- 2490, 2490, 2490, 2490, 2490, 2490, 2490, 2490,
- 2490, 2490, 2490, 2490, 2490, 2490, 2490, 2490,
- 2490, 2490, 2490, 2490, 2490, 2490, 2490, 2490,
- 2490, 2490, 2490, 2490, 2490, 2490, 2490, 2490,
- 2490, 2490, 2490, 2490, 2490, 2490, 2490, 2490,
- 2490, 2490, 2490, 2490, 2490, 2490, 2490, 2490,
- 2490, 2490, 2490, 2490, 2490, 2490, 2490, 2490,
- 2490, 2490, 2490, 2490, 2490, 2490, 2490, 2490,
- 2490, 2490, 2490, 2490, 2490, 2490, 2490, 2490,
- 2490, 2490, 2490, 2490, 2490, 2490, 2490, 2490,
- 2490, 2490, 2490, 2490, 2490, 2490, 2490, 2490,
- 2490, 2490, 2490, 2490, 2490, 2490, 2490, 2490,
- 2490, 2490, 2490, 2491, 2491, 2491, 2491, 2491,
- 2491, 2491, 2491, 2491, 2491, 2491, 2491, 201,
- 2492, 2492, 2492, 2492, 2493, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489,
- 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489,
- 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489,
- 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489,
- 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489,
- 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489,
- 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489,
- 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489,
- 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489,
- 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489,
- 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489,
- 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489,
- 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489,
- 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489,
- 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489,
- 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489,
-
- 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489,
- 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489,
- 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489,
- 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489,
- 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489,
- 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489,
- 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489,
- 2489, 2489, 2489, 2489, 2489, 2489, 2489, 2489,
- 2489, 2489, 2489, 2489, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
-
- 2494, 2494, 2494, 2494, 2494, 2494, 2494, 2494,
- 2494, 2494, 2494, 2494, 2494, 2494, 2494, 2494,
- 2494, 2494, 2494, 2494, 2494, 2494, 2494, 2494,
- 2494, 2494, 2494, 2494, 2494, 2494, 2494, 2494,
- 2494, 2494, 2494, 2494, 2494, 2494, 2494, 2494,
- 2494, 2494, 2494, 2494, 2494, 2494, 2494, 2494,
- 2494, 2494, 2494, 2494, 2494, 2494, 2494, 2494,
- 2494, 2494, 2494, 2494, 2494, 2494, 2494, 2494,
- 2494, 2494, 2494, 2494, 2494, 2494, 2494, 2494,
- 2494, 2494, 2494, 2494, 2494, 2494, 2494, 2494,
- 2494, 2494, 2494, 2494, 2494, 2494, 2494, 2494,
- 2494, 2494, 2494, 2494, 2494, 2494, 2494, 2494,
- 2494, 2494, 2494, 2494, 2494, 2494, 2494, 2494,
- 2494, 2494, 2494, 2494, 2494, 2494, 2494, 2494,
- 2494, 2494, 2494, 2494, 2494, 2494, 2494, 2494,
- 2494, 2494, 2494, 2494, 2494, 2494, 2494, 2494,
- 2494, 2494, 2494, 2494, 2494, 2494, 2494, 2494,
- 2494, 2494, 2494, 2494, 2494, 2494, 2494, 2494,
- 2494, 2494, 2494, 2494, 2494, 2494, 2494, 2494,
- 2494, 2494, 2494, 2494, 2494, 2494, 2494, 2494,
- 2494, 2494, 2494, 2494, 2494, 2494, 2494, 2494,
- 2494, 2494, 2494, 2494, 2494, 2494, 2494, 2494,
- 2494, 2494, 2494, 2494, 2494, 2494, 2494, 2494,
- 2494, 2494, 2494, 2494, 2494, 2494, 2494, 2494,
- 2494, 2494, 2494, 2494, 2494, 2494, 2494, 2494,
- 2494, 2494, 2494, 2494, 2494, 2494, 2494, 2494,
- 2494, 2494, 2494, 2494, 2494, 2494, 2494, 2494,
- 2494, 2494, 2494, 2494, 2494, 2494, 2494, 2494,
- 2494, 2494, 2494, 2494, 2494, 2494, 2494, 2494,
- 2494, 2494, 2494, 2494, 2494, 2494, 2494, 2494,
- 2494, 2494, 2494, 2494, 2494, 2494, 2494, 2494,
- 2494, 2494, 2494, 2494, 2494, 2494, 2494, 2494,
-
- 2494, 2494, 2494, 2494, 2494, 2494, 2494, 2494,
- 2494, 2494, 2494, 2494, 2494, 2494, 2494, 2494,
- 2494, 2494, 2494, 2494, 2494, 2494, 2494, 2494,
- 2494, 2494, 2494, 2494, 2494, 2494, 2494, 2494,
- 2494, 2494, 2494, 2494, 2494, 2494, 2494, 2494,
- 2494, 2494, 2494, 2494, 2494, 2494, 2494, 2494,
- 2494, 2494, 2494, 2494, 2494, 2494, 2494, 2494,
- 2494, 2494, 2494, 2494, 2494, 2494, 2494, 2494,
- 2494, 2494, 2494, 2494, 2494, 2494, 2494, 2494,
- 2494, 2494, 2494, 2494, 2494, 2494, 2494, 2494,
- 2494, 2494, 2494, 2494, 2494, 2494, 2494, 2494,
- 2495, 2495, 2495, 2496, 2496, 2496, 2494, 2494,
- 2494, 2494, 2494, 2494, 2494, 2494, 2494, 2494,
- 2494, 2494, 2494, 2494, 2494, 2494, 2494, 2494,
- 2494, 2494, 2494, 2494, 2494, 2494, 2494, 2494,
- 2494, 2494, 2494, 2494, 2494, 2494, 2494, 2494,
- 2494, 2494, 2496, 2494, 2494, 2494, 2495, 2496,
- 2495, 2496, 2494, 2494, 2494, 2494, 2494, 2494,
- 2494, 2494, 2494, 2494, 2494, 2494, 2494, 2494,
- 2494, 2494, 2494, 2494, 2494, 2494, 2494, 2494,
- 2494, 2494, 2494, 2494, 2494, 2494, 2494, 2494,
- 2494, 2494, 2494, 2494, 2494, 2494, 2494, 2494,
- 2494, 2494, 2494, 2494, 2494, 2494, 2494, 2494,
- 2494, 2494, 2494, 2494, 2494, 2494, 2494, 2494,
- 2494, 2494, 2494, 2494, 2494, 2494, 2494, 2494,
- 2494, 2494, 2494, 2494, 2494, 2494, 2494, 2494,
- 2494, 2494, 2494, 2494, 2494, 2494, 2494, 2494,
- 2494, 2494, 2494, 2494, 2494, 2494, 2494, 2494,
- 2494, 2494, 2494, 2494, 2494, 2494, 2494, 2494,
- 2494, 2494, 2494, 2494, 2494, 2494, 2494, 2494,
- 2494, 2494, 2494, 2494, 2494, 2494, 2494, 2494,
- 2494, 2494, 2494, 2494, 2494, 2494, 2494, 2494,
-
- 2494, 2494, 2494, 2494, 2494, 2494, 2494, 2494,
- 2494, 2494, 2494, 2494, 2494, 2494, 2494, 2494,
- 2494, 2494, 2494, 2494, 2494, 2494, 2494, 2494,
- 2494, 2494, 2494, 2494, 2494, 2494, 2494, 2494,
- 2494, 2494, 2494, 2494, 2494, 2494, 2494, 2494,
- 2494, 2494, 2494, 2494, 2494, 2494, 2494, 2494,
- 2494, 2494, 2494, 2494, 2494, 2494, 2494, 2494,
- 2494, 2494, 2494, 2494, 2494, 2494, 2494, 2494,
- 2494, 2494, 2494, 2494, 2494, 2494, 2494, 2494,
- 2494, 2494, 2494, 2494, 2494, 2494, 2494, 2494,
- 2494, 2494, 2494, 2494, 2494, 2494, 2494, 2494,
- 2494, 2494, 2494, 2494, 2494, 2494, 2494, 2494,
- 2494, 2494, 2494, 2494, 2494, 2494, 2494, 2494,
- 2494, 2494, 2494, 2494, 2494, 2494, 2494, 2494,
- 2494, 2494, 2494, 2494, 2494, 2494, 2494, 2494,
- 2494, 2495, 2496, 2496, 2494, 2494, 2494, 2494,
- 2494, 2494, 2494, 2494, 2494, 2494, 2494, 2494,
- 2494, 2494, 2494, 2494, 2494, 2494, 2494, 2494,
- 2494, 2494, 2494, 2494, 2494, 2494, 2494, 2494,
- 2494, 2494, 2494, 2494, 2494, 2494, 2494, 2494,
- 2494, 2494, 2494, 2494, 2494, 2494, 2494, 2494,
- 2494, 2494, 2494, 2494, 2494, 2494, 2494, 2494,
- 2494, 2494, 2494, 2494, 2494, 2494, 2494, 2494,
- 2494, 2494, 2494, 2494, 2494, 2494, 2494, 2494,
- 2494, 2494, 2494, 2494, 2494, 2494, 2494, 2494,
- 2494, 2494, 2494, 2494, 2494, 2494, 2494, 2494,
- 2494, 2494, 2494, 2494, 2494, 2494, 2494, 2494,
- 2494, 2494, 2494, 2494, 2494, 2494, 2494, 2494,
- 2494, 2494, 2494, 2494, 2494, 2494, 2494, 2494,
- 2494, 2494, 2494, 2494, 2494, 2494, 2494, 2494,
- 2494, 2494, 2494, 2494, 2494, 2494, 2494, 2494,
- 2494, 2494, 2494, 2494, 2494, 2494, 2494, 2494,
-
- 2494, 2494, 2494, 2494, 2494, 2494, 2494, 2494,
- 2494, 2494, 2494, 2494, 2494, 2494, 2494, 2494,
- 2494, 2494, 2494, 2494, 2494, 2494, 2494, 2494,
- 2494, 2494, 2494, 2494, 2494, 2494, 2494, 2494,
- 2494, 2494, 2494, 2494, 2494, 2494, 2494, 2494,
- 2494, 2494, 2494, 2494, 2494, 2494, 2494, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
-
- 2497, 2497, 2497, 2497, 2497, 2497, 2497, 2497,
- 2497, 2497, 2497, 2497, 2497, 2497, 2497, 2497,
- 2497, 2497, 2497, 2497, 2497, 2497, 2497, 2497,
- 2497, 2497, 2497, 2497, 2497, 2497, 2497, 2497,
- 2497, 2497, 2497, 2497, 2497, 2497, 2497, 2497,
- 2497, 2497, 2497, 2497, 2497, 2497, 2497, 2497,
- 2497, 2497, 2497, 2497, 2497, 2497, 2497, 2497,
- 2497, 2497, 2497, 2497, 2497, 2497, 2497, 2497,
- 2497, 2497, 2497, 2497, 2497, 2497, 2497, 2497,
- 2497, 2497, 2497, 2497, 2497, 2497, 2497, 2497,
- 2497, 2497, 2497, 2497, 2497, 2497, 2497, 2497,
- 2497, 2497, 2497, 2497, 2497, 2497, 2497, 2497,
- 2497, 2497, 2497, 2497, 2497, 2497, 2497, 2497,
- 2497, 2497, 2497, 2497, 2497, 2497, 2497, 2497,
- 2497, 2497, 2497, 2497, 2497, 2497, 2497, 2497,
- 2497, 2497, 2497, 2497, 2497, 2497, 2497, 2497,
- 2497, 2497, 2497, 2497, 2497, 2497, 2497, 2497,
- 2497, 2497, 2497, 2497, 2497, 2497, 2497, 2497,
- 2497, 2497, 2497, 2497, 2497, 2497, 2497, 2497,
- 2497, 2497, 2497, 2497, 2497, 2497, 2497, 2497,
- 2497, 2497, 2497, 2497, 2497, 2497, 2497, 2497,
- 2497, 2497, 2497, 2497, 2497, 2497, 2497, 2497,
- 2497, 2497, 2497, 2497, 2497, 2497, 2497, 2497,
- 2497, 2497, 2497, 2497, 2497, 2497, 2497, 2497,
- 2497, 2497, 2497, 2497, 2497, 2497, 2497, 2497,
- 2497, 2497, 2497, 2497, 2497, 2497, 2497, 2497,
- 2497, 2497, 2497, 2497, 2497, 2497, 2497, 2497,
- 2497, 2497, 2497, 2497, 2497, 2497, 2497, 2497,
- 2497, 2497, 2497, 2497, 2497, 2497, 2497, 2497,
- 2497, 2497, 2497, 2497, 2497, 2497, 2497, 2497,
- 2497, 2497, 2497, 2497, 2497, 2497, 2497, 2497,
- 2497, 2497, 2497, 2497, 2497, 2497, 2497, 2497,
-
- 2497, 2497, 2497, 2497, 2497, 2497, 2497, 2497,
- 2497, 2497, 2497, 2497, 2497, 2497, 2497, 2497,
- 2497, 2497, 2497, 2497, 2497, 2497, 2497, 2497,
- 2497, 2497, 2497, 2497, 2497, 2497, 2497, 2497,
- 2497, 2497, 2497, 2497, 2497, 2497, 2497, 2497,
- 2497, 2497, 2497, 2497, 2497, 2497, 2497, 2497,
- 2497, 2497, 2497, 2497, 2497, 2497, 2497, 2497,
- 2497, 2497, 2497, 2497, 2497, 2497, 2497, 2497,
- 2497, 2497, 2497, 2497, 2497, 2497, 2497, 2497,
- 2497, 2497, 2497, 2497, 2497, 2497, 2497, 2497,
- 2497, 2497, 2497, 2497, 2497, 2497, 2497, 2497,
- 2497, 2497, 2497, 2497, 2497, 2497, 2497, 2497,
- 2497, 2497, 2497, 2497, 2497, 2497, 2497, 2497,
- 2497, 2497, 2497, 2497, 2497, 2497, 2497, 2497,
- 2497, 2497, 2497, 2497, 2497, 2497, 2497, 2497,
- 2497, 2497, 2497, 2497, 2497, 2497, 2497, 2497,
- 2497, 2497, 2497, 2497, 2497, 2497, 2497, 2497,
- 2497, 2497, 2497, 2497, 2497, 2497, 2497, 2497,
- 2497, 2497, 2497, 2497, 2497, 2497, 2497, 2497,
- 2497, 2497, 2497, 2497, 2497, 2497, 2497, 2497,
- 2497, 2497, 2497, 2497, 2497, 2497, 2497, 2497,
- 2497, 2497, 2497, 2497, 2497, 2497, 2497, 2497,
- 2497, 2497, 2497, 2497, 2497, 2497, 2497, 2497,
- 2497, 2497, 2497, 2497, 2497, 2497, 2497, 2497,
- 2497, 2497, 2497, 2497, 2497, 2497, 2497, 2497,
- 2497, 2497, 2497, 2497, 2497, 2497, 2498, 2499,
- 2497, 2497, 2497, 2497, 2497, 2497, 2497, 2497,
- 2497, 2497, 2497, 2497, 2497, 2497, 2497, 2497,
- 2497, 2497, 2497, 2497, 2497, 2497, 2497, 2497,
- 2497, 2497, 2497, 2497, 2497, 2497, 2497, 2497,
- 2497, 2497, 2497, 2497, 2497, 2497, 2497, 2497,
- 2497, 2497, 2497, 2497, 2497, 2497, 2497, 2497,
-
- 2497, 2497, 2497, 2497, 2497, 2497, 2497, 2497,
- 2497, 2497, 2497, 2497, 2497, 2497, 2497, 2497,
- 2497, 2497, 2497, 2497, 2497, 2497, 2497, 2497,
- 2497, 2497, 2497, 2497, 2497, 2497, 2497, 2497,
- 2497, 2497, 2497, 2497, 2497, 2497, 2497, 2497,
- 2497, 2497, 2497, 2497, 2497, 2497, 2497, 2497,
- 2497, 2497, 2497, 2497, 2497, 2497, 2497, 2497,
- 2497, 2497, 2497, 2497, 2497, 2497, 2497, 2497,
- 2497, 2497, 2497, 2497, 2497, 2497, 2497, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
-
- 2500, 2500, 2500, 2500, 2500, 2500, 2500, 2500,
- 2500, 2500, 2500, 2500, 2500, 2500, 2500, 2500,
- 2500, 2500, 2500, 2500, 2500, 2500, 2500, 2500,
- 2500, 2500, 2500, 2500, 2500, 2500, 2500, 2500,
- 2500, 2500, 2500, 2500, 2500, 2500, 2500, 2500,
- 2500, 2500, 2500, 2500, 2500, 2500, 2500, 2500,
- 2500, 2500, 2500, 2500, 2500, 2500, 2500, 2500,
- 2500, 2500, 2500, 2500, 2500, 2500, 2500, 2500,
- 2500, 2500, 2500, 2500, 2500, 2500, 2500, 2500,
- 2500, 2500, 2500, 2500, 2500, 2500, 2500, 2500,
- 2500, 2500, 2500, 2500, 2500, 2500, 2500, 2500,
- 2500, 2500, 2500, 2500, 2500, 2500, 2500, 2500,
- 2500, 2500, 2500, 2500, 2500, 2500, 2500, 2500,
- 2500, 2500, 2500, 2500, 2500, 2500, 2500, 2500,
- 2500, 2500, 2500, 2500, 2500, 2500, 2500, 2500,
- 2500, 2500, 2500, 2500, 2500, 2500, 2500, 2500,
- 2500, 2500, 2500, 2500, 2500, 2500, 2500, 2500,
- 2500, 2500, 2500, 2500, 2500, 2500, 2500, 2500,
- 2500, 2500, 2500, 2500, 2500, 2500, 2500, 2500,
- 2500, 2500, 2500, 2500, 2500, 2500, 2500, 2500,
- 2500, 2500, 2500, 2500, 2500, 2500, 2500, 2500,
- 2500, 2500, 2500, 2500, 2500, 2500, 2500, 2500,
- 2500, 2500, 2500, 2500, 2500, 2500, 2500, 2500,
- 2500, 2500, 2500, 2500, 2500, 2500, 2500, 2500,
- 2500, 2500, 2500, 2500, 2500, 2500, 2500, 2500,
- 2500, 2500, 2500, 2500, 2500, 2500, 2500, 2500,
- 2500, 2500, 2500, 2500, 2500, 2500, 2500, 2500,
- 2500, 2500, 2500, 2500, 2500, 2500, 2500, 2500,
- 2500, 2500, 2500, 2500, 2500, 2500, 2500, 2500,
- 2500, 2500, 2500, 2500, 2500, 2500, 2500, 2500,
- 2500, 2500, 2500, 2500, 2500, 2500, 2500, 2500,
- 2500, 2500, 2500, 2500, 2500, 2500, 2500, 2500,
-
- 2500, 2500, 2500, 2500, 2500, 2500, 2500, 2500,
- 2500, 2500, 2500, 2500, 2500, 2500, 2500, 2500,
- 2500, 2500, 2500, 2500, 2500, 2500, 2500, 2500,
- 2500, 2500, 2500, 2500, 2500, 2500, 2500, 2500,
- 2500, 2500, 2500, 2500, 2500, 2500, 2500, 2500,
- 2500, 2500, 2500, 2500, 2500, 2500, 2500, 2500,
- 2500, 2500, 2500, 2500, 2500, 2500, 2500, 2500,
- 2500, 201, 201, 201, 201, 201, 201, 201,
- 2501, 2501, 2501, 2501, 2501, 2501, 2501, 2501,
- 2501, 2501, 2501, 2501, 2501, 2501, 2501, 2501,
- 2501, 2501, 2501, 2501, 2501, 2501, 2501, 2501,
- 2501, 2501, 2501, 2501, 2501, 2501, 2501, 201,
- 2502, 2503, 2504, 2505, 2506, 2507, 2508, 2509,
- 2510, 2511, 201, 201, 201, 201, 2512, 2512,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 2513, 2513, 2513, 2513, 2513, 2513, 2513, 2513,
- 2513, 2513, 2513, 2513, 2513, 2513, 2513, 2513,
- 2513, 2513, 2513, 2513, 2513, 2513, 2513, 2513,
- 2513, 2513, 2513, 2513, 2513, 2513, 201, 201,
- 2514, 2514, 2514, 2514, 2514, 2515, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
-
- 2516, 2516, 2516, 2516, 2516, 2516, 2516, 2516,
- 2516, 2516, 2516, 2516, 2516, 2516, 2516, 2516,
- 2516, 2516, 2516, 2516, 2516, 2516, 2516, 2516,
- 2516, 2516, 2516, 2516, 2516, 2516, 2516, 2516,
- 2516, 2516, 2516, 2516, 2516, 2516, 2516, 2516,
- 2516, 2516, 2516, 2516, 2516, 2516, 2516, 2516,
- 2517, 2517, 2517, 2517, 2517, 2517, 2517, 2518,
- 2518, 2519, 2520, 2520, 2521, 2521, 2521, 2521,
- 2522, 2522, 2522, 2522, 2518, 2521, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 2523, 2524, 2525, 2526, 2527, 2528, 2529, 2530,
- 2531, 2532, 201, 2533, 2533, 2533, 2533, 2533,
- 2533, 2533, 201, 2516, 2516, 2516, 2516, 2516,
- 2516, 2516, 2516, 2516, 2516, 2516, 2516, 2516,
- 2516, 2516, 2516, 2516, 2516, 2516, 2516, 2516,
- 201, 201, 201, 201, 201, 2516, 2516, 2516,
- 2516, 2516, 2516, 2516, 2516, 2516, 2516, 2516,
- 2516, 2516, 2516, 2516, 2516, 2516, 2516, 2516,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
-
- 2534, 2534, 2534, 2534, 2534, 2534, 2534, 2534,
- 2534, 2534, 2534, 2534, 2534, 2534, 2534, 2534,
- 2534, 2534, 2534, 2534, 2534, 2534, 2534, 2534,
- 2534, 2534, 2534, 2534, 2534, 2534, 2534, 2534,
- 2534, 2534, 2534, 2534, 2534, 2534, 2534, 2534,
- 2534, 2534, 2534, 2534, 2534, 2534, 2534, 2534,
- 2534, 2534, 2534, 2534, 2534, 2534, 2534, 2534,
- 2534, 2534, 2534, 2534, 2534, 2534, 2534, 2534,
- 2534, 2534, 2534, 2534, 2534, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 2534, 2535, 2535, 2535, 2535, 2535, 2535, 2535,
- 2535, 2535, 2535, 2535, 2535, 2535, 2535, 2535,
- 2535, 2535, 2535, 2535, 2535, 2535, 2535, 2535,
- 2535, 2535, 2535, 2535, 2535, 2535, 2535, 2535,
- 2535, 2535, 2535, 2535, 2535, 2535, 2535, 2535,
- 2535, 2535, 2535, 2535, 2535, 2535, 2535, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 2536,
- 2536, 2536, 2536, 2537, 2537, 2537, 2537, 2537,
- 2537, 2537, 2537, 2537, 2537, 2537, 2537, 2537,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 2538, 2539, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
-
- 2540, 2540, 2540, 2540, 2540, 2540, 2540, 2540,
- 2540, 2540, 2540, 2540, 2540, 2540, 2540, 2540,
- 2540, 2540, 2540, 2540, 2540, 2540, 2540, 2540,
- 2540, 2540, 2540, 2540, 2540, 2540, 2540, 2540,
- 2540, 2540, 2540, 2540, 2540, 2540, 2540, 2540,
- 2540, 2540, 2540, 2540, 2540, 2540, 2540, 2540,
- 2540, 2540, 2540, 2540, 2540, 2540, 2540, 2540,
- 2540, 2540, 2540, 2540, 2540, 2540, 2540, 2540,
- 2540, 2540, 2540, 2540, 2540, 2540, 2540, 2540,
- 2540, 2540, 2540, 2540, 2540, 2540, 2540, 2540,
- 2540, 2540, 2540, 2540, 2540, 2540, 2540, 2540,
- 2540, 2540, 2540, 2540, 2540, 2540, 2540, 2540,
- 2540, 2540, 2540, 2540, 2540, 2540, 2540, 2540,
- 2540, 2540, 2540, 2540, 2540, 2540, 2540, 2540,
- 2540, 2540, 2540, 2540, 2540, 2540, 2540, 2540,
- 2540, 2540, 2540, 2540, 2540, 2540, 2540, 2540,
- 2540, 2540, 2540, 2540, 2540, 2540, 2540, 2540,
- 2540, 2540, 2540, 2540, 2540, 2540, 2540, 2540,
- 2540, 2540, 2540, 2540, 2540, 2540, 2540, 2540,
- 2540, 2540, 2540, 2540, 2540, 2540, 2540, 2540,
- 2540, 2540, 2540, 2540, 2540, 2540, 2540, 2540,
- 2540, 2540, 2540, 2540, 2540, 2540, 2540, 2540,
- 2540, 2540, 2540, 2540, 2540, 2540, 2540, 2540,
- 2540, 2540, 2540, 2540, 2540, 2540, 2540, 2540,
- 2540, 2540, 2540, 2540, 2540, 2540, 2540, 2540,
- 2540, 2540, 2540, 2540, 2540, 2540, 2540, 2540,
- 2540, 2540, 2540, 2540, 2540, 2540, 2540, 2540,
- 2540, 2540, 2540, 2540, 2540, 2540, 2540, 2540,
- 2540, 2540, 2540, 2540, 2540, 2540, 2540, 2540,
- 2540, 2540, 2540, 2540, 2540, 2540, 2540, 2540,
- 2540, 2540, 2540, 2540, 2540, 2540, 2540, 2540,
- 2540, 2540, 2540, 2540, 2540, 2540, 2540, 2540,
-
- 2540, 2540, 2540, 2540, 2540, 2540, 2540, 2540,
- 2540, 2540, 2540, 2540, 2540, 2540, 2540, 2540,
- 2540, 2540, 2540, 2540, 2540, 2540, 2540, 2540,
- 2540, 2540, 2540, 2540, 2540, 2540, 2540, 2540,
- 2540, 2540, 2540, 2540, 2540, 2540, 2540, 2540,
- 2540, 2540, 2540, 2540, 2540, 2540, 2540, 2540,
- 2540, 2540, 2540, 2540, 2540, 2540, 2540, 2540,
- 2540, 2540, 2540, 2540, 2540, 2540, 2540, 2540,
- 2540, 2540, 2540, 2540, 2540, 2540, 2540, 2540,
- 2540, 2540, 2540, 2540, 2540, 2540, 2540, 2540,
- 2540, 2540, 2540, 2540, 2540, 2540, 2540, 2540,
- 2540, 2540, 2540, 2540, 2540, 2540, 2540, 2540,
- 2540, 2540, 2540, 2540, 2540, 2540, 2540, 2540,
- 2540, 2540, 2540, 2540, 2540, 2540, 2540, 2540,
- 2540, 2540, 2540, 2540, 2540, 2540, 2540, 2540,
- 2540, 2540, 2540, 2540, 2540, 2540, 2540, 2540,
- 2540, 2540, 2540, 2540, 2540, 2540, 2540, 2540,
- 2540, 2540, 2540, 2540, 2540, 2540, 2540, 2540,
- 2540, 2540, 2540, 2540, 2540, 2540, 2540, 2540,
- 2540, 2540, 2540, 2540, 2540, 2540, 2540, 2540,
- 2540, 2540, 2540, 2540, 2540, 2540, 2540, 2540,
- 2540, 2540, 2540, 2540, 2540, 2540, 2540, 2540,
- 2540, 2540, 2540, 2540, 2540, 2540, 2540, 2540,
- 2540, 2540, 2540, 2540, 2540, 2540, 2540, 2540,
- 2540, 2540, 2540, 2540, 2540, 2540, 2540, 2540,
- 2540, 2540, 2540, 2540, 2540, 2540, 2540, 2540,
- 2540, 2540, 2540, 2540, 2540, 2540, 2540, 2540,
- 2540, 2540, 2540, 2540, 2540, 2540, 2540, 2540,
- 2540, 2540, 2540, 2540, 2540, 2540, 2540, 2540,
- 2540, 2540, 2540, 2540, 2540, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
-
- 2540, 2540, 2540, 2540, 2540, 2540, 2540, 2540,
- 2540, 2540, 2540, 2540, 2540, 2540, 2540, 2540,
- 2540, 2540, 2540, 2540, 2540, 2540, 2540, 2540,
- 2540, 2540, 2540, 2540, 2540, 2540, 2540, 2540,
- 2540, 2540, 2540, 2540, 2540, 2540, 2540, 2540,
- 2540, 2540, 2540, 2540, 2540, 2540, 2540, 2540,
- 2540, 2540, 2540, 2540, 2540, 2540, 2540, 2540,
- 2540, 2540, 2540, 2540, 2540, 2540, 2540, 2540,
- 2540, 2540, 2540, 2540, 2540, 2540, 2540, 2540,
- 2540, 2540, 2540, 2540, 2540, 2540, 2540, 2540,
- 2540, 2540, 2540, 2540, 2540, 2540, 2540, 2540,
- 2540, 2540, 2540, 2540, 2540, 2540, 2540, 2540,
- 2540, 2540, 2540, 2540, 2540, 2540, 2540, 2540,
- 2540, 2540, 2540, 2540, 2540, 2540, 2540, 2540,
- 2540, 2540, 2540, 2540, 2540, 2540, 2540, 2540,
- 2540, 2540, 2540, 2540, 2540, 2540, 2540, 2540,
- 2540, 2540, 2540, 2540, 2540, 2540, 2540, 2540,
- 2540, 2540, 2540, 2540, 2540, 2540, 2540, 2540,
- 2540, 2540, 2540, 2540, 2540, 2540, 2540, 2540,
- 2540, 2540, 2540, 2540, 2540, 2540, 2540, 2540,
- 2540, 2540, 2540, 2540, 2540, 2540, 2540, 2540,
- 2540, 2540, 2540, 2540, 2540, 2540, 2540, 2540,
- 2540, 2540, 2540, 2540, 2540, 2540, 2540, 2540,
- 2540, 2540, 2540, 2540, 2540, 2540, 2540, 2540,
- 2540, 2540, 2540, 2540, 2540, 2540, 2540, 2540,
- 2540, 2540, 2540, 2540, 2540, 2540, 2540, 2540,
- 2540, 2540, 2540, 2540, 2540, 2540, 2540, 2540,
- 2540, 2540, 2540, 2540, 2540, 2540, 2540, 2540,
- 2540, 2540, 2540, 2540, 2540, 2540, 2540, 2540,
- 2540, 2540, 2540, 2540, 2540, 2540, 2540, 2540,
- 2540, 2540, 2540, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
-
- 2541, 2542, 2543, 2543, 2543, 2543, 2543, 2543,
- 2543, 2543, 2543, 2543, 2543, 2543, 2543, 2543,
- 2543, 2543, 2543, 2543, 2543, 2543, 2543, 2543,
- 2543, 2543, 2543, 2543, 2543, 2543, 2543, 2543,
- 2543, 2543, 2543, 2543, 2543, 2543, 2543, 2543,
- 2543, 2543, 2543, 2543, 2543, 2543, 2543, 2543,
- 2543, 2543, 2543, 2543, 2543, 2543, 2543, 2543,
- 2543, 2543, 2543, 2543, 2543, 2543, 2543, 2543,
- 2543, 2543, 2543, 2543, 2543, 2543, 2543, 2543,
- 2543, 2543, 2543, 2543, 2543, 2543, 2543, 2543,
- 2543, 2543, 2543, 2543, 2543, 2543, 2543, 2543,
- 2543, 2543, 2543, 2543, 2543, 2543, 2543, 2543,
- 2543, 2543, 2543, 2543, 2543, 2543, 2543, 2543,
- 2543, 2543, 2543, 2543, 2543, 2543, 2543, 2543,
- 2543, 2543, 2543, 2543, 2543, 2543, 2543, 2543,
- 2543, 2543, 2543, 2543, 2543, 2543, 2543, 2543,
- 2543, 2543, 2543, 2543, 2543, 2543, 2543, 2543,
- 2543, 2543, 2543, 2543, 2543, 2543, 2543, 2543,
- 2543, 2543, 2543, 2543, 2543, 2543, 2543, 2543,
- 2543, 2543, 2543, 2543, 2543, 2543, 2543, 2543,
- 2543, 2543, 2543, 2543, 2543, 2543, 2543, 2543,
- 2543, 2543, 2543, 2543, 2543, 2543, 2543, 2543,
- 2543, 2543, 2543, 2543, 2543, 2543, 2543, 2543,
- 2543, 2543, 2543, 2543, 2543, 2543, 2543, 2543,
- 2543, 2543, 2543, 2543, 2543, 2543, 2543, 2543,
- 2543, 2543, 2543, 2543, 2543, 2543, 2543, 2543,
- 2543, 2543, 2543, 2543, 2543, 2543, 2543, 2543,
- 2543, 2543, 2543, 2543, 2543, 2543, 2543, 2543,
- 2543, 2543, 2543, 2543, 2543, 2543, 2543, 2543,
- 2543, 2543, 2543, 2543, 2543, 2543, 2543, 2543,
- 2543, 2543, 2543, 2543, 2543, 2543, 2543, 2543,
- 2543, 2543, 2543, 2543, 2543, 2543, 2543, 2543,
-
- 2543, 2543, 2543, 2543, 2543, 2543, 2543, 2543,
- 2543, 2543, 2543, 2543, 2543, 2543, 2543, 2543,
- 2543, 2543, 2543, 2543, 2543, 2543, 2543, 2543,
- 2543, 2543, 2543, 2543, 2543, 2543, 2543, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 2544, 2544, 2544, 2544, 2544, 2544, 2544, 2544,
- 2544, 2544, 2544, 2544, 2544, 2544, 2544, 2544,
- 2544, 2544, 2544, 2544, 2544, 2544, 2544, 2544,
- 2544, 2544, 2544, 2544, 2544, 2544, 2544, 2544,
- 2544, 2544, 2544, 2544, 2544, 2544, 2544, 2544,
- 2544, 2544, 2544, 2544, 2544, 2544, 2544, 2544,
- 2544, 2544, 2544, 2544, 2544, 2544, 2544, 2544,
- 2544, 2544, 2544, 2544, 2544, 2544, 2544, 2544,
- 2544, 2544, 2544, 2544, 2544, 2544, 2544, 2544,
- 2544, 2544, 2544, 2544, 2544, 2544, 2544, 2544,
- 2544, 2544, 2544, 2544, 2544, 2544, 2544, 2544,
- 2544, 2544, 2544, 2544, 2544, 2544, 2544, 2544,
- 2544, 2544, 2544, 2544, 2544, 2544, 2544, 2544,
- 2544, 2544, 2544, 2544, 2544, 2544, 2544, 2544,
- 2544, 2544, 2544, 2544, 2544, 2544, 2544, 2544,
- 2544, 2544, 2544, 2544, 2544, 2544, 2544, 2544,
- 2544, 2544, 2544, 2544, 2544, 2544, 2544, 2544,
- 2544, 2544, 2544, 2544, 2544, 2544, 2544, 2544,
-
- 2544, 2544, 2544, 2544, 2544, 2544, 2544, 2544,
- 2544, 2544, 2544, 2544, 2544, 2544, 2544, 2544,
- 2544, 2544, 2544, 2544, 2544, 2544, 2544, 2544,
- 2544, 2544, 2544, 2544, 2544, 2544, 2544, 2544,
- 2544, 2544, 2544, 2544, 2544, 2544, 2544, 2544,
- 2544, 2544, 2544, 2544, 2544, 2544, 2544, 2544,
- 2544, 2544, 2544, 2544, 2544, 2544, 2544, 2544,
- 2544, 2544, 2544, 2544, 2544, 2544, 2544, 2544,
- 2544, 2544, 2544, 2544, 2544, 2544, 2544, 2544,
- 2544, 2544, 2544, 2544, 2544, 2544, 2544, 2544,
- 2544, 2544, 2544, 2544, 2544, 2544, 2544, 2544,
- 2544, 2544, 2544, 2544, 2544, 2544, 2544, 2544,
- 2544, 2544, 2544, 2544, 2544, 2544, 2544, 2544,
- 2544, 2544, 2544, 2544, 2544, 2544, 2544, 2544,
- 2544, 2544, 2544, 2544, 2544, 2544, 2544, 2544,
- 2544, 2544, 2544, 2544, 2544, 2544, 2544, 2544,
- 2544, 2544, 2544, 2544, 2544, 2544, 2544, 2544,
- 2544, 2544, 2544, 2544, 2544, 2544, 2544, 2544,
- 2544, 2544, 2544, 2544, 2544, 2544, 2544, 2544,
- 2544, 2544, 2544, 2544, 2544, 2544, 2544, 2544,
- 2544, 2544, 2544, 2544, 2544, 2544, 2544, 2544,
- 2544, 2544, 2544, 2544, 2544, 2544, 2544, 2544,
- 2544, 2544, 2544, 2544, 2544, 2544, 2544, 2544,
- 2544, 2544, 2544, 2544, 2544, 2544, 2544, 2544,
- 2544, 2544, 2544, 2544, 2544, 2544, 2544, 2544,
- 2544, 2544, 2544, 2544, 2544, 2544, 2544, 2544,
- 2544, 2544, 2544, 2544, 2544, 2544, 2544, 2544,
- 2544, 2544, 2544, 2544, 2544, 2544, 2544, 2544,
- 2544, 2544, 2544, 2544, 2544, 2544, 2544, 2544,
- 2544, 2544, 2544, 2544, 2544, 2544, 2544, 2544,
- 2544, 2544, 2544, 2544, 2544, 2544, 2544, 2544,
- 2544, 2544, 2544, 2544, 201, 201, 201, 201,
-
- 2545, 2545, 2545, 2545, 2545, 2545, 2545, 2545,
- 2545, 2545, 2545, 2545, 2545, 2545, 2545, 2545,
- 2545, 2545, 2545, 2545, 2545, 2545, 2545, 2545,
- 2545, 2545, 2545, 2545, 2545, 2545, 2545, 2545,
- 2545, 2545, 2545, 2545, 2545, 2545, 2545, 2545,
- 2545, 2545, 2545, 2545, 2545, 2545, 2545, 2545,
- 2545, 2545, 2545, 2545, 2545, 2545, 2545, 2545,
- 2545, 2545, 2545, 2545, 2545, 2545, 2545, 2545,
- 2545, 2545, 2545, 2545, 2545, 2545, 2545, 2545,
- 2545, 2545, 2545, 2545, 2545, 2545, 2545, 2545,
- 2545, 2545, 2545, 2545, 2545, 2545, 2545, 2545,
- 2545, 2545, 2545, 2545, 2545, 2545, 2545, 2545,
- 2545, 2545, 2545, 2545, 2545, 2545, 2545, 2545,
- 2545, 2545, 2545, 201, 201, 201, 201, 201,
- 2545, 2545, 2545, 2545, 2545, 2545, 2545, 2545,
- 2545, 2545, 2545, 2545, 2545, 201, 201, 201,
- 2545, 2545, 2545, 2545, 2545, 2545, 2545, 2545,
- 2545, 201, 201, 201, 201, 201, 201, 201,
- 2545, 2545, 2545, 2545, 2545, 2545, 2545, 2545,
- 2545, 2545, 201, 201, 2546, 2547, 2548, 2549,
- 2550, 2550, 2550, 2550, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
-
- 2551, 2551, 2551, 2551, 2551, 2551, 2551, 2551,
- 2551, 2551, 2551, 2551, 2551, 2551, 2551, 2551,
- 2551, 2551, 2551, 2551, 2551, 2551, 2551, 2551,
- 2551, 2551, 2551, 2551, 2551, 2551, 2551, 2551,
- 2551, 2551, 2551, 2551, 2551, 2551, 2551, 2551,
- 2551, 2551, 2551, 2551, 2551, 2551, 2551, 2551,
- 2551, 2551, 2551, 2551, 2551, 2551, 2551, 2551,
- 2551, 2551, 2551, 2551, 2551, 2551, 2551, 2551,
- 2551, 2551, 2551, 2551, 2551, 2551, 2551, 2551,
- 2551, 2551, 2551, 2551, 2551, 2551, 2551, 2551,
- 2551, 2551, 2551, 2551, 2551, 2551, 2551, 2551,
- 2551, 2551, 2551, 2551, 2551, 2551, 2551, 2551,
- 2551, 2551, 2551, 2551, 2551, 2551, 2551, 2551,
- 2551, 2551, 2551, 2551, 2551, 2551, 2551, 2551,
- 2551, 2551, 2551, 2551, 2551, 2551, 2551, 2551,
- 2551, 2551, 2551, 2551, 2551, 2551, 2551, 2551,
- 2551, 2551, 2551, 2551, 2551, 2551, 2551, 2551,
- 2551, 2551, 2551, 2551, 2551, 2551, 2551, 2551,
- 2551, 2551, 2551, 2551, 2551, 2551, 2551, 2551,
- 2551, 2551, 2551, 2551, 2551, 2551, 2551, 2551,
- 2551, 2551, 2551, 2551, 2551, 2551, 2551, 2551,
- 2551, 2551, 2551, 2551, 2551, 2551, 2551, 2551,
- 2551, 2551, 2551, 2551, 2551, 2551, 2551, 2551,
- 2551, 2551, 2551, 2551, 2551, 2551, 2551, 2551,
- 2551, 2551, 2551, 2551, 2551, 2551, 2551, 2551,
- 2551, 2551, 2551, 2551, 2551, 2551, 2551, 2551,
- 2551, 2551, 2551, 2551, 2551, 2551, 2551, 2551,
- 2551, 2551, 2551, 2551, 2551, 2551, 2551, 2551,
- 2551, 2551, 2551, 2551, 2551, 2551, 2551, 2551,
- 2551, 2551, 2551, 2551, 2551, 2551, 2551, 2551,
- 2551, 2551, 2551, 2551, 2551, 2551, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
-
- 2551, 2551, 2551, 2551, 2551, 2551, 2551, 2551,
- 2551, 2551, 2551, 2551, 2551, 2551, 2551, 2551,
- 2551, 2551, 2551, 2551, 2551, 2551, 2551, 2551,
- 2551, 2551, 2551, 2551, 2551, 2551, 2551, 2551,
- 2551, 2551, 2551, 2551, 2551, 2551, 2551, 201,
- 201, 1444, 2551, 2551, 2551, 2551, 2551, 2551,
- 2551, 2551, 2551, 2551, 2551, 2551, 2551, 2551,
- 2551, 2551, 2551, 2551, 2551, 2551, 2551, 2551,
- 2551, 2551, 2551, 2551, 2551, 2551, 2551, 2551,
- 2551, 2551, 2551, 2551, 2551, 2551, 2551, 2551,
- 2551, 2551, 2551, 2551, 2551, 2551, 2551, 2551,
- 2551, 2551, 2551, 2551, 2551, 2551, 2552, 2552,
- 2552, 2552, 2552, 2552, 2552, 2553, 2554, 2555,
- 2555, 2555, 2551, 2551, 2551, 2556, 2553, 2553,
- 2553, 2553, 2553, 2557, 2557, 2557, 2557, 2557,
- 2557, 2557, 2557, 2558, 2558, 2558, 2558, 2558,
- 2558, 2558, 2558, 2551, 2551, 2559, 2559, 2559,
- 2559, 2559, 2558, 2558, 2551, 2551, 2551, 2551,
- 2551, 2551, 2551, 2551, 2551, 2551, 2551, 2551,
- 2551, 2551, 2551, 2551, 2551, 2551, 2551, 2551,
- 2551, 2551, 2551, 2551, 2551, 2551, 2551, 2551,
- 2551, 2551, 2559, 2559, 2559, 2559, 2551, 2551,
- 2551, 2551, 2551, 2551, 2551, 2551, 2551, 2551,
- 2551, 2551, 2551, 2552, 2552, 2552, 2552, 2552,
- 2552, 2551, 2551, 2551, 2551, 2551, 2551, 2551,
- 2551, 2551, 2551, 2551, 2551, 2551, 2551, 2551,
- 2551, 2551, 2551, 2551, 2551, 2551, 2551, 2551,
- 2551, 2551, 2551, 2551, 2551, 2551, 2560, 2560,
- 2560, 2560, 2560, 2560, 2560, 2560, 2560, 2560,
- 2560, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
-
- 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067,
- 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067,
- 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067,
- 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067,
- 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067,
- 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067,
- 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067,
- 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2067,
- 2067, 2067, 2561, 2561, 2561, 2067, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
-
- 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478,
- 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478,
- 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478,
- 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478,
- 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478,
- 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478,
- 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478,
- 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478,
- 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478,
- 1478, 1478, 1478, 1478, 1478, 1478, 1478, 1478,
- 1478, 1478, 1478, 1478, 1478, 1478, 1478, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 2562, 2562, 2562, 2562, 2562, 2562, 2562, 2562,
- 2562, 2562, 2562, 2562, 2562, 2562, 2562, 2562,
- 2562, 2562, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
-
- 2563, 2563, 2563, 2563, 2563, 2563, 2563, 2563,
- 2563, 2563, 2563, 2563, 2563, 2563, 2563, 2563,
- 2563, 2563, 2563, 2563, 2563, 2563, 2563, 2563,
- 2563, 2563, 2564, 2564, 2564, 2564, 2564, 2564,
- 2564, 2564, 2564, 2564, 2564, 2564, 2564, 2564,
- 2564, 2564, 2564, 2564, 2564, 2564, 2564, 2564,
- 2564, 2564, 2564, 2564, 2563, 2563, 2563, 2563,
- 2563, 2563, 2563, 2563, 2563, 2563, 2563, 2563,
- 2563, 2563, 2563, 2563, 2563, 2563, 2563, 2563,
- 2563, 2563, 2563, 2563, 2563, 2563, 2564, 2564,
- 2564, 2564, 2564, 2564, 2564, 201, 2564, 2564,
- 2564, 2564, 2564, 2564, 2564, 2564, 2564, 2564,
- 2564, 2564, 2564, 2564, 2564, 2564, 2564, 2564,
- 2563, 2563, 2563, 2563, 2563, 2563, 2563, 2563,
- 2563, 2563, 2563, 2563, 2563, 2563, 2563, 2563,
- 2563, 2563, 2563, 2563, 2563, 2563, 2563, 2563,
- 2563, 2563, 2564, 2564, 2564, 2564, 2564, 2564,
- 2564, 2564, 2564, 2564, 2564, 2564, 2564, 2564,
- 2564, 2564, 2564, 2564, 2564, 2564, 2564, 2564,
- 2564, 2564, 2564, 2564, 2563, 201, 2563, 2563,
- 201, 201, 2563, 201, 201, 2563, 2563, 201,
- 201, 2563, 2563, 2563, 2563, 201, 2563, 2563,
- 2563, 2563, 2563, 2563, 2563, 2563, 2564, 2564,
- 2564, 2564, 201, 2564, 201, 2564, 2564, 2564,
- 2564, 2565, 2564, 2564, 201, 2564, 2564, 2564,
- 2564, 2564, 2564, 2564, 2564, 2564, 2564, 2564,
- 2563, 2563, 2563, 2563, 2563, 2563, 2563, 2563,
- 2563, 2563, 2563, 2563, 2563, 2563, 2563, 2563,
- 2563, 2563, 2563, 2563, 2563, 2563, 2563, 2563,
- 2563, 2563, 2564, 2564, 2564, 2564, 2564, 2564,
- 2564, 2564, 2564, 2564, 2564, 2564, 2564, 2564,
- 2564, 2564, 2564, 2564, 2564, 2564, 2564, 2564,
-
- 2564, 2564, 2564, 2564, 2563, 2563, 201, 2563,
- 2563, 2563, 2563, 201, 201, 2563, 2563, 2563,
- 2563, 2563, 2563, 2563, 2563, 201, 2563, 2563,
- 2563, 2563, 2563, 2563, 2563, 201, 2564, 2564,
- 2564, 2564, 2564, 2564, 2564, 2564, 2564, 2564,
- 2564, 2564, 2564, 2564, 2564, 2564, 2564, 2564,
- 2564, 2564, 2564, 2564, 2564, 2564, 2564, 2564,
- 2563, 2563, 201, 2563, 2563, 2563, 2563, 201,
- 2563, 2563, 2563, 2563, 2563, 201, 2563, 201,
- 201, 201, 2563, 2563, 2563, 2563, 2563, 2563,
- 2563, 201, 2564, 2564, 2564, 2564, 2564, 2564,
- 2564, 2564, 2564, 2564, 2564, 2564, 2564, 2564,
- 2564, 2564, 2564, 2564, 2564, 2564, 2564, 2564,
- 2564, 2564, 2564, 2564, 2563, 2563, 2563, 2563,
- 2563, 2563, 2563, 2563, 2563, 2563, 2563, 2563,
- 2563, 2563, 2563, 2563, 2563, 2563, 2563, 2563,
- 2563, 2563, 2563, 2563, 2563, 2563, 2564, 2564,
- 2564, 2564, 2564, 2564, 2564, 2564, 2564, 2564,
- 2564, 2564, 2564, 2564, 2564, 2564, 2564, 2564,
- 2564, 2564, 2564, 2564, 2564, 2564, 2564, 2564,
- 2563, 2563, 2563, 2563, 2563, 2563, 2563, 2563,
- 2563, 2563, 2563, 2563, 2563, 2563, 2563, 2563,
- 2563, 2563, 2563, 2563, 2563, 2563, 2563, 2563,
- 2563, 2563, 2564, 2564, 2564, 2564, 2564, 2564,
- 2564, 2564, 2564, 2564, 2564, 2564, 2564, 2564,
- 2564, 2564, 2564, 2564, 2564, 2564, 2564, 2564,
- 2564, 2564, 2564, 2564, 2563, 2563, 2563, 2563,
- 2563, 2563, 2563, 2563, 2563, 2563, 2563, 2563,
- 2563, 2563, 2563, 2563, 2563, 2563, 2563, 2563,
- 2563, 2563, 2563, 2563, 2563, 2563, 2564, 2564,
- 2564, 2564, 2564, 2564, 2564, 2564, 2564, 2564,
- 2564, 2564, 2564, 2564, 2564, 2564, 2564, 2564,
-
- 2564, 2564, 2564, 2564, 2564, 2564, 2564, 2564,
- 2563, 2563, 2563, 2563, 2563, 2563, 2563, 2563,
- 2563, 2563, 2563, 2563, 2563, 2563, 2563, 2563,
- 2563, 2563, 2563, 2563, 2563, 2563, 2563, 2563,
- 2563, 2563, 2564, 2564, 2564, 2564, 2564, 2564,
- 2564, 2564, 2564, 2564, 2564, 2564, 2564, 2564,
- 2564, 2564, 2564, 2564, 2564, 2564, 2564, 2564,
- 2564, 2564, 2564, 2564, 2563, 2563, 2563, 2563,
- 2563, 2563, 2563, 2563, 2563, 2563, 2563, 2563,
- 2563, 2563, 2563, 2563, 2563, 2563, 2563, 2563,
- 2563, 2563, 2563, 2563, 2563, 2563, 2564, 2564,
- 2564, 2564, 2564, 2564, 2564, 2564, 2564, 2564,
- 2564, 2564, 2564, 2564, 2564, 2564, 2564, 2564,
- 2564, 2564, 2564, 2564, 2564, 2564, 2564, 2564,
- 2563, 2563, 2563, 2563, 2563, 2563, 2563, 2563,
- 2563, 2563, 2563, 2563, 2563, 2563, 2563, 2563,
- 2563, 2563, 2563, 2563, 2563, 2563, 2563, 2563,
- 2563, 2563, 2564, 2564, 2564, 2564, 2564, 2564,
- 2564, 2564, 2564, 2564, 2564, 2564, 2564, 2564,
- 2564, 2564, 2564, 2564, 2564, 2564, 2564, 2564,
- 2564, 2564, 2564, 2564, 1436, 1436, 201, 201,
- 2563, 2563, 2563, 2563, 2563, 2563, 2563, 2563,
- 2563, 2563, 2563, 2563, 2563, 2563, 2563, 2563,
- 2563, 2563, 2563, 2563, 2563, 2563, 2563, 2563,
- 2563, 2566, 2564, 2564, 2564, 2564, 2564, 2564,
- 2564, 2564, 2564, 2564, 2564, 2564, 2564, 2564,
- 2564, 2564, 2564, 2564, 2564, 2564, 2564, 2564,
- 2564, 2564, 2564, 2567, 2564, 2564, 2564, 2564,
- 2564, 2564, 2563, 2563, 2563, 2563, 2563, 2563,
- 2563, 2563, 2563, 2563, 2563, 2563, 2563, 2563,
- 2563, 2563, 2563, 2563, 2563, 2563, 2563, 2563,
- 2563, 2563, 2563, 2566, 2564, 2564, 2564, 2564,
-
- 2564, 2564, 2564, 2564, 2564, 2564, 2564, 2564,
- 2564, 2564, 2564, 2564, 2564, 2564, 2564, 2564,
- 2564, 2564, 2564, 2564, 2564, 2567, 2564, 2564,
- 2564, 2564, 2564, 2564, 2563, 2563, 2563, 2563,
- 2563, 2563, 2563, 2563, 2563, 2563, 2563, 2563,
- 2563, 2563, 2563, 2563, 2563, 2563, 2563, 2563,
- 2563, 2563, 2563, 2563, 2563, 2566, 2564, 2564,
- 2564, 2564, 2564, 2564, 2564, 2564, 2564, 2564,
- 2564, 2564, 2564, 2564, 2564, 2564, 2564, 2564,
- 2564, 2564, 2564, 2564, 2564, 2564, 2564, 2567,
- 2564, 2564, 2564, 2564, 2564, 2564, 2563, 2563,
- 2563, 2563, 2563, 2563, 2563, 2563, 2563, 2563,
- 2563, 2563, 2563, 2563, 2563, 2563, 2563, 2563,
- 2563, 2563, 2563, 2563, 2563, 2563, 2563, 2566,
- 2564, 2564, 2564, 2564, 2564, 2564, 2564, 2564,
- 2564, 2564, 2564, 2564, 2564, 2564, 2564, 2564,
- 2564, 2564, 2564, 2564, 2564, 2564, 2564, 2564,
- 2564, 2567, 2564, 2564, 2564, 2564, 2564, 2564,
- 2563, 2563, 2563, 2563, 2563, 2563, 2563, 2563,
- 2563, 2563, 2563, 2563, 2563, 2563, 2563, 2563,
- 2563, 2563, 2563, 2563, 2563, 2563, 2563, 2563,
- 2563, 2566, 2564, 2564, 2564, 2564, 2564, 2564,
- 2564, 2564, 2564, 2564, 2564, 2564, 2564, 2564,
- 2564, 2564, 2564, 2564, 2564, 2564, 2564, 2564,
- 2564, 2564, 2564, 2567, 2564, 2564, 2564, 2564,
- 2564, 2564, 2568, 2569, 201, 201, 2570, 2571,
- 2572, 2573, 2574, 2575, 2576, 2577, 2578, 2579,
- 2570, 2571, 2572, 2573, 2574, 2575, 2576, 2577,
- 2578, 2579, 2570, 2571, 2572, 2573, 2574, 2575,
- 2576, 2577, 2578, 2579, 2570, 2571, 2572, 2573,
- 2574, 2575, 2576, 2577, 2578, 2579, 2570, 2571,
- 2572, 2573, 2574, 2575, 2576, 2577, 2578, 2579,
-
- 2580, 2580, 2580, 2580, 2580, 2580, 2580, 2580,
- 2580, 2580, 2580, 2580, 2580, 2580, 2580, 2580,
- 2580, 2580, 2580, 2580, 2580, 2580, 2580, 2580,
- 2580, 2580, 2580, 2580, 2580, 2580, 2580, 2580,
- 2580, 2580, 2580, 2580, 2580, 2580, 2580, 2580,
- 2580, 2580, 2580, 2580, 2580, 2580, 2580, 2580,
- 2580, 2580, 2580, 2580, 2580, 2580, 2580, 2580,
- 2580, 2580, 2580, 2580, 2580, 2580, 2580, 2580,
- 2580, 2580, 2580, 2580, 2580, 2580, 2580, 2580,
- 2580, 2580, 2580, 2580, 2580, 2580, 2580, 2580,
- 2580, 2580, 2580, 2580, 2580, 2580, 2580, 2580,
- 2580, 2580, 2580, 2580, 2580, 2580, 2580, 2580,
- 2580, 2580, 2580, 2580, 2580, 2580, 2580, 2580,
- 2580, 2580, 2580, 2580, 2580, 2580, 2580, 2580,
- 2580, 2580, 2580, 2580, 2580, 2580, 2580, 2580,
- 2580, 2580, 2580, 2580, 2580, 2580, 2580, 2580,
- 2580, 2580, 2580, 2580, 2580, 2580, 2580, 2580,
- 2580, 2580, 2580, 2580, 2580, 2580, 2580, 2580,
- 2580, 2580, 2580, 2580, 2580, 2580, 2580, 2580,
- 2580, 2580, 2580, 2580, 2580, 2580, 2580, 2580,
- 2580, 2580, 2580, 2580, 2580, 2580, 2580, 2580,
- 2580, 2580, 2580, 2580, 2580, 2580, 2580, 2580,
- 2580, 2580, 2580, 2580, 2580, 2580, 2580, 2580,
- 2580, 2580, 2580, 2580, 2580, 2580, 2580, 2580,
- 2580, 2580, 2580, 2580, 2580, 2580, 2580, 2580,
- 2580, 2580, 2580, 2580, 2580, 2580, 2580, 2580,
- 2580, 2580, 2580, 2580, 2580, 2580, 2580, 2580,
- 2580, 2580, 2580, 2580, 2580, 2580, 2580, 2580,
- 2580, 2580, 2580, 2580, 2580, 2580, 2580, 2580,
- 2580, 2580, 2580, 2580, 2580, 2580, 2580, 2580,
- 2580, 2580, 2580, 2580, 2580, 2580, 2580, 2580,
- 2580, 2580, 2580, 2580, 2580, 2580, 2580, 2580,
-
- 2581, 2581, 2581, 2581, 2581, 2581, 2581, 2581,
- 2581, 2581, 2581, 2581, 2581, 2581, 2581, 2581,
- 2581, 2581, 2581, 2581, 2581, 2581, 2581, 2581,
- 2581, 2581, 2581, 2581, 2581, 2581, 2581, 2581,
- 2581, 2581, 2581, 2581, 2581, 2581, 2581, 2581,
- 2581, 2581, 2581, 2581, 2581, 2581, 2581, 2581,
- 2581, 2581, 2581, 2581, 2581, 2581, 2581, 2580,
- 2580, 2580, 2580, 2581, 2581, 2581, 2581, 2581,
- 2581, 2581, 2581, 2581, 2581, 2581, 2581, 2581,
- 2581, 2581, 2581, 2581, 2581, 2581, 2581, 2581,
- 2581, 2581, 2581, 2581, 2581, 2581, 2581, 2581,
- 2581, 2581, 2581, 2581, 2581, 2581, 2581, 2581,
- 2581, 2581, 2581, 2581, 2581, 2581, 2581, 2581,
- 2581, 2581, 2581, 2581, 2581, 2580, 2580, 2580,
- 2580, 2580, 2580, 2580, 2580, 2581, 2580, 2580,
- 2580, 2580, 2580, 2580, 2580, 2580, 2580, 2580,
- 2580, 2580, 2580, 2580, 2581, 2580, 2580, 2582,
- 2583, 2582, 2582, 2584, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 2581, 2581, 2581, 2581, 2581,
- 201, 2581, 2581, 2581, 2581, 2581, 2581, 2581,
- 2581, 2581, 2581, 2581, 2581, 2581, 2581, 2581,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
-
- 2585, 2585, 2585, 2585, 2585, 2585, 2585, 201,
- 2585, 2585, 2585, 2585, 2585, 2585, 2585, 2585,
- 2585, 2585, 2585, 2585, 2585, 2585, 2585, 2585,
- 2585, 201, 201, 2585, 2585, 2585, 2585, 2585,
- 2585, 2585, 201, 2585, 2585, 201, 2585, 2585,
- 2585, 2585, 2585, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
-
- 2586, 2586, 2586, 2586, 2586, 2586, 2586, 2586,
- 2586, 2586, 2586, 2586, 2586, 2586, 2586, 2586,
- 2586, 2586, 2586, 2586, 2586, 2586, 2586, 2586,
- 2586, 2586, 2586, 2586, 2586, 2586, 2586, 2586,
- 2586, 2586, 2586, 2586, 2586, 2586, 2586, 2586,
- 2586, 2586, 2586, 2586, 2586, 2586, 2586, 2586,
- 2586, 2586, 2586, 2586, 2586, 2586, 2586, 2586,
- 2586, 2586, 2586, 2586, 2586, 2586, 2586, 2586,
- 2586, 2586, 2586, 2586, 2586, 2586, 2586, 2586,
- 2586, 2586, 2586, 2586, 2586, 2586, 2586, 2586,
- 2586, 2586, 2586, 2586, 2586, 2586, 2586, 2586,
- 2586, 2586, 2586, 2586, 2586, 2586, 2586, 2586,
- 2586, 2586, 2586, 2586, 2586, 2586, 2586, 2586,
- 2586, 2586, 2586, 2586, 2586, 2586, 2586, 2586,
- 2586, 2586, 2586, 2586, 2586, 2586, 2586, 2586,
- 2586, 2586, 2586, 2586, 2586, 2586, 2586, 2586,
- 2586, 2586, 2586, 2586, 2586, 2586, 2586, 2586,
- 2586, 2586, 2586, 2586, 2586, 2586, 2586, 2586,
- 2586, 2586, 2586, 2586, 2586, 2586, 2586, 2586,
- 2586, 2586, 2586, 2586, 2586, 2586, 2586, 2586,
- 2586, 2586, 2586, 2586, 2586, 2586, 2586, 2586,
- 2586, 2586, 2586, 2586, 2586, 2586, 2586, 2586,
- 2586, 2586, 2586, 2586, 2586, 2586, 2586, 2586,
- 2586, 2586, 2586, 2586, 2586, 2586, 2586, 2586,
- 2586, 2586, 2586, 2586, 2586, 298, 298, 2587,
- 2587, 2587, 2587, 2587, 2587, 2587, 2587, 2587,
- 2588, 2588, 2588, 2588, 2588, 2588, 2588, 298,
- 298, 298, 298, 298, 298, 298, 298, 298,
- 298, 298, 298, 298, 298, 298, 298, 298,
- 298, 298, 298, 298, 298, 298, 298, 298,
- 298, 298, 298, 298, 298, 298, 298, 298,
- 298, 298, 298, 298, 298, 298, 298, 298,
-
- 2589, 2589, 2589, 2589, 2589, 2589, 2589, 2589,
- 2589, 2589, 2589, 2589, 2589, 2589, 2589, 2589,
- 2589, 2589, 2589, 2589, 2589, 2589, 2589, 2589,
- 2589, 2589, 2589, 2589, 2589, 2589, 2589, 2589,
- 2589, 2589, 2590, 2590, 2590, 2590, 2590, 2590,
- 2590, 2590, 2590, 2590, 2590, 2590, 2590, 2590,
- 2590, 2590, 2590, 2590, 2590, 2590, 2590, 2590,
- 2590, 2590, 2590, 2590, 2590, 2590, 2590, 2590,
- 2590, 2590, 2590, 2590, 2591, 2591, 2591, 2591,
- 2591, 2591, 2592, 298, 298, 298, 298, 298,
- 2593, 2594, 2595, 2596, 2597, 2598, 2599, 2600,
- 2601, 2602, 298, 298, 298, 298, 2603, 2603,
- 298, 298, 298, 298, 298, 298, 298, 298,
- 298, 298, 298, 298, 298, 298, 298, 298,
- 298, 298, 298, 298, 298, 298, 298, 298,
- 298, 298, 298, 298, 298, 298, 298, 298,
- 298, 298, 298, 298, 298, 298, 298, 298,
- 298, 298, 298, 298, 298, 298, 298, 298,
- 298, 298, 298, 298, 298, 298, 298, 298,
- 298, 298, 298, 298, 298, 298, 298, 298,
- 298, 298, 298, 298, 298, 298, 298, 298,
- 298, 298, 298, 298, 298, 298, 298, 298,
- 298, 298, 298, 298, 298, 298, 298, 298,
- 298, 298, 298, 298, 298, 298, 298, 298,
- 298, 298, 298, 298, 298, 298, 298, 298,
- 298, 298, 298, 298, 298, 298, 298, 298,
- 298, 298, 298, 298, 298, 298, 298, 298,
- 298, 298, 298, 298, 298, 298, 298, 298,
- 298, 298, 298, 298, 298, 298, 298, 298,
- 298, 298, 298, 298, 298, 298, 298, 298,
- 298, 298, 298, 298, 298, 298, 298, 298,
- 298, 298, 298, 298, 298, 298, 298, 298,
-
- 298, 298, 298, 298, 298, 298, 298, 298,
- 298, 298, 298, 298, 298, 298, 298, 298,
- 298, 298, 298, 298, 298, 298, 298, 298,
- 298, 298, 298, 298, 298, 298, 298, 298,
- 298, 298, 298, 298, 298, 298, 298, 298,
- 298, 298, 298, 298, 298, 298, 298, 298,
- 298, 298, 298, 298, 298, 298, 298, 298,
- 298, 298, 298, 298, 298, 298, 298, 298,
- 298, 298, 298, 298, 298, 298, 298, 298,
- 298, 298, 298, 298, 298, 298, 298, 298,
- 298, 298, 298, 298, 298, 298, 298, 298,
- 298, 298, 298, 298, 298, 298, 298, 298,
- 298, 298, 298, 298, 298, 298, 298, 298,
- 298, 298, 298, 298, 298, 298, 298, 298,
- 298, 298, 298, 298, 298, 298, 298, 298,
- 298, 298, 298, 298, 298, 298, 298, 298,
- 298, 298, 298, 298, 298, 298, 298, 298,
- 298, 298, 298, 298, 298, 298, 298, 298,
- 298, 298, 298, 298, 298, 298, 298, 298,
- 298, 298, 298, 298, 298, 298, 298, 298,
- 298, 298, 298, 298, 298, 298, 298, 298,
- 298, 298, 298, 298, 298, 298, 298, 298,
- 298, 298, 298, 298, 298, 298, 298, 298,
- 298, 298, 298, 298, 298, 298, 298, 298,
- 298, 298, 298, 298, 298, 298, 298, 298,
- 298, 298, 298, 298, 298, 298, 298, 298,
- 298, 298, 298, 298, 298, 298, 298, 298,
- 298, 298, 298, 298, 298, 298, 298, 298,
- 298, 298, 298, 298, 298, 298, 298, 298,
- 298, 298, 298, 298, 298, 298, 298, 298,
- 298, 298, 298, 298, 298, 298, 298, 298,
- 298, 298, 298, 298, 298, 298, 298, 298,
-
- 2604, 2604, 2604, 2604, 344, 2604, 2604, 2604,
- 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604,
- 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604,
- 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604,
- 344, 2604, 2604, 344, 2604, 344, 344, 2604,
- 344, 2604, 2604, 2604, 2604, 2604, 2604, 2604,
- 2604, 2604, 2604, 344, 2604, 2604, 2604, 2604,
- 344, 2604, 344, 2604, 344, 344, 344, 344,
- 344, 344, 2604, 344, 344, 344, 344, 2604,
- 344, 2604, 344, 2604, 344, 2604, 2604, 2604,
- 344, 2604, 2604, 344, 2604, 344, 344, 2604,
- 344, 2604, 344, 2604, 344, 2604, 344, 2604,
- 344, 2604, 2604, 344, 2604, 344, 344, 2604,
- 2604, 2604, 2604, 344, 2604, 2604, 2604, 2604,
- 2604, 2604, 2604, 344, 2604, 2604, 2604, 2604,
- 344, 2604, 2604, 2604, 2604, 344, 2604, 344,
- 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604,
- 2604, 2604, 344, 2604, 2604, 2604, 2604, 2604,
- 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604,
- 2604, 2604, 2604, 2604, 344, 344, 344, 344,
- 344, 2604, 2604, 2604, 344, 2604, 2604, 2604,
- 2604, 2604, 344, 2604, 2604, 2604, 2604, 2604,
- 2604, 2604, 2604, 2604, 2604, 2604, 2604, 2604,
- 2604, 2604, 2604, 2604, 344, 344, 344, 344,
- 344, 344, 344, 344, 344, 344, 344, 344,
- 344, 344, 344, 344, 344, 344, 344, 344,
- 344, 344, 344, 344, 344, 344, 344, 344,
- 344, 344, 344, 344, 344, 344, 344, 344,
- 344, 344, 344, 344, 344, 344, 344, 344,
- 344, 344, 344, 344, 344, 344, 344, 344,
- 2605, 2605, 344, 344, 344, 344, 344, 344,
- 344, 344, 344, 344, 344, 344, 344, 344,
-
- 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519,
- 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519,
- 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519,
- 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519,
- 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519,
- 1519, 1519, 1519, 1519, 1682, 1682, 1682, 1682,
- 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519,
- 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519,
- 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519,
- 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519,
- 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519,
- 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519,
- 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519,
- 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519,
- 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519,
- 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519,
- 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519,
- 1519, 1519, 1519, 1519, 1519, 1519, 1519, 1519,
- 1519, 1519, 1519, 1519, 1682, 1682, 1682, 1682,
- 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682,
- 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482,
- 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1682,
- 1682, 1482, 1482, 1482, 1482, 1482, 1482, 1482,
- 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1521,
- 1682, 1482, 1482, 1482, 1482, 1482, 1482, 1482,
- 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482,
- 1682, 1482, 1482, 1482, 1482, 1482, 1482, 1482,
- 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482,
- 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521,
- 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521,
- 1521, 1521, 1521, 1521, 1521, 1521, 1682, 1682,
- 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682,
-
- 2606, 2606, 2607, 2608, 2609, 2610, 2611, 2612,
- 2613, 2614, 2615, 2616, 2616, 1682, 1682, 1682,
- 2617, 2617, 2617, 2617, 2617, 2617, 2617, 2617,
- 2617, 2617, 2617, 2617, 2617, 2617, 2617, 2617,
- 2617, 2617, 2617, 2617, 2617, 2617, 2617, 2617,
- 2617, 2617, 2617, 2617, 2617, 2617, 2617, 1682,
- 2618, 2619, 2618, 2618, 2618, 2618, 2618, 2618,
- 2618, 2618, 2618, 2618, 2618, 2619, 2618, 2619,
- 2618, 2618, 2619, 2618, 2618, 2618, 2619, 2618,
- 2618, 2618, 2617, 2617, 2617, 2617, 2617, 2620,
- 2621, 2621, 2621, 2621, 2621, 2621, 2621, 2622,
- 2621, 2621, 2621, 2621, 2621, 2621, 2621, 2622,
- 2621, 2621, 2621, 2621, 2621, 2621, 2621, 2621,
- 2621, 2621, 2623, 2623, 1682, 1682, 1682, 1682,
- 2621, 2621, 2621, 2621, 2621, 2621, 2621, 2621,
- 2621, 2622, 2621, 2622, 2622, 2621, 2621, 2622,
- 2621, 2621, 2621, 2621, 2621, 2621, 2621, 2621,
- 2621, 2621, 796, 796, 796, 796, 2624, 2624,
- 2617, 2624, 2624, 2624, 2624, 2624, 2624, 2624,
- 2624, 2624, 2624, 2625, 2625, 2625, 2625, 2625,
- 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625,
- 2625, 2625, 2625, 2625, 2625, 1682, 1682, 1682,
- 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682,
- 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682,
- 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682,
- 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682,
- 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682,
- 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682,
- 1682, 1682, 1682, 1682, 1682, 1682, 2626, 2626,
- 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626,
- 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626,
- 2626, 2626, 2626, 2626, 2626, 2626, 2626, 2626,
-
- 2627, 2628, 2628, 1682, 1682, 1682, 1682, 1682,
- 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682,
- 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675,
- 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675,
- 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675,
- 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675,
- 1675, 1675, 2628, 2628, 2628, 2628, 2628, 2628,
- 2628, 2628, 2628, 2629, 1682, 1682, 1682, 1682,
- 1675, 1675, 1675, 1675, 1675, 1675, 1675, 1675,
- 1675, 1682, 1682, 1682, 1682, 1682, 1682, 1682,
- 2628, 2628, 1682, 1682, 1682, 1682, 1682, 1682,
- 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682,
- 2630, 2630, 2630, 2630, 2630, 2630, 1682, 1682,
- 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682,
- 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682,
- 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682,
- 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682,
- 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682,
- 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682,
- 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682,
- 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682,
- 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682,
- 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682,
- 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682,
- 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682,
- 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682,
- 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682,
- 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682,
- 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682,
- 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682,
- 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682,
- 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682,
-
- 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482,
- 2631, 1482, 1482, 1482, 1482, 1482, 1482, 1482,
- 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482,
- 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482,
- 1482, 1521, 1521, 1521, 1521, 1521, 1521, 1521,
- 1521, 1521, 1521, 1521, 1521, 2632, 2632, 2632,
- 1482, 1482, 1482, 1482, 1482, 1482, 1521, 1482,
- 1482, 1482, 1482, 1482, 1482, 1482, 2631, 1482,
- 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482,
- 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482,
- 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482,
- 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482,
- 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482,
- 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482,
- 1482, 1482, 1482, 2631, 1482, 1482, 1482, 1482,
- 1482, 1482, 1482, 1482, 1482, 1521, 2632, 2632,
- 1482, 1482, 1482, 1482, 1482, 1523, 1482, 1482,
- 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482,
- 1482, 1482, 1482, 2631, 1521, 1521, 1521, 1521,
- 1521, 1521, 1521, 1521, 1483, 1483, 1521, 1521,
- 1482, 1482, 1482, 1482, 2631, 1482, 1482, 1482,
- 2631, 1482, 1482, 1482, 1482, 1482, 1482, 1482,
- 1482, 1482, 1482, 1482, 1482, 1481, 1481, 1482,
- 1482, 1482, 1482, 1482, 1481, 1482, 1482, 1482,
- 1482, 1482, 1523, 1523, 1523, 1521, 1482, 1523,
- 1482, 1482, 1523, 2633, 2633, 1521, 1521, 2632,
- 2632, 2632, 2632, 2632, 1521, 1521, 1521, 1521,
- 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521,
- 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482,
- 1482, 1482, 1482, 2631, 1482, 2631, 1482, 1482,
- 1482, 1521, 1521, 1521, 1521, 1521, 1521, 1521,
- 2632, 2632, 2632, 2634, 2634, 2634, 2634, 2634,
-
- 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482,
- 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482,
- 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482,
- 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482,
- 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482,
- 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482,
- 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482,
- 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1521,
- 1482, 1521, 1523, 1523, 1482, 1482, 1523, 1523,
- 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523,
- 1523, 1482, 1482, 1482, 1482, 1482, 1482, 1482,
- 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482,
- 1482, 1482, 1482, 1482, 1482, 1482, 2635, 2635,
- 2635, 2635, 1482, 1482, 1482, 1482, 1523, 1482,
- 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523,
- 1523, 1482, 1482, 1482, 1523, 1482, 1482, 1482,
- 1482, 1523, 1523, 1523, 1482, 1523, 1523, 1523,
- 1482, 1482, 1482, 2631, 1482, 1482, 1482, 1482,
- 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482,
- 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482,
- 1481, 1482, 1481, 1482, 1481, 1482, 1482, 1482,
- 1482, 1482, 1523, 1482, 1482, 1482, 1482, 1481,
- 1482, 1481, 1481, 1482, 1482, 1482, 1482, 1482,
- 1482, 1482, 1482, 2631, 2631, 1482, 1482, 1482,
- 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482,
- 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482,
- 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482,
- 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482,
- 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482,
- 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482,
- 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482,
- 1521, 1482, 1482, 1482, 1482, 1521, 1521, 2632,
-
- 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1482,
- 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482,
- 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1481,
- 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481,
- 1481, 1481, 1481, 1481, 1481, 1482, 1482, 2631,
- 1482, 1482, 1482, 1482, 2631, 1482, 1482, 1482,
- 1482, 1482, 1481, 1481, 1481, 1481, 1481, 1481,
- 1481, 1481, 1481, 1481, 1481, 1481, 1483, 1483,
- 2636, 2636, 2636, 2636, 1483, 1483, 1483, 1483,
- 1483, 1483, 1521, 2632, 2632, 2632, 2632, 2632,
- 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482,
- 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482,
- 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482,
- 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521,
- 1521, 1521, 1521, 1521, 2633, 2633, 1521, 1521,
- 1521, 1521, 2637, 1521, 1521, 1521, 1521, 1521,
- 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521,
- 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521,
- 2633, 1521, 1521, 1521, 1521, 2633, 2633, 1521,
- 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521,
- 1521, 1521, 1521, 1521, 2638, 1521, 1521, 1521,
- 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521,
- 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521,
- 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521,
- 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521,
- 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521,
- 1521, 1521, 1521, 1521, 1483, 1483, 1483, 1483,
- 1483, 1483, 1483, 1483, 1521, 1521, 1521, 1521,
- 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521,
- 2639, 1521, 1521, 1521, 1521, 1521, 1521, 1521,
- 1521, 1521, 1521, 1521, 1483, 1483, 1483, 1483,
- 1483, 1483, 1521, 1482, 1482, 1482, 1482, 1482,
-
- 2640, 1482, 1482, 1482, 1482, 1482, 1482, 1482,
- 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482,
- 1482, 2640, 1482, 1482, 1482, 2640, 1482, 2640,
- 1482, 2640, 1482, 2640, 1482, 1482, 1482, 2640,
- 1482, 1482, 1482, 1482, 1482, 1482, 2640, 2640,
- 1482, 1482, 1482, 1482, 2640, 1482, 2640, 2640,
- 1482, 1482, 1482, 1482, 2640, 1482, 1482, 1482,
- 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482,
- 1482, 1521, 1521, 2632, 2632, 1523, 1523, 1523,
- 1482, 1482, 1482, 1523, 1523, 1523, 1523, 1523,
- 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483,
- 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483,
- 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483,
- 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483,
- 1483, 1483, 1483, 1483, 1483, 1483, 2641, 2641,
- 2641, 2642, 2642, 2642, 1483, 1483, 1483, 1483,
- 2631, 1482, 1482, 1482, 1482, 1482, 1482, 1482,
- 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482,
- 1482, 1482, 2631, 1482, 1482, 1482, 1482, 1482,
- 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482,
- 1482, 1482, 1482, 1523, 1482, 1482, 1482, 1482,
- 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482,
- 1482, 1482, 1482, 1482, 1523, 1523, 1523, 1482,
- 1482, 1482, 1482, 1482, 1482, 1482, 1482, 1482,
- 1523, 1482, 1482, 1482, 1482, 1482, 1521, 1521,
- 1521, 1521, 1521, 1521, 2633, 1521, 1521, 1521,
- 2632, 2638, 2638, 2630, 2630, 1682, 1682, 1682,
- 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682,
- 1521, 1521, 1521, 1521, 1521, 1521, 1521, 1521,
- 1521, 1521, 1521, 1521, 1521, 1682, 1682, 1682,
- 1521, 1521, 1521, 1521, 2638, 2638, 2638, 2630,
- 2630, 1682, 1682, 1682, 1682, 1682, 1682, 1682,
-
- 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481,
- 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481,
- 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481,
- 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481,
- 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481,
- 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481,
- 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481,
- 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481,
- 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481,
- 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481,
- 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481,
- 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481,
- 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481,
- 1481, 1481, 1481, 1481, 1481, 1481, 1481, 1481,
- 1481, 1481, 1481, 1481, 1682, 1682, 1682, 1682,
- 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682,
- 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483,
- 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483,
- 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483,
- 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483,
- 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483,
- 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483,
- 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483,
- 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483,
- 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483,
- 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483,
- 1483, 1483, 1483, 1483, 1483, 1682, 1682, 1682,
- 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682,
- 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682,
- 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682,
- 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682,
- 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682,
-
- 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483,
- 1483, 1483, 1483, 1483, 1682, 1682, 1682, 1682,
- 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483,
- 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483,
- 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483,
- 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483,
- 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483,
- 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483,
- 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483,
- 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682,
- 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483,
- 1483, 1483, 1682, 1682, 1682, 1682, 1682, 1682,
- 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483,
- 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483,
- 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483,
- 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483,
- 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483,
- 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682,
- 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483,
- 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483,
- 1483, 1483, 1483, 1483, 1483, 1483, 1483, 1483,
- 1483, 1483, 1483, 1483, 1483, 1483, 1682, 1682,
- 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682,
- 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682,
- 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682,
- 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682,
- 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682,
- 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682,
- 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682,
- 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682,
- 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682,
- 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682,
-
- 1485, 1485, 1485, 1485, 1485, 1485, 1485, 1485,
- 1485, 1485, 1485, 1485, 1682, 1682, 1682, 1682,
- 2632, 2632, 2632, 2632, 2632, 2632, 2632, 2632,
- 2643, 2637, 2637, 2637, 2637, 2638, 2637, 2644,
- 2638, 2638, 2638, 2638, 2638, 2638, 2637, 2638,
- 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630,
- 2637, 2644, 2644, 2637, 2637, 2637, 2637, 2637,
- 2637, 2637, 2638, 2638, 2638, 2637, 2637, 1682,
- 2638, 2638, 2638, 2638, 2638, 2638, 2638, 2638,
- 2638, 2638, 2638, 2638, 2630, 1682, 1682, 1682,
- 2638, 2638, 2638, 2638, 2638, 2638, 2638, 2638,
- 2638, 2638, 2638, 2638, 2638, 2638, 2638, 2630,
- 2630, 2630, 2630, 2630, 2630, 2630, 2630, 2630,
- 2630, 2630, 2630, 2630, 1682, 1682, 1682, 1682,
- 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682,
- 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682,
- 2632, 2632, 2632, 2632, 2632, 2638, 2638, 2638,
- 2638, 2638, 2638, 2638, 2638, 2638, 2638, 2638,
- 2638, 2638, 2630, 2630, 2630, 2630, 2630, 2630,
- 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682,
- 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682,
- 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682,
- 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682,
- 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682,
- 2632, 1682, 1682, 1682, 1682, 1682, 1682, 1682,
- 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682,
- 2630, 2644, 2644, 2644, 2644, 2644, 2644, 2644,
- 2644, 2644, 2644, 2644, 2644, 2644, 2630, 2630,
- 2630, 2630, 2630, 2630, 2630, 2630, 2630, 1682,
- 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682,
- 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682,
- 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682,
-
- 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682,
- 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682,
- 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682,
- 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682,
- 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682,
- 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682,
- 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682,
- 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682,
- 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682,
- 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682,
- 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682,
- 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682,
- 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682,
- 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682,
- 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682,
- 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682,
- 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682,
- 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682,
- 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682,
- 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682,
- 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682,
- 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682,
- 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682,
- 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682,
- 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682,
- 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682,
- 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682,
- 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682,
- 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682,
- 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682,
- 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682,
- 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682,
-
- 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682,
- 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682,
- 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682,
- 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682,
- 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682,
- 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682,
- 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682,
- 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682,
- 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682,
- 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682,
- 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682,
- 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682,
- 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682,
- 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682,
- 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682,
- 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682,
- 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682,
- 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682,
- 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682,
- 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682,
- 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682,
- 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682,
- 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682,
- 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682,
- 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682,
- 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682,
- 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682,
- 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682,
- 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682,
- 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682,
- 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682,
- 1682, 1682, 1682, 1682, 1682, 1682, 2645, 2645,
-
- 2646, 2646, 2646, 2646, 2646, 2646, 2646, 2646,
- 2646, 2646, 2646, 2646, 2646, 2646, 2646, 2646,
- 2646, 2646, 2646, 2646, 2646, 2646, 2646, 2646,
- 2646, 2646, 2646, 2646, 2646, 2646, 2646, 2646,
- 2646, 2646, 2646, 2646, 2646, 2646, 2646, 2646,
- 2646, 2646, 2646, 2646, 2646, 2646, 2646, 2646,
- 2646, 2646, 2646, 2646, 2646, 2646, 2646, 2646,
- 2646, 2646, 2646, 2646, 2646, 2646, 2646, 2646,
- 2646, 2646, 2646, 2646, 2646, 2646, 2646, 2646,
- 2646, 2646, 2646, 2646, 2646, 2646, 2646, 2646,
- 2646, 2646, 2646, 2646, 2646, 2646, 2646, 2646,
- 2646, 2646, 2646, 2646, 2646, 2646, 2646, 2646,
- 2646, 2646, 2646, 2646, 2646, 2646, 2646, 2646,
- 2646, 2646, 2646, 2646, 2646, 2646, 2646, 2646,
- 2646, 2646, 2646, 2646, 2646, 2646, 2646, 2646,
- 2646, 2646, 2646, 2646, 2646, 2646, 2646, 2646,
- 2646, 2646, 2646, 2646, 2646, 2646, 2646, 2646,
- 2646, 2646, 2646, 2646, 2646, 2646, 2646, 2646,
- 2646, 2646, 2646, 2646, 2646, 2646, 2646, 2646,
- 2646, 2646, 2646, 2646, 2646, 2646, 2646, 2646,
- 2646, 2646, 2646, 2646, 2646, 2646, 2646, 2646,
- 2646, 2646, 2646, 2646, 2646, 2646, 2646, 2646,
- 2646, 2646, 2646, 2646, 2646, 2646, 2646, 2646,
- 2646, 2646, 2646, 2646, 2646, 2646, 2646, 2646,
- 2646, 2646, 2646, 2646, 2646, 2646, 2646, 2646,
- 2646, 2646, 2646, 2646, 2646, 2646, 2646, 2646,
- 2646, 2646, 2646, 2646, 2646, 2646, 2646, 2646,
- 2646, 2646, 2646, 2646, 2646, 2646, 2646, 2646,
- 2646, 2646, 2646, 2646, 2646, 2646, 2646, 2646,
- 2646, 2646, 2646, 2646, 2646, 2646, 2646, 2646,
- 2646, 2646, 2646, 2646, 2646, 2646, 2646, 2646,
- 2646, 2646, 2646, 2646, 2646, 2646, 2646, 2646,
-
- 2646, 2646, 2646, 2646, 2646, 2646, 2646, 2646,
- 2646, 2646, 2646, 2646, 2646, 2646, 2646, 2646,
- 2646, 2646, 2646, 2646, 2646, 2646, 2646, 2646,
- 2646, 2646, 2646, 2646, 2646, 2646, 2646, 2646,
- 2646, 2646, 2646, 2646, 2646, 2646, 2646, 2646,
- 2646, 2646, 2646, 2646, 2646, 2646, 2646, 2646,
- 2646, 2646, 2646, 2646, 2646, 2646, 2646, 2646,
- 2646, 2646, 2646, 2646, 2646, 2646, 2646, 2646,
- 2646, 2646, 2646, 2646, 2646, 2646, 2646, 2646,
- 2646, 2646, 2646, 2646, 2646, 2646, 2646, 2646,
- 2646, 2646, 2646, 2646, 2646, 2646, 2646, 2646,
- 2646, 2646, 2646, 2646, 2646, 2646, 2646, 2646,
- 2646, 2646, 2646, 2646, 2646, 2646, 2646, 2646,
- 2646, 2646, 2646, 2646, 2646, 2646, 2646, 2646,
- 2646, 2646, 2646, 2646, 2646, 2646, 2646, 2646,
- 2646, 2646, 2646, 2646, 2646, 2646, 2646, 2646,
- 2646, 2646, 2646, 2646, 2646, 2646, 2646, 2646,
- 2646, 2646, 2646, 2646, 2646, 2646, 2646, 2646,
- 2646, 2646, 2646, 2646, 2646, 2646, 2646, 2646,
- 2646, 2646, 2646, 2646, 2646, 2646, 2646, 2646,
- 2646, 2646, 2646, 2646, 2646, 2646, 2646, 2646,
- 2646, 2646, 2646, 2646, 2646, 2646, 2646, 2646,
- 2646, 2646, 2646, 2646, 2646, 2646, 2646, 2646,
- 2646, 2646, 2646, 2646, 2646, 2646, 2646, 2646,
- 2646, 2646, 2646, 2646, 2646, 2646, 2646, 2646,
- 2646, 2646, 2646, 2646, 2646, 2646, 2646, 2646,
- 2646, 2646, 2646, 2646, 2646, 2646, 2646, 1682,
- 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682,
- 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682,
- 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682,
- 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682,
- 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682,
-
- 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686,
- 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686,
- 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686,
- 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686,
- 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686,
- 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686,
- 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686,
- 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686,
- 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686,
- 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686,
- 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686,
- 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686,
- 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686,
- 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686,
- 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686,
- 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686,
- 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686,
- 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686,
- 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686,
- 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686,
- 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686,
- 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686,
- 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686,
- 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686,
- 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686,
- 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686,
- 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686,
- 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686,
- 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686,
- 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686,
- 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686,
- 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686,
-
- 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686,
- 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686,
- 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686,
- 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686,
- 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686,
- 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686,
- 1686, 1686, 1686, 1686, 1686, 1682, 1682, 1682,
- 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682,
- 2647, 2647, 2647, 2647, 2647, 2647, 2647, 2647,
- 2647, 2647, 2647, 2647, 2647, 2647, 2647, 2647,
- 2647, 2647, 2647, 2647, 2647, 2647, 2647, 2647,
- 2647, 2647, 2647, 2647, 2647, 2647, 2647, 2647,
- 2647, 2647, 2647, 2647, 2647, 2647, 2647, 2647,
- 2647, 2647, 2647, 2647, 2647, 2647, 2647, 2647,
- 2647, 2647, 2647, 2647, 2647, 2647, 2647, 2647,
- 2647, 2647, 2647, 2647, 2647, 2647, 2647, 2647,
- 2647, 2647, 2647, 2647, 2647, 2647, 2647, 2647,
- 2647, 2647, 2647, 2647, 2647, 2647, 2647, 2647,
- 2647, 2647, 2647, 2647, 2647, 2647, 2647, 2647,
- 2647, 2647, 2647, 2647, 2647, 2647, 2647, 2647,
- 2647, 2647, 2647, 2647, 2647, 2647, 2647, 2647,
- 2647, 2647, 2647, 2647, 2647, 2647, 2647, 2647,
- 2647, 2647, 2647, 2647, 2647, 2647, 2647, 2647,
- 2647, 2647, 2647, 2647, 2647, 2647, 2647, 2647,
- 2647, 2647, 2647, 2647, 2647, 2647, 2647, 2647,
- 2647, 2647, 2647, 2647, 2647, 2647, 2647, 2647,
- 2647, 2647, 2647, 2647, 2647, 2647, 2647, 2647,
- 2647, 2647, 2647, 2647, 2647, 2647, 2647, 2647,
- 2647, 2647, 2647, 2647, 2647, 2647, 2647, 2647,
- 2647, 2647, 2647, 2647, 2647, 2647, 2647, 2647,
- 2647, 2647, 2647, 2647, 2647, 2647, 2647, 2647,
- 2647, 2647, 2647, 2647, 2647, 2647, 2647, 2647,
-
- 2647, 2647, 2647, 2647, 2647, 2647, 2647, 2647,
- 2647, 2647, 2647, 2647, 2647, 2647, 2647, 2647,
- 2647, 2647, 2647, 2647, 2647, 2647, 2647, 2647,
- 2647, 2647, 2647, 2647, 2647, 2647, 1682, 1682,
- 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688,
- 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688,
- 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688,
- 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688,
- 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688,
- 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688,
- 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688,
- 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688,
- 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688,
- 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688,
- 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688,
- 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688,
- 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688,
- 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688,
- 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688,
- 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688,
- 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688,
- 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688,
- 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688,
- 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688,
- 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688,
- 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688,
- 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688,
- 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688,
- 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688,
- 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688,
- 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688,
- 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688,
-
- 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688,
- 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688,
- 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688,
- 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688,
- 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688,
- 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688,
- 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688,
- 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688,
- 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688,
- 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688,
- 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688,
- 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688,
- 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688,
- 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688,
- 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688,
- 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688,
- 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688,
- 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688,
- 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688,
- 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688,
- 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688,
- 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688,
- 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688,
- 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688,
- 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688,
- 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688,
- 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688,
- 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688,
- 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688,
- 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688,
- 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688,
- 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688,
-
- 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688,
- 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688,
- 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688,
- 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688,
- 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688,
- 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688,
- 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688,
- 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688,
- 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688,
- 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688,
- 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688,
- 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688,
- 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688,
- 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688,
- 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688,
- 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688,
- 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688,
- 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688,
- 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688,
- 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688,
- 1688, 1688, 1682, 1682, 1682, 1682, 1682, 1682,
- 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682,
- 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689,
- 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689,
- 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689,
- 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689,
- 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689,
- 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689,
- 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689,
- 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689,
- 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689,
- 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689,
-
- 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689,
- 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689,
- 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689,
- 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689,
- 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689,
- 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689,
- 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689,
- 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689,
- 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689,
- 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689,
- 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689,
- 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689,
- 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689,
- 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689,
- 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689,
- 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689,
- 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689,
- 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689,
- 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689,
- 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689,
- 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689,
- 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689,
- 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689,
- 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689,
- 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689,
- 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689,
- 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689,
- 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689,
- 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689,
- 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689,
- 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689,
- 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689,
-
- 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689,
- 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689,
- 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689,
- 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689,
- 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689,
- 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689,
- 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689,
- 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689,
- 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689,
- 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689,
- 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689,
- 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689,
- 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689,
- 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689,
- 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689,
- 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689,
- 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689,
- 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689,
- 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689,
- 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689,
- 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689,
- 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689,
- 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689,
- 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689,
- 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689,
- 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689,
- 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689,
- 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689,
- 1689, 1682, 1682, 1682, 1682, 1682, 1682, 1682,
- 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682,
- 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682,
- 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682,
-
- 2648, 2648, 2648, 2648, 2648, 2648, 2648, 2648,
- 2648, 2648, 2648, 2648, 2648, 2648, 2648, 2648,
- 2648, 2648, 2648, 2648, 2648, 2648, 2648, 2648,
- 2648, 2648, 2648, 2648, 2648, 2648, 2648, 2648,
- 2648, 2648, 2648, 2648, 2648, 2648, 2648, 2648,
- 2648, 2648, 2648, 2648, 2648, 2648, 2648, 2648,
- 2648, 2648, 2648, 2648, 2648, 2648, 2648, 2648,
- 2648, 2648, 2648, 2648, 2648, 2648, 2648, 2648,
- 2648, 2648, 2648, 2648, 2648, 2648, 2648, 2648,
- 2648, 2648, 2648, 2648, 2648, 2648, 2648, 2648,
- 2648, 2648, 2648, 2648, 2648, 2648, 2648, 2648,
- 2648, 2648, 2648, 2648, 2648, 2648, 2648, 2648,
- 2648, 2648, 2648, 2648, 2648, 2648, 2648, 2648,
- 2648, 2648, 2648, 2648, 2648, 2648, 2648, 2648,
- 2648, 2648, 2648, 2648, 2648, 2648, 2648, 2648,
- 2648, 2648, 2648, 2648, 2648, 2648, 2648, 2648,
- 2648, 2648, 2648, 2648, 2648, 2648, 2648, 2648,
- 2648, 2648, 2648, 2648, 2648, 2648, 2648, 2648,
- 2648, 2648, 2648, 2648, 2648, 2648, 2648, 2648,
- 2648, 2648, 2648, 2648, 2648, 2648, 2648, 2648,
- 2648, 2648, 2648, 2648, 2648, 2648, 2648, 2648,
- 2648, 2648, 2648, 2648, 2648, 2648, 2648, 2648,
- 2648, 2648, 2648, 2648, 2648, 2648, 2648, 2648,
- 2648, 2648, 2648, 2648, 2648, 2648, 2648, 2648,
- 2648, 2648, 2648, 2648, 2648, 2648, 2648, 2648,
- 2648, 2648, 2648, 2648, 2648, 2648, 2648, 2648,
- 2648, 2648, 2648, 2648, 2648, 2648, 2648, 2648,
- 2648, 2648, 2648, 2648, 2648, 2648, 2648, 2648,
- 2648, 2648, 2648, 2648, 2648, 2648, 2648, 2648,
- 2648, 2648, 2648, 2648, 2648, 2648, 2648, 2648,
- 2648, 2648, 2648, 2648, 2648, 2648, 2648, 2648,
- 2648, 2648, 2648, 2648, 2648, 2648, 2648, 2648,
-
- 2648, 2648, 2648, 2648, 2648, 2648, 2648, 2648,
- 2648, 2648, 2648, 2648, 2648, 2648, 2648, 2648,
- 2648, 2648, 2648, 2648, 2648, 2648, 2648, 2648,
- 2648, 2648, 2648, 2648, 2648, 2648, 1682, 1682,
- 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682,
- 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682,
- 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682,
- 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682,
- 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682,
- 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682,
- 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682,
- 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682,
- 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682,
- 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682,
- 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682,
- 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682,
- 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682,
- 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682,
- 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682,
- 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682,
- 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682,
- 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682,
- 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682,
- 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682,
- 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682,
- 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682,
- 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682,
- 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682,
- 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682,
- 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682,
- 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682,
- 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682,
-
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 201, 201,
- 201, 201, 201, 201, 201, 201, 2645, 2645,
-
- 1382, 2557, 1382, 1382, 1382, 1382, 1382, 1382,
- 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382,
- 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382,
- 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382,
- 2649, 2649, 2649, 2649, 2649, 2649, 2649, 2649,
- 2649, 2649, 2649, 2649, 2649, 2649, 2649, 2649,
- 2649, 2649, 2649, 2649, 2649, 2649, 2649, 2649,
- 2649, 2649, 2649, 2649, 2649, 2649, 2649, 2649,
- 2649, 2649, 2649, 2649, 2649, 2649, 2649, 2649,
- 2649, 2649, 2649, 2649, 2649, 2649, 2649, 2649,
- 2649, 2649, 2649, 2649, 2649, 2649, 2649, 2649,
- 2649, 2649, 2649, 2649, 2649, 2649, 2649, 2649,
- 2649, 2649, 2649, 2649, 2649, 2649, 2649, 2649,
- 2649, 2649, 2649, 2649, 2649, 2649, 2649, 2649,
- 2649, 2649, 2649, 2649, 2649, 2649, 2649, 2649,
- 2649, 2649, 2649, 2649, 2649, 2649, 2649, 2649,
- 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382,
- 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382,
- 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382,
- 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382,
- 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382,
- 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382,
- 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382,
- 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382,
- 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382,
- 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382,
- 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382,
- 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382,
- 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382,
- 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382,
- 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382,
- 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382,
-
- 2650, 2650, 2650, 2650, 2650, 2650, 2650, 2650,
- 2650, 2650, 2650, 2650, 2650, 2650, 2650, 2650,
- 2650, 2650, 2650, 2650, 2650, 2650, 2650, 2650,
- 2650, 2650, 2650, 2650, 2650, 2650, 2650, 2650,
- 2650, 2650, 2650, 2650, 2650, 2650, 2650, 2650,
- 2650, 2650, 2650, 2650, 2650, 2650, 2650, 2650,
- 2650, 2650, 2650, 2650, 2650, 2650, 2650, 2650,
- 2650, 2650, 2650, 2650, 2650, 2650, 2650, 2650,
- 2650, 2650, 2650, 2650, 2650, 2650, 2650, 2650,
- 2650, 2650, 2650, 2650, 2650, 2650, 2650, 2650,
- 2650, 2650, 2650, 2650, 2650, 2650, 2650, 2650,
- 2650, 2650, 2650, 2650, 2650, 2650, 2650, 2650,
- 2650, 2650, 2650, 2650, 2650, 2650, 2650, 2650,
- 2650, 2650, 2650, 2650, 2650, 2650, 2650, 2650,
- 2650, 2650, 2650, 2650, 2650, 2650, 2650, 2650,
- 2650, 2650, 2650, 2650, 2650, 2650, 2650, 2650,
- 2650, 2650, 2650, 2650, 2650, 2650, 2650, 2650,
- 2650, 2650, 2650, 2650, 2650, 2650, 2650, 2650,
- 2650, 2650, 2650, 2650, 2650, 2650, 2650, 2650,
- 2650, 2650, 2650, 2650, 2650, 2650, 2650, 2650,
- 2650, 2650, 2650, 2650, 2650, 2650, 2650, 2650,
- 2650, 2650, 2650, 2650, 2650, 2650, 2650, 2650,
- 2650, 2650, 2650, 2650, 2650, 2650, 2650, 2650,
- 2650, 2650, 2650, 2650, 2650, 2650, 2650, 2650,
- 2650, 2650, 2650, 2650, 2650, 2650, 2650, 2650,
- 2650, 2650, 2650, 2650, 2650, 2650, 2650, 2650,
- 2650, 2650, 2650, 2650, 2650, 2650, 2650, 2650,
- 2650, 2650, 2650, 2650, 2650, 2650, 2650, 2650,
- 2650, 2650, 2650, 2650, 2650, 2650, 2650, 2650,
- 2650, 2650, 2650, 2650, 2650, 2650, 2650, 2650,
- 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382,
- 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382,
-
- 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382,
- 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382,
- 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382,
- 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382,
- 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382,
- 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382,
- 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382,
- 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382,
- 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382,
- 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382,
- 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382,
- 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382,
- 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382,
- 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382,
- 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382,
- 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382,
- 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382,
- 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382,
- 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382,
- 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382,
- 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382,
- 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382,
- 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382,
- 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382,
- 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382,
- 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382,
- 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382,
- 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382,
- 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382,
- 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382,
- 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382,
- 1382, 1382, 1382, 1382, 1382, 1382, 1382, 1382,
-
- 2651, 2651, 2651, 2651, 2651, 2651, 2651, 2651,
- 2651, 2651, 2651, 2651, 2651, 2651, 2651, 2651,
- 2651, 2651, 2651, 2651, 2651, 2651, 2651, 2651,
- 2651, 2651, 2651, 2651, 2651, 2651, 2651, 2651,
- 2651, 2651, 2651, 2651, 2651, 2651, 2651, 2651,
- 2651, 2651, 2651, 2651, 2651, 2651, 2651, 2651,
- 2651, 2651, 2651, 2651, 2651, 2651, 2651, 2651,
- 2651, 2651, 2651, 2651, 2651, 2651, 2651, 2651,
- 2651, 2651, 2651, 2651, 2651, 2651, 2651, 2651,
- 2651, 2651, 2651, 2651, 2651, 2651, 2651, 2651,
- 2651, 2651, 2651, 2651, 2651, 2651, 2651, 2651,
- 2651, 2651, 2651, 2651, 2651, 2651, 2651, 2651,
- 2651, 2651, 2651, 2651, 2651, 2651, 2651, 2651,
- 2651, 2651, 2651, 2651, 2651, 2651, 2651, 2651,
- 2651, 2651, 2651, 2651, 2651, 2651, 2651, 2651,
- 2651, 2651, 2651, 2651, 2651, 2651, 2651, 2651,
- 2651, 2651, 2651, 2651, 2651, 2651, 2651, 2651,
- 2651, 2651, 2651, 2651, 2651, 2651, 2651, 2651,
- 2651, 2651, 2651, 2651, 2651, 2651, 2651, 2651,
- 2651, 2651, 2651, 2651, 2651, 2651, 2651, 2651,
- 2651, 2651, 2651, 2651, 2651, 2651, 2651, 2651,
- 2651, 2651, 2651, 2651, 2651, 2651, 2651, 2651,
- 2651, 2651, 2651, 2651, 2651, 2651, 2651, 2651,
- 2651, 2651, 2651, 2651, 2651, 2651, 2651, 2651,
- 2651, 2651, 2651, 2651, 2651, 2651, 2651, 2651,
- 2651, 2651, 2651, 2651, 2651, 2651, 2651, 2651,
- 2651, 2651, 2651, 2651, 2651, 2651, 2651, 2651,
- 2651, 2651, 2651, 2651, 2651, 2651, 2651, 2651,
- 2651, 2651, 2651, 2651, 2651, 2651, 2651, 2651,
- 2651, 2651, 2651, 2651, 2651, 2651, 2651, 2651,
- 2651, 2651, 2651, 2651, 2651, 2651, 2651, 2651,
- 2651, 2651, 2651, 2651, 2651, 2651, 2651, 2651,
-
- 2651, 2651, 2651, 2651, 2651, 2651, 2651, 2651,
- 2651, 2651, 2651, 2651, 2651, 2651, 2651, 2651,
- 2651, 2651, 2651, 2651, 2651, 2651, 2651, 2651,
- 2651, 2651, 2651, 2651, 2651, 2651, 2651, 2651,
- 2651, 2651, 2651, 2651, 2651, 2651, 2651, 2651,
- 2651, 2651, 2651, 2651, 2651, 2651, 2651, 2651,
- 2651, 2651, 2651, 2651, 2651, 2651, 2651, 2651,
- 2651, 2651, 2651, 2651, 2651, 2651, 2651, 2651,
- 2651, 2651, 2651, 2651, 2651, 2651, 2651, 2651,
- 2651, 2651, 2651, 2651, 2651, 2651, 2651, 2651,
- 2651, 2651, 2651, 2651, 2651, 2651, 2651, 2651,
- 2651, 2651, 2651, 2651, 2651, 2651, 2651, 2651,
- 2651, 2651, 2651, 2651, 2651, 2651, 2651, 2651,
- 2651, 2651, 2651, 2651, 2651, 2651, 2651, 2651,
- 2651, 2651, 2651, 2651, 2651, 2651, 2651, 2651,
- 2651, 2651, 2651, 2651, 2651, 2651, 2651, 2651,
- 2651, 2651, 2651, 2651, 2651, 2651, 2651, 2651,
- 2651, 2651, 2651, 2651, 2651, 2651, 2651, 2651,
- 2651, 2651, 2651, 2651, 2651, 2651, 2651, 2651,
- 2651, 2651, 2651, 2651, 2651, 2651, 2651, 2651,
- 2651, 2651, 2651, 2651, 2651, 2651, 2651, 2651,
- 2651, 2651, 2651, 2651, 2651, 2651, 2651, 2651,
- 2651, 2651, 2651, 2651, 2651, 2651, 2651, 2651,
- 2651, 2651, 2651, 2651, 2651, 2651, 2651, 2651,
- 2651, 2651, 2651, 2651, 2651, 2651, 2651, 2651,
- 2651, 2651, 2651, 2651, 2651, 2651, 2651, 2651,
- 2651, 2651, 2651, 2651, 2651, 2651, 2651, 2651,
- 2651, 2651, 2651, 2651, 2651, 2651, 2651, 2651,
- 2651, 2651, 2651, 2651, 2651, 2651, 2651, 2651,
- 2651, 2651, 2651, 2651, 2651, 2651, 2651, 2651,
- 2651, 2651, 2651, 2651, 2651, 2651, 2651, 2651,
- 2651, 2651, 2651, 2651, 2651, 2651, 2645, 2645
-};
-
-#define GET_PROP_INDEX(ucs4) \
- (ucs4 < 0x11000 \
- ? (uc_property_trie[uc_property_trie[ucs4>>5] + (ucs4 & 0x1f)]) \
- : (uc_property_trie[uc_property_trie[((ucs4 - 0x11000)>>8) + 0x880] + (ucs4 & 0xff)]))
-
-#define GET_PROP_INDEX_UCS2(ucs2) \
- (uc_property_trie[uc_property_trie[ucs2>>5] + (ucs2 & 0x1f)])
-
-static const Properties uc_properties[] = {
- { 9, 18, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 3, 0, 0, 21, 2 },
- { 9, 8, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 3, 0, 5, 17, 2 },
- { 9, 7, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 2, 2, 2, 37, 2 },
- { 9, 8, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 3, 3, 5, 38, 2 },
- { 9, 9, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 3, 3, 5, 38, 2 },
- { 9, 7, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 1, 1, 36, 2 },
- { 9, 7, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 3, 0, 0, 21, 2 },
- { 9, 8, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 3, 0, 0, 21, 2 },
- { 6, 9, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 5, 35, 2 },
- { 25, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 12, 6, 2 },
- { 25, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 12, 13, 3, 2 },
- { 25, 4, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 12, 2 },
- { 27, 4, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 9, 2 },
- { 25, 4, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 10, 2 },
- { 25, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 12, 2 },
- { 25, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 11, 13, 3, 2 },
- { 21, 10, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 13, 0, 2 },
- { 22, 10, 0, 0, -1, -1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 13, 2, 2 },
- { 26, 3, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 9, 2 },
- { 25, 6, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 15, 11, 8, 2 },
- { 20, 3, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 11, 16, 2 },
- { 25, 6, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 15, 10, 8, 2 },
- { 25, 6, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 7, 2 },
- { 3, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 16, 9, 11, 2 },
- { 3, 2, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 16, 9, 11, 2 },
- { 3, 2, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 16, 9, 11, 2 },
- { 3, 2, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 16, 9, 11, 2 },
- { 3, 2, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 16, 9, 11, 2 },
- { 3, 2, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 16, 9, 11, 2 },
- { 3, 2, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 16, 9, 11, 2 },
- { 3, 2, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 16, 9, 11, 2 },
- { 3, 2, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 16, 9, 11, 2 },
- { 3, 2, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 16, 9, 11, 2 },
- { 25, 6, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 11, 8, 2 },
- { 25, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 15, 0, 8, 2 },
- { 26, 10, 0, 0, -1, 2, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 12, 2 },
- { 26, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 12, 2 },
- { 26, 10, 0, 0, -1, -2, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 12, 2 },
- { 14, 0, 0, 0, -1, 0, 0, 32, 0, 0, 0, 0, 0, 32, 1, 0, 0, 10, 7, 12, 3 },
- { 21, 10, 0, 0, -1, 2, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 13, 0, 2 },
- { 25, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 9, 2 },
- { 22, 10, 0, 0, -1, -2, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 13, 2, 2 },
- { 28, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 12, 2 },
- { 19, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 17, 0, 12, 2 },
- { 15, 0, 0, 0, -1, 0, 0, 0, 0, -32, 0, -32, 0, 0, 1, 0, 0, 10, 6, 12, 3 },
- { 26, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 17, 2 },
- { 22, 10, 0, 0, -1, -2, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 13, 1, 2 },
- { 9, 7, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 3, 3, 3, 38, 2 },
- { 6, 6, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 80, 0, 0, 5, 4, 2 },
- { 25, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 2 },
- { 27, 4, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 10, 2 },
- { 29, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 12, 2 },
- { 28, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 80, 0, 0, 0, 12, 2 },
- { 18, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 80, 0, 10, 6, 12, 3 },
- { 23, 10, 0, 0, -1, 16, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 13, 3, 2 },
- { 10, 18, 0, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 3, 6, 4, 17, 2 },
- { 29, 4, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 10, 2 },
- { 26, 4, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 9, 2 },
- { 5, 2, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 80, 0, 0, 0, 12, 2 },
- { 5, 2, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 80, 0, 0, 0, 12, 2 },
- { 28, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 80, 0, 0, 0, 18, 2 },
- { 15, 0, 0, 0, -1, 0, 0, 0, 0, 743, 0, 743, 0, 775, 1, 80, 0, 10, 6, 12, 2 },
- { 25, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 14, 0, 12, 2 },
- { 5, 2, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 80, 0, 0, 0, 12, 2 },
- { 24, 10, 0, 0, -1, -16, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 13, 3, 2 },
- { 5, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 80, 0, 0, 0, 12, 2 },
- { 14, 0, 0, 0, -1, 0, 0, 32, 0, 0, 0, 0, 0, 32, 1, 17, 0, 10, 7, 12, 3 },
- { 15, 0, 0, 0, -1, 0, 0, 0, 1, 410, 1, 407, 0, 0, 1, 0, 0, 10, 6, 12, 3 },
- { 15, 0, 0, 0, -1, 0, 0, 0, 0, -32, 0, -32, 0, 0, 1, 17, 0, 10, 6, 12, 3 },
- { 15, 0, 0, 0, -1, 0, 0, 0, 0, 121, 0, 121, 0, 0, 1, 17, 0, 10, 6, 12, 3 },
- { 14, 0, 0, 0, -1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 1, 17, 0, 10, 7, 12, 3 },
- { 15, 0, 0, 0, -1, 0, 0, 0, 0, -1, 0, -1, 0, 0, 1, 17, 0, 10, 6, 12, 3 },
- { 14, 0, 0, 0, -1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 10, 7, 12, 3 },
- { 15, 0, 0, 0, -1, 0, 0, 0, 0, -1, 0, -1, 0, 0, 1, 0, 0, 10, 6, 12, 3 },
- { 14, 0, 0, 0, -1, 0, 1, 413, 0, 0, 0, 0, 0, 0, 1, 17, 0, 10, 7, 12, 3 },
- { 15, 0, 0, 0, -1, 0, 0, 0, 0, -232, 0, -232, 0, 0, 1, 0, 0, 10, 6, 12, 3 },
- { 14, 0, 0, 0, -1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 1, 80, 0, 10, 7, 12, 3 },
- { 15, 0, 0, 0, -1, 0, 0, 0, 0, -1, 0, -1, 0, 0, 1, 80, 0, 10, 6, 12, 3 },
- { 15, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 10, 6, 12, 3 },
- { 15, 0, 0, 0, -1, 0, 0, 0, 1, 492, 1, 492, 0, 0, 1, 80, 0, 10, 6, 12, 3 },
- { 14, 0, 0, 0, -1, 0, 0, -121, 0, 0, 0, 0, 0, -121, 1, 17, 0, 10, 7, 12, 3 },
- { 15, 0, 0, 0, -1, 0, 0, 0, 0, -300, 0, -300, 0, -268, 1, 80, 0, 10, 6, 12, 3 },
- { 15, 0, 0, 0, -1, 0, 0, 0, 0, 195, 0, 195, 0, 0, 1, 0, 0, 10, 6, 12, 3 },
- { 14, 0, 0, 0, -1, 0, 0, 210, 0, 0, 0, 0, 0, 210, 1, 0, 0, 10, 7, 12, 3 },
- { 14, 0, 0, 0, -1, 0, 0, 206, 0, 0, 0, 0, 0, 206, 1, 0, 0, 10, 7, 12, 3 },
- { 14, 0, 0, 0, -1, 0, 0, 205, 0, 0, 0, 0, 0, 205, 1, 0, 0, 10, 7, 12, 3 },
- { 14, 0, 0, 0, -1, 0, 0, 79, 0, 0, 0, 0, 0, 79, 1, 0, 0, 10, 7, 12, 3 },
- { 14, 0, 0, 0, -1, 0, 0, 202, 0, 0, 0, 0, 0, 202, 1, 0, 0, 10, 7, 12, 3 },
- { 14, 0, 0, 0, -1, 0, 0, 203, 0, 0, 0, 0, 0, 203, 1, 0, 0, 10, 7, 12, 3 },
- { 14, 0, 0, 0, -1, 0, 0, 207, 0, 0, 0, 0, 0, 207, 1, 0, 0, 10, 7, 12, 3 },
- { 15, 0, 0, 0, -1, 0, 0, 0, 0, 97, 0, 97, 0, 0, 1, 0, 0, 10, 6, 12, 3 },
- { 14, 0, 0, 0, -1, 0, 0, 211, 0, 0, 0, 0, 0, 211, 1, 0, 0, 10, 7, 12, 3 },
- { 14, 0, 0, 0, -1, 0, 0, 209, 0, 0, 0, 0, 0, 209, 1, 0, 0, 10, 7, 12, 3 },
- { 15, 0, 0, 0, -1, 0, 0, 0, 0, 163, 0, 163, 0, 0, 1, 0, 0, 10, 6, 12, 3 },
- { 14, 0, 0, 0, -1, 0, 0, 213, 0, 0, 0, 0, 0, 213, 1, 0, 0, 10, 7, 12, 3 },
- { 15, 0, 0, 0, -1, 0, 0, 0, 0, 130, 0, 130, 0, 0, 1, 0, 0, 10, 6, 12, 3 },
- { 14, 0, 0, 0, -1, 0, 0, 214, 0, 0, 0, 0, 0, 214, 1, 0, 0, 10, 7, 12, 3 },
- { 14, 0, 0, 0, -1, 0, 0, 218, 0, 0, 0, 0, 0, 218, 1, 0, 0, 10, 7, 12, 3 },
- { 14, 0, 0, 0, -1, 0, 0, 217, 0, 0, 0, 0, 0, 217, 1, 0, 0, 10, 7, 12, 3 },
- { 14, 0, 0, 0, -1, 0, 0, 219, 0, 0, 0, 0, 0, 219, 1, 0, 0, 10, 7, 12, 3 },
- { 18, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 10, 8, 12, 3 },
- { 15, 0, 0, 0, -1, 0, 0, 0, 0, 56, 0, 56, 0, 0, 1, 0, 0, 10, 6, 12, 3 },
- { 14, 0, 0, 0, -1, 0, 0, 2, 0, 0, 0, 1, 0, 2, 1, 80, 0, 10, 7, 12, 3 },
- { 16, 0, 0, 0, -1, 0, 0, 1, 0, -1, 0, 0, 0, 1, 1, 80, 0, 10, 7, 12, 3 },
- { 15, 0, 0, 0, -1, 0, 0, 0, 0, -2, 0, -1, 0, 0, 1, 80, 0, 10, 6, 12, 3 },
- { 15, 0, 0, 0, -1, 0, 0, 0, 0, -79, 0, -79, 0, 0, 1, 0, 0, 10, 6, 12, 3 },
- { 15, 0, 0, 0, -1, 0, 0, 0, 1, 503, 1, 503, 0, 0, 1, 17, 0, 10, 6, 12, 3 },
- { 14, 0, 0, 0, -1, 0, 0, -97, 0, 0, 0, 0, 0, -97, 4, 0, 0, 10, 7, 12, 3 },
- { 14, 0, 0, 0, -1, 0, 0, -56, 0, 0, 0, 0, 0, -56, 4, 0, 0, 10, 7, 12, 3 },
- { 14, 0, 0, 0, -1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 4, 17, 0, 10, 7, 12, 3 },
- { 15, 0, 0, 0, -1, 0, 0, 0, 0, -1, 0, -1, 0, 0, 4, 17, 0, 10, 6, 12, 3 },
- { 14, 0, 0, 0, -1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 4, 0, 0, 10, 7, 12, 3 },
- { 15, 0, 0, 0, -1, 0, 0, 0, 0, -1, 0, -1, 0, 0, 4, 0, 0, 10, 6, 12, 3 },
- { 14, 0, 0, 0, -1, 0, 0, -130, 0, 0, 0, 0, 0, -130, 6, 0, 0, 10, 7, 12, 3 },
- { 15, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 10, 6, 12, 3 },
- { 15, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 10, 6, 12, 3 },
- { 14, 0, 0, 0, -1, 0, 1, 1, 0, 0, 0, 0, 1, 1, 8, 0, 0, 10, 7, 12, 3 },
- { 14, 0, 0, 0, -1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 8, 0, 0, 10, 7, 12, 3 },
- { 15, 0, 0, 0, -1, 0, 0, 0, 0, -1, 0, -1, 0, 0, 8, 0, 0, 10, 6, 12, 3 },
- { 14, 0, 0, 0, -1, 0, 0, -163, 0, 0, 0, 0, 0, -163, 8, 0, 0, 10, 7, 12, 3 },
- { 14, 0, 0, 0, -1, 0, 1, 3, 0, 0, 0, 0, 1, 3, 8, 0, 0, 10, 7, 12, 3 },
- { 15, 0, 0, 0, -1, 0, 0, 0, 1, 5, 1, 5, 0, 0, 8, 0, 0, 10, 6, 12, 3 },
- { 15, 0, 0, 0, -1, 0, 0, 0, 1, 7, 1, 7, 0, 0, 8, 0, 0, 10, 6, 12, 3 },
- { 15, 0, 0, 0, -1, 0, 0, 0, 0, -1, 0, -1, 0, 0, 9, 0, 0, 10, 6, 12, 3 },
- { 14, 0, 0, 0, -1, 0, 0, -195, 0, 0, 0, 0, 0, -195, 9, 0, 0, 10, 7, 12, 3 },
- { 14, 0, 0, 0, -1, 0, 0, 69, 0, 0, 0, 0, 0, 69, 9, 0, 0, 10, 7, 12, 3 },
- { 14, 0, 0, 0, -1, 0, 0, 71, 0, 0, 0, 0, 0, 71, 9, 0, 0, 10, 7, 12, 3 },
- { 14, 0, 0, 0, -1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 9, 0, 0, 10, 7, 12, 3 },
- { 15, 0, 0, 0, -1, 0, 0, 0, 1, 9, 1, 9, 0, 0, 1, 0, 0, 10, 6, 12, 3 },
- { 15, 0, 0, 0, -1, 0, 0, 0, 1, 11, 1, 11, 0, 0, 1, 0, 0, 10, 6, 12, 3 },
- { 15, 0, 0, 0, -1, 0, 0, 0, 1, 13, 1, 13, 0, 0, 1, 0, 0, 10, 6, 12, 3 },
- { 15, 0, 0, 0, -1, 0, 0, 0, 0, -210, 0, -210, 0, 0, 1, 0, 0, 10, 6, 12, 3 },
- { 15, 0, 0, 0, -1, 0, 0, 0, 0, -206, 0, -206, 0, 0, 1, 0, 0, 10, 6, 12, 3 },
- { 15, 0, 0, 0, -1, 0, 0, 0, 0, -205, 0, -205, 0, 0, 1, 0, 0, 10, 6, 12, 3 },
- { 15, 0, 0, 0, -1, 0, 0, 0, 0, -202, 0, -202, 0, 0, 1, 0, 0, 10, 6, 12, 3 },
- { 15, 0, 0, 0, -1, 0, 0, 0, 0, -203, 0, -203, 0, 0, 1, 0, 0, 10, 6, 12, 3 },
- { 15, 0, 0, 0, -1, 0, 0, 0, 1, 15, 1, 15, 0, 0, 1, 0, 0, 10, 6, 12, 3 },
- { 15, 0, 0, 0, -1, 0, 0, 0, 1, 17, 1, 17, 0, 0, 1, 0, 0, 10, 6, 12, 3 },
- { 15, 0, 0, 0, -1, 0, 0, 0, 0, -207, 0, -207, 0, 0, 1, 0, 0, 10, 6, 12, 3 },
- { 15, 0, 0, 0, -1, 0, 0, 0, 1, 19, 1, 19, 0, 0, 1, 0, 0, 10, 6, 12, 3 },
- { 15, 0, 0, 0, -1, 0, 0, 0, 1, 21, 1, 21, 0, 0, 1, 0, 0, 10, 6, 12, 3 },
- { 15, 0, 0, 0, -1, 0, 0, 0, 0, -209, 0, -209, 0, 0, 1, 0, 0, 10, 6, 12, 3 },
- { 15, 0, 0, 0, -1, 0, 0, 0, 0, -211, 0, -211, 0, 0, 1, 0, 0, 10, 6, 12, 3 },
- { 15, 0, 0, 0, -1, 0, 0, 0, 1, 23, 1, 23, 0, 0, 1, 0, 0, 10, 6, 12, 3 },
- { 15, 0, 0, 0, -1, 0, 0, 0, 1, 25, 1, 25, 0, 0, 1, 0, 0, 10, 6, 12, 3 },
- { 15, 0, 0, 0, -1, 0, 0, 0, 1, 27, 1, 27, 0, 0, 1, 0, 0, 10, 6, 12, 3 },
- { 15, 0, 0, 0, -1, 0, 0, 0, 1, 29, 1, 29, 0, 0, 1, 0, 0, 10, 6, 12, 3 },
- { 15, 0, 0, 0, -1, 0, 0, 0, 0, -213, 0, -213, 0, 0, 1, 0, 0, 10, 6, 12, 3 },
- { 15, 0, 0, 0, -1, 0, 0, 0, 0, -214, 0, -214, 0, 0, 1, 0, 0, 10, 6, 12, 3 },
- { 15, 0, 0, 0, -1, 0, 0, 0, 1, 31, 1, 31, 0, 0, 1, 0, 0, 10, 6, 12, 3 },
- { 15, 0, 0, 0, -1, 0, 0, 0, 0, -218, 0, -218, 0, 0, 1, 0, 0, 10, 6, 12, 3 },
- { 15, 0, 0, 0, -1, 0, 0, 0, 1, 33, 1, 33, 0, 0, 1, 0, 0, 10, 6, 12, 3 },
- { 15, 0, 0, 0, -1, 0, 0, 0, 0, -69, 0, -69, 0, 0, 1, 0, 0, 10, 6, 12, 3 },
- { 15, 0, 0, 0, -1, 0, 0, 0, 0, -217, 0, -217, 0, 0, 1, 0, 0, 10, 6, 12, 3 },
- { 15, 0, 0, 0, -1, 0, 0, 0, 0, -71, 0, -71, 0, 0, 1, 0, 0, 10, 6, 12, 3 },
- { 15, 0, 0, 0, -1, 0, 0, 0, 0, -219, 0, -219, 0, 0, 1, 0, 0, 10, 6, 12, 3 },
- { 15, 0, 0, 0, -1, 0, 0, 0, 1, 35, 1, 35, 0, 0, 1, 0, 0, 10, 6, 12, 3 },
- { 15, 0, 0, 0, -1, 0, 0, 0, 1, 37, 1, 37, 0, 0, 1, 0, 0, 10, 6, 12, 3 },
- { 15, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 10, 6, 12, 3 },
- { 17, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 80, 0, 10, 6, 12, 3 },
- { 17, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 10, 8, 12, 2 },
- { 17, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 10, 8, 12, 2 },
- { 17, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 10, 6, 12, 2 },
- { 28, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 10, 0, 12, 2 },
- { 17, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 10, 8, 18, 2 },
- { 28, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 10, 0, 18, 2 },
- { 28, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 12, 36 },
- { 17, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 10, 8, 12, 2 },
- { 28, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 10, 0, 12, 2 },
- { 17, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 10, 8, 12, 2 },
- { 28, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 10, 0, 12, 2 },
- { 0, 17, 230, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 204, 4, 4, 4, 21, 1 },
- { 0, 17, 230, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 4, 4, 4, 21, 1 },
- { 0, 17, 232, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 4, 4, 4, 21, 1 },
- { 0, 17, 220, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 4, 4, 4, 21, 1 },
- { 0, 17, 216, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 204, 4, 4, 4, 21, 1 },
- { 0, 17, 202, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 4, 4, 4, 21, 1 },
- { 0, 17, 220, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 204, 4, 4, 4, 21, 1 },
- { 0, 17, 202, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 204, 4, 4, 4, 21, 1 },
- { 0, 17, 1, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 4, 4, 4, 21, 1 },
- { 0, 17, 1, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 204, 4, 4, 4, 21, 1 },
- { 0, 17, 230, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 85, 4, 4, 4, 21, 1 },
- { 0, 17, 240, 5, -1, 0, 0, 0, 0, 84, 0, 84, 0, 116, 1, 204, 4, 4, 4, 21, 1 },
- { 0, 17, 230, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 4, 4, 4, 21, 1 },
- { 0, 17, 220, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 4, 4, 4, 21, 1 },
- { 0, 17, 0, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, 4, 4, 4, 4, 1 },
- { 0, 17, 230, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 4, 4, 4, 21, 1 },
- { 0, 17, 220, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 4, 4, 4, 21, 1 },
- { 0, 17, 232, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 4, 4, 4, 21, 1 },
- { 0, 17, 220, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 4, 4, 4, 21, 1 },
- { 0, 17, 230, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 4, 4, 4, 21, 1 },
- { 0, 17, 233, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 4, 4, 4, 4, 1 },
- { 0, 17, 234, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 4, 4, 4, 4, 1 },
- { 0, 17, 233, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 4, 4, 4, 4, 1 },
- { 0, 17, 234, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 4, 4, 4, 4, 1 },
- { 0, 17, 233, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 4, 4, 4, 4, 1 },
- { 0, 17, 230, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, 4, 4, 4, 21, 1 },
- { 14, 0, 0, 0, -1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 10, 0, 0, 10, 7, 12, 4 },
- { 15, 0, 0, 0, -1, 0, 0, 0, 0, -1, 0, -1, 0, 0, 10, 0, 0, 10, 6, 12, 4 },
- { 17, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 85, 0, 10, 8, 12, 2 },
- { 28, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 12, 4 },
- { 13, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, 0 },
- { 17, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 80, 0, 10, 6, 12, 4 },
- { 15, 0, 0, 0, -1, 0, 0, 0, 0, 130, 0, 130, 0, 0, 9, 0, 0, 10, 6, 12, 4 },
- { 25, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 85, 0, 15, 0, 8, 2 },
- { 14, 0, 0, 0, -1, 0, 0, 116, 0, 0, 0, 0, 0, 116, 16, 0, 0, 10, 7, 12, 4 },
- { 28, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 80, 0, 0, 0, 12, 4 },
- { 28, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 81, 0, 0, 0, 12, 2 },
- { 14, 0, 0, 0, -1, 0, 0, 38, 0, 0, 0, 0, 0, 38, 1, 17, 0, 10, 7, 12, 4 },
- { 25, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 85, 0, 14, 0, 12, 2 },
- { 14, 0, 0, 0, -1, 0, 0, 37, 0, 0, 0, 0, 0, 37, 1, 17, 0, 10, 7, 12, 4 },
- { 14, 0, 0, 0, -1, 0, 0, 64, 0, 0, 0, 0, 0, 64, 1, 17, 0, 10, 7, 12, 4 },
- { 14, 0, 0, 0, -1, 0, 0, 63, 0, 0, 0, 0, 0, 63, 1, 17, 0, 10, 7, 12, 4 },
- { 15, 0, 0, 0, -1, 0, 0, 0, 1, 495, 1, 495, 0, 0, 1, 17, 0, 10, 6, 12, 4 },
- { 14, 0, 0, 0, -1, 0, 0, 32, 0, 0, 0, 0, 0, 32, 1, 0, 0, 10, 7, 12, 4 },
- { 14, 0, 0, 0, -1, 0, 0, 32, 0, 0, 0, 0, 0, 32, 1, 17, 0, 10, 7, 12, 4 },
- { 15, 0, 0, 0, -1, 0, 0, 0, 0, -38, 0, -38, 0, 0, 1, 17, 0, 10, 6, 12, 4 },
- { 15, 0, 0, 0, -1, 0, 0, 0, 0, -37, 0, -37, 0, 0, 1, 17, 0, 10, 6, 12, 4 },
- { 15, 0, 0, 0, -1, 0, 0, 0, 1, 499, 1, 499, 0, 0, 1, 17, 0, 10, 6, 12, 4 },
- { 15, 0, 0, 0, -1, 0, 0, 0, 0, -32, 0, -32, 0, 0, 1, 0, 0, 10, 6, 12, 4 },
- { 15, 0, 0, 0, -1, 0, 0, 0, 0, -31, 0, -31, 0, 1, 1, 0, 0, 10, 6, 12, 4 },
- { 15, 0, 0, 0, -1, 0, 0, 0, 0, -32, 0, -32, 0, 0, 1, 17, 0, 10, 6, 12, 4 },
- { 15, 0, 0, 0, -1, 0, 0, 0, 0, -64, 0, -64, 0, 0, 1, 17, 0, 10, 6, 12, 4 },
- { 15, 0, 0, 0, -1, 0, 0, 0, 0, -63, 0, -63, 0, 0, 1, 17, 0, 10, 6, 12, 4 },
- { 14, 0, 0, 0, -1, 0, 0, 8, 0, 0, 0, 0, 0, 8, 10, 0, 0, 10, 7, 12, 4 },
- { 15, 0, 0, 0, -1, 0, 0, 0, 0, -62, 0, -62, 0, -30, 1, 80, 0, 10, 6, 12, 4 },
- { 15, 0, 0, 0, -1, 0, 0, 0, 0, -57, 0, -57, 0, -25, 1, 80, 0, 10, 6, 12, 4 },
- { 14, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 80, 0, 10, 7, 12, 4 },
- { 14, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 81, 0, 10, 7, 12, 4 },
- { 15, 0, 0, 0, -1, 0, 0, 0, 0, -47, 0, -47, 0, -15, 1, 80, 0, 10, 6, 12, 4 },
- { 15, 0, 0, 0, -1, 0, 0, 0, 0, -54, 0, -54, 0, -22, 1, 80, 0, 10, 6, 12, 4 },
- { 15, 0, 0, 0, -1, 0, 0, 0, 0, -8, 0, -8, 0, 0, 4, 0, 0, 10, 6, 12, 4 },
- { 14, 0, 0, 0, -1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 6, 0, 0, 10, 7, 12, 4 },
- { 15, 0, 0, 0, -1, 0, 0, 0, 0, -1, 0, -1, 0, 0, 6, 0, 0, 10, 6, 12, 4 },
- { 14, 0, 0, 0, -1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 10, 7, 12, 4 },
- { 15, 0, 0, 0, -1, 0, 0, 0, 0, -1, 0, -1, 0, 0, 4, 0, 0, 10, 6, 12, 4 },
- { 14, 0, 0, 0, -1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 10, 7, 12, 46 },
- { 15, 0, 0, 0, -1, 0, 0, 0, 0, -1, 0, -1, 0, 0, 1, 0, 0, 10, 6, 12, 46 },
- { 15, 0, 0, 0, -1, 0, 0, 0, 0, -86, 0, -86, 0, -54, 1, 80, 0, 10, 6, 12, 4 },
- { 15, 0, 0, 0, -1, 0, 0, 0, 0, -80, 0, -80, 0, -48, 1, 80, 0, 10, 6, 12, 4 },
- { 15, 0, 0, 0, -1, 0, 0, 0, 0, 7, 0, 7, 0, 0, 1, 80, 0, 10, 6, 12, 4 },
- { 15, 0, 0, 0, -1, 0, 0, 0, 0, -116, 0, -116, 0, 0, 1, 0, 0, 10, 6, 12, 4 },
- { 14, 0, 0, 0, -1, 0, 0, -60, 0, 0, 0, 0, 0, -60, 5, 80, 0, 10, 7, 12, 4 },
- { 15, 0, 0, 0, -1, 0, 0, 0, 0, -96, 0, -96, 0, -64, 5, 80, 0, 10, 6, 12, 4 },
- { 26, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 12, 4 },
- { 14, 0, 0, 0, -1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 7, 0, 0, 10, 7, 12, 4 },
- { 15, 0, 0, 0, -1, 0, 0, 0, 0, -1, 0, -1, 0, 0, 7, 0, 0, 10, 6, 12, 4 },
- { 14, 0, 0, 0, -1, 0, 0, -7, 0, 0, 0, 0, 0, -7, 7, 80, 0, 10, 7, 12, 4 },
- { 15, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 10, 6, 12, 4 },
- { 14, 0, 0, 0, -1, 0, 0, -130, 0, 0, 0, 0, 0, -130, 8, 0, 0, 10, 7, 12, 4 },
- { 14, 0, 0, 0, -1, 0, 0, 80, 0, 0, 0, 0, 0, 80, 4, 17, 0, 10, 7, 12, 5 },
- { 14, 0, 0, 0, -1, 0, 0, 80, 0, 0, 0, 0, 0, 80, 1, 17, 0, 10, 7, 12, 5 },
- { 14, 0, 0, 0, -1, 0, 0, 80, 0, 0, 0, 0, 0, 80, 1, 0, 0, 10, 7, 12, 5 },
- { 14, 0, 0, 0, -1, 0, 0, 32, 0, 0, 0, 0, 0, 32, 1, 0, 0, 10, 7, 12, 5 },
- { 14, 0, 0, 0, -1, 0, 0, 32, 0, 0, 0, 0, 0, 32, 1, 17, 0, 10, 7, 12, 5 },
- { 15, 0, 0, 0, -1, 0, 0, 0, 0, -32, 0, -32, 0, 0, 1, 0, 0, 10, 6, 12, 5 },
- { 15, 0, 0, 0, -1, 0, 0, 0, 0, -32, 0, -32, 0, 0, 1, 17, 0, 10, 6, 12, 5 },
- { 15, 0, 0, 0, -1, 0, 0, 0, 0, -80, 0, -80, 0, 0, 4, 17, 0, 10, 6, 12, 5 },
- { 15, 0, 0, 0, -1, 0, 0, 0, 0, -80, 0, -80, 0, 0, 1, 17, 0, 10, 6, 12, 5 },
- { 15, 0, 0, 0, -1, 0, 0, 0, 0, -80, 0, -80, 0, 0, 1, 0, 0, 10, 6, 12, 5 },
- { 14, 0, 0, 0, -1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 10, 7, 12, 5 },
- { 15, 0, 0, 0, -1, 0, 0, 0, 0, -1, 0, -1, 0, 0, 1, 0, 0, 10, 6, 12, 5 },
- { 14, 0, 0, 0, -1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 1, 17, 0, 10, 7, 12, 5 },
- { 15, 0, 0, 0, -1, 0, 0, 0, 0, -1, 0, -1, 0, 0, 1, 17, 0, 10, 6, 12, 5 },
- { 29, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 12, 5 },
- { 0, 17, 230, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 4, 4, 4, 21, 5 },
- { 0, 17, 230, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 4, 4, 4, 21, 5 },
- { 2, 17, 0, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 4, 4, 4, 21, 5 },
- { 14, 0, 0, 0, -1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 6, 0, 0, 10, 7, 12, 5 },
- { 15, 0, 0, 0, -1, 0, 0, 0, 0, -1, 0, -1, 0, 0, 6, 0, 0, 10, 6, 12, 5 },
- { 14, 0, 0, 0, -1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 4, 0, 0, 10, 7, 12, 5 },
- { 15, 0, 0, 0, -1, 0, 0, 0, 0, -1, 0, -1, 0, 0, 4, 0, 0, 10, 6, 12, 5 },
- { 14, 0, 0, 0, -1, 0, 0, 15, 0, 0, 0, 0, 0, 15, 1, 0, 0, 10, 7, 12, 5 },
- { 15, 0, 0, 0, -1, 0, 0, 0, 0, -15, 0, -15, 0, 0, 9, 0, 0, 10, 6, 12, 5 },
- { 14, 0, 0, 0, -1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 4, 17, 0, 10, 7, 12, 5 },
- { 15, 0, 0, 0, -1, 0, 0, 0, 0, -1, 0, -1, 0, 0, 4, 17, 0, 10, 6, 12, 5 },
- { 14, 0, 0, 0, -1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 8, 0, 0, 10, 7, 12, 5 },
- { 15, 0, 0, 0, -1, 0, 0, 0, 0, -1, 0, -1, 0, 0, 8, 0, 0, 10, 6, 12, 5 },
- { 14, 0, 0, 0, -1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 9, 0, 0, 10, 7, 12, 5 },
- { 15, 0, 0, 0, -1, 0, 0, 0, 0, -1, 0, -1, 0, 0, 9, 0, 0, 10, 6, 12, 5 },
- { 14, 0, 0, 0, -1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 10, 0, 0, 10, 7, 12, 5 },
- { 15, 0, 0, 0, -1, 0, 0, 0, 0, -1, 0, -1, 0, 0, 10, 0, 0, 10, 6, 12, 5 },
- { 14, 0, 0, 0, -1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 11, 0, 0, 10, 7, 12, 5 },
- { 15, 0, 0, 0, -1, 0, 0, 0, 0, -1, 0, -1, 0, 0, 11, 0, 0, 10, 6, 12, 5 },
- { 14, 0, 0, 0, -1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 12, 0, 0, 10, 7, 12, 5 },
- { 15, 0, 0, 0, -1, 0, 0, 0, 0, -1, 0, -1, 0, 0, 12, 0, 0, 10, 6, 12, 5 },
- { 14, 0, 0, 0, -1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 16, 0, 0, 10, 7, 12, 5 },
- { 15, 0, 0, 0, -1, 0, 0, 0, 0, -1, 0, -1, 0, 0, 16, 0, 0, 10, 6, 12, 5 },
- { 14, 0, 0, 0, -1, 0, 0, 48, 0, 0, 0, 0, 0, 48, 1, 0, 0, 10, 7, 12, 6 },
- { 17, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 10, 8, 12, 6 },
- { 25, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 12, 6 },
- { 25, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 11, 12, 6 },
- { 15, 0, 0, 0, -1, 0, 0, 0, 0, -48, 0, -48, 0, 0, 1, 0, 0, 10, 6, 12, 6 },
- { 15, 0, 0, 0, -1, 0, 0, 0, 1, 459, 1, 456, 0, 0, 1, 80, 0, 10, 6, 12, 6 },
- { 25, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 15, 12, 8, 2 },
- { 20, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 17, 6 },
- { 29, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 12, 6 },
- { 27, 4, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 9, 6 },
- { 13, 1, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, 0 },
- { 0, 17, 220, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 4, 4, 4, 21, 7 },
- { 0, 17, 230, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 4, 4, 4, 21, 7 },
- { 0, 17, 222, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 4, 4, 4, 21, 7 },
- { 0, 17, 220, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 4, 4, 4, 21, 7 },
- { 0, 17, 228, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 4, 4, 4, 21, 7 },
- { 0, 17, 10, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 4, 4, 4, 21, 7 },
- { 0, 17, 11, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 4, 4, 4, 21, 7 },
- { 0, 17, 12, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 4, 4, 4, 21, 7 },
- { 0, 17, 13, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 4, 4, 4, 21, 7 },
- { 0, 17, 14, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 4, 4, 4, 21, 7 },
- { 0, 17, 15, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 4, 4, 4, 21, 7 },
- { 0, 17, 16, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 4, 4, 4, 21, 7 },
- { 0, 17, 17, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 4, 4, 4, 21, 7 },
- { 0, 17, 18, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 4, 4, 4, 21, 7 },
- { 0, 17, 19, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 4, 4, 4, 21, 7 },
- { 0, 17, 19, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 4, 4, 4, 21, 7 },
- { 0, 17, 20, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 4, 4, 4, 21, 7 },
- { 0, 17, 21, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 4, 4, 4, 21, 7 },
- { 0, 17, 22, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 4, 4, 4, 21, 7 },
- { 20, 1, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 17, 7 },
- { 0, 17, 23, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 4, 4, 4, 21, 7 },
- { 25, 1, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 12, 7 },
- { 0, 17, 24, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 4, 4, 4, 21, 7 },
- { 0, 17, 25, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 4, 4, 4, 21, 7 },
- { 25, 1, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 6, 7 },
- { 0, 17, 18, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 4, 4, 4, 21, 7 },
- { 18, 1, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 9, 8, 13, 7 },
- { 25, 1, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 10, 8, 12, 7 },
- { 25, 1, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 14, 0, 12, 7 },
- { 10, 5, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 7, 6, 4, 12, 8 },
- { 10, 5, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 7, 6, 4, 12, 8 },
- { 10, 5, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 7, 6, 4, 12, 2 },
- { 26, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 0, 0, 12, 8 },
- { 26, 13, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 0, 0, 12, 8 },
- { 25, 4, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 0, 0, 10, 8 },
- { 27, 13, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 10, 8 },
- { 25, 13, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 15, 11, 8, 8 },
- { 29, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 12, 8 },
- { 0, 17, 230, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 4, 4, 4, 21, 8 },
- { 0, 17, 230, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 4, 4, 4, 21, 8 },
- { 0, 17, 30, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 4, 4, 4, 21, 8 },
- { 0, 17, 31, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 4, 4, 4, 21, 8 },
- { 0, 17, 32, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 4, 4, 4, 21, 8 },
- { 25, 13, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 6, 2 },
- { 10, 13, 0, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 3, 6, 4, 21, 8 },
- { 13, 13, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, 0 },
- { 25, 13, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 6, 8 },
- { 25, 13, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 12, 6, 2 },
- { 18, 13, 0, 2, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, 0, 0, 10, 8, 12, 8 },
- { 18, 13, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 10, 8, 12, 8 },
- { 18, 13, 0, 3, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 17, 0, 10, 8, 12, 8 },
- { 18, 13, 0, 2, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 17, 0, 10, 8, 12, 8 },
- { 18, 13, 0, 3, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 10, 8, 12, 8 },
- { 18, 13, 0, 2, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 10, 8, 12, 8 },
- { 18, 13, 0, 2, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 10, 8, 12, 8 },
- { 17, 13, 0, 1, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 10, 8, 12, 2 },
- { 0, 17, 27, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 4, 4, 4, 21, 1 },
- { 0, 17, 28, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 4, 4, 4, 21, 1 },
- { 0, 17, 29, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 4, 4, 4, 21, 1 },
- { 0, 17, 30, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 4, 4, 4, 21, 1 },
- { 0, 17, 31, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 4, 4, 4, 21, 1 },
- { 0, 17, 32, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 4, 4, 4, 21, 1 },
- { 0, 17, 33, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 4, 4, 4, 21, 1 },
- { 0, 17, 34, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 4, 4, 4, 21, 1 },
- { 0, 17, 230, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 204, 4, 4, 4, 21, 1 },
- { 0, 17, 220, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 204, 4, 4, 4, 21, 1 },
- { 0, 17, 220, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 4, 4, 4, 21, 8 },
- { 0, 17, 230, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 4, 4, 4, 21, 8 },
- { 0, 17, 220, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 4, 4, 4, 21, 8 },
- { 0, 17, 220, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, 0, 4, 4, 4, 21, 8 },
- { 3, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 16, 9, 11, 8 },
- { 3, 5, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 16, 9, 11, 8 },
- { 3, 5, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 16, 9, 11, 8 },
- { 3, 5, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 16, 9, 11, 8 },
- { 3, 5, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 16, 9, 11, 8 },
- { 3, 5, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 16, 9, 11, 8 },
- { 3, 5, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 16, 9, 11, 8 },
- { 3, 5, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 16, 9, 11, 8 },
- { 3, 5, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 16, 9, 11, 8 },
- { 3, 5, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 16, 9, 11, 8 },
- { 25, 4, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 10, 8 },
- { 25, 5, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 16, 9, 11, 8 },
- { 25, 5, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 15, 9, 11, 8 },
- { 25, 13, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 12, 8 },
- { 18, 13, 0, 2, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 10, 8, 12, 8 },
- { 0, 17, 35, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 4, 4, 4, 21, 1 },
- { 18, 13, 0, 3, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 80, 0, 10, 8, 12, 8 },
- { 18, 13, 0, 2, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 80, 0, 10, 8, 12, 8 },
- { 18, 13, 0, 2, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 10, 8, 12, 8 },
- { 18, 13, 0, 3, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 10, 8, 12, 8 },
- { 25, 13, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 12, 6, 8 },
- { 0, 17, 230, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 4, 4, 4, 21, 8 },
- { 10, 5, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 7, 6, 4, 12, 2 },
- { 29, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 12, 8 },
- { 0, 17, 220, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 4, 4, 4, 21, 8 },
- { 17, 13, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 10, 8, 12, 8 },
- { 18, 13, 0, 3, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 10, 8, 12, 8 },
- { 3, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 16, 9, 11, 8 },
- { 3, 2, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 16, 9, 11, 8 },
- { 3, 2, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 16, 9, 11, 8 },
- { 3, 2, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 16, 9, 11, 8 },
- { 3, 2, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 16, 9, 11, 8 },
- { 3, 2, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 16, 9, 11, 8 },
- { 3, 2, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 16, 9, 11, 8 },
- { 3, 2, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 16, 9, 11, 8 },
- { 3, 2, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 16, 9, 11, 8 },
- { 3, 2, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 16, 9, 11, 8 },
- { 29, 13, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 12, 8 },
- { 18, 13, 0, 2, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 10, 8, 12, 8 },
- { 25, 13, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 12, 12, 9 },
- { 25, 13, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 12, 9 },
- { 10, 13, 0, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 7, 6, 4, 12, 9 },
- { 18, 13, 0, 3, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 10, 8, 12, 9 },
- { 0, 17, 36, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 4, 4, 4, 21, 9 },
- { 18, 13, 0, 2, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 10, 8, 12, 9 },
- { 18, 13, 0, 2, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 10, 8, 12, 9 },
- { 18, 13, 0, 3, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 10, 8, 12, 9 },
- { 0, 17, 230, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 4, 4, 4, 21, 9 },
- { 0, 17, 220, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 4, 4, 4, 21, 9 },
- { 18, 13, 0, 2, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 10, 8, 12, 8 },
- { 18, 13, 0, 3, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 10, 8, 12, 8 },
- { 18, 13, 0, 3, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 10, 8, 12, 8 },
- { 18, 13, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 10, 8, 12, 10 },
- { 0, 17, 0, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 4, 4, 4, 21, 10 },
- { 18, 13, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 10, 8, 12, 10 },
- { 3, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 16, 9, 11, 66 },
- { 3, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 16, 9, 11, 66 },
- { 3, 1, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 16, 9, 11, 66 },
- { 3, 1, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 16, 9, 11, 66 },
- { 3, 1, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 16, 9, 11, 66 },
- { 3, 1, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 16, 9, 11, 66 },
- { 3, 1, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 16, 9, 11, 66 },
- { 3, 1, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 16, 9, 11, 66 },
- { 3, 1, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 16, 9, 11, 66 },
- { 3, 1, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 16, 9, 11, 66 },
- { 18, 1, 0, 2, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 10, 8, 12, 66 },
- { 0, 17, 230, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 4, 4, 4, 21, 66 },
- { 0, 17, 220, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 4, 4, 4, 21, 66 },
- { 17, 1, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 10, 8, 12, 66 },
- { 29, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 12, 66 },
- { 25, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 12, 66 },
- { 25, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 15, 11, 8, 66 },
- { 25, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 12, 6, 66 },
- { 17, 1, 0, 1, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 10, 8, 12, 66 },
- { 18, 1, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 0, 0, 10, 8, 12, 82 },
- { 0, 17, 230, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 0, 4, 4, 4, 21, 82 },
- { 17, 1, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 0, 0, 10, 8, 12, 82 },
- { 25, 1, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 0, 0, 0, 0, 12, 82 },
- { 18, 1, 0, 3, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, 0, 0, 10, 8, 12, 95 },
- { 18, 1, 0, 2, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, 0, 0, 10, 8, 12, 95 },
- { 18, 1, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, 0, 0, 10, 8, 12, 95 },
- { 0, 17, 220, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, 0, 4, 4, 4, 21, 95 },
- { 25, 1, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, 0, 0, 0, 0, 12, 95 },
- { 18, 13, 0, 2, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 10, 8, 12, 9 },
- { 18, 13, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 10, 8, 12, 9 },
- { 18, 13, 0, 3, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 10, 8, 12, 9 },
- { 18, 13, 0, 2, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 0, 10, 8, 12, 8 },
- { 18, 13, 0, 2, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 10, 8, 12, 8 },
- { 18, 13, 0, 3, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 0, 10, 8, 12, 8 },
- { 18, 13, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 10, 8, 12, 8 },
- { 18, 13, 0, 3, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 10, 8, 12, 8 },
- { 18, 13, 0, 2, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 10, 8, 12, 8 },
- { 18, 13, 0, 2, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 18, 0, 0, 10, 8, 12, 8 },
- { 18, 13, 0, 3, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 18, 0, 0, 10, 8, 12, 8 },
- { 0, 17, 230, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 18, 0, 4, 4, 4, 21, 8 },
- { 10, 5, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 18, 0, 7, 6, 4, 12, 2 },
- { 0, 17, 220, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 4, 4, 4, 21, 8 },
- { 0, 17, 230, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 4, 4, 4, 21, 8 },
- { 0, 17, 220, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 4, 4, 4, 21, 8 },
- { 0, 17, 27, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 4, 4, 4, 21, 8 },
- { 0, 17, 28, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 4, 4, 4, 21, 8 },
- { 0, 17, 29, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 4, 4, 4, 21, 8 },
- { 0, 17, 230, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 4, 4, 4, 21, 8 },
- { 0, 17, 0, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 0, 4, 4, 4, 21, 11 },
- { 0, 17, 0, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 4, 4, 4, 21, 11 },
- { 1, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 8, 4, 4, 21, 11 },
- { 18, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 10, 8, 12, 11 },
- { 18, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 10, 8, 12, 11 },
- { 18, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 17, 0, 10, 8, 12, 11 },
- { 0, 17, 0, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, 0, 4, 4, 4, 21, 11 },
- { 1, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, 0, 8, 4, 4, 21, 11 },
- { 0, 17, 7, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 204, 4, 4, 4, 21, 11 },
- { 0, 17, 9, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 4, 4, 4, 21, 11 },
- { 1, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 0, 8, 4, 4, 21, 11 },
- { 0, 17, 230, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 4, 4, 4, 21, 11 },
- { 18, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 85, 0, 10, 8, 12, 11 },
- { 25, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 12, 17, 2 },
- { 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 16, 9, 11, 11 },
- { 3, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 16, 9, 11, 11 },
- { 3, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 16, 9, 11, 11 },
- { 3, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 16, 9, 11, 11 },
- { 3, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 16, 9, 11, 11 },
- { 3, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 16, 9, 11, 11 },
- { 3, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 16, 9, 11, 11 },
- { 3, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 16, 9, 11, 11 },
- { 3, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 16, 9, 11, 11 },
- { 3, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 16, 9, 11, 11 },
- { 25, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 12, 11 },
- { 17, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 10, 8, 12, 11 },
- { 18, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 10, 8, 12, 11 },
- { 18, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, 0, 0, 10, 8, 12, 11 },
- { 18, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 10, 8, 12, 11 },
- { 18, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 0, 0, 10, 8, 12, 11 },
- { 18, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 10, 8, 12, 11 },
- { 18, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 10, 8, 12, 11 },
- { 18, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 10, 8, 12, 12 },
- { 0, 17, 0, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 4, 4, 4, 21, 12 },
- { 1, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 8, 4, 4, 21, 12 },
- { 18, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 10, 8, 12, 12 },
- { 0, 17, 7, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 4, 4, 4, 21, 12 },
- { 18, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 10, 8, 12, 12 },
- { 1, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 204, 4, 4, 4, 21, 12 },
- { 1, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 17, 8, 4, 4, 21, 12 },
- { 0, 17, 9, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 4, 4, 4, 21, 12 },
- { 18, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 10, 8, 12, 12 },
- { 18, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 85, 0, 10, 8, 12, 12 },
- { 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 16, 9, 11, 12 },
- { 3, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 16, 9, 11, 12 },
- { 3, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 16, 9, 11, 12 },
- { 3, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 16, 9, 11, 12 },
- { 3, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 16, 9, 11, 12 },
- { 3, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 16, 9, 11, 12 },
- { 3, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 16, 9, 11, 12 },
- { 3, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 16, 9, 11, 12 },
- { 3, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 16, 9, 11, 12 },
- { 3, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 16, 9, 11, 12 },
- { 27, 4, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 10, 12 },
- { 5, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 12, 12 },
- { 5, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 10, 12 },
- { 29, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 12, 12 },
- { 27, 4, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 0, 0, 0, 0, 9, 12 },
- { 18, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 10, 8, 12, 12 },
- { 25, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 0, 12, 12 },
- { 0, 17, 0, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 4, 4, 4, 21, 13 },
- { 0, 17, 0, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 4, 4, 4, 21, 13 },
- { 1, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 8, 4, 4, 21, 13 },
- { 18, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 10, 8, 12, 13 },
- { 18, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 85, 0, 10, 8, 12, 13 },
- { 0, 17, 7, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 4, 4, 4, 21, 13 },
- { 1, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 8, 4, 4, 21, 13 },
- { 0, 17, 9, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 4, 4, 4, 21, 13 },
- { 0, 17, 0, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 4, 4, 4, 21, 13 },
- { 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 16, 9, 11, 13 },
- { 3, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 16, 9, 11, 13 },
- { 3, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 16, 9, 11, 13 },
- { 3, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 16, 9, 11, 13 },
- { 3, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 16, 9, 11, 13 },
- { 3, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 16, 9, 11, 13 },
- { 3, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 16, 9, 11, 13 },
- { 3, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 16, 9, 11, 13 },
- { 3, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 16, 9, 11, 13 },
- { 3, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 16, 9, 11, 13 },
- { 0, 17, 0, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 4, 4, 4, 21, 14 },
- { 1, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 8, 4, 4, 21, 14 },
- { 18, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 10, 8, 12, 14 },
- { 18, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 10, 8, 12, 14 },
- { 0, 17, 7, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 4, 4, 4, 21, 14 },
- { 0, 17, 9, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 4, 4, 4, 21, 14 },
- { 0, 17, 0, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 4, 4, 4, 21, 14 },
- { 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 16, 9, 11, 14 },
- { 3, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 16, 9, 11, 14 },
- { 3, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 16, 9, 11, 14 },
- { 3, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 16, 9, 11, 14 },
- { 3, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 16, 9, 11, 14 },
- { 3, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 16, 9, 11, 14 },
- { 3, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 16, 9, 11, 14 },
- { 3, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 16, 9, 11, 14 },
- { 3, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 16, 9, 11, 14 },
- { 3, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 16, 9, 11, 14 },
- { 25, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 12, 14 },
- { 27, 4, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 9, 14 },
- { 18, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 10, 8, 12, 14 },
- { 0, 17, 0, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 4, 4, 4, 21, 14 },
- { 0, 17, 0, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 4, 4, 4, 21, 15 },
- { 1, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 8, 4, 4, 21, 15 },
- { 18, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 10, 8, 12, 15 },
- { 18, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 10, 8, 12, 15 },
- { 0, 17, 7, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 4, 4, 4, 21, 15 },
- { 1, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 204, 4, 4, 4, 21, 15 },
- { 0, 17, 0, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 4, 4, 4, 21, 15 },
- { 1, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 17, 8, 4, 4, 21, 15 },
- { 0, 17, 9, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 4, 4, 4, 21, 15 },
- { 0, 17, 0, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 204, 4, 4, 4, 21, 15 },
- { 18, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 85, 0, 10, 8, 12, 15 },
- { 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 16, 9, 11, 15 },
- { 3, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 16, 9, 11, 15 },
- { 3, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 16, 9, 11, 15 },
- { 3, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 16, 9, 11, 15 },
- { 3, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 16, 9, 11, 15 },
- { 3, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 16, 9, 11, 15 },
- { 3, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 16, 9, 11, 15 },
- { 3, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 16, 9, 11, 15 },
- { 3, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 16, 9, 11, 15 },
- { 3, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 16, 9, 11, 15 },
- { 29, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 12, 15 },
- { 5, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, 0, 0, 0, 0, 12, 15 },
- { 0, 17, 0, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 4, 4, 4, 21, 16 },
- { 18, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 10, 8, 12, 16 },
- { 18, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 17, 0, 10, 8, 12, 16 },
- { 18, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 10, 8, 12, 16 },
- { 1, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 204, 4, 4, 4, 21, 16 },
- { 1, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 8, 4, 4, 21, 16 },
- { 1, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 17, 8, 4, 4, 21, 16 },
- { 0, 17, 9, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 4, 4, 4, 21, 16 },
- { 18, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 10, 8, 12, 16 },
- { 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 16, 9, 11, 16 },
- { 3, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 16, 9, 11, 16 },
- { 3, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 16, 9, 11, 16 },
- { 3, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 16, 9, 11, 16 },
- { 3, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 16, 9, 11, 16 },
- { 3, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 16, 9, 11, 16 },
- { 3, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 16, 9, 11, 16 },
- { 3, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 16, 9, 11, 16 },
- { 3, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 16, 9, 11, 16 },
- { 3, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 16, 9, 11, 16 },
- { 5, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 12, 16 },
- { 29, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 12, 16 },
- { 27, 4, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 9, 16 },
- { 0, 17, 0, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 4, 4, 4, 21, 17 },
- { 1, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 8, 4, 4, 21, 17 },
- { 18, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 10, 8, 12, 17 },
- { 18, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 10, 8, 12, 17 },
- { 18, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 10, 8, 12, 17 },
- { 0, 17, 0, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 4, 4, 4, 21, 17 },
- { 0, 17, 0, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 17, 4, 4, 4, 21, 17 },
- { 0, 17, 9, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 4, 4, 4, 21, 17 },
- { 0, 17, 84, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 4, 4, 4, 21, 17 },
- { 0, 17, 91, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 204, 4, 4, 4, 21, 17 },
- { 18, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 10, 8, 12, 17 },
- { 0, 17, 0, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 4, 4, 4, 21, 17 },
- { 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 16, 9, 11, 17 },
- { 3, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 16, 9, 11, 17 },
- { 3, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 16, 9, 11, 17 },
- { 3, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 16, 9, 11, 17 },
- { 3, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 16, 9, 11, 17 },
- { 3, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 16, 9, 11, 17 },
- { 3, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 16, 9, 11, 17 },
- { 3, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 16, 9, 11, 17 },
- { 3, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 16, 9, 11, 17 },
- { 3, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 16, 9, 11, 17 },
- { 5, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 0, 0, 12, 17 },
- { 29, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 0, 0, 12, 17 },
- { 18, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 18, 0, 0, 10, 8, 12, 18 },
- { 0, 17, 0, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 4, 4, 4, 21, 18 },
- { 1, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 8, 4, 4, 21, 18 },
- { 18, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 10, 8, 12, 18 },
- { 0, 17, 7, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 4, 4, 4, 21, 18 },
- { 18, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 10, 8, 12, 18 },
- { 0, 0, 0, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 4, 4, 4, 21, 18 },
- { 1, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 17, 8, 4, 4, 21, 18 },
- { 1, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 204, 4, 4, 4, 21, 18 },
- { 0, 17, 0, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 4, 4, 4, 21, 18 },
- { 0, 17, 9, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 4, 4, 4, 21, 18 },
- { 0, 17, 0, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 4, 4, 4, 21, 18 },
- { 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 16, 9, 11, 18 },
- { 3, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 16, 9, 11, 18 },
- { 3, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 16, 9, 11, 18 },
- { 3, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 16, 9, 11, 18 },
- { 3, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 16, 9, 11, 18 },
- { 3, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 16, 9, 11, 18 },
- { 3, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 16, 9, 11, 18 },
- { 3, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 16, 9, 11, 18 },
- { 3, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 16, 9, 11, 18 },
- { 3, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 16, 9, 11, 18 },
- { 18, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 10, 8, 12, 18 },
- { 0, 17, 0, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 4, 4, 4, 21, 19 },
- { 0, 17, 0, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 4, 4, 4, 21, 19 },
- { 1, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 8, 4, 4, 21, 19 },
- { 18, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 10, 8, 12, 19 },
- { 18, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, 0, 0, 10, 8, 12, 19 },
- { 0, 17, 9, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 4, 4, 4, 21, 19 },
- { 18, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 10, 8, 12, 19 },
- { 1, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 204, 4, 4, 4, 21, 19 },
- { 0, 17, 0, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 4, 4, 4, 21, 19 },
- { 0, 17, 0, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 4, 4, 4, 21, 19 },
- { 1, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 17, 8, 4, 4, 21, 19 },
- { 0, 17, 9, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 4, 4, 4, 21, 19 },
- { 18, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, 0, 7, 10, 8, 12, 19 },
- { 29, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 18, 0, 0, 0, 0, 12, 19 },
- { 18, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 18, 0, 0, 10, 8, 12, 19 },
- { 5, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 18, 0, 0, 0, 0, 12, 19 },
- { 18, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 10, 8, 12, 19 },
- { 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 16, 9, 11, 19 },
- { 3, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 16, 9, 11, 19 },
- { 3, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 16, 9, 11, 19 },
- { 3, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 16, 9, 11, 19 },
- { 3, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 16, 9, 11, 19 },
- { 3, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 16, 9, 11, 19 },
- { 3, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 16, 9, 11, 19 },
- { 3, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 16, 9, 11, 19 },
- { 3, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 16, 9, 11, 19 },
- { 3, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 16, 9, 11, 19 },
- { 5, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 0, 0, 12, 19 },
- { 29, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 0, 0, 10, 19 },
- { 1, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 8, 4, 4, 21, 20 },
- { 18, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 10, 8, 12, 20 },
- { 0, 17, 9, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 204, 4, 4, 4, 21, 20 },
- { 1, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 204, 4, 4, 4, 21, 20 },
- { 0, 17, 0, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 4, 4, 4, 21, 20 },
- { 1, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 17, 8, 4, 4, 21, 20 },
- { 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 16, 9, 11, 20 },
- { 3, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 16, 9, 11, 20 },
- { 3, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 16, 9, 11, 20 },
- { 3, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 16, 9, 11, 20 },
- { 3, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 16, 9, 11, 20 },
- { 3, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 16, 9, 11, 20 },
- { 3, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 16, 9, 11, 20 },
- { 3, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 16, 9, 11, 20 },
- { 3, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 16, 9, 11, 20 },
- { 3, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 16, 9, 11, 20 },
- { 25, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 12, 20 },
- { 18, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 8, 33, 21 },
- { 0, 17, 0, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 4, 4, 4, 33, 21 },
- { 18, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 80, 8, 0, 8, 33, 21 },
- { 0, 17, 103, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 4, 4, 4, 33, 21 },
- { 0, 17, 9, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 4, 4, 4, 33, 21 },
- { 17, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 8, 33, 21 },
- { 0, 17, 107, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 4, 4, 4, 33, 21 },
- { 25, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 12, 21 },
- { 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 16, 9, 11, 21 },
- { 3, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 16, 9, 11, 21 },
- { 3, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 16, 9, 11, 21 },
- { 3, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 16, 9, 11, 21 },
- { 3, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 16, 9, 11, 21 },
- { 3, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 16, 9, 11, 21 },
- { 3, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 16, 9, 11, 21 },
- { 3, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 16, 9, 11, 21 },
- { 3, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 16, 9, 11, 21 },
- { 3, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 16, 9, 11, 21 },
- { 25, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 17, 21 },
- { 18, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 8, 33, 22 },
- { 0, 17, 0, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 4, 4, 4, 33, 22 },
- { 18, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 80, 8, 0, 8, 33, 22 },
- { 0, 17, 118, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 4, 4, 4, 33, 22 },
- { 17, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 8, 33, 22 },
- { 0, 17, 122, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 4, 4, 4, 33, 22 },
- { 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 16, 9, 11, 22 },
- { 3, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 16, 9, 11, 22 },
- { 3, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 16, 9, 11, 22 },
- { 3, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 16, 9, 11, 22 },
- { 3, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 16, 9, 11, 22 },
- { 3, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 16, 9, 11, 22 },
- { 3, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 16, 9, 11, 22 },
- { 3, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 16, 9, 11, 22 },
- { 3, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 16, 9, 11, 22 },
- { 3, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 16, 9, 11, 22 },
- { 18, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 80, 0, 0, 8, 33, 22 },
- { 18, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 8, 33, 22 },
- { 18, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 10, 8, 12, 23 },
- { 29, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 18, 23 },
- { 25, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 18, 23 },
- { 25, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 12, 23 },
- { 25, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 4, 23 },
- { 25, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 17, 23 },
- { 25, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 80, 0, 0, 0, 4, 23 },
- { 25, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 6, 23 },
- { 29, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 12, 23 },
- { 0, 17, 220, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 4, 4, 4, 21, 23 },
- { 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 16, 9, 11, 23 },
- { 3, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 16, 9, 11, 23 },
- { 3, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 16, 9, 11, 23 },
- { 3, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 16, 9, 11, 23 },
- { 3, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 16, 9, 11, 23 },
- { 3, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 16, 9, 11, 23 },
- { 3, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 16, 9, 11, 23 },
- { 3, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 16, 9, 11, 23 },
- { 3, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 16, 9, 11, 23 },
- { 3, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 16, 9, 11, 23 },
- { 5, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 12, 23 },
- { 29, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 17, 23 },
- { 0, 17, 216, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 4, 4, 4, 21, 23 },
- { 21, 10, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 13, 0, 23 },
- { 22, 10, 0, 0, -1, -1, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 13, 1, 23 },
- { 1, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 8, 4, 4, 21, 23 },
- { 18, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 85, 0, 10, 8, 12, 23 },
- { 18, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 10, 8, 12, 23 },
- { 18, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 10, 8, 12, 23 },
- { 0, 17, 129, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 4, 4, 4, 21, 23 },
- { 0, 17, 130, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 4, 4, 4, 21, 23 },
- { 0, 17, 0, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 85, 4, 4, 4, 21, 23 },
- { 0, 17, 132, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 4, 4, 4, 21, 23 },
- { 0, 17, 0, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 80, 4, 4, 4, 21, 23 },
- { 0, 17, 0, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 4, 4, 4, 21, 23 },
- { 1, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 8, 4, 4, 17, 23 },
- { 0, 17, 230, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 4, 4, 4, 21, 23 },
- { 0, 17, 9, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 4, 4, 4, 21, 23 },
- { 18, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, 0, 0, 10, 8, 12, 23 },
- { 0, 17, 0, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, 0, 4, 4, 4, 21, 23 },
- { 0, 17, 0, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 4, 4, 4, 21, 23 },
- { 29, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 17, 23 },
- { 29, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 12, 23 },
- { 0, 17, 220, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 4, 4, 4, 21, 23 },
- { 29, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 0, 0, 12, 23 },
- { 25, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 18, 23 },
- { 25, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 0, 0, 17, 23 },
- { 25, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 0, 0, 18, 23 },
- { 25, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 0, 0, 12, 23 },
- { 29, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 0, 0, 0, 0, 12, 2 },
- { 25, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, 0, 0, 0, 0, 4, 23 },
- { 18, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 8, 33, 24 },
- { 18, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 0, 8, 33, 24 },
- { 18, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 17, 0, 0, 8, 33, 24 },
- { 1, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 4, 4, 33, 24 },
- { 1, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 4, 4, 33, 24 },
- { 0, 17, 0, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 4, 4, 4, 33, 24 },
- { 0, 17, 0, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 204, 4, 4, 4, 33, 24 },
- { 1, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 8, 4, 4, 33, 24 },
- { 0, 17, 0, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 4, 4, 4, 33, 24 },
- { 0, 17, 7, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 4, 4, 4, 33, 24 },
- { 0, 17, 9, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 4, 4, 4, 33, 24 },
- { 0, 17, 9, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 4, 4, 4, 33, 24 },
- { 1, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 8, 4, 4, 33, 24 },
- { 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 16, 9, 11, 24 },
- { 3, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 16, 9, 11, 24 },
- { 3, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 16, 9, 11, 24 },
- { 3, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 16, 9, 11, 24 },
- { 3, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 16, 9, 11, 24 },
- { 3, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 16, 9, 11, 24 },
- { 3, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 16, 9, 11, 24 },
- { 3, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 16, 9, 11, 24 },
- { 3, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 16, 9, 11, 24 },
- { 3, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 16, 9, 11, 24 },
- { 25, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 12, 17, 24 },
- { 25, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 12, 24 },
- { 0, 17, 220, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 4, 4, 4, 33, 24 },
- { 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 16, 9, 11, 24 },
- { 3, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 16, 9, 11, 24 },
- { 3, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 16, 9, 11, 24 },
- { 3, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 16, 9, 11, 24 },
- { 3, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 16, 9, 11, 24 },
- { 3, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 16, 9, 11, 24 },
- { 3, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 16, 9, 11, 24 },
- { 3, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 16, 9, 11, 24 },
- { 3, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 16, 9, 11, 24 },
- { 3, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 16, 9, 11, 24 },
- { 1, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 0, 0, 4, 4, 33, 24 },
- { 0, 17, 0, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 0, 4, 4, 4, 33, 24 },
- { 29, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 0, 0, 33, 24 },
- { 14, 0, 0, 0, -1, 0, 0, 7264, 0, 0, 0, 0, 0, 7264, 1, 0, 0, 10, 7, 12, 25 },
- { 14, 0, 0, 0, -1, 0, 0, 7264, 0, 0, 0, 0, 0, 7264, 13, 0, 0, 10, 7, 12, 25 },
- { 18, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 10, 8, 12, 25 },
- { 18, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 10, 8, 12, 25 },
- { 18, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 10, 8, 12, 25 },
- { 25, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 12, 2 },
- { 17, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 80, 0, 10, 8, 12, 25 },
- { 18, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 0, 10, 8, 12, 25 },
- { 18, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 9, 10, 8, 25, 26 },
- { 18, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 0, 9, 10, 8, 25, 26 },
- { 18, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 10, 10, 8, 26, 26 },
- { 18, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 204, 10, 10, 8, 26, 26 },
- { 18, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 0, 10, 10, 8, 26, 26 },
- { 18, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 204, 11, 10, 8, 27, 26 },
- { 18, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 11, 10, 8, 27, 26 },
- { 18, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 0, 11, 10, 8, 27, 26 },
- { 18, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 10, 8, 12, 27 },
- { 18, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 10, 8, 12, 27 },
- { 0, 17, 230, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, 0, 4, 4, 4, 21, 27 },
- { 0, 17, 230, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 4, 4, 4, 21, 27 },
- { 25, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 12, 27 },
- { 25, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 17, 27 },
- { 25, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 12, 12, 27 },
- { 25, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 12, 27 },
- { 5, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 12, 27 },
- { 5, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 12, 27 },
- { 5, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 12, 27 },
- { 5, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 12, 27 },
- { 5, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 12, 27 },
- { 5, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 12, 27 },
- { 5, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 12, 27 },
- { 5, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 12, 27 },
- { 5, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 12, 27 },
- { 5, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 12, 27 },
- { 29, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 12, 27 },
- { 14, 0, 0, 0, -1, 0, 1, 39, 0, 0, 0, 0, 0, 0, 4, 0, 0, 10, 7, 12, 28 },
- { 14, 0, 0, 0, -1, 0, 1, 41, 0, 0, 0, 0, 0, 0, 4, 0, 0, 10, 7, 12, 28 },
- { 14, 0, 0, 0, -1, 0, 1, 43, 0, 0, 0, 0, 0, 0, 4, 0, 0, 10, 7, 12, 28 },
- { 14, 0, 0, 0, -1, 0, 1, 45, 0, 0, 0, 0, 0, 0, 4, 0, 0, 10, 7, 12, 28 },
- { 14, 0, 0, 0, -1, 0, 1, 47, 0, 0, 0, 0, 0, 0, 4, 0, 0, 10, 7, 12, 28 },
- { 14, 0, 0, 0, -1, 0, 1, 49, 0, 0, 0, 0, 0, 0, 4, 0, 0, 10, 7, 12, 28 },
- { 14, 0, 0, 0, -1, 0, 1, 51, 0, 0, 0, 0, 0, 0, 4, 0, 0, 10, 7, 12, 28 },
- { 14, 0, 0, 0, -1, 0, 1, 53, 0, 0, 0, 0, 0, 0, 4, 0, 0, 10, 7, 12, 28 },
- { 14, 0, 0, 0, -1, 0, 1, 55, 0, 0, 0, 0, 0, 0, 4, 0, 0, 10, 7, 12, 28 },
- { 14, 0, 0, 0, -1, 0, 1, 57, 0, 0, 0, 0, 0, 0, 4, 0, 0, 10, 7, 12, 28 },
- { 14, 0, 0, 0, -1, 0, 1, 59, 0, 0, 0, 0, 0, 0, 4, 0, 0, 10, 7, 12, 28 },
- { 14, 0, 0, 0, -1, 0, 1, 61, 0, 0, 0, 0, 0, 0, 4, 0, 0, 10, 7, 12, 28 },
- { 14, 0, 0, 0, -1, 0, 1, 63, 0, 0, 0, 0, 0, 0, 4, 0, 0, 10, 7, 12, 28 },
- { 14, 0, 0, 0, -1, 0, 1, 65, 0, 0, 0, 0, 0, 0, 4, 0, 0, 10, 7, 12, 28 },
- { 14, 0, 0, 0, -1, 0, 1, 67, 0, 0, 0, 0, 0, 0, 4, 0, 0, 10, 7, 12, 28 },
- { 14, 0, 0, 0, -1, 0, 1, 69, 0, 0, 0, 0, 0, 0, 4, 0, 0, 10, 7, 12, 28 },
- { 14, 0, 0, 0, -1, 0, 1, 71, 0, 0, 0, 0, 0, 0, 4, 0, 0, 10, 7, 12, 28 },
- { 14, 0, 0, 0, -1, 0, 1, 73, 0, 0, 0, 0, 0, 0, 4, 0, 0, 10, 7, 12, 28 },
- { 14, 0, 0, 0, -1, 0, 1, 75, 0, 0, 0, 0, 0, 0, 4, 0, 0, 10, 7, 12, 28 },
- { 14, 0, 0, 0, -1, 0, 1, 77, 0, 0, 0, 0, 0, 0, 4, 0, 0, 10, 7, 12, 28 },
- { 14, 0, 0, 0, -1, 0, 1, 79, 0, 0, 0, 0, 0, 0, 4, 0, 0, 10, 7, 12, 28 },
- { 14, 0, 0, 0, -1, 0, 1, 81, 0, 0, 0, 0, 0, 0, 4, 0, 0, 10, 7, 12, 28 },
- { 14, 0, 0, 0, -1, 0, 1, 83, 0, 0, 0, 0, 0, 0, 4, 0, 0, 10, 7, 12, 28 },
- { 14, 0, 0, 0, -1, 0, 1, 85, 0, 0, 0, 0, 0, 0, 4, 0, 0, 10, 7, 12, 28 },
- { 14, 0, 0, 0, -1, 0, 1, 87, 0, 0, 0, 0, 0, 0, 4, 0, 0, 10, 7, 12, 28 },
- { 14, 0, 0, 0, -1, 0, 1, 89, 0, 0, 0, 0, 0, 0, 4, 0, 0, 10, 7, 12, 28 },
- { 14, 0, 0, 0, -1, 0, 1, 91, 0, 0, 0, 0, 0, 0, 4, 0, 0, 10, 7, 12, 28 },
- { 14, 0, 0, 0, -1, 0, 1, 93, 0, 0, 0, 0, 0, 0, 4, 0, 0, 10, 7, 12, 28 },
- { 14, 0, 0, 0, -1, 0, 1, 95, 0, 0, 0, 0, 0, 0, 4, 0, 0, 10, 7, 12, 28 },
- { 14, 0, 0, 0, -1, 0, 1, 97, 0, 0, 0, 0, 0, 0, 4, 0, 0, 10, 7, 12, 28 },
- { 14, 0, 0, 0, -1, 0, 1, 99, 0, 0, 0, 0, 0, 0, 4, 0, 0, 10, 7, 12, 28 },
- { 14, 0, 0, 0, -1, 0, 1, 101, 0, 0, 0, 0, 0, 0, 4, 0, 0, 10, 7, 12, 28 },
- { 14, 0, 0, 0, -1, 0, 1, 103, 0, 0, 0, 0, 0, 0, 4, 0, 0, 10, 7, 12, 28 },
- { 14, 0, 0, 0, -1, 0, 1, 105, 0, 0, 0, 0, 0, 0, 4, 0, 0, 10, 7, 12, 28 },
- { 14, 0, 0, 0, -1, 0, 1, 107, 0, 0, 0, 0, 0, 0, 4, 0, 0, 10, 7, 12, 28 },
- { 14, 0, 0, 0, -1, 0, 1, 109, 0, 0, 0, 0, 0, 0, 4, 0, 0, 10, 7, 12, 28 },
- { 14, 0, 0, 0, -1, 0, 1, 111, 0, 0, 0, 0, 0, 0, 4, 0, 0, 10, 7, 12, 28 },
- { 14, 0, 0, 0, -1, 0, 1, 113, 0, 0, 0, 0, 0, 0, 4, 0, 0, 10, 7, 12, 28 },
- { 14, 0, 0, 0, -1, 0, 1, 115, 0, 0, 0, 0, 0, 0, 4, 0, 0, 10, 7, 12, 28 },
- { 14, 0, 0, 0, -1, 0, 1, 117, 0, 0, 0, 0, 0, 0, 4, 0, 0, 10, 7, 12, 28 },
- { 14, 0, 0, 0, -1, 0, 1, 119, 0, 0, 0, 0, 0, 0, 4, 0, 0, 10, 7, 12, 28 },
- { 14, 0, 0, 0, -1, 0, 1, 121, 0, 0, 0, 0, 0, 0, 4, 0, 0, 10, 7, 12, 28 },
- { 14, 0, 0, 0, -1, 0, 1, 123, 0, 0, 0, 0, 0, 0, 4, 0, 0, 10, 7, 12, 28 },
- { 14, 0, 0, 0, -1, 0, 1, 125, 0, 0, 0, 0, 0, 0, 4, 0, 0, 10, 7, 12, 28 },
- { 14, 0, 0, 0, -1, 0, 1, 127, 0, 0, 0, 0, 0, 0, 4, 0, 0, 10, 7, 12, 28 },
- { 14, 0, 0, 0, -1, 0, 1, 129, 0, 0, 0, 0, 0, 0, 4, 0, 0, 10, 7, 12, 28 },
- { 14, 0, 0, 0, -1, 0, 1, 131, 0, 0, 0, 0, 0, 0, 4, 0, 0, 10, 7, 12, 28 },
- { 14, 0, 0, 0, -1, 0, 1, 133, 0, 0, 0, 0, 0, 0, 4, 0, 0, 10, 7, 12, 28 },
- { 14, 0, 0, 0, -1, 0, 1, 135, 0, 0, 0, 0, 0, 0, 4, 0, 0, 10, 7, 12, 28 },
- { 14, 0, 0, 0, -1, 0, 1, 137, 0, 0, 0, 0, 0, 0, 4, 0, 0, 10, 7, 12, 28 },
- { 14, 0, 0, 0, -1, 0, 1, 139, 0, 0, 0, 0, 0, 0, 4, 0, 0, 10, 7, 12, 28 },
- { 14, 0, 0, 0, -1, 0, 1, 141, 0, 0, 0, 0, 0, 0, 4, 0, 0, 10, 7, 12, 28 },
- { 14, 0, 0, 0, -1, 0, 1, 143, 0, 0, 0, 0, 0, 0, 4, 0, 0, 10, 7, 12, 28 },
- { 14, 0, 0, 0, -1, 0, 1, 145, 0, 0, 0, 0, 0, 0, 4, 0, 0, 10, 7, 12, 28 },
- { 14, 0, 0, 0, -1, 0, 1, 147, 0, 0, 0, 0, 0, 0, 4, 0, 0, 10, 7, 12, 28 },
- { 14, 0, 0, 0, -1, 0, 1, 149, 0, 0, 0, 0, 0, 0, 4, 0, 0, 10, 7, 12, 28 },
- { 14, 0, 0, 0, -1, 0, 1, 151, 0, 0, 0, 0, 0, 0, 4, 0, 0, 10, 7, 12, 28 },
- { 14, 0, 0, 0, -1, 0, 1, 153, 0, 0, 0, 0, 0, 0, 4, 0, 0, 10, 7, 12, 28 },
- { 14, 0, 0, 0, -1, 0, 1, 155, 0, 0, 0, 0, 0, 0, 4, 0, 0, 10, 7, 12, 28 },
- { 14, 0, 0, 0, -1, 0, 1, 157, 0, 0, 0, 0, 0, 0, 4, 0, 0, 10, 7, 12, 28 },
- { 14, 0, 0, 0, -1, 0, 1, 159, 0, 0, 0, 0, 0, 0, 4, 0, 0, 10, 7, 12, 28 },
- { 14, 0, 0, 0, -1, 0, 1, 161, 0, 0, 0, 0, 0, 0, 4, 0, 0, 10, 7, 12, 28 },
- { 14, 0, 0, 0, -1, 0, 1, 163, 0, 0, 0, 0, 0, 0, 4, 0, 0, 10, 7, 12, 28 },
- { 14, 0, 0, 0, -1, 0, 1, 165, 0, 0, 0, 0, 0, 0, 4, 0, 0, 10, 7, 12, 28 },
- { 14, 0, 0, 0, -1, 0, 1, 167, 0, 0, 0, 0, 0, 0, 4, 0, 0, 10, 7, 12, 28 },
- { 14, 0, 0, 0, -1, 0, 1, 169, 0, 0, 0, 0, 0, 0, 4, 0, 0, 10, 7, 12, 28 },
- { 14, 0, 0, 0, -1, 0, 1, 171, 0, 0, 0, 0, 0, 0, 4, 0, 0, 10, 7, 12, 28 },
- { 14, 0, 0, 0, -1, 0, 1, 173, 0, 0, 0, 0, 0, 0, 4, 0, 0, 10, 7, 12, 28 },
- { 14, 0, 0, 0, -1, 0, 1, 175, 0, 0, 0, 0, 0, 0, 4, 0, 0, 10, 7, 12, 28 },
- { 14, 0, 0, 0, -1, 0, 1, 177, 0, 0, 0, 0, 0, 0, 4, 0, 0, 10, 7, 12, 28 },
- { 14, 0, 0, 0, -1, 0, 1, 179, 0, 0, 0, 0, 0, 0, 4, 0, 0, 10, 7, 12, 28 },
- { 14, 0, 0, 0, -1, 0, 1, 181, 0, 0, 0, 0, 0, 0, 4, 0, 0, 10, 7, 12, 28 },
- { 14, 0, 0, 0, -1, 0, 1, 183, 0, 0, 0, 0, 0, 0, 4, 0, 0, 10, 7, 12, 28 },
- { 14, 0, 0, 0, -1, 0, 1, 185, 0, 0, 0, 0, 0, 0, 4, 0, 0, 10, 7, 12, 28 },
- { 14, 0, 0, 0, -1, 0, 1, 187, 0, 0, 0, 0, 0, 0, 4, 0, 0, 10, 7, 12, 28 },
- { 14, 0, 0, 0, -1, 0, 1, 189, 0, 0, 0, 0, 0, 0, 4, 0, 0, 10, 7, 12, 28 },
- { 14, 0, 0, 0, -1, 0, 1, 191, 0, 0, 0, 0, 0, 0, 4, 0, 0, 10, 7, 12, 28 },
- { 14, 0, 0, 0, -1, 0, 1, 193, 0, 0, 0, 0, 0, 0, 4, 0, 0, 10, 7, 12, 28 },
- { 14, 0, 0, 0, -1, 0, 1, 195, 0, 0, 0, 0, 0, 0, 4, 0, 0, 10, 7, 12, 28 },
- { 14, 0, 0, 0, -1, 0, 1, 197, 0, 0, 0, 0, 0, 0, 4, 0, 0, 10, 7, 12, 28 },
- { 14, 0, 0, 0, -1, 0, 0, 8, 0, 0, 0, 0, 0, 0, 4, 0, 0, 10, 7, 12, 28 },
- { 14, 0, 0, 0, -1, 0, 0, 8, 0, 0, 0, 0, 0, 0, 17, 0, 0, 10, 7, 12, 28 },
- { 15, 0, 0, 0, -1, 0, 0, 0, 0, -8, 0, -8, 0, -8, 17, 0, 0, 10, 6, 12, 28 },
- { 20, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 0, 0, 0, 0, 17, 29 },
- { 18, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 10, 8, 12, 29 },
- { 25, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 12, 29 },
- { 25, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 12, 12, 29 },
- { 18, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 0, 0, 10, 8, 12, 29 },
- { 6, 9, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 5, 17, 30 },
- { 18, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 10, 8, 12, 30 },
- { 21, 10, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 13, 0, 30 },
- { 22, 10, 0, 0, -1, -1, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 13, 1, 30 },
- { 18, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 10, 8, 12, 31 },
- { 25, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 17, 2 },
- { 4, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 10, 8, 12, 31 },
- { 18, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 10, 8, 12, 31 },
- { 18, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 10, 8, 12, 42 },
- { 0, 17, 0, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, 4, 4, 4, 21, 42 },
- { 0, 17, 9, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, 4, 4, 4, 21, 42 },
- { 18, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 10, 8, 12, 43 },
- { 0, 17, 0, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, 4, 4, 4, 21, 43 },
- { 0, 17, 9, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, 4, 4, 4, 21, 43 },
- { 25, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, 12, 17, 2 },
- { 18, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 10, 8, 12, 44 },
- { 0, 17, 0, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, 4, 4, 4, 21, 44 },
- { 18, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 10, 8, 12, 45 },
- { 0, 17, 0, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, 4, 4, 4, 21, 45 },
- { 18, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 8, 33, 32 },
- { 0, 17, 0, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 4, 4, 4, 33, 32 },
- { 1, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 8, 4, 4, 33, 32 },
- { 0, 17, 9, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 4, 4, 4, 33, 32 },
- { 25, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 17, 32 },
- { 25, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 5, 32 },
- { 17, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 8, 33, 32 },
- { 25, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 12, 32 },
- { 27, 4, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 9, 32 },
- { 0, 17, 230, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 4, 4, 4, 33, 32 },
- { 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 16, 9, 11, 32 },
- { 3, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 16, 9, 11, 32 },
- { 3, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 16, 9, 11, 32 },
- { 3, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 16, 9, 11, 32 },
- { 3, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 16, 9, 11, 32 },
- { 3, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 16, 9, 11, 32 },
- { 3, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 16, 9, 11, 32 },
- { 3, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 16, 9, 11, 32 },
- { 3, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 16, 9, 11, 32 },
- { 3, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 16, 9, 11, 32 },
- { 5, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 12, 32 },
- { 25, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 12, 33 },
- { 25, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 11, 6, 2 },
- { 25, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 12, 6, 2 },
- { 25, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 17, 33 },
- { 25, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 17, 2 },
- { 20, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 18, 33 },
- { 25, 10, 0, 2, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 12, 33 },
- { 25, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 11, 6, 33 },
- { 25, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 12, 6, 33 },
- { 25, 10, 0, 1, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 12, 33 },
- { 0, 17, 0, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 4, 4, 4, 21, 33 },
- { 10, 18, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 3, 6, 4, 4, 33 },
- { 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 16, 9, 11, 33 },
- { 3, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 16, 9, 11, 33 },
- { 3, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 16, 9, 11, 33 },
- { 3, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 16, 9, 11, 33 },
- { 3, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 16, 9, 11, 33 },
- { 3, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 16, 9, 11, 33 },
- { 3, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 16, 9, 11, 33 },
- { 3, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 16, 9, 11, 33 },
- { 3, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 16, 9, 11, 33 },
- { 3, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 16, 9, 11, 33 },
- { 18, 0, 0, 2, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 10, 8, 12, 33 },
- { 17, 0, 0, 2, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 10, 8, 12, 33 },
- { 18, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 10, 8, 12, 33 },
- { 0, 17, 228, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 4, 4, 4, 21, 33 },
- { 18, 0, 0, 2, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 10, 8, 12, 33 },
- { 18, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 10, 8, 12, 47 },
- { 18, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 10, 8, 12, 47 },
- { 0, 17, 0, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 4, 4, 4, 21, 47 },
- { 1, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 8, 4, 4, 21, 47 },
- { 0, 17, 222, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 4, 4, 4, 21, 47 },
- { 0, 17, 230, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 4, 4, 4, 21, 47 },
- { 0, 17, 220, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 4, 4, 4, 21, 47 },
- { 29, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 12, 47 },
- { 25, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 12, 6, 47 },
- { 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 16, 9, 11, 47 },
- { 3, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 16, 9, 11, 47 },
- { 3, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 16, 9, 11, 47 },
- { 3, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 16, 9, 11, 47 },
- { 3, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 16, 9, 11, 47 },
- { 3, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 16, 9, 11, 47 },
- { 3, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 16, 9, 11, 47 },
- { 3, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 16, 9, 11, 47 },
- { 3, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 16, 9, 11, 47 },
- { 3, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 16, 9, 11, 47 },
- { 18, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 8, 33, 48 },
- { 18, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 8, 33, 56 },
- { 18, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 0, 0, 0, 8, 33, 56 },
- { 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 16, 9, 11, 56 },
- { 3, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 16, 9, 11, 56 },
- { 3, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 16, 9, 11, 56 },
- { 3, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 16, 9, 11, 56 },
- { 3, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 16, 9, 11, 56 },
- { 3, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 16, 9, 11, 56 },
- { 3, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 16, 9, 11, 56 },
- { 3, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 16, 9, 11, 56 },
- { 3, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 16, 9, 11, 56 },
- { 3, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 16, 9, 11, 56 },
- { 5, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 0, 0, 0, 0, 33, 56 },
- { 29, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 33, 56 },
- { 29, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 12, 32 },
- { 18, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 10, 8, 12, 55 },
- { 0, 17, 230, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 4, 4, 4, 21, 55 },
- { 0, 17, 220, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 4, 4, 4, 21, 55 },
- { 1, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 8, 4, 4, 21, 55 },
- { 0, 17, 0, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 4, 4, 4, 21, 55 },
- { 25, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 12, 55 },
- { 18, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 0, 0, 0, 8, 33, 78 },
- { 1, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 0, 8, 4, 4, 33, 78 },
- { 0, 17, 0, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 0, 4, 4, 4, 33, 78 },
- { 0, 17, 9, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 0, 4, 4, 4, 33, 78 },
- { 1, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 0, 0, 4, 4, 33, 78 },
- { 0, 17, 230, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 0, 4, 4, 4, 33, 78 },
- { 0, 17, 220, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 0, 4, 4, 4, 21, 78 },
- { 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 0, 0, 16, 9, 11, 78 },
- { 3, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 0, 0, 16, 9, 11, 78 },
- { 3, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 0, 0, 16, 9, 11, 78 },
- { 3, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 0, 0, 16, 9, 11, 78 },
- { 3, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 0, 0, 16, 9, 11, 78 },
- { 3, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 0, 0, 16, 9, 11, 78 },
- { 3, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 0, 0, 16, 9, 11, 78 },
- { 3, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 0, 0, 16, 9, 11, 78 },
- { 3, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 0, 0, 16, 9, 11, 78 },
- { 3, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 0, 0, 16, 9, 11, 78 },
- { 25, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 0, 0, 0, 0, 33, 78 },
- { 17, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 0, 0, 0, 8, 33, 78 },
- { 25, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 0, 0, 0, 12, 33, 78 },
- { 0, 17, 230, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 4, 4, 4, 21, 1 },
- { 0, 17, 220, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 4, 4, 4, 21, 1 },
- { 2, 17, 0, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 4, 4, 4, 21, 1 },
- { 0, 17, 0, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 4, 4, 4, 21, 62 },
- { 1, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 8, 4, 4, 21, 62 },
- { 18, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 10, 8, 12, 62 },
- { 18, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 17, 0, 10, 8, 12, 62 },
- { 0, 17, 7, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 4, 4, 4, 21, 62 },
- { 1, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 204, 8, 4, 4, 21, 62 },
- { 1, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 17, 8, 4, 4, 21, 62 },
- { 1, 0, 9, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 8, 4, 4, 21, 62 },
- { 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 16, 9, 11, 62 },
- { 3, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 16, 9, 11, 62 },
- { 3, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 16, 9, 11, 62 },
- { 3, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 16, 9, 11, 62 },
- { 3, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 16, 9, 11, 62 },
- { 3, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 16, 9, 11, 62 },
- { 3, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 16, 9, 11, 62 },
- { 3, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 16, 9, 11, 62 },
- { 3, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 16, 9, 11, 62 },
- { 3, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 16, 9, 11, 62 },
- { 25, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 12, 17, 62 },
- { 25, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 12, 62 },
- { 25, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 17, 62 },
- { 29, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 12, 62 },
- { 0, 17, 230, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 4, 4, 4, 21, 62 },
- { 0, 17, 220, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 4, 4, 4, 21, 62 },
- { 0, 17, 0, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 4, 4, 4, 21, 67 },
- { 1, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 8, 4, 4, 21, 67 },
- { 18, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 10, 8, 12, 67 },
- { 1, 0, 9, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 8, 4, 4, 21, 67 },
- { 0, 17, 9, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 4, 4, 4, 21, 67 },
- { 0, 17, 0, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 4, 4, 4, 21, 67 },
- { 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 16, 9, 11, 67 },
- { 3, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 16, 9, 11, 67 },
- { 3, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 16, 9, 11, 67 },
- { 3, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 16, 9, 11, 67 },
- { 3, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 16, 9, 11, 67 },
- { 3, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 16, 9, 11, 67 },
- { 3, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 16, 9, 11, 67 },
- { 3, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 16, 9, 11, 67 },
- { 3, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 16, 9, 11, 67 },
- { 3, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 16, 9, 11, 67 },
- { 18, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 0, 10, 8, 12, 67 },
- { 18, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, 0, 0, 10, 8, 12, 93 },
- { 0, 17, 7, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, 0, 4, 4, 4, 21, 93 },
- { 1, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, 0, 8, 4, 4, 21, 93 },
- { 0, 17, 0, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, 0, 4, 4, 4, 21, 93 },
- { 1, 0, 9, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, 0, 8, 4, 4, 21, 93 },
- { 25, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, 0, 0, 0, 0, 12, 93 },
- { 18, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 10, 8, 12, 68 },
- { 1, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 8, 4, 4, 21, 68 },
- { 0, 17, 0, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 4, 4, 4, 21, 68 },
- { 0, 17, 7, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 4, 4, 4, 21, 68 },
- { 25, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 0, 12, 17, 68 },
- { 25, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 0, 0, 17, 68 },
- { 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 16, 9, 11, 68 },
- { 3, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 16, 9, 11, 68 },
- { 3, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 16, 9, 11, 68 },
- { 3, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 16, 9, 11, 68 },
- { 3, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 16, 9, 11, 68 },
- { 3, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 16, 9, 11, 68 },
- { 3, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 16, 9, 11, 68 },
- { 3, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 16, 9, 11, 68 },
- { 3, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 16, 9, 11, 68 },
- { 3, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 16, 9, 11, 68 },
- { 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 16, 9, 11, 69 },
- { 3, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 16, 9, 11, 69 },
- { 3, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 16, 9, 11, 69 },
- { 3, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 16, 9, 11, 69 },
- { 3, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 16, 9, 11, 69 },
- { 3, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 16, 9, 11, 69 },
- { 3, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 16, 9, 11, 69 },
- { 3, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 16, 9, 11, 69 },
- { 3, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 16, 9, 11, 69 },
- { 3, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 16, 9, 11, 69 },
- { 18, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 10, 8, 12, 69 },
- { 17, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 10, 8, 12, 69 },
- { 25, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 0, 12, 17, 69 },
- { 15, 0, 0, 0, -1, 0, 0, 0, 0, -6254, 0, -6254, 0, -6222, 18, 0, 0, 10, 6, 12, 5 },
- { 15, 0, 0, 0, -1, 0, 0, 0, 0, -6253, 0, -6253, 0, -6221, 18, 0, 0, 10, 6, 12, 5 },
- { 15, 0, 0, 0, -1, 0, 0, 0, 0, -6244, 0, -6244, 0, -6212, 18, 0, 0, 10, 6, 12, 5 },
- { 15, 0, 0, 0, -1, 0, 0, 0, 0, -6242, 0, -6242, 0, -6210, 18, 0, 0, 10, 6, 12, 5 },
- { 15, 0, 0, 0, -1, 0, 0, 0, 0, -6243, 0, -6243, 0, -6211, 18, 0, 0, 10, 6, 12, 5 },
- { 15, 0, 0, 0, -1, 0, 0, 0, 0, -6236, 0, -6236, 0, -6204, 18, 0, 0, 10, 6, 12, 5 },
- { 15, 0, 0, 0, -1, 0, 0, 0, 0, -6181, 0, -6181, 0, -6180, 18, 0, 0, 10, 6, 12, 5 },
- { 15, 0, 0, 0, -1, 0, 0, 0, 1, 199, 1, 199, 1, 711, 18, 0, 0, 10, 6, 12, 5 },
- { 25, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 12, 67 },
- { 0, 17, 230, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 0, 4, 4, 4, 21, 1 },
- { 25, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 0, 0, 0, 0, 12, 2 },
- { 0, 17, 1, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 0, 4, 4, 4, 21, 1 },
- { 0, 17, 220, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 0, 4, 4, 4, 21, 1 },
- { 1, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 0, 8, 4, 4, 21, 2 },
- { 18, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 0, 0, 10, 8, 12, 2 },
- { 1, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 8, 4, 4, 21, 2 },
- { 0, 17, 230, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 4, 4, 4, 21, 1 },
- { 18, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 0, 10, 8, 12, 2 },
- { 1, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 8, 4, 4, 21, 2 },
- { 15, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 10, 6, 12, 4 },
- { 15, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 10, 6, 12, 5 },
- { 17, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 80, 0, 10, 6, 12, 3 },
- { 17, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 10, 6, 12, 3 },
- { 17, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 80, 0, 10, 6, 12, 4 },
- { 17, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 80, 0, 10, 6, 12, 5 },
- { 15, 0, 0, 0, -1, 0, 0, 0, 1, 201, 1, 201, 0, 0, 8, 0, 0, 10, 6, 12, 3 },
- { 15, 0, 0, 0, -1, 0, 0, 0, 0, 3814, 0, 3814, 0, 0, 8, 0, 0, 10, 6, 12, 3 },
- { 17, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 80, 0, 10, 6, 12, 3 },
- { 17, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 80, 0, 10, 6, 12, 4 },
- { 0, 17, 230, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 4, 4, 4, 21, 1 },
- { 0, 17, 220, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 4, 4, 4, 21, 1 },
- { 0, 17, 230, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 4, 4, 4, 21, 1 },
- { 0, 17, 234, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 4, 4, 4, 21, 1 },
- { 0, 17, 214, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 4, 4, 4, 21, 1 },
- { 0, 17, 220, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 4, 4, 4, 21, 1 },
- { 0, 17, 202, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 4, 4, 4, 21, 1 },
- { 0, 17, 232, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 4, 4, 4, 21, 1 },
- { 0, 17, 228, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 4, 4, 4, 21, 1 },
- { 0, 17, 220, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 4, 4, 4, 21, 1 },
- { 0, 17, 230, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 18, 0, 4, 4, 4, 21, 1 },
- { 0, 17, 233, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, 0, 4, 4, 4, 21, 1 },
- { 15, 0, 0, 0, -1, 0, 0, 0, 1, 506, 1, 506, 0, 0, 1, 17, 0, 10, 6, 12, 3 },
- { 15, 0, 0, 0, -1, 0, 0, 0, 1, 509, 1, 509, 0, 0, 1, 17, 0, 10, 6, 12, 3 },
- { 15, 0, 0, 0, -1, 0, 0, 0, 1, 512, 1, 512, 0, 0, 1, 17, 0, 10, 6, 12, 3 },
- { 15, 0, 0, 0, -1, 0, 0, 0, 1, 515, 1, 515, 0, 0, 1, 17, 0, 10, 6, 12, 3 },
- { 15, 0, 0, 0, -1, 0, 0, 0, 1, 518, 1, 518, 0, 0, 1, 80, 0, 10, 6, 12, 3 },
- { 15, 0, 0, 0, -1, 0, 0, 0, 0, -59, 0, -59, 0, -58, 2, 81, 0, 10, 6, 12, 3 },
- { 15, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 10, 6, 12, 3 },
- { 14, 0, 0, 0, -1, 0, 0, -7615, 0, 0, 0, 0, 0, -7615, 10, 0, 0, 10, 7, 12, 3 },
- { 14, 0, 0, 0, -1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 10, 0, 0, 10, 7, 12, 3 },
- { 15, 0, 0, 0, -1, 0, 0, 0, 0, -1, 0, -1, 0, 0, 10, 0, 0, 10, 6, 12, 3 },
- { 15, 0, 0, 0, -1, 0, 0, 0, 0, 8, 0, 8, 0, 0, 1, 17, 0, 10, 6, 12, 4 },
- { 14, 0, 0, 0, -1, 0, 0, -8, 0, 0, 0, 0, 0, -8, 1, 17, 0, 10, 7, 12, 4 },
- { 15, 0, 0, 0, -1, 0, 0, 0, 1, 521, 1, 521, 0, 0, 1, 17, 0, 10, 6, 12, 4 },
- { 15, 0, 0, 0, -1, 0, 0, 0, 1, 524, 1, 524, 0, 0, 1, 17, 0, 10, 6, 12, 4 },
- { 15, 0, 0, 0, -1, 0, 0, 0, 1, 528, 1, 528, 0, 0, 1, 17, 0, 10, 6, 12, 4 },
- { 15, 0, 0, 0, -1, 0, 0, 0, 1, 532, 1, 532, 0, 0, 1, 17, 0, 10, 6, 12, 4 },
- { 15, 0, 0, 0, -1, 0, 0, 0, 0, 74, 0, 74, 0, 0, 1, 17, 0, 10, 6, 12, 4 },
- { 15, 0, 0, 0, -1, 0, 0, 0, 0, 74, 0, 74, 0, 0, 1, 85, 0, 10, 6, 12, 4 },
- { 15, 0, 0, 0, -1, 0, 0, 0, 0, 86, 0, 86, 0, 0, 1, 17, 0, 10, 6, 12, 4 },
- { 15, 0, 0, 0, -1, 0, 0, 0, 0, 86, 0, 86, 0, 0, 1, 85, 0, 10, 6, 12, 4 },
- { 15, 0, 0, 0, -1, 0, 0, 0, 0, 100, 0, 100, 0, 0, 1, 17, 0, 10, 6, 12, 4 },
- { 15, 0, 0, 0, -1, 0, 0, 0, 0, 100, 0, 100, 0, 0, 1, 85, 0, 10, 6, 12, 4 },
- { 15, 0, 0, 0, -1, 0, 0, 0, 0, 128, 0, 128, 0, 0, 1, 17, 0, 10, 6, 12, 4 },
- { 15, 0, 0, 0, -1, 0, 0, 0, 0, 128, 0, 128, 0, 0, 1, 85, 0, 10, 6, 12, 4 },
- { 15, 0, 0, 0, -1, 0, 0, 0, 0, 112, 0, 112, 0, 0, 1, 17, 0, 10, 6, 12, 4 },
- { 15, 0, 0, 0, -1, 0, 0, 0, 0, 112, 0, 112, 0, 0, 1, 85, 0, 10, 6, 12, 4 },
- { 15, 0, 0, 0, -1, 0, 0, 0, 0, 126, 0, 126, 0, 0, 1, 17, 0, 10, 6, 12, 4 },
- { 15, 0, 0, 0, -1, 0, 0, 0, 0, 126, 0, 126, 0, 0, 1, 85, 0, 10, 6, 12, 4 },
- { 15, 0, 0, 0, -1, 0, 0, 0, 1, 570, 0, 8, 0, 0, 1, 17, 0, 10, 6, 12, 4 },
- { 15, 0, 0, 0, -1, 0, 0, 0, 1, 573, 0, 8, 0, 0, 1, 17, 0, 10, 6, 12, 4 },
- { 15, 0, 0, 0, -1, 0, 0, 0, 1, 576, 0, 8, 0, 0, 1, 17, 0, 10, 6, 12, 4 },
- { 15, 0, 0, 0, -1, 0, 0, 0, 1, 579, 0, 8, 0, 0, 1, 17, 0, 10, 6, 12, 4 },
- { 15, 0, 0, 0, -1, 0, 0, 0, 1, 582, 0, 8, 0, 0, 1, 17, 0, 10, 6, 12, 4 },
- { 15, 0, 0, 0, -1, 0, 0, 0, 1, 585, 0, 8, 0, 0, 1, 17, 0, 10, 6, 12, 4 },
- { 15, 0, 0, 0, -1, 0, 0, 0, 1, 588, 0, 8, 0, 0, 1, 17, 0, 10, 6, 12, 4 },
- { 15, 0, 0, 0, -1, 0, 0, 0, 1, 591, 0, 8, 0, 0, 1, 17, 0, 10, 6, 12, 4 },
- { 16, 0, 0, 0, -1, 0, 0, -8, 1, 570, 0, 0, 0, -8, 1, 17, 0, 10, 7, 12, 4 },
- { 16, 0, 0, 0, -1, 0, 0, -8, 1, 573, 0, 0, 0, -8, 1, 17, 0, 10, 7, 12, 4 },
- { 16, 0, 0, 0, -1, 0, 0, -8, 1, 576, 0, 0, 0, -8, 1, 17, 0, 10, 7, 12, 4 },
- { 16, 0, 0, 0, -1, 0, 0, -8, 1, 579, 0, 0, 0, -8, 1, 17, 0, 10, 7, 12, 4 },
- { 16, 0, 0, 0, -1, 0, 0, -8, 1, 582, 0, 0, 0, -8, 1, 17, 0, 10, 7, 12, 4 },
- { 16, 0, 0, 0, -1, 0, 0, -8, 1, 585, 0, 0, 0, -8, 1, 17, 0, 10, 7, 12, 4 },
- { 16, 0, 0, 0, -1, 0, 0, -8, 1, 588, 0, 0, 0, -8, 1, 17, 0, 10, 7, 12, 4 },
- { 16, 0, 0, 0, -1, 0, 0, -8, 1, 591, 0, 0, 0, -8, 1, 17, 0, 10, 7, 12, 4 },
- { 15, 0, 0, 0, -1, 0, 0, 0, 1, 594, 0, 8, 0, 0, 1, 17, 0, 10, 6, 12, 4 },
- { 15, 0, 0, 0, -1, 0, 0, 0, 1, 597, 0, 8, 0, 0, 1, 17, 0, 10, 6, 12, 4 },
- { 15, 0, 0, 0, -1, 0, 0, 0, 1, 600, 0, 8, 0, 0, 1, 17, 0, 10, 6, 12, 4 },
- { 15, 0, 0, 0, -1, 0, 0, 0, 1, 603, 0, 8, 0, 0, 1, 17, 0, 10, 6, 12, 4 },
- { 15, 0, 0, 0, -1, 0, 0, 0, 1, 606, 0, 8, 0, 0, 1, 17, 0, 10, 6, 12, 4 },
- { 15, 0, 0, 0, -1, 0, 0, 0, 1, 609, 0, 8, 0, 0, 1, 17, 0, 10, 6, 12, 4 },
- { 15, 0, 0, 0, -1, 0, 0, 0, 1, 612, 0, 8, 0, 0, 1, 17, 0, 10, 6, 12, 4 },
- { 15, 0, 0, 0, -1, 0, 0, 0, 1, 615, 0, 8, 0, 0, 1, 17, 0, 10, 6, 12, 4 },
- { 16, 0, 0, 0, -1, 0, 0, -8, 1, 594, 0, 0, 0, -8, 1, 17, 0, 10, 7, 12, 4 },
- { 16, 0, 0, 0, -1, 0, 0, -8, 1, 597, 0, 0, 0, -8, 1, 17, 0, 10, 7, 12, 4 },
- { 16, 0, 0, 0, -1, 0, 0, -8, 1, 600, 0, 0, 0, -8, 1, 17, 0, 10, 7, 12, 4 },
- { 16, 0, 0, 0, -1, 0, 0, -8, 1, 603, 0, 0, 0, -8, 1, 17, 0, 10, 7, 12, 4 },
- { 16, 0, 0, 0, -1, 0, 0, -8, 1, 606, 0, 0, 0, -8, 1, 17, 0, 10, 7, 12, 4 },
- { 16, 0, 0, 0, -1, 0, 0, -8, 1, 609, 0, 0, 0, -8, 1, 17, 0, 10, 7, 12, 4 },
- { 16, 0, 0, 0, -1, 0, 0, -8, 1, 612, 0, 0, 0, -8, 1, 17, 0, 10, 7, 12, 4 },
- { 16, 0, 0, 0, -1, 0, 0, -8, 1, 615, 0, 0, 0, -8, 1, 17, 0, 10, 7, 12, 4 },
- { 15, 0, 0, 0, -1, 0, 0, 0, 1, 618, 0, 8, 0, 0, 1, 17, 0, 10, 6, 12, 4 },
- { 15, 0, 0, 0, -1, 0, 0, 0, 1, 621, 0, 8, 0, 0, 1, 17, 0, 10, 6, 12, 4 },
- { 15, 0, 0, 0, -1, 0, 0, 0, 1, 624, 0, 8, 0, 0, 1, 17, 0, 10, 6, 12, 4 },
- { 15, 0, 0, 0, -1, 0, 0, 0, 1, 627, 0, 8, 0, 0, 1, 17, 0, 10, 6, 12, 4 },
- { 15, 0, 0, 0, -1, 0, 0, 0, 1, 630, 0, 8, 0, 0, 1, 17, 0, 10, 6, 12, 4 },
- { 15, 0, 0, 0, -1, 0, 0, 0, 1, 633, 0, 8, 0, 0, 1, 17, 0, 10, 6, 12, 4 },
- { 15, 0, 0, 0, -1, 0, 0, 0, 1, 636, 0, 8, 0, 0, 1, 17, 0, 10, 6, 12, 4 },
- { 15, 0, 0, 0, -1, 0, 0, 0, 1, 639, 0, 8, 0, 0, 1, 17, 0, 10, 6, 12, 4 },
- { 16, 0, 0, 0, -1, 0, 0, -8, 1, 618, 0, 0, 0, -8, 1, 17, 0, 10, 7, 12, 4 },
- { 16, 0, 0, 0, -1, 0, 0, -8, 1, 621, 0, 0, 0, -8, 1, 17, 0, 10, 7, 12, 4 },
- { 16, 0, 0, 0, -1, 0, 0, -8, 1, 624, 0, 0, 0, -8, 1, 17, 0, 10, 7, 12, 4 },
- { 16, 0, 0, 0, -1, 0, 0, -8, 1, 627, 0, 0, 0, -8, 1, 17, 0, 10, 7, 12, 4 },
- { 16, 0, 0, 0, -1, 0, 0, -8, 1, 630, 0, 0, 0, -8, 1, 17, 0, 10, 7, 12, 4 },
- { 16, 0, 0, 0, -1, 0, 0, -8, 1, 633, 0, 0, 0, -8, 1, 17, 0, 10, 7, 12, 4 },
- { 16, 0, 0, 0, -1, 0, 0, -8, 1, 636, 0, 0, 0, -8, 1, 17, 0, 10, 7, 12, 4 },
- { 16, 0, 0, 0, -1, 0, 0, -8, 1, 639, 0, 0, 0, -8, 1, 17, 0, 10, 7, 12, 4 },
- { 15, 0, 0, 0, -1, 0, 0, 0, 1, 654, 1, 651, 0, 0, 1, 17, 0, 10, 6, 12, 4 },
- { 15, 0, 0, 0, -1, 0, 0, 0, 1, 642, 0, 9, 0, 0, 1, 17, 0, 10, 6, 12, 4 },
- { 15, 0, 0, 0, -1, 0, 0, 0, 1, 660, 1, 657, 0, 0, 1, 17, 0, 10, 6, 12, 4 },
- { 15, 0, 0, 0, -1, 0, 0, 0, 1, 536, 1, 536, 0, 0, 1, 17, 0, 10, 6, 12, 4 },
- { 15, 0, 0, 0, -1, 0, 0, 0, 1, 691, 1, 687, 0, 0, 1, 17, 0, 10, 6, 12, 4 },
- { 14, 0, 0, 0, -1, 0, 0, -74, 0, 0, 0, 0, 0, -74, 1, 17, 0, 10, 7, 12, 4 },
- { 14, 0, 0, 0, -1, 0, 0, -74, 0, 0, 0, 0, 0, -74, 1, 85, 0, 10, 7, 12, 4 },
- { 16, 0, 0, 0, -1, 0, 0, -9, 1, 642, 0, 0, 0, -9, 1, 17, 0, 10, 7, 12, 4 },
- { 15, 0, 0, 0, -1, 0, 0, 0, 0, -7205, 0, -7205, 0, -7173, 1, 85, 0, 10, 6, 12, 4 },
- { 28, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 81, 0, 0, 0, 12, 4 },
- { 15, 0, 0, 0, -1, 0, 0, 0, 1, 666, 1, 663, 0, 0, 1, 17, 0, 10, 6, 12, 4 },
- { 15, 0, 0, 0, -1, 0, 0, 0, 1, 645, 0, 9, 0, 0, 1, 17, 0, 10, 6, 12, 4 },
- { 15, 0, 0, 0, -1, 0, 0, 0, 1, 672, 1, 669, 0, 0, 1, 17, 0, 10, 6, 12, 4 },
- { 15, 0, 0, 0, -1, 0, 0, 0, 1, 539, 1, 539, 0, 0, 1, 17, 0, 10, 6, 12, 4 },
- { 15, 0, 0, 0, -1, 0, 0, 0, 1, 699, 1, 695, 0, 0, 1, 17, 0, 10, 6, 12, 4 },
- { 14, 0, 0, 0, -1, 0, 0, -86, 0, 0, 0, 0, 0, -86, 1, 17, 0, 10, 7, 12, 4 },
- { 14, 0, 0, 0, -1, 0, 0, -86, 0, 0, 0, 0, 0, -86, 1, 85, 0, 10, 7, 12, 4 },
- { 16, 0, 0, 0, -1, 0, 0, -9, 1, 645, 0, 0, 0, -9, 1, 17, 0, 10, 7, 12, 4 },
- { 15, 0, 0, 0, -1, 0, 0, 0, 1, 542, 1, 542, 0, 0, 1, 17, 0, 10, 6, 12, 4 },
- { 15, 0, 0, 0, -1, 0, 0, 0, 1, 495, 1, 495, 0, 0, 1, 85, 0, 10, 6, 12, 4 },
- { 15, 0, 0, 0, -1, 0, 0, 0, 1, 546, 1, 546, 0, 0, 1, 17, 0, 10, 6, 12, 4 },
- { 15, 0, 0, 0, -1, 0, 0, 0, 1, 549, 1, 549, 0, 0, 1, 17, 0, 10, 6, 12, 4 },
- { 14, 0, 0, 0, -1, 0, 0, -100, 0, 0, 0, 0, 0, -100, 1, 17, 0, 10, 7, 12, 4 },
- { 14, 0, 0, 0, -1, 0, 0, -100, 0, 0, 0, 0, 0, -100, 1, 85, 0, 10, 7, 12, 4 },
- { 15, 0, 0, 0, -1, 0, 0, 0, 1, 553, 1, 553, 0, 0, 1, 17, 0, 10, 6, 12, 4 },
- { 15, 0, 0, 0, -1, 0, 0, 0, 1, 499, 1, 499, 0, 0, 1, 85, 0, 10, 6, 12, 4 },
- { 15, 0, 0, 0, -1, 0, 0, 0, 1, 557, 1, 557, 0, 0, 1, 17, 0, 10, 6, 12, 4 },
- { 15, 0, 0, 0, -1, 0, 0, 0, 0, 7, 0, 7, 0, 0, 1, 17, 0, 10, 6, 12, 4 },
- { 15, 0, 0, 0, -1, 0, 0, 0, 1, 560, 1, 560, 0, 0, 1, 17, 0, 10, 6, 12, 4 },
- { 15, 0, 0, 0, -1, 0, 0, 0, 1, 563, 1, 563, 0, 0, 1, 17, 0, 10, 6, 12, 4 },
- { 14, 0, 0, 0, -1, 0, 0, -112, 0, 0, 0, 0, 0, -112, 1, 17, 0, 10, 7, 12, 4 },
- { 14, 0, 0, 0, -1, 0, 0, -112, 0, 0, 0, 0, 0, -112, 1, 85, 0, 10, 7, 12, 4 },
- { 14, 0, 0, 0, -1, 0, 0, -7, 0, 0, 0, 0, 0, -7, 1, 17, 0, 10, 7, 12, 4 },
- { 28, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 85, 0, 0, 0, 12, 4 },
- { 15, 0, 0, 0, -1, 0, 0, 0, 1, 678, 1, 675, 0, 0, 1, 17, 0, 10, 6, 12, 4 },
- { 15, 0, 0, 0, -1, 0, 0, 0, 1, 648, 0, 9, 0, 0, 1, 17, 0, 10, 6, 12, 4 },
- { 15, 0, 0, 0, -1, 0, 0, 0, 1, 684, 1, 681, 0, 0, 1, 17, 0, 10, 6, 12, 4 },
- { 15, 0, 0, 0, -1, 0, 0, 0, 1, 567, 1, 567, 0, 0, 1, 17, 0, 10, 6, 12, 4 },
- { 15, 0, 0, 0, -1, 0, 0, 0, 1, 707, 1, 703, 0, 0, 1, 17, 0, 10, 6, 12, 4 },
- { 14, 0, 0, 0, -1, 0, 0, -128, 0, 0, 0, 0, 0, -128, 1, 17, 0, 10, 7, 12, 4 },
- { 14, 0, 0, 0, -1, 0, 0, -128, 0, 0, 0, 0, 0, -128, 1, 85, 0, 10, 7, 12, 4 },
- { 14, 0, 0, 0, -1, 0, 0, -126, 0, 0, 0, 0, 0, -126, 1, 17, 0, 10, 7, 12, 4 },
- { 14, 0, 0, 0, -1, 0, 0, -126, 0, 0, 0, 0, 0, -126, 1, 85, 0, 10, 7, 12, 4 },
- { 16, 0, 0, 0, -1, 0, 0, -9, 1, 648, 0, 0, 0, -9, 1, 17, 0, 10, 7, 12, 4 },
- { 28, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 85, 0, 0, 0, 18, 4 },
- { 6, 9, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 85, 0, 0, 5, 17, 2 },
- { 6, 9, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 80, 0, 0, 5, 17, 2 },
- { 6, 9, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 80, 0, 0, 5, 4, 2 },
- { 10, 18, 0, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 3, 0, 4, 20, 2 },
- { 10, 18, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 4, 4, 4, 21, 1 },
- { 10, 18, 0, 1, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 5, 5, 4, 32, 1 },
- { 10, 0, 0, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 3, 6, 4, 21, 2 },
- { 10, 1, 0, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 3, 6, 4, 21, 2 },
- { 20, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 17, 2 },
- { 20, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 80, 0, 0, 0, 4, 2 },
- { 20, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 11, 17, 2 },
- { 20, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 11, 19, 2 },
- { 20, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 12, 2 },
- { 25, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 80, 0, 0, 0, 12, 2 },
- { 23, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 13, 13, 3, 2 },
- { 24, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 13, 13, 3, 2 },
- { 21, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 13, 0, 2 },
- { 23, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 13, 3, 2 },
- { 24, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 13, 3, 2 },
- { 25, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 80, 0, 13, 10, 15, 2 },
- { 25, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 80, 0, 0, 0, 15, 2 },
- { 25, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 14, 0, 17, 2 },
- { 7, 9, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 3, 3, 3, 38, 2 },
- { 8, 7, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 3, 3, 3, 38, 2 },
- { 10, 11, 0, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 3, 6, 4, 21, 2 },
- { 10, 14, 0, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 3, 6, 4, 21, 2 },
- { 10, 16, 0, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 3, 6, 4, 21, 2 },
- { 10, 12, 0, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 3, 6, 4, 21, 2 },
- { 10, 15, 0, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 3, 6, 4, 21, 2 },
- { 6, 6, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 80, 0, 17, 5, 4, 2 },
- { 25, 4, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 80, 0, 0, 0, 10, 2 },
- { 25, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 10, 2 },
- { 25, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 80, 0, 0, 0, 10, 2 },
- { 23, 10, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 13, 3, 2 },
- { 24, 10, 0, 0, -1, -1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 13, 3, 2 },
- { 25, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 80, 0, 0, 12, 5, 2 },
- { 25, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 12, 5, 2 },
- { 26, 6, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 15, 0, 8, 2 },
- { 22, 10, 0, 0, -1, -1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 13, 1, 2 },
- { 25, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 80, 0, 0, 12, 5, 2 },
- { 25, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 80, 0, 0, 12, 5, 2 },
- { 25, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 12, 2 },
- { 25, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 12, 2 },
- { 26, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 12, 2 },
- { 25, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 12, 2 },
- { 19, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 17, 0, 12, 2 },
- { 25, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 12, 2 },
- { 25, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 17, 2 },
- { 25, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 80, 0, 0, 0, 12, 2 },
- { 6, 9, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 80, 0, 0, 5, 17, 2 },
- { 10, 18, 0, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, 3, 6, 4, 22, 2 },
- { 10, 18, 0, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, 3, 6, 4, 12, 2 },
- { 10, 18, 0, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 3, 6, 4, 12, 2 },
- { 13, 18, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 12, 0 },
- { 10, 19, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 3, 6, 4, 21, 2 },
- { 10, 20, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 3, 6, 4, 21, 2 },
- { 10, 21, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 3, 6, 4, 21, 2 },
- { 10, 22, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 3, 6, 4, 21, 2 },
- { 10, 18, 0, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 3, 6, 4, 21, 2 },
- { 5, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 80, 0, 0, 0, 12, 2 },
- { 17, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 80, 0, 10, 6, 12, 3 },
- { 5, 2, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 80, 0, 0, 0, 12, 2 },
- { 5, 2, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 80, 0, 0, 0, 12, 2 },
- { 5, 2, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 80, 0, 0, 0, 12, 2 },
- { 5, 2, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 80, 0, 0, 0, 12, 2 },
- { 5, 2, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 80, 0, 0, 0, 12, 2 },
- { 5, 2, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 80, 0, 0, 0, 12, 2 },
- { 26, 3, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 80, 0, 0, 0, 12, 2 },
- { 26, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 80, 0, 0, 0, 12, 2 },
- { 21, 10, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 80, 0, 0, 13, 0, 2 },
- { 22, 10, 0, 0, -1, -1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 80, 0, 0, 13, 1, 2 },
- { 17, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, 80, 0, 10, 6, 12, 3 },
- { 27, 4, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 80, 0, 0, 0, 9, 2 },
- { 27, 4, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 9, 2 },
- { 27, 4, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 9, 2 },
- { 27, 4, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 9, 2 },
- { 27, 4, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 9, 2 },
- { 27, 4, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 9, 2 },
- { 27, 4, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 0, 0, 0, 0, 10, 2 },
- { 27, 4, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 0, 0, 0, 0, 9, 2 },
- { 27, 4, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, 0, 0, 0, 0, 9, 2 },
- { 27, 4, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, 0, 0, 0, 0, 9, 2 },
- { 27, 4, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 10, 2 },
- { 27, 4, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 9, 2 },
- { 27, 4, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 10, 2 },
- { 27, 4, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 0, 9, 2 },
- { 13, 4, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0 },
- { 2, 17, 0, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 4, 4, 4, 21, 1 },
- { 2, 17, 0, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 4, 4, 4, 21, 1 },
- { 2, 17, 0, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, 4, 4, 4, 21, 1 },
- { 0, 17, 1, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, 4, 4, 4, 21, 1 },
- { 0, 17, 220, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, 4, 4, 4, 21, 1 },
- { 0, 17, 1, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 4, 4, 4, 21, 1 },
- { 29, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 80, 0, 0, 0, 12, 2 },
- { 14, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 80, 0, 10, 7, 12, 2 },
- { 29, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 80, 0, 0, 0, 10, 2 },
- { 15, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 80, 0, 10, 6, 12, 2 },
- { 29, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 80, 0, 0, 0, 9, 2 },
- { 14, 0, 0, 0, -1, 0, 0, -7517, 0, 0, 0, 0, 0, -7517, 1, 85, 0, 10, 7, 12, 4 },
- { 14, 0, 0, 0, -1, 0, 1, 203, 0, 0, 0, 0, 1, 203, 1, 85, 0, 10, 7, 12, 3 },
- { 14, 0, 0, 0, -1, 0, 1, 205, 0, 0, 0, 0, 1, 205, 1, 85, 0, 10, 7, 12, 3 },
- { 29, 4, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 12, 2 },
- { 14, 0, 0, 0, -1, 0, 0, 28, 0, 0, 0, 0, 0, 28, 1, 0, 0, 10, 7, 12, 3 },
- { 18, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 80, 0, 10, 8, 12, 2 },
- { 15, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 80, 0, 10, 6, 12, 2 },
- { 29, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 12, 2 },
- { 29, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 80, 0, 0, 0, 12, 2 },
- { 15, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 80, 0, 10, 6, 12, 2 },
- { 15, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 80, 0, 10, 6, 12, 2 },
- { 14, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 80, 0, 10, 7, 12, 2 },
- { 26, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 80, 0, 0, 0, 12, 2 },
- { 29, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 12, 2 },
- { 29, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 12, 2 },
- { 29, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 12, 2 },
- { 15, 0, 0, 0, -1, 0, 0, 0, 0, -28, 0, -28, 0, 0, 9, 0, 0, 10, 6, 12, 3 },
- { 29, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 0, 0, 12, 2 },
- { 5, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 80, 0, 0, 0, 12, 2 },
- { 4, 0, 0, 0, -1, 0, 0, 16, 0, 0, 0, 0, 0, 16, 1, 80, 0, 10, 7, 12, 3 },
- { 4, 0, 0, 0, -1, 0, 0, 0, 0, -16, 0, -16, 0, 0, 1, 80, 0, 10, 6, 12, 3 },
- { 4, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 10, 8, 12, 3 },
- { 4, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 10, 8, 12, 3 },
- { 29, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 12, 2 },
- { 26, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 17, 0, 0, 0, 12, 2 },
- { 29, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 17, 0, 0, 0, 12, 2 },
- { 26, 10, 0, 0, -1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 12, 2 },
- { 26, 10, 0, 0, -1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 1, 17, 0, 0, 0, 12, 2 },
- { 26, 10, 0, 0, -1, -3, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 12, 2 },
- { 26, 10, 0, 0, -1, -3, 0, 0, 0, 0, 0, 0, 0, 0, 1, 17, 0, 0, 0, 12, 2 },
- { 26, 10, 0, 0, -1, 2016, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 12, 2 },
- { 26, 10, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 12, 2 },
- { 26, 10, 0, 0, -1, -1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 12, 2 },
- { 26, 10, 0, 0, -1, 138, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 12, 2 },
- { 26, 10, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 17, 0, 0, 0, 12, 2 },
- { 26, 10, 0, 0, -1, -1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 17, 0, 0, 0, 12, 2 },
- { 26, 10, 0, 0, -1, 1824, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 12, 2 },
- { 26, 10, 0, 0, -1, 2104, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 12, 2 },
- { 26, 10, 0, 0, -1, 2108, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 12, 2 },
- { 26, 10, 0, 0, -1, 2106, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 12, 2 },
- { 26, 10, 0, 0, -1, -138, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 12, 2 },
- { 26, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 15, 2 },
- { 26, 10, 0, 0, -1, 8, 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 12, 2 },
- { 26, 10, 0, 0, -1, 7, 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 12, 2 },
- { 26, 10, 0, 0, -1, -8, 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 12, 2 },
- { 26, 10, 0, 0, -1, -7, 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 12, 2 },
- { 29, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 14, 2 },
- { 21, 10, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 85, 0, 0, 13, 0, 2 },
- { 22, 10, 0, 0, -1, -1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 85, 0, 0, 13, 1, 2 },
- { 29, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 12, 2 },
- { 29, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 12, 2 },
- { 29, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 12, 2 },
- { 26, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 12, 2 },
- { 29, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 0, 0, 0, 0, 12, 2 },
- { 29, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, 0, 0, 0, 0, 12, 2 },
- { 29, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, 0, 0, 0, 0, 14, 2 },
- { 29, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 12, 2 },
- { 29, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 18, 0, 0, 0, 0, 12, 2 },
- { 29, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 0, 12, 2 },
- { 5, 10, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 80, 0, 0, 0, 12, 2 },
- { 5, 10, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 80, 0, 0, 0, 12, 2 },
- { 5, 10, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 80, 0, 0, 0, 12, 2 },
- { 5, 10, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 80, 0, 0, 0, 12, 2 },
- { 5, 10, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 80, 0, 0, 0, 12, 2 },
- { 5, 10, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 80, 0, 0, 0, 12, 2 },
- { 5, 10, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 80, 0, 0, 0, 12, 2 },
- { 5, 10, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 80, 0, 0, 0, 12, 2 },
- { 5, 10, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 80, 0, 0, 0, 12, 2 },
- { 5, 2, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 80, 0, 0, 0, 12, 2 },
- { 29, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 80, 0, 0, 0, 12, 2 },
- { 29, 0, 0, 0, -1, 0, 0, 26, 0, 0, 0, 0, 0, 26, 1, 80, 0, 10, 7, 12, 2 },
- { 29, 0, 0, 0, -1, 0, 0, 0, 0, -26, 0, -26, 0, 0, 1, 80, 0, 10, 6, 12, 2 },
- { 5, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 80, 0, 0, 0, 12, 2 },
- { 5, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 12, 2 },
- { 5, 10, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 12, 2 },
- { 5, 10, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 12, 2 },
- { 5, 10, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 12, 2 },
- { 5, 10, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 12, 2 },
- { 5, 10, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 12, 2 },
- { 5, 10, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 12, 2 },
- { 5, 10, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 12, 2 },
- { 5, 10, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 12, 2 },
- { 5, 10, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 12, 2 },
- { 5, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 12, 2 },
- { 29, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 14, 2 },
- { 29, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 14, 2 },
- { 29, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 14, 18, 0, 30, 2 },
- { 29, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 16, 20, 0, 12, 2 },
- { 29, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 16, 20, 0, 12, 2 },
- { 29, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 0, 0, 12, 2 },
- { 29, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 12, 2 },
- { 29, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 0, 0, 0, 0, 14, 2 },
- { 29, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 0, 0, 14, 2 },
- { 29, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 0, 14, 18, 0, 30, 2 },
- { 29, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 14, 2 },
- { 29, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 16, 20, 0, 14, 2 },
- { 29, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, 0, 14, 18, 0, 30, 2 },
- { 29, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 13, 3, 2 },
- { 29, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, 0, 0, 0, 13, 3, 2 },
- { 29, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 6, 2 },
- { 21, 10, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, 13, 0, 2 },
- { 22, 10, 0, 0, -1, -1, 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, 13, 1, 2 },
- { 5, 10, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 12, 2 },
- { 5, 10, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 12, 2 },
- { 5, 10, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 12, 2 },
- { 5, 10, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 12, 2 },
- { 5, 10, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 12, 2 },
- { 5, 10, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 12, 2 },
- { 5, 10, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 12, 2 },
- { 5, 10, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 12, 2 },
- { 5, 10, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 12, 2 },
- { 5, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 12, 2 },
- { 26, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 12, 2 },
- { 26, 10, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 12, 2 },
- { 26, 10, 0, 0, -1, -1, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 12, 2 },
- { 21, 10, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 13, 0, 2 },
- { 22, 10, 0, 0, -1, -1, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 13, 1, 2 },
- { 26, 10, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 12, 2 },
- { 26, 10, 0, 0, -1, -1, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 12, 2 },
- { 26, 10, 0, 0, -1, 2, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 12, 2 },
- { 26, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 0, 0, 12, 2 },
- { 26, 10, 0, 0, -1, -2, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 12, 2 },
- { 26, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, 0, 0, 0, 0, 12, 2 },
- { 26, 10, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 12, 2 },
- { 26, 10, 0, 0, -1, -1, 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 12, 2 },
- { 21, 10, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 0, 13, 0, 2 },
- { 22, 10, 0, 0, -1, -1, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 0, 13, 1, 2 },
- { 29, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 12, 54 },
- { 21, 10, 0, 0, -1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, 13, 0, 2 },
- { 22, 10, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, 13, 1, 2 },
- { 21, 10, 0, 0, -1, -1, 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, 13, 0, 2 },
- { 22, 10, 0, 0, -1, -3, 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, 13, 1, 2 },
- { 26, 10, 0, 0, -1, -1824, 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 12, 2 },
- { 26, 10, 0, 0, -1, -2016, 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 12, 2 },
- { 26, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 85, 0, 0, 0, 12, 2 },
- { 26, 10, 0, 0, -1, -2104, 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 12, 2 },
- { 26, 10, 0, 0, -1, -2106, 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 12, 2 },
- { 26, 10, 0, 0, -1, -2108, 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 12, 2 },
- { 14, 0, 0, 0, -1, 0, 0, 48, 0, 0, 0, 0, 0, 48, 8, 0, 0, 10, 7, 12, 57 },
- { 15, 0, 0, 0, -1, 0, 0, 0, 0, -48, 0, -48, 0, 0, 8, 0, 0, 10, 6, 12, 57 },
- { 14, 0, 0, 0, -1, 0, 1, 207, 0, 0, 0, 0, 1, 207, 9, 0, 0, 10, 7, 12, 3 },
- { 14, 0, 0, 0, -1, 0, 0, -3814, 0, 0, 0, 0, 0, -3814, 9, 0, 0, 10, 7, 12, 3 },
- { 14, 0, 0, 0, -1, 0, 1, 209, 0, 0, 0, 0, 1, 209, 9, 0, 0, 10, 7, 12, 3 },
- { 15, 0, 0, 0, -1, 0, 0, 0, 1, 211, 1, 211, 0, 0, 9, 0, 0, 10, 6, 12, 3 },
- { 15, 0, 0, 0, -1, 0, 0, 0, 1, 213, 1, 213, 0, 0, 9, 0, 0, 10, 6, 12, 3 },
- { 14, 0, 0, 0, -1, 0, 1, 215, 0, 0, 0, 0, 1, 215, 10, 0, 0, 10, 7, 12, 3 },
- { 14, 0, 0, 0, -1, 0, 1, 217, 0, 0, 0, 0, 1, 217, 10, 0, 0, 10, 7, 12, 3 },
- { 14, 0, 0, 0, -1, 0, 1, 219, 0, 0, 0, 0, 1, 219, 10, 0, 0, 10, 7, 12, 3 },
- { 14, 0, 0, 0, -1, 0, 1, 221, 0, 0, 0, 0, 1, 221, 11, 0, 0, 10, 7, 12, 3 },
- { 15, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 10, 6, 12, 3 },
- { 17, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 80, 0, 10, 6, 12, 3 },
- { 14, 0, 0, 0, -1, 0, 1, 223, 0, 0, 0, 0, 1, 223, 11, 0, 0, 10, 7, 12, 3 },
- { 14, 0, 0, 0, -1, 0, 1, 225, 0, 0, 0, 0, 1, 225, 11, 0, 0, 10, 7, 12, 3 },
- { 14, 0, 0, 0, -1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 8, 0, 0, 10, 7, 12, 46 },
- { 15, 0, 0, 0, -1, 0, 0, 0, 0, -1, 0, -1, 0, 0, 8, 0, 0, 10, 6, 12, 46 },
- { 15, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 10, 6, 12, 46 },
- { 29, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 12, 46 },
- { 14, 0, 0, 0, -1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 11, 0, 0, 10, 7, 12, 46 },
- { 15, 0, 0, 0, -1, 0, 0, 0, 0, -1, 0, -1, 0, 0, 11, 0, 0, 10, 6, 12, 46 },
- { 0, 17, 230, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 0, 4, 4, 4, 21, 46 },
- { 14, 0, 0, 0, -1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 13, 0, 0, 10, 7, 12, 46 },
- { 15, 0, 0, 0, -1, 0, 0, 0, 0, -1, 0, -1, 0, 0, 13, 0, 0, 10, 6, 12, 46 },
- { 25, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 6, 46 },
- { 25, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 17, 46 },
- { 5, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 12, 46 },
- { 15, 0, 0, 0, -1, 0, 0, 0, 0, -7264, 0, -7264, 0, 0, 8, 0, 0, 10, 6, 12, 25 },
- { 15, 0, 0, 0, -1, 0, 0, 0, 0, -7264, 0, -7264, 0, 0, 13, 0, 0, 10, 6, 12, 25 },
- { 18, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 10, 8, 12, 58 },
- { 18, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 0, 10, 8, 12, 58 },
- { 17, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 80, 0, 10, 8, 12, 58 },
- { 25, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, 0, 0, 0, 0, 17, 58 },
- { 0, 17, 9, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, 0, 4, 4, 4, 21, 58 },
- { 25, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 13, 3, 2 },
- { 23, 10, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 13, 3, 2 },
- { 24, 10, 0, 0, -1, -1, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 13, 3, 2 },
- { 20, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 17, 2 },
- { 25, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 0, 0, 0, 2 },
- { 25, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 0, 0, 17, 2 },
- { 20, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 0, 0, 12, 2 },
- { 25, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 0, 0, 12, 2 },
- { 23, 10, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 0, 13, 3, 2 },
- { 24, 10, 0, 0, -1, -1, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 0, 13, 3, 2 },
- { 25, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 0, 12, 6, 2 },
- { 17, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 10, 8, 12, 2 },
- { 25, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 0, 0, 0, 0, 17, 2 },
- { 25, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 12, 2 },
- { 25, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 17, 2 },
- { 20, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 19, 2 },
- { 25, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 12, 17, 2 },
- { 25, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 17, 2 },
- { 25, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 12, 2 },
- { 20, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 17, 2 },
- { 21, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 13, 0, 2 },
- { 25, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 18, 0, 0, 0, 0, 17, 2 },
- { 25, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 0, 17, 2 },
- { 29, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 14, 37 },
- { 29, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 80, 0, 0, 0, 14, 37 },
- { 29, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 14, 2 },
- { 25, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 11, 1, 2 },
- { 25, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 12, 1, 2 },
- { 25, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 14, 2 },
- { 17, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 10, 8, 5, 37 },
- { 18, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 8, 14, 2 },
- { 4, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 8, 14, 37 },
- { 20, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 5, 2 },
- { 22, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 13, 1, 2 },
- { 0, 17, 218, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 4, 4, 4, 21, 1 },
- { 0, 17, 228, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 4, 4, 4, 21, 1 },
- { 0, 17, 222, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 4, 4, 4, 21, 1 },
- { 1, 0, 224, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 4, 4, 4, 21, 26 },
- { 20, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 14, 2 },
- { 17, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 8, 8, 14, 2 },
- { 17, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 8, 8, 21, 2 },
- { 29, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 80, 0, 0, 0, 14, 2 },
- { 4, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 80, 0, 0, 8, 14, 37 },
- { 17, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 10, 8, 5, 37 },
- { 18, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 10, 8, 5, 2 },
- { 25, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 14, 2 },
- { 18, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 8, 5, 34 },
- { 18, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 8, 14, 34 },
- { 18, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 17, 0, 0, 8, 14, 34 },
- { 18, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, 8, 5, 34 },
- { 0, 17, 8, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 204, 4, 4, 4, 21, 1 },
- { 28, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 80, 0, 8, 0, 5, 2 },
- { 17, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 8, 5, 34 },
- { 17, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 17, 0, 0, 8, 5, 34 },
- { 18, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 80, 0, 0, 8, 14, 34 },
- { 20, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 8, 0, 5, 2 },
- { 18, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 8, 8, 5, 35 },
- { 18, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 8, 8, 14, 35 },
- { 18, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 17, 0, 8, 8, 14, 35 },
- { 25, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 5, 2 },
- { 17, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 8, 8, 5, 2 },
- { 17, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 8, 8, 5, 35 },
- { 17, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 17, 0, 8, 8, 5, 35 },
- { 18, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 80, 0, 8, 8, 14, 35 },
- { 18, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 10, 8, 14, 36 },
- { 18, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 10, 8, 14, 36 },
- { 18, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 10, 8, 14, 36 },
- { 18, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 80, 0, 10, 8, 14, 26 },
- { 29, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 14, 2 },
- { 5, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 80, 0, 0, 0, 14, 2 },
- { 29, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 80, 0, 0, 0, 14, 2 },
- { 18, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 10, 8, 14, 36 },
- { 18, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, 0, 0, 10, 8, 14, 36 },
- { 18, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 8, 8, 5, 35 },
- { 29, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 80, 0, 0, 0, 14, 26 },
- { 29, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 80, 0, 0, 0, 14, 26 },
- { 29, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 80, 0, 0, 0, 14, 2 },
- { 5, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 0, 0, 0, 0, 12, 2 },
- { 29, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 80, 0, 0, 0, 14, 2 },
- { 5, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 80, 0, 0, 0, 14, 2 },
- { 29, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 80, 0, 0, 0, 14, 26 },
- { 29, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 80, 0, 8, 0, 14, 35 },
- { 18, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 8, 14, 37 },
- { 13, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, 0 },
- { 18, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 8, 14, 37 },
- { 18, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 8, 14, 37 },
- { 18, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 0, 8, 14, 37 },
- { 18, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 0, 0, 0, 8, 14, 37 },
- { 18, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 8, 14, 37 },
- { 18, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 8, 14, 37 },
- { 18, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 8, 14, 37 },
- { 18, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 10, 8, 14, 38 },
- { 17, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 10, 8, 5, 38 },
- { 29, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 14, 38 },
- { 29, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 14, 38 },
- { 18, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 0, 0, 10, 8, 12, 83 },
- { 17, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 0, 0, 10, 8, 12, 83 },
- { 25, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 0, 0, 0, 0, 17, 83 },
- { 25, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 0, 0, 0, 12, 17, 83 },
- { 18, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 10, 8, 12, 70 },
- { 17, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 10, 8, 12, 70 },
- { 25, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 0, 0, 17, 70 },
- { 25, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 0, 12, 6, 70 },
- { 25, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 0, 12, 17, 70 },
- { 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 16, 9, 11, 70 },
- { 3, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 16, 9, 11, 70 },
- { 3, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 16, 9, 11, 70 },
- { 3, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 16, 9, 11, 70 },
- { 3, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 16, 9, 11, 70 },
- { 3, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 16, 9, 11, 70 },
- { 3, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 16, 9, 11, 70 },
- { 3, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 16, 9, 11, 70 },
- { 3, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 16, 9, 11, 70 },
- { 3, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 16, 9, 11, 70 },
- { 18, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 10, 8, 12, 5 },
- { 2, 17, 0, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 4, 4, 4, 21, 5 },
- { 25, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 0, 0, 12, 5 },
- { 0, 17, 230, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 4, 4, 4, 21, 5 },
- { 17, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 10, 8, 12, 5 },
- { 17, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 80, 0, 10, 6, 12, 5 },
- { 0, 17, 230, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 4, 4, 4, 21, 5 },
- { 18, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 0, 0, 10, 8, 12, 84 },
- { 4, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 0, 0, 10, 8, 12, 84 },
- { 0, 17, 230, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 0, 4, 4, 4, 21, 84 },
- { 25, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 0, 0, 0, 0, 12, 84 },
- { 25, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 0, 0, 0, 12, 17, 84 },
- { 25, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 0, 0, 0, 0, 17, 84 },
- { 28, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 12, 2 },
- { 17, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 10, 8, 12, 2 },
- { 28, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 10, 0, 12, 2 },
- { 14, 0, 0, 0, -1, 0, 1, 227, 0, 0, 0, 0, 1, 227, 10, 0, 0, 10, 7, 12, 3 },
- { 28, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 10, 0, 12, 2 },
- { 14, 0, 0, 0, -1, 0, 1, 229, 0, 0, 0, 0, 1, 229, 12, 0, 0, 10, 7, 12, 3 },
- { 15, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, 0, 0, 10, 6, 12, 3 },
- { 18, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 10, 8, 12, 3 },
- { 14, 0, 0, 0, -1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 12, 0, 0, 10, 7, 12, 3 },
- { 15, 0, 0, 0, -1, 0, 0, 0, 0, -1, 0, -1, 0, 0, 12, 0, 0, 10, 6, 12, 3 },
- { 14, 0, 0, 0, -1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 13, 0, 0, 10, 7, 12, 3 },
- { 15, 0, 0, 0, -1, 0, 0, 0, 0, -1, 0, -1, 0, 0, 13, 0, 0, 10, 6, 12, 3 },
- { 15, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 10, 6, 12, 3 },
- { 14, 0, 0, 0, -1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 16, 0, 0, 10, 7, 12, 3 },
- { 15, 0, 0, 0, -1, 0, 0, 0, 0, -1, 0, -1, 0, 0, 16, 0, 0, 10, 6, 12, 3 },
- { 14, 0, 0, 0, -1, 0, 1, 231, 0, 0, 0, 0, 1, 231, 13, 0, 0, 10, 7, 12, 3 },
- { 14, 0, 0, 0, -1, 0, 1, 233, 0, 0, 0, 0, 1, 233, 16, 0, 0, 10, 7, 12, 3 },
- { 14, 0, 0, 0, -1, 0, 1, 235, 0, 0, 0, 0, 1, 235, 16, 0, 0, 10, 7, 12, 3 },
- { 14, 0, 0, 0, -1, 0, 1, 237, 0, 0, 0, 0, 1, 237, 16, 0, 0, 10, 7, 12, 3 },
- { 14, 0, 0, 0, -1, 0, 1, 239, 0, 0, 0, 0, 1, 239, 18, 0, 0, 10, 7, 12, 3 },
- { 14, 0, 0, 0, -1, 0, 1, 241, 0, 0, 0, 0, 1, 241, 16, 0, 0, 10, 7, 12, 3 },
- { 14, 0, 0, 0, -1, 0, 1, 243, 0, 0, 0, 0, 1, 243, 16, 0, 0, 10, 7, 12, 3 },
- { 14, 0, 0, 0, -1, 0, 1, 245, 0, 0, 0, 0, 1, 245, 17, 0, 0, 10, 7, 12, 3 },
- { 14, 0, 0, 0, -1, 0, 0, 928, 0, 0, 0, 0, 0, 928, 17, 0, 0, 10, 7, 12, 3 },
- { 14, 0, 0, 0, -1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 17, 0, 0, 10, 7, 12, 3 },
- { 15, 0, 0, 0, -1, 0, 0, 0, 0, -1, 0, -1, 0, 0, 17, 0, 0, 10, 6, 12, 3 },
- { 18, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 10, 8, 12, 3 },
- { 17, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 80, 0, 10, 6, 12, 3 },
- { 18, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 10, 8, 12, 3 },
- { 18, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 10, 8, 12, 59 },
- { 0, 17, 0, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 4, 4, 4, 21, 59 },
- { 0, 17, 9, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 4, 4, 4, 21, 59 },
- { 1, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 8, 4, 4, 21, 59 },
- { 29, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 12, 59 },
- { 29, 4, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 0, 0, 0, 0, 12, 2 },
- { 18, 0, 0, 2, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 10, 8, 12, 65 },
- { 18, 0, 0, 4, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 10, 8, 12, 65 },
- { 18, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 10, 8, 12, 65 },
- { 25, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 18, 65 },
- { 25, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 12, 6, 65 },
- { 1, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 8, 4, 4, 21, 71 },
- { 18, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 10, 8, 12, 71 },
- { 0, 17, 9, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 4, 4, 4, 21, 71 },
- { 0, 17, 0, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 18, 0, 4, 4, 4, 21, 71 },
- { 25, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 0, 12, 17, 71 },
- { 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 16, 9, 11, 71 },
- { 3, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 16, 9, 11, 71 },
- { 3, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 16, 9, 11, 71 },
- { 3, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 16, 9, 11, 71 },
- { 3, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 16, 9, 11, 71 },
- { 3, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 16, 9, 11, 71 },
- { 3, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 16, 9, 11, 71 },
- { 3, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 16, 9, 11, 71 },
- { 3, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 16, 9, 11, 71 },
- { 3, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 16, 9, 11, 71 },
- { 0, 17, 230, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 0, 4, 4, 4, 21, 11 },
- { 25, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 0, 0, 0, 0, 12, 11 },
- { 25, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 18, 11 },
- { 18, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 10, 8, 12, 11 },
- { 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 16, 9, 11, 72 },
- { 3, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 16, 9, 11, 72 },
- { 3, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 16, 9, 11, 72 },
- { 3, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 16, 9, 11, 72 },
- { 3, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 16, 9, 11, 72 },
- { 3, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 16, 9, 11, 72 },
- { 3, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 16, 9, 11, 72 },
- { 3, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 16, 9, 11, 72 },
- { 3, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 16, 9, 11, 72 },
- { 3, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 16, 9, 11, 72 },
- { 18, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 10, 8, 12, 72 },
- { 0, 17, 0, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 4, 4, 4, 21, 72 },
- { 0, 17, 220, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 4, 4, 4, 21, 72 },
- { 25, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 0, 0, 17, 2 },
- { 25, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 0, 12, 17, 72 },
- { 18, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 10, 8, 12, 73 },
- { 0, 17, 0, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 4, 4, 4, 21, 73 },
- { 1, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 8, 4, 4, 21, 73 },
- { 1, 0, 9, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 8, 4, 4, 21, 73 },
- { 25, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 0, 0, 12, 73 },
- { 0, 17, 0, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 0, 4, 4, 4, 21, 85 },
- { 1, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 0, 8, 4, 4, 21, 85 },
- { 18, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 0, 0, 10, 8, 12, 85 },
- { 0, 17, 7, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 0, 4, 4, 4, 21, 85 },
- { 1, 0, 9, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 0, 8, 4, 4, 21, 85 },
- { 25, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 0, 0, 0, 0, 12, 85 },
- { 25, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 0, 0, 0, 0, 17, 85 },
- { 25, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 0, 0, 0, 12, 17, 85 },
- { 17, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 0, 0, 10, 8, 12, 2 },
- { 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 0, 0, 16, 9, 11, 85 },
- { 3, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 0, 0, 16, 9, 11, 85 },
- { 3, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 0, 0, 16, 9, 11, 85 },
- { 3, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 0, 0, 16, 9, 11, 85 },
- { 3, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 0, 0, 16, 9, 11, 85 },
- { 3, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 0, 0, 16, 9, 11, 85 },
- { 3, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 0, 0, 16, 9, 11, 85 },
- { 3, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 0, 0, 16, 9, 11, 85 },
- { 3, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 0, 0, 16, 9, 11, 85 },
- { 3, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 0, 0, 16, 9, 11, 85 },
- { 18, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 8, 33, 24 },
- { 0, 17, 0, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 4, 4, 4, 33, 24 },
- { 17, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 8, 33, 24 },
- { 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 16, 9, 11, 24 },
- { 3, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 16, 9, 11, 24 },
- { 3, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 16, 9, 11, 24 },
- { 3, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 16, 9, 11, 24 },
- { 3, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 16, 9, 11, 24 },
- { 3, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 16, 9, 11, 24 },
- { 3, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 16, 9, 11, 24 },
- { 3, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 16, 9, 11, 24 },
- { 3, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 16, 9, 11, 24 },
- { 3, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 16, 9, 11, 24 },
- { 18, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 10, 8, 12, 77 },
- { 0, 17, 0, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 4, 4, 4, 21, 77 },
- { 1, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 8, 4, 4, 21, 77 },
- { 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 16, 9, 11, 77 },
- { 3, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 16, 9, 11, 77 },
- { 3, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 16, 9, 11, 77 },
- { 3, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 16, 9, 11, 77 },
- { 3, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 16, 9, 11, 77 },
- { 3, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 16, 9, 11, 77 },
- { 3, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 16, 9, 11, 77 },
- { 3, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 16, 9, 11, 77 },
- { 3, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 16, 9, 11, 77 },
- { 3, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 16, 9, 11, 77 },
- { 25, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 0, 0, 12, 77 },
- { 25, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 0, 12, 17, 77 },
- { 18, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 0, 0, 0, 8, 33, 24 },
- { 17, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 0, 0, 0, 8, 33, 24 },
- { 29, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 0, 0, 0, 0, 33, 24 },
- { 1, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 4, 4, 33, 24 },
- { 18, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 0, 0, 0, 8, 33, 79 },
- { 0, 17, 230, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 0, 4, 4, 4, 33, 79 },
- { 0, 17, 220, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 0, 4, 4, 4, 33, 79 },
- { 17, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 0, 0, 0, 8, 33, 79 },
- { 25, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 0, 0, 0, 0, 33, 79 },
- { 18, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 0, 10, 8, 12, 86 },
- { 1, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 8, 4, 4, 21, 86 },
- { 0, 17, 0, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 4, 4, 4, 21, 86 },
- { 25, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 12, 17, 86 },
- { 17, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 0, 10, 8, 12, 86 },
- { 0, 17, 9, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 4, 4, 4, 21, 86 },
- { 18, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, 0, 0, 10, 8, 12, 27 },
- { 15, 0, 0, 0, -1, 0, 0, 0, 0, -928, 0, -928, 0, 0, 16, 0, 0, 10, 6, 12, 3 },
- { 28, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 10, 0, 12, 2 },
- { 17, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 80, 0, 10, 6, 12, 3 },
- { 15, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 10, 6, 12, 3 },
- { 15, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 10, 6, 12, 4 },
- { 15, 0, 0, 0, -1, 0, 0, 0, 1, 247, 1, 247, 1, 247, 17, 0, 0, 10, 6, 12, 28 },
- { 15, 0, 0, 0, -1, 0, 0, 0, 1, 249, 1, 249, 1, 249, 17, 0, 0, 10, 6, 12, 28 },
- { 15, 0, 0, 0, -1, 0, 0, 0, 1, 251, 1, 251, 1, 251, 17, 0, 0, 10, 6, 12, 28 },
- { 15, 0, 0, 0, -1, 0, 0, 0, 1, 253, 1, 253, 1, 253, 17, 0, 0, 10, 6, 12, 28 },
- { 15, 0, 0, 0, -1, 0, 0, 0, 1, 255, 1, 255, 1, 255, 17, 0, 0, 10, 6, 12, 28 },
- { 15, 0, 0, 0, -1, 0, 0, 0, 1, 257, 1, 257, 1, 257, 17, 0, 0, 10, 6, 12, 28 },
- { 15, 0, 0, 0, -1, 0, 0, 0, 1, 259, 1, 259, 1, 259, 17, 0, 0, 10, 6, 12, 28 },
- { 15, 0, 0, 0, -1, 0, 0, 0, 1, 261, 1, 261, 1, 261, 17, 0, 0, 10, 6, 12, 28 },
- { 15, 0, 0, 0, -1, 0, 0, 0, 1, 263, 1, 263, 1, 263, 17, 0, 0, 10, 6, 12, 28 },
- { 15, 0, 0, 0, -1, 0, 0, 0, 1, 265, 1, 265, 1, 265, 17, 0, 0, 10, 6, 12, 28 },
- { 15, 0, 0, 0, -1, 0, 0, 0, 1, 267, 1, 267, 1, 267, 17, 0, 0, 10, 6, 12, 28 },
- { 15, 0, 0, 0, -1, 0, 0, 0, 1, 269, 1, 269, 1, 269, 17, 0, 0, 10, 6, 12, 28 },
- { 15, 0, 0, 0, -1, 0, 0, 0, 1, 271, 1, 271, 1, 271, 17, 0, 0, 10, 6, 12, 28 },
- { 15, 0, 0, 0, -1, 0, 0, 0, 1, 273, 1, 273, 1, 273, 17, 0, 0, 10, 6, 12, 28 },
- { 15, 0, 0, 0, -1, 0, 0, 0, 1, 275, 1, 275, 1, 275, 17, 0, 0, 10, 6, 12, 28 },
- { 15, 0, 0, 0, -1, 0, 0, 0, 1, 277, 1, 277, 1, 277, 17, 0, 0, 10, 6, 12, 28 },
- { 15, 0, 0, 0, -1, 0, 0, 0, 1, 279, 1, 279, 1, 279, 17, 0, 0, 10, 6, 12, 28 },
- { 15, 0, 0, 0, -1, 0, 0, 0, 1, 281, 1, 281, 1, 281, 17, 0, 0, 10, 6, 12, 28 },
- { 15, 0, 0, 0, -1, 0, 0, 0, 1, 283, 1, 283, 1, 283, 17, 0, 0, 10, 6, 12, 28 },
- { 15, 0, 0, 0, -1, 0, 0, 0, 1, 285, 1, 285, 1, 285, 17, 0, 0, 10, 6, 12, 28 },
- { 15, 0, 0, 0, -1, 0, 0, 0, 1, 287, 1, 287, 1, 287, 17, 0, 0, 10, 6, 12, 28 },
- { 15, 0, 0, 0, -1, 0, 0, 0, 1, 289, 1, 289, 1, 289, 17, 0, 0, 10, 6, 12, 28 },
- { 15, 0, 0, 0, -1, 0, 0, 0, 1, 291, 1, 291, 1, 291, 17, 0, 0, 10, 6, 12, 28 },
- { 15, 0, 0, 0, -1, 0, 0, 0, 1, 293, 1, 293, 1, 293, 17, 0, 0, 10, 6, 12, 28 },
- { 15, 0, 0, 0, -1, 0, 0, 0, 1, 295, 1, 295, 1, 295, 17, 0, 0, 10, 6, 12, 28 },
- { 15, 0, 0, 0, -1, 0, 0, 0, 1, 297, 1, 297, 1, 297, 17, 0, 0, 10, 6, 12, 28 },
- { 15, 0, 0, 0, -1, 0, 0, 0, 1, 299, 1, 299, 1, 299, 17, 0, 0, 10, 6, 12, 28 },
- { 15, 0, 0, 0, -1, 0, 0, 0, 1, 301, 1, 301, 1, 301, 17, 0, 0, 10, 6, 12, 28 },
- { 15, 0, 0, 0, -1, 0, 0, 0, 1, 303, 1, 303, 1, 303, 17, 0, 0, 10, 6, 12, 28 },
- { 15, 0, 0, 0, -1, 0, 0, 0, 1, 305, 1, 305, 1, 305, 17, 0, 0, 10, 6, 12, 28 },
- { 15, 0, 0, 0, -1, 0, 0, 0, 1, 307, 1, 307, 1, 307, 17, 0, 0, 10, 6, 12, 28 },
- { 15, 0, 0, 0, -1, 0, 0, 0, 1, 309, 1, 309, 1, 309, 17, 0, 0, 10, 6, 12, 28 },
- { 15, 0, 0, 0, -1, 0, 0, 0, 1, 311, 1, 311, 1, 311, 17, 0, 0, 10, 6, 12, 28 },
- { 15, 0, 0, 0, -1, 0, 0, 0, 1, 313, 1, 313, 1, 313, 17, 0, 0, 10, 6, 12, 28 },
- { 15, 0, 0, 0, -1, 0, 0, 0, 1, 315, 1, 315, 1, 315, 17, 0, 0, 10, 6, 12, 28 },
- { 15, 0, 0, 0, -1, 0, 0, 0, 1, 317, 1, 317, 1, 317, 17, 0, 0, 10, 6, 12, 28 },
- { 15, 0, 0, 0, -1, 0, 0, 0, 1, 319, 1, 319, 1, 319, 17, 0, 0, 10, 6, 12, 28 },
- { 15, 0, 0, 0, -1, 0, 0, 0, 1, 321, 1, 321, 1, 321, 17, 0, 0, 10, 6, 12, 28 },
- { 15, 0, 0, 0, -1, 0, 0, 0, 1, 323, 1, 323, 1, 323, 17, 0, 0, 10, 6, 12, 28 },
- { 15, 0, 0, 0, -1, 0, 0, 0, 1, 325, 1, 325, 1, 325, 17, 0, 0, 10, 6, 12, 28 },
- { 15, 0, 0, 0, -1, 0, 0, 0, 1, 327, 1, 327, 1, 327, 17, 0, 0, 10, 6, 12, 28 },
- { 15, 0, 0, 0, -1, 0, 0, 0, 1, 329, 1, 329, 1, 329, 17, 0, 0, 10, 6, 12, 28 },
- { 15, 0, 0, 0, -1, 0, 0, 0, 1, 331, 1, 331, 1, 331, 17, 0, 0, 10, 6, 12, 28 },
- { 15, 0, 0, 0, -1, 0, 0, 0, 1, 333, 1, 333, 1, 333, 17, 0, 0, 10, 6, 12, 28 },
- { 15, 0, 0, 0, -1, 0, 0, 0, 1, 335, 1, 335, 1, 335, 17, 0, 0, 10, 6, 12, 28 },
- { 15, 0, 0, 0, -1, 0, 0, 0, 1, 337, 1, 337, 1, 337, 17, 0, 0, 10, 6, 12, 28 },
- { 15, 0, 0, 0, -1, 0, 0, 0, 1, 339, 1, 339, 1, 339, 17, 0, 0, 10, 6, 12, 28 },
- { 15, 0, 0, 0, -1, 0, 0, 0, 1, 341, 1, 341, 1, 341, 17, 0, 0, 10, 6, 12, 28 },
- { 15, 0, 0, 0, -1, 0, 0, 0, 1, 343, 1, 343, 1, 343, 17, 0, 0, 10, 6, 12, 28 },
- { 15, 0, 0, 0, -1, 0, 0, 0, 1, 345, 1, 345, 1, 345, 17, 0, 0, 10, 6, 12, 28 },
- { 15, 0, 0, 0, -1, 0, 0, 0, 1, 347, 1, 347, 1, 347, 17, 0, 0, 10, 6, 12, 28 },
- { 15, 0, 0, 0, -1, 0, 0, 0, 1, 349, 1, 349, 1, 349, 17, 0, 0, 10, 6, 12, 28 },
- { 15, 0, 0, 0, -1, 0, 0, 0, 1, 351, 1, 351, 1, 351, 17, 0, 0, 10, 6, 12, 28 },
- { 15, 0, 0, 0, -1, 0, 0, 0, 1, 353, 1, 353, 1, 353, 17, 0, 0, 10, 6, 12, 28 },
- { 15, 0, 0, 0, -1, 0, 0, 0, 1, 355, 1, 355, 1, 355, 17, 0, 0, 10, 6, 12, 28 },
- { 15, 0, 0, 0, -1, 0, 0, 0, 1, 357, 1, 357, 1, 357, 17, 0, 0, 10, 6, 12, 28 },
- { 15, 0, 0, 0, -1, 0, 0, 0, 1, 359, 1, 359, 1, 359, 17, 0, 0, 10, 6, 12, 28 },
- { 15, 0, 0, 0, -1, 0, 0, 0, 1, 361, 1, 361, 1, 361, 17, 0, 0, 10, 6, 12, 28 },
- { 15, 0, 0, 0, -1, 0, 0, 0, 1, 363, 1, 363, 1, 363, 17, 0, 0, 10, 6, 12, 28 },
- { 15, 0, 0, 0, -1, 0, 0, 0, 1, 365, 1, 365, 1, 365, 17, 0, 0, 10, 6, 12, 28 },
- { 15, 0, 0, 0, -1, 0, 0, 0, 1, 367, 1, 367, 1, 367, 17, 0, 0, 10, 6, 12, 28 },
- { 15, 0, 0, 0, -1, 0, 0, 0, 1, 369, 1, 369, 1, 369, 17, 0, 0, 10, 6, 12, 28 },
- { 15, 0, 0, 0, -1, 0, 0, 0, 1, 371, 1, 371, 1, 371, 17, 0, 0, 10, 6, 12, 28 },
- { 15, 0, 0, 0, -1, 0, 0, 0, 1, 373, 1, 373, 1, 373, 17, 0, 0, 10, 6, 12, 28 },
- { 15, 0, 0, 0, -1, 0, 0, 0, 1, 375, 1, 375, 1, 375, 17, 0, 0, 10, 6, 12, 28 },
- { 15, 0, 0, 0, -1, 0, 0, 0, 1, 377, 1, 377, 1, 377, 17, 0, 0, 10, 6, 12, 28 },
- { 15, 0, 0, 0, -1, 0, 0, 0, 1, 379, 1, 379, 1, 379, 17, 0, 0, 10, 6, 12, 28 },
- { 15, 0, 0, 0, -1, 0, 0, 0, 1, 381, 1, 381, 1, 381, 17, 0, 0, 10, 6, 12, 28 },
- { 15, 0, 0, 0, -1, 0, 0, 0, 1, 383, 1, 383, 1, 383, 17, 0, 0, 10, 6, 12, 28 },
- { 15, 0, 0, 0, -1, 0, 0, 0, 1, 385, 1, 385, 1, 385, 17, 0, 0, 10, 6, 12, 28 },
- { 15, 0, 0, 0, -1, 0, 0, 0, 1, 387, 1, 387, 1, 387, 17, 0, 0, 10, 6, 12, 28 },
- { 15, 0, 0, 0, -1, 0, 0, 0, 1, 389, 1, 389, 1, 389, 17, 0, 0, 10, 6, 12, 28 },
- { 15, 0, 0, 0, -1, 0, 0, 0, 1, 391, 1, 391, 1, 391, 17, 0, 0, 10, 6, 12, 28 },
- { 15, 0, 0, 0, -1, 0, 0, 0, 1, 393, 1, 393, 1, 393, 17, 0, 0, 10, 6, 12, 28 },
- { 15, 0, 0, 0, -1, 0, 0, 0, 1, 395, 1, 395, 1, 395, 17, 0, 0, 10, 6, 12, 28 },
- { 15, 0, 0, 0, -1, 0, 0, 0, 1, 397, 1, 397, 1, 397, 17, 0, 0, 10, 6, 12, 28 },
- { 15, 0, 0, 0, -1, 0, 0, 0, 1, 399, 1, 399, 1, 399, 17, 0, 0, 10, 6, 12, 28 },
- { 15, 0, 0, 0, -1, 0, 0, 0, 1, 401, 1, 401, 1, 401, 17, 0, 0, 10, 6, 12, 28 },
- { 15, 0, 0, 0, -1, 0, 0, 0, 1, 403, 1, 403, 1, 403, 17, 0, 0, 10, 6, 12, 28 },
- { 15, 0, 0, 0, -1, 0, 0, 0, 1, 405, 1, 405, 1, 405, 17, 0, 0, 10, 6, 12, 28 },
- { 18, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 0, 0, 10, 8, 12, 86 },
- { 1, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 0, 8, 4, 4, 21, 86 },
- { 0, 17, 0, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 0, 4, 4, 4, 21, 86 },
- { 25, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 0, 0, 0, 12, 17, 86 },
- { 0, 17, 9, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 0, 4, 4, 4, 21, 86 },
- { 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 0, 0, 16, 9, 11, 86 },
- { 3, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 0, 0, 16, 9, 11, 86 },
- { 3, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 0, 0, 16, 9, 11, 86 },
- { 3, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 0, 0, 16, 9, 11, 86 },
- { 3, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 0, 0, 16, 9, 11, 86 },
- { 3, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 0, 0, 16, 9, 11, 86 },
- { 3, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 0, 0, 16, 9, 11, 86 },
- { 3, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 0, 0, 16, 9, 11, 86 },
- { 3, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 0, 0, 16, 9, 11, 86 },
- { 3, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 0, 0, 16, 9, 11, 86 },
- { 18, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 17, 12, 10, 8, 23, 26 },
- { 18, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 17, 13, 10, 8, 24, 26 },
- { 11, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 3, 0, 0, 34, 0 },
- { 12, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 12, 0 },
- { 18, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 85, 0, 0, 8, 14, 37 },
- { 18, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 85, 0, 0, 8, 14, 37 },
- { 18, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 85, 0, 0, 8, 14, 37 },
- { 18, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 85, 0, 0, 8, 14, 37 },
- { 18, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 85, 0, 0, 8, 14, 37 },
- { 15, 0, 0, 0, -1, 0, 0, 0, 1, 419, 1, 416, 0, 0, 1, 80, 0, 10, 6, 12, 3 },
- { 15, 0, 0, 0, -1, 0, 0, 0, 1, 425, 1, 422, 0, 0, 1, 80, 0, 10, 6, 12, 3 },
- { 15, 0, 0, 0, -1, 0, 0, 0, 1, 431, 1, 428, 0, 0, 1, 80, 0, 10, 6, 12, 3 },
- { 15, 0, 0, 0, -1, 0, 0, 0, 1, 438, 1, 434, 0, 0, 1, 80, 0, 10, 6, 12, 3 },
- { 15, 0, 0, 0, -1, 0, 0, 0, 1, 446, 1, 442, 0, 0, 1, 80, 0, 10, 6, 12, 3 },
- { 15, 0, 0, 0, -1, 0, 0, 0, 1, 453, 1, 450, 0, 0, 1, 80, 0, 10, 6, 12, 3 },
- { 15, 0, 0, 0, -1, 0, 0, 0, 1, 465, 1, 462, 0, 0, 1, 80, 0, 10, 6, 12, 6 },
- { 15, 0, 0, 0, -1, 0, 0, 0, 1, 471, 1, 468, 0, 0, 1, 80, 0, 10, 6, 12, 6 },
- { 15, 0, 0, 0, -1, 0, 0, 0, 1, 477, 1, 474, 0, 0, 1, 80, 0, 10, 6, 12, 6 },
- { 15, 0, 0, 0, -1, 0, 0, 0, 1, 483, 1, 480, 0, 0, 1, 80, 0, 10, 6, 12, 6 },
- { 15, 0, 0, 0, -1, 0, 0, 0, 1, 489, 1, 486, 0, 0, 1, 80, 0, 10, 6, 12, 6 },
- { 18, 1, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 85, 0, 9, 8, 13, 7 },
- { 0, 17, 26, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 4, 4, 4, 21, 7 },
- { 18, 1, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 85, 0, 9, 8, 13, 7 },
- { 18, 1, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 80, 0, 9, 8, 13, 7 },
- { 26, 3, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 80, 0, 0, 0, 12, 7 },
- { 18, 13, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 80, 0, 10, 8, 12, 8 },
- { 28, 13, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, 0, 0, 0, 0, 12, 8 },
- { 13, 18, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 12, 0 },
- { 27, 13, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 80, 0, 0, 0, 10, 8 },
- { 0, 17, 0, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, 4, 4, 4, 21, 1 },
- { 25, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 80, 0, 15, 11, 8, 2 },
- { 25, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 80, 0, 0, 11, 1, 2 },
- { 25, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 80, 0, 0, 0, 1, 2 },
- { 25, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 80, 0, 14, 11, 8, 2 },
- { 25, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 80, 0, 15, 0, 8, 2 },
- { 25, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 80, 0, 0, 0, 6, 2 },
- { 21, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 80, 0, 0, 13, 0, 2 },
- { 22, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 80, 0, 0, 13, 1, 2 },
- { 25, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 80, 0, 0, 0, 15, 2 },
- { 25, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 80, 0, 0, 0, 14, 2 },
- { 20, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 80, 0, 0, 11, 14, 2 },
- { 19, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 80, 0, 17, 0, 14, 2 },
- { 21, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 80, 0, 0, 13, 0, 2 },
- { 22, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 80, 0, 0, 13, 1, 2 },
- { 21, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 80, 0, 0, 13, 0, 2 },
- { 22, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 80, 0, 0, 13, 1, 2 },
- { 25, 6, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 80, 0, 15, 11, 1, 2 },
- { 25, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 80, 0, 0, 11, 14, 2 },
- { 25, 6, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 80, 0, 13, 10, 1, 2 },
- { 25, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 80, 0, 15, 0, 5, 2 },
- { 25, 6, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 80, 0, 14, 11, 5, 2 },
- { 25, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 80, 0, 0, 12, 6, 2 },
- { 25, 4, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 80, 0, 0, 0, 14, 2 },
- { 26, 3, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 80, 0, 0, 0, 14, 2 },
- { 20, 3, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 80, 0, 0, 11, 14, 2 },
- { 26, 10, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 80, 0, 0, 0, 14, 2 },
- { 26, 10, 0, 0, -1, -1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 80, 0, 0, 0, 14, 2 },
- { 26, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 80, 0, 0, 0, 14, 2 },
- { 18, 13, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 10, 8, 12, 8 },
- { 10, 18, 0, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 3, 6, 4, 22, 2 },
- { 25, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 80, 0, 13, 0, 14, 2 },
- { 25, 6, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 80, 0, 0, 0, 14, 2 },
- { 3, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 80, 0, 0, 0, 14, 2 },
- { 3, 2, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 80, 0, 0, 0, 14, 2 },
- { 3, 2, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 80, 0, 0, 0, 14, 2 },
- { 3, 2, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 80, 0, 0, 0, 14, 2 },
- { 3, 2, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 80, 0, 0, 0, 14, 2 },
- { 3, 2, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 80, 0, 0, 0, 14, 2 },
- { 3, 2, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 80, 0, 0, 0, 14, 2 },
- { 3, 2, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 80, 0, 0, 0, 14, 2 },
- { 3, 2, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 80, 0, 0, 0, 14, 2 },
- { 3, 2, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 80, 0, 0, 0, 14, 2 },
- { 26, 10, 0, 0, -1, 2, 0, 0, 0, 0, 0, 0, 0, 0, 1, 80, 0, 0, 0, 14, 2 },
- { 26, 10, 0, 0, -1, -2, 0, 0, 0, 0, 0, 0, 0, 0, 1, 80, 0, 0, 0, 14, 2 },
- { 14, 0, 0, 0, -1, 0, 0, 32, 0, 0, 0, 0, 0, 32, 1, 80, 0, 10, 7, 14, 3 },
- { 21, 10, 0, 0, -1, 2, 0, 0, 0, 0, 0, 0, 0, 0, 1, 80, 0, 0, 13, 0, 2 },
- { 22, 10, 0, 0, -1, -2, 0, 0, 0, 0, 0, 0, 0, 0, 1, 80, 0, 0, 13, 1, 2 },
- { 28, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 80, 0, 0, 0, 14, 2 },
- { 15, 0, 0, 0, -1, 0, 0, 0, 0, -32, 0, -32, 0, 0, 1, 80, 0, 10, 6, 14, 3 },
- { 21, 10, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 6, 80, 0, 0, 13, 0, 2 },
- { 22, 10, 0, 0, -1, -1, 0, 0, 0, 0, 0, 0, 0, 0, 6, 80, 0, 0, 13, 1, 2 },
- { 25, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 80, 0, 0, 12, 1, 2 },
- { 25, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 80, 0, 0, 11, 1, 2 },
- { 25, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 80, 0, 0, 0, 5, 2 },
- { 18, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 80, 0, 8, 8, 14, 35 },
- { 18, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 80, 0, 8, 8, 5, 35 },
- { 17, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 80, 0, 8, 8, 5, 2 },
- { 17, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 80, 4, 4, 4, 5, 2 },
- { 27, 4, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 80, 0, 0, 0, 10, 2 },
- { 10, 10, 0, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 3, 6, 4, 21, 2 },
- { 29, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 29, 2 },
- { 13, 18, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 12, 0 },
- { 18, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 10, 8, 12, 49 },
- { 25, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 17, 2 },
- { 25, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 17, 2 },
- { 5, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 12, 2 },
- { 29, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 12, 2 },
- { 4, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 10, 8, 12, 4 },
- { 5, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 12, 4 },
- { 29, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 12, 4 },
- { 5, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 12, 4 },
- { 29, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 12, 4 },
- { 29, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 18, 0, 0, 0, 0, 12, 4 },
- { 18, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 10, 8, 12, 74 },
- { 18, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 10, 8, 12, 75 },
- { 5, 2, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 12, 2 },
- { 18, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 0, 0, 10, 8, 12, 39 },
- { 18, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 10, 8, 12, 39 },
- { 5, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 12, 39 },
- { 18, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 10, 8, 12, 39 },
- { 18, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 0, 0, 10, 8, 12, 40 },
- { 4, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 0, 0, 10, 8, 12, 40 },
- { 18, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 10, 8, 12, 120 },
- { 0, 17, 230, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 4, 4, 4, 21, 120 },
- { 18, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 10, 8, 12, 50 },
- { 25, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 17, 50 },
- { 18, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 10, 8, 12, 60 },
- { 25, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 17, 60 },
- { 4, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 10, 8, 12, 60 },
- { 14, 0, 0, 0, -1, 0, 0, 40, 0, 0, 0, 0, 0, 40, 5, 0, 0, 10, 7, 12, 41 },
- { 14, 0, 0, 0, -1, 0, 0, 40, 0, 0, 0, 0, 0, 40, 7, 0, 0, 10, 7, 12, 41 },
- { 15, 0, 0, 0, -1, 0, 0, 0, 0, -40, 0, -40, 0, 0, 5, 0, 0, 10, 6, 12, 41 },
- { 15, 0, 0, 0, -1, 0, 0, 0, 0, -40, 0, -40, 0, 0, 7, 0, 0, 10, 6, 12, 41 },
- { 18, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 10, 8, 12, 51 },
- { 18, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 10, 8, 12, 52 },
- { 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 16, 9, 11, 52 },
- { 3, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 16, 9, 11, 52 },
- { 3, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 16, 9, 11, 52 },
- { 3, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 16, 9, 11, 52 },
- { 3, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 16, 9, 11, 52 },
- { 3, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 16, 9, 11, 52 },
- { 3, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 16, 9, 11, 52 },
- { 3, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 16, 9, 11, 52 },
- { 3, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 16, 9, 11, 52 },
- { 3, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 16, 9, 11, 52 },
- { 14, 0, 0, 0, -1, 0, 0, 40, 0, 0, 0, 0, 0, 40, 18, 0, 0, 10, 7, 12, 136 },
- { 15, 0, 0, 0, -1, 0, 0, 0, 0, -40, 0, -40, 0, 0, 18, 0, 0, 10, 6, 12, 136 },
- { 18, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 10, 8, 12, 106 },
- { 18, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 10, 8, 12, 103 },
- { 25, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 12, 103 },
- { 18, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 10, 8, 12, 110 },
- { 18, 1, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 10, 8, 12, 53 },
- { 18, 1, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 0, 0, 10, 8, 12, 87 },
- { 25, 1, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 0, 0, 0, 0, 17, 87 },
- { 5, 1, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 0, 0, 0, 0, 12, 87 },
- { 18, 1, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 10, 8, 12, 118 },
- { 29, 1, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 12, 118 },
- { 5, 1, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 12, 118 },
- { 18, 1, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 10, 8, 12, 117 },
- { 5, 1, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 12, 117 },
- { 18, 1, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 10, 8, 12, 128 },
- { 5, 1, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 12, 128 },
- { 18, 1, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 10, 8, 12, 64 },
- { 5, 1, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 12, 64 },
- { 5, 1, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 0, 0, 0, 0, 12, 64 },
- { 25, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 17, 64 },
- { 18, 1, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 10, 8, 12, 76 },
- { 25, 1, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 0, 0, 12, 76 },
- { 18, 1, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 0, 10, 8, 12, 98 },
- { 18, 1, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 0, 10, 8, 12, 97 },
- { 5, 1, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 12, 97 },
- { 18, 1, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 10, 8, 12, 61 },
- { 0, 17, 0, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 4, 4, 4, 21, 61 },
- { 0, 17, 220, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 4, 4, 4, 21, 61 },
- { 0, 17, 230, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 4, 4, 4, 21, 61 },
- { 0, 17, 1, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 4, 4, 4, 21, 61 },
- { 0, 17, 9, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 4, 4, 4, 21, 61 },
- { 5, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 12, 61 },
- { 5, 1, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 12, 61 },
- { 5, 1, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 12, 61 },
- { 5, 1, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 12, 61 },
- { 5, 1, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 12, 61 },
- { 25, 1, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 17, 61 },
- { 25, 1, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 12, 17, 61 },
- { 25, 1, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 12, 61 },
- { 18, 1, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 0, 0, 10, 8, 12, 88 },
- { 5, 1, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 0, 0, 0, 0, 12, 88 },
- { 25, 1, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 0, 0, 0, 0, 12, 88 },
- { 18, 1, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 10, 8, 12, 116 },
- { 5, 1, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 12, 116 },
- { 18, 1, 0, 2, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 10, 8, 12, 112 },
- { 18, 1, 0, 3, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 10, 8, 12, 112 },
- { 18, 1, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 10, 8, 12, 112 },
- { 29, 1, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 12, 112 },
- { 18, 1, 0, 4, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 10, 8, 12, 112 },
- { 0, 17, 230, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 4, 4, 4, 21, 112 },
- { 0, 17, 220, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 4, 4, 4, 21, 112 },
- { 5, 1, 0, 2, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 12, 112 },
- { 5, 1, 0, 3, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 12, 112 },
- { 25, 1, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 17, 112 },
- { 25, 1, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 15, 112 },
- { 18, 1, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 0, 0, 10, 8, 12, 80 },
- { 25, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 0, 0, 0, 0, 17, 80 },
- { 18, 1, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 0, 0, 10, 8, 12, 89 },
- { 5, 1, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 0, 0, 0, 0, 12, 89 },
- { 18, 1, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 0, 0, 10, 8, 12, 90 },
- { 5, 1, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 0, 0, 0, 0, 12, 90 },
- { 18, 1, 0, 2, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 10, 8, 12, 121 },
- { 18, 1, 0, 3, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 10, 8, 12, 121 },
- { 25, 1, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 12, 121 },
- { 5, 1, 0, 3, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 12, 121 },
- { 5, 1, 0, 2, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 12, 121 },
- { 5, 1, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 12, 121 },
- { 18, 1, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 0, 0, 10, 8, 12, 91 },
- { 14, 1, 0, 0, -1, 0, 0, 64, 0, 0, 0, 0, 0, 64, 17, 0, 0, 10, 7, 12, 130 },
- { 15, 1, 0, 0, -1, 0, 0, 0, 0, -64, 0, -64, 0, 0, 17, 0, 0, 10, 6, 12, 130 },
- { 5, 1, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 12, 130 },
- { 5, 5, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 0, 0, 0, 0, 12, 8 },
- { 5, 5, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 0, 0, 0, 0, 12, 8 },
- { 5, 5, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 0, 0, 0, 0, 12, 8 },
- { 5, 5, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 0, 0, 0, 0, 12, 8 },
- { 5, 5, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 0, 0, 0, 0, 12, 8 },
- { 5, 5, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 0, 0, 0, 0, 12, 8 },
- { 5, 5, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 0, 0, 0, 0, 12, 8 },
- { 5, 5, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 0, 0, 0, 0, 12, 8 },
- { 5, 5, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 0, 0, 0, 0, 12, 8 },
- { 5, 5, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 0, 0, 0, 0, 12, 8 },
- { 1, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, 0, 8, 4, 4, 21, 94 },
- { 0, 17, 0, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, 0, 4, 4, 4, 21, 94 },
- { 18, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, 0, 0, 10, 8, 12, 94 },
- { 0, 17, 9, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, 0, 4, 4, 4, 21, 94 },
- { 25, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, 0, 0, 0, 12, 17, 94 },
- { 25, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, 0, 0, 0, 0, 12, 94 },
- { 5, 10, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, 0, 0, 0, 0, 12, 94 },
- { 5, 10, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, 0, 0, 0, 0, 12, 94 },
- { 5, 10, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, 0, 0, 0, 0, 12, 94 },
- { 5, 10, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, 0, 0, 0, 0, 12, 94 },
- { 5, 10, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, 0, 0, 0, 0, 12, 94 },
- { 5, 10, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, 0, 0, 0, 0, 12, 94 },
- { 5, 10, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, 0, 0, 0, 0, 12, 94 },
- { 5, 10, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, 0, 0, 0, 0, 12, 94 },
- { 5, 10, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, 0, 0, 0, 0, 12, 94 },
- { 5, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, 0, 0, 0, 0, 12, 94 },
- { 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, 0, 0, 16, 9, 11, 94 },
- { 3, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, 0, 0, 16, 9, 11, 94 },
- { 3, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, 0, 0, 16, 9, 11, 94 },
- { 3, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, 0, 0, 16, 9, 11, 94 },
- { 3, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, 0, 0, 16, 9, 11, 94 },
- { 3, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, 0, 0, 16, 9, 11, 94 },
- { 3, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, 0, 0, 16, 9, 11, 94 },
- { 3, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, 0, 0, 16, 9, 11, 94 },
- { 3, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, 0, 0, 16, 9, 11, 94 },
- { 3, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, 0, 0, 16, 9, 11, 94 },
- { 0, 17, 9, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 4, 4, 4, 21, 94 },
- { 0, 17, 0, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 0, 4, 4, 4, 21, 92 },
- { 1, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 0, 8, 4, 4, 21, 92 },
- { 18, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 0, 0, 10, 8, 12, 92 },
- { 18, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 17, 0, 10, 8, 12, 92 },
- { 0, 17, 9, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 0, 4, 4, 4, 21, 92 },
- { 0, 17, 7, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 204, 4, 4, 4, 21, 92 },
- { 25, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 0, 0, 0, 0, 12, 92 },
- { 10, 0, 0, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 0, 7, 6, 4, 12, 92 },
- { 25, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 0, 0, 0, 12, 17, 92 },
- { 18, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 0, 10, 8, 12, 101 },
- { 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 0, 16, 9, 11, 101 },
- { 3, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 0, 16, 9, 11, 101 },
- { 3, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 0, 16, 9, 11, 101 },
- { 3, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 0, 16, 9, 11, 101 },
- { 3, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 0, 16, 9, 11, 101 },
- { 3, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 0, 16, 9, 11, 101 },
- { 3, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 0, 16, 9, 11, 101 },
- { 3, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 0, 16, 9, 11, 101 },
- { 3, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 0, 16, 9, 11, 101 },
- { 3, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 0, 16, 9, 11, 101 },
- { 0, 17, 230, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 4, 4, 4, 21, 96 },
- { 18, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 0, 10, 8, 12, 96 },
- { 0, 17, 0, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 204, 4, 4, 4, 21, 96 },
- { 0, 17, 0, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 4, 4, 4, 21, 96 },
- { 1, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 8, 4, 4, 21, 96 },
- { 0, 17, 0, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 17, 4, 4, 4, 21, 96 },
- { 0, 17, 9, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 4, 4, 4, 21, 96 },
- { 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 0, 16, 9, 11, 96 },
- { 3, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 0, 16, 9, 11, 96 },
- { 3, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 0, 16, 9, 11, 96 },
- { 3, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 0, 16, 9, 11, 96 },
- { 3, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 0, 16, 9, 11, 96 },
- { 3, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 0, 16, 9, 11, 96 },
- { 3, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 0, 16, 9, 11, 96 },
- { 3, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 0, 16, 9, 11, 96 },
- { 3, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 0, 16, 9, 11, 96 },
- { 3, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 0, 16, 9, 11, 96 },
- { 25, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 17, 96 },
- { 25, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 12, 17, 96 },
- { 18, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 10, 8, 12, 111 },
- { 0, 17, 7, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 4, 4, 4, 21, 111 },
- { 25, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 12, 111 },
- { 25, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 18, 111 },
- { 0, 17, 0, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 4, 4, 4, 21, 100 },
- { 1, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 8, 4, 4, 21, 100 },
- { 18, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 0, 10, 8, 12, 100 },
- { 1, 0, 9, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 8, 4, 4, 21, 100 },
- { 18, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 7, 10, 8, 12, 100 },
- { 25, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 12, 17, 100 },
- { 25, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 12, 100 },
- { 25, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 17, 100 },
- { 25, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 12, 100 },
- { 0, 17, 7, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 4, 4, 4, 21, 100 },
- { 0, 17, 0, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 4, 4, 4, 21, 100 },
- { 25, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 12, 12, 100 },
- { 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 0, 16, 9, 11, 100 },
- { 3, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 0, 16, 9, 11, 100 },
- { 3, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 0, 16, 9, 11, 100 },
- { 3, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 0, 16, 9, 11, 100 },
- { 3, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 0, 16, 9, 11, 100 },
- { 3, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 0, 16, 9, 11, 100 },
- { 3, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 0, 16, 9, 11, 100 },
- { 3, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 0, 16, 9, 11, 100 },
- { 3, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 0, 16, 9, 11, 100 },
- { 3, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 0, 16, 9, 11, 100 },
- { 18, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 10, 8, 12, 100 },
- { 25, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 18, 100 },
- { 18, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 10, 8, 12, 100 },
- { 25, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 17, 100 },
- { 25, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 12, 17, 100 },
- { 5, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 12, 20 },
- { 18, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 10, 8, 12, 109 },
- { 1, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 8, 4, 4, 21, 109 },
- { 0, 17, 0, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 4, 4, 4, 21, 109 },
- { 1, 0, 9, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 8, 4, 4, 21, 109 },
- { 0, 17, 7, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 4, 4, 4, 21, 109 },
- { 25, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 12, 17, 109 },
- { 25, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 12, 109 },
- { 0, 17, 0, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 18, 0, 4, 4, 4, 21, 109 },
- { 18, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 10, 8, 12, 129 },
- { 25, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 12, 17, 129 },
- { 18, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 10, 8, 12, 123 },
- { 0, 17, 0, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 4, 4, 4, 21, 123 },
- { 1, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 8, 4, 4, 21, 123 },
- { 0, 17, 7, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 4, 4, 4, 21, 123 },
- { 0, 17, 9, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 4, 4, 4, 21, 123 },
- { 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 16, 9, 11, 123 },
- { 3, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 16, 9, 11, 123 },
- { 3, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 16, 9, 11, 123 },
- { 3, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 16, 9, 11, 123 },
- { 3, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 16, 9, 11, 123 },
- { 3, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 16, 9, 11, 123 },
- { 3, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 16, 9, 11, 123 },
- { 3, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 16, 9, 11, 123 },
- { 3, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 16, 9, 11, 123 },
- { 3, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 16, 9, 11, 123 },
- { 0, 17, 0, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 4, 4, 4, 21, 107 },
- { 0, 17, 0, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 4, 4, 4, 21, 107 },
- { 1, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 8, 4, 4, 21, 107 },
- { 18, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 10, 8, 12, 107 },
- { 0, 17, 7, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 4, 4, 4, 21, 107 },
- { 1, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 204, 4, 4, 4, 21, 107 },
- { 1, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 17, 8, 4, 4, 21, 107 },
- { 1, 0, 9, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 8, 4, 4, 21, 107 },
- { 18, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 10, 8, 12, 107 },
- { 0, 17, 230, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 4, 4, 4, 21, 107 },
- { 18, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 18, 0, 0, 10, 8, 12, 135 },
- { 1, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 18, 0, 8, 4, 4, 21, 135 },
- { 0, 17, 0, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 18, 0, 4, 4, 4, 21, 135 },
- { 0, 17, 9, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 18, 0, 4, 4, 4, 21, 135 },
- { 0, 17, 7, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 18, 0, 4, 4, 4, 21, 135 },
- { 25, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 18, 0, 0, 0, 12, 17, 135 },
- { 25, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 18, 0, 0, 0, 0, 17, 135 },
- { 25, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 18, 0, 0, 0, 0, 12, 135 },
- { 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 18, 0, 0, 16, 9, 11, 135 },
- { 3, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 18, 0, 0, 16, 9, 11, 135 },
- { 3, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 18, 0, 0, 16, 9, 11, 135 },
- { 3, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 18, 0, 0, 16, 9, 11, 135 },
- { 3, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 18, 0, 0, 16, 9, 11, 135 },
- { 3, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 18, 0, 0, 16, 9, 11, 135 },
- { 3, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 18, 0, 0, 16, 9, 11, 135 },
- { 3, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 18, 0, 0, 16, 9, 11, 135 },
- { 3, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 18, 0, 0, 16, 9, 11, 135 },
- { 3, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 18, 0, 0, 16, 9, 11, 135 },
- { 18, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 10, 8, 12, 124 },
- { 1, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 204, 4, 4, 4, 21, 124 },
- { 1, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 8, 4, 4, 21, 124 },
- { 0, 17, 0, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 4, 4, 4, 21, 124 },
- { 0, 17, 0, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 204, 4, 4, 4, 21, 124 },
- { 1, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 17, 8, 4, 4, 21, 124 },
- { 0, 17, 9, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 4, 4, 4, 21, 124 },
- { 0, 17, 7, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 4, 4, 4, 21, 124 },
- { 25, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 12, 124 },
- { 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 16, 9, 11, 124 },
- { 3, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 16, 9, 11, 124 },
- { 3, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 16, 9, 11, 124 },
- { 3, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 16, 9, 11, 124 },
- { 3, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 16, 9, 11, 124 },
- { 3, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 16, 9, 11, 124 },
- { 3, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 16, 9, 11, 124 },
- { 3, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 16, 9, 11, 124 },
- { 3, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 16, 9, 11, 124 },
- { 3, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 16, 9, 11, 124 },
- { 18, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 10, 8, 12, 122 },
- { 1, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 204, 4, 4, 4, 21, 122 },
- { 1, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 8, 4, 4, 21, 122 },
- { 0, 17, 0, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 4, 4, 4, 21, 122 },
- { 1, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 17, 8, 4, 4, 21, 122 },
- { 0, 17, 9, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 4, 4, 4, 21, 122 },
- { 0, 17, 7, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 4, 4, 4, 21, 122 },
- { 25, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 18, 122 },
- { 25, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 12, 17, 122 },
- { 25, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 6, 122 },
- { 25, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 12, 122 },
- { 25, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 12, 17, 122 },
- { 18, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 10, 8, 12, 122 },
- { 0, 17, 0, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 4, 4, 4, 21, 122 },
- { 18, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 10, 8, 12, 114 },
- { 1, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 8, 4, 4, 21, 114 },
- { 0, 17, 0, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 4, 4, 4, 21, 114 },
- { 0, 17, 9, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 4, 4, 4, 21, 114 },
- { 25, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 12, 17, 114 },
- { 25, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 12, 114 },
- { 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 16, 9, 11, 114 },
- { 3, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 16, 9, 11, 114 },
- { 3, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 16, 9, 11, 114 },
- { 3, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 16, 9, 11, 114 },
- { 3, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 16, 9, 11, 114 },
- { 3, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 16, 9, 11, 114 },
- { 3, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 16, 9, 11, 114 },
- { 3, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 16, 9, 11, 114 },
- { 3, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 16, 9, 11, 114 },
- { 3, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 16, 9, 11, 114 },
- { 25, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 18, 0, 0, 0, 0, 18, 33 },
- { 18, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 0, 10, 8, 12, 102 },
- { 0, 17, 0, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 4, 4, 4, 21, 102 },
- { 1, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 8, 4, 4, 21, 102 },
- { 1, 0, 9, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 8, 4, 4, 21, 102 },
- { 0, 17, 7, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 4, 4, 4, 21, 102 },
- { 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 0, 16, 9, 11, 102 },
- { 3, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 0, 16, 9, 11, 102 },
- { 3, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 0, 16, 9, 11, 102 },
- { 3, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 0, 16, 9, 11, 102 },
- { 3, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 0, 16, 9, 11, 102 },
- { 3, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 0, 16, 9, 11, 102 },
- { 3, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 0, 16, 9, 11, 102 },
- { 3, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 0, 16, 9, 11, 102 },
- { 3, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 0, 16, 9, 11, 102 },
- { 3, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 0, 16, 9, 11, 102 },
- { 18, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 8, 33, 126 },
- { 0, 17, 0, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 4, 4, 4, 33, 126 },
- { 1, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 8, 4, 4, 33, 126 },
- { 0, 17, 9, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 4, 4, 4, 33, 126 },
- { 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 16, 9, 11, 126 },
- { 3, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 16, 9, 11, 126 },
- { 3, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 16, 9, 11, 126 },
- { 3, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 16, 9, 11, 126 },
- { 3, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 16, 9, 11, 126 },
- { 3, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 16, 9, 11, 126 },
- { 3, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 16, 9, 11, 126 },
- { 3, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 16, 9, 11, 126 },
- { 3, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 16, 9, 11, 126 },
- { 3, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 16, 9, 11, 126 },
- { 5, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 33, 126 },
- { 25, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 12, 17, 126 },
- { 29, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 33, 126 },
- { 14, 0, 0, 0, -1, 0, 0, 32, 0, 0, 0, 0, 0, 32, 16, 0, 0, 10, 7, 12, 125 },
- { 15, 0, 0, 0, -1, 0, 0, 0, 0, -32, 0, -32, 0, 0, 16, 0, 0, 10, 6, 12, 125 },
- { 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 16, 9, 11, 125 },
- { 3, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 16, 9, 11, 125 },
- { 3, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 16, 9, 11, 125 },
- { 3, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 16, 9, 11, 125 },
- { 3, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 16, 9, 11, 125 },
- { 3, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 16, 9, 11, 125 },
- { 3, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 16, 9, 11, 125 },
- { 3, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 16, 9, 11, 125 },
- { 3, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 16, 9, 11, 125 },
- { 3, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 16, 9, 11, 125 },
- { 5, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 12, 125 },
- { 18, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 10, 8, 12, 125 },
- { 18, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 10, 8, 12, 141 },
- { 0, 17, 0, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 4, 4, 4, 21, 141 },
- { 1, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 8, 4, 4, 21, 141 },
- { 0, 17, 9, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 4, 4, 4, 21, 141 },
- { 18, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 7, 10, 8, 12, 141 },
- { 25, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 0, 18, 141 },
- { 25, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 0, 12, 141 },
- { 25, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 0, 17, 141 },
- { 25, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 12, 17, 141 },
- { 18, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 10, 8, 12, 140 },
- { 0, 17, 0, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 4, 4, 4, 21, 140 },
- { 1, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 8, 4, 4, 21, 140 },
- { 18, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 7, 10, 8, 12, 140 },
- { 0, 17, 9, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 4, 4, 4, 21, 140 },
- { 25, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 0, 17, 140 },
- { 25, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 12, 17, 140 },
- { 25, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 0, 18, 140 },
- { 18, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 10, 8, 12, 119 },
- { 18, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 18, 0, 0, 10, 8, 12, 133 },
- { 1, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 18, 0, 8, 4, 4, 21, 133 },
- { 0, 17, 0, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 18, 0, 4, 4, 4, 21, 133 },
- { 0, 0, 9, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 18, 0, 4, 4, 4, 21, 133 },
- { 25, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 18, 0, 0, 0, 12, 17, 133 },
- { 25, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 18, 0, 0, 0, 0, 17, 133 },
- { 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 18, 0, 0, 16, 9, 11, 133 },
- { 3, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 18, 0, 0, 16, 9, 11, 133 },
- { 3, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 18, 0, 0, 16, 9, 11, 133 },
- { 3, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 18, 0, 0, 16, 9, 11, 133 },
- { 3, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 18, 0, 0, 16, 9, 11, 133 },
- { 3, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 18, 0, 0, 16, 9, 11, 133 },
- { 3, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 18, 0, 0, 16, 9, 11, 133 },
- { 3, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 18, 0, 0, 16, 9, 11, 133 },
- { 3, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 18, 0, 0, 16, 9, 11, 133 },
- { 3, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 18, 0, 0, 16, 9, 11, 133 },
- { 5, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 18, 0, 0, 0, 0, 12, 133 },
- { 25, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 18, 0, 0, 0, 0, 18, 134 },
- { 25, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 18, 0, 0, 0, 0, 6, 134 },
- { 18, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 18, 0, 0, 10, 8, 12, 134 },
- { 0, 17, 0, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 18, 0, 4, 4, 4, 21, 134 },
- { 1, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 18, 0, 8, 4, 4, 21, 134 },
- { 18, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 10, 8, 12, 138 },
- { 0, 17, 0, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 4, 4, 4, 21, 138 },
- { 0, 17, 7, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 4, 4, 4, 21, 138 },
- { 0, 17, 9, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 4, 4, 4, 21, 138 },
- { 18, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 7, 10, 8, 12, 138 },
- { 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 16, 9, 11, 138 },
- { 3, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 16, 9, 11, 138 },
- { 3, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 16, 9, 11, 138 },
- { 3, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 16, 9, 11, 138 },
- { 3, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 16, 9, 11, 138 },
- { 3, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 16, 9, 11, 138 },
- { 3, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 16, 9, 11, 138 },
- { 3, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 16, 9, 11, 138 },
- { 3, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 16, 9, 11, 138 },
- { 3, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 16, 9, 11, 138 },
- { 18, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 10, 8, 12, 63 },
- { 18, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 10, 8, 12, 63 },
- { 18, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 10, 8, 12, 63 },
- { 4, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 10, 8, 12, 63 },
- { 4, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 10, 8, 12, 63 },
- { 25, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 17, 63 },
- { 25, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 17, 63 },
- { 18, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 0, 0, 10, 8, 12, 81 },
- { 18, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 0, 0, 10, 8, 0, 81 },
- { 18, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 0, 0, 10, 8, 1, 81 },
- { 18, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 10, 8, 12, 127 },
- { 18, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 10, 8, 0, 127 },
- { 18, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 10, 8, 1, 127 },
- { 18, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, 0, 0, 10, 8, 12, 84 },
- { 18, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 10, 8, 12, 115 },
- { 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 16, 9, 11, 115 },
- { 3, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 16, 9, 11, 115 },
- { 3, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 16, 9, 11, 115 },
- { 3, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 16, 9, 11, 115 },
- { 3, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 16, 9, 11, 115 },
- { 3, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 16, 9, 11, 115 },
- { 3, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 16, 9, 11, 115 },
- { 3, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 16, 9, 11, 115 },
- { 3, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 16, 9, 11, 115 },
- { 3, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 16, 9, 11, 115 },
- { 25, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 12, 17, 115 },
- { 18, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 10, 8, 12, 104 },
- { 0, 17, 1, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 4, 4, 4, 21, 104 },
- { 25, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 12, 17, 104 },
- { 18, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 10, 8, 12, 108 },
- { 0, 17, 230, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 4, 4, 4, 21, 108 },
- { 25, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 12, 17, 108 },
- { 25, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 17, 108 },
- { 25, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 12, 108 },
- { 29, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 12, 108 },
- { 17, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 10, 8, 12, 108 },
- { 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 16, 9, 11, 108 },
- { 3, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 16, 9, 11, 108 },
- { 3, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 16, 9, 11, 108 },
- { 3, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 16, 9, 11, 108 },
- { 3, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 16, 9, 11, 108 },
- { 3, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 16, 9, 11, 108 },
- { 3, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 16, 9, 11, 108 },
- { 3, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 16, 9, 11, 108 },
- { 3, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 16, 9, 11, 108 },
- { 3, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 16, 9, 11, 108 },
- { 5, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 12, 108 },
- { 18, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 0, 10, 8, 12, 99 },
- { 1, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 8, 4, 4, 21, 99 },
- { 0, 17, 0, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 4, 4, 4, 21, 99 },
- { 17, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 0, 10, 8, 12, 99 },
- { 17, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 18, 0, 0, 10, 8, 5, 137 },
- { 17, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 10, 8, 5, 139 },
- { 18, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 18, 0, 0, 0, 8, 14, 137 },
- { 18, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, 0, 0, 8, 8, 14, 35 },
- { 18, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, 0, 0, 0, 8, 14, 34 },
- { 18, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 8, 14, 34 },
- { 18, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 8, 14, 139 },
- { 18, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 10, 8, 12, 105 },
- { 29, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 12, 105 },
- { 0, 17, 0, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 4, 4, 4, 21, 105 },
- { 0, 17, 1, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 4, 4, 4, 21, 105 },
- { 25, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 12, 17, 105 },
- { 10, 18, 0, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 3, 6, 4, 21, 2 },
- { 29, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 12, 2 },
- { 29, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 85, 0, 0, 0, 12, 2 },
- { 1, 0, 216, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 0, 4, 4, 4, 21, 2 },
- { 1, 0, 216, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 0, 8, 4, 4, 21, 2 },
- { 0, 17, 1, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 0, 4, 4, 4, 21, 1 },
- { 1, 0, 226, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 0, 8, 4, 4, 21, 2 },
- { 10, 18, 0, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 0, 3, 6, 4, 21, 2 },
- { 0, 17, 220, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 0, 4, 4, 4, 21, 1 },
- { 0, 17, 230, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 0, 4, 4, 4, 21, 1 },
- { 29, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 12, 2 },
- { 0, 17, 230, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 4, 4, 4, 21, 4 },
- { 5, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 12, 2 },
- { 14, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 80, 0, 10, 7, 12, 2 },
- { 15, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 80, 0, 10, 6, 12, 2 },
- { 15, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 80, 0, 10, 6, 12, 2 },
- { 26, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 80, 0, 0, 0, 12, 2 },
- { 26, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 80, 0, 0, 0, 12, 2 },
- { 14, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 80, 0, 10, 7, 12, 2 },
- { 15, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 80, 0, 10, 6, 12, 2 },
- { 3, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 80, 0, 16, 9, 11, 2 },
- { 3, 2, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 80, 0, 16, 9, 11, 2 },
- { 3, 2, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 80, 0, 16, 9, 11, 2 },
- { 3, 2, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 80, 0, 16, 9, 11, 2 },
- { 3, 2, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 80, 0, 16, 9, 11, 2 },
- { 3, 2, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 80, 0, 16, 9, 11, 2 },
- { 3, 2, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 80, 0, 16, 9, 11, 2 },
- { 3, 2, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 80, 0, 16, 9, 11, 2 },
- { 3, 2, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 80, 0, 16, 9, 11, 2 },
- { 3, 2, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 80, 0, 16, 9, 11, 2 },
- { 29, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 12, 131 },
- { 0, 17, 0, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 4, 4, 4, 21, 131 },
- { 25, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 17, 131 },
- { 25, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 12, 17, 131 },
- { 25, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 12, 131 },
- { 0, 17, 230, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 18, 0, 4, 4, 4, 21, 57 },
- { 18, 1, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 10, 8, 12, 113 },
- { 5, 1, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 12, 113 },
- { 0, 17, 220, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 4, 4, 4, 21, 113 },
- { 14, 1, 0, 2, -1, 0, 0, 34, 0, 0, 0, 0, 0, 34, 18, 0, 0, 10, 7, 12, 132 },
- { 15, 1, 0, 2, -1, 0, 0, 0, 0, -34, 0, -34, 0, 0, 18, 0, 0, 10, 6, 12, 132 },
- { 0, 17, 230, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 18, 0, 4, 4, 4, 21, 132 },
- { 0, 17, 7, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 18, 0, 4, 4, 4, 21, 132 },
- { 3, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 18, 0, 0, 16, 9, 11, 132 },
- { 3, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 18, 0, 0, 16, 9, 11, 132 },
- { 3, 1, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 18, 0, 0, 16, 9, 11, 132 },
- { 3, 1, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 18, 0, 0, 16, 9, 11, 132 },
- { 3, 1, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 18, 0, 0, 16, 9, 11, 132 },
- { 3, 1, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 18, 0, 0, 16, 9, 11, 132 },
- { 3, 1, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 18, 0, 0, 16, 9, 11, 132 },
- { 3, 1, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 18, 0, 0, 16, 9, 11, 132 },
- { 3, 1, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 18, 0, 0, 16, 9, 11, 132 },
- { 3, 1, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 18, 0, 0, 16, 9, 11, 132 },
- { 25, 1, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 18, 0, 0, 0, 0, 0, 132 },
- { 18, 13, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 80, 0, 10, 8, 12, 8 },
- { 26, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 12, 8 },
- { 5, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 80, 0, 0, 0, 12, 2 },
- { 5, 2, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 80, 0, 0, 0, 12, 2 },
- { 5, 2, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 80, 0, 0, 0, 12, 2 },
- { 5, 2, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 80, 0, 0, 0, 12, 2 },
- { 5, 2, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 80, 0, 0, 0, 12, 2 },
- { 5, 2, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 80, 0, 0, 0, 12, 2 },
- { 5, 2, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 80, 0, 0, 0, 12, 2 },
- { 5, 2, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 80, 0, 0, 0, 12, 2 },
- { 5, 2, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 80, 0, 0, 0, 12, 2 },
- { 5, 2, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 80, 0, 0, 0, 12, 2 },
- { 5, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 12, 2 },
- { 29, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 80, 0, 0, 0, 12, 2 },
- { 29, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, 80, 0, 10, 7, 12, 2 },
- { 29, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 80, 0, 10, 7, 12, 2 },
- { 29, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, 80, 0, 0, 0, 12, 2 },
- { 29, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, 0, 0, 10, 7, 12, 2 },
- { 29, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 0, 0, 10, 7, 12, 2 },
- { 29, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 80, 0, 0, 0, 12, 2 },
- { 29, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, 0, 0, 0, 0, 12, 2 },
- { 29, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 18, 0, 0, 0, 0, 12, 2 },
- { 29, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, 0, 6, 7, 0, 28, 2 },
- { 29, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 80, 0, 0, 0, 14, 34 },
- { 29, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, 80, 0, 0, 0, 14, 2 },
- { 29, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 18, 80, 0, 0, 0, 14, 2 },
- { 29, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 0, 14, 2 },
- { 29, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, 0, 16, 20, 0, 14, 2 },
- { 29, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 14, 2 },
- { 29, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 14, 18, 0, 30, 2 },
- { 28, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 15, 19, 0, 31, 2 },
- { 29, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, 0, 17, 21, 0, 30, 2 },
- { 29, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 12, 2 },
- { 29, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 18, 0, 14, 18, 0, 30, 2 },
- { 29, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 18, 0, 0, 0, 0, 14, 2 },
- { 29, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 16, 20, 0, 14, 2 },
- { 29, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 14, 2 },
- { 29, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 13, 3, 2 },
- { 29, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 5, 2 },
- { 29, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 14, 18, 0, 30, 2 },
- { 29, 10, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 14, 18, 0, 30, 2 },
- { 13, 18, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 12, 0 },
- { 18, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 8, 14, 37 },
- { 18, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, 0, 0, 0, 8, 14, 37 },
- { 18, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 85, 0, 0, 8, 14, 37 },
- { 10, 18, 0, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 0, 4, 4, 4, 21, 2 },
- { 0, 17, 0, 5, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 4, 4, 4, 21, 1 },
- { 12, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 12, 0 }
-};
-
-Q_DECL_CONST_FUNCTION static inline const Properties *qGetProp(uint ucs4) Q_DECL_NOTHROW
-{
- return uc_properties + GET_PROP_INDEX(ucs4);
-}
-
-Q_DECL_CONST_FUNCTION static inline const Properties *qGetProp(ushort ucs2) Q_DECL_NOTHROW
-{
- return uc_properties + GET_PROP_INDEX_UCS2(ucs2);
-}
-
-Q_DECL_CONST_FUNCTION Q_CORE_EXPORT const Properties * QT_FASTCALL properties(uint ucs4) Q_DECL_NOTHROW
-{
- return qGetProp(ucs4);
-}
-
-Q_DECL_CONST_FUNCTION Q_CORE_EXPORT const Properties * QT_FASTCALL properties(ushort ucs2) Q_DECL_NOTHROW
-{
- return qGetProp(ucs2);
-}
-
-Q_CORE_EXPORT GraphemeBreakClass QT_FASTCALL graphemeBreakClass(uint ucs4) Q_DECL_NOTHROW
-{
- return static_cast<GraphemeBreakClass>(qGetProp(ucs4)->graphemeBreakClass);
-}
-
-Q_CORE_EXPORT WordBreakClass QT_FASTCALL wordBreakClass(uint ucs4) Q_DECL_NOTHROW
-{
- return static_cast<WordBreakClass>(qGetProp(ucs4)->wordBreakClass);
-}
-
-Q_CORE_EXPORT SentenceBreakClass QT_FASTCALL sentenceBreakClass(uint ucs4) Q_DECL_NOTHROW
-{
- return static_cast<SentenceBreakClass>(qGetProp(ucs4)->sentenceBreakClass);
-}
-
-Q_CORE_EXPORT LineBreakClass QT_FASTCALL lineBreakClass(uint ucs4) Q_DECL_NOTHROW
-{
- return static_cast<LineBreakClass>(qGetProp(ucs4)->lineBreakClass);
-}
-
-
-static const unsigned short specialCaseMap[] = {
- 0x0, // placeholder
- 0x1, 0x2c65,
- 0x1, 0x2c66,
- 0x1, 0x2c7e,
- 0x1, 0x2c7f,
- 0x1, 0x2c6f,
- 0x1, 0x2c6d,
- 0x1, 0x2c70,
- 0x1, 0xa7ab,
- 0x1, 0xa7ac,
- 0x1, 0xa78d,
- 0x1, 0xa7aa,
- 0x1, 0xa7ae,
- 0x1, 0x2c62,
- 0x1, 0xa7ad,
- 0x1, 0x2c6e,
- 0x1, 0x2c64,
- 0x1, 0xa7b1,
- 0x1, 0xa7b2,
- 0x1, 0xa7b0,
- 0x1, 0xab70,
- 0x1, 0xab71,
- 0x1, 0xab72,
- 0x1, 0xab73,
- 0x1, 0xab74,
- 0x1, 0xab75,
- 0x1, 0xab76,
- 0x1, 0xab77,
- 0x1, 0xab78,
- 0x1, 0xab79,
- 0x1, 0xab7a,
- 0x1, 0xab7b,
- 0x1, 0xab7c,
- 0x1, 0xab7d,
- 0x1, 0xab7e,
- 0x1, 0xab7f,
- 0x1, 0xab80,
- 0x1, 0xab81,
- 0x1, 0xab82,
- 0x1, 0xab83,
- 0x1, 0xab84,
- 0x1, 0xab85,
- 0x1, 0xab86,
- 0x1, 0xab87,
- 0x1, 0xab88,
- 0x1, 0xab89,
- 0x1, 0xab8a,
- 0x1, 0xab8b,
- 0x1, 0xab8c,
- 0x1, 0xab8d,
- 0x1, 0xab8e,
- 0x1, 0xab8f,
- 0x1, 0xab90,
- 0x1, 0xab91,
- 0x1, 0xab92,
- 0x1, 0xab93,
- 0x1, 0xab94,
- 0x1, 0xab95,
- 0x1, 0xab96,
- 0x1, 0xab97,
- 0x1, 0xab98,
- 0x1, 0xab99,
- 0x1, 0xab9a,
- 0x1, 0xab9b,
- 0x1, 0xab9c,
- 0x1, 0xab9d,
- 0x1, 0xab9e,
- 0x1, 0xab9f,
- 0x1, 0xaba0,
- 0x1, 0xaba1,
- 0x1, 0xaba2,
- 0x1, 0xaba3,
- 0x1, 0xaba4,
- 0x1, 0xaba5,
- 0x1, 0xaba6,
- 0x1, 0xaba7,
- 0x1, 0xaba8,
- 0x1, 0xaba9,
- 0x1, 0xabaa,
- 0x1, 0xabab,
- 0x1, 0xabac,
- 0x1, 0xabad,
- 0x1, 0xabae,
- 0x1, 0xabaf,
- 0x1, 0xabb0,
- 0x1, 0xabb1,
- 0x1, 0xabb2,
- 0x1, 0xabb3,
- 0x1, 0xabb4,
- 0x1, 0xabb5,
- 0x1, 0xabb6,
- 0x1, 0xabb7,
- 0x1, 0xabb8,
- 0x1, 0xabb9,
- 0x1, 0xabba,
- 0x1, 0xabbb,
- 0x1, 0xabbc,
- 0x1, 0xabbd,
- 0x1, 0xabbe,
- 0x1, 0xabbf,
- 0x1, 0xa64a,
- 0x1, 0xa77d,
- 0x1, 0x6b,
- 0x1, 0xe5,
- 0x1, 0x26b,
- 0x1, 0x27d,
- 0x1, 0x23a,
- 0x1, 0x23e,
- 0x1, 0x251,
- 0x1, 0x271,
- 0x1, 0x250,
- 0x1, 0x252,
- 0x1, 0x23f,
- 0x1, 0x240,
- 0x1, 0x1d79,
- 0x1, 0x265,
- 0x1, 0x266,
- 0x1, 0x25c,
- 0x1, 0x261,
- 0x1, 0x26c,
- 0x1, 0x26a,
- 0x1, 0x29e,
- 0x1, 0x287,
- 0x1, 0x29d,
- 0x1, 0x13a0,
- 0x1, 0x13a1,
- 0x1, 0x13a2,
- 0x1, 0x13a3,
- 0x1, 0x13a4,
- 0x1, 0x13a5,
- 0x1, 0x13a6,
- 0x1, 0x13a7,
- 0x1, 0x13a8,
- 0x1, 0x13a9,
- 0x1, 0x13aa,
- 0x1, 0x13ab,
- 0x1, 0x13ac,
- 0x1, 0x13ad,
- 0x1, 0x13ae,
- 0x1, 0x13af,
- 0x1, 0x13b0,
- 0x1, 0x13b1,
- 0x1, 0x13b2,
- 0x1, 0x13b3,
- 0x1, 0x13b4,
- 0x1, 0x13b5,
- 0x1, 0x13b6,
- 0x1, 0x13b7,
- 0x1, 0x13b8,
- 0x1, 0x13b9,
- 0x1, 0x13ba,
- 0x1, 0x13bb,
- 0x1, 0x13bc,
- 0x1, 0x13bd,
- 0x1, 0x13be,
- 0x1, 0x13bf,
- 0x1, 0x13c0,
- 0x1, 0x13c1,
- 0x1, 0x13c2,
- 0x1, 0x13c3,
- 0x1, 0x13c4,
- 0x1, 0x13c5,
- 0x1, 0x13c6,
- 0x1, 0x13c7,
- 0x1, 0x13c8,
- 0x1, 0x13c9,
- 0x1, 0x13ca,
- 0x1, 0x13cb,
- 0x1, 0x13cc,
- 0x1, 0x13cd,
- 0x1, 0x13ce,
- 0x1, 0x13cf,
- 0x1, 0x13d0,
- 0x1, 0x13d1,
- 0x1, 0x13d2,
- 0x1, 0x13d3,
- 0x1, 0x13d4,
- 0x1, 0x13d5,
- 0x1, 0x13d6,
- 0x1, 0x13d7,
- 0x1, 0x13d8,
- 0x1, 0x13d9,
- 0x1, 0x13da,
- 0x1, 0x13db,
- 0x1, 0x13dc,
- 0x1, 0x13dd,
- 0x1, 0x13de,
- 0x1, 0x13df,
- 0x1, 0x13e0,
- 0x1, 0x13e1,
- 0x1, 0x13e2,
- 0x1, 0x13e3,
- 0x1, 0x13e4,
- 0x1, 0x13e5,
- 0x1, 0x13e6,
- 0x1, 0x13e7,
- 0x1, 0x13e8,
- 0x1, 0x13e9,
- 0x1, 0x13ea,
- 0x1, 0x13eb,
- 0x1, 0x13ec,
- 0x1, 0x13ed,
- 0x1, 0x13ee,
- 0x1, 0x13ef,
- 0x2, 0x53, 0x73,
- 0x2, 0x53, 0x53,
- 0x2, 0x69, 0x307,
- 0x2, 0x46, 0x66,
- 0x2, 0x46, 0x46,
- 0x2, 0x46, 0x69,
- 0x2, 0x46, 0x49,
- 0x2, 0x46, 0x6c,
- 0x2, 0x46, 0x4c,
- 0x3, 0x46, 0x66, 0x69,
- 0x3, 0x46, 0x46, 0x49,
- 0x3, 0x46, 0x66, 0x6c,
- 0x3, 0x46, 0x46, 0x4c,
- 0x2, 0x53, 0x74,
- 0x2, 0x53, 0x54,
- 0x2, 0x535, 0x582,
- 0x2, 0x535, 0x552,
- 0x2, 0x544, 0x576,
- 0x2, 0x544, 0x546,
- 0x2, 0x544, 0x565,
- 0x2, 0x544, 0x535,
- 0x2, 0x544, 0x56b,
- 0x2, 0x544, 0x53b,
- 0x2, 0x54e, 0x576,
- 0x2, 0x54e, 0x546,
- 0x2, 0x544, 0x56d,
- 0x2, 0x544, 0x53d,
- 0x2, 0x2bc, 0x4e,
- 0x3, 0x399, 0x308, 0x301,
- 0x3, 0x3a5, 0x308, 0x301,
- 0x2, 0x4a, 0x30c,
- 0x2, 0x48, 0x331,
- 0x2, 0x54, 0x308,
- 0x2, 0x57, 0x30a,
- 0x2, 0x59, 0x30a,
- 0x2, 0x41, 0x2be,
- 0x2, 0x3a5, 0x313,
- 0x3, 0x3a5, 0x313, 0x300,
- 0x3, 0x3a5, 0x313, 0x301,
- 0x3, 0x3a5, 0x313, 0x342,
- 0x2, 0x391, 0x342,
- 0x2, 0x397, 0x342,
- 0x3, 0x399, 0x308, 0x300,
- 0x2, 0x399, 0x342,
- 0x3, 0x399, 0x308, 0x342,
- 0x3, 0x3a5, 0x308, 0x300,
- 0x2, 0x3a1, 0x313,
- 0x2, 0x3a5, 0x342,
- 0x3, 0x3a5, 0x308, 0x342,
- 0x2, 0x3a9, 0x342,
- 0x2, 0x1f08, 0x399,
- 0x2, 0x1f09, 0x399,
- 0x2, 0x1f0a, 0x399,
- 0x2, 0x1f0b, 0x399,
- 0x2, 0x1f0c, 0x399,
- 0x2, 0x1f0d, 0x399,
- 0x2, 0x1f0e, 0x399,
- 0x2, 0x1f0f, 0x399,
- 0x2, 0x1f28, 0x399,
- 0x2, 0x1f29, 0x399,
- 0x2, 0x1f2a, 0x399,
- 0x2, 0x1f2b, 0x399,
- 0x2, 0x1f2c, 0x399,
- 0x2, 0x1f2d, 0x399,
- 0x2, 0x1f2e, 0x399,
- 0x2, 0x1f2f, 0x399,
- 0x2, 0x1f68, 0x399,
- 0x2, 0x1f69, 0x399,
- 0x2, 0x1f6a, 0x399,
- 0x2, 0x1f6b, 0x399,
- 0x2, 0x1f6c, 0x399,
- 0x2, 0x1f6d, 0x399,
- 0x2, 0x1f6e, 0x399,
- 0x2, 0x1f6f, 0x399,
- 0x2, 0x391, 0x399,
- 0x2, 0x397, 0x399,
- 0x2, 0x3a9, 0x399,
- 0x2, 0x1fba, 0x345,
- 0x2, 0x1fba, 0x399,
- 0x2, 0x386, 0x345,
- 0x2, 0x386, 0x399,
- 0x2, 0x1fca, 0x345,
- 0x2, 0x1fca, 0x399,
- 0x2, 0x389, 0x345,
- 0x2, 0x389, 0x399,
- 0x2, 0x1ffa, 0x345,
- 0x2, 0x1ffa, 0x399,
- 0x2, 0x38f, 0x345,
- 0x2, 0x38f, 0x399,
- 0x3, 0x391, 0x342, 0x345,
- 0x3, 0x391, 0x342, 0x399,
- 0x3, 0x397, 0x342, 0x345,
- 0x3, 0x397, 0x342, 0x399,
- 0x3, 0x3a9, 0x342, 0x345,
- 0x3, 0x3a9, 0x342, 0x399,
- 0x1, 0xa64b
-};
-
-
-static const unsigned short uc_decomposition_trie[] = {
- // 0 - 0x3400
-
- 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548,
- 1548, 1548, 1564, 1580, 1596, 1612, 1628, 1644,
- 1660, 1676, 1692, 1708, 1724, 1740, 1756, 1772,
- 1548, 1548, 1788, 1804, 1820, 1836, 1852, 1868,
- 1884, 1900, 1916, 1932, 1548, 1548, 1548, 1548,
- 1548, 1548, 1548, 1948, 1548, 1964, 1980, 1548,
- 1548, 1548, 1548, 1548, 1996, 1548, 1548, 2012,
- 2028, 2044, 2060, 2076, 2092, 2108, 1548, 2124,
- 2140, 2156, 1548, 2172, 1548, 2188, 1548, 2204,
- 1548, 1548, 1548, 1548, 2220, 2236, 2252, 2268,
- 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548,
- 2284, 1548, 1548, 1548, 1548, 1548, 1548, 1548,
- 1548, 1548, 2300, 1548, 1548, 1548, 1548, 2316,
- 1548, 1548, 1548, 1548, 2332, 2348, 1548, 1548,
- 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548,
- 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548,
- 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548,
- 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548,
- 1548, 1548, 2364, 2380, 1548, 2396, 1548, 1548,
- 1548, 1548, 1548, 1548, 2412, 2428, 1548, 1548,
- 1548, 1548, 1548, 2444, 1548, 2460, 1548, 1548,
- 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548,
- 1548, 1548, 1548, 1548, 2476, 2492, 1548, 1548,
- 1548, 2508, 1548, 1548, 2524, 1548, 1548, 1548,
- 1548, 1548, 1548, 1548, 2540, 1548, 1548, 1548,
- 1548, 1548, 1548, 1548, 2556, 1548, 1548, 1548,
- 1548, 1548, 1548, 1548, 2572, 1548, 1548, 1548,
- 1548, 1548, 1548, 1548, 1548, 2588, 1548, 1548,
- 1548, 1548, 1548, 2604, 1548, 1548, 1548, 1548,
- 1548, 1548, 1548, 2620, 1548, 2636, 1548, 1548,
- 2652, 1548, 1548, 1548, 2668, 2684, 2700, 2716,
- 2732, 2748, 2764, 2780, 1548, 1548, 1548, 1548,
-
- 1548, 1548, 2796, 1548, 1548, 1548, 1548, 1548,
- 1548, 1548, 1548, 1548, 1548, 1548, 1548, 2812,
- 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548,
- 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548,
- 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548,
- 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548,
- 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548,
- 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548,
- 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548,
- 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548,
- 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548,
- 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548,
- 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548,
- 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548,
- 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548,
- 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548,
- 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548,
- 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548,
- 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548,
- 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548,
- 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548,
- 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548,
- 2828, 2844, 1548, 2860, 2876, 1548, 1548, 1548,
- 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548,
- 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548,
- 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548,
- 1548, 1548, 2892, 2908, 2924, 2940, 2956, 2972,
- 1548, 2988, 3004, 3020, 1548, 1548, 1548, 1548,
- 3036, 3052, 3068, 3084, 3100, 3116, 3132, 3148,
- 3164, 3180, 3196, 3212, 3228, 3244, 3260, 3276,
- 3292, 3308, 3324, 3340, 3356, 3372, 3388, 3404,
- 3420, 3436, 3452, 3468, 3484, 3500, 3516, 3532,
-
- 3548, 3564, 3580, 3596, 3612, 3628, 1548, 3644,
- 3660, 3676, 3692, 1548, 1548, 1548, 1548, 1548,
- 3708, 3724, 3740, 3756, 3772, 3788, 3804, 3820,
- 3836, 3852, 3868, 1548, 3884, 1548, 1548, 1548,
- 3900, 1548, 3916, 3932, 3948, 1548, 3964, 3980,
- 3996, 1548, 4012, 1548, 1548, 1548, 4028, 1548,
- 1548, 1548, 4044, 1548, 1548, 1548, 1548, 1548,
- 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548,
- 1548, 1548, 1548, 1548, 1548, 1548, 4060, 4076,
- 4092, 4108, 4124, 4140, 4156, 4172, 4188, 1548,
- 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548,
- 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548,
- 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548,
- 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548,
- 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548,
- 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548,
- 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548,
- 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548,
- 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548,
- 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548,
- 4204, 1548, 1548, 1548, 1548, 1548, 1548, 4220,
- 1548, 1548, 1548, 1548, 1548, 4236, 1548, 1548,
- 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548,
- 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548,
- 1548, 1548, 1548, 1548, 1548, 1548, 1548, 4252,
- 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548,
- 1548, 1548, 1548, 1548, 1548, 1548, 4268, 1548,
- 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548,
- 1548, 1548, 1548, 1548, 1548, 1548, 1548, 1548,
- 1548, 4284, 1548, 1548, 1548, 1548, 1548, 4300,
- 4316, 4332, 4348, 4364, 4380, 4396, 4412, 4428,
- 4444, 4460, 4476, 4492, 4508, 4524, 1548, 1548,
-
- 4540, 1548, 1548, 4556, 4572, 4588, 4604, 4620,
- 1548, 4636, 4652, 4668, 4684, 4700, 1548, 4716,
- 1548, 1548, 1548, 4732, 4748, 4764, 4780, 4796,
- 4812, 4828, 1548, 1548, 1548, 1548, 1548, 1548,
- 4844, 4860, 4876, 4892, 4908, 4924, 4940, 4956,
- 4972, 4988, 5004, 5020, 5036, 5052, 5068, 5084,
- 5100, 5116, 5132, 5148, 5164, 5180, 5196, 5212,
- 5228, 5244, 5260, 5276, 5292, 5308, 5324, 5340,
-
- // 0x3400 - 0x30000
-
- 5356, 5356, 5356, 5356, 5356, 5356, 5356, 5356,
- 5356, 5356, 5356, 5356, 5356, 5356, 5356, 5356,
- 5356, 5356, 5356, 5356, 5356, 5356, 5356, 5356,
- 5356, 5356, 5356, 5356, 5356, 5356, 5356, 5356,
- 5356, 5356, 5356, 5356, 5356, 5356, 5356, 5356,
- 5356, 5356, 5356, 5356, 5356, 5356, 5356, 5356,
- 5356, 5356, 5356, 5356, 5356, 5356, 5356, 5356,
- 5356, 5356, 5356, 5356, 5356, 5356, 5356, 5356,
- 5356, 5356, 5356, 5356, 5356, 5356, 5356, 5356,
- 5356, 5356, 5356, 5356, 5356, 5356, 5356, 5356,
- 5356, 5356, 5356, 5356, 5356, 5356, 5356, 5356,
- 5356, 5356, 5356, 5356, 5356, 5356, 5356, 5356,
- 5356, 5356, 5356, 5356, 5356, 5356, 5356, 5356,
- 5356, 5356, 5356, 5356, 5356, 5356, 5356, 5356,
- 5356, 5356, 5612, 5868, 5356, 5356, 5356, 6124,
- 5356, 5356, 5356, 5356, 5356, 5356, 5356, 5356,
- 5356, 5356, 5356, 5356, 5356, 5356, 5356, 5356,
- 5356, 5356, 5356, 5356, 5356, 5356, 5356, 5356,
- 5356, 5356, 5356, 5356, 5356, 5356, 5356, 5356,
- 5356, 5356, 5356, 5356, 5356, 5356, 5356, 5356,
- 5356, 5356, 5356, 5356, 5356, 5356, 5356, 5356,
- 5356, 5356, 5356, 5356, 5356, 5356, 5356, 5356,
- 5356, 5356, 5356, 5356, 5356, 5356, 5356, 5356,
- 5356, 5356, 5356, 5356, 5356, 5356, 5356, 5356,
-
- 5356, 5356, 5356, 5356, 5356, 6380, 6636, 6892,
- 7148, 7404, 7660, 7916, 5356, 5356, 5356, 5356,
- 5356, 5356, 5356, 5356, 5356, 5356, 5356, 5356,
- 5356, 5356, 5356, 5356, 8172, 8428, 5356, 8684,
- 8940, 9196, 5356, 5356, 5356, 5356, 5356, 5356,
- 5356, 5356, 5356, 5356, 5356, 5356, 5356, 5356,
- 5356, 5356, 5356, 5356, 5356, 5356, 5356, 5356,
- 5356, 5356, 5356, 5356, 5356, 5356, 5356, 5356,
- 5356, 5356, 5356, 5356, 5356, 5356, 5356, 5356,
- 5356, 5356, 5356, 5356, 5356, 5356, 5356, 5356,
- 5356, 5356, 5356, 5356, 5356, 5356, 5356, 5356,
- 5356, 5356, 5356, 5356, 5356, 5356, 5356, 5356,
- 5356, 5356, 5356, 5356, 5356, 5356, 5356, 5356,
- 5356, 5356, 5356, 5356, 5356, 5356, 5356, 5356,
- 5356, 5356, 5356, 5356, 5356, 5356, 5356, 5356,
- 5356, 5356, 5356, 5356, 5356, 5356, 5356, 5356,
- 5356, 5356, 5356, 5356, 5356, 5356, 5356, 5356,
- 5356, 5356, 5356, 5356, 5356, 5356, 5356, 5356,
- 5356, 5356, 5356, 5356, 5356, 5356, 5356, 5356,
- 5356, 5356, 5356, 5356, 5356, 5356, 5356, 5356,
- 5356, 5356, 5356, 5356, 5356, 5356, 5356, 5356,
- 5356, 5356, 5356, 5356, 5356, 5356, 5356, 5356,
- 5356, 5356, 5356, 5356, 5356, 5356, 5356, 5356,
- 5356, 5356, 5356, 5356, 5356, 5356, 5356, 5356,
- 5356, 5356, 5356, 5356, 5356, 5356, 5356, 5356,
- 5356, 5356, 5356, 5356, 5356, 5356, 5356, 5356,
- 5356, 5356, 5356, 5356, 5356, 5356, 5356, 5356,
- 5356, 5356, 5356, 5356, 5356, 9452, 5356, 5356,
- 9708, 9964, 10220, 10476, 5356, 5356, 5356, 5356,
- 5356, 5356, 5356, 5356, 5356, 5356, 5356, 5356,
- 5356, 5356, 5356, 5356, 5356, 5356, 5356, 5356,
- 5356, 5356, 10732, 5356, 5356, 10988, 11244, 5356,
-
- 5356, 5356, 5356, 5356, 5356, 5356, 5356, 5356,
- 5356, 5356, 5356, 5356, 5356, 5356, 5356, 5356,
- 5356, 5356, 5356, 5356, 5356, 5356, 5356, 5356,
- 5356, 5356, 5356, 5356, 5356, 5356, 5356, 5356,
- 5356, 5356, 5356, 5356, 5356, 5356, 5356, 5356,
- 5356, 5356, 5356, 5356, 5356, 5356, 5356, 5356,
- 5356, 5356, 5356, 5356, 5356, 5356, 5356, 5356,
- 5356, 5356, 5356, 5356, 5356, 5356, 5356, 5356,
- 5356, 5356, 5356, 5356, 5356, 5356, 5356, 5356,
- 5356, 5356, 5356, 5356, 5356, 5356, 5356, 5356,
- 5356, 5356, 5356, 5356, 5356, 5356, 5356, 5356,
- 5356, 5356, 5356, 5356, 5356, 5356, 5356, 5356,
- 5356, 5356, 5356, 5356, 5356, 5356, 5356, 5356,
- 5356, 5356, 5356, 5356, 5356, 5356, 5356, 5356,
- 5356, 5356, 5356, 5356, 5356, 5356, 5356, 5356,
- 5356, 5356, 5356, 5356, 5356, 5356, 5356, 5356,
- 5356, 5356, 5356, 5356, 5356, 5356, 5356, 5356,
- 5356, 5356, 5356, 5356, 5356, 5356, 5356, 5356,
- 5356, 5356, 5356, 5356, 5356, 5356, 5356, 5356,
- 5356, 5356, 5356, 5356, 5356, 5356, 5356, 5356,
- 5356, 5356, 5356, 5356, 5356, 5356, 5356, 5356,
- 5356, 5356, 5356, 5356, 5356, 5356, 5356, 5356,
- 5356, 5356, 5356, 5356, 5356, 5356, 5356, 5356,
- 5356, 5356, 5356, 5356, 5356, 5356, 5356, 5356,
- 5356, 5356, 5356, 5356, 5356, 5356, 5356, 5356,
- 5356, 5356, 5356, 5356, 5356, 5356, 5356, 5356,
- 5356, 5356, 5356, 5356, 5356, 5356, 5356, 5356,
- 5356, 5356, 5356, 5356, 5356, 5356, 5356, 5356,
- 5356, 5356, 5356, 5356, 5356, 5356, 5356, 5356,
- 5356, 5356, 5356, 5356, 5356, 5356, 5356, 5356,
- 5356, 5356, 5356, 5356, 5356, 5356, 5356, 5356,
- 5356, 5356, 5356, 5356, 5356, 5356, 5356, 5356,
-
- 5356, 5356, 5356, 5356, 11500, 11756, 12012, 5356,
- 5356, 5356, 5356, 5356,
-
-
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
-
- 0x0, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0x2, 0xffff, 0x5, 0xffff, 0xffff, 0xffff, 0xffff, 0x7,
-
- 0xffff, 0xffff, 0xa, 0xc, 0xe, 0x11, 0xffff, 0xffff,
- 0x13, 0x16, 0x18, 0xffff, 0x1a, 0x1e, 0x22, 0xffff,
-
- 0x26, 0x29, 0x2c, 0x2f, 0x32, 0x35, 0xffff, 0x38,
- 0x3b, 0x3e, 0x41, 0x44, 0x47, 0x4a, 0x4d, 0x50,
-
- 0xffff, 0x53, 0x56, 0x59, 0x5c, 0x5f, 0x62, 0xffff,
- 0xffff, 0x65, 0x68, 0x6b, 0x6e, 0x71, 0xffff, 0xffff,
-
- 0x74, 0x77, 0x7a, 0x7d, 0x80, 0x83, 0xffff, 0x86,
- 0x89, 0x8c, 0x8f, 0x92, 0x95, 0x98, 0x9b, 0x9e,
-
- 0xffff, 0xa1, 0xa4, 0xa7, 0xaa, 0xad, 0xb0, 0xffff,
- 0xffff, 0xb3, 0xb6, 0xb9, 0xbc, 0xbf, 0xffff, 0xc2,
-
- 0xc5, 0xc8, 0xcb, 0xce, 0xd1, 0xd4, 0xd7, 0xda,
- 0xdd, 0xe0, 0xe3, 0xe6, 0xe9, 0xec, 0xef, 0xf2,
-
- 0xffff, 0xffff, 0xf5, 0xf8, 0xfb, 0xfe, 0x101, 0x104,
- 0x107, 0x10a, 0x10d, 0x110, 0x113, 0x116, 0x119, 0x11c,
-
- 0x11f, 0x122, 0x125, 0x128, 0x12b, 0x12e, 0xffff, 0xffff,
- 0x131, 0x134, 0x137, 0x13a, 0x13d, 0x140, 0x143, 0x146,
-
- 0x149, 0xffff, 0x14c, 0x14f, 0x152, 0x155, 0x158, 0x15b,
- 0xffff, 0x15e, 0x161, 0x164, 0x167, 0x16a, 0x16d, 0x170,
-
- 0x173, 0xffff, 0xffff, 0x176, 0x179, 0x17c, 0x17f, 0x182,
- 0x185, 0x188, 0xffff, 0xffff, 0x18b, 0x18e, 0x191, 0x194,
-
- 0x197, 0x19a, 0xffff, 0xffff, 0x19d, 0x1a0, 0x1a3, 0x1a6,
- 0x1a9, 0x1ac, 0x1af, 0x1b2, 0x1b5, 0x1b8, 0x1bb, 0x1be,
-
- 0x1c1, 0x1c4, 0x1c7, 0x1ca, 0x1cd, 0x1d0, 0xffff, 0xffff,
- 0x1d3, 0x1d6, 0x1d9, 0x1dc, 0x1df, 0x1e2, 0x1e5, 0x1e8,
-
- 0x1eb, 0x1ee, 0x1f1, 0x1f4, 0x1f7, 0x1fa, 0x1fd, 0x200,
- 0x203, 0x206, 0x209, 0x20c, 0x20f, 0x212, 0x215, 0x218,
-
- 0x21a, 0x21d, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0x220,
-
- 0x223, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
-
- 0xffff, 0xffff, 0xffff, 0xffff, 0x226, 0x229, 0x22c, 0x22f,
- 0x232, 0x235, 0x238, 0x23b, 0x23e, 0x241, 0x244, 0x247,
-
- 0x24a, 0x24d, 0x250, 0x253, 0x256, 0x259, 0x25c, 0x25f,
- 0x262, 0x265, 0x268, 0x26b, 0x26e, 0xffff, 0x271, 0x274,
-
- 0x277, 0x27a, 0x27d, 0x280, 0xffff, 0xffff, 0x283, 0x286,
- 0x289, 0x28c, 0x28f, 0x292, 0x295, 0x298, 0x29b, 0x29e,
-
- 0x2a1, 0x2a4, 0x2a7, 0x2aa, 0x2ad, 0x2b0, 0xffff, 0xffff,
- 0x2b3, 0x2b6, 0x2b9, 0x2bc, 0x2bf, 0x2c2, 0x2c5, 0x2c8,
-
- 0x2cb, 0x2ce, 0x2d1, 0x2d4, 0x2d7, 0x2da, 0x2dd, 0x2e0,
- 0x2e3, 0x2e6, 0x2e9, 0x2ec, 0x2ef, 0x2f2, 0x2f5, 0x2f8,
-
- 0x2fb, 0x2fe, 0x301, 0x304, 0x307, 0x30a, 0x30d, 0x310,
- 0x313, 0x316, 0x319, 0x31c, 0xffff, 0xffff, 0x31f, 0x322,
-
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0x325, 0x328,
- 0x32b, 0x32e, 0x331, 0x334, 0x337, 0x33a, 0x33d, 0x340,
-
- 0x343, 0x346, 0x349, 0x34c, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
-
- 0x34f, 0x351, 0x353, 0x355, 0x357, 0x359, 0x35b, 0x35d,
- 0x35f, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
-
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0x361, 0x364, 0x367, 0x36a, 0x36d, 0x370, 0xffff, 0xffff,
-
- 0x373, 0x375, 0x377, 0x379, 0x37b, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
-
- 0x37d, 0x37f, 0xffff, 0x381, 0x383, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
-
- 0xffff, 0xffff, 0xffff, 0xffff, 0x386, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0x388, 0xffff, 0xffff, 0xffff, 0x38b, 0xffff,
-
- 0xffff, 0xffff, 0xffff, 0xffff, 0x38d, 0x390, 0x393, 0x396,
- 0x398, 0x39b, 0x39e, 0xffff, 0x3a1, 0xffff, 0x3a4, 0x3a7,
-
- 0x3aa, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
-
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0x3ad, 0x3b0, 0x3b3, 0x3b6, 0x3b9, 0x3bc,
-
- 0x3bf, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
-
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0x3c2, 0x3c5, 0x3c8, 0x3cb, 0x3ce, 0xffff,
-
- 0x3d1, 0x3d3, 0x3d5, 0x3d7, 0x3da, 0x3dd, 0x3df, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
-
- 0x3e1, 0x3e3, 0x3e5, 0xffff, 0x3e7, 0x3e9, 0xffff, 0xffff,
- 0xffff, 0x3eb, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
-
- 0x3ed, 0x3f0, 0xffff, 0x3f3, 0xffff, 0xffff, 0xffff, 0x3f6,
- 0xffff, 0xffff, 0xffff, 0xffff, 0x3f9, 0x3fc, 0x3ff, 0xffff,
-
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0x402, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
-
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0x405, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
-
- 0x408, 0x40b, 0xffff, 0x40e, 0xffff, 0xffff, 0xffff, 0x411,
- 0xffff, 0xffff, 0xffff, 0xffff, 0x414, 0x417, 0x41a, 0xffff,
-
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0x41d, 0x420,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
-
- 0xffff, 0x423, 0x426, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
-
- 0x429, 0x42c, 0x42f, 0x432, 0xffff, 0xffff, 0x435, 0x438,
- 0xffff, 0xffff, 0x43b, 0x43e, 0x441, 0x444, 0x447, 0x44a,
-
- 0xffff, 0xffff, 0x44d, 0x450, 0x453, 0x456, 0x459, 0x45c,
- 0xffff, 0xffff, 0x45f, 0x462, 0x465, 0x468, 0x46b, 0x46e,
-
- 0x471, 0x474, 0x477, 0x47a, 0x47d, 0x480, 0xffff, 0xffff,
- 0x483, 0x486, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
-
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0x489,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
-
- 0xffff, 0xffff, 0x48c, 0x48f, 0x492, 0x495, 0x498, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
-
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0x49b, 0x49e, 0x4a1,
- 0x4a4, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
-
- 0x4a7, 0xffff, 0x4aa, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
-
- 0xffff, 0xffff, 0xffff, 0x4ad, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
-
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0x4b0, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
-
- 0xffff, 0x4b3, 0xffff, 0xffff, 0x4b6, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
-
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0x4b9, 0x4bc, 0x4bf, 0x4c2, 0x4c5, 0x4c8, 0x4cb, 0x4ce,
-
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0x4d1, 0x4d4, 0xffff, 0xffff, 0xffff,
-
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0x4d7, 0x4da, 0xffff, 0x4dd,
-
- 0xffff, 0xffff, 0xffff, 0x4e0, 0xffff, 0xffff, 0x4e3, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
-
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0x4e6, 0x4e9, 0x4ec, 0xffff, 0xffff, 0x4ef, 0xffff,
-
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0x4f2, 0xffff, 0xffff, 0x4f5, 0x4f8, 0xffff, 0xffff, 0xffff,
-
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0x4fb, 0x4fe, 0xffff, 0xffff,
-
- 0xffff, 0xffff, 0xffff, 0xffff, 0x501, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
-
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0x504, 0x507, 0x50a, 0xffff, 0xffff, 0xffff,
-
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0x50d, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
-
- 0x510, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0x513,
- 0x516, 0xffff, 0x519, 0x51c, 0xffff, 0xffff, 0xffff, 0xffff,
-
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0x51f, 0x522, 0x525, 0xffff, 0xffff, 0xffff,
-
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0x528, 0xffff, 0x52b, 0x52e, 0x531, 0xffff,
-
- 0xffff, 0xffff, 0xffff, 0x534, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
-
- 0xffff, 0xffff, 0xffff, 0x537, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
-
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0x53a, 0x53d, 0xffff, 0xffff,
-
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0x540, 0xffff, 0xffff, 0xffff,
-
- 0xffff, 0xffff, 0xffff, 0x542, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0x545, 0xffff, 0xffff,
-
- 0xffff, 0xffff, 0x548, 0xffff, 0xffff, 0xffff, 0xffff, 0x54b,
- 0xffff, 0xffff, 0xffff, 0xffff, 0x54e, 0xffff, 0xffff, 0xffff,
-
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0x551, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
-
- 0xffff, 0xffff, 0xffff, 0x554, 0xffff, 0x557, 0x55a, 0x55d,
- 0x560, 0x563, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
-
- 0xffff, 0x566, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
-
- 0xffff, 0xffff, 0xffff, 0x569, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0x56c, 0xffff, 0xffff,
-
- 0xffff, 0xffff, 0x56f, 0xffff, 0xffff, 0xffff, 0xffff, 0x572,
- 0xffff, 0xffff, 0xffff, 0xffff, 0x575, 0xffff, 0xffff, 0xffff,
-
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0x578, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
-
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0x57b, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
-
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0x57e, 0xffff, 0xffff, 0xffff,
-
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0x580, 0xffff,
- 0x583, 0xffff, 0x586, 0xffff, 0x589, 0xffff, 0x58c, 0xffff,
-
- 0xffff, 0xffff, 0x58f, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
-
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0x592, 0xffff, 0x595, 0xffff, 0xffff,
-
- 0x598, 0x59b, 0xffff, 0x59e, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
-
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0x5a1, 0x5a3, 0x5a5, 0xffff,
-
- 0x5a7, 0x5a9, 0x5ab, 0x5ad, 0x5af, 0x5b1, 0x5b3, 0x5b5,
- 0x5b7, 0x5b9, 0x5bb, 0xffff, 0x5bd, 0x5bf, 0x5c1, 0x5c3,
-
- 0x5c5, 0x5c7, 0x5c9, 0x5cb, 0x5cd, 0x5cf, 0x5d1, 0x5d3,
- 0x5d5, 0x5d7, 0x5d9, 0x5db, 0x5dd, 0x5df, 0xffff, 0x5e1,
-
- 0x5e3, 0x5e5, 0x5e7, 0x5e9, 0x5eb, 0x5ed, 0x5ef, 0x5f1,
- 0x5f3, 0x5f5, 0x5f7, 0x5f9, 0x5fb, 0x5fd, 0x5ff, 0x601,
-
- 0x603, 0x605, 0x607, 0x609, 0x60b, 0x60d, 0x60f, 0x611,
- 0x613, 0x615, 0x617, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
-
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0x619, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
-
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0x61b, 0x61d, 0x61f, 0x621, 0x623,
-
- 0x625, 0x627, 0x629, 0x62b, 0x62d, 0x62f, 0x631, 0x633,
- 0x635, 0x637, 0x639, 0x63b, 0x63d, 0x63f, 0x641, 0x643,
-
- 0x645, 0x647, 0x649, 0x64b, 0x64d, 0x64f, 0x651, 0x653,
- 0x655, 0x657, 0x659, 0x65b, 0x65d, 0x65f, 0x661, 0x663,
-
- 0x665, 0x668, 0x66b, 0x66e, 0x671, 0x674, 0x677, 0x67a,
- 0x67d, 0x680, 0x683, 0x686, 0x689, 0x68c, 0x68f, 0x692,
-
- 0x695, 0x698, 0x69b, 0x69e, 0x6a1, 0x6a4, 0x6a7, 0x6aa,
- 0x6ad, 0x6b0, 0x6b3, 0x6b6, 0x6b9, 0x6bc, 0x6bf, 0x6c2,
-
- 0x6c5, 0x6c8, 0x6cb, 0x6ce, 0x6d1, 0x6d4, 0x6d7, 0x6da,
- 0x6dd, 0x6e0, 0x6e3, 0x6e6, 0x6e9, 0x6ec, 0x6ef, 0x6f2,
-
- 0x6f5, 0x6f8, 0x6fb, 0x6fe, 0x701, 0x704, 0x707, 0x70a,
- 0x70d, 0x710, 0x713, 0x716, 0x719, 0x71c, 0x71f, 0x722,
-
- 0x725, 0x728, 0x72b, 0x72e, 0x731, 0x734, 0x737, 0x73a,
- 0x73d, 0x740, 0x743, 0x746, 0x749, 0x74c, 0x74f, 0x752,
-
- 0x755, 0x758, 0x75b, 0x75e, 0x761, 0x764, 0x767, 0x76a,
- 0x76d, 0x770, 0x773, 0x776, 0x779, 0x77c, 0x77f, 0x782,
-
- 0x785, 0x788, 0x78b, 0x78e, 0x791, 0x794, 0x797, 0x79a,
- 0x79d, 0x7a0, 0x7a3, 0x7a6, 0x7a9, 0x7ac, 0x7af, 0x7b2,
-
- 0x7b5, 0x7b8, 0x7bb, 0x7be, 0x7c1, 0x7c4, 0x7c7, 0x7ca,
- 0x7cd, 0x7d0, 0x7d3, 0x7d6, 0x7d9, 0x7dc, 0x7df, 0x7e2,
-
- 0x7e5, 0x7e8, 0x7eb, 0x7ee, 0x7f1, 0x7f4, 0x7f7, 0x7fa,
- 0x7fd, 0x800, 0x803, 0x806, 0x809, 0x80c, 0x80f, 0x812,
-
- 0x815, 0x818, 0x81b, 0x81e, 0x821, 0x824, 0x827, 0x82a,
- 0x82d, 0x830, 0x833, 0x836, 0xffff, 0xffff, 0xffff, 0xffff,
-
- 0x839, 0x83c, 0x83f, 0x842, 0x845, 0x848, 0x84b, 0x84e,
- 0x851, 0x854, 0x857, 0x85a, 0x85d, 0x860, 0x863, 0x866,
-
- 0x869, 0x86c, 0x86f, 0x872, 0x875, 0x878, 0x87b, 0x87e,
- 0x881, 0x884, 0x887, 0x88a, 0x88d, 0x890, 0x893, 0x896,
-
- 0x899, 0x89c, 0x89f, 0x8a2, 0x8a5, 0x8a8, 0x8ab, 0x8ae,
- 0x8b1, 0x8b4, 0x8b7, 0x8ba, 0x8bd, 0x8c0, 0x8c3, 0x8c6,
-
- 0x8c9, 0x8cc, 0x8cf, 0x8d2, 0x8d5, 0x8d8, 0x8db, 0x8de,
- 0x8e1, 0x8e4, 0x8e7, 0x8ea, 0x8ed, 0x8f0, 0x8f3, 0x8f6,
-
- 0x8f9, 0x8fc, 0x8ff, 0x902, 0x905, 0x908, 0x90b, 0x90e,
- 0x911, 0x914, 0x917, 0x91a, 0x91d, 0x920, 0x923, 0x926,
-
- 0x929, 0x92c, 0x92f, 0x932, 0x935, 0x938, 0x93b, 0x93e,
- 0x941, 0x944, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
-
- 0x947, 0x94a, 0x94d, 0x950, 0x953, 0x956, 0x959, 0x95c,
- 0x95f, 0x962, 0x965, 0x968, 0x96b, 0x96e, 0x971, 0x974,
-
- 0x977, 0x97a, 0x97d, 0x980, 0x983, 0x986, 0xffff, 0xffff,
- 0x989, 0x98c, 0x98f, 0x992, 0x995, 0x998, 0xffff, 0xffff,
-
- 0x99b, 0x99e, 0x9a1, 0x9a4, 0x9a7, 0x9aa, 0x9ad, 0x9b0,
- 0x9b3, 0x9b6, 0x9b9, 0x9bc, 0x9bf, 0x9c2, 0x9c5, 0x9c8,
-
- 0x9cb, 0x9ce, 0x9d1, 0x9d4, 0x9d7, 0x9da, 0x9dd, 0x9e0,
- 0x9e3, 0x9e6, 0x9e9, 0x9ec, 0x9ef, 0x9f2, 0x9f5, 0x9f8,
-
- 0x9fb, 0x9fe, 0xa01, 0xa04, 0xa07, 0xa0a, 0xffff, 0xffff,
- 0xa0d, 0xa10, 0xa13, 0xa16, 0xa19, 0xa1c, 0xffff, 0xffff,
-
- 0xa1f, 0xa22, 0xa25, 0xa28, 0xa2b, 0xa2e, 0xa31, 0xa34,
- 0xffff, 0xa37, 0xffff, 0xa3a, 0xffff, 0xa3d, 0xffff, 0xa40,
-
- 0xa43, 0xa46, 0xa49, 0xa4c, 0xa4f, 0xa52, 0xa55, 0xa58,
- 0xa5b, 0xa5e, 0xa61, 0xa64, 0xa67, 0xa6a, 0xa6d, 0xa70,
-
- 0xa73, 0xa76, 0xa78, 0xa7b, 0xa7d, 0xa80, 0xa82, 0xa85,
- 0xa87, 0xa8a, 0xa8c, 0xa8f, 0xa91, 0xa94, 0xffff, 0xffff,
-
- 0xa96, 0xa99, 0xa9c, 0xa9f, 0xaa2, 0xaa5, 0xaa8, 0xaab,
- 0xaae, 0xab1, 0xab4, 0xab7, 0xaba, 0xabd, 0xac0, 0xac3,
-
- 0xac6, 0xac9, 0xacc, 0xacf, 0xad2, 0xad5, 0xad8, 0xadb,
- 0xade, 0xae1, 0xae4, 0xae7, 0xaea, 0xaed, 0xaf0, 0xaf3,
-
- 0xaf6, 0xaf9, 0xafc, 0xaff, 0xb02, 0xb05, 0xb08, 0xb0b,
- 0xb0e, 0xb11, 0xb14, 0xb17, 0xb1a, 0xb1d, 0xb20, 0xb23,
-
- 0xb26, 0xb29, 0xb2c, 0xb2f, 0xb32, 0xffff, 0xb35, 0xb38,
- 0xb3b, 0xb3e, 0xb41, 0xb44, 0xb46, 0xb49, 0xb4c, 0xb4e,
-
- 0xb51, 0xb54, 0xb57, 0xb5a, 0xb5d, 0xffff, 0xb60, 0xb63,
- 0xb66, 0xb69, 0xb6b, 0xb6e, 0xb70, 0xb73, 0xb76, 0xb79,
-
- 0xb7c, 0xb7f, 0xb82, 0xb85, 0xffff, 0xffff, 0xb87, 0xb8a,
- 0xb8d, 0xb90, 0xb93, 0xb96, 0xffff, 0xb98, 0xb9b, 0xb9e,
-
- 0xba1, 0xba4, 0xba7, 0xbaa, 0xbac, 0xbaf, 0xbb2, 0xbb5,
- 0xbb8, 0xbbb, 0xbbe, 0xbc1, 0xbc3, 0xbc6, 0xbc9, 0xbcb,
-
- 0xffff, 0xffff, 0xbcd, 0xbd0, 0xbd3, 0xffff, 0xbd6, 0xbd9,
- 0xbdc, 0xbdf, 0xbe1, 0xbe4, 0xbe6, 0xbe9, 0xbeb, 0xffff,
-
- 0xbee, 0xbf0, 0xbf2, 0xbf4, 0xbf6, 0xbf8, 0xbfa, 0xbfc,
- 0xbfe, 0xc00, 0xc02, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
-
- 0xffff, 0xc04, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xc06,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
-
- 0xffff, 0xffff, 0xffff, 0xffff, 0xc09, 0xc0b, 0xc0e, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xc12,
-
- 0xffff, 0xffff, 0xffff, 0xc14, 0xc17, 0xffff, 0xc1b, 0xc1e,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xc22, 0xffff, 0xc25, 0xffff,
-
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xc28,
- 0xc2b, 0xc2e, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
-
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xc31,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xc36,
-
- 0xc38, 0xc3a, 0xffff, 0xffff, 0xc3c, 0xc3e, 0xc40, 0xc42,
- 0xc44, 0xc46, 0xc48, 0xc4a, 0xc4c, 0xc4e, 0xc50, 0xc52,
-
- 0xc54, 0xc56, 0xc58, 0xc5a, 0xc5c, 0xc5e, 0xc60, 0xc62,
- 0xc64, 0xc66, 0xc68, 0xc6a, 0xc6c, 0xc6e, 0xc70, 0xffff,
-
- 0xc72, 0xc74, 0xc76, 0xc78, 0xc7a, 0xc7c, 0xc7e, 0xc80,
- 0xc82, 0xc84, 0xc86, 0xc88, 0xc8a, 0xffff, 0xffff, 0xffff,
-
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xc8c, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
-
- 0xc8f, 0xc93, 0xc97, 0xc99, 0xffff, 0xc9c, 0xca0, 0xca4,
- 0xffff, 0xca6, 0xca9, 0xcab, 0xcad, 0xcaf, 0xcb1, 0xcb3,
-
- 0xcb5, 0xcb7, 0xcb9, 0xcbb, 0xffff, 0xcbd, 0xcbf, 0xffff,
- 0xffff, 0xcc2, 0xcc4, 0xcc6, 0xcc8, 0xcca, 0xffff, 0xffff,
-
- 0xccc, 0xccf, 0xcd3, 0xffff, 0xcd6, 0xffff, 0xcd8, 0xffff,
- 0xcda, 0xffff, 0xcdc, 0xcde, 0xce0, 0xce2, 0xffff, 0xce4,
-
- 0xce6, 0xce8, 0xffff, 0xcea, 0xcec, 0xcee, 0xcf0, 0xcf2,
- 0xcf4, 0xcf6, 0xffff, 0xcf8, 0xcfc, 0xcfe, 0xd00, 0xd02,
-
- 0xd04, 0xffff, 0xffff, 0xffff, 0xffff, 0xd06, 0xd08, 0xd0a,
- 0xd0c, 0xd0e, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
-
- 0xd10, 0xd14, 0xd18, 0xd1d, 0xd21, 0xd25, 0xd29, 0xd2d,
- 0xd31, 0xd35, 0xd39, 0xd3d, 0xd41, 0xd45, 0xd49, 0xd4d,
-
- 0xd50, 0xd52, 0xd55, 0xd59, 0xd5c, 0xd5e, 0xd61, 0xd65,
- 0xd6a, 0xd6d, 0xd6f, 0xd72, 0xd76, 0xd78, 0xd7a, 0xd7c,
-
- 0xd7e, 0xd80, 0xd83, 0xd87, 0xd8a, 0xd8c, 0xd8f, 0xd93,
- 0xd98, 0xd9b, 0xd9d, 0xda0, 0xda4, 0xda6, 0xda8, 0xdaa,
-
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xdac, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
-
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xdb0, 0xdb3, 0xffff, 0xffff, 0xffff, 0xffff,
-
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xdb6, 0xffff,
-
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xdb9, 0xdbc, 0xdbf,
-
- 0xffff, 0xffff, 0xffff, 0xffff, 0xdc2, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xdc5, 0xffff, 0xffff, 0xdc8, 0xffff, 0xffff, 0xffff,
-
- 0xffff, 0xffff, 0xffff, 0xffff, 0xdcb, 0xffff, 0xdce, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xdd1, 0xdd4, 0xffff, 0xdd8,
-
- 0xddb, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
-
- 0xffff, 0xddf, 0xffff, 0xffff, 0xde2, 0xffff, 0xffff, 0xde5,
- 0xffff, 0xde8, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
-
- 0xdeb, 0xffff, 0xdee, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xdf1, 0xdf4, 0xdf7,
-
- 0xdfa, 0xdfd, 0xffff, 0xffff, 0xe00, 0xe03, 0xffff, 0xffff,
- 0xe06, 0xe09, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
-
- 0xe0c, 0xe0f, 0xffff, 0xffff, 0xe12, 0xe15, 0xffff, 0xffff,
- 0xe18, 0xe1b, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
-
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xe1e, 0xe21, 0xe24, 0xe27,
-
- 0xe2a, 0xe2d, 0xe30, 0xe33, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xe36, 0xe39, 0xe3c, 0xe3f, 0xffff, 0xffff,
-
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xe42, 0xe44, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
-
- 0xe46, 0xe48, 0xe4a, 0xe4c, 0xe4e, 0xe50, 0xe52, 0xe54,
- 0xe56, 0xe58, 0xe5b, 0xe5e, 0xe61, 0xe64, 0xe67, 0xe6a,
-
- 0xe6d, 0xe70, 0xe73, 0xe76, 0xe79, 0xe7d, 0xe81, 0xe85,
- 0xe89, 0xe8d, 0xe91, 0xe95, 0xe99, 0xe9d, 0xea2, 0xea7,
-
- 0xeac, 0xeb1, 0xeb6, 0xebb, 0xec0, 0xec5, 0xeca, 0xecf,
- 0xed4, 0xed7, 0xeda, 0xedd, 0xee0, 0xee3, 0xee6, 0xee9,
-
- 0xeec, 0xeef, 0xef3, 0xef7, 0xefb, 0xeff, 0xf03, 0xf07,
- 0xf0b, 0xf0f, 0xf13, 0xf17, 0xf1b, 0xf1f, 0xf23, 0xf27,
-
- 0xf2b, 0xf2f, 0xf33, 0xf37, 0xf3b, 0xf3f, 0xf43, 0xf47,
- 0xf4b, 0xf4f, 0xf53, 0xf57, 0xf5b, 0xf5f, 0xf63, 0xf67,
-
- 0xf6b, 0xf6f, 0xf73, 0xf77, 0xf7b, 0xf7f, 0xf83, 0xf85,
- 0xf87, 0xf89, 0xf8b, 0xf8d, 0xf8f, 0xf91, 0xf93, 0xf95,
-
- 0xf97, 0xf99, 0xf9b, 0xf9d, 0xf9f, 0xfa1, 0xfa3, 0xfa5,
- 0xfa7, 0xfa9, 0xfab, 0xfad, 0xfaf, 0xfb1, 0xfb3, 0xfb5,
-
- 0xfb7, 0xfb9, 0xfbb, 0xfbd, 0xfbf, 0xfc1, 0xfc3, 0xfc5,
- 0xfc7, 0xfc9, 0xfcb, 0xfcd, 0xfcf, 0xfd1, 0xfd3, 0xfd5,
-
- 0xfd7, 0xfd9, 0xfdb, 0xfdd, 0xfdf, 0xfe1, 0xfe3, 0xfe5,
- 0xfe7, 0xfe9, 0xfeb, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
-
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xfed, 0xffff, 0xffff, 0xffff,
-
- 0xffff, 0xffff, 0xffff, 0xffff, 0xff2, 0xff6, 0xff9, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
-
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffd, 0xffff, 0xffff, 0xffff,
-
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0x1000, 0x1002, 0xffff, 0xffff,
-
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0x1004,
-
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0x1006,
-
- 0xffff, 0xffff, 0xffff, 0x1008, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
-
- 0x100a, 0x100c, 0x100e, 0x1010, 0x1012, 0x1014, 0x1016, 0x1018,
- 0x101a, 0x101c, 0x101e, 0x1020, 0x1022, 0x1024, 0x1026, 0x1028,
-
- 0x102a, 0x102c, 0x102e, 0x1030, 0x1032, 0x1034, 0x1036, 0x1038,
- 0x103a, 0x103c, 0x103e, 0x1040, 0x1042, 0x1044, 0x1046, 0x1048,
-
- 0x104a, 0x104c, 0x104e, 0x1050, 0x1052, 0x1054, 0x1056, 0x1058,
- 0x105a, 0x105c, 0x105e, 0x1060, 0x1062, 0x1064, 0x1066, 0x1068,
-
- 0x106a, 0x106c, 0x106e, 0x1070, 0x1072, 0x1074, 0x1076, 0x1078,
- 0x107a, 0x107c, 0x107e, 0x1080, 0x1082, 0x1084, 0x1086, 0x1088,
-
- 0x108a, 0x108c, 0x108e, 0x1090, 0x1092, 0x1094, 0x1096, 0x1098,
- 0x109a, 0x109c, 0x109e, 0x10a0, 0x10a2, 0x10a4, 0x10a6, 0x10a8,
-
- 0x10aa, 0x10ac, 0x10ae, 0x10b0, 0x10b2, 0x10b4, 0x10b6, 0x10b8,
- 0x10ba, 0x10bc, 0x10be, 0x10c0, 0x10c2, 0x10c4, 0x10c6, 0x10c8,
-
- 0x10ca, 0x10cc, 0x10ce, 0x10d0, 0x10d2, 0x10d4, 0x10d6, 0x10d8,
- 0x10da, 0x10dc, 0x10de, 0x10e0, 0x10e2, 0x10e4, 0x10e6, 0x10e8,
-
- 0x10ea, 0x10ec, 0x10ee, 0x10f0, 0x10f2, 0x10f4, 0x10f6, 0x10f8,
- 0x10fa, 0x10fc, 0x10fe, 0x1100, 0x1102, 0x1104, 0x1106, 0x1108,
-
- 0x110a, 0x110c, 0x110e, 0x1110, 0x1112, 0x1114, 0x1116, 0x1118,
- 0x111a, 0x111c, 0x111e, 0x1120, 0x1122, 0x1124, 0x1126, 0x1128,
-
- 0x112a, 0x112c, 0x112e, 0x1130, 0x1132, 0x1134, 0x1136, 0x1138,
- 0x113a, 0x113c, 0x113e, 0x1140, 0x1142, 0x1144, 0x1146, 0x1148,
-
- 0x114a, 0x114c, 0x114e, 0x1150, 0x1152, 0x1154, 0x1156, 0x1158,
- 0x115a, 0x115c, 0x115e, 0x1160, 0x1162, 0x1164, 0x1166, 0x1168,
-
- 0x116a, 0x116c, 0x116e, 0x1170, 0x1172, 0x1174, 0x1176, 0x1178,
- 0x117a, 0x117c, 0x117e, 0x1180, 0x1182, 0x1184, 0x1186, 0x1188,
-
- 0x118a, 0x118c, 0x118e, 0x1190, 0x1192, 0x1194, 0x1196, 0x1198,
- 0x119a, 0x119c, 0x119e, 0x11a0, 0x11a2, 0x11a4, 0x11a6, 0x11a8,
-
- 0x11aa, 0x11ac, 0x11ae, 0x11b0, 0x11b2, 0x11b4, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
-
- 0x11b6, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
-
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0x11b8, 0xffff,
- 0x11ba, 0x11bc, 0x11be, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
-
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0x11c0, 0xffff, 0x11c3, 0xffff,
-
- 0x11c6, 0xffff, 0x11c9, 0xffff, 0x11cc, 0xffff, 0x11cf, 0xffff,
- 0x11d2, 0xffff, 0x11d5, 0xffff, 0x11d8, 0xffff, 0x11db, 0xffff,
-
- 0x11de, 0xffff, 0x11e1, 0xffff, 0xffff, 0x11e4, 0xffff, 0x11e7,
- 0xffff, 0x11ea, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
-
- 0x11ed, 0x11f0, 0xffff, 0x11f3, 0x11f6, 0xffff, 0x11f9, 0x11fc,
- 0xffff, 0x11ff, 0x1202, 0xffff, 0x1205, 0x1208, 0xffff, 0xffff,
-
- 0xffff, 0xffff, 0xffff, 0xffff, 0x120b, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0x120e, 0x1211, 0xffff, 0x1214, 0x1217,
-
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0x121a, 0xffff, 0x121d, 0xffff,
-
- 0x1220, 0xffff, 0x1223, 0xffff, 0x1226, 0xffff, 0x1229, 0xffff,
- 0x122c, 0xffff, 0x122f, 0xffff, 0x1232, 0xffff, 0x1235, 0xffff,
-
- 0x1238, 0xffff, 0x123b, 0xffff, 0xffff, 0x123e, 0xffff, 0x1241,
- 0xffff, 0x1244, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
-
- 0x1247, 0x124a, 0xffff, 0x124d, 0x1250, 0xffff, 0x1253, 0x1256,
- 0xffff, 0x1259, 0x125c, 0xffff, 0x125f, 0x1262, 0xffff, 0xffff,
-
- 0xffff, 0xffff, 0xffff, 0xffff, 0x1265, 0xffff, 0xffff, 0x1268,
- 0x126b, 0x126e, 0x1271, 0xffff, 0xffff, 0xffff, 0x1274, 0x1277,
-
- 0xffff, 0x127a, 0x127c, 0x127e, 0x1280, 0x1282, 0x1284, 0x1286,
- 0x1288, 0x128a, 0x128c, 0x128e, 0x1290, 0x1292, 0x1294, 0x1296,
-
- 0x1298, 0x129a, 0x129c, 0x129e, 0x12a0, 0x12a2, 0x12a4, 0x12a6,
- 0x12a8, 0x12aa, 0x12ac, 0x12ae, 0x12b0, 0x12b2, 0x12b4, 0x12b6,
-
- 0x12b8, 0x12ba, 0x12bc, 0x12be, 0x12c0, 0x12c2, 0x12c4, 0x12c6,
- 0x12c8, 0x12ca, 0x12cc, 0x12ce, 0x12d0, 0x12d2, 0x12d4, 0x12d6,
-
- 0x12d8, 0x12da, 0x12dc, 0x12de, 0x12e0, 0x12e2, 0x12e4, 0x12e6,
- 0x12e8, 0x12ea, 0x12ec, 0x12ee, 0x12f0, 0x12f2, 0x12f4, 0x12f6,
-
- 0x12f8, 0x12fa, 0x12fc, 0x12fe, 0x1300, 0x1302, 0x1304, 0x1306,
- 0x1308, 0x130a, 0x130c, 0x130e, 0x1310, 0x1312, 0x1314, 0x1316,
-
- 0x1318, 0x131a, 0x131c, 0x131e, 0x1320, 0x1322, 0x1324, 0x1326,
- 0x1328, 0x132a, 0x132c, 0x132e, 0x1330, 0x1332, 0x1334, 0xffff,
-
- 0xffff, 0xffff, 0x1336, 0x1338, 0x133a, 0x133c, 0x133e, 0x1340,
- 0x1342, 0x1344, 0x1346, 0x1348, 0x134a, 0x134c, 0x134e, 0x1350,
-
- 0x1352, 0x1356, 0x135a, 0x135e, 0x1362, 0x1366, 0x136a, 0x136e,
- 0x1372, 0x1376, 0x137a, 0x137e, 0x1382, 0x1386, 0x138a, 0x138f,
-
- 0x1394, 0x1399, 0x139e, 0x13a3, 0x13a8, 0x13ad, 0x13b2, 0x13b7,
- 0x13bc, 0x13c1, 0x13c6, 0x13cb, 0x13d0, 0x13d5, 0x13dd, 0xffff,
-
- 0x13e4, 0x13e8, 0x13ec, 0x13f0, 0x13f4, 0x13f8, 0x13fc, 0x1400,
- 0x1404, 0x1408, 0x140c, 0x1410, 0x1414, 0x1418, 0x141c, 0x1420,
-
- 0x1424, 0x1428, 0x142c, 0x1430, 0x1434, 0x1438, 0x143c, 0x1440,
- 0x1444, 0x1448, 0x144c, 0x1450, 0x1454, 0x1458, 0x145c, 0x1460,
-
- 0x1464, 0x1468, 0x146c, 0x1470, 0x1474, 0x1476, 0x1478, 0x147a,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
-
- 0x147c, 0x1480, 0x1483, 0x1486, 0x1489, 0x148c, 0x148f, 0x1492,
- 0x1495, 0x1498, 0x149b, 0x149e, 0x14a1, 0x14a4, 0x14a7, 0x14aa,
-
- 0x14ad, 0x14af, 0x14b1, 0x14b3, 0x14b5, 0x14b7, 0x14b9, 0x14bb,
- 0x14bd, 0x14bf, 0x14c1, 0x14c3, 0x14c5, 0x14c7, 0x14c9, 0x14cc,
-
- 0x14cf, 0x14d2, 0x14d5, 0x14d8, 0x14db, 0x14de, 0x14e1, 0x14e4,
- 0x14e7, 0x14ea, 0x14ed, 0x14f0, 0x14f3, 0x14f9, 0x14fe, 0xffff,
-
- 0x1501, 0x1503, 0x1505, 0x1507, 0x1509, 0x150b, 0x150d, 0x150f,
- 0x1511, 0x1513, 0x1515, 0x1517, 0x1519, 0x151b, 0x151d, 0x151f,
-
- 0x1521, 0x1523, 0x1525, 0x1527, 0x1529, 0x152b, 0x152d, 0x152f,
- 0x1531, 0x1533, 0x1535, 0x1537, 0x1539, 0x153b, 0x153d, 0x153f,
-
- 0x1541, 0x1543, 0x1545, 0x1547, 0x1549, 0x154b, 0x154d, 0x154f,
- 0x1551, 0x1553, 0x1555, 0x1557, 0x1559, 0x155b, 0x155d, 0x155f,
-
- 0x1561, 0x1563, 0x1566, 0x1569, 0x156c, 0x156f, 0x1572, 0x1575,
- 0x1578, 0x157b, 0x157e, 0x1581, 0x1584, 0x1587, 0x158a, 0x158d,
-
- 0x1590, 0x1593, 0x1596, 0x1599, 0x159c, 0x159f, 0x15a2, 0x15a5,
- 0x15a8, 0x15ab, 0x15af, 0x15b3, 0x15b7, 0x15ba, 0x15be, 0x15c1,
-
- 0x15c5, 0x15c7, 0x15c9, 0x15cb, 0x15cd, 0x15cf, 0x15d1, 0x15d3,
- 0x15d5, 0x15d7, 0x15d9, 0x15db, 0x15dd, 0x15df, 0x15e1, 0x15e3,
-
- 0x15e5, 0x15e7, 0x15e9, 0x15eb, 0x15ed, 0x15ef, 0x15f1, 0x15f3,
- 0x15f5, 0x15f7, 0x15f9, 0x15fb, 0x15fd, 0x15ff, 0x1601, 0x1603,
-
- 0x1605, 0x1607, 0x1609, 0x160b, 0x160d, 0x160f, 0x1611, 0x1613,
- 0x1615, 0x1617, 0x1619, 0x161b, 0x161d, 0x161f, 0x1621, 0xffff,
-
- 0x1623, 0x1628, 0x162d, 0x1632, 0x1636, 0x163b, 0x163f, 0x1643,
- 0x1649, 0x164e, 0x1652, 0x1656, 0x165a, 0x165f, 0x1664, 0x1668,
-
- 0x166c, 0x166f, 0x1673, 0x1678, 0x167d, 0x1680, 0x1686, 0x168d,
- 0x1693, 0x1697, 0x169d, 0x16a3, 0x16a8, 0x16ac, 0x16b0, 0x16b4,
-
- 0x16b9, 0x16bf, 0x16c4, 0x16c8, 0x16cc, 0x16d0, 0x16d3, 0x16d6,
- 0x16d9, 0x16dc, 0x16e0, 0x16e4, 0x16ea, 0x16ee, 0x16f3, 0x16f9,
-
- 0x16fd, 0x1700, 0x1703, 0x1709, 0x170e, 0x1714, 0x1718, 0x171e,
- 0x1721, 0x1725, 0x1729, 0x172d, 0x1731, 0x1735, 0x173a, 0x173e,
-
- 0x1741, 0x1745, 0x1749, 0x174d, 0x1752, 0x1756, 0x175a, 0x175e,
- 0x1764, 0x1769, 0x176c, 0x1772, 0x1775, 0x177a, 0x177f, 0x1783,
-
- 0x1787, 0x178b, 0x1790, 0x1793, 0x1797, 0x179c, 0x179f, 0x17a5,
- 0x17a9, 0x17ac, 0x17af, 0x17b2, 0x17b5, 0x17b8, 0x17bb, 0x17be,
-
- 0x17c1, 0x17c4, 0x17c7, 0x17cb, 0x17cf, 0x17d3, 0x17d7, 0x17db,
- 0x17df, 0x17e3, 0x17e7, 0x17eb, 0x17ef, 0x17f3, 0x17f7, 0x17fb,
-
- 0x17ff, 0x1803, 0x1807, 0x180a, 0x180d, 0x1811, 0x1814, 0x1817,
- 0x181a, 0x181e, 0x1822, 0x1825, 0x1828, 0x182b, 0x182e, 0x1831,
-
- 0x1836, 0x1839, 0x183c, 0x183f, 0x1842, 0x1845, 0x1848, 0x184b,
- 0x184e, 0x1852, 0x1857, 0x185a, 0x185d, 0x1860, 0x1863, 0x1866,
-
- 0x1869, 0x186c, 0x1870, 0x1874, 0x1878, 0x187c, 0x187f, 0x1882,
- 0x1885, 0x1888, 0x188b, 0x188e, 0x1891, 0x1894, 0x1897, 0x189a,
-
- 0x189e, 0x18a2, 0x18a5, 0x18a9, 0x18ad, 0x18b1, 0x18b4, 0x18b8,
- 0x18bc, 0x18c1, 0x18c4, 0x18c8, 0x18cc, 0x18d0, 0x18d4, 0x18da,
-
- 0x18e1, 0x18e4, 0x18e7, 0x18ea, 0x18ed, 0x18f0, 0x18f3, 0x18f6,
- 0x18f9, 0x18fc, 0x18ff, 0x1902, 0x1905, 0x1908, 0x190b, 0x190e,
-
- 0x1911, 0x1914, 0x1917, 0x191c, 0x191f, 0x1922, 0x1925, 0x192a,
- 0x192e, 0x1931, 0x1934, 0x1937, 0x193a, 0x193d, 0x1940, 0x1943,
-
- 0x1946, 0x1949, 0x194c, 0x1950, 0x1953, 0x1956, 0x195a, 0x195e,
- 0x1961, 0x1966, 0x196a, 0x196d, 0x1970, 0x1973, 0x1976, 0x197a,
-
- 0x197e, 0x1981, 0x1984, 0x1987, 0x198a, 0x198d, 0x1990, 0x1993,
- 0x1996, 0x1999, 0x199d, 0x19a1, 0x19a5, 0x19a9, 0x19ad, 0x19b1,
-
- 0x19b5, 0x19b9, 0x19bd, 0x19c1, 0x19c5, 0x19c9, 0x19cd, 0x19d1,
- 0x19d5, 0x19d9, 0x19dd, 0x19e1, 0x19e5, 0x19e9, 0x19ed, 0x19f1,
-
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
-
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0x19f5, 0x19f7, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
-
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0x19f9, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0x19fb, 0x19fd, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
-
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0x19ff, 0x1a01, 0x1a03, 0x1a05,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
-
- 0x1a07, 0x1a09, 0x1a0b, 0x1a0d, 0x1a0f, 0x1a11, 0x1a13, 0x1a15,
- 0x1a17, 0x1a19, 0x1a1b, 0x1a1d, 0x1a1f, 0x1a21, 0x1a23, 0x1a25,
- 0x1a27, 0x1a29, 0x1a2b, 0x1a2d, 0x1a2f, 0x1a31, 0x1a33, 0x1a35,
- 0x1a37, 0x1a39, 0x1a3b, 0x1a3d, 0x1a3f, 0x1a41, 0x1a43, 0x1a45,
- 0x1a47, 0x1a49, 0x1a4b, 0x1a4d, 0x1a4f, 0x1a51, 0x1a53, 0x1a55,
- 0x1a57, 0x1a59, 0x1a5b, 0x1a5d, 0x1a5f, 0x1a61, 0x1a63, 0x1a65,
- 0x1a67, 0x1a69, 0x1a6b, 0x1a6d, 0x1a6f, 0x1a71, 0x1a73, 0x1a75,
- 0x1a77, 0x1a79, 0x1a7b, 0x1a7d, 0x1a7f, 0x1a81, 0x1a83, 0x1a85,
- 0x1a87, 0x1a89, 0x1a8b, 0x1a8d, 0x1a8f, 0x1a91, 0x1a93, 0x1a95,
- 0x1a97, 0x1a99, 0x1a9b, 0x1a9d, 0x1a9f, 0x1aa1, 0x1aa3, 0x1aa5,
- 0x1aa7, 0x1aa9, 0x1aab, 0x1aad, 0x1aaf, 0x1ab1, 0x1ab3, 0x1ab5,
- 0x1ab7, 0x1ab9, 0x1abb, 0x1abd, 0x1abf, 0x1ac1, 0x1ac3, 0x1ac5,
- 0x1ac7, 0x1ac9, 0x1acb, 0x1acd, 0x1acf, 0x1ad1, 0x1ad3, 0x1ad5,
- 0x1ad7, 0x1ad9, 0x1adb, 0x1add, 0x1adf, 0x1ae1, 0x1ae3, 0x1ae5,
- 0x1ae7, 0x1ae9, 0x1aeb, 0x1aed, 0x1aef, 0x1af1, 0x1af3, 0x1af5,
- 0x1af7, 0x1af9, 0x1afb, 0x1afd, 0x1aff, 0x1b01, 0x1b03, 0x1b05,
- 0x1b07, 0x1b09, 0x1b0b, 0x1b0d, 0x1b0f, 0x1b11, 0x1b13, 0x1b15,
- 0x1b17, 0x1b19, 0x1b1b, 0x1b1d, 0x1b1f, 0x1b21, 0x1b23, 0x1b25,
- 0x1b27, 0x1b29, 0x1b2b, 0x1b2d, 0x1b2f, 0x1b31, 0x1b33, 0x1b35,
- 0x1b37, 0x1b39, 0x1b3b, 0x1b3d, 0x1b3f, 0x1b41, 0x1b43, 0x1b45,
- 0x1b47, 0x1b49, 0x1b4b, 0x1b4d, 0x1b4f, 0x1b51, 0x1b53, 0x1b55,
- 0x1b57, 0x1b59, 0x1b5b, 0x1b5d, 0x1b5f, 0x1b61, 0x1b63, 0x1b65,
- 0x1b67, 0x1b69, 0x1b6b, 0x1b6d, 0x1b6f, 0x1b71, 0x1b73, 0x1b75,
- 0x1b77, 0x1b79, 0x1b7b, 0x1b7d, 0x1b7f, 0x1b81, 0x1b83, 0x1b85,
- 0x1b87, 0x1b89, 0x1b8b, 0x1b8d, 0x1b8f, 0x1b91, 0x1b93, 0x1b95,
- 0x1b97, 0x1b99, 0x1b9b, 0x1b9d, 0x1b9f, 0x1ba1, 0x1ba3, 0x1ba5,
- 0x1ba7, 0x1ba9, 0x1bab, 0x1bad, 0x1baf, 0x1bb1, 0x1bb3, 0x1bb5,
- 0x1bb7, 0x1bb9, 0x1bbb, 0x1bbd, 0x1bbf, 0x1bc1, 0x1bc3, 0x1bc5,
- 0x1bc7, 0x1bc9, 0x1bcb, 0x1bcd, 0x1bcf, 0x1bd1, 0x1bd3, 0x1bd5,
- 0x1bd7, 0x1bd9, 0x1bdb, 0x1bdd, 0x1bdf, 0x1be1, 0x1be3, 0x1be5,
- 0x1be7, 0x1be9, 0x1beb, 0x1bed, 0x1bef, 0x1bf1, 0x1bf3, 0x1bf5,
- 0x1bf7, 0x1bf9, 0x1bfb, 0x1bfd, 0x1bff, 0x1c01, 0x1c03, 0x1c05,
-
- 0x1c07, 0x1c09, 0x1c0b, 0x1c0d, 0x1c0f, 0x1c11, 0x1c13, 0x1c15,
- 0x1c17, 0x1c19, 0x1c1b, 0x1c1d, 0x1c1f, 0x1c21, 0xffff, 0xffff,
- 0x1c23, 0xffff, 0x1c25, 0xffff, 0xffff, 0x1c27, 0x1c29, 0x1c2b,
- 0x1c2d, 0x1c2f, 0x1c31, 0x1c33, 0x1c35, 0x1c37, 0x1c39, 0xffff,
- 0x1c3b, 0xffff, 0x1c3d, 0xffff, 0xffff, 0x1c3f, 0x1c41, 0xffff,
- 0xffff, 0xffff, 0x1c43, 0x1c45, 0x1c47, 0x1c49, 0x1c4b, 0x1c4d,
- 0x1c4f, 0x1c51, 0x1c53, 0x1c55, 0x1c57, 0x1c59, 0x1c5b, 0x1c5d,
- 0x1c5f, 0x1c61, 0x1c63, 0x1c65, 0x1c67, 0x1c69, 0x1c6b, 0x1c6d,
- 0x1c6f, 0x1c71, 0x1c73, 0x1c75, 0x1c77, 0x1c79, 0x1c7b, 0x1c7d,
- 0x1c7f, 0x1c81, 0x1c83, 0x1c85, 0x1c87, 0x1c89, 0x1c8b, 0x1c8d,
- 0x1c8f, 0x1c91, 0x1c93, 0x1c95, 0x1c97, 0x1c99, 0x1c9b, 0x1c9d,
- 0x1c9f, 0x1ca1, 0x1ca3, 0x1ca5, 0x1ca7, 0x1ca9, 0x1cab, 0x1cad,
- 0x1caf, 0x1cb1, 0x1cb3, 0x1cb5, 0x1cb7, 0x1cb9, 0x1cbb, 0x1cbd,
- 0x1cbf, 0x1cc1, 0x1cc3, 0x1cc5, 0x1cc7, 0x1cca, 0xffff, 0xffff,
- 0x1ccc, 0x1cce, 0x1cd0, 0x1cd2, 0x1cd4, 0x1cd6, 0x1cd8, 0x1cda,
- 0x1cdc, 0x1cde, 0x1ce0, 0x1ce2, 0x1ce4, 0x1ce6, 0x1ce8, 0x1cea,
- 0x1cec, 0x1cee, 0x1cf0, 0x1cf2, 0x1cf4, 0x1cf6, 0x1cf8, 0x1cfa,
- 0x1cfc, 0x1cfe, 0x1d00, 0x1d02, 0x1d04, 0x1d06, 0x1d08, 0x1d0a,
- 0x1d0c, 0x1d0e, 0x1d10, 0x1d12, 0x1d14, 0x1d16, 0x1d18, 0x1d1a,
- 0x1d1c, 0x1d1e, 0x1d20, 0x1d22, 0x1d24, 0x1d26, 0x1d28, 0x1d2a,
- 0x1d2c, 0x1d2e, 0x1d30, 0x1d32, 0x1d34, 0x1d36, 0x1d38, 0x1d3a,
- 0x1d3c, 0x1d3e, 0x1d40, 0x1d42, 0x1d44, 0x1d46, 0x1d48, 0x1d4a,
- 0x1d4c, 0x1d4e, 0x1d50, 0x1d52, 0x1d54, 0x1d56, 0x1d58, 0x1d5a,
- 0x1d5c, 0x1d5e, 0x1d60, 0x1d62, 0x1d64, 0x1d66, 0x1d68, 0x1d6a,
- 0x1d6c, 0x1d6e, 0x1d70, 0x1d72, 0x1d74, 0x1d76, 0x1d78, 0x1d7a,
- 0x1d7c, 0x1d7e, 0x1d80, 0x1d82, 0x1d84, 0x1d86, 0x1d88, 0x1d8a,
- 0x1d8d, 0x1d90, 0x1d93, 0x1d95, 0x1d97, 0x1d99, 0x1d9c, 0x1d9f,
- 0x1da2, 0x1da4, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
-
- 0x1da6, 0x1da9, 0x1dac, 0x1daf, 0x1db3, 0x1db7, 0x1dba, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0x1dbd, 0x1dc0, 0x1dc3, 0x1dc6, 0x1dc9,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0x1dcc, 0xffff, 0x1dcf,
- 0x1dd2, 0x1dd4, 0x1dd6, 0x1dd8, 0x1dda, 0x1ddc, 0x1dde, 0x1de0,
- 0x1de2, 0x1de4, 0x1de6, 0x1de9, 0x1dec, 0x1def, 0x1df2, 0x1df5,
- 0x1df8, 0x1dfb, 0x1dfe, 0x1e01, 0x1e04, 0x1e07, 0x1e0a, 0xffff,
- 0x1e0d, 0x1e10, 0x1e13, 0x1e16, 0x1e19, 0xffff, 0x1e1c, 0xffff,
- 0x1e1f, 0x1e22, 0xffff, 0x1e25, 0x1e28, 0xffff, 0x1e2b, 0x1e2e,
- 0x1e31, 0x1e34, 0x1e37, 0x1e3a, 0x1e3d, 0x1e40, 0x1e43, 0x1e46,
- 0x1e49, 0x1e4b, 0x1e4d, 0x1e4f, 0x1e51, 0x1e53, 0x1e55, 0x1e57,
- 0x1e59, 0x1e5b, 0x1e5d, 0x1e5f, 0x1e61, 0x1e63, 0x1e65, 0x1e67,
- 0x1e69, 0x1e6b, 0x1e6d, 0x1e6f, 0x1e71, 0x1e73, 0x1e75, 0x1e77,
- 0x1e79, 0x1e7b, 0x1e7d, 0x1e7f, 0x1e81, 0x1e83, 0x1e85, 0x1e87,
- 0x1e89, 0x1e8b, 0x1e8d, 0x1e8f, 0x1e91, 0x1e93, 0x1e95, 0x1e97,
- 0x1e99, 0x1e9b, 0x1e9d, 0x1e9f, 0x1ea1, 0x1ea3, 0x1ea5, 0x1ea7,
- 0x1ea9, 0x1eab, 0x1ead, 0x1eaf, 0x1eb1, 0x1eb3, 0x1eb5, 0x1eb7,
- 0x1eb9, 0x1ebb, 0x1ebd, 0x1ebf, 0x1ec1, 0x1ec3, 0x1ec5, 0x1ec7,
- 0x1ec9, 0x1ecb, 0x1ecd, 0x1ecf, 0x1ed1, 0x1ed3, 0x1ed5, 0x1ed7,
- 0x1ed9, 0x1edb, 0x1edd, 0x1edf, 0x1ee1, 0x1ee3, 0x1ee5, 0x1ee7,
- 0x1ee9, 0x1eeb, 0x1eed, 0x1eef, 0x1ef1, 0x1ef3, 0x1ef5, 0x1ef7,
- 0x1ef9, 0x1efb, 0x1efd, 0x1eff, 0x1f01, 0x1f03, 0x1f05, 0x1f07,
- 0x1f09, 0x1f0b, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0x1f0d, 0x1f0f, 0x1f11, 0x1f13, 0x1f15,
- 0x1f17, 0x1f19, 0x1f1b, 0x1f1d, 0x1f1f, 0x1f21, 0x1f23, 0x1f25,
- 0x1f27, 0x1f29, 0x1f2b, 0x1f2d, 0x1f2f, 0x1f31, 0x1f33, 0x1f35,
- 0x1f37, 0x1f39, 0x1f3b, 0x1f3e, 0x1f41, 0x1f44, 0x1f47, 0x1f4a,
- 0x1f4d, 0x1f50, 0x1f53, 0x1f56, 0x1f59, 0x1f5c, 0x1f5f, 0x1f62,
- 0x1f65, 0x1f68, 0x1f6b, 0x1f6e, 0x1f71, 0x1f73, 0x1f75, 0x1f77,
-
- 0x1f79, 0x1f7c, 0x1f7f, 0x1f82, 0x1f85, 0x1f88, 0x1f8b, 0x1f8e,
- 0x1f91, 0x1f94, 0x1f97, 0x1f9a, 0x1f9d, 0x1fa0, 0x1fa3, 0x1fa6,
- 0x1fa9, 0x1fac, 0x1faf, 0x1fb2, 0x1fb5, 0x1fb8, 0x1fbb, 0x1fbe,
- 0x1fc1, 0x1fc4, 0x1fc7, 0x1fca, 0x1fcd, 0x1fd0, 0x1fd3, 0x1fd6,
- 0x1fd9, 0x1fdc, 0x1fdf, 0x1fe2, 0x1fe5, 0x1fe8, 0x1feb, 0x1fee,
- 0x1ff1, 0x1ff4, 0x1ff7, 0x1ffa, 0x1ffd, 0x2000, 0x2003, 0x2006,
- 0x2009, 0x200c, 0x200f, 0x2012, 0x2015, 0x2018, 0x201b, 0x201e,
- 0x2021, 0x2024, 0x2027, 0x202a, 0x202d, 0x2030, 0x2033, 0x2036,
- 0x2039, 0x203c, 0x203f, 0x2042, 0x2045, 0x2048, 0x204b, 0x204e,
- 0x2051, 0x2054, 0x2057, 0x205a, 0x205d, 0x2060, 0x2063, 0x2066,
- 0x2069, 0x206c, 0x206f, 0x2072, 0x2075, 0x2078, 0x207b, 0x207e,
- 0x2081, 0x2084, 0x2087, 0x208a, 0x208d, 0x2090, 0x2093, 0x2097,
- 0x209b, 0x209f, 0x20a3, 0x20a7, 0x20ab, 0x20ae, 0x20b1, 0x20b4,
- 0x20b7, 0x20ba, 0x20bd, 0x20c0, 0x20c3, 0x20c6, 0x20c9, 0x20cc,
- 0x20cf, 0x20d2, 0x20d5, 0x20d8, 0x20db, 0x20de, 0x20e1, 0x20e4,
- 0x20e7, 0x20ea, 0x20ed, 0x20f0, 0x20f3, 0x20f6, 0x20f9, 0x20fc,
- 0x20ff, 0x2102, 0x2105, 0x2108, 0x210b, 0x210e, 0x2111, 0x2114,
- 0x2117, 0x211a, 0x211d, 0x2120, 0x2123, 0x2126, 0x2129, 0x212c,
- 0x212f, 0x2132, 0x2135, 0x2138, 0x213b, 0x213e, 0x2141, 0x2144,
- 0x2147, 0x214a, 0x214d, 0x2150, 0x2153, 0x2156, 0x2159, 0x215c,
- 0x215f, 0x2162, 0x2165, 0x2168, 0x216b, 0x216e, 0x2171, 0x2174,
- 0x2177, 0x217a, 0x217d, 0x2180, 0x2183, 0x2186, 0x2189, 0x218c,
- 0x218f, 0x2192, 0x2195, 0x2198, 0x219b, 0x219e, 0x21a1, 0x21a4,
- 0x21a7, 0x21aa, 0x21ad, 0x21b0, 0x21b3, 0x21b6, 0x21b9, 0x21bc,
- 0x21bf, 0x21c2, 0x21c5, 0x21c8, 0x21cb, 0x21ce, 0x21d1, 0x21d4,
- 0x21d7, 0x21da, 0x21dd, 0x21e0, 0x21e3, 0x21e6, 0x21e9, 0x21ec,
- 0x21ef, 0x21f2, 0x21f5, 0x21f8, 0x21fb, 0x21fe, 0x2201, 0x2204,
- 0x2207, 0x220a, 0x220d, 0x2210, 0x2213, 0x2216, 0x2219, 0x221c,
- 0x221f, 0x2222, 0x2225, 0x2228, 0x222b, 0x222e, 0x2231, 0x2234,
- 0x2237, 0x223a, 0x223d, 0x2240, 0x2243, 0x2246, 0x2249, 0x224c,
- 0x224f, 0x2252, 0x2255, 0x2259, 0x225d, 0x2261, 0x2264, 0x2267,
- 0x226a, 0x226d, 0x2270, 0x2273, 0x2276, 0x2279, 0x227c, 0x227f,
-
- 0x2282, 0x2285, 0x2288, 0x228b, 0x228e, 0x2291, 0x2294, 0x2297,
- 0x229a, 0x229d, 0x22a0, 0x22a3, 0x22a6, 0x22a9, 0x22ac, 0x22af,
- 0x22b2, 0x22b5, 0x22b8, 0x22bb, 0x22be, 0x22c1, 0x22c4, 0x22c7,
- 0x22ca, 0x22cd, 0x22d0, 0x22d3, 0x22d6, 0x22d9, 0x22dc, 0x22df,
- 0x22e2, 0x22e5, 0x22e8, 0x22eb, 0x22ee, 0x22f1, 0x22f4, 0x22f7,
- 0x22fa, 0x22fd, 0x2300, 0x2303, 0x2306, 0x2309, 0x230c, 0x230f,
- 0x2312, 0x2315, 0x2318, 0x231b, 0x231e, 0x2321, 0x2324, 0x2327,
- 0x232a, 0x232d, 0x2330, 0x2333, 0x2336, 0x2339, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0x233c, 0x2340, 0x2344, 0x2348, 0x234c, 0x2350, 0x2354, 0x2358,
- 0x235c, 0x2360, 0x2364, 0x2368, 0x236c, 0x2370, 0x2374, 0x2378,
- 0x237c, 0x2380, 0x2384, 0x2388, 0x238c, 0x2390, 0x2394, 0x2398,
- 0x239c, 0x23a0, 0x23a4, 0x23a8, 0x23ac, 0x23b0, 0x23b4, 0x23b8,
- 0x23bc, 0x23c0, 0x23c4, 0x23c8, 0x23cc, 0x23d0, 0x23d4, 0x23d8,
- 0x23dc, 0x23e0, 0x23e4, 0x23e8, 0x23ec, 0x23f0, 0x23f4, 0x23f8,
- 0x23fc, 0x2400, 0x2404, 0x2408, 0x240c, 0x2410, 0x2414, 0x2418,
- 0x241c, 0x2420, 0x2424, 0x2428, 0x242c, 0x2430, 0x2434, 0x2438,
- 0xffff, 0xffff, 0x243c, 0x2440, 0x2444, 0x2448, 0x244c, 0x2450,
- 0x2454, 0x2458, 0x245c, 0x2460, 0x2464, 0x2468, 0x246c, 0x2470,
- 0x2474, 0x2478, 0x247c, 0x2480, 0x2484, 0x2488, 0x248c, 0x2490,
- 0x2494, 0x2498, 0x249c, 0x24a0, 0x24a4, 0x24a8, 0x24ac, 0x24b0,
- 0x24b4, 0x24b8, 0x24bc, 0x24c0, 0x24c4, 0x24c8, 0x24cc, 0x24d0,
- 0x24d4, 0x24d8, 0x24dc, 0x24e0, 0x24e4, 0x24e8, 0x24ec, 0x24f0,
- 0x24f4, 0x24f8, 0x24fc, 0x2500, 0x2504, 0x2508, 0x250c, 0x2510,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0x2514, 0x2518, 0x251c, 0x2521, 0x2526, 0x252b, 0x2530, 0x2535,
- 0x253a, 0x253f, 0x2543, 0x2556, 0x255f, 0xffff, 0xffff, 0xffff,
-
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0x2564, 0x2566, 0x2568, 0x256a, 0x256c, 0x256e, 0x2570, 0x2572,
- 0x2574, 0x2576, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0x2578, 0x257a, 0x257c, 0x257e, 0x2580, 0x2582, 0x2584, 0x2586,
- 0x2588, 0x258a, 0x258c, 0x258e, 0x2590, 0x2592, 0x2594, 0x2596,
- 0x2598, 0x259a, 0x259c, 0x259e, 0x25a0, 0xffff, 0xffff, 0x25a2,
- 0x25a4, 0x25a6, 0x25a8, 0x25aa, 0x25ac, 0x25ae, 0x25b0, 0x25b2,
- 0x25b4, 0x25b6, 0x25b8, 0xffff, 0x25ba, 0x25bc, 0x25be, 0x25c0,
- 0x25c2, 0x25c4, 0x25c6, 0x25c8, 0x25ca, 0x25cc, 0x25ce, 0x25d0,
- 0x25d2, 0x25d4, 0x25d6, 0x25d8, 0x25da, 0x25dc, 0x25de, 0xffff,
- 0x25e0, 0x25e2, 0x25e4, 0x25e6, 0xffff, 0xffff, 0xffff, 0xffff,
- 0x25e8, 0x25eb, 0x25ee, 0xffff, 0x25f1, 0xffff, 0x25f4, 0x25f7,
- 0x25fa, 0x25fd, 0x2600, 0x2603, 0x2606, 0x2609, 0x260c, 0x260f,
- 0x2612, 0x2614, 0x2616, 0x2618, 0x261a, 0x261c, 0x261e, 0x2620,
- 0x2622, 0x2624, 0x2626, 0x2628, 0x262a, 0x262c, 0x262e, 0x2630,
- 0x2632, 0x2634, 0x2636, 0x2638, 0x263a, 0x263c, 0x263e, 0x2640,
- 0x2642, 0x2644, 0x2646, 0x2648, 0x264a, 0x264c, 0x264e, 0x2650,
- 0x2652, 0x2654, 0x2656, 0x2658, 0x265a, 0x265c, 0x265e, 0x2660,
- 0x2662, 0x2664, 0x2666, 0x2668, 0x266a, 0x266c, 0x266e, 0x2670,
- 0x2672, 0x2674, 0x2676, 0x2678, 0x267a, 0x267c, 0x267e, 0x2680,
- 0x2682, 0x2684, 0x2686, 0x2688, 0x268a, 0x268c, 0x268e, 0x2690,
- 0x2692, 0x2694, 0x2696, 0x2698, 0x269a, 0x269c, 0x269e, 0x26a0,
- 0x26a2, 0x26a4, 0x26a6, 0x26a8, 0x26aa, 0x26ac, 0x26ae, 0x26b0,
- 0x26b2, 0x26b4, 0x26b6, 0x26b8, 0x26ba, 0x26bc, 0x26be, 0x26c0,
- 0x26c2, 0x26c4, 0x26c6, 0x26c8, 0x26ca, 0x26cc, 0x26ce, 0x26d0,
- 0x26d2, 0x26d4, 0x26d6, 0x26d8, 0x26da, 0x26dc, 0x26de, 0x26e0,
- 0x26e2, 0x26e4, 0x26e6, 0x26e8, 0x26ea, 0x26ec, 0x26ee, 0x26f0,
- 0x26f2, 0x26f4, 0x26f6, 0x26f8, 0x26fa, 0x26fc, 0x26ff, 0x2702,
- 0x2705, 0x2708, 0x270b, 0x270e, 0x2711, 0xffff, 0xffff, 0xffff,
-
- 0xffff, 0x2714, 0x2716, 0x2718, 0x271a, 0x271c, 0x271e, 0x2720,
- 0x2722, 0x2724, 0x2726, 0x2728, 0x272a, 0x272c, 0x272e, 0x2730,
- 0x2732, 0x2734, 0x2736, 0x2738, 0x273a, 0x273c, 0x273e, 0x2740,
- 0x2742, 0x2744, 0x2746, 0x2748, 0x274a, 0x274c, 0x274e, 0x2750,
- 0x2752, 0x2754, 0x2756, 0x2758, 0x275a, 0x275c, 0x275e, 0x2760,
- 0x2762, 0x2764, 0x2766, 0x2768, 0x276a, 0x276c, 0x276e, 0x2770,
- 0x2772, 0x2774, 0x2776, 0x2778, 0x277a, 0x277c, 0x277e, 0x2780,
- 0x2782, 0x2784, 0x2786, 0x2788, 0x278a, 0x278c, 0x278e, 0x2790,
- 0x2792, 0x2794, 0x2796, 0x2798, 0x279a, 0x279c, 0x279e, 0x27a0,
- 0x27a2, 0x27a4, 0x27a6, 0x27a8, 0x27aa, 0x27ac, 0x27ae, 0x27b0,
- 0x27b2, 0x27b4, 0x27b6, 0x27b8, 0x27ba, 0x27bc, 0x27be, 0x27c0,
- 0x27c2, 0x27c4, 0x27c6, 0x27c8, 0x27ca, 0x27cc, 0x27ce, 0x27d0,
- 0x27d2, 0x27d4, 0x27d6, 0x27d8, 0x27da, 0x27dc, 0x27de, 0x27e0,
- 0x27e2, 0x27e4, 0x27e6, 0x27e8, 0x27ea, 0x27ec, 0x27ee, 0x27f0,
- 0x27f2, 0x27f4, 0x27f6, 0x27f8, 0x27fa, 0x27fc, 0x27fe, 0x2800,
- 0x2802, 0x2804, 0x2806, 0x2808, 0x280a, 0x280c, 0x280e, 0x2810,
- 0x2812, 0x2814, 0x2816, 0x2818, 0x281a, 0x281c, 0x281e, 0x2820,
- 0x2822, 0x2824, 0x2826, 0x2828, 0x282a, 0x282c, 0x282e, 0x2830,
- 0x2832, 0x2834, 0x2836, 0x2838, 0x283a, 0x283c, 0x283e, 0x2840,
- 0x2842, 0x2844, 0x2846, 0x2848, 0x284a, 0x284c, 0x284e, 0x2850,
- 0x2852, 0x2854, 0x2856, 0x2858, 0x285a, 0x285c, 0x285e, 0x2860,
- 0x2862, 0x2864, 0x2866, 0x2868, 0x286a, 0x286c, 0x286e, 0x2870,
- 0x2872, 0x2874, 0x2876, 0x2878, 0x287a, 0x287c, 0x287e, 0x2880,
- 0x2882, 0x2884, 0x2886, 0x2888, 0x288a, 0x288c, 0x288e, 0xffff,
- 0xffff, 0xffff, 0x2890, 0x2892, 0x2894, 0x2896, 0x2898, 0x289a,
- 0xffff, 0xffff, 0x289c, 0x289e, 0x28a0, 0x28a2, 0x28a4, 0x28a6,
- 0xffff, 0xffff, 0x28a8, 0x28aa, 0x28ac, 0x28ae, 0x28b0, 0x28b2,
- 0xffff, 0xffff, 0x28b4, 0x28b6, 0x28b8, 0xffff, 0xffff, 0xffff,
- 0x28ba, 0x28bc, 0x28be, 0x28c0, 0x28c2, 0x28c4, 0x28c6, 0xffff,
- 0x28c8, 0x28ca, 0x28cc, 0x28ce, 0x28d0, 0x28d2, 0x28d4, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
-
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0x28d6, 0xffff, 0x28db, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0x28e0, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
-
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0x28e5, 0x28ea,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
-
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0x28ef, 0x28f4, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
-
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0x28f9, 0x28fe, 0xffff, 0x2903, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
-
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0x2908, 0x290d, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
-
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0x2912, 0x2917,
- 0x291c, 0x2921, 0x2926, 0x292b, 0x2930, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0x2935, 0x293a, 0x293f, 0x2944, 0x2949,
- 0x294e, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
-
- 0x2953, 0x2955, 0x2957, 0x2959, 0x295b, 0x295d, 0x295f, 0x2961,
- 0x2963, 0x2965, 0x2967, 0x2969, 0x296b, 0x296d, 0x296f, 0x2971,
- 0x2973, 0x2975, 0x2977, 0x2979, 0x297b, 0x297d, 0x297f, 0x2981,
- 0x2983, 0x2985, 0x2987, 0x2989, 0x298b, 0x298d, 0x298f, 0x2991,
- 0x2993, 0x2995, 0x2997, 0x2999, 0x299b, 0x299d, 0x299f, 0x29a1,
- 0x29a3, 0x29a5, 0x29a7, 0x29a9, 0x29ab, 0x29ad, 0x29af, 0x29b1,
- 0x29b3, 0x29b5, 0x29b7, 0x29b9, 0x29bb, 0x29bd, 0x29bf, 0x29c1,
- 0x29c3, 0x29c5, 0x29c7, 0x29c9, 0x29cb, 0x29cd, 0x29cf, 0x29d1,
- 0x29d3, 0x29d5, 0x29d7, 0x29d9, 0x29db, 0x29dd, 0x29df, 0x29e1,
- 0x29e3, 0x29e5, 0x29e7, 0x29e9, 0x29eb, 0x29ed, 0x29ef, 0x29f1,
- 0x29f3, 0x29f5, 0x29f7, 0x29f9, 0x29fb, 0xffff, 0x29fd, 0x29ff,
- 0x2a01, 0x2a03, 0x2a05, 0x2a07, 0x2a09, 0x2a0b, 0x2a0d, 0x2a0f,
- 0x2a11, 0x2a13, 0x2a15, 0x2a17, 0x2a19, 0x2a1b, 0x2a1d, 0x2a1f,
- 0x2a21, 0x2a23, 0x2a25, 0x2a27, 0x2a29, 0x2a2b, 0x2a2d, 0x2a2f,
- 0x2a31, 0x2a33, 0x2a35, 0x2a37, 0x2a39, 0x2a3b, 0x2a3d, 0x2a3f,
- 0x2a41, 0x2a43, 0x2a45, 0x2a47, 0x2a49, 0x2a4b, 0x2a4d, 0x2a4f,
- 0x2a51, 0x2a53, 0x2a55, 0x2a57, 0x2a59, 0x2a5b, 0x2a5d, 0x2a5f,
- 0x2a61, 0x2a63, 0x2a65, 0x2a67, 0x2a69, 0x2a6b, 0x2a6d, 0x2a6f,
- 0x2a71, 0x2a73, 0x2a75, 0x2a77, 0x2a79, 0x2a7b, 0x2a7d, 0x2a7f,
- 0x2a81, 0x2a83, 0x2a85, 0x2a87, 0x2a89, 0xffff, 0x2a8b, 0x2a8d,
- 0xffff, 0xffff, 0x2a8f, 0xffff, 0xffff, 0x2a91, 0x2a93, 0xffff,
- 0xffff, 0x2a95, 0x2a97, 0x2a99, 0x2a9b, 0xffff, 0x2a9d, 0x2a9f,
- 0x2aa1, 0x2aa3, 0x2aa5, 0x2aa7, 0x2aa9, 0x2aab, 0x2aad, 0x2aaf,
- 0x2ab1, 0x2ab3, 0xffff, 0x2ab5, 0xffff, 0x2ab7, 0x2ab9, 0x2abb,
- 0x2abd, 0x2abf, 0x2ac1, 0x2ac3, 0xffff, 0x2ac5, 0x2ac7, 0x2ac9,
- 0x2acb, 0x2acd, 0x2acf, 0x2ad1, 0x2ad3, 0x2ad5, 0x2ad7, 0x2ad9,
- 0x2adb, 0x2add, 0x2adf, 0x2ae1, 0x2ae3, 0x2ae5, 0x2ae7, 0x2ae9,
- 0x2aeb, 0x2aed, 0x2aef, 0x2af1, 0x2af3, 0x2af5, 0x2af7, 0x2af9,
- 0x2afb, 0x2afd, 0x2aff, 0x2b01, 0x2b03, 0x2b05, 0x2b07, 0x2b09,
- 0x2b0b, 0x2b0d, 0x2b0f, 0x2b11, 0x2b13, 0x2b15, 0x2b17, 0x2b19,
- 0x2b1b, 0x2b1d, 0x2b1f, 0x2b21, 0x2b23, 0x2b25, 0x2b27, 0x2b29,
- 0x2b2b, 0x2b2d, 0x2b2f, 0x2b31, 0x2b33, 0x2b35, 0x2b37, 0x2b39,
-
- 0x2b3b, 0x2b3d, 0x2b3f, 0x2b41, 0x2b43, 0x2b45, 0xffff, 0x2b47,
- 0x2b49, 0x2b4b, 0x2b4d, 0xffff, 0xffff, 0x2b4f, 0x2b51, 0x2b53,
- 0x2b55, 0x2b57, 0x2b59, 0x2b5b, 0x2b5d, 0xffff, 0x2b5f, 0x2b61,
- 0x2b63, 0x2b65, 0x2b67, 0x2b69, 0x2b6b, 0xffff, 0x2b6d, 0x2b6f,
- 0x2b71, 0x2b73, 0x2b75, 0x2b77, 0x2b79, 0x2b7b, 0x2b7d, 0x2b7f,
- 0x2b81, 0x2b83, 0x2b85, 0x2b87, 0x2b89, 0x2b8b, 0x2b8d, 0x2b8f,
- 0x2b91, 0x2b93, 0x2b95, 0x2b97, 0x2b99, 0x2b9b, 0x2b9d, 0x2b9f,
- 0x2ba1, 0x2ba3, 0xffff, 0x2ba5, 0x2ba7, 0x2ba9, 0x2bab, 0xffff,
- 0x2bad, 0x2baf, 0x2bb1, 0x2bb3, 0x2bb5, 0xffff, 0x2bb7, 0xffff,
- 0xffff, 0xffff, 0x2bb9, 0x2bbb, 0x2bbd, 0x2bbf, 0x2bc1, 0x2bc3,
- 0x2bc5, 0xffff, 0x2bc7, 0x2bc9, 0x2bcb, 0x2bcd, 0x2bcf, 0x2bd1,
- 0x2bd3, 0x2bd5, 0x2bd7, 0x2bd9, 0x2bdb, 0x2bdd, 0x2bdf, 0x2be1,
- 0x2be3, 0x2be5, 0x2be7, 0x2be9, 0x2beb, 0x2bed, 0x2bef, 0x2bf1,
- 0x2bf3, 0x2bf5, 0x2bf7, 0x2bf9, 0x2bfb, 0x2bfd, 0x2bff, 0x2c01,
- 0x2c03, 0x2c05, 0x2c07, 0x2c09, 0x2c0b, 0x2c0d, 0x2c0f, 0x2c11,
- 0x2c13, 0x2c15, 0x2c17, 0x2c19, 0x2c1b, 0x2c1d, 0x2c1f, 0x2c21,
- 0x2c23, 0x2c25, 0x2c27, 0x2c29, 0x2c2b, 0x2c2d, 0x2c2f, 0x2c31,
- 0x2c33, 0x2c35, 0x2c37, 0x2c39, 0x2c3b, 0x2c3d, 0x2c3f, 0x2c41,
- 0x2c43, 0x2c45, 0x2c47, 0x2c49, 0x2c4b, 0x2c4d, 0x2c4f, 0x2c51,
- 0x2c53, 0x2c55, 0x2c57, 0x2c59, 0x2c5b, 0x2c5d, 0x2c5f, 0x2c61,
- 0x2c63, 0x2c65, 0x2c67, 0x2c69, 0x2c6b, 0x2c6d, 0x2c6f, 0x2c71,
- 0x2c73, 0x2c75, 0x2c77, 0x2c79, 0x2c7b, 0x2c7d, 0x2c7f, 0x2c81,
- 0x2c83, 0x2c85, 0x2c87, 0x2c89, 0x2c8b, 0x2c8d, 0x2c8f, 0x2c91,
- 0x2c93, 0x2c95, 0x2c97, 0x2c99, 0x2c9b, 0x2c9d, 0x2c9f, 0x2ca1,
- 0x2ca3, 0x2ca5, 0x2ca7, 0x2ca9, 0x2cab, 0x2cad, 0x2caf, 0x2cb1,
- 0x2cb3, 0x2cb5, 0x2cb7, 0x2cb9, 0x2cbb, 0x2cbd, 0x2cbf, 0x2cc1,
- 0x2cc3, 0x2cc5, 0x2cc7, 0x2cc9, 0x2ccb, 0x2ccd, 0x2ccf, 0x2cd1,
- 0x2cd3, 0x2cd5, 0x2cd7, 0x2cd9, 0x2cdb, 0x2cdd, 0x2cdf, 0x2ce1,
- 0x2ce3, 0x2ce5, 0x2ce7, 0x2ce9, 0x2ceb, 0x2ced, 0x2cef, 0x2cf1,
- 0x2cf3, 0x2cf5, 0x2cf7, 0x2cf9, 0x2cfb, 0x2cfd, 0x2cff, 0x2d01,
- 0x2d03, 0x2d05, 0x2d07, 0x2d09, 0x2d0b, 0x2d0d, 0x2d0f, 0x2d11,
- 0x2d13, 0x2d15, 0x2d17, 0x2d19, 0x2d1b, 0x2d1d, 0x2d1f, 0x2d21,
-
- 0x2d23, 0x2d25, 0x2d27, 0x2d29, 0x2d2b, 0x2d2d, 0x2d2f, 0x2d31,
- 0x2d33, 0x2d35, 0x2d37, 0x2d39, 0x2d3b, 0x2d3d, 0x2d3f, 0x2d41,
- 0x2d43, 0x2d45, 0x2d47, 0x2d49, 0x2d4b, 0x2d4d, 0x2d4f, 0x2d51,
- 0x2d53, 0x2d55, 0x2d57, 0x2d59, 0x2d5b, 0x2d5d, 0x2d5f, 0x2d61,
- 0x2d63, 0x2d65, 0x2d67, 0x2d69, 0x2d6b, 0x2d6d, 0x2d6f, 0x2d71,
- 0x2d73, 0x2d75, 0x2d77, 0x2d79, 0x2d7b, 0x2d7d, 0x2d7f, 0x2d81,
- 0x2d83, 0x2d85, 0x2d87, 0x2d89, 0x2d8b, 0x2d8d, 0x2d8f, 0x2d91,
- 0x2d93, 0x2d95, 0x2d97, 0x2d99, 0x2d9b, 0x2d9d, 0x2d9f, 0x2da1,
- 0x2da3, 0x2da5, 0x2da7, 0x2da9, 0x2dab, 0x2dad, 0x2daf, 0x2db1,
- 0x2db3, 0x2db5, 0x2db7, 0x2db9, 0x2dbb, 0x2dbd, 0x2dbf, 0x2dc1,
- 0x2dc3, 0x2dc5, 0x2dc7, 0x2dc9, 0x2dcb, 0x2dcd, 0x2dcf, 0x2dd1,
- 0x2dd3, 0x2dd5, 0x2dd7, 0x2dd9, 0x2ddb, 0x2ddd, 0x2ddf, 0x2de1,
- 0x2de3, 0x2de5, 0x2de7, 0x2de9, 0x2deb, 0x2ded, 0x2def, 0x2df1,
- 0x2df3, 0x2df5, 0x2df7, 0x2df9, 0x2dfb, 0x2dfd, 0x2dff, 0x2e01,
- 0x2e03, 0x2e05, 0x2e07, 0x2e09, 0x2e0b, 0x2e0d, 0x2e0f, 0x2e11,
- 0x2e13, 0x2e15, 0x2e17, 0x2e19, 0x2e1b, 0x2e1d, 0x2e1f, 0x2e21,
- 0x2e23, 0x2e25, 0x2e27, 0x2e29, 0x2e2b, 0x2e2d, 0x2e2f, 0x2e31,
- 0x2e33, 0x2e35, 0x2e37, 0x2e39, 0x2e3b, 0x2e3d, 0x2e3f, 0x2e41,
- 0x2e43, 0x2e45, 0x2e47, 0x2e49, 0x2e4b, 0x2e4d, 0x2e4f, 0x2e51,
- 0x2e53, 0x2e55, 0x2e57, 0x2e59, 0x2e5b, 0x2e5d, 0x2e5f, 0x2e61,
- 0x2e63, 0x2e65, 0x2e67, 0x2e69, 0x2e6b, 0x2e6d, 0xffff, 0xffff,
- 0x2e6f, 0x2e71, 0x2e73, 0x2e75, 0x2e77, 0x2e79, 0x2e7b, 0x2e7d,
- 0x2e7f, 0x2e81, 0x2e83, 0x2e85, 0x2e87, 0x2e89, 0x2e8b, 0x2e8d,
- 0x2e8f, 0x2e91, 0x2e93, 0x2e95, 0x2e97, 0x2e99, 0x2e9b, 0x2e9d,
- 0x2e9f, 0x2ea1, 0x2ea3, 0x2ea5, 0x2ea7, 0x2ea9, 0x2eab, 0x2ead,
- 0x2eaf, 0x2eb1, 0x2eb3, 0x2eb5, 0x2eb7, 0x2eb9, 0x2ebb, 0x2ebd,
- 0x2ebf, 0x2ec1, 0x2ec3, 0x2ec5, 0x2ec7, 0x2ec9, 0x2ecb, 0x2ecd,
- 0x2ecf, 0x2ed1, 0x2ed3, 0x2ed5, 0x2ed7, 0x2ed9, 0x2edb, 0x2edd,
- 0x2edf, 0x2ee1, 0x2ee3, 0x2ee5, 0x2ee7, 0x2ee9, 0x2eeb, 0x2eed,
- 0x2eef, 0x2ef1, 0x2ef3, 0x2ef5, 0x2ef7, 0x2ef9, 0x2efb, 0x2efd,
- 0x2eff, 0x2f01, 0x2f03, 0x2f05, 0x2f07, 0x2f09, 0x2f0b, 0x2f0d,
- 0x2f0f, 0x2f11, 0x2f13, 0x2f15, 0x2f17, 0x2f19, 0x2f1b, 0x2f1d,
-
- 0x2f1f, 0x2f21, 0x2f23, 0x2f25, 0x2f27, 0x2f29, 0x2f2b, 0x2f2d,
- 0x2f2f, 0x2f31, 0x2f33, 0x2f35, 0x2f37, 0x2f39, 0x2f3b, 0x2f3d,
- 0x2f3f, 0x2f41, 0x2f43, 0x2f45, 0x2f47, 0x2f49, 0x2f4b, 0x2f4d,
- 0x2f4f, 0x2f51, 0x2f53, 0x2f55, 0x2f57, 0x2f59, 0x2f5b, 0x2f5d,
- 0x2f5f, 0x2f61, 0x2f63, 0x2f65, 0x2f67, 0x2f69, 0x2f6b, 0x2f6d,
- 0x2f6f, 0x2f71, 0x2f73, 0x2f75, 0x2f77, 0x2f79, 0x2f7b, 0x2f7d,
- 0x2f7f, 0x2f81, 0x2f83, 0x2f85, 0x2f87, 0x2f89, 0x2f8b, 0x2f8d,
- 0x2f8f, 0x2f91, 0x2f93, 0x2f95, 0x2f97, 0x2f99, 0x2f9b, 0x2f9d,
- 0x2f9f, 0x2fa1, 0x2fa3, 0x2fa5, 0x2fa7, 0x2fa9, 0x2fab, 0x2fad,
- 0x2faf, 0x2fb1, 0x2fb3, 0x2fb5, 0x2fb7, 0x2fb9, 0x2fbb, 0x2fbd,
- 0x2fbf, 0x2fc1, 0x2fc3, 0x2fc5, 0x2fc7, 0x2fc9, 0x2fcb, 0x2fcd,
- 0x2fcf, 0x2fd1, 0x2fd3, 0x2fd5, 0x2fd7, 0x2fd9, 0x2fdb, 0x2fdd,
- 0x2fdf, 0x2fe1, 0x2fe3, 0x2fe5, 0x2fe7, 0x2fe9, 0x2feb, 0x2fed,
- 0x2fef, 0x2ff1, 0x2ff3, 0x2ff5, 0x2ff7, 0x2ff9, 0x2ffb, 0x2ffd,
- 0x2fff, 0x3001, 0x3003, 0x3005, 0x3007, 0x3009, 0x300b, 0x300d,
- 0x300f, 0x3011, 0x3013, 0x3015, 0x3017, 0x3019, 0x301b, 0x301d,
- 0x301f, 0x3021, 0x3023, 0x3025, 0x3027, 0x3029, 0x302b, 0x302d,
- 0x302f, 0x3031, 0x3033, 0x3035, 0x3037, 0x3039, 0x303b, 0x303d,
- 0x303f, 0x3041, 0x3043, 0x3045, 0x3047, 0x3049, 0x304b, 0x304d,
- 0x304f, 0x3051, 0x3053, 0x3055, 0x3057, 0x3059, 0x305b, 0x305d,
- 0x305f, 0x3061, 0x3063, 0x3065, 0x3067, 0x3069, 0x306b, 0x306d,
- 0x306f, 0x3071, 0x3073, 0x3075, 0x3077, 0x3079, 0x307b, 0x307d,
- 0x307f, 0x3081, 0x3083, 0x3085, 0x3087, 0x3089, 0x308b, 0x308d,
- 0x308f, 0x3091, 0x3093, 0x3095, 0x3097, 0x3099, 0x309b, 0x309d,
- 0x309f, 0x30a1, 0x30a3, 0x30a5, 0x30a7, 0x30a9, 0x30ab, 0x30ad,
- 0x30af, 0x30b1, 0x30b3, 0x30b5, 0xffff, 0xffff, 0x30b7, 0x30b9,
- 0x30bb, 0x30bd, 0x30bf, 0x30c1, 0x30c3, 0x30c5, 0x30c7, 0x30c9,
- 0x30cb, 0x30cd, 0x30cf, 0x30d1, 0x30d3, 0x30d5, 0x30d7, 0x30d9,
- 0x30db, 0x30dd, 0x30df, 0x30e1, 0x30e3, 0x30e5, 0x30e7, 0x30e9,
- 0x30eb, 0x30ed, 0x30ef, 0x30f1, 0x30f3, 0x30f5, 0x30f7, 0x30f9,
- 0x30fb, 0x30fd, 0x30ff, 0x3101, 0x3103, 0x3105, 0x3107, 0x3109,
- 0x310b, 0x310d, 0x310f, 0x3111, 0x3113, 0x3115, 0x3117, 0x3119,
-
- 0x311b, 0x311d, 0x311f, 0x3121, 0xffff, 0x3123, 0x3125, 0x3127,
- 0x3129, 0x312b, 0x312d, 0x312f, 0x3131, 0x3133, 0x3135, 0x3137,
- 0x3139, 0x313b, 0x313d, 0x313f, 0x3141, 0x3143, 0x3145, 0x3147,
- 0x3149, 0x314b, 0x314d, 0x314f, 0x3151, 0x3153, 0x3155, 0x3157,
- 0xffff, 0x3159, 0x315b, 0xffff, 0x315d, 0xffff, 0xffff, 0x315f,
- 0xffff, 0x3161, 0x3163, 0x3165, 0x3167, 0x3169, 0x316b, 0x316d,
- 0x316f, 0x3171, 0x3173, 0xffff, 0x3175, 0x3177, 0x3179, 0x317b,
- 0xffff, 0x317d, 0xffff, 0x317f, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0x3181, 0xffff, 0xffff, 0xffff, 0xffff, 0x3183,
- 0xffff, 0x3185, 0xffff, 0x3187, 0xffff, 0x3189, 0x318b, 0x318d,
- 0xffff, 0x318f, 0x3191, 0xffff, 0x3193, 0xffff, 0xffff, 0x3195,
- 0xffff, 0x3197, 0xffff, 0x3199, 0xffff, 0x319b, 0xffff, 0x319d,
- 0xffff, 0x319f, 0x31a1, 0xffff, 0x31a3, 0xffff, 0xffff, 0x31a5,
- 0x31a7, 0x31a9, 0x31ab, 0xffff, 0x31ad, 0x31af, 0x31b1, 0x31b3,
- 0x31b5, 0x31b7, 0x31b9, 0xffff, 0x31bb, 0x31bd, 0x31bf, 0x31c1,
- 0xffff, 0x31c3, 0x31c5, 0x31c7, 0x31c9, 0xffff, 0x31cb, 0xffff,
- 0x31cd, 0x31cf, 0x31d1, 0x31d3, 0x31d5, 0x31d7, 0x31d9, 0x31db,
- 0x31dd, 0x31df, 0xffff, 0x31e1, 0x31e3, 0x31e5, 0x31e7, 0x31e9,
- 0x31eb, 0x31ed, 0x31ef, 0x31f1, 0x31f3, 0x31f5, 0x31f7, 0x31f9,
- 0x31fb, 0x31fd, 0x31ff, 0x3201, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0x3203, 0x3205, 0x3207, 0xffff, 0x3209, 0x320b, 0x320d,
- 0x320f, 0x3211, 0xffff, 0x3213, 0x3215, 0x3217, 0x3219, 0x321b,
- 0x321d, 0x321f, 0x3221, 0x3223, 0x3225, 0x3227, 0x3229, 0x322b,
- 0x322d, 0x322f, 0x3231, 0x3233, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
-
- 0x3235, 0x3238, 0x323b, 0x323e, 0x3241, 0x3244, 0x3247, 0x324a,
- 0x324d, 0x3250, 0x3253, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0x3256, 0x325a, 0x325e, 0x3262, 0x3266, 0x326a, 0x326e, 0x3272,
- 0x3276, 0x327a, 0x327e, 0x3282, 0x3286, 0x328a, 0x328e, 0x3292,
- 0x3296, 0x329a, 0x329e, 0x32a2, 0x32a6, 0x32aa, 0x32ae, 0x32b2,
- 0x32b6, 0x32ba, 0x32be, 0x32c2, 0x32c4, 0x32c6, 0x32c9, 0xffff,
- 0x32cc, 0x32ce, 0x32d0, 0x32d2, 0x32d4, 0x32d6, 0x32d8, 0x32da,
- 0x32dc, 0x32de, 0x32e0, 0x32e2, 0x32e4, 0x32e6, 0x32e8, 0x32ea,
- 0x32ec, 0x32ee, 0x32f0, 0x32f2, 0x32f4, 0x32f6, 0x32f8, 0x32fa,
- 0x32fc, 0x32fe, 0x3300, 0x3303, 0x3306, 0x3309, 0x330c, 0x3310,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0x3313, 0x3316, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0x3319, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
-
- 0x331c, 0x331f, 0x3322, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0x3324, 0x3326, 0x3328, 0x332a, 0x332c, 0x332e, 0x3330, 0x3332,
- 0x3334, 0x3336, 0x3338, 0x333a, 0x333c, 0x333e, 0x3340, 0x3342,
- 0x3344, 0x3346, 0x3348, 0x334a, 0x334c, 0x334e, 0x3350, 0x3352,
- 0x3354, 0x3356, 0x3358, 0x335a, 0x335c, 0x335e, 0x3360, 0x3362,
- 0x3364, 0x3366, 0x3368, 0x336a, 0x336c, 0x336e, 0x3370, 0x3372,
- 0x3374, 0x3376, 0x3378, 0x337a, 0xffff, 0xffff, 0xffff, 0xffff,
- 0x337c, 0x3380, 0x3384, 0x3388, 0x338c, 0x3390, 0x3394, 0x3398,
- 0x339c, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0x33a0, 0x33a2, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
-
- 0x33a4, 0x33a6, 0x33a8, 0x33aa, 0x33ad, 0x33af, 0x33b1, 0x33b3,
- 0x33b5, 0x33b7, 0x33b9, 0x33bb, 0x33bd, 0x33bf, 0x33c2, 0x33c4,
- 0x33c6, 0x33c8, 0x33ca, 0x33cd, 0x33cf, 0x33d1, 0x33d3, 0x33d6,
- 0x33d8, 0x33da, 0x33dc, 0x33de, 0x33e0, 0x33e3, 0x33e5, 0x33e7,
- 0x33e9, 0x33eb, 0x33ed, 0x33ef, 0x33f1, 0x33f3, 0x33f5, 0x33f7,
- 0x33f9, 0x33fb, 0x33fd, 0x33ff, 0x3401, 0x3403, 0x3405, 0x3407,
- 0x3409, 0x340b, 0x340d, 0x340f, 0x3411, 0x3414, 0x3416, 0x3418,
- 0x341a, 0x341d, 0x341f, 0x3421, 0x3423, 0x3425, 0x3427, 0x3429,
- 0x342b, 0x342d, 0x342f, 0x3431, 0x3433, 0x3435, 0x3437, 0x3439,
- 0x343b, 0x343d, 0x343f, 0x3441, 0x3443, 0x3445, 0x3447, 0x3449,
- 0x344b, 0x344d, 0x344f, 0x3451, 0x3453, 0x3455, 0x3457, 0x3459,
- 0x345b, 0x345d, 0x3460, 0x3462, 0x3464, 0x3466, 0x3468, 0x346a,
- 0x346c, 0x346f, 0x3472, 0x3474, 0x3476, 0x3478, 0x347a, 0x347c,
- 0x347e, 0x3480, 0x3482, 0x3484, 0x3486, 0x3489, 0x348b, 0x348d,
- 0x348f, 0x3491, 0x3494, 0x3496, 0x3498, 0x349a, 0x349c, 0x349e,
- 0x34a0, 0x34a2, 0x34a4, 0x34a6, 0x34a9, 0x34ab, 0x34ae, 0x34b0,
- 0x34b2, 0x34b4, 0x34b6, 0x34b8, 0x34ba, 0x34bc, 0x34be, 0x34c0,
- 0x34c2, 0x34c4, 0x34c7, 0x34c9, 0x34cb, 0x34cd, 0x34cf, 0x34d1,
- 0x34d4, 0x34d6, 0x34d9, 0x34dc, 0x34de, 0x34e0, 0x34e2, 0x34e4,
- 0x34e7, 0x34ea, 0x34ec, 0x34ee, 0x34f0, 0x34f2, 0x34f4, 0x34f6,
- 0x34f8, 0x34fa, 0x34fc, 0x34fe, 0x3500, 0x3503, 0x3505, 0x3507,
- 0x3509, 0x350b, 0x350d, 0x350f, 0x3511, 0x3513, 0x3515, 0x3517,
- 0x3519, 0x351b, 0x351d, 0x351f, 0x3521, 0x3523, 0x3525, 0x3527,
- 0x3529, 0x352c, 0x352e, 0x3530, 0x3532, 0x3534, 0x3536, 0x3539,
- 0x353b, 0x353d, 0x353f, 0x3541, 0x3543, 0x3545, 0x3547, 0x3549,
- 0x354b, 0x354d, 0x354f, 0x3552, 0x3554, 0x3556, 0x3558, 0x355a,
- 0x355c, 0x355e, 0x3560, 0x3562, 0x3564, 0x3566, 0x3568, 0x356a,
- 0x356c, 0x356e, 0x3570, 0x3572, 0x3574, 0x3576, 0x3579, 0x357b,
- 0x357d, 0x357f, 0x3581, 0x3583, 0x3586, 0x3588, 0x358a, 0x358c,
- 0x358e, 0x3590, 0x3592, 0x3594, 0x3596, 0x3599, 0x359b, 0x359d,
- 0x359f, 0x35a2, 0x35a4, 0x35a6, 0x35a8, 0x35aa, 0x35ac, 0x35ae,
- 0x35b1, 0x35b4, 0x35b7, 0x35b9, 0x35bc, 0x35be, 0x35c0, 0x35c2,
-
- 0x35c4, 0x35c6, 0x35c8, 0x35ca, 0x35cc, 0x35ce, 0x35d0, 0x35d3,
- 0x35d5, 0x35d7, 0x35d9, 0x35db, 0x35dd, 0x35df, 0x35e2, 0x35e4,
- 0x35e6, 0x35e9, 0x35ec, 0x35ee, 0x35f0, 0x35f2, 0x35f4, 0x35f6,
- 0x35f8, 0x35fa, 0x35fc, 0x35fe, 0x3601, 0x3603, 0x3606, 0x3608,
- 0x360b, 0x360d, 0x360f, 0x3611, 0x3614, 0x3616, 0x3618, 0x361b,
- 0x361e, 0x3620, 0x3622, 0x3624, 0x3626, 0x3628, 0x362a, 0x362c,
- 0x362e, 0x3630, 0x3632, 0x3634, 0x3636, 0x3638, 0x363b, 0x363d,
- 0x3640, 0x3642, 0x3645, 0x3647, 0x364a, 0x364d, 0x3650, 0x3652,
- 0x3654, 0x3656, 0x3659, 0x365c, 0x365f, 0x3662, 0x3664, 0x3666,
- 0x3668, 0x366a, 0x366c, 0x366e, 0x3670, 0x3672, 0x3675, 0x3677,
- 0x3679, 0x367b, 0x367d, 0x3680, 0x3682, 0x3685, 0x3688, 0x368a,
- 0x368c, 0x368e, 0x3690, 0x3692, 0x3694, 0x3697, 0x369a, 0x369d,
- 0x369f, 0x36a1, 0x36a4, 0x36a6, 0x36a8, 0x36aa, 0x36ad, 0x36af,
- 0x36b1, 0x36b3, 0x36b5, 0x36b7, 0x36ba, 0x36bc, 0x36be, 0x36c0,
- 0x36c2, 0x36c4, 0x36c6, 0x36c9, 0x36cc, 0x36ce, 0x36d1, 0x36d3,
- 0x36d6, 0x36d8, 0x36da, 0x36dc, 0x36df, 0x36e2, 0x36e4, 0x36e7,
- 0x36e9, 0x36ec, 0x36ee, 0x36f0, 0x36f2, 0x36f4, 0x36f6, 0x36f8,
- 0x36fb, 0x36fe, 0x3701, 0x3704, 0x3706, 0x3708, 0x370a, 0x370c,
- 0x370e, 0x3710, 0x3712, 0x3714, 0x3716, 0x3718, 0x371a, 0x371c,
- 0x371f, 0x3721, 0x3723, 0x3725, 0x3727, 0x3729, 0x372b, 0x372d,
- 0x372f, 0x3731, 0x3733, 0x3735, 0x3737, 0x373a, 0x373d, 0x3740,
- 0x3742, 0x3744, 0x3746, 0x3748, 0x374b, 0x374d, 0x3750, 0x3752,
- 0x3754, 0x3757, 0x375a, 0x375c, 0x375e, 0x3760, 0x3762, 0x3764,
- 0x3766, 0x3768, 0x376a, 0x376c, 0x376e, 0x3770, 0x3772, 0x3774,
- 0x3776, 0x3778, 0x377a, 0x377c, 0x377e, 0x3780, 0x3783, 0x3785,
- 0x3787, 0x3789, 0x378b, 0x378d, 0x3790, 0x3793, 0x3795, 0x3797,
- 0x3799, 0x379b, 0x379d, 0x379f, 0x37a2, 0x37a4, 0x37a6, 0x37a8,
- 0x37aa, 0x37ad, 0x37b0, 0x37b2, 0x37b4, 0x37b6, 0x37b9, 0x37bb,
- 0x37bd, 0x37c0, 0x37c3, 0x37c5, 0x37c7, 0x37c9, 0x37cc, 0x37ce,
- 0x37d0, 0x37d2, 0x37d4, 0x37d6, 0x37d8, 0x37da, 0x37dd, 0x37df,
- 0x37e1, 0x37e3, 0x37e6, 0x37e8, 0x37ea, 0x37ec, 0x37ee, 0x37f1,
- 0x37f4, 0x37f6, 0x37f8, 0x37fa, 0x37fd, 0x37ff, 0x3802, 0x3804,
-
- 0x3806, 0x3808, 0x380b, 0x380d, 0x380f, 0x3811, 0x3813, 0x3815,
- 0x3817, 0x3819, 0x381c, 0x381e, 0x3820, 0x3822, 0x3824, 0x3826,
- 0x3828, 0x382b, 0x382d, 0x3830, 0x3833, 0x3836, 0x3838, 0x383a,
- 0x383c, 0x383e, 0x3840, 0x3842, 0x3844, 0x3846, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff
-};
-
-#define GET_DECOMPOSITION_INDEX(ucs4) \
- (ucs4 < 0x3400 \
- ? (uc_decomposition_trie[uc_decomposition_trie[ucs4>>4] + (ucs4 & 0xf)]) \
- : (ucs4 < 0x30000 \
- ? uc_decomposition_trie[uc_decomposition_trie[((ucs4 - 0x3400)>>8) + 0x340] + (ucs4 & 0xff)] \
- : 0xffff))
-
-static const unsigned short uc_decomposition_map[] = {
- 0x103, 0x20, 0x210, 0x20, 0x308, 0x109, 0x61, 0x210,
- 0x20, 0x304, 0x109, 0x32, 0x109, 0x33, 0x210, 0x20,
- 0x301, 0x110, 0x3bc, 0x210, 0x20, 0x327, 0x109, 0x31,
- 0x109, 0x6f, 0x311, 0x31, 0x2044, 0x34, 0x311, 0x31,
- 0x2044, 0x32, 0x311, 0x33, 0x2044, 0x34, 0x201, 0x41,
- 0x300, 0x201, 0x41, 0x301, 0x201, 0x41, 0x302, 0x201,
- 0x41, 0x303, 0x201, 0x41, 0x308, 0x201, 0x41, 0x30a,
- 0x201, 0x43, 0x327, 0x201, 0x45, 0x300, 0x201, 0x45,
- 0x301, 0x201, 0x45, 0x302, 0x201, 0x45, 0x308, 0x201,
- 0x49, 0x300, 0x201, 0x49, 0x301, 0x201, 0x49, 0x302,
- 0x201, 0x49, 0x308, 0x201, 0x4e, 0x303, 0x201, 0x4f,
- 0x300, 0x201, 0x4f, 0x301, 0x201, 0x4f, 0x302, 0x201,
- 0x4f, 0x303, 0x201, 0x4f, 0x308, 0x201, 0x55, 0x300,
- 0x201, 0x55, 0x301, 0x201, 0x55, 0x302, 0x201, 0x55,
- 0x308, 0x201, 0x59, 0x301, 0x201, 0x61, 0x300, 0x201,
- 0x61, 0x301, 0x201, 0x61, 0x302, 0x201, 0x61, 0x303,
- 0x201, 0x61, 0x308, 0x201, 0x61, 0x30a, 0x201, 0x63,
- 0x327, 0x201, 0x65, 0x300, 0x201, 0x65, 0x301, 0x201,
- 0x65, 0x302, 0x201, 0x65, 0x308, 0x201, 0x69, 0x300,
- 0x201, 0x69, 0x301, 0x201, 0x69, 0x302, 0x201, 0x69,
- 0x308, 0x201, 0x6e, 0x303, 0x201, 0x6f, 0x300, 0x201,
- 0x6f, 0x301, 0x201, 0x6f, 0x302, 0x201, 0x6f, 0x303,
- 0x201, 0x6f, 0x308, 0x201, 0x75, 0x300, 0x201, 0x75,
- 0x301, 0x201, 0x75, 0x302, 0x201, 0x75, 0x308, 0x201,
- 0x79, 0x301, 0x201, 0x79, 0x308, 0x201, 0x41, 0x304,
- 0x201, 0x61, 0x304, 0x201, 0x41, 0x306, 0x201, 0x61,
- 0x306, 0x201, 0x41, 0x328, 0x201, 0x61, 0x328, 0x201,
- 0x43, 0x301, 0x201, 0x63, 0x301, 0x201, 0x43, 0x302,
- 0x201, 0x63, 0x302, 0x201, 0x43, 0x307, 0x201, 0x63,
- 0x307, 0x201, 0x43, 0x30c, 0x201, 0x63, 0x30c, 0x201,
- 0x44, 0x30c, 0x201, 0x64, 0x30c, 0x201, 0x45, 0x304,
- 0x201, 0x65, 0x304, 0x201, 0x45, 0x306, 0x201, 0x65,
- 0x306, 0x201, 0x45, 0x307, 0x201, 0x65, 0x307, 0x201,
- 0x45, 0x328, 0x201, 0x65, 0x328, 0x201, 0x45, 0x30c,
- 0x201, 0x65, 0x30c, 0x201, 0x47, 0x302, 0x201, 0x67,
- 0x302, 0x201, 0x47, 0x306, 0x201, 0x67, 0x306, 0x201,
- 0x47, 0x307, 0x201, 0x67, 0x307, 0x201, 0x47, 0x327,
- 0x201, 0x67, 0x327, 0x201, 0x48, 0x302, 0x201, 0x68,
- 0x302, 0x201, 0x49, 0x303, 0x201, 0x69, 0x303, 0x201,
- 0x49, 0x304, 0x201, 0x69, 0x304, 0x201, 0x49, 0x306,
- 0x201, 0x69, 0x306, 0x201, 0x49, 0x328, 0x201, 0x69,
- 0x328, 0x201, 0x49, 0x307, 0x210, 0x49, 0x4a, 0x210,
- 0x69, 0x6a, 0x201, 0x4a, 0x302, 0x201, 0x6a, 0x302,
- 0x201, 0x4b, 0x327, 0x201, 0x6b, 0x327, 0x201, 0x4c,
- 0x301, 0x201, 0x6c, 0x301, 0x201, 0x4c, 0x327, 0x201,
- 0x6c, 0x327, 0x201, 0x4c, 0x30c, 0x201, 0x6c, 0x30c,
- 0x210, 0x4c, 0xb7, 0x210, 0x6c, 0xb7, 0x201, 0x4e,
- 0x301, 0x201, 0x6e, 0x301, 0x201, 0x4e, 0x327, 0x201,
- 0x6e, 0x327, 0x201, 0x4e, 0x30c, 0x201, 0x6e, 0x30c,
- 0x210, 0x2bc, 0x6e, 0x201, 0x4f, 0x304, 0x201, 0x6f,
- 0x304, 0x201, 0x4f, 0x306, 0x201, 0x6f, 0x306, 0x201,
- 0x4f, 0x30b, 0x201, 0x6f, 0x30b, 0x201, 0x52, 0x301,
- 0x201, 0x72, 0x301, 0x201, 0x52, 0x327, 0x201, 0x72,
- 0x327, 0x201, 0x52, 0x30c, 0x201, 0x72, 0x30c, 0x201,
- 0x53, 0x301, 0x201, 0x73, 0x301, 0x201, 0x53, 0x302,
- 0x201, 0x73, 0x302, 0x201, 0x53, 0x327, 0x201, 0x73,
- 0x327, 0x201, 0x53, 0x30c, 0x201, 0x73, 0x30c, 0x201,
- 0x54, 0x327, 0x201, 0x74, 0x327, 0x201, 0x54, 0x30c,
- 0x201, 0x74, 0x30c, 0x201, 0x55, 0x303, 0x201, 0x75,
- 0x303, 0x201, 0x55, 0x304, 0x201, 0x75, 0x304, 0x201,
- 0x55, 0x306, 0x201, 0x75, 0x306, 0x201, 0x55, 0x30a,
- 0x201, 0x75, 0x30a, 0x201, 0x55, 0x30b, 0x201, 0x75,
- 0x30b, 0x201, 0x55, 0x328, 0x201, 0x75, 0x328, 0x201,
- 0x57, 0x302, 0x201, 0x77, 0x302, 0x201, 0x59, 0x302,
- 0x201, 0x79, 0x302, 0x201, 0x59, 0x308, 0x201, 0x5a,
- 0x301, 0x201, 0x7a, 0x301, 0x201, 0x5a, 0x307, 0x201,
- 0x7a, 0x307, 0x201, 0x5a, 0x30c, 0x201, 0x7a, 0x30c,
- 0x110, 0x73, 0x201, 0x4f, 0x31b, 0x201, 0x6f, 0x31b,
- 0x201, 0x55, 0x31b, 0x201, 0x75, 0x31b, 0x210, 0x44,
- 0x17d, 0x210, 0x44, 0x17e, 0x210, 0x64, 0x17e, 0x210,
- 0x4c, 0x4a, 0x210, 0x4c, 0x6a, 0x210, 0x6c, 0x6a,
- 0x210, 0x4e, 0x4a, 0x210, 0x4e, 0x6a, 0x210, 0x6e,
- 0x6a, 0x201, 0x41, 0x30c, 0x201, 0x61, 0x30c, 0x201,
- 0x49, 0x30c, 0x201, 0x69, 0x30c, 0x201, 0x4f, 0x30c,
- 0x201, 0x6f, 0x30c, 0x201, 0x55, 0x30c, 0x201, 0x75,
- 0x30c, 0x201, 0xdc, 0x304, 0x201, 0xfc, 0x304, 0x201,
- 0xdc, 0x301, 0x201, 0xfc, 0x301, 0x201, 0xdc, 0x30c,
- 0x201, 0xfc, 0x30c, 0x201, 0xdc, 0x300, 0x201, 0xfc,
- 0x300, 0x201, 0xc4, 0x304, 0x201, 0xe4, 0x304, 0x201,
- 0x226, 0x304, 0x201, 0x227, 0x304, 0x201, 0xc6, 0x304,
- 0x201, 0xe6, 0x304, 0x201, 0x47, 0x30c, 0x201, 0x67,
- 0x30c, 0x201, 0x4b, 0x30c, 0x201, 0x6b, 0x30c, 0x201,
- 0x4f, 0x328, 0x201, 0x6f, 0x328, 0x201, 0x1ea, 0x304,
- 0x201, 0x1eb, 0x304, 0x201, 0x1b7, 0x30c, 0x201, 0x292,
- 0x30c, 0x201, 0x6a, 0x30c, 0x210, 0x44, 0x5a, 0x210,
- 0x44, 0x7a, 0x210, 0x64, 0x7a, 0x201, 0x47, 0x301,
- 0x201, 0x67, 0x301, 0x201, 0x4e, 0x300, 0x201, 0x6e,
- 0x300, 0x201, 0xc5, 0x301, 0x201, 0xe5, 0x301, 0x201,
- 0xc6, 0x301, 0x201, 0xe6, 0x301, 0x201, 0xd8, 0x301,
- 0x201, 0xf8, 0x301, 0x201, 0x41, 0x30f, 0x201, 0x61,
- 0x30f, 0x201, 0x41, 0x311, 0x201, 0x61, 0x311, 0x201,
- 0x45, 0x30f, 0x201, 0x65, 0x30f, 0x201, 0x45, 0x311,
- 0x201, 0x65, 0x311, 0x201, 0x49, 0x30f, 0x201, 0x69,
- 0x30f, 0x201, 0x49, 0x311, 0x201, 0x69, 0x311, 0x201,
- 0x4f, 0x30f, 0x201, 0x6f, 0x30f, 0x201, 0x4f, 0x311,
- 0x201, 0x6f, 0x311, 0x201, 0x52, 0x30f, 0x201, 0x72,
- 0x30f, 0x201, 0x52, 0x311, 0x201, 0x72, 0x311, 0x201,
- 0x55, 0x30f, 0x201, 0x75, 0x30f, 0x201, 0x55, 0x311,
- 0x201, 0x75, 0x311, 0x201, 0x53, 0x326, 0x201, 0x73,
- 0x326, 0x201, 0x54, 0x326, 0x201, 0x74, 0x326, 0x201,
- 0x48, 0x30c, 0x201, 0x68, 0x30c, 0x201, 0x41, 0x307,
- 0x201, 0x61, 0x307, 0x201, 0x45, 0x327, 0x201, 0x65,
- 0x327, 0x201, 0xd6, 0x304, 0x201, 0xf6, 0x304, 0x201,
- 0xd5, 0x304, 0x201, 0xf5, 0x304, 0x201, 0x4f, 0x307,
- 0x201, 0x6f, 0x307, 0x201, 0x22e, 0x304, 0x201, 0x22f,
- 0x304, 0x201, 0x59, 0x304, 0x201, 0x79, 0x304, 0x109,
- 0x68, 0x109, 0x266, 0x109, 0x6a, 0x109, 0x72, 0x109,
- 0x279, 0x109, 0x27b, 0x109, 0x281, 0x109, 0x77, 0x109,
- 0x79, 0x210, 0x20, 0x306, 0x210, 0x20, 0x307, 0x210,
- 0x20, 0x30a, 0x210, 0x20, 0x328, 0x210, 0x20, 0x303,
- 0x210, 0x20, 0x30b, 0x109, 0x263, 0x109, 0x6c, 0x109,
- 0x73, 0x109, 0x78, 0x109, 0x295, 0x101, 0x300, 0x101,
- 0x301, 0x101, 0x313, 0x201, 0x308, 0x301, 0x101, 0x2b9,
- 0x210, 0x20, 0x345, 0x101, 0x3b, 0x210, 0x20, 0x301,
- 0x201, 0xa8, 0x301, 0x201, 0x391, 0x301, 0x101, 0xb7,
- 0x201, 0x395, 0x301, 0x201, 0x397, 0x301, 0x201, 0x399,
- 0x301, 0x201, 0x39f, 0x301, 0x201, 0x3a5, 0x301, 0x201,
- 0x3a9, 0x301, 0x201, 0x3ca, 0x301, 0x201, 0x399, 0x308,
- 0x201, 0x3a5, 0x308, 0x201, 0x3b1, 0x301, 0x201, 0x3b5,
- 0x301, 0x201, 0x3b7, 0x301, 0x201, 0x3b9, 0x301, 0x201,
- 0x3cb, 0x301, 0x201, 0x3b9, 0x308, 0x201, 0x3c5, 0x308,
- 0x201, 0x3bf, 0x301, 0x201, 0x3c5, 0x301, 0x201, 0x3c9,
- 0x301, 0x110, 0x3b2, 0x110, 0x3b8, 0x110, 0x3a5, 0x201,
- 0x3d2, 0x301, 0x201, 0x3d2, 0x308, 0x110, 0x3c6, 0x110,
- 0x3c0, 0x110, 0x3ba, 0x110, 0x3c1, 0x110, 0x3c2, 0x110,
- 0x398, 0x110, 0x3b5, 0x110, 0x3a3, 0x201, 0x415, 0x300,
- 0x201, 0x415, 0x308, 0x201, 0x413, 0x301, 0x201, 0x406,
- 0x308, 0x201, 0x41a, 0x301, 0x201, 0x418, 0x300, 0x201,
- 0x423, 0x306, 0x201, 0x418, 0x306, 0x201, 0x438, 0x306,
- 0x201, 0x435, 0x300, 0x201, 0x435, 0x308, 0x201, 0x433,
- 0x301, 0x201, 0x456, 0x308, 0x201, 0x43a, 0x301, 0x201,
- 0x438, 0x300, 0x201, 0x443, 0x306, 0x201, 0x474, 0x30f,
- 0x201, 0x475, 0x30f, 0x201, 0x416, 0x306, 0x201, 0x436,
- 0x306, 0x201, 0x410, 0x306, 0x201, 0x430, 0x306, 0x201,
- 0x410, 0x308, 0x201, 0x430, 0x308, 0x201, 0x415, 0x306,
- 0x201, 0x435, 0x306, 0x201, 0x4d8, 0x308, 0x201, 0x4d9,
- 0x308, 0x201, 0x416, 0x308, 0x201, 0x436, 0x308, 0x201,
- 0x417, 0x308, 0x201, 0x437, 0x308, 0x201, 0x418, 0x304,
- 0x201, 0x438, 0x304, 0x201, 0x418, 0x308, 0x201, 0x438,
- 0x308, 0x201, 0x41e, 0x308, 0x201, 0x43e, 0x308, 0x201,
- 0x4e8, 0x308, 0x201, 0x4e9, 0x308, 0x201, 0x42d, 0x308,
- 0x201, 0x44d, 0x308, 0x201, 0x423, 0x304, 0x201, 0x443,
- 0x304, 0x201, 0x423, 0x308, 0x201, 0x443, 0x308, 0x201,
- 0x423, 0x30b, 0x201, 0x443, 0x30b, 0x201, 0x427, 0x308,
- 0x201, 0x447, 0x308, 0x201, 0x42b, 0x308, 0x201, 0x44b,
- 0x308, 0x210, 0x565, 0x582, 0x201, 0x627, 0x653, 0x201,
- 0x627, 0x654, 0x201, 0x648, 0x654, 0x201, 0x627, 0x655,
- 0x201, 0x64a, 0x654, 0x210, 0x627, 0x674, 0x210, 0x648,
- 0x674, 0x210, 0x6c7, 0x674, 0x210, 0x64a, 0x674, 0x201,
- 0x6d5, 0x654, 0x201, 0x6c1, 0x654, 0x201, 0x6d2, 0x654,
- 0x201, 0x928, 0x93c, 0x201, 0x930, 0x93c, 0x201, 0x933,
- 0x93c, 0x201, 0x915, 0x93c, 0x201, 0x916, 0x93c, 0x201,
- 0x917, 0x93c, 0x201, 0x91c, 0x93c, 0x201, 0x921, 0x93c,
- 0x201, 0x922, 0x93c, 0x201, 0x92b, 0x93c, 0x201, 0x92f,
- 0x93c, 0x201, 0x9c7, 0x9be, 0x201, 0x9c7, 0x9d7, 0x201,
- 0x9a1, 0x9bc, 0x201, 0x9a2, 0x9bc, 0x201, 0x9af, 0x9bc,
- 0x201, 0xa32, 0xa3c, 0x201, 0xa38, 0xa3c, 0x201, 0xa16,
- 0xa3c, 0x201, 0xa17, 0xa3c, 0x201, 0xa1c, 0xa3c, 0x201,
- 0xa2b, 0xa3c, 0x201, 0xb47, 0xb56, 0x201, 0xb47, 0xb3e,
- 0x201, 0xb47, 0xb57, 0x201, 0xb21, 0xb3c, 0x201, 0xb22,
- 0xb3c, 0x201, 0xb92, 0xbd7, 0x201, 0xbc6, 0xbbe, 0x201,
- 0xbc7, 0xbbe, 0x201, 0xbc6, 0xbd7, 0x201, 0xc46, 0xc56,
- 0x201, 0xcbf, 0xcd5, 0x201, 0xcc6, 0xcd5, 0x201, 0xcc6,
- 0xcd6, 0x201, 0xcc6, 0xcc2, 0x201, 0xcca, 0xcd5, 0x201,
- 0xd46, 0xd3e, 0x201, 0xd47, 0xd3e, 0x201, 0xd46, 0xd57,
- 0x201, 0xdd9, 0xdca, 0x201, 0xdd9, 0xdcf, 0x201, 0xddc,
- 0xdca, 0x201, 0xdd9, 0xddf, 0x210, 0xe4d, 0xe32, 0x210,
- 0xecd, 0xeb2, 0x210, 0xeab, 0xe99, 0x210, 0xeab, 0xea1,
- 0x103, 0xf0b, 0x201, 0xf42, 0xfb7, 0x201, 0xf4c, 0xfb7,
- 0x201, 0xf51, 0xfb7, 0x201, 0xf56, 0xfb7, 0x201, 0xf5b,
- 0xfb7, 0x201, 0xf40, 0xfb5, 0x201, 0xf71, 0xf72, 0x201,
- 0xf71, 0xf74, 0x201, 0xfb2, 0xf80, 0x210, 0xfb2, 0xf81,
- 0x201, 0xfb3, 0xf80, 0x210, 0xfb3, 0xf81, 0x201, 0xf71,
- 0xf80, 0x201, 0xf92, 0xfb7, 0x201, 0xf9c, 0xfb7, 0x201,
- 0xfa1, 0xfb7, 0x201, 0xfa6, 0xfb7, 0x201, 0xfab, 0xfb7,
- 0x201, 0xf90, 0xfb5, 0x201, 0x1025, 0x102e, 0x109, 0x10dc,
- 0x201, 0x1b05, 0x1b35, 0x201, 0x1b07, 0x1b35, 0x201, 0x1b09,
- 0x1b35, 0x201, 0x1b0b, 0x1b35, 0x201, 0x1b0d, 0x1b35, 0x201,
- 0x1b11, 0x1b35, 0x201, 0x1b3a, 0x1b35, 0x201, 0x1b3c, 0x1b35,
- 0x201, 0x1b3e, 0x1b35, 0x201, 0x1b3f, 0x1b35, 0x201, 0x1b42,
- 0x1b35, 0x109, 0x41, 0x109, 0xc6, 0x109, 0x42, 0x109,
- 0x44, 0x109, 0x45, 0x109, 0x18e, 0x109, 0x47, 0x109,
- 0x48, 0x109, 0x49, 0x109, 0x4a, 0x109, 0x4b, 0x109,
- 0x4c, 0x109, 0x4d, 0x109, 0x4e, 0x109, 0x4f, 0x109,
- 0x222, 0x109, 0x50, 0x109, 0x52, 0x109, 0x54, 0x109,
- 0x55, 0x109, 0x57, 0x109, 0x61, 0x109, 0x250, 0x109,
- 0x251, 0x109, 0x1d02, 0x109, 0x62, 0x109, 0x64, 0x109,
- 0x65, 0x109, 0x259, 0x109, 0x25b, 0x109, 0x25c, 0x109,
- 0x67, 0x109, 0x6b, 0x109, 0x6d, 0x109, 0x14b, 0x109,
- 0x6f, 0x109, 0x254, 0x109, 0x1d16, 0x109, 0x1d17, 0x109,
- 0x70, 0x109, 0x74, 0x109, 0x75, 0x109, 0x1d1d, 0x109,
- 0x26f, 0x109, 0x76, 0x109, 0x1d25, 0x109, 0x3b2, 0x109,
- 0x3b3, 0x109, 0x3b4, 0x109, 0x3c6, 0x109, 0x3c7, 0x10a,
- 0x69, 0x10a, 0x72, 0x10a, 0x75, 0x10a, 0x76, 0x10a,
- 0x3b2, 0x10a, 0x3b3, 0x10a, 0x3c1, 0x10a, 0x3c6, 0x10a,
- 0x3c7, 0x109, 0x43d, 0x109, 0x252, 0x109, 0x63, 0x109,
- 0x255, 0x109, 0xf0, 0x109, 0x25c, 0x109, 0x66, 0x109,
- 0x25f, 0x109, 0x261, 0x109, 0x265, 0x109, 0x268, 0x109,
- 0x269, 0x109, 0x26a, 0x109, 0x1d7b, 0x109, 0x29d, 0x109,
- 0x26d, 0x109, 0x1d85, 0x109, 0x29f, 0x109, 0x271, 0x109,
- 0x270, 0x109, 0x272, 0x109, 0x273, 0x109, 0x274, 0x109,
- 0x275, 0x109, 0x278, 0x109, 0x282, 0x109, 0x283, 0x109,
- 0x1ab, 0x109, 0x289, 0x109, 0x28a, 0x109, 0x1d1c, 0x109,
- 0x28b, 0x109, 0x28c, 0x109, 0x7a, 0x109, 0x290, 0x109,
- 0x291, 0x109, 0x292, 0x109, 0x3b8, 0x201, 0x41, 0x325,
- 0x201, 0x61, 0x325, 0x201, 0x42, 0x307, 0x201, 0x62,
- 0x307, 0x201, 0x42, 0x323, 0x201, 0x62, 0x323, 0x201,
- 0x42, 0x331, 0x201, 0x62, 0x331, 0x201, 0xc7, 0x301,
- 0x201, 0xe7, 0x301, 0x201, 0x44, 0x307, 0x201, 0x64,
- 0x307, 0x201, 0x44, 0x323, 0x201, 0x64, 0x323, 0x201,
- 0x44, 0x331, 0x201, 0x64, 0x331, 0x201, 0x44, 0x327,
- 0x201, 0x64, 0x327, 0x201, 0x44, 0x32d, 0x201, 0x64,
- 0x32d, 0x201, 0x112, 0x300, 0x201, 0x113, 0x300, 0x201,
- 0x112, 0x301, 0x201, 0x113, 0x301, 0x201, 0x45, 0x32d,
- 0x201, 0x65, 0x32d, 0x201, 0x45, 0x330, 0x201, 0x65,
- 0x330, 0x201, 0x228, 0x306, 0x201, 0x229, 0x306, 0x201,
- 0x46, 0x307, 0x201, 0x66, 0x307, 0x201, 0x47, 0x304,
- 0x201, 0x67, 0x304, 0x201, 0x48, 0x307, 0x201, 0x68,
- 0x307, 0x201, 0x48, 0x323, 0x201, 0x68, 0x323, 0x201,
- 0x48, 0x308, 0x201, 0x68, 0x308, 0x201, 0x48, 0x327,
- 0x201, 0x68, 0x327, 0x201, 0x48, 0x32e, 0x201, 0x68,
- 0x32e, 0x201, 0x49, 0x330, 0x201, 0x69, 0x330, 0x201,
- 0xcf, 0x301, 0x201, 0xef, 0x301, 0x201, 0x4b, 0x301,
- 0x201, 0x6b, 0x301, 0x201, 0x4b, 0x323, 0x201, 0x6b,
- 0x323, 0x201, 0x4b, 0x331, 0x201, 0x6b, 0x331, 0x201,
- 0x4c, 0x323, 0x201, 0x6c, 0x323, 0x201, 0x1e36, 0x304,
- 0x201, 0x1e37, 0x304, 0x201, 0x4c, 0x331, 0x201, 0x6c,
- 0x331, 0x201, 0x4c, 0x32d, 0x201, 0x6c, 0x32d, 0x201,
- 0x4d, 0x301, 0x201, 0x6d, 0x301, 0x201, 0x4d, 0x307,
- 0x201, 0x6d, 0x307, 0x201, 0x4d, 0x323, 0x201, 0x6d,
- 0x323, 0x201, 0x4e, 0x307, 0x201, 0x6e, 0x307, 0x201,
- 0x4e, 0x323, 0x201, 0x6e, 0x323, 0x201, 0x4e, 0x331,
- 0x201, 0x6e, 0x331, 0x201, 0x4e, 0x32d, 0x201, 0x6e,
- 0x32d, 0x201, 0xd5, 0x301, 0x201, 0xf5, 0x301, 0x201,
- 0xd5, 0x308, 0x201, 0xf5, 0x308, 0x201, 0x14c, 0x300,
- 0x201, 0x14d, 0x300, 0x201, 0x14c, 0x301, 0x201, 0x14d,
- 0x301, 0x201, 0x50, 0x301, 0x201, 0x70, 0x301, 0x201,
- 0x50, 0x307, 0x201, 0x70, 0x307, 0x201, 0x52, 0x307,
- 0x201, 0x72, 0x307, 0x201, 0x52, 0x323, 0x201, 0x72,
- 0x323, 0x201, 0x1e5a, 0x304, 0x201, 0x1e5b, 0x304, 0x201,
- 0x52, 0x331, 0x201, 0x72, 0x331, 0x201, 0x53, 0x307,
- 0x201, 0x73, 0x307, 0x201, 0x53, 0x323, 0x201, 0x73,
- 0x323, 0x201, 0x15a, 0x307, 0x201, 0x15b, 0x307, 0x201,
- 0x160, 0x307, 0x201, 0x161, 0x307, 0x201, 0x1e62, 0x307,
- 0x201, 0x1e63, 0x307, 0x201, 0x54, 0x307, 0x201, 0x74,
- 0x307, 0x201, 0x54, 0x323, 0x201, 0x74, 0x323, 0x201,
- 0x54, 0x331, 0x201, 0x74, 0x331, 0x201, 0x54, 0x32d,
- 0x201, 0x74, 0x32d, 0x201, 0x55, 0x324, 0x201, 0x75,
- 0x324, 0x201, 0x55, 0x330, 0x201, 0x75, 0x330, 0x201,
- 0x55, 0x32d, 0x201, 0x75, 0x32d, 0x201, 0x168, 0x301,
- 0x201, 0x169, 0x301, 0x201, 0x16a, 0x308, 0x201, 0x16b,
- 0x308, 0x201, 0x56, 0x303, 0x201, 0x76, 0x303, 0x201,
- 0x56, 0x323, 0x201, 0x76, 0x323, 0x201, 0x57, 0x300,
- 0x201, 0x77, 0x300, 0x201, 0x57, 0x301, 0x201, 0x77,
- 0x301, 0x201, 0x57, 0x308, 0x201, 0x77, 0x308, 0x201,
- 0x57, 0x307, 0x201, 0x77, 0x307, 0x201, 0x57, 0x323,
- 0x201, 0x77, 0x323, 0x201, 0x58, 0x307, 0x201, 0x78,
- 0x307, 0x201, 0x58, 0x308, 0x201, 0x78, 0x308, 0x201,
- 0x59, 0x307, 0x201, 0x79, 0x307, 0x201, 0x5a, 0x302,
- 0x201, 0x7a, 0x302, 0x201, 0x5a, 0x323, 0x201, 0x7a,
- 0x323, 0x201, 0x5a, 0x331, 0x201, 0x7a, 0x331, 0x201,
- 0x68, 0x331, 0x201, 0x74, 0x308, 0x201, 0x77, 0x30a,
- 0x201, 0x79, 0x30a, 0x210, 0x61, 0x2be, 0x201, 0x17f,
- 0x307, 0x201, 0x41, 0x323, 0x201, 0x61, 0x323, 0x201,
- 0x41, 0x309, 0x201, 0x61, 0x309, 0x201, 0xc2, 0x301,
- 0x201, 0xe2, 0x301, 0x201, 0xc2, 0x300, 0x201, 0xe2,
- 0x300, 0x201, 0xc2, 0x309, 0x201, 0xe2, 0x309, 0x201,
- 0xc2, 0x303, 0x201, 0xe2, 0x303, 0x201, 0x1ea0, 0x302,
- 0x201, 0x1ea1, 0x302, 0x201, 0x102, 0x301, 0x201, 0x103,
- 0x301, 0x201, 0x102, 0x300, 0x201, 0x103, 0x300, 0x201,
- 0x102, 0x309, 0x201, 0x103, 0x309, 0x201, 0x102, 0x303,
- 0x201, 0x103, 0x303, 0x201, 0x1ea0, 0x306, 0x201, 0x1ea1,
- 0x306, 0x201, 0x45, 0x323, 0x201, 0x65, 0x323, 0x201,
- 0x45, 0x309, 0x201, 0x65, 0x309, 0x201, 0x45, 0x303,
- 0x201, 0x65, 0x303, 0x201, 0xca, 0x301, 0x201, 0xea,
- 0x301, 0x201, 0xca, 0x300, 0x201, 0xea, 0x300, 0x201,
- 0xca, 0x309, 0x201, 0xea, 0x309, 0x201, 0xca, 0x303,
- 0x201, 0xea, 0x303, 0x201, 0x1eb8, 0x302, 0x201, 0x1eb9,
- 0x302, 0x201, 0x49, 0x309, 0x201, 0x69, 0x309, 0x201,
- 0x49, 0x323, 0x201, 0x69, 0x323, 0x201, 0x4f, 0x323,
- 0x201, 0x6f, 0x323, 0x201, 0x4f, 0x309, 0x201, 0x6f,
- 0x309, 0x201, 0xd4, 0x301, 0x201, 0xf4, 0x301, 0x201,
- 0xd4, 0x300, 0x201, 0xf4, 0x300, 0x201, 0xd4, 0x309,
- 0x201, 0xf4, 0x309, 0x201, 0xd4, 0x303, 0x201, 0xf4,
- 0x303, 0x201, 0x1ecc, 0x302, 0x201, 0x1ecd, 0x302, 0x201,
- 0x1a0, 0x301, 0x201, 0x1a1, 0x301, 0x201, 0x1a0, 0x300,
- 0x201, 0x1a1, 0x300, 0x201, 0x1a0, 0x309, 0x201, 0x1a1,
- 0x309, 0x201, 0x1a0, 0x303, 0x201, 0x1a1, 0x303, 0x201,
- 0x1a0, 0x323, 0x201, 0x1a1, 0x323, 0x201, 0x55, 0x323,
- 0x201, 0x75, 0x323, 0x201, 0x55, 0x309, 0x201, 0x75,
- 0x309, 0x201, 0x1af, 0x301, 0x201, 0x1b0, 0x301, 0x201,
- 0x1af, 0x300, 0x201, 0x1b0, 0x300, 0x201, 0x1af, 0x309,
- 0x201, 0x1b0, 0x309, 0x201, 0x1af, 0x303, 0x201, 0x1b0,
- 0x303, 0x201, 0x1af, 0x323, 0x201, 0x1b0, 0x323, 0x201,
- 0x59, 0x300, 0x201, 0x79, 0x300, 0x201, 0x59, 0x323,
- 0x201, 0x79, 0x323, 0x201, 0x59, 0x309, 0x201, 0x79,
- 0x309, 0x201, 0x59, 0x303, 0x201, 0x79, 0x303, 0x201,
- 0x3b1, 0x313, 0x201, 0x3b1, 0x314, 0x201, 0x1f00, 0x300,
- 0x201, 0x1f01, 0x300, 0x201, 0x1f00, 0x301, 0x201, 0x1f01,
- 0x301, 0x201, 0x1f00, 0x342, 0x201, 0x1f01, 0x342, 0x201,
- 0x391, 0x313, 0x201, 0x391, 0x314, 0x201, 0x1f08, 0x300,
- 0x201, 0x1f09, 0x300, 0x201, 0x1f08, 0x301, 0x201, 0x1f09,
- 0x301, 0x201, 0x1f08, 0x342, 0x201, 0x1f09, 0x342, 0x201,
- 0x3b5, 0x313, 0x201, 0x3b5, 0x314, 0x201, 0x1f10, 0x300,
- 0x201, 0x1f11, 0x300, 0x201, 0x1f10, 0x301, 0x201, 0x1f11,
- 0x301, 0x201, 0x395, 0x313, 0x201, 0x395, 0x314, 0x201,
- 0x1f18, 0x300, 0x201, 0x1f19, 0x300, 0x201, 0x1f18, 0x301,
- 0x201, 0x1f19, 0x301, 0x201, 0x3b7, 0x313, 0x201, 0x3b7,
- 0x314, 0x201, 0x1f20, 0x300, 0x201, 0x1f21, 0x300, 0x201,
- 0x1f20, 0x301, 0x201, 0x1f21, 0x301, 0x201, 0x1f20, 0x342,
- 0x201, 0x1f21, 0x342, 0x201, 0x397, 0x313, 0x201, 0x397,
- 0x314, 0x201, 0x1f28, 0x300, 0x201, 0x1f29, 0x300, 0x201,
- 0x1f28, 0x301, 0x201, 0x1f29, 0x301, 0x201, 0x1f28, 0x342,
- 0x201, 0x1f29, 0x342, 0x201, 0x3b9, 0x313, 0x201, 0x3b9,
- 0x314, 0x201, 0x1f30, 0x300, 0x201, 0x1f31, 0x300, 0x201,
- 0x1f30, 0x301, 0x201, 0x1f31, 0x301, 0x201, 0x1f30, 0x342,
- 0x201, 0x1f31, 0x342, 0x201, 0x399, 0x313, 0x201, 0x399,
- 0x314, 0x201, 0x1f38, 0x300, 0x201, 0x1f39, 0x300, 0x201,
- 0x1f38, 0x301, 0x201, 0x1f39, 0x301, 0x201, 0x1f38, 0x342,
- 0x201, 0x1f39, 0x342, 0x201, 0x3bf, 0x313, 0x201, 0x3bf,
- 0x314, 0x201, 0x1f40, 0x300, 0x201, 0x1f41, 0x300, 0x201,
- 0x1f40, 0x301, 0x201, 0x1f41, 0x301, 0x201, 0x39f, 0x313,
- 0x201, 0x39f, 0x314, 0x201, 0x1f48, 0x300, 0x201, 0x1f49,
- 0x300, 0x201, 0x1f48, 0x301, 0x201, 0x1f49, 0x301, 0x201,
- 0x3c5, 0x313, 0x201, 0x3c5, 0x314, 0x201, 0x1f50, 0x300,
- 0x201, 0x1f51, 0x300, 0x201, 0x1f50, 0x301, 0x201, 0x1f51,
- 0x301, 0x201, 0x1f50, 0x342, 0x201, 0x1f51, 0x342, 0x201,
- 0x3a5, 0x314, 0x201, 0x1f59, 0x300, 0x201, 0x1f59, 0x301,
- 0x201, 0x1f59, 0x342, 0x201, 0x3c9, 0x313, 0x201, 0x3c9,
- 0x314, 0x201, 0x1f60, 0x300, 0x201, 0x1f61, 0x300, 0x201,
- 0x1f60, 0x301, 0x201, 0x1f61, 0x301, 0x201, 0x1f60, 0x342,
- 0x201, 0x1f61, 0x342, 0x201, 0x3a9, 0x313, 0x201, 0x3a9,
- 0x314, 0x201, 0x1f68, 0x300, 0x201, 0x1f69, 0x300, 0x201,
- 0x1f68, 0x301, 0x201, 0x1f69, 0x301, 0x201, 0x1f68, 0x342,
- 0x201, 0x1f69, 0x342, 0x201, 0x3b1, 0x300, 0x101, 0x3ac,
- 0x201, 0x3b5, 0x300, 0x101, 0x3ad, 0x201, 0x3b7, 0x300,
- 0x101, 0x3ae, 0x201, 0x3b9, 0x300, 0x101, 0x3af, 0x201,
- 0x3bf, 0x300, 0x101, 0x3cc, 0x201, 0x3c5, 0x300, 0x101,
- 0x3cd, 0x201, 0x3c9, 0x300, 0x101, 0x3ce, 0x201, 0x1f00,
- 0x345, 0x201, 0x1f01, 0x345, 0x201, 0x1f02, 0x345, 0x201,
- 0x1f03, 0x345, 0x201, 0x1f04, 0x345, 0x201, 0x1f05, 0x345,
- 0x201, 0x1f06, 0x345, 0x201, 0x1f07, 0x345, 0x201, 0x1f08,
- 0x345, 0x201, 0x1f09, 0x345, 0x201, 0x1f0a, 0x345, 0x201,
- 0x1f0b, 0x345, 0x201, 0x1f0c, 0x345, 0x201, 0x1f0d, 0x345,
- 0x201, 0x1f0e, 0x345, 0x201, 0x1f0f, 0x345, 0x201, 0x1f20,
- 0x345, 0x201, 0x1f21, 0x345, 0x201, 0x1f22, 0x345, 0x201,
- 0x1f23, 0x345, 0x201, 0x1f24, 0x345, 0x201, 0x1f25, 0x345,
- 0x201, 0x1f26, 0x345, 0x201, 0x1f27, 0x345, 0x201, 0x1f28,
- 0x345, 0x201, 0x1f29, 0x345, 0x201, 0x1f2a, 0x345, 0x201,
- 0x1f2b, 0x345, 0x201, 0x1f2c, 0x345, 0x201, 0x1f2d, 0x345,
- 0x201, 0x1f2e, 0x345, 0x201, 0x1f2f, 0x345, 0x201, 0x1f60,
- 0x345, 0x201, 0x1f61, 0x345, 0x201, 0x1f62, 0x345, 0x201,
- 0x1f63, 0x345, 0x201, 0x1f64, 0x345, 0x201, 0x1f65, 0x345,
- 0x201, 0x1f66, 0x345, 0x201, 0x1f67, 0x345, 0x201, 0x1f68,
- 0x345, 0x201, 0x1f69, 0x345, 0x201, 0x1f6a, 0x345, 0x201,
- 0x1f6b, 0x345, 0x201, 0x1f6c, 0x345, 0x201, 0x1f6d, 0x345,
- 0x201, 0x1f6e, 0x345, 0x201, 0x1f6f, 0x345, 0x201, 0x3b1,
- 0x306, 0x201, 0x3b1, 0x304, 0x201, 0x1f70, 0x345, 0x201,
- 0x3b1, 0x345, 0x201, 0x3ac, 0x345, 0x201, 0x3b1, 0x342,
- 0x201, 0x1fb6, 0x345, 0x201, 0x391, 0x306, 0x201, 0x391,
- 0x304, 0x201, 0x391, 0x300, 0x101, 0x386, 0x201, 0x391,
- 0x345, 0x210, 0x20, 0x313, 0x101, 0x3b9, 0x210, 0x20,
- 0x313, 0x210, 0x20, 0x342, 0x201, 0xa8, 0x342, 0x201,
- 0x1f74, 0x345, 0x201, 0x3b7, 0x345, 0x201, 0x3ae, 0x345,
- 0x201, 0x3b7, 0x342, 0x201, 0x1fc6, 0x345, 0x201, 0x395,
- 0x300, 0x101, 0x388, 0x201, 0x397, 0x300, 0x101, 0x389,
- 0x201, 0x397, 0x345, 0x201, 0x1fbf, 0x300, 0x201, 0x1fbf,
- 0x301, 0x201, 0x1fbf, 0x342, 0x201, 0x3b9, 0x306, 0x201,
- 0x3b9, 0x304, 0x201, 0x3ca, 0x300, 0x101, 0x390, 0x201,
- 0x3b9, 0x342, 0x201, 0x3ca, 0x342, 0x201, 0x399, 0x306,
- 0x201, 0x399, 0x304, 0x201, 0x399, 0x300, 0x101, 0x38a,
- 0x201, 0x1ffe, 0x300, 0x201, 0x1ffe, 0x301, 0x201, 0x1ffe,
- 0x342, 0x201, 0x3c5, 0x306, 0x201, 0x3c5, 0x304, 0x201,
- 0x3cb, 0x300, 0x101, 0x3b0, 0x201, 0x3c1, 0x313, 0x201,
- 0x3c1, 0x314, 0x201, 0x3c5, 0x342, 0x201, 0x3cb, 0x342,
- 0x201, 0x3a5, 0x306, 0x201, 0x3a5, 0x304, 0x201, 0x3a5,
- 0x300, 0x101, 0x38e, 0x201, 0x3a1, 0x314, 0x201, 0xa8,
- 0x300, 0x101, 0x385, 0x101, 0x60, 0x201, 0x1f7c, 0x345,
- 0x201, 0x3c9, 0x345, 0x201, 0x3ce, 0x345, 0x201, 0x3c9,
- 0x342, 0x201, 0x1ff6, 0x345, 0x201, 0x39f, 0x300, 0x101,
- 0x38c, 0x201, 0x3a9, 0x300, 0x101, 0x38f, 0x201, 0x3a9,
- 0x345, 0x101, 0xb4, 0x210, 0x20, 0x314, 0x101, 0x2002,
- 0x101, 0x2003, 0x110, 0x20, 0x110, 0x20, 0x110, 0x20,
- 0x110, 0x20, 0x110, 0x20, 0x103, 0x20, 0x110, 0x20,
- 0x110, 0x20, 0x110, 0x20, 0x103, 0x2010, 0x210, 0x20,
- 0x333, 0x110, 0x2e, 0x210, 0x2e, 0x2e, 0x310, 0x2e,
- 0x2e, 0x2e, 0x103, 0x20, 0x210, 0x2032, 0x2032, 0x310,
- 0x2032, 0x2032, 0x2032, 0x210, 0x2035, 0x2035, 0x310, 0x2035,
- 0x2035, 0x2035, 0x210, 0x21, 0x21, 0x210, 0x20, 0x305,
- 0x210, 0x3f, 0x3f, 0x210, 0x3f, 0x21, 0x210, 0x21,
- 0x3f, 0x410, 0x2032, 0x2032, 0x2032, 0x2032, 0x110, 0x20,
- 0x109, 0x30, 0x109, 0x69, 0x109, 0x34, 0x109, 0x35,
- 0x109, 0x36, 0x109, 0x37, 0x109, 0x38, 0x109, 0x39,
- 0x109, 0x2b, 0x109, 0x2212, 0x109, 0x3d, 0x109, 0x28,
- 0x109, 0x29, 0x109, 0x6e, 0x10a, 0x30, 0x10a, 0x31,
- 0x10a, 0x32, 0x10a, 0x33, 0x10a, 0x34, 0x10a, 0x35,
- 0x10a, 0x36, 0x10a, 0x37, 0x10a, 0x38, 0x10a, 0x39,
- 0x10a, 0x2b, 0x10a, 0x2212, 0x10a, 0x3d, 0x10a, 0x28,
- 0x10a, 0x29, 0x10a, 0x61, 0x10a, 0x65, 0x10a, 0x6f,
- 0x10a, 0x78, 0x10a, 0x259, 0x10a, 0x68, 0x10a, 0x6b,
- 0x10a, 0x6c, 0x10a, 0x6d, 0x10a, 0x6e, 0x10a, 0x70,
- 0x10a, 0x73, 0x10a, 0x74, 0x210, 0x52, 0x73, 0x310,
- 0x61, 0x2f, 0x63, 0x310, 0x61, 0x2f, 0x73, 0x102,
- 0x43, 0x210, 0xb0, 0x43, 0x310, 0x63, 0x2f, 0x6f,
- 0x310, 0x63, 0x2f, 0x75, 0x110, 0x190, 0x210, 0xb0,
- 0x46, 0x102, 0x67, 0x102, 0x48, 0x102, 0x48, 0x102,
- 0x48, 0x102, 0x68, 0x102, 0x127, 0x102, 0x49, 0x102,
- 0x49, 0x102, 0x4c, 0x102, 0x6c, 0x102, 0x4e, 0x210,
- 0x4e, 0x6f, 0x102, 0x50, 0x102, 0x51, 0x102, 0x52,
- 0x102, 0x52, 0x102, 0x52, 0x209, 0x53, 0x4d, 0x310,
- 0x54, 0x45, 0x4c, 0x209, 0x54, 0x4d, 0x102, 0x5a,
- 0x101, 0x3a9, 0x102, 0x5a, 0x101, 0x4b, 0x101, 0xc5,
- 0x102, 0x42, 0x102, 0x43, 0x102, 0x65, 0x102, 0x45,
- 0x102, 0x46, 0x102, 0x4d, 0x102, 0x6f, 0x110, 0x5d0,
- 0x110, 0x5d1, 0x110, 0x5d2, 0x110, 0x5d3, 0x102, 0x69,
- 0x310, 0x46, 0x41, 0x58, 0x102, 0x3c0, 0x102, 0x3b3,
- 0x102, 0x393, 0x102, 0x3a0, 0x102, 0x2211, 0x102, 0x44,
- 0x102, 0x64, 0x102, 0x65, 0x102, 0x69, 0x102, 0x6a,
- 0x311, 0x31, 0x2044, 0x37, 0x311, 0x31, 0x2044, 0x39,
- 0x411, 0x31, 0x2044, 0x31, 0x30, 0x311, 0x31, 0x2044,
- 0x33, 0x311, 0x32, 0x2044, 0x33, 0x311, 0x31, 0x2044,
- 0x35, 0x311, 0x32, 0x2044, 0x35, 0x311, 0x33, 0x2044,
- 0x35, 0x311, 0x34, 0x2044, 0x35, 0x311, 0x31, 0x2044,
- 0x36, 0x311, 0x35, 0x2044, 0x36, 0x311, 0x31, 0x2044,
- 0x38, 0x311, 0x33, 0x2044, 0x38, 0x311, 0x35, 0x2044,
- 0x38, 0x311, 0x37, 0x2044, 0x38, 0x211, 0x31, 0x2044,
- 0x110, 0x49, 0x210, 0x49, 0x49, 0x310, 0x49, 0x49,
- 0x49, 0x210, 0x49, 0x56, 0x110, 0x56, 0x210, 0x56,
- 0x49, 0x310, 0x56, 0x49, 0x49, 0x410, 0x56, 0x49,
- 0x49, 0x49, 0x210, 0x49, 0x58, 0x110, 0x58, 0x210,
- 0x58, 0x49, 0x310, 0x58, 0x49, 0x49, 0x110, 0x4c,
- 0x110, 0x43, 0x110, 0x44, 0x110, 0x4d, 0x110, 0x69,
- 0x210, 0x69, 0x69, 0x310, 0x69, 0x69, 0x69, 0x210,
- 0x69, 0x76, 0x110, 0x76, 0x210, 0x76, 0x69, 0x310,
- 0x76, 0x69, 0x69, 0x410, 0x76, 0x69, 0x69, 0x69,
- 0x210, 0x69, 0x78, 0x110, 0x78, 0x210, 0x78, 0x69,
- 0x310, 0x78, 0x69, 0x69, 0x110, 0x6c, 0x110, 0x63,
- 0x110, 0x64, 0x110, 0x6d, 0x311, 0x30, 0x2044, 0x33,
- 0x201, 0x2190, 0x338, 0x201, 0x2192, 0x338, 0x201, 0x2194,
- 0x338, 0x201, 0x21d0, 0x338, 0x201, 0x21d4, 0x338, 0x201,
- 0x21d2, 0x338, 0x201, 0x2203, 0x338, 0x201, 0x2208, 0x338,
- 0x201, 0x220b, 0x338, 0x201, 0x2223, 0x338, 0x201, 0x2225,
- 0x338, 0x210, 0x222b, 0x222b, 0x310, 0x222b, 0x222b, 0x222b,
- 0x210, 0x222e, 0x222e, 0x310, 0x222e, 0x222e, 0x222e, 0x201,
- 0x223c, 0x338, 0x201, 0x2243, 0x338, 0x201, 0x2245, 0x338,
- 0x201, 0x2248, 0x338, 0x201, 0x3d, 0x338, 0x201, 0x2261,
- 0x338, 0x201, 0x224d, 0x338, 0x201, 0x3c, 0x338, 0x201,
- 0x3e, 0x338, 0x201, 0x2264, 0x338, 0x201, 0x2265, 0x338,
- 0x201, 0x2272, 0x338, 0x201, 0x2273, 0x338, 0x201, 0x2276,
- 0x338, 0x201, 0x2277, 0x338, 0x201, 0x227a, 0x338, 0x201,
- 0x227b, 0x338, 0x201, 0x2282, 0x338, 0x201, 0x2283, 0x338,
- 0x201, 0x2286, 0x338, 0x201, 0x2287, 0x338, 0x201, 0x22a2,
- 0x338, 0x201, 0x22a8, 0x338, 0x201, 0x22a9, 0x338, 0x201,
- 0x22ab, 0x338, 0x201, 0x227c, 0x338, 0x201, 0x227d, 0x338,
- 0x201, 0x2291, 0x338, 0x201, 0x2292, 0x338, 0x201, 0x22b2,
- 0x338, 0x201, 0x22b3, 0x338, 0x201, 0x22b4, 0x338, 0x201,
- 0x22b5, 0x338, 0x101, 0x3008, 0x101, 0x3009, 0x108, 0x31,
- 0x108, 0x32, 0x108, 0x33, 0x108, 0x34, 0x108, 0x35,
- 0x108, 0x36, 0x108, 0x37, 0x108, 0x38, 0x108, 0x39,
- 0x208, 0x31, 0x30, 0x208, 0x31, 0x31, 0x208, 0x31,
- 0x32, 0x208, 0x31, 0x33, 0x208, 0x31, 0x34, 0x208,
- 0x31, 0x35, 0x208, 0x31, 0x36, 0x208, 0x31, 0x37,
- 0x208, 0x31, 0x38, 0x208, 0x31, 0x39, 0x208, 0x32,
- 0x30, 0x310, 0x28, 0x31, 0x29, 0x310, 0x28, 0x32,
- 0x29, 0x310, 0x28, 0x33, 0x29, 0x310, 0x28, 0x34,
- 0x29, 0x310, 0x28, 0x35, 0x29, 0x310, 0x28, 0x36,
- 0x29, 0x310, 0x28, 0x37, 0x29, 0x310, 0x28, 0x38,
- 0x29, 0x310, 0x28, 0x39, 0x29, 0x410, 0x28, 0x31,
- 0x30, 0x29, 0x410, 0x28, 0x31, 0x31, 0x29, 0x410,
- 0x28, 0x31, 0x32, 0x29, 0x410, 0x28, 0x31, 0x33,
- 0x29, 0x410, 0x28, 0x31, 0x34, 0x29, 0x410, 0x28,
- 0x31, 0x35, 0x29, 0x410, 0x28, 0x31, 0x36, 0x29,
- 0x410, 0x28, 0x31, 0x37, 0x29, 0x410, 0x28, 0x31,
- 0x38, 0x29, 0x410, 0x28, 0x31, 0x39, 0x29, 0x410,
- 0x28, 0x32, 0x30, 0x29, 0x210, 0x31, 0x2e, 0x210,
- 0x32, 0x2e, 0x210, 0x33, 0x2e, 0x210, 0x34, 0x2e,
- 0x210, 0x35, 0x2e, 0x210, 0x36, 0x2e, 0x210, 0x37,
- 0x2e, 0x210, 0x38, 0x2e, 0x210, 0x39, 0x2e, 0x310,
- 0x31, 0x30, 0x2e, 0x310, 0x31, 0x31, 0x2e, 0x310,
- 0x31, 0x32, 0x2e, 0x310, 0x31, 0x33, 0x2e, 0x310,
- 0x31, 0x34, 0x2e, 0x310, 0x31, 0x35, 0x2e, 0x310,
- 0x31, 0x36, 0x2e, 0x310, 0x31, 0x37, 0x2e, 0x310,
- 0x31, 0x38, 0x2e, 0x310, 0x31, 0x39, 0x2e, 0x310,
- 0x32, 0x30, 0x2e, 0x310, 0x28, 0x61, 0x29, 0x310,
- 0x28, 0x62, 0x29, 0x310, 0x28, 0x63, 0x29, 0x310,
- 0x28, 0x64, 0x29, 0x310, 0x28, 0x65, 0x29, 0x310,
- 0x28, 0x66, 0x29, 0x310, 0x28, 0x67, 0x29, 0x310,
- 0x28, 0x68, 0x29, 0x310, 0x28, 0x69, 0x29, 0x310,
- 0x28, 0x6a, 0x29, 0x310, 0x28, 0x6b, 0x29, 0x310,
- 0x28, 0x6c, 0x29, 0x310, 0x28, 0x6d, 0x29, 0x310,
- 0x28, 0x6e, 0x29, 0x310, 0x28, 0x6f, 0x29, 0x310,
- 0x28, 0x70, 0x29, 0x310, 0x28, 0x71, 0x29, 0x310,
- 0x28, 0x72, 0x29, 0x310, 0x28, 0x73, 0x29, 0x310,
- 0x28, 0x74, 0x29, 0x310, 0x28, 0x75, 0x29, 0x310,
- 0x28, 0x76, 0x29, 0x310, 0x28, 0x77, 0x29, 0x310,
- 0x28, 0x78, 0x29, 0x310, 0x28, 0x79, 0x29, 0x310,
- 0x28, 0x7a, 0x29, 0x108, 0x41, 0x108, 0x42, 0x108,
- 0x43, 0x108, 0x44, 0x108, 0x45, 0x108, 0x46, 0x108,
- 0x47, 0x108, 0x48, 0x108, 0x49, 0x108, 0x4a, 0x108,
- 0x4b, 0x108, 0x4c, 0x108, 0x4d, 0x108, 0x4e, 0x108,
- 0x4f, 0x108, 0x50, 0x108, 0x51, 0x108, 0x52, 0x108,
- 0x53, 0x108, 0x54, 0x108, 0x55, 0x108, 0x56, 0x108,
- 0x57, 0x108, 0x58, 0x108, 0x59, 0x108, 0x5a, 0x108,
- 0x61, 0x108, 0x62, 0x108, 0x63, 0x108, 0x64, 0x108,
- 0x65, 0x108, 0x66, 0x108, 0x67, 0x108, 0x68, 0x108,
- 0x69, 0x108, 0x6a, 0x108, 0x6b, 0x108, 0x6c, 0x108,
- 0x6d, 0x108, 0x6e, 0x108, 0x6f, 0x108, 0x70, 0x108,
- 0x71, 0x108, 0x72, 0x108, 0x73, 0x108, 0x74, 0x108,
- 0x75, 0x108, 0x76, 0x108, 0x77, 0x108, 0x78, 0x108,
- 0x79, 0x108, 0x7a, 0x108, 0x30, 0x410, 0x222b, 0x222b,
- 0x222b, 0x222b, 0x310, 0x3a, 0x3a, 0x3d, 0x210, 0x3d,
- 0x3d, 0x310, 0x3d, 0x3d, 0x3d, 0x201, 0x2add, 0x338,
- 0x10a, 0x6a, 0x109, 0x56, 0x109, 0x2d61, 0x110, 0x6bcd,
- 0x110, 0x9f9f, 0x110, 0x4e00, 0x110, 0x4e28, 0x110, 0x4e36,
- 0x110, 0x4e3f, 0x110, 0x4e59, 0x110, 0x4e85, 0x110, 0x4e8c,
- 0x110, 0x4ea0, 0x110, 0x4eba, 0x110, 0x513f, 0x110, 0x5165,
- 0x110, 0x516b, 0x110, 0x5182, 0x110, 0x5196, 0x110, 0x51ab,
- 0x110, 0x51e0, 0x110, 0x51f5, 0x110, 0x5200, 0x110, 0x529b,
- 0x110, 0x52f9, 0x110, 0x5315, 0x110, 0x531a, 0x110, 0x5338,
- 0x110, 0x5341, 0x110, 0x535c, 0x110, 0x5369, 0x110, 0x5382,
- 0x110, 0x53b6, 0x110, 0x53c8, 0x110, 0x53e3, 0x110, 0x56d7,
- 0x110, 0x571f, 0x110, 0x58eb, 0x110, 0x5902, 0x110, 0x590a,
- 0x110, 0x5915, 0x110, 0x5927, 0x110, 0x5973, 0x110, 0x5b50,
- 0x110, 0x5b80, 0x110, 0x5bf8, 0x110, 0x5c0f, 0x110, 0x5c22,
- 0x110, 0x5c38, 0x110, 0x5c6e, 0x110, 0x5c71, 0x110, 0x5ddb,
- 0x110, 0x5de5, 0x110, 0x5df1, 0x110, 0x5dfe, 0x110, 0x5e72,
- 0x110, 0x5e7a, 0x110, 0x5e7f, 0x110, 0x5ef4, 0x110, 0x5efe,
- 0x110, 0x5f0b, 0x110, 0x5f13, 0x110, 0x5f50, 0x110, 0x5f61,
- 0x110, 0x5f73, 0x110, 0x5fc3, 0x110, 0x6208, 0x110, 0x6236,
- 0x110, 0x624b, 0x110, 0x652f, 0x110, 0x6534, 0x110, 0x6587,
- 0x110, 0x6597, 0x110, 0x65a4, 0x110, 0x65b9, 0x110, 0x65e0,
- 0x110, 0x65e5, 0x110, 0x66f0, 0x110, 0x6708, 0x110, 0x6728,
- 0x110, 0x6b20, 0x110, 0x6b62, 0x110, 0x6b79, 0x110, 0x6bb3,
- 0x110, 0x6bcb, 0x110, 0x6bd4, 0x110, 0x6bdb, 0x110, 0x6c0f,
- 0x110, 0x6c14, 0x110, 0x6c34, 0x110, 0x706b, 0x110, 0x722a,
- 0x110, 0x7236, 0x110, 0x723b, 0x110, 0x723f, 0x110, 0x7247,
- 0x110, 0x7259, 0x110, 0x725b, 0x110, 0x72ac, 0x110, 0x7384,
- 0x110, 0x7389, 0x110, 0x74dc, 0x110, 0x74e6, 0x110, 0x7518,
- 0x110, 0x751f, 0x110, 0x7528, 0x110, 0x7530, 0x110, 0x758b,
- 0x110, 0x7592, 0x110, 0x7676, 0x110, 0x767d, 0x110, 0x76ae,
- 0x110, 0x76bf, 0x110, 0x76ee, 0x110, 0x77db, 0x110, 0x77e2,
- 0x110, 0x77f3, 0x110, 0x793a, 0x110, 0x79b8, 0x110, 0x79be,
- 0x110, 0x7a74, 0x110, 0x7acb, 0x110, 0x7af9, 0x110, 0x7c73,
- 0x110, 0x7cf8, 0x110, 0x7f36, 0x110, 0x7f51, 0x110, 0x7f8a,
- 0x110, 0x7fbd, 0x110, 0x8001, 0x110, 0x800c, 0x110, 0x8012,
- 0x110, 0x8033, 0x110, 0x807f, 0x110, 0x8089, 0x110, 0x81e3,
- 0x110, 0x81ea, 0x110, 0x81f3, 0x110, 0x81fc, 0x110, 0x820c,
- 0x110, 0x821b, 0x110, 0x821f, 0x110, 0x826e, 0x110, 0x8272,
- 0x110, 0x8278, 0x110, 0x864d, 0x110, 0x866b, 0x110, 0x8840,
- 0x110, 0x884c, 0x110, 0x8863, 0x110, 0x897e, 0x110, 0x898b,
- 0x110, 0x89d2, 0x110, 0x8a00, 0x110, 0x8c37, 0x110, 0x8c46,
- 0x110, 0x8c55, 0x110, 0x8c78, 0x110, 0x8c9d, 0x110, 0x8d64,
- 0x110, 0x8d70, 0x110, 0x8db3, 0x110, 0x8eab, 0x110, 0x8eca,
- 0x110, 0x8f9b, 0x110, 0x8fb0, 0x110, 0x8fb5, 0x110, 0x9091,
- 0x110, 0x9149, 0x110, 0x91c6, 0x110, 0x91cc, 0x110, 0x91d1,
- 0x110, 0x9577, 0x110, 0x9580, 0x110, 0x961c, 0x110, 0x96b6,
- 0x110, 0x96b9, 0x110, 0x96e8, 0x110, 0x9751, 0x110, 0x975e,
- 0x110, 0x9762, 0x110, 0x9769, 0x110, 0x97cb, 0x110, 0x97ed,
- 0x110, 0x97f3, 0x110, 0x9801, 0x110, 0x98a8, 0x110, 0x98db,
- 0x110, 0x98df, 0x110, 0x9996, 0x110, 0x9999, 0x110, 0x99ac,
- 0x110, 0x9aa8, 0x110, 0x9ad8, 0x110, 0x9adf, 0x110, 0x9b25,
- 0x110, 0x9b2f, 0x110, 0x9b32, 0x110, 0x9b3c, 0x110, 0x9b5a,
- 0x110, 0x9ce5, 0x110, 0x9e75, 0x110, 0x9e7f, 0x110, 0x9ea5,
- 0x110, 0x9ebb, 0x110, 0x9ec3, 0x110, 0x9ecd, 0x110, 0x9ed1,
- 0x110, 0x9ef9, 0x110, 0x9efd, 0x110, 0x9f0e, 0x110, 0x9f13,
- 0x110, 0x9f20, 0x110, 0x9f3b, 0x110, 0x9f4a, 0x110, 0x9f52,
- 0x110, 0x9f8d, 0x110, 0x9f9c, 0x110, 0x9fa0, 0x10c, 0x20,
- 0x110, 0x3012, 0x110, 0x5341, 0x110, 0x5344, 0x110, 0x5345,
- 0x201, 0x304b, 0x3099, 0x201, 0x304d, 0x3099, 0x201, 0x304f,
- 0x3099, 0x201, 0x3051, 0x3099, 0x201, 0x3053, 0x3099, 0x201,
- 0x3055, 0x3099, 0x201, 0x3057, 0x3099, 0x201, 0x3059, 0x3099,
- 0x201, 0x305b, 0x3099, 0x201, 0x305d, 0x3099, 0x201, 0x305f,
- 0x3099, 0x201, 0x3061, 0x3099, 0x201, 0x3064, 0x3099, 0x201,
- 0x3066, 0x3099, 0x201, 0x3068, 0x3099, 0x201, 0x306f, 0x3099,
- 0x201, 0x306f, 0x309a, 0x201, 0x3072, 0x3099, 0x201, 0x3072,
- 0x309a, 0x201, 0x3075, 0x3099, 0x201, 0x3075, 0x309a, 0x201,
- 0x3078, 0x3099, 0x201, 0x3078, 0x309a, 0x201, 0x307b, 0x3099,
- 0x201, 0x307b, 0x309a, 0x201, 0x3046, 0x3099, 0x210, 0x20,
- 0x3099, 0x210, 0x20, 0x309a, 0x201, 0x309d, 0x3099, 0x20b,
- 0x3088, 0x308a, 0x201, 0x30ab, 0x3099, 0x201, 0x30ad, 0x3099,
- 0x201, 0x30af, 0x3099, 0x201, 0x30b1, 0x3099, 0x201, 0x30b3,
- 0x3099, 0x201, 0x30b5, 0x3099, 0x201, 0x30b7, 0x3099, 0x201,
- 0x30b9, 0x3099, 0x201, 0x30bb, 0x3099, 0x201, 0x30bd, 0x3099,
- 0x201, 0x30bf, 0x3099, 0x201, 0x30c1, 0x3099, 0x201, 0x30c4,
- 0x3099, 0x201, 0x30c6, 0x3099, 0x201, 0x30c8, 0x3099, 0x201,
- 0x30cf, 0x3099, 0x201, 0x30cf, 0x309a, 0x201, 0x30d2, 0x3099,
- 0x201, 0x30d2, 0x309a, 0x201, 0x30d5, 0x3099, 0x201, 0x30d5,
- 0x309a, 0x201, 0x30d8, 0x3099, 0x201, 0x30d8, 0x309a, 0x201,
- 0x30db, 0x3099, 0x201, 0x30db, 0x309a, 0x201, 0x30a6, 0x3099,
- 0x201, 0x30ef, 0x3099, 0x201, 0x30f0, 0x3099, 0x201, 0x30f1,
- 0x3099, 0x201, 0x30f2, 0x3099, 0x201, 0x30fd, 0x3099, 0x20b,
- 0x30b3, 0x30c8, 0x110, 0x1100, 0x110, 0x1101, 0x110, 0x11aa,
- 0x110, 0x1102, 0x110, 0x11ac, 0x110, 0x11ad, 0x110, 0x1103,
- 0x110, 0x1104, 0x110, 0x1105, 0x110, 0x11b0, 0x110, 0x11b1,
- 0x110, 0x11b2, 0x110, 0x11b3, 0x110, 0x11b4, 0x110, 0x11b5,
- 0x110, 0x111a, 0x110, 0x1106, 0x110, 0x1107, 0x110, 0x1108,
- 0x110, 0x1121, 0x110, 0x1109, 0x110, 0x110a, 0x110, 0x110b,
- 0x110, 0x110c, 0x110, 0x110d, 0x110, 0x110e, 0x110, 0x110f,
- 0x110, 0x1110, 0x110, 0x1111, 0x110, 0x1112, 0x110, 0x1161,
- 0x110, 0x1162, 0x110, 0x1163, 0x110, 0x1164, 0x110, 0x1165,
- 0x110, 0x1166, 0x110, 0x1167, 0x110, 0x1168, 0x110, 0x1169,
- 0x110, 0x116a, 0x110, 0x116b, 0x110, 0x116c, 0x110, 0x116d,
- 0x110, 0x116e, 0x110, 0x116f, 0x110, 0x1170, 0x110, 0x1171,
- 0x110, 0x1172, 0x110, 0x1173, 0x110, 0x1174, 0x110, 0x1175,
- 0x110, 0x1160, 0x110, 0x1114, 0x110, 0x1115, 0x110, 0x11c7,
- 0x110, 0x11c8, 0x110, 0x11cc, 0x110, 0x11ce, 0x110, 0x11d3,
- 0x110, 0x11d7, 0x110, 0x11d9, 0x110, 0x111c, 0x110, 0x11dd,
- 0x110, 0x11df, 0x110, 0x111d, 0x110, 0x111e, 0x110, 0x1120,
- 0x110, 0x1122, 0x110, 0x1123, 0x110, 0x1127, 0x110, 0x1129,
- 0x110, 0x112b, 0x110, 0x112c, 0x110, 0x112d, 0x110, 0x112e,
- 0x110, 0x112f, 0x110, 0x1132, 0x110, 0x1136, 0x110, 0x1140,
- 0x110, 0x1147, 0x110, 0x114c, 0x110, 0x11f1, 0x110, 0x11f2,
- 0x110, 0x1157, 0x110, 0x1158, 0x110, 0x1159, 0x110, 0x1184,
- 0x110, 0x1185, 0x110, 0x1188, 0x110, 0x1191, 0x110, 0x1192,
- 0x110, 0x1194, 0x110, 0x119e, 0x110, 0x11a1, 0x109, 0x4e00,
- 0x109, 0x4e8c, 0x109, 0x4e09, 0x109, 0x56db, 0x109, 0x4e0a,
- 0x109, 0x4e2d, 0x109, 0x4e0b, 0x109, 0x7532, 0x109, 0x4e59,
- 0x109, 0x4e19, 0x109, 0x4e01, 0x109, 0x5929, 0x109, 0x5730,
- 0x109, 0x4eba, 0x310, 0x28, 0x1100, 0x29, 0x310, 0x28,
- 0x1102, 0x29, 0x310, 0x28, 0x1103, 0x29, 0x310, 0x28,
- 0x1105, 0x29, 0x310, 0x28, 0x1106, 0x29, 0x310, 0x28,
- 0x1107, 0x29, 0x310, 0x28, 0x1109, 0x29, 0x310, 0x28,
- 0x110b, 0x29, 0x310, 0x28, 0x110c, 0x29, 0x310, 0x28,
- 0x110e, 0x29, 0x310, 0x28, 0x110f, 0x29, 0x310, 0x28,
- 0x1110, 0x29, 0x310, 0x28, 0x1111, 0x29, 0x310, 0x28,
- 0x1112, 0x29, 0x410, 0x28, 0x1100, 0x1161, 0x29, 0x410,
- 0x28, 0x1102, 0x1161, 0x29, 0x410, 0x28, 0x1103, 0x1161,
- 0x29, 0x410, 0x28, 0x1105, 0x1161, 0x29, 0x410, 0x28,
- 0x1106, 0x1161, 0x29, 0x410, 0x28, 0x1107, 0x1161, 0x29,
- 0x410, 0x28, 0x1109, 0x1161, 0x29, 0x410, 0x28, 0x110b,
- 0x1161, 0x29, 0x410, 0x28, 0x110c, 0x1161, 0x29, 0x410,
- 0x28, 0x110e, 0x1161, 0x29, 0x410, 0x28, 0x110f, 0x1161,
- 0x29, 0x410, 0x28, 0x1110, 0x1161, 0x29, 0x410, 0x28,
- 0x1111, 0x1161, 0x29, 0x410, 0x28, 0x1112, 0x1161, 0x29,
- 0x410, 0x28, 0x110c, 0x116e, 0x29, 0x710, 0x28, 0x110b,
- 0x1169, 0x110c, 0x1165, 0x11ab, 0x29, 0x610, 0x28, 0x110b,
- 0x1169, 0x1112, 0x116e, 0x29, 0x310, 0x28, 0x4e00, 0x29,
- 0x310, 0x28, 0x4e8c, 0x29, 0x310, 0x28, 0x4e09, 0x29,
- 0x310, 0x28, 0x56db, 0x29, 0x310, 0x28, 0x4e94, 0x29,
- 0x310, 0x28, 0x516d, 0x29, 0x310, 0x28, 0x4e03, 0x29,
- 0x310, 0x28, 0x516b, 0x29, 0x310, 0x28, 0x4e5d, 0x29,
- 0x310, 0x28, 0x5341, 0x29, 0x310, 0x28, 0x6708, 0x29,
- 0x310, 0x28, 0x706b, 0x29, 0x310, 0x28, 0x6c34, 0x29,
- 0x310, 0x28, 0x6728, 0x29, 0x310, 0x28, 0x91d1, 0x29,
- 0x310, 0x28, 0x571f, 0x29, 0x310, 0x28, 0x65e5, 0x29,
- 0x310, 0x28, 0x682a, 0x29, 0x310, 0x28, 0x6709, 0x29,
- 0x310, 0x28, 0x793e, 0x29, 0x310, 0x28, 0x540d, 0x29,
- 0x310, 0x28, 0x7279, 0x29, 0x310, 0x28, 0x8ca1, 0x29,
- 0x310, 0x28, 0x795d, 0x29, 0x310, 0x28, 0x52b4, 0x29,
- 0x310, 0x28, 0x4ee3, 0x29, 0x310, 0x28, 0x547c, 0x29,
- 0x310, 0x28, 0x5b66, 0x29, 0x310, 0x28, 0x76e3, 0x29,
- 0x310, 0x28, 0x4f01, 0x29, 0x310, 0x28, 0x8cc7, 0x29,
- 0x310, 0x28, 0x5354, 0x29, 0x310, 0x28, 0x796d, 0x29,
- 0x310, 0x28, 0x4f11, 0x29, 0x310, 0x28, 0x81ea, 0x29,
- 0x310, 0x28, 0x81f3, 0x29, 0x108, 0x554f, 0x108, 0x5e7c,
- 0x108, 0x6587, 0x108, 0x7b8f, 0x30f, 0x50, 0x54, 0x45,
- 0x208, 0x32, 0x31, 0x208, 0x32, 0x32, 0x208, 0x32,
- 0x33, 0x208, 0x32, 0x34, 0x208, 0x32, 0x35, 0x208,
- 0x32, 0x36, 0x208, 0x32, 0x37, 0x208, 0x32, 0x38,
- 0x208, 0x32, 0x39, 0x208, 0x33, 0x30, 0x208, 0x33,
- 0x31, 0x208, 0x33, 0x32, 0x208, 0x33, 0x33, 0x208,
- 0x33, 0x34, 0x208, 0x33, 0x35, 0x108, 0x1100, 0x108,
- 0x1102, 0x108, 0x1103, 0x108, 0x1105, 0x108, 0x1106, 0x108,
- 0x1107, 0x108, 0x1109, 0x108, 0x110b, 0x108, 0x110c, 0x108,
- 0x110e, 0x108, 0x110f, 0x108, 0x1110, 0x108, 0x1111, 0x108,
- 0x1112, 0x208, 0x1100, 0x1161, 0x208, 0x1102, 0x1161, 0x208,
- 0x1103, 0x1161, 0x208, 0x1105, 0x1161, 0x208, 0x1106, 0x1161,
- 0x208, 0x1107, 0x1161, 0x208, 0x1109, 0x1161, 0x208, 0x110b,
- 0x1161, 0x208, 0x110c, 0x1161, 0x208, 0x110e, 0x1161, 0x208,
- 0x110f, 0x1161, 0x208, 0x1110, 0x1161, 0x208, 0x1111, 0x1161,
- 0x208, 0x1112, 0x1161, 0x508, 0x110e, 0x1161, 0x11b7, 0x1100,
- 0x1169, 0x408, 0x110c, 0x116e, 0x110b, 0x1174, 0x208, 0x110b,
- 0x116e, 0x108, 0x4e00, 0x108, 0x4e8c, 0x108, 0x4e09, 0x108,
- 0x56db, 0x108, 0x4e94, 0x108, 0x516d, 0x108, 0x4e03, 0x108,
- 0x516b, 0x108, 0x4e5d, 0x108, 0x5341, 0x108, 0x6708, 0x108,
- 0x706b, 0x108, 0x6c34, 0x108, 0x6728, 0x108, 0x91d1, 0x108,
- 0x571f, 0x108, 0x65e5, 0x108, 0x682a, 0x108, 0x6709, 0x108,
- 0x793e, 0x108, 0x540d, 0x108, 0x7279, 0x108, 0x8ca1, 0x108,
- 0x795d, 0x108, 0x52b4, 0x108, 0x79d8, 0x108, 0x7537, 0x108,
- 0x5973, 0x108, 0x9069, 0x108, 0x512a, 0x108, 0x5370, 0x108,
- 0x6ce8, 0x108, 0x9805, 0x108, 0x4f11, 0x108, 0x5199, 0x108,
- 0x6b63, 0x108, 0x4e0a, 0x108, 0x4e2d, 0x108, 0x4e0b, 0x108,
- 0x5de6, 0x108, 0x53f3, 0x108, 0x533b, 0x108, 0x5b97, 0x108,
- 0x5b66, 0x108, 0x76e3, 0x108, 0x4f01, 0x108, 0x8cc7, 0x108,
- 0x5354, 0x108, 0x591c, 0x208, 0x33, 0x36, 0x208, 0x33,
- 0x37, 0x208, 0x33, 0x38, 0x208, 0x33, 0x39, 0x208,
- 0x34, 0x30, 0x208, 0x34, 0x31, 0x208, 0x34, 0x32,
- 0x208, 0x34, 0x33, 0x208, 0x34, 0x34, 0x208, 0x34,
- 0x35, 0x208, 0x34, 0x36, 0x208, 0x34, 0x37, 0x208,
- 0x34, 0x38, 0x208, 0x34, 0x39, 0x208, 0x35, 0x30,
- 0x210, 0x31, 0x6708, 0x210, 0x32, 0x6708, 0x210, 0x33,
- 0x6708, 0x210, 0x34, 0x6708, 0x210, 0x35, 0x6708, 0x210,
- 0x36, 0x6708, 0x210, 0x37, 0x6708, 0x210, 0x38, 0x6708,
- 0x210, 0x39, 0x6708, 0x310, 0x31, 0x30, 0x6708, 0x310,
- 0x31, 0x31, 0x6708, 0x310, 0x31, 0x32, 0x6708, 0x20f,
- 0x48, 0x67, 0x30f, 0x65, 0x72, 0x67, 0x20f, 0x65,
- 0x56, 0x30f, 0x4c, 0x54, 0x44, 0x108, 0x30a2, 0x108,
- 0x30a4, 0x108, 0x30a6, 0x108, 0x30a8, 0x108, 0x30aa, 0x108,
- 0x30ab, 0x108, 0x30ad, 0x108, 0x30af, 0x108, 0x30b1, 0x108,
- 0x30b3, 0x108, 0x30b5, 0x108, 0x30b7, 0x108, 0x30b9, 0x108,
- 0x30bb, 0x108, 0x30bd, 0x108, 0x30bf, 0x108, 0x30c1, 0x108,
- 0x30c4, 0x108, 0x30c6, 0x108, 0x30c8, 0x108, 0x30ca, 0x108,
- 0x30cb, 0x108, 0x30cc, 0x108, 0x30cd, 0x108, 0x30ce, 0x108,
- 0x30cf, 0x108, 0x30d2, 0x108, 0x30d5, 0x108, 0x30d8, 0x108,
- 0x30db, 0x108, 0x30de, 0x108, 0x30df, 0x108, 0x30e0, 0x108,
- 0x30e1, 0x108, 0x30e2, 0x108, 0x30e4, 0x108, 0x30e6, 0x108,
- 0x30e8, 0x108, 0x30e9, 0x108, 0x30ea, 0x108, 0x30eb, 0x108,
- 0x30ec, 0x108, 0x30ed, 0x108, 0x30ef, 0x108, 0x30f0, 0x108,
- 0x30f1, 0x108, 0x30f2, 0x40f, 0x30a2, 0x30d1, 0x30fc, 0x30c8,
- 0x40f, 0x30a2, 0x30eb, 0x30d5, 0x30a1, 0x40f, 0x30a2, 0x30f3,
- 0x30da, 0x30a2, 0x30f, 0x30a2, 0x30fc, 0x30eb, 0x40f, 0x30a4,
- 0x30cb, 0x30f3, 0x30b0, 0x30f, 0x30a4, 0x30f3, 0x30c1, 0x30f,
- 0x30a6, 0x30a9, 0x30f3, 0x50f, 0x30a8, 0x30b9, 0x30af, 0x30fc,
- 0x30c9, 0x40f, 0x30a8, 0x30fc, 0x30ab, 0x30fc, 0x30f, 0x30aa,
- 0x30f3, 0x30b9, 0x30f, 0x30aa, 0x30fc, 0x30e0, 0x30f, 0x30ab,
- 0x30a4, 0x30ea, 0x40f, 0x30ab, 0x30e9, 0x30c3, 0x30c8, 0x40f,
- 0x30ab, 0x30ed, 0x30ea, 0x30fc, 0x30f, 0x30ac, 0x30ed, 0x30f3,
- 0x30f, 0x30ac, 0x30f3, 0x30de, 0x20f, 0x30ae, 0x30ac, 0x30f,
- 0x30ae, 0x30cb, 0x30fc, 0x40f, 0x30ad, 0x30e5, 0x30ea, 0x30fc,
- 0x40f, 0x30ae, 0x30eb, 0x30c0, 0x30fc, 0x20f, 0x30ad, 0x30ed,
- 0x50f, 0x30ad, 0x30ed, 0x30b0, 0x30e9, 0x30e0, 0x60f, 0x30ad,
- 0x30ed, 0x30e1, 0x30fc, 0x30c8, 0x30eb, 0x50f, 0x30ad, 0x30ed,
- 0x30ef, 0x30c3, 0x30c8, 0x30f, 0x30b0, 0x30e9, 0x30e0, 0x50f,
- 0x30b0, 0x30e9, 0x30e0, 0x30c8, 0x30f3, 0x50f, 0x30af, 0x30eb,
- 0x30bc, 0x30a4, 0x30ed, 0x40f, 0x30af, 0x30ed, 0x30fc, 0x30cd,
- 0x30f, 0x30b1, 0x30fc, 0x30b9, 0x30f, 0x30b3, 0x30eb, 0x30ca,
- 0x30f, 0x30b3, 0x30fc, 0x30dd, 0x40f, 0x30b5, 0x30a4, 0x30af,
- 0x30eb, 0x50f, 0x30b5, 0x30f3, 0x30c1, 0x30fc, 0x30e0, 0x40f,
- 0x30b7, 0x30ea, 0x30f3, 0x30b0, 0x30f, 0x30bb, 0x30f3, 0x30c1,
- 0x30f, 0x30bb, 0x30f3, 0x30c8, 0x30f, 0x30c0, 0x30fc, 0x30b9,
- 0x20f, 0x30c7, 0x30b7, 0x20f, 0x30c9, 0x30eb, 0x20f, 0x30c8,
- 0x30f3, 0x20f, 0x30ca, 0x30ce, 0x30f, 0x30ce, 0x30c3, 0x30c8,
- 0x30f, 0x30cf, 0x30a4, 0x30c4, 0x50f, 0x30d1, 0x30fc, 0x30bb,
- 0x30f3, 0x30c8, 0x30f, 0x30d1, 0x30fc, 0x30c4, 0x40f, 0x30d0,
- 0x30fc, 0x30ec, 0x30eb, 0x50f, 0x30d4, 0x30a2, 0x30b9, 0x30c8,
- 0x30eb, 0x30f, 0x30d4, 0x30af, 0x30eb, 0x20f, 0x30d4, 0x30b3,
- 0x20f, 0x30d3, 0x30eb, 0x50f, 0x30d5, 0x30a1, 0x30e9, 0x30c3,
- 0x30c9, 0x40f, 0x30d5, 0x30a3, 0x30fc, 0x30c8, 0x50f, 0x30d6,
- 0x30c3, 0x30b7, 0x30a7, 0x30eb, 0x30f, 0x30d5, 0x30e9, 0x30f3,
- 0x50f, 0x30d8, 0x30af, 0x30bf, 0x30fc, 0x30eb, 0x20f, 0x30da,
- 0x30bd, 0x30f, 0x30da, 0x30cb, 0x30d2, 0x30f, 0x30d8, 0x30eb,
- 0x30c4, 0x30f, 0x30da, 0x30f3, 0x30b9, 0x30f, 0x30da, 0x30fc,
- 0x30b8, 0x30f, 0x30d9, 0x30fc, 0x30bf, 0x40f, 0x30dd, 0x30a4,
- 0x30f3, 0x30c8, 0x30f, 0x30dc, 0x30eb, 0x30c8, 0x20f, 0x30db,
- 0x30f3, 0x30f, 0x30dd, 0x30f3, 0x30c9, 0x30f, 0x30db, 0x30fc,
- 0x30eb, 0x30f, 0x30db, 0x30fc, 0x30f3, 0x40f, 0x30de, 0x30a4,
- 0x30af, 0x30ed, 0x30f, 0x30de, 0x30a4, 0x30eb, 0x30f, 0x30de,
- 0x30c3, 0x30cf, 0x30f, 0x30de, 0x30eb, 0x30af, 0x50f, 0x30de,
- 0x30f3, 0x30b7, 0x30e7, 0x30f3, 0x40f, 0x30df, 0x30af, 0x30ed,
- 0x30f3, 0x20f, 0x30df, 0x30ea, 0x50f, 0x30df, 0x30ea, 0x30d0,
- 0x30fc, 0x30eb, 0x20f, 0x30e1, 0x30ac, 0x40f, 0x30e1, 0x30ac,
- 0x30c8, 0x30f3, 0x40f, 0x30e1, 0x30fc, 0x30c8, 0x30eb, 0x30f,
- 0x30e4, 0x30fc, 0x30c9, 0x30f, 0x30e4, 0x30fc, 0x30eb, 0x30f,
- 0x30e6, 0x30a2, 0x30f3, 0x40f, 0x30ea, 0x30c3, 0x30c8, 0x30eb,
- 0x20f, 0x30ea, 0x30e9, 0x30f, 0x30eb, 0x30d4, 0x30fc, 0x40f,
- 0x30eb, 0x30fc, 0x30d6, 0x30eb, 0x20f, 0x30ec, 0x30e0, 0x50f,
- 0x30ec, 0x30f3, 0x30c8, 0x30b2, 0x30f3, 0x30f, 0x30ef, 0x30c3,
- 0x30c8, 0x210, 0x30, 0x70b9, 0x210, 0x31, 0x70b9, 0x210,
- 0x32, 0x70b9, 0x210, 0x33, 0x70b9, 0x210, 0x34, 0x70b9,
- 0x210, 0x35, 0x70b9, 0x210, 0x36, 0x70b9, 0x210, 0x37,
- 0x70b9, 0x210, 0x38, 0x70b9, 0x210, 0x39, 0x70b9, 0x310,
- 0x31, 0x30, 0x70b9, 0x310, 0x31, 0x31, 0x70b9, 0x310,
- 0x31, 0x32, 0x70b9, 0x310, 0x31, 0x33, 0x70b9, 0x310,
- 0x31, 0x34, 0x70b9, 0x310, 0x31, 0x35, 0x70b9, 0x310,
- 0x31, 0x36, 0x70b9, 0x310, 0x31, 0x37, 0x70b9, 0x310,
- 0x31, 0x38, 0x70b9, 0x310, 0x31, 0x39, 0x70b9, 0x310,
- 0x32, 0x30, 0x70b9, 0x310, 0x32, 0x31, 0x70b9, 0x310,
- 0x32, 0x32, 0x70b9, 0x310, 0x32, 0x33, 0x70b9, 0x310,
- 0x32, 0x34, 0x70b9, 0x30f, 0x68, 0x50, 0x61, 0x20f,
- 0x64, 0x61, 0x20f, 0x41, 0x55, 0x30f, 0x62, 0x61,
- 0x72, 0x20f, 0x6f, 0x56, 0x20f, 0x70, 0x63, 0x20f,
- 0x64, 0x6d, 0x30f, 0x64, 0x6d, 0xb2, 0x30f, 0x64,
- 0x6d, 0xb3, 0x20f, 0x49, 0x55, 0x20f, 0x5e73, 0x6210,
- 0x20f, 0x662d, 0x548c, 0x20f, 0x5927, 0x6b63, 0x20f, 0x660e,
- 0x6cbb, 0x40f, 0x682a, 0x5f0f, 0x4f1a, 0x793e, 0x20f, 0x70,
- 0x41, 0x20f, 0x6e, 0x41, 0x20f, 0x3bc, 0x41, 0x20f,
- 0x6d, 0x41, 0x20f, 0x6b, 0x41, 0x20f, 0x4b, 0x42,
- 0x20f, 0x4d, 0x42, 0x20f, 0x47, 0x42, 0x30f, 0x63,
- 0x61, 0x6c, 0x40f, 0x6b, 0x63, 0x61, 0x6c, 0x20f,
- 0x70, 0x46, 0x20f, 0x6e, 0x46, 0x20f, 0x3bc, 0x46,
- 0x20f, 0x3bc, 0x67, 0x20f, 0x6d, 0x67, 0x20f, 0x6b,
- 0x67, 0x20f, 0x48, 0x7a, 0x30f, 0x6b, 0x48, 0x7a,
- 0x30f, 0x4d, 0x48, 0x7a, 0x30f, 0x47, 0x48, 0x7a,
- 0x30f, 0x54, 0x48, 0x7a, 0x20f, 0x3bc, 0x2113, 0x20f,
- 0x6d, 0x2113, 0x20f, 0x64, 0x2113, 0x20f, 0x6b, 0x2113,
- 0x20f, 0x66, 0x6d, 0x20f, 0x6e, 0x6d, 0x20f, 0x3bc,
- 0x6d, 0x20f, 0x6d, 0x6d, 0x20f, 0x63, 0x6d, 0x20f,
- 0x6b, 0x6d, 0x30f, 0x6d, 0x6d, 0xb2, 0x30f, 0x63,
- 0x6d, 0xb2, 0x20f, 0x6d, 0xb2, 0x30f, 0x6b, 0x6d,
- 0xb2, 0x30f, 0x6d, 0x6d, 0xb3, 0x30f, 0x63, 0x6d,
- 0xb3, 0x20f, 0x6d, 0xb3, 0x30f, 0x6b, 0x6d, 0xb3,
- 0x30f, 0x6d, 0x2215, 0x73, 0x40f, 0x6d, 0x2215, 0x73,
- 0xb2, 0x20f, 0x50, 0x61, 0x30f, 0x6b, 0x50, 0x61,
- 0x30f, 0x4d, 0x50, 0x61, 0x30f, 0x47, 0x50, 0x61,
- 0x30f, 0x72, 0x61, 0x64, 0x50f, 0x72, 0x61, 0x64,
- 0x2215, 0x73, 0x60f, 0x72, 0x61, 0x64, 0x2215, 0x73,
- 0xb2, 0x20f, 0x70, 0x73, 0x20f, 0x6e, 0x73, 0x20f,
- 0x3bc, 0x73, 0x20f, 0x6d, 0x73, 0x20f, 0x70, 0x56,
- 0x20f, 0x6e, 0x56, 0x20f, 0x3bc, 0x56, 0x20f, 0x6d,
- 0x56, 0x20f, 0x6b, 0x56, 0x20f, 0x4d, 0x56, 0x20f,
- 0x70, 0x57, 0x20f, 0x6e, 0x57, 0x20f, 0x3bc, 0x57,
- 0x20f, 0x6d, 0x57, 0x20f, 0x6b, 0x57, 0x20f, 0x4d,
- 0x57, 0x20f, 0x6b, 0x3a9, 0x20f, 0x4d, 0x3a9, 0x40f,
- 0x61, 0x2e, 0x6d, 0x2e, 0x20f, 0x42, 0x71, 0x20f,
- 0x63, 0x63, 0x20f, 0x63, 0x64, 0x40f, 0x43, 0x2215,
- 0x6b, 0x67, 0x30f, 0x43, 0x6f, 0x2e, 0x20f, 0x64,
- 0x42, 0x20f, 0x47, 0x79, 0x20f, 0x68, 0x61, 0x20f,
- 0x48, 0x50, 0x20f, 0x69, 0x6e, 0x20f, 0x4b, 0x4b,
- 0x20f, 0x4b, 0x4d, 0x20f, 0x6b, 0x74, 0x20f, 0x6c,
- 0x6d, 0x20f, 0x6c, 0x6e, 0x30f, 0x6c, 0x6f, 0x67,
- 0x20f, 0x6c, 0x78, 0x20f, 0x6d, 0x62, 0x30f, 0x6d,
- 0x69, 0x6c, 0x30f, 0x6d, 0x6f, 0x6c, 0x20f, 0x50,
- 0x48, 0x40f, 0x70, 0x2e, 0x6d, 0x2e, 0x30f, 0x50,
- 0x50, 0x4d, 0x20f, 0x50, 0x52, 0x20f, 0x73, 0x72,
- 0x20f, 0x53, 0x76, 0x20f, 0x57, 0x62, 0x30f, 0x56,
- 0x2215, 0x6d, 0x30f, 0x41, 0x2215, 0x6d, 0x210, 0x31,
- 0x65e5, 0x210, 0x32, 0x65e5, 0x210, 0x33, 0x65e5, 0x210,
- 0x34, 0x65e5, 0x210, 0x35, 0x65e5, 0x210, 0x36, 0x65e5,
- 0x210, 0x37, 0x65e5, 0x210, 0x38, 0x65e5, 0x210, 0x39,
- 0x65e5, 0x310, 0x31, 0x30, 0x65e5, 0x310, 0x31, 0x31,
- 0x65e5, 0x310, 0x31, 0x32, 0x65e5, 0x310, 0x31, 0x33,
- 0x65e5, 0x310, 0x31, 0x34, 0x65e5, 0x310, 0x31, 0x35,
- 0x65e5, 0x310, 0x31, 0x36, 0x65e5, 0x310, 0x31, 0x37,
- 0x65e5, 0x310, 0x31, 0x38, 0x65e5, 0x310, 0x31, 0x39,
- 0x65e5, 0x310, 0x32, 0x30, 0x65e5, 0x310, 0x32, 0x31,
- 0x65e5, 0x310, 0x32, 0x32, 0x65e5, 0x310, 0x32, 0x33,
- 0x65e5, 0x310, 0x32, 0x34, 0x65e5, 0x310, 0x32, 0x35,
- 0x65e5, 0x310, 0x32, 0x36, 0x65e5, 0x310, 0x32, 0x37,
- 0x65e5, 0x310, 0x32, 0x38, 0x65e5, 0x310, 0x32, 0x39,
- 0x65e5, 0x310, 0x33, 0x30, 0x65e5, 0x310, 0x33, 0x31,
- 0x65e5, 0x30f, 0x67, 0x61, 0x6c, 0x109, 0x44a, 0x109,
- 0x44c, 0x109, 0xa76f, 0x109, 0x126, 0x109, 0x153, 0x109,
- 0xa727, 0x109, 0xab37, 0x109, 0x26b, 0x109, 0xab52, 0x101,
- 0x8c48, 0x101, 0x66f4, 0x101, 0x8eca, 0x101, 0x8cc8, 0x101,
- 0x6ed1, 0x101, 0x4e32, 0x101, 0x53e5, 0x101, 0x9f9c, 0x101,
- 0x9f9c, 0x101, 0x5951, 0x101, 0x91d1, 0x101, 0x5587, 0x101,
- 0x5948, 0x101, 0x61f6, 0x101, 0x7669, 0x101, 0x7f85, 0x101,
- 0x863f, 0x101, 0x87ba, 0x101, 0x88f8, 0x101, 0x908f, 0x101,
- 0x6a02, 0x101, 0x6d1b, 0x101, 0x70d9, 0x101, 0x73de, 0x101,
- 0x843d, 0x101, 0x916a, 0x101, 0x99f1, 0x101, 0x4e82, 0x101,
- 0x5375, 0x101, 0x6b04, 0x101, 0x721b, 0x101, 0x862d, 0x101,
- 0x9e1e, 0x101, 0x5d50, 0x101, 0x6feb, 0x101, 0x85cd, 0x101,
- 0x8964, 0x101, 0x62c9, 0x101, 0x81d8, 0x101, 0x881f, 0x101,
- 0x5eca, 0x101, 0x6717, 0x101, 0x6d6a, 0x101, 0x72fc, 0x101,
- 0x90ce, 0x101, 0x4f86, 0x101, 0x51b7, 0x101, 0x52de, 0x101,
- 0x64c4, 0x101, 0x6ad3, 0x101, 0x7210, 0x101, 0x76e7, 0x101,
- 0x8001, 0x101, 0x8606, 0x101, 0x865c, 0x101, 0x8def, 0x101,
- 0x9732, 0x101, 0x9b6f, 0x101, 0x9dfa, 0x101, 0x788c, 0x101,
- 0x797f, 0x101, 0x7da0, 0x101, 0x83c9, 0x101, 0x9304, 0x101,
- 0x9e7f, 0x101, 0x8ad6, 0x101, 0x58df, 0x101, 0x5f04, 0x101,
- 0x7c60, 0x101, 0x807e, 0x101, 0x7262, 0x101, 0x78ca, 0x101,
- 0x8cc2, 0x101, 0x96f7, 0x101, 0x58d8, 0x101, 0x5c62, 0x101,
- 0x6a13, 0x101, 0x6dda, 0x101, 0x6f0f, 0x101, 0x7d2f, 0x101,
- 0x7e37, 0x101, 0x964b, 0x101, 0x52d2, 0x101, 0x808b, 0x101,
- 0x51dc, 0x101, 0x51cc, 0x101, 0x7a1c, 0x101, 0x7dbe, 0x101,
- 0x83f1, 0x101, 0x9675, 0x101, 0x8b80, 0x101, 0x62cf, 0x101,
- 0x6a02, 0x101, 0x8afe, 0x101, 0x4e39, 0x101, 0x5be7, 0x101,
- 0x6012, 0x101, 0x7387, 0x101, 0x7570, 0x101, 0x5317, 0x101,
- 0x78fb, 0x101, 0x4fbf, 0x101, 0x5fa9, 0x101, 0x4e0d, 0x101,
- 0x6ccc, 0x101, 0x6578, 0x101, 0x7d22, 0x101, 0x53c3, 0x101,
- 0x585e, 0x101, 0x7701, 0x101, 0x8449, 0x101, 0x8aaa, 0x101,
- 0x6bba, 0x101, 0x8fb0, 0x101, 0x6c88, 0x101, 0x62fe, 0x101,
- 0x82e5, 0x101, 0x63a0, 0x101, 0x7565, 0x101, 0x4eae, 0x101,
- 0x5169, 0x101, 0x51c9, 0x101, 0x6881, 0x101, 0x7ce7, 0x101,
- 0x826f, 0x101, 0x8ad2, 0x101, 0x91cf, 0x101, 0x52f5, 0x101,
- 0x5442, 0x101, 0x5973, 0x101, 0x5eec, 0x101, 0x65c5, 0x101,
- 0x6ffe, 0x101, 0x792a, 0x101, 0x95ad, 0x101, 0x9a6a, 0x101,
- 0x9e97, 0x101, 0x9ece, 0x101, 0x529b, 0x101, 0x66c6, 0x101,
- 0x6b77, 0x101, 0x8f62, 0x101, 0x5e74, 0x101, 0x6190, 0x101,
- 0x6200, 0x101, 0x649a, 0x101, 0x6f23, 0x101, 0x7149, 0x101,
- 0x7489, 0x101, 0x79ca, 0x101, 0x7df4, 0x101, 0x806f, 0x101,
- 0x8f26, 0x101, 0x84ee, 0x101, 0x9023, 0x101, 0x934a, 0x101,
- 0x5217, 0x101, 0x52a3, 0x101, 0x54bd, 0x101, 0x70c8, 0x101,
- 0x88c2, 0x101, 0x8aaa, 0x101, 0x5ec9, 0x101, 0x5ff5, 0x101,
- 0x637b, 0x101, 0x6bae, 0x101, 0x7c3e, 0x101, 0x7375, 0x101,
- 0x4ee4, 0x101, 0x56f9, 0x101, 0x5be7, 0x101, 0x5dba, 0x101,
- 0x601c, 0x101, 0x73b2, 0x101, 0x7469, 0x101, 0x7f9a, 0x101,
- 0x8046, 0x101, 0x9234, 0x101, 0x96f6, 0x101, 0x9748, 0x101,
- 0x9818, 0x101, 0x4f8b, 0x101, 0x79ae, 0x101, 0x91b4, 0x101,
- 0x96b8, 0x101, 0x60e1, 0x101, 0x4e86, 0x101, 0x50da, 0x101,
- 0x5bee, 0x101, 0x5c3f, 0x101, 0x6599, 0x101, 0x6a02, 0x101,
- 0x71ce, 0x101, 0x7642, 0x101, 0x84fc, 0x101, 0x907c, 0x101,
- 0x9f8d, 0x101, 0x6688, 0x101, 0x962e, 0x101, 0x5289, 0x101,
- 0x677b, 0x101, 0x67f3, 0x101, 0x6d41, 0x101, 0x6e9c, 0x101,
- 0x7409, 0x101, 0x7559, 0x101, 0x786b, 0x101, 0x7d10, 0x101,
- 0x985e, 0x101, 0x516d, 0x101, 0x622e, 0x101, 0x9678, 0x101,
- 0x502b, 0x101, 0x5d19, 0x101, 0x6dea, 0x101, 0x8f2a, 0x101,
- 0x5f8b, 0x101, 0x6144, 0x101, 0x6817, 0x101, 0x7387, 0x101,
- 0x9686, 0x101, 0x5229, 0x101, 0x540f, 0x101, 0x5c65, 0x101,
- 0x6613, 0x101, 0x674e, 0x101, 0x68a8, 0x101, 0x6ce5, 0x101,
- 0x7406, 0x101, 0x75e2, 0x101, 0x7f79, 0x101, 0x88cf, 0x101,
- 0x88e1, 0x101, 0x91cc, 0x101, 0x96e2, 0x101, 0x533f, 0x101,
- 0x6eba, 0x101, 0x541d, 0x101, 0x71d0, 0x101, 0x7498, 0x101,
- 0x85fa, 0x101, 0x96a3, 0x101, 0x9c57, 0x101, 0x9e9f, 0x101,
- 0x6797, 0x101, 0x6dcb, 0x101, 0x81e8, 0x101, 0x7acb, 0x101,
- 0x7b20, 0x101, 0x7c92, 0x101, 0x72c0, 0x101, 0x7099, 0x101,
- 0x8b58, 0x101, 0x4ec0, 0x101, 0x8336, 0x101, 0x523a, 0x101,
- 0x5207, 0x101, 0x5ea6, 0x101, 0x62d3, 0x101, 0x7cd6, 0x101,
- 0x5b85, 0x101, 0x6d1e, 0x101, 0x66b4, 0x101, 0x8f3b, 0x101,
- 0x884c, 0x101, 0x964d, 0x101, 0x898b, 0x101, 0x5ed3, 0x101,
- 0x5140, 0x101, 0x55c0, 0x101, 0x585a, 0x101, 0x6674, 0x101,
- 0x51de, 0x101, 0x732a, 0x101, 0x76ca, 0x101, 0x793c, 0x101,
- 0x795e, 0x101, 0x7965, 0x101, 0x798f, 0x101, 0x9756, 0x101,
- 0x7cbe, 0x101, 0x7fbd, 0x101, 0x8612, 0x101, 0x8af8, 0x101,
- 0x9038, 0x101, 0x90fd, 0x101, 0x98ef, 0x101, 0x98fc, 0x101,
- 0x9928, 0x101, 0x9db4, 0x101, 0x90de, 0x101, 0x96b7, 0x101,
- 0x4fae, 0x101, 0x50e7, 0x101, 0x514d, 0x101, 0x52c9, 0x101,
- 0x52e4, 0x101, 0x5351, 0x101, 0x559d, 0x101, 0x5606, 0x101,
- 0x5668, 0x101, 0x5840, 0x101, 0x58a8, 0x101, 0x5c64, 0x101,
- 0x5c6e, 0x101, 0x6094, 0x101, 0x6168, 0x101, 0x618e, 0x101,
- 0x61f2, 0x101, 0x654f, 0x101, 0x65e2, 0x101, 0x6691, 0x101,
- 0x6885, 0x101, 0x6d77, 0x101, 0x6e1a, 0x101, 0x6f22, 0x101,
- 0x716e, 0x101, 0x722b, 0x101, 0x7422, 0x101, 0x7891, 0x101,
- 0x793e, 0x101, 0x7949, 0x101, 0x7948, 0x101, 0x7950, 0x101,
- 0x7956, 0x101, 0x795d, 0x101, 0x798d, 0x101, 0x798e, 0x101,
- 0x7a40, 0x101, 0x7a81, 0x101, 0x7bc0, 0x101, 0x7df4, 0x101,
- 0x7e09, 0x101, 0x7e41, 0x101, 0x7f72, 0x101, 0x8005, 0x101,
- 0x81ed, 0x101, 0x8279, 0x101, 0x8279, 0x101, 0x8457, 0x101,
- 0x8910, 0x101, 0x8996, 0x101, 0x8b01, 0x101, 0x8b39, 0x101,
- 0x8cd3, 0x101, 0x8d08, 0x101, 0x8fb6, 0x101, 0x9038, 0x101,
- 0x96e3, 0x101, 0x97ff, 0x101, 0x983b, 0x101, 0x6075, 0x201,
- 0xd850, 0xdeee, 0x101, 0x8218, 0x101, 0x4e26, 0x101, 0x51b5,
- 0x101, 0x5168, 0x101, 0x4f80, 0x101, 0x5145, 0x101, 0x5180,
- 0x101, 0x52c7, 0x101, 0x52fa, 0x101, 0x559d, 0x101, 0x5555,
- 0x101, 0x5599, 0x101, 0x55e2, 0x101, 0x585a, 0x101, 0x58b3,
- 0x101, 0x5944, 0x101, 0x5954, 0x101, 0x5a62, 0x101, 0x5b28,
- 0x101, 0x5ed2, 0x101, 0x5ed9, 0x101, 0x5f69, 0x101, 0x5fad,
- 0x101, 0x60d8, 0x101, 0x614e, 0x101, 0x6108, 0x101, 0x618e,
- 0x101, 0x6160, 0x101, 0x61f2, 0x101, 0x6234, 0x101, 0x63c4,
- 0x101, 0x641c, 0x101, 0x6452, 0x101, 0x6556, 0x101, 0x6674,
- 0x101, 0x6717, 0x101, 0x671b, 0x101, 0x6756, 0x101, 0x6b79,
- 0x101, 0x6bba, 0x101, 0x6d41, 0x101, 0x6edb, 0x101, 0x6ecb,
- 0x101, 0x6f22, 0x101, 0x701e, 0x101, 0x716e, 0x101, 0x77a7,
- 0x101, 0x7235, 0x101, 0x72af, 0x101, 0x732a, 0x101, 0x7471,
- 0x101, 0x7506, 0x101, 0x753b, 0x101, 0x761d, 0x101, 0x761f,
- 0x101, 0x76ca, 0x101, 0x76db, 0x101, 0x76f4, 0x101, 0x774a,
- 0x101, 0x7740, 0x101, 0x78cc, 0x101, 0x7ab1, 0x101, 0x7bc0,
- 0x101, 0x7c7b, 0x101, 0x7d5b, 0x101, 0x7df4, 0x101, 0x7f3e,
- 0x101, 0x8005, 0x101, 0x8352, 0x101, 0x83ef, 0x101, 0x8779,
- 0x101, 0x8941, 0x101, 0x8986, 0x101, 0x8996, 0x101, 0x8abf,
- 0x101, 0x8af8, 0x101, 0x8acb, 0x101, 0x8b01, 0x101, 0x8afe,
- 0x101, 0x8aed, 0x101, 0x8b39, 0x101, 0x8b8a, 0x101, 0x8d08,
- 0x101, 0x8f38, 0x101, 0x9072, 0x101, 0x9199, 0x101, 0x9276,
- 0x101, 0x967c, 0x101, 0x96e3, 0x101, 0x9756, 0x101, 0x97db,
- 0x101, 0x97ff, 0x101, 0x980b, 0x101, 0x983b, 0x101, 0x9b12,
- 0x101, 0x9f9c, 0x201, 0xd84a, 0xdc4a, 0x201, 0xd84a, 0xdc44,
- 0x201, 0xd84c, 0xdfd5, 0x101, 0x3b9d, 0x101, 0x4018, 0x101,
- 0x4039, 0x201, 0xd854, 0xde49, 0x201, 0xd857, 0xdcd0, 0x201,
- 0xd85f, 0xded3, 0x101, 0x9f43, 0x101, 0x9f8e, 0x210, 0x66,
- 0x66, 0x210, 0x66, 0x69, 0x210, 0x66, 0x6c, 0x310,
- 0x66, 0x66, 0x69, 0x310, 0x66, 0x66, 0x6c, 0x210,
- 0x17f, 0x74, 0x210, 0x73, 0x74, 0x210, 0x574, 0x576,
- 0x210, 0x574, 0x565, 0x210, 0x574, 0x56b, 0x210, 0x57e,
- 0x576, 0x210, 0x574, 0x56d, 0x201, 0x5d9, 0x5b4, 0x201,
- 0x5f2, 0x5b7, 0x102, 0x5e2, 0x102, 0x5d0, 0x102, 0x5d3,
- 0x102, 0x5d4, 0x102, 0x5db, 0x102, 0x5dc, 0x102, 0x5dd,
- 0x102, 0x5e8, 0x102, 0x5ea, 0x102, 0x2b, 0x201, 0x5e9,
- 0x5c1, 0x201, 0x5e9, 0x5c2, 0x201, 0xfb49, 0x5c1, 0x201,
- 0xfb49, 0x5c2, 0x201, 0x5d0, 0x5b7, 0x201, 0x5d0, 0x5b8,
- 0x201, 0x5d0, 0x5bc, 0x201, 0x5d1, 0x5bc, 0x201, 0x5d2,
- 0x5bc, 0x201, 0x5d3, 0x5bc, 0x201, 0x5d4, 0x5bc, 0x201,
- 0x5d5, 0x5bc, 0x201, 0x5d6, 0x5bc, 0x201, 0x5d8, 0x5bc,
- 0x201, 0x5d9, 0x5bc, 0x201, 0x5da, 0x5bc, 0x201, 0x5db,
- 0x5bc, 0x201, 0x5dc, 0x5bc, 0x201, 0x5de, 0x5bc, 0x201,
- 0x5e0, 0x5bc, 0x201, 0x5e1, 0x5bc, 0x201, 0x5e3, 0x5bc,
- 0x201, 0x5e4, 0x5bc, 0x201, 0x5e6, 0x5bc, 0x201, 0x5e7,
- 0x5bc, 0x201, 0x5e8, 0x5bc, 0x201, 0x5e9, 0x5bc, 0x201,
- 0x5ea, 0x5bc, 0x201, 0x5d5, 0x5b9, 0x201, 0x5d1, 0x5bf,
- 0x201, 0x5db, 0x5bf, 0x201, 0x5e4, 0x5bf, 0x210, 0x5d0,
- 0x5dc, 0x107, 0x671, 0x106, 0x671, 0x107, 0x67b, 0x106,
- 0x67b, 0x104, 0x67b, 0x105, 0x67b, 0x107, 0x67e, 0x106,
- 0x67e, 0x104, 0x67e, 0x105, 0x67e, 0x107, 0x680, 0x106,
- 0x680, 0x104, 0x680, 0x105, 0x680, 0x107, 0x67a, 0x106,
- 0x67a, 0x104, 0x67a, 0x105, 0x67a, 0x107, 0x67f, 0x106,
- 0x67f, 0x104, 0x67f, 0x105, 0x67f, 0x107, 0x679, 0x106,
- 0x679, 0x104, 0x679, 0x105, 0x679, 0x107, 0x6a4, 0x106,
- 0x6a4, 0x104, 0x6a4, 0x105, 0x6a4, 0x107, 0x6a6, 0x106,
- 0x6a6, 0x104, 0x6a6, 0x105, 0x6a6, 0x107, 0x684, 0x106,
- 0x684, 0x104, 0x684, 0x105, 0x684, 0x107, 0x683, 0x106,
- 0x683, 0x104, 0x683, 0x105, 0x683, 0x107, 0x686, 0x106,
- 0x686, 0x104, 0x686, 0x105, 0x686, 0x107, 0x687, 0x106,
- 0x687, 0x104, 0x687, 0x105, 0x687, 0x107, 0x68d, 0x106,
- 0x68d, 0x107, 0x68c, 0x106, 0x68c, 0x107, 0x68e, 0x106,
- 0x68e, 0x107, 0x688, 0x106, 0x688, 0x107, 0x698, 0x106,
- 0x698, 0x107, 0x691, 0x106, 0x691, 0x107, 0x6a9, 0x106,
- 0x6a9, 0x104, 0x6a9, 0x105, 0x6a9, 0x107, 0x6af, 0x106,
- 0x6af, 0x104, 0x6af, 0x105, 0x6af, 0x107, 0x6b3, 0x106,
- 0x6b3, 0x104, 0x6b3, 0x105, 0x6b3, 0x107, 0x6b1, 0x106,
- 0x6b1, 0x104, 0x6b1, 0x105, 0x6b1, 0x107, 0x6ba, 0x106,
- 0x6ba, 0x107, 0x6bb, 0x106, 0x6bb, 0x104, 0x6bb, 0x105,
- 0x6bb, 0x107, 0x6c0, 0x106, 0x6c0, 0x107, 0x6c1, 0x106,
- 0x6c1, 0x104, 0x6c1, 0x105, 0x6c1, 0x107, 0x6be, 0x106,
- 0x6be, 0x104, 0x6be, 0x105, 0x6be, 0x107, 0x6d2, 0x106,
- 0x6d2, 0x107, 0x6d3, 0x106, 0x6d3, 0x107, 0x6ad, 0x106,
- 0x6ad, 0x104, 0x6ad, 0x105, 0x6ad, 0x107, 0x6c7, 0x106,
- 0x6c7, 0x107, 0x6c6, 0x106, 0x6c6, 0x107, 0x6c8, 0x106,
- 0x6c8, 0x107, 0x677, 0x107, 0x6cb, 0x106, 0x6cb, 0x107,
- 0x6c5, 0x106, 0x6c5, 0x107, 0x6c9, 0x106, 0x6c9, 0x107,
- 0x6d0, 0x106, 0x6d0, 0x104, 0x6d0, 0x105, 0x6d0, 0x104,
- 0x649, 0x105, 0x649, 0x207, 0x626, 0x627, 0x206, 0x626,
- 0x627, 0x207, 0x626, 0x6d5, 0x206, 0x626, 0x6d5, 0x207,
- 0x626, 0x648, 0x206, 0x626, 0x648, 0x207, 0x626, 0x6c7,
- 0x206, 0x626, 0x6c7, 0x207, 0x626, 0x6c6, 0x206, 0x626,
- 0x6c6, 0x207, 0x626, 0x6c8, 0x206, 0x626, 0x6c8, 0x207,
- 0x626, 0x6d0, 0x206, 0x626, 0x6d0, 0x204, 0x626, 0x6d0,
- 0x207, 0x626, 0x649, 0x206, 0x626, 0x649, 0x204, 0x626,
- 0x649, 0x107, 0x6cc, 0x106, 0x6cc, 0x104, 0x6cc, 0x105,
- 0x6cc, 0x207, 0x626, 0x62c, 0x207, 0x626, 0x62d, 0x207,
- 0x626, 0x645, 0x207, 0x626, 0x649, 0x207, 0x626, 0x64a,
- 0x207, 0x628, 0x62c, 0x207, 0x628, 0x62d, 0x207, 0x628,
- 0x62e, 0x207, 0x628, 0x645, 0x207, 0x628, 0x649, 0x207,
- 0x628, 0x64a, 0x207, 0x62a, 0x62c, 0x207, 0x62a, 0x62d,
- 0x207, 0x62a, 0x62e, 0x207, 0x62a, 0x645, 0x207, 0x62a,
- 0x649, 0x207, 0x62a, 0x64a, 0x207, 0x62b, 0x62c, 0x207,
- 0x62b, 0x645, 0x207, 0x62b, 0x649, 0x207, 0x62b, 0x64a,
- 0x207, 0x62c, 0x62d, 0x207, 0x62c, 0x645, 0x207, 0x62d,
- 0x62c, 0x207, 0x62d, 0x645, 0x207, 0x62e, 0x62c, 0x207,
- 0x62e, 0x62d, 0x207, 0x62e, 0x645, 0x207, 0x633, 0x62c,
- 0x207, 0x633, 0x62d, 0x207, 0x633, 0x62e, 0x207, 0x633,
- 0x645, 0x207, 0x635, 0x62d, 0x207, 0x635, 0x645, 0x207,
- 0x636, 0x62c, 0x207, 0x636, 0x62d, 0x207, 0x636, 0x62e,
- 0x207, 0x636, 0x645, 0x207, 0x637, 0x62d, 0x207, 0x637,
- 0x645, 0x207, 0x638, 0x645, 0x207, 0x639, 0x62c, 0x207,
- 0x639, 0x645, 0x207, 0x63a, 0x62c, 0x207, 0x63a, 0x645,
- 0x207, 0x641, 0x62c, 0x207, 0x641, 0x62d, 0x207, 0x641,
- 0x62e, 0x207, 0x641, 0x645, 0x207, 0x641, 0x649, 0x207,
- 0x641, 0x64a, 0x207, 0x642, 0x62d, 0x207, 0x642, 0x645,
- 0x207, 0x642, 0x649, 0x207, 0x642, 0x64a, 0x207, 0x643,
- 0x627, 0x207, 0x643, 0x62c, 0x207, 0x643, 0x62d, 0x207,
- 0x643, 0x62e, 0x207, 0x643, 0x644, 0x207, 0x643, 0x645,
- 0x207, 0x643, 0x649, 0x207, 0x643, 0x64a, 0x207, 0x644,
- 0x62c, 0x207, 0x644, 0x62d, 0x207, 0x644, 0x62e, 0x207,
- 0x644, 0x645, 0x207, 0x644, 0x649, 0x207, 0x644, 0x64a,
- 0x207, 0x645, 0x62c, 0x207, 0x645, 0x62d, 0x207, 0x645,
- 0x62e, 0x207, 0x645, 0x645, 0x207, 0x645, 0x649, 0x207,
- 0x645, 0x64a, 0x207, 0x646, 0x62c, 0x207, 0x646, 0x62d,
- 0x207, 0x646, 0x62e, 0x207, 0x646, 0x645, 0x207, 0x646,
- 0x649, 0x207, 0x646, 0x64a, 0x207, 0x647, 0x62c, 0x207,
- 0x647, 0x645, 0x207, 0x647, 0x649, 0x207, 0x647, 0x64a,
- 0x207, 0x64a, 0x62c, 0x207, 0x64a, 0x62d, 0x207, 0x64a,
- 0x62e, 0x207, 0x64a, 0x645, 0x207, 0x64a, 0x649, 0x207,
- 0x64a, 0x64a, 0x207, 0x630, 0x670, 0x207, 0x631, 0x670,
- 0x207, 0x649, 0x670, 0x307, 0x20, 0x64c, 0x651, 0x307,
- 0x20, 0x64d, 0x651, 0x307, 0x20, 0x64e, 0x651, 0x307,
- 0x20, 0x64f, 0x651, 0x307, 0x20, 0x650, 0x651, 0x307,
- 0x20, 0x651, 0x670, 0x206, 0x626, 0x631, 0x206, 0x626,
- 0x632, 0x206, 0x626, 0x645, 0x206, 0x626, 0x646, 0x206,
- 0x626, 0x649, 0x206, 0x626, 0x64a, 0x206, 0x628, 0x631,
- 0x206, 0x628, 0x632, 0x206, 0x628, 0x645, 0x206, 0x628,
- 0x646, 0x206, 0x628, 0x649, 0x206, 0x628, 0x64a, 0x206,
- 0x62a, 0x631, 0x206, 0x62a, 0x632, 0x206, 0x62a, 0x645,
- 0x206, 0x62a, 0x646, 0x206, 0x62a, 0x649, 0x206, 0x62a,
- 0x64a, 0x206, 0x62b, 0x631, 0x206, 0x62b, 0x632, 0x206,
- 0x62b, 0x645, 0x206, 0x62b, 0x646, 0x206, 0x62b, 0x649,
- 0x206, 0x62b, 0x64a, 0x206, 0x641, 0x649, 0x206, 0x641,
- 0x64a, 0x206, 0x642, 0x649, 0x206, 0x642, 0x64a, 0x206,
- 0x643, 0x627, 0x206, 0x643, 0x644, 0x206, 0x643, 0x645,
- 0x206, 0x643, 0x649, 0x206, 0x643, 0x64a, 0x206, 0x644,
- 0x645, 0x206, 0x644, 0x649, 0x206, 0x644, 0x64a, 0x206,
- 0x645, 0x627, 0x206, 0x645, 0x645, 0x206, 0x646, 0x631,
- 0x206, 0x646, 0x632, 0x206, 0x646, 0x645, 0x206, 0x646,
- 0x646, 0x206, 0x646, 0x649, 0x206, 0x646, 0x64a, 0x206,
- 0x649, 0x670, 0x206, 0x64a, 0x631, 0x206, 0x64a, 0x632,
- 0x206, 0x64a, 0x645, 0x206, 0x64a, 0x646, 0x206, 0x64a,
- 0x649, 0x206, 0x64a, 0x64a, 0x204, 0x626, 0x62c, 0x204,
- 0x626, 0x62d, 0x204, 0x626, 0x62e, 0x204, 0x626, 0x645,
- 0x204, 0x626, 0x647, 0x204, 0x628, 0x62c, 0x204, 0x628,
- 0x62d, 0x204, 0x628, 0x62e, 0x204, 0x628, 0x645, 0x204,
- 0x628, 0x647, 0x204, 0x62a, 0x62c, 0x204, 0x62a, 0x62d,
- 0x204, 0x62a, 0x62e, 0x204, 0x62a, 0x645, 0x204, 0x62a,
- 0x647, 0x204, 0x62b, 0x645, 0x204, 0x62c, 0x62d, 0x204,
- 0x62c, 0x645, 0x204, 0x62d, 0x62c, 0x204, 0x62d, 0x645,
- 0x204, 0x62e, 0x62c, 0x204, 0x62e, 0x645, 0x204, 0x633,
- 0x62c, 0x204, 0x633, 0x62d, 0x204, 0x633, 0x62e, 0x204,
- 0x633, 0x645, 0x204, 0x635, 0x62d, 0x204, 0x635, 0x62e,
- 0x204, 0x635, 0x645, 0x204, 0x636, 0x62c, 0x204, 0x636,
- 0x62d, 0x204, 0x636, 0x62e, 0x204, 0x636, 0x645, 0x204,
- 0x637, 0x62d, 0x204, 0x638, 0x645, 0x204, 0x639, 0x62c,
- 0x204, 0x639, 0x645, 0x204, 0x63a, 0x62c, 0x204, 0x63a,
- 0x645, 0x204, 0x641, 0x62c, 0x204, 0x641, 0x62d, 0x204,
- 0x641, 0x62e, 0x204, 0x641, 0x645, 0x204, 0x642, 0x62d,
- 0x204, 0x642, 0x645, 0x204, 0x643, 0x62c, 0x204, 0x643,
- 0x62d, 0x204, 0x643, 0x62e, 0x204, 0x643, 0x644, 0x204,
- 0x643, 0x645, 0x204, 0x644, 0x62c, 0x204, 0x644, 0x62d,
- 0x204, 0x644, 0x62e, 0x204, 0x644, 0x645, 0x204, 0x644,
- 0x647, 0x204, 0x645, 0x62c, 0x204, 0x645, 0x62d, 0x204,
- 0x645, 0x62e, 0x204, 0x645, 0x645, 0x204, 0x646, 0x62c,
- 0x204, 0x646, 0x62d, 0x204, 0x646, 0x62e, 0x204, 0x646,
- 0x645, 0x204, 0x646, 0x647, 0x204, 0x647, 0x62c, 0x204,
- 0x647, 0x645, 0x204, 0x647, 0x670, 0x204, 0x64a, 0x62c,
- 0x204, 0x64a, 0x62d, 0x204, 0x64a, 0x62e, 0x204, 0x64a,
- 0x645, 0x204, 0x64a, 0x647, 0x205, 0x626, 0x645, 0x205,
- 0x626, 0x647, 0x205, 0x628, 0x645, 0x205, 0x628, 0x647,
- 0x205, 0x62a, 0x645, 0x205, 0x62a, 0x647, 0x205, 0x62b,
- 0x645, 0x205, 0x62b, 0x647, 0x205, 0x633, 0x645, 0x205,
- 0x633, 0x647, 0x205, 0x634, 0x645, 0x205, 0x634, 0x647,
- 0x205, 0x643, 0x644, 0x205, 0x643, 0x645, 0x205, 0x644,
- 0x645, 0x205, 0x646, 0x645, 0x205, 0x646, 0x647, 0x205,
- 0x64a, 0x645, 0x205, 0x64a, 0x647, 0x305, 0x640, 0x64e,
- 0x651, 0x305, 0x640, 0x64f, 0x651, 0x305, 0x640, 0x650,
- 0x651, 0x207, 0x637, 0x649, 0x207, 0x637, 0x64a, 0x207,
- 0x639, 0x649, 0x207, 0x639, 0x64a, 0x207, 0x63a, 0x649,
- 0x207, 0x63a, 0x64a, 0x207, 0x633, 0x649, 0x207, 0x633,
- 0x64a, 0x207, 0x634, 0x649, 0x207, 0x634, 0x64a, 0x207,
- 0x62d, 0x649, 0x207, 0x62d, 0x64a, 0x207, 0x62c, 0x649,
- 0x207, 0x62c, 0x64a, 0x207, 0x62e, 0x649, 0x207, 0x62e,
- 0x64a, 0x207, 0x635, 0x649, 0x207, 0x635, 0x64a, 0x207,
- 0x636, 0x649, 0x207, 0x636, 0x64a, 0x207, 0x634, 0x62c,
- 0x207, 0x634, 0x62d, 0x207, 0x634, 0x62e, 0x207, 0x634,
- 0x645, 0x207, 0x634, 0x631, 0x207, 0x633, 0x631, 0x207,
- 0x635, 0x631, 0x207, 0x636, 0x631, 0x206, 0x637, 0x649,
- 0x206, 0x637, 0x64a, 0x206, 0x639, 0x649, 0x206, 0x639,
- 0x64a, 0x206, 0x63a, 0x649, 0x206, 0x63a, 0x64a, 0x206,
- 0x633, 0x649, 0x206, 0x633, 0x64a, 0x206, 0x634, 0x649,
- 0x206, 0x634, 0x64a, 0x206, 0x62d, 0x649, 0x206, 0x62d,
- 0x64a, 0x206, 0x62c, 0x649, 0x206, 0x62c, 0x64a, 0x206,
- 0x62e, 0x649, 0x206, 0x62e, 0x64a, 0x206, 0x635, 0x649,
- 0x206, 0x635, 0x64a, 0x206, 0x636, 0x649, 0x206, 0x636,
- 0x64a, 0x206, 0x634, 0x62c, 0x206, 0x634, 0x62d, 0x206,
- 0x634, 0x62e, 0x206, 0x634, 0x645, 0x206, 0x634, 0x631,
- 0x206, 0x633, 0x631, 0x206, 0x635, 0x631, 0x206, 0x636,
- 0x631, 0x204, 0x634, 0x62c, 0x204, 0x634, 0x62d, 0x204,
- 0x634, 0x62e, 0x204, 0x634, 0x645, 0x204, 0x633, 0x647,
- 0x204, 0x634, 0x647, 0x204, 0x637, 0x645, 0x205, 0x633,
- 0x62c, 0x205, 0x633, 0x62d, 0x205, 0x633, 0x62e, 0x205,
- 0x634, 0x62c, 0x205, 0x634, 0x62d, 0x205, 0x634, 0x62e,
- 0x205, 0x637, 0x645, 0x205, 0x638, 0x645, 0x206, 0x627,
- 0x64b, 0x207, 0x627, 0x64b, 0x304, 0x62a, 0x62c, 0x645,
- 0x306, 0x62a, 0x62d, 0x62c, 0x304, 0x62a, 0x62d, 0x62c,
- 0x304, 0x62a, 0x62d, 0x645, 0x304, 0x62a, 0x62e, 0x645,
- 0x304, 0x62a, 0x645, 0x62c, 0x304, 0x62a, 0x645, 0x62d,
- 0x304, 0x62a, 0x645, 0x62e, 0x306, 0x62c, 0x645, 0x62d,
- 0x304, 0x62c, 0x645, 0x62d, 0x306, 0x62d, 0x645, 0x64a,
- 0x306, 0x62d, 0x645, 0x649, 0x304, 0x633, 0x62d, 0x62c,
- 0x304, 0x633, 0x62c, 0x62d, 0x306, 0x633, 0x62c, 0x649,
- 0x306, 0x633, 0x645, 0x62d, 0x304, 0x633, 0x645, 0x62d,
- 0x304, 0x633, 0x645, 0x62c, 0x306, 0x633, 0x645, 0x645,
- 0x304, 0x633, 0x645, 0x645, 0x306, 0x635, 0x62d, 0x62d,
- 0x304, 0x635, 0x62d, 0x62d, 0x306, 0x635, 0x645, 0x645,
- 0x306, 0x634, 0x62d, 0x645, 0x304, 0x634, 0x62d, 0x645,
- 0x306, 0x634, 0x62c, 0x64a, 0x306, 0x634, 0x645, 0x62e,
- 0x304, 0x634, 0x645, 0x62e, 0x306, 0x634, 0x645, 0x645,
- 0x304, 0x634, 0x645, 0x645, 0x306, 0x636, 0x62d, 0x649,
- 0x306, 0x636, 0x62e, 0x645, 0x304, 0x636, 0x62e, 0x645,
- 0x306, 0x637, 0x645, 0x62d, 0x304, 0x637, 0x645, 0x62d,
- 0x304, 0x637, 0x645, 0x645, 0x306, 0x637, 0x645, 0x64a,
- 0x306, 0x639, 0x62c, 0x645, 0x306, 0x639, 0x645, 0x645,
- 0x304, 0x639, 0x645, 0x645, 0x306, 0x639, 0x645, 0x649,
- 0x306, 0x63a, 0x645, 0x645, 0x306, 0x63a, 0x645, 0x64a,
- 0x306, 0x63a, 0x645, 0x649, 0x306, 0x641, 0x62e, 0x645,
- 0x304, 0x641, 0x62e, 0x645, 0x306, 0x642, 0x645, 0x62d,
- 0x306, 0x642, 0x645, 0x645, 0x306, 0x644, 0x62d, 0x645,
- 0x306, 0x644, 0x62d, 0x64a, 0x306, 0x644, 0x62d, 0x649,
- 0x304, 0x644, 0x62c, 0x62c, 0x306, 0x644, 0x62c, 0x62c,
- 0x306, 0x644, 0x62e, 0x645, 0x304, 0x644, 0x62e, 0x645,
- 0x306, 0x644, 0x645, 0x62d, 0x304, 0x644, 0x645, 0x62d,
- 0x304, 0x645, 0x62d, 0x62c, 0x304, 0x645, 0x62d, 0x645,
- 0x306, 0x645, 0x62d, 0x64a, 0x304, 0x645, 0x62c, 0x62d,
- 0x304, 0x645, 0x62c, 0x645, 0x304, 0x645, 0x62e, 0x62c,
- 0x304, 0x645, 0x62e, 0x645, 0x304, 0x645, 0x62c, 0x62e,
- 0x304, 0x647, 0x645, 0x62c, 0x304, 0x647, 0x645, 0x645,
- 0x304, 0x646, 0x62d, 0x645, 0x306, 0x646, 0x62d, 0x649,
- 0x306, 0x646, 0x62c, 0x645, 0x304, 0x646, 0x62c, 0x645,
- 0x306, 0x646, 0x62c, 0x649, 0x306, 0x646, 0x645, 0x64a,
- 0x306, 0x646, 0x645, 0x649, 0x306, 0x64a, 0x645, 0x645,
- 0x304, 0x64a, 0x645, 0x645, 0x306, 0x628, 0x62e, 0x64a,
- 0x306, 0x62a, 0x62c, 0x64a, 0x306, 0x62a, 0x62c, 0x649,
- 0x306, 0x62a, 0x62e, 0x64a, 0x306, 0x62a, 0x62e, 0x649,
- 0x306, 0x62a, 0x645, 0x64a, 0x306, 0x62a, 0x645, 0x649,
- 0x306, 0x62c, 0x645, 0x64a, 0x306, 0x62c, 0x62d, 0x649,
- 0x306, 0x62c, 0x645, 0x649, 0x306, 0x633, 0x62e, 0x649,
- 0x306, 0x635, 0x62d, 0x64a, 0x306, 0x634, 0x62d, 0x64a,
- 0x306, 0x636, 0x62d, 0x64a, 0x306, 0x644, 0x62c, 0x64a,
- 0x306, 0x644, 0x645, 0x64a, 0x306, 0x64a, 0x62d, 0x64a,
- 0x306, 0x64a, 0x62c, 0x64a, 0x306, 0x64a, 0x645, 0x64a,
- 0x306, 0x645, 0x645, 0x64a, 0x306, 0x642, 0x645, 0x64a,
- 0x306, 0x646, 0x62d, 0x64a, 0x304, 0x642, 0x645, 0x62d,
- 0x304, 0x644, 0x62d, 0x645, 0x306, 0x639, 0x645, 0x64a,
- 0x306, 0x643, 0x645, 0x64a, 0x304, 0x646, 0x62c, 0x62d,
- 0x306, 0x645, 0x62e, 0x64a, 0x304, 0x644, 0x62c, 0x645,
- 0x306, 0x643, 0x645, 0x645, 0x306, 0x644, 0x62c, 0x645,
- 0x306, 0x646, 0x62c, 0x62d, 0x306, 0x62c, 0x62d, 0x64a,
- 0x306, 0x62d, 0x62c, 0x64a, 0x306, 0x645, 0x62c, 0x64a,
- 0x306, 0x641, 0x645, 0x64a, 0x306, 0x628, 0x62d, 0x64a,
- 0x304, 0x643, 0x645, 0x645, 0x304, 0x639, 0x62c, 0x645,
- 0x304, 0x635, 0x645, 0x645, 0x306, 0x633, 0x62e, 0x64a,
- 0x306, 0x646, 0x62c, 0x64a, 0x307, 0x635, 0x644, 0x6d2,
- 0x307, 0x642, 0x644, 0x6d2, 0x407, 0x627, 0x644, 0x644,
- 0x647, 0x407, 0x627, 0x643, 0x628, 0x631, 0x407, 0x645,
- 0x62d, 0x645, 0x62f, 0x407, 0x635, 0x644, 0x639, 0x645,
- 0x407, 0x631, 0x633, 0x648, 0x644, 0x407, 0x639, 0x644,
- 0x64a, 0x647, 0x407, 0x648, 0x633, 0x644, 0x645, 0x307,
- 0x635, 0x644, 0x649, 0x1207, 0x635, 0x644, 0x649, 0x20,
- 0x627, 0x644, 0x644, 0x647, 0x20, 0x639, 0x644, 0x64a,
- 0x647, 0x20, 0x648, 0x633, 0x644, 0x645, 0x807, 0x62c,
- 0x644, 0x20, 0x62c, 0x644, 0x627, 0x644, 0x647, 0x407,
- 0x631, 0x6cc, 0x627, 0x644, 0x10b, 0x2c, 0x10b, 0x3001,
- 0x10b, 0x3002, 0x10b, 0x3a, 0x10b, 0x3b, 0x10b, 0x21,
- 0x10b, 0x3f, 0x10b, 0x3016, 0x10b, 0x3017, 0x10b, 0x2026,
- 0x10b, 0x2025, 0x10b, 0x2014, 0x10b, 0x2013, 0x10b, 0x5f,
- 0x10b, 0x5f, 0x10b, 0x28, 0x10b, 0x29, 0x10b, 0x7b,
- 0x10b, 0x7d, 0x10b, 0x3014, 0x10b, 0x3015, 0x10b, 0x3010,
- 0x10b, 0x3011, 0x10b, 0x300a, 0x10b, 0x300b, 0x10b, 0x3008,
- 0x10b, 0x3009, 0x10b, 0x300c, 0x10b, 0x300d, 0x10b, 0x300e,
- 0x10b, 0x300f, 0x10b, 0x5b, 0x10b, 0x5d, 0x110, 0x203e,
- 0x110, 0x203e, 0x110, 0x203e, 0x110, 0x203e, 0x110, 0x5f,
- 0x110, 0x5f, 0x110, 0x5f, 0x10e, 0x2c, 0x10e, 0x3001,
- 0x10e, 0x2e, 0x10e, 0x3b, 0x10e, 0x3a, 0x10e, 0x3f,
- 0x10e, 0x21, 0x10e, 0x2014, 0x10e, 0x28, 0x10e, 0x29,
- 0x10e, 0x7b, 0x10e, 0x7d, 0x10e, 0x3014, 0x10e, 0x3015,
- 0x10e, 0x23, 0x10e, 0x26, 0x10e, 0x2a, 0x10e, 0x2b,
- 0x10e, 0x2d, 0x10e, 0x3c, 0x10e, 0x3e, 0x10e, 0x3d,
- 0x10e, 0x5c, 0x10e, 0x24, 0x10e, 0x25, 0x10e, 0x40,
- 0x207, 0x20, 0x64b, 0x205, 0x640, 0x64b, 0x207, 0x20,
- 0x64c, 0x207, 0x20, 0x64d, 0x207, 0x20, 0x64e, 0x205,
- 0x640, 0x64e, 0x207, 0x20, 0x64f, 0x205, 0x640, 0x64f,
- 0x207, 0x20, 0x650, 0x205, 0x640, 0x650, 0x207, 0x20,
- 0x651, 0x205, 0x640, 0x651, 0x207, 0x20, 0x652, 0x205,
- 0x640, 0x652, 0x107, 0x621, 0x107, 0x622, 0x106, 0x622,
- 0x107, 0x623, 0x106, 0x623, 0x107, 0x624, 0x106, 0x624,
- 0x107, 0x625, 0x106, 0x625, 0x107, 0x626, 0x106, 0x626,
- 0x104, 0x626, 0x105, 0x626, 0x107, 0x627, 0x106, 0x627,
- 0x107, 0x628, 0x106, 0x628, 0x104, 0x628, 0x105, 0x628,
- 0x107, 0x629, 0x106, 0x629, 0x107, 0x62a, 0x106, 0x62a,
- 0x104, 0x62a, 0x105, 0x62a, 0x107, 0x62b, 0x106, 0x62b,
- 0x104, 0x62b, 0x105, 0x62b, 0x107, 0x62c, 0x106, 0x62c,
- 0x104, 0x62c, 0x105, 0x62c, 0x107, 0x62d, 0x106, 0x62d,
- 0x104, 0x62d, 0x105, 0x62d, 0x107, 0x62e, 0x106, 0x62e,
- 0x104, 0x62e, 0x105, 0x62e, 0x107, 0x62f, 0x106, 0x62f,
- 0x107, 0x630, 0x106, 0x630, 0x107, 0x631, 0x106, 0x631,
- 0x107, 0x632, 0x106, 0x632, 0x107, 0x633, 0x106, 0x633,
- 0x104, 0x633, 0x105, 0x633, 0x107, 0x634, 0x106, 0x634,
- 0x104, 0x634, 0x105, 0x634, 0x107, 0x635, 0x106, 0x635,
- 0x104, 0x635, 0x105, 0x635, 0x107, 0x636, 0x106, 0x636,
- 0x104, 0x636, 0x105, 0x636, 0x107, 0x637, 0x106, 0x637,
- 0x104, 0x637, 0x105, 0x637, 0x107, 0x638, 0x106, 0x638,
- 0x104, 0x638, 0x105, 0x638, 0x107, 0x639, 0x106, 0x639,
- 0x104, 0x639, 0x105, 0x639, 0x107, 0x63a, 0x106, 0x63a,
- 0x104, 0x63a, 0x105, 0x63a, 0x107, 0x641, 0x106, 0x641,
- 0x104, 0x641, 0x105, 0x641, 0x107, 0x642, 0x106, 0x642,
- 0x104, 0x642, 0x105, 0x642, 0x107, 0x643, 0x106, 0x643,
- 0x104, 0x643, 0x105, 0x643, 0x107, 0x644, 0x106, 0x644,
- 0x104, 0x644, 0x105, 0x644, 0x107, 0x645, 0x106, 0x645,
- 0x104, 0x645, 0x105, 0x645, 0x107, 0x646, 0x106, 0x646,
- 0x104, 0x646, 0x105, 0x646, 0x107, 0x647, 0x106, 0x647,
- 0x104, 0x647, 0x105, 0x647, 0x107, 0x648, 0x106, 0x648,
- 0x107, 0x649, 0x106, 0x649, 0x107, 0x64a, 0x106, 0x64a,
- 0x104, 0x64a, 0x105, 0x64a, 0x207, 0x644, 0x622, 0x206,
- 0x644, 0x622, 0x207, 0x644, 0x623, 0x206, 0x644, 0x623,
- 0x207, 0x644, 0x625, 0x206, 0x644, 0x625, 0x207, 0x644,
- 0x627, 0x206, 0x644, 0x627, 0x10c, 0x21, 0x10c, 0x22,
- 0x10c, 0x23, 0x10c, 0x24, 0x10c, 0x25, 0x10c, 0x26,
- 0x10c, 0x27, 0x10c, 0x28, 0x10c, 0x29, 0x10c, 0x2a,
- 0x10c, 0x2b, 0x10c, 0x2c, 0x10c, 0x2d, 0x10c, 0x2e,
- 0x10c, 0x2f, 0x10c, 0x30, 0x10c, 0x31, 0x10c, 0x32,
- 0x10c, 0x33, 0x10c, 0x34, 0x10c, 0x35, 0x10c, 0x36,
- 0x10c, 0x37, 0x10c, 0x38, 0x10c, 0x39, 0x10c, 0x3a,
- 0x10c, 0x3b, 0x10c, 0x3c, 0x10c, 0x3d, 0x10c, 0x3e,
- 0x10c, 0x3f, 0x10c, 0x40, 0x10c, 0x41, 0x10c, 0x42,
- 0x10c, 0x43, 0x10c, 0x44, 0x10c, 0x45, 0x10c, 0x46,
- 0x10c, 0x47, 0x10c, 0x48, 0x10c, 0x49, 0x10c, 0x4a,
- 0x10c, 0x4b, 0x10c, 0x4c, 0x10c, 0x4d, 0x10c, 0x4e,
- 0x10c, 0x4f, 0x10c, 0x50, 0x10c, 0x51, 0x10c, 0x52,
- 0x10c, 0x53, 0x10c, 0x54, 0x10c, 0x55, 0x10c, 0x56,
- 0x10c, 0x57, 0x10c, 0x58, 0x10c, 0x59, 0x10c, 0x5a,
- 0x10c, 0x5b, 0x10c, 0x5c, 0x10c, 0x5d, 0x10c, 0x5e,
- 0x10c, 0x5f, 0x10c, 0x60, 0x10c, 0x61, 0x10c, 0x62,
- 0x10c, 0x63, 0x10c, 0x64, 0x10c, 0x65, 0x10c, 0x66,
- 0x10c, 0x67, 0x10c, 0x68, 0x10c, 0x69, 0x10c, 0x6a,
- 0x10c, 0x6b, 0x10c, 0x6c, 0x10c, 0x6d, 0x10c, 0x6e,
- 0x10c, 0x6f, 0x10c, 0x70, 0x10c, 0x71, 0x10c, 0x72,
- 0x10c, 0x73, 0x10c, 0x74, 0x10c, 0x75, 0x10c, 0x76,
- 0x10c, 0x77, 0x10c, 0x78, 0x10c, 0x79, 0x10c, 0x7a,
- 0x10c, 0x7b, 0x10c, 0x7c, 0x10c, 0x7d, 0x10c, 0x7e,
- 0x10c, 0x2985, 0x10c, 0x2986, 0x10d, 0x3002, 0x10d, 0x300c,
- 0x10d, 0x300d, 0x10d, 0x3001, 0x10d, 0x30fb, 0x10d, 0x30f2,
- 0x10d, 0x30a1, 0x10d, 0x30a3, 0x10d, 0x30a5, 0x10d, 0x30a7,
- 0x10d, 0x30a9, 0x10d, 0x30e3, 0x10d, 0x30e5, 0x10d, 0x30e7,
- 0x10d, 0x30c3, 0x10d, 0x30fc, 0x10d, 0x30a2, 0x10d, 0x30a4,
- 0x10d, 0x30a6, 0x10d, 0x30a8, 0x10d, 0x30aa, 0x10d, 0x30ab,
- 0x10d, 0x30ad, 0x10d, 0x30af, 0x10d, 0x30b1, 0x10d, 0x30b3,
- 0x10d, 0x30b5, 0x10d, 0x30b7, 0x10d, 0x30b9, 0x10d, 0x30bb,
- 0x10d, 0x30bd, 0x10d, 0x30bf, 0x10d, 0x30c1, 0x10d, 0x30c4,
- 0x10d, 0x30c6, 0x10d, 0x30c8, 0x10d, 0x30ca, 0x10d, 0x30cb,
- 0x10d, 0x30cc, 0x10d, 0x30cd, 0x10d, 0x30ce, 0x10d, 0x30cf,
- 0x10d, 0x30d2, 0x10d, 0x30d5, 0x10d, 0x30d8, 0x10d, 0x30db,
- 0x10d, 0x30de, 0x10d, 0x30df, 0x10d, 0x30e0, 0x10d, 0x30e1,
- 0x10d, 0x30e2, 0x10d, 0x30e4, 0x10d, 0x30e6, 0x10d, 0x30e8,
- 0x10d, 0x30e9, 0x10d, 0x30ea, 0x10d, 0x30eb, 0x10d, 0x30ec,
- 0x10d, 0x30ed, 0x10d, 0x30ef, 0x10d, 0x30f3, 0x10d, 0x3099,
- 0x10d, 0x309a, 0x10d, 0x3164, 0x10d, 0x3131, 0x10d, 0x3132,
- 0x10d, 0x3133, 0x10d, 0x3134, 0x10d, 0x3135, 0x10d, 0x3136,
- 0x10d, 0x3137, 0x10d, 0x3138, 0x10d, 0x3139, 0x10d, 0x313a,
- 0x10d, 0x313b, 0x10d, 0x313c, 0x10d, 0x313d, 0x10d, 0x313e,
- 0x10d, 0x313f, 0x10d, 0x3140, 0x10d, 0x3141, 0x10d, 0x3142,
- 0x10d, 0x3143, 0x10d, 0x3144, 0x10d, 0x3145, 0x10d, 0x3146,
- 0x10d, 0x3147, 0x10d, 0x3148, 0x10d, 0x3149, 0x10d, 0x314a,
- 0x10d, 0x314b, 0x10d, 0x314c, 0x10d, 0x314d, 0x10d, 0x314e,
- 0x10d, 0x314f, 0x10d, 0x3150, 0x10d, 0x3151, 0x10d, 0x3152,
- 0x10d, 0x3153, 0x10d, 0x3154, 0x10d, 0x3155, 0x10d, 0x3156,
- 0x10d, 0x3157, 0x10d, 0x3158, 0x10d, 0x3159, 0x10d, 0x315a,
- 0x10d, 0x315b, 0x10d, 0x315c, 0x10d, 0x315d, 0x10d, 0x315e,
- 0x10d, 0x315f, 0x10d, 0x3160, 0x10d, 0x3161, 0x10d, 0x3162,
- 0x10d, 0x3163, 0x10c, 0xa2, 0x10c, 0xa3, 0x10c, 0xac,
- 0x10c, 0xaf, 0x10c, 0xa6, 0x10c, 0xa5, 0x10c, 0x20a9,
- 0x10d, 0x2502, 0x10d, 0x2190, 0x10d, 0x2191, 0x10d, 0x2192,
- 0x10d, 0x2193, 0x10d, 0x25a0, 0x10d, 0x25cb, 0x401, 0xd804,
- 0xdc99, 0xd804, 0xdcba, 0x401, 0xd804, 0xdc9b, 0xd804, 0xdcba,
- 0x401, 0xd804, 0xdca5, 0xd804, 0xdcba, 0x401, 0xd804, 0xdd31,
- 0xd804, 0xdd27, 0x401, 0xd804, 0xdd32, 0xd804, 0xdd27, 0x401,
- 0xd804, 0xdf47, 0xd804, 0xdf3e, 0x401, 0xd804, 0xdf47, 0xd804,
- 0xdf57, 0x401, 0xd805, 0xdcb9, 0xd805, 0xdcba, 0x401, 0xd805,
- 0xdcb9, 0xd805, 0xdcb0, 0x401, 0xd805, 0xdcb9, 0xd805, 0xdcbd,
- 0x401, 0xd805, 0xddb8, 0xd805, 0xddaf, 0x401, 0xd805, 0xddb9,
- 0xd805, 0xddaf, 0x401, 0xd834, 0xdd57, 0xd834, 0xdd65, 0x401,
- 0xd834, 0xdd58, 0xd834, 0xdd65, 0x401, 0xd834, 0xdd5f, 0xd834,
- 0xdd6e, 0x401, 0xd834, 0xdd5f, 0xd834, 0xdd6f, 0x401, 0xd834,
- 0xdd5f, 0xd834, 0xdd70, 0x401, 0xd834, 0xdd5f, 0xd834, 0xdd71,
- 0x401, 0xd834, 0xdd5f, 0xd834, 0xdd72, 0x401, 0xd834, 0xddb9,
- 0xd834, 0xdd65, 0x401, 0xd834, 0xddba, 0xd834, 0xdd65, 0x401,
- 0xd834, 0xddbb, 0xd834, 0xdd6e, 0x401, 0xd834, 0xddbc, 0xd834,
- 0xdd6e, 0x401, 0xd834, 0xddbb, 0xd834, 0xdd6f, 0x401, 0xd834,
- 0xddbc, 0xd834, 0xdd6f, 0x102, 0x41, 0x102, 0x42, 0x102,
- 0x43, 0x102, 0x44, 0x102, 0x45, 0x102, 0x46, 0x102,
- 0x47, 0x102, 0x48, 0x102, 0x49, 0x102, 0x4a, 0x102,
- 0x4b, 0x102, 0x4c, 0x102, 0x4d, 0x102, 0x4e, 0x102,
- 0x4f, 0x102, 0x50, 0x102, 0x51, 0x102, 0x52, 0x102,
- 0x53, 0x102, 0x54, 0x102, 0x55, 0x102, 0x56, 0x102,
- 0x57, 0x102, 0x58, 0x102, 0x59, 0x102, 0x5a, 0x102,
- 0x61, 0x102, 0x62, 0x102, 0x63, 0x102, 0x64, 0x102,
- 0x65, 0x102, 0x66, 0x102, 0x67, 0x102, 0x68, 0x102,
- 0x69, 0x102, 0x6a, 0x102, 0x6b, 0x102, 0x6c, 0x102,
- 0x6d, 0x102, 0x6e, 0x102, 0x6f, 0x102, 0x70, 0x102,
- 0x71, 0x102, 0x72, 0x102, 0x73, 0x102, 0x74, 0x102,
- 0x75, 0x102, 0x76, 0x102, 0x77, 0x102, 0x78, 0x102,
- 0x79, 0x102, 0x7a, 0x102, 0x41, 0x102, 0x42, 0x102,
- 0x43, 0x102, 0x44, 0x102, 0x45, 0x102, 0x46, 0x102,
- 0x47, 0x102, 0x48, 0x102, 0x49, 0x102, 0x4a, 0x102,
- 0x4b, 0x102, 0x4c, 0x102, 0x4d, 0x102, 0x4e, 0x102,
- 0x4f, 0x102, 0x50, 0x102, 0x51, 0x102, 0x52, 0x102,
- 0x53, 0x102, 0x54, 0x102, 0x55, 0x102, 0x56, 0x102,
- 0x57, 0x102, 0x58, 0x102, 0x59, 0x102, 0x5a, 0x102,
- 0x61, 0x102, 0x62, 0x102, 0x63, 0x102, 0x64, 0x102,
- 0x65, 0x102, 0x66, 0x102, 0x67, 0x102, 0x69, 0x102,
- 0x6a, 0x102, 0x6b, 0x102, 0x6c, 0x102, 0x6d, 0x102,
- 0x6e, 0x102, 0x6f, 0x102, 0x70, 0x102, 0x71, 0x102,
- 0x72, 0x102, 0x73, 0x102, 0x74, 0x102, 0x75, 0x102,
- 0x76, 0x102, 0x77, 0x102, 0x78, 0x102, 0x79, 0x102,
- 0x7a, 0x102, 0x41, 0x102, 0x42, 0x102, 0x43, 0x102,
- 0x44, 0x102, 0x45, 0x102, 0x46, 0x102, 0x47, 0x102,
- 0x48, 0x102, 0x49, 0x102, 0x4a, 0x102, 0x4b, 0x102,
- 0x4c, 0x102, 0x4d, 0x102, 0x4e, 0x102, 0x4f, 0x102,
- 0x50, 0x102, 0x51, 0x102, 0x52, 0x102, 0x53, 0x102,
- 0x54, 0x102, 0x55, 0x102, 0x56, 0x102, 0x57, 0x102,
- 0x58, 0x102, 0x59, 0x102, 0x5a, 0x102, 0x61, 0x102,
- 0x62, 0x102, 0x63, 0x102, 0x64, 0x102, 0x65, 0x102,
- 0x66, 0x102, 0x67, 0x102, 0x68, 0x102, 0x69, 0x102,
- 0x6a, 0x102, 0x6b, 0x102, 0x6c, 0x102, 0x6d, 0x102,
- 0x6e, 0x102, 0x6f, 0x102, 0x70, 0x102, 0x71, 0x102,
- 0x72, 0x102, 0x73, 0x102, 0x74, 0x102, 0x75, 0x102,
- 0x76, 0x102, 0x77, 0x102, 0x78, 0x102, 0x79, 0x102,
- 0x7a, 0x102, 0x41, 0x102, 0x43, 0x102, 0x44, 0x102,
- 0x47, 0x102, 0x4a, 0x102, 0x4b, 0x102, 0x4e, 0x102,
- 0x4f, 0x102, 0x50, 0x102, 0x51, 0x102, 0x53, 0x102,
- 0x54, 0x102, 0x55, 0x102, 0x56, 0x102, 0x57, 0x102,
- 0x58, 0x102, 0x59, 0x102, 0x5a, 0x102, 0x61, 0x102,
- 0x62, 0x102, 0x63, 0x102, 0x64, 0x102, 0x66, 0x102,
- 0x68, 0x102, 0x69, 0x102, 0x6a, 0x102, 0x6b, 0x102,
- 0x6c, 0x102, 0x6d, 0x102, 0x6e, 0x102, 0x70, 0x102,
- 0x71, 0x102, 0x72, 0x102, 0x73, 0x102, 0x74, 0x102,
- 0x75, 0x102, 0x76, 0x102, 0x77, 0x102, 0x78, 0x102,
- 0x79, 0x102, 0x7a, 0x102, 0x41, 0x102, 0x42, 0x102,
- 0x43, 0x102, 0x44, 0x102, 0x45, 0x102, 0x46, 0x102,
- 0x47, 0x102, 0x48, 0x102, 0x49, 0x102, 0x4a, 0x102,
- 0x4b, 0x102, 0x4c, 0x102, 0x4d, 0x102, 0x4e, 0x102,
- 0x4f, 0x102, 0x50, 0x102, 0x51, 0x102, 0x52, 0x102,
- 0x53, 0x102, 0x54, 0x102, 0x55, 0x102, 0x56, 0x102,
- 0x57, 0x102, 0x58, 0x102, 0x59, 0x102, 0x5a, 0x102,
- 0x61, 0x102, 0x62, 0x102, 0x63, 0x102, 0x64, 0x102,
- 0x65, 0x102, 0x66, 0x102, 0x67, 0x102, 0x68, 0x102,
- 0x69, 0x102, 0x6a, 0x102, 0x6b, 0x102, 0x6c, 0x102,
- 0x6d, 0x102, 0x6e, 0x102, 0x6f, 0x102, 0x70, 0x102,
- 0x71, 0x102, 0x72, 0x102, 0x73, 0x102, 0x74, 0x102,
- 0x75, 0x102, 0x76, 0x102, 0x77, 0x102, 0x78, 0x102,
- 0x79, 0x102, 0x7a, 0x102, 0x41, 0x102, 0x42, 0x102,
- 0x44, 0x102, 0x45, 0x102, 0x46, 0x102, 0x47, 0x102,
- 0x4a, 0x102, 0x4b, 0x102, 0x4c, 0x102, 0x4d, 0x102,
- 0x4e, 0x102, 0x4f, 0x102, 0x50, 0x102, 0x51, 0x102,
- 0x53, 0x102, 0x54, 0x102, 0x55, 0x102, 0x56, 0x102,
- 0x57, 0x102, 0x58, 0x102, 0x59, 0x102, 0x61, 0x102,
- 0x62, 0x102, 0x63, 0x102, 0x64, 0x102, 0x65, 0x102,
- 0x66, 0x102, 0x67, 0x102, 0x68, 0x102, 0x69, 0x102,
- 0x6a, 0x102, 0x6b, 0x102, 0x6c, 0x102, 0x6d, 0x102,
- 0x6e, 0x102, 0x6f, 0x102, 0x70, 0x102, 0x71, 0x102,
- 0x72, 0x102, 0x73, 0x102, 0x74, 0x102, 0x75, 0x102,
- 0x76, 0x102, 0x77, 0x102, 0x78, 0x102, 0x79, 0x102,
- 0x7a, 0x102, 0x41, 0x102, 0x42, 0x102, 0x44, 0x102,
- 0x45, 0x102, 0x46, 0x102, 0x47, 0x102, 0x49, 0x102,
- 0x4a, 0x102, 0x4b, 0x102, 0x4c, 0x102, 0x4d, 0x102,
- 0x4f, 0x102, 0x53, 0x102, 0x54, 0x102, 0x55, 0x102,
- 0x56, 0x102, 0x57, 0x102, 0x58, 0x102, 0x59, 0x102,
- 0x61, 0x102, 0x62, 0x102, 0x63, 0x102, 0x64, 0x102,
- 0x65, 0x102, 0x66, 0x102, 0x67, 0x102, 0x68, 0x102,
- 0x69, 0x102, 0x6a, 0x102, 0x6b, 0x102, 0x6c, 0x102,
- 0x6d, 0x102, 0x6e, 0x102, 0x6f, 0x102, 0x70, 0x102,
- 0x71, 0x102, 0x72, 0x102, 0x73, 0x102, 0x74, 0x102,
- 0x75, 0x102, 0x76, 0x102, 0x77, 0x102, 0x78, 0x102,
- 0x79, 0x102, 0x7a, 0x102, 0x41, 0x102, 0x42, 0x102,
- 0x43, 0x102, 0x44, 0x102, 0x45, 0x102, 0x46, 0x102,
- 0x47, 0x102, 0x48, 0x102, 0x49, 0x102, 0x4a, 0x102,
- 0x4b, 0x102, 0x4c, 0x102, 0x4d, 0x102, 0x4e, 0x102,
- 0x4f, 0x102, 0x50, 0x102, 0x51, 0x102, 0x52, 0x102,
- 0x53, 0x102, 0x54, 0x102, 0x55, 0x102, 0x56, 0x102,
- 0x57, 0x102, 0x58, 0x102, 0x59, 0x102, 0x5a, 0x102,
- 0x61, 0x102, 0x62, 0x102, 0x63, 0x102, 0x64, 0x102,
- 0x65, 0x102, 0x66, 0x102, 0x67, 0x102, 0x68, 0x102,
- 0x69, 0x102, 0x6a, 0x102, 0x6b, 0x102, 0x6c, 0x102,
- 0x6d, 0x102, 0x6e, 0x102, 0x6f, 0x102, 0x70, 0x102,
- 0x71, 0x102, 0x72, 0x102, 0x73, 0x102, 0x74, 0x102,
- 0x75, 0x102, 0x76, 0x102, 0x77, 0x102, 0x78, 0x102,
- 0x79, 0x102, 0x7a, 0x102, 0x41, 0x102, 0x42, 0x102,
- 0x43, 0x102, 0x44, 0x102, 0x45, 0x102, 0x46, 0x102,
- 0x47, 0x102, 0x48, 0x102, 0x49, 0x102, 0x4a, 0x102,
- 0x4b, 0x102, 0x4c, 0x102, 0x4d, 0x102, 0x4e, 0x102,
- 0x4f, 0x102, 0x50, 0x102, 0x51, 0x102, 0x52, 0x102,
- 0x53, 0x102, 0x54, 0x102, 0x55, 0x102, 0x56, 0x102,
- 0x57, 0x102, 0x58, 0x102, 0x59, 0x102, 0x5a, 0x102,
- 0x61, 0x102, 0x62, 0x102, 0x63, 0x102, 0x64, 0x102,
- 0x65, 0x102, 0x66, 0x102, 0x67, 0x102, 0x68, 0x102,
- 0x69, 0x102, 0x6a, 0x102, 0x6b, 0x102, 0x6c, 0x102,
- 0x6d, 0x102, 0x6e, 0x102, 0x6f, 0x102, 0x70, 0x102,
- 0x71, 0x102, 0x72, 0x102, 0x73, 0x102, 0x74, 0x102,
- 0x75, 0x102, 0x76, 0x102, 0x77, 0x102, 0x78, 0x102,
- 0x79, 0x102, 0x7a, 0x102, 0x41, 0x102, 0x42, 0x102,
- 0x43, 0x102, 0x44, 0x102, 0x45, 0x102, 0x46, 0x102,
- 0x47, 0x102, 0x48, 0x102, 0x49, 0x102, 0x4a, 0x102,
- 0x4b, 0x102, 0x4c, 0x102, 0x4d, 0x102, 0x4e, 0x102,
- 0x4f, 0x102, 0x50, 0x102, 0x51, 0x102, 0x52, 0x102,
- 0x53, 0x102, 0x54, 0x102, 0x55, 0x102, 0x56, 0x102,
- 0x57, 0x102, 0x58, 0x102, 0x59, 0x102, 0x5a, 0x102,
- 0x61, 0x102, 0x62, 0x102, 0x63, 0x102, 0x64, 0x102,
- 0x65, 0x102, 0x66, 0x102, 0x67, 0x102, 0x68, 0x102,
- 0x69, 0x102, 0x6a, 0x102, 0x6b, 0x102, 0x6c, 0x102,
- 0x6d, 0x102, 0x6e, 0x102, 0x6f, 0x102, 0x70, 0x102,
- 0x71, 0x102, 0x72, 0x102, 0x73, 0x102, 0x74, 0x102,
- 0x75, 0x102, 0x76, 0x102, 0x77, 0x102, 0x78, 0x102,
- 0x79, 0x102, 0x7a, 0x102, 0x41, 0x102, 0x42, 0x102,
- 0x43, 0x102, 0x44, 0x102, 0x45, 0x102, 0x46, 0x102,
- 0x47, 0x102, 0x48, 0x102, 0x49, 0x102, 0x4a, 0x102,
- 0x4b, 0x102, 0x4c, 0x102, 0x4d, 0x102, 0x4e, 0x102,
- 0x4f, 0x102, 0x50, 0x102, 0x51, 0x102, 0x52, 0x102,
- 0x53, 0x102, 0x54, 0x102, 0x55, 0x102, 0x56, 0x102,
- 0x57, 0x102, 0x58, 0x102, 0x59, 0x102, 0x5a, 0x102,
- 0x61, 0x102, 0x62, 0x102, 0x63, 0x102, 0x64, 0x102,
- 0x65, 0x102, 0x66, 0x102, 0x67, 0x102, 0x68, 0x102,
- 0x69, 0x102, 0x6a, 0x102, 0x6b, 0x102, 0x6c, 0x102,
- 0x6d, 0x102, 0x6e, 0x102, 0x6f, 0x102, 0x70, 0x102,
- 0x71, 0x102, 0x72, 0x102, 0x73, 0x102, 0x74, 0x102,
- 0x75, 0x102, 0x76, 0x102, 0x77, 0x102, 0x78, 0x102,
- 0x79, 0x102, 0x7a, 0x102, 0x41, 0x102, 0x42, 0x102,
- 0x43, 0x102, 0x44, 0x102, 0x45, 0x102, 0x46, 0x102,
- 0x47, 0x102, 0x48, 0x102, 0x49, 0x102, 0x4a, 0x102,
- 0x4b, 0x102, 0x4c, 0x102, 0x4d, 0x102, 0x4e, 0x102,
- 0x4f, 0x102, 0x50, 0x102, 0x51, 0x102, 0x52, 0x102,
- 0x53, 0x102, 0x54, 0x102, 0x55, 0x102, 0x56, 0x102,
- 0x57, 0x102, 0x58, 0x102, 0x59, 0x102, 0x5a, 0x102,
- 0x61, 0x102, 0x62, 0x102, 0x63, 0x102, 0x64, 0x102,
- 0x65, 0x102, 0x66, 0x102, 0x67, 0x102, 0x68, 0x102,
- 0x69, 0x102, 0x6a, 0x102, 0x6b, 0x102, 0x6c, 0x102,
- 0x6d, 0x102, 0x6e, 0x102, 0x6f, 0x102, 0x70, 0x102,
- 0x71, 0x102, 0x72, 0x102, 0x73, 0x102, 0x74, 0x102,
- 0x75, 0x102, 0x76, 0x102, 0x77, 0x102, 0x78, 0x102,
- 0x79, 0x102, 0x7a, 0x102, 0x41, 0x102, 0x42, 0x102,
- 0x43, 0x102, 0x44, 0x102, 0x45, 0x102, 0x46, 0x102,
- 0x47, 0x102, 0x48, 0x102, 0x49, 0x102, 0x4a, 0x102,
- 0x4b, 0x102, 0x4c, 0x102, 0x4d, 0x102, 0x4e, 0x102,
- 0x4f, 0x102, 0x50, 0x102, 0x51, 0x102, 0x52, 0x102,
- 0x53, 0x102, 0x54, 0x102, 0x55, 0x102, 0x56, 0x102,
- 0x57, 0x102, 0x58, 0x102, 0x59, 0x102, 0x5a, 0x102,
- 0x61, 0x102, 0x62, 0x102, 0x63, 0x102, 0x64, 0x102,
- 0x65, 0x102, 0x66, 0x102, 0x67, 0x102, 0x68, 0x102,
- 0x69, 0x102, 0x6a, 0x102, 0x6b, 0x102, 0x6c, 0x102,
- 0x6d, 0x102, 0x6e, 0x102, 0x6f, 0x102, 0x70, 0x102,
- 0x71, 0x102, 0x72, 0x102, 0x73, 0x102, 0x74, 0x102,
- 0x75, 0x102, 0x76, 0x102, 0x77, 0x102, 0x78, 0x102,
- 0x79, 0x102, 0x7a, 0x102, 0x131, 0x102, 0x237, 0x102,
- 0x391, 0x102, 0x392, 0x102, 0x393, 0x102, 0x394, 0x102,
- 0x395, 0x102, 0x396, 0x102, 0x397, 0x102, 0x398, 0x102,
- 0x399, 0x102, 0x39a, 0x102, 0x39b, 0x102, 0x39c, 0x102,
- 0x39d, 0x102, 0x39e, 0x102, 0x39f, 0x102, 0x3a0, 0x102,
- 0x3a1, 0x102, 0x3f4, 0x102, 0x3a3, 0x102, 0x3a4, 0x102,
- 0x3a5, 0x102, 0x3a6, 0x102, 0x3a7, 0x102, 0x3a8, 0x102,
- 0x3a9, 0x102, 0x2207, 0x102, 0x3b1, 0x102, 0x3b2, 0x102,
- 0x3b3, 0x102, 0x3b4, 0x102, 0x3b5, 0x102, 0x3b6, 0x102,
- 0x3b7, 0x102, 0x3b8, 0x102, 0x3b9, 0x102, 0x3ba, 0x102,
- 0x3bb, 0x102, 0x3bc, 0x102, 0x3bd, 0x102, 0x3be, 0x102,
- 0x3bf, 0x102, 0x3c0, 0x102, 0x3c1, 0x102, 0x3c2, 0x102,
- 0x3c3, 0x102, 0x3c4, 0x102, 0x3c5, 0x102, 0x3c6, 0x102,
- 0x3c7, 0x102, 0x3c8, 0x102, 0x3c9, 0x102, 0x2202, 0x102,
- 0x3f5, 0x102, 0x3d1, 0x102, 0x3f0, 0x102, 0x3d5, 0x102,
- 0x3f1, 0x102, 0x3d6, 0x102, 0x391, 0x102, 0x392, 0x102,
- 0x393, 0x102, 0x394, 0x102, 0x395, 0x102, 0x396, 0x102,
- 0x397, 0x102, 0x398, 0x102, 0x399, 0x102, 0x39a, 0x102,
- 0x39b, 0x102, 0x39c, 0x102, 0x39d, 0x102, 0x39e, 0x102,
- 0x39f, 0x102, 0x3a0, 0x102, 0x3a1, 0x102, 0x3f4, 0x102,
- 0x3a3, 0x102, 0x3a4, 0x102, 0x3a5, 0x102, 0x3a6, 0x102,
- 0x3a7, 0x102, 0x3a8, 0x102, 0x3a9, 0x102, 0x2207, 0x102,
- 0x3b1, 0x102, 0x3b2, 0x102, 0x3b3, 0x102, 0x3b4, 0x102,
- 0x3b5, 0x102, 0x3b6, 0x102, 0x3b7, 0x102, 0x3b8, 0x102,
- 0x3b9, 0x102, 0x3ba, 0x102, 0x3bb, 0x102, 0x3bc, 0x102,
- 0x3bd, 0x102, 0x3be, 0x102, 0x3bf, 0x102, 0x3c0, 0x102,
- 0x3c1, 0x102, 0x3c2, 0x102, 0x3c3, 0x102, 0x3c4, 0x102,
- 0x3c5, 0x102, 0x3c6, 0x102, 0x3c7, 0x102, 0x3c8, 0x102,
- 0x3c9, 0x102, 0x2202, 0x102, 0x3f5, 0x102, 0x3d1, 0x102,
- 0x3f0, 0x102, 0x3d5, 0x102, 0x3f1, 0x102, 0x3d6, 0x102,
- 0x391, 0x102, 0x392, 0x102, 0x393, 0x102, 0x394, 0x102,
- 0x395, 0x102, 0x396, 0x102, 0x397, 0x102, 0x398, 0x102,
- 0x399, 0x102, 0x39a, 0x102, 0x39b, 0x102, 0x39c, 0x102,
- 0x39d, 0x102, 0x39e, 0x102, 0x39f, 0x102, 0x3a0, 0x102,
- 0x3a1, 0x102, 0x3f4, 0x102, 0x3a3, 0x102, 0x3a4, 0x102,
- 0x3a5, 0x102, 0x3a6, 0x102, 0x3a7, 0x102, 0x3a8, 0x102,
- 0x3a9, 0x102, 0x2207, 0x102, 0x3b1, 0x102, 0x3b2, 0x102,
- 0x3b3, 0x102, 0x3b4, 0x102, 0x3b5, 0x102, 0x3b6, 0x102,
- 0x3b7, 0x102, 0x3b8, 0x102, 0x3b9, 0x102, 0x3ba, 0x102,
- 0x3bb, 0x102, 0x3bc, 0x102, 0x3bd, 0x102, 0x3be, 0x102,
- 0x3bf, 0x102, 0x3c0, 0x102, 0x3c1, 0x102, 0x3c2, 0x102,
- 0x3c3, 0x102, 0x3c4, 0x102, 0x3c5, 0x102, 0x3c6, 0x102,
- 0x3c7, 0x102, 0x3c8, 0x102, 0x3c9, 0x102, 0x2202, 0x102,
- 0x3f5, 0x102, 0x3d1, 0x102, 0x3f0, 0x102, 0x3d5, 0x102,
- 0x3f1, 0x102, 0x3d6, 0x102, 0x391, 0x102, 0x392, 0x102,
- 0x393, 0x102, 0x394, 0x102, 0x395, 0x102, 0x396, 0x102,
- 0x397, 0x102, 0x398, 0x102, 0x399, 0x102, 0x39a, 0x102,
- 0x39b, 0x102, 0x39c, 0x102, 0x39d, 0x102, 0x39e, 0x102,
- 0x39f, 0x102, 0x3a0, 0x102, 0x3a1, 0x102, 0x3f4, 0x102,
- 0x3a3, 0x102, 0x3a4, 0x102, 0x3a5, 0x102, 0x3a6, 0x102,
- 0x3a7, 0x102, 0x3a8, 0x102, 0x3a9, 0x102, 0x2207, 0x102,
- 0x3b1, 0x102, 0x3b2, 0x102, 0x3b3, 0x102, 0x3b4, 0x102,
- 0x3b5, 0x102, 0x3b6, 0x102, 0x3b7, 0x102, 0x3b8, 0x102,
- 0x3b9, 0x102, 0x3ba, 0x102, 0x3bb, 0x102, 0x3bc, 0x102,
- 0x3bd, 0x102, 0x3be, 0x102, 0x3bf, 0x102, 0x3c0, 0x102,
- 0x3c1, 0x102, 0x3c2, 0x102, 0x3c3, 0x102, 0x3c4, 0x102,
- 0x3c5, 0x102, 0x3c6, 0x102, 0x3c7, 0x102, 0x3c8, 0x102,
- 0x3c9, 0x102, 0x2202, 0x102, 0x3f5, 0x102, 0x3d1, 0x102,
- 0x3f0, 0x102, 0x3d5, 0x102, 0x3f1, 0x102, 0x3d6, 0x102,
- 0x391, 0x102, 0x392, 0x102, 0x393, 0x102, 0x394, 0x102,
- 0x395, 0x102, 0x396, 0x102, 0x397, 0x102, 0x398, 0x102,
- 0x399, 0x102, 0x39a, 0x102, 0x39b, 0x102, 0x39c, 0x102,
- 0x39d, 0x102, 0x39e, 0x102, 0x39f, 0x102, 0x3a0, 0x102,
- 0x3a1, 0x102, 0x3f4, 0x102, 0x3a3, 0x102, 0x3a4, 0x102,
- 0x3a5, 0x102, 0x3a6, 0x102, 0x3a7, 0x102, 0x3a8, 0x102,
- 0x3a9, 0x102, 0x2207, 0x102, 0x3b1, 0x102, 0x3b2, 0x102,
- 0x3b3, 0x102, 0x3b4, 0x102, 0x3b5, 0x102, 0x3b6, 0x102,
- 0x3b7, 0x102, 0x3b8, 0x102, 0x3b9, 0x102, 0x3ba, 0x102,
- 0x3bb, 0x102, 0x3bc, 0x102, 0x3bd, 0x102, 0x3be, 0x102,
- 0x3bf, 0x102, 0x3c0, 0x102, 0x3c1, 0x102, 0x3c2, 0x102,
- 0x3c3, 0x102, 0x3c4, 0x102, 0x3c5, 0x102, 0x3c6, 0x102,
- 0x3c7, 0x102, 0x3c8, 0x102, 0x3c9, 0x102, 0x2202, 0x102,
- 0x3f5, 0x102, 0x3d1, 0x102, 0x3f0, 0x102, 0x3d5, 0x102,
- 0x3f1, 0x102, 0x3d6, 0x102, 0x3dc, 0x102, 0x3dd, 0x102,
- 0x30, 0x102, 0x31, 0x102, 0x32, 0x102, 0x33, 0x102,
- 0x34, 0x102, 0x35, 0x102, 0x36, 0x102, 0x37, 0x102,
- 0x38, 0x102, 0x39, 0x102, 0x30, 0x102, 0x31, 0x102,
- 0x32, 0x102, 0x33, 0x102, 0x34, 0x102, 0x35, 0x102,
- 0x36, 0x102, 0x37, 0x102, 0x38, 0x102, 0x39, 0x102,
- 0x30, 0x102, 0x31, 0x102, 0x32, 0x102, 0x33, 0x102,
- 0x34, 0x102, 0x35, 0x102, 0x36, 0x102, 0x37, 0x102,
- 0x38, 0x102, 0x39, 0x102, 0x30, 0x102, 0x31, 0x102,
- 0x32, 0x102, 0x33, 0x102, 0x34, 0x102, 0x35, 0x102,
- 0x36, 0x102, 0x37, 0x102, 0x38, 0x102, 0x39, 0x102,
- 0x30, 0x102, 0x31, 0x102, 0x32, 0x102, 0x33, 0x102,
- 0x34, 0x102, 0x35, 0x102, 0x36, 0x102, 0x37, 0x102,
- 0x38, 0x102, 0x39, 0x102, 0x627, 0x102, 0x628, 0x102,
- 0x62c, 0x102, 0x62f, 0x102, 0x648, 0x102, 0x632, 0x102,
- 0x62d, 0x102, 0x637, 0x102, 0x64a, 0x102, 0x643, 0x102,
- 0x644, 0x102, 0x645, 0x102, 0x646, 0x102, 0x633, 0x102,
- 0x639, 0x102, 0x641, 0x102, 0x635, 0x102, 0x642, 0x102,
- 0x631, 0x102, 0x634, 0x102, 0x62a, 0x102, 0x62b, 0x102,
- 0x62e, 0x102, 0x630, 0x102, 0x636, 0x102, 0x638, 0x102,
- 0x63a, 0x102, 0x66e, 0x102, 0x6ba, 0x102, 0x6a1, 0x102,
- 0x66f, 0x102, 0x628, 0x102, 0x62c, 0x102, 0x647, 0x102,
- 0x62d, 0x102, 0x64a, 0x102, 0x643, 0x102, 0x644, 0x102,
- 0x645, 0x102, 0x646, 0x102, 0x633, 0x102, 0x639, 0x102,
- 0x641, 0x102, 0x635, 0x102, 0x642, 0x102, 0x634, 0x102,
- 0x62a, 0x102, 0x62b, 0x102, 0x62e, 0x102, 0x636, 0x102,
- 0x63a, 0x102, 0x62c, 0x102, 0x62d, 0x102, 0x64a, 0x102,
- 0x644, 0x102, 0x646, 0x102, 0x633, 0x102, 0x639, 0x102,
- 0x635, 0x102, 0x642, 0x102, 0x634, 0x102, 0x62e, 0x102,
- 0x636, 0x102, 0x63a, 0x102, 0x6ba, 0x102, 0x66f, 0x102,
- 0x628, 0x102, 0x62c, 0x102, 0x647, 0x102, 0x62d, 0x102,
- 0x637, 0x102, 0x64a, 0x102, 0x643, 0x102, 0x645, 0x102,
- 0x646, 0x102, 0x633, 0x102, 0x639, 0x102, 0x641, 0x102,
- 0x635, 0x102, 0x642, 0x102, 0x634, 0x102, 0x62a, 0x102,
- 0x62b, 0x102, 0x62e, 0x102, 0x636, 0x102, 0x638, 0x102,
- 0x63a, 0x102, 0x66e, 0x102, 0x6a1, 0x102, 0x627, 0x102,
- 0x628, 0x102, 0x62c, 0x102, 0x62f, 0x102, 0x647, 0x102,
- 0x648, 0x102, 0x632, 0x102, 0x62d, 0x102, 0x637, 0x102,
- 0x64a, 0x102, 0x644, 0x102, 0x645, 0x102, 0x646, 0x102,
- 0x633, 0x102, 0x639, 0x102, 0x641, 0x102, 0x635, 0x102,
- 0x642, 0x102, 0x631, 0x102, 0x634, 0x102, 0x62a, 0x102,
- 0x62b, 0x102, 0x62e, 0x102, 0x630, 0x102, 0x636, 0x102,
- 0x638, 0x102, 0x63a, 0x102, 0x628, 0x102, 0x62c, 0x102,
- 0x62f, 0x102, 0x648, 0x102, 0x632, 0x102, 0x62d, 0x102,
- 0x637, 0x102, 0x64a, 0x102, 0x644, 0x102, 0x645, 0x102,
- 0x646, 0x102, 0x633, 0x102, 0x639, 0x102, 0x641, 0x102,
- 0x635, 0x102, 0x642, 0x102, 0x631, 0x102, 0x634, 0x102,
- 0x62a, 0x102, 0x62b, 0x102, 0x62e, 0x102, 0x630, 0x102,
- 0x636, 0x102, 0x638, 0x102, 0x63a, 0x210, 0x30, 0x2e,
- 0x210, 0x30, 0x2c, 0x210, 0x31, 0x2c, 0x210, 0x32,
- 0x2c, 0x210, 0x33, 0x2c, 0x210, 0x34, 0x2c, 0x210,
- 0x35, 0x2c, 0x210, 0x36, 0x2c, 0x210, 0x37, 0x2c,
- 0x210, 0x38, 0x2c, 0x210, 0x39, 0x2c, 0x310, 0x28,
- 0x41, 0x29, 0x310, 0x28, 0x42, 0x29, 0x310, 0x28,
- 0x43, 0x29, 0x310, 0x28, 0x44, 0x29, 0x310, 0x28,
- 0x45, 0x29, 0x310, 0x28, 0x46, 0x29, 0x310, 0x28,
- 0x47, 0x29, 0x310, 0x28, 0x48, 0x29, 0x310, 0x28,
- 0x49, 0x29, 0x310, 0x28, 0x4a, 0x29, 0x310, 0x28,
- 0x4b, 0x29, 0x310, 0x28, 0x4c, 0x29, 0x310, 0x28,
- 0x4d, 0x29, 0x310, 0x28, 0x4e, 0x29, 0x310, 0x28,
- 0x4f, 0x29, 0x310, 0x28, 0x50, 0x29, 0x310, 0x28,
- 0x51, 0x29, 0x310, 0x28, 0x52, 0x29, 0x310, 0x28,
- 0x53, 0x29, 0x310, 0x28, 0x54, 0x29, 0x310, 0x28,
- 0x55, 0x29, 0x310, 0x28, 0x56, 0x29, 0x310, 0x28,
- 0x57, 0x29, 0x310, 0x28, 0x58, 0x29, 0x310, 0x28,
- 0x59, 0x29, 0x310, 0x28, 0x5a, 0x29, 0x310, 0x3014,
- 0x53, 0x3015, 0x108, 0x43, 0x108, 0x52, 0x208, 0x43,
- 0x44, 0x208, 0x57, 0x5a, 0x10f, 0x41, 0x10f, 0x42,
- 0x10f, 0x43, 0x10f, 0x44, 0x10f, 0x45, 0x10f, 0x46,
- 0x10f, 0x47, 0x10f, 0x48, 0x10f, 0x49, 0x10f, 0x4a,
- 0x10f, 0x4b, 0x10f, 0x4c, 0x10f, 0x4d, 0x10f, 0x4e,
- 0x10f, 0x4f, 0x10f, 0x50, 0x10f, 0x51, 0x10f, 0x52,
- 0x10f, 0x53, 0x10f, 0x54, 0x10f, 0x55, 0x10f, 0x56,
- 0x10f, 0x57, 0x10f, 0x58, 0x10f, 0x59, 0x10f, 0x5a,
- 0x20f, 0x48, 0x56, 0x20f, 0x4d, 0x56, 0x20f, 0x53,
- 0x44, 0x20f, 0x53, 0x53, 0x30f, 0x50, 0x50, 0x56,
- 0x20f, 0x57, 0x43, 0x209, 0x4d, 0x43, 0x209, 0x4d,
- 0x44, 0x20f, 0x44, 0x4a, 0x20f, 0x307b, 0x304b, 0x20f,
- 0x30b3, 0x30b3, 0x10f, 0x30b5, 0x10f, 0x624b, 0x10f, 0x5b57,
- 0x10f, 0x53cc, 0x10f, 0x30c7, 0x10f, 0x4e8c, 0x10f, 0x591a,
- 0x10f, 0x89e3, 0x10f, 0x5929, 0x10f, 0x4ea4, 0x10f, 0x6620,
- 0x10f, 0x7121, 0x10f, 0x6599, 0x10f, 0x524d, 0x10f, 0x5f8c,
- 0x10f, 0x518d, 0x10f, 0x65b0, 0x10f, 0x521d, 0x10f, 0x7d42,
- 0x10f, 0x751f, 0x10f, 0x8ca9, 0x10f, 0x58f0, 0x10f, 0x5439,
- 0x10f, 0x6f14, 0x10f, 0x6295, 0x10f, 0x6355, 0x10f, 0x4e00,
- 0x10f, 0x4e09, 0x10f, 0x904a, 0x10f, 0x5de6, 0x10f, 0x4e2d,
- 0x10f, 0x53f3, 0x10f, 0x6307, 0x10f, 0x8d70, 0x10f, 0x6253,
- 0x10f, 0x7981, 0x10f, 0x7a7a, 0x10f, 0x5408, 0x10f, 0x6e80,
- 0x10f, 0x6709, 0x10f, 0x6708, 0x10f, 0x7533, 0x10f, 0x5272,
- 0x10f, 0x55b6, 0x10f, 0x914d, 0x310, 0x3014, 0x672c, 0x3015,
- 0x310, 0x3014, 0x4e09, 0x3015, 0x310, 0x3014, 0x4e8c, 0x3015,
- 0x310, 0x3014, 0x5b89, 0x3015, 0x310, 0x3014, 0x70b9, 0x3015,
- 0x310, 0x3014, 0x6253, 0x3015, 0x310, 0x3014, 0x76d7, 0x3015,
- 0x310, 0x3014, 0x52dd, 0x3015, 0x310, 0x3014, 0x6557, 0x3015,
- 0x108, 0x5f97, 0x108, 0x53ef, 0x101, 0x4e3d, 0x101, 0x4e38,
- 0x101, 0x4e41, 0x201, 0xd840, 0xdd22, 0x101, 0x4f60, 0x101,
- 0x4fae, 0x101, 0x4fbb, 0x101, 0x5002, 0x101, 0x507a, 0x101,
- 0x5099, 0x101, 0x50e7, 0x101, 0x50cf, 0x101, 0x349e, 0x201,
- 0xd841, 0xde3a, 0x101, 0x514d, 0x101, 0x5154, 0x101, 0x5164,
- 0x101, 0x5177, 0x201, 0xd841, 0xdd1c, 0x101, 0x34b9, 0x101,
- 0x5167, 0x101, 0x518d, 0x201, 0xd841, 0xdd4b, 0x101, 0x5197,
- 0x101, 0x51a4, 0x101, 0x4ecc, 0x101, 0x51ac, 0x101, 0x51b5,
- 0x201, 0xd864, 0xdddf, 0x101, 0x51f5, 0x101, 0x5203, 0x101,
- 0x34df, 0x101, 0x523b, 0x101, 0x5246, 0x101, 0x5272, 0x101,
- 0x5277, 0x101, 0x3515, 0x101, 0x52c7, 0x101, 0x52c9, 0x101,
- 0x52e4, 0x101, 0x52fa, 0x101, 0x5305, 0x101, 0x5306, 0x101,
- 0x5317, 0x101, 0x5349, 0x101, 0x5351, 0x101, 0x535a, 0x101,
- 0x5373, 0x101, 0x537d, 0x101, 0x537f, 0x101, 0x537f, 0x101,
- 0x537f, 0x201, 0xd842, 0xde2c, 0x101, 0x7070, 0x101, 0x53ca,
- 0x101, 0x53df, 0x201, 0xd842, 0xdf63, 0x101, 0x53eb, 0x101,
- 0x53f1, 0x101, 0x5406, 0x101, 0x549e, 0x101, 0x5438, 0x101,
- 0x5448, 0x101, 0x5468, 0x101, 0x54a2, 0x101, 0x54f6, 0x101,
- 0x5510, 0x101, 0x5553, 0x101, 0x5563, 0x101, 0x5584, 0x101,
- 0x5584, 0x101, 0x5599, 0x101, 0x55ab, 0x101, 0x55b3, 0x101,
- 0x55c2, 0x101, 0x5716, 0x101, 0x5606, 0x101, 0x5717, 0x101,
- 0x5651, 0x101, 0x5674, 0x101, 0x5207, 0x101, 0x58ee, 0x101,
- 0x57ce, 0x101, 0x57f4, 0x101, 0x580d, 0x101, 0x578b, 0x101,
- 0x5832, 0x101, 0x5831, 0x101, 0x58ac, 0x201, 0xd845, 0xdce4,
- 0x101, 0x58f2, 0x101, 0x58f7, 0x101, 0x5906, 0x101, 0x591a,
- 0x101, 0x5922, 0x101, 0x5962, 0x201, 0xd845, 0xdea8, 0x201,
- 0xd845, 0xdeea, 0x101, 0x59ec, 0x101, 0x5a1b, 0x101, 0x5a27,
- 0x101, 0x59d8, 0x101, 0x5a66, 0x101, 0x36ee, 0x101, 0x36fc,
- 0x101, 0x5b08, 0x101, 0x5b3e, 0x101, 0x5b3e, 0x201, 0xd846,
- 0xddc8, 0x101, 0x5bc3, 0x101, 0x5bd8, 0x101, 0x5be7, 0x101,
- 0x5bf3, 0x201, 0xd846, 0xdf18, 0x101, 0x5bff, 0x101, 0x5c06,
- 0x101, 0x5f53, 0x101, 0x5c22, 0x101, 0x3781, 0x101, 0x5c60,
- 0x101, 0x5c6e, 0x101, 0x5cc0, 0x101, 0x5c8d, 0x201, 0xd847,
- 0xdde4, 0x101, 0x5d43, 0x201, 0xd847, 0xdde6, 0x101, 0x5d6e,
- 0x101, 0x5d6b, 0x101, 0x5d7c, 0x101, 0x5de1, 0x101, 0x5de2,
- 0x101, 0x382f, 0x101, 0x5dfd, 0x101, 0x5e28, 0x101, 0x5e3d,
- 0x101, 0x5e69, 0x101, 0x3862, 0x201, 0xd848, 0xdd83, 0x101,
- 0x387c, 0x101, 0x5eb0, 0x101, 0x5eb3, 0x101, 0x5eb6, 0x101,
- 0x5eca, 0x201, 0xd868, 0xdf92, 0x101, 0x5efe, 0x201, 0xd848,
- 0xdf31, 0x201, 0xd848, 0xdf31, 0x101, 0x8201, 0x101, 0x5f22,
- 0x101, 0x5f22, 0x101, 0x38c7, 0x201, 0xd84c, 0xdeb8, 0x201,
- 0xd858, 0xddda, 0x101, 0x5f62, 0x101, 0x5f6b, 0x101, 0x38e3,
- 0x101, 0x5f9a, 0x101, 0x5fcd, 0x101, 0x5fd7, 0x101, 0x5ff9,
- 0x101, 0x6081, 0x101, 0x393a, 0x101, 0x391c, 0x101, 0x6094,
- 0x201, 0xd849, 0xded4, 0x101, 0x60c7, 0x101, 0x6148, 0x101,
- 0x614c, 0x101, 0x614e, 0x101, 0x614c, 0x101, 0x617a, 0x101,
- 0x618e, 0x101, 0x61b2, 0x101, 0x61a4, 0x101, 0x61af, 0x101,
- 0x61de, 0x101, 0x61f2, 0x101, 0x61f6, 0x101, 0x6210, 0x101,
- 0x621b, 0x101, 0x625d, 0x101, 0x62b1, 0x101, 0x62d4, 0x101,
- 0x6350, 0x201, 0xd84a, 0xdf0c, 0x101, 0x633d, 0x101, 0x62fc,
- 0x101, 0x6368, 0x101, 0x6383, 0x101, 0x63e4, 0x201, 0xd84a,
- 0xdff1, 0x101, 0x6422, 0x101, 0x63c5, 0x101, 0x63a9, 0x101,
- 0x3a2e, 0x101, 0x6469, 0x101, 0x647e, 0x101, 0x649d, 0x101,
- 0x6477, 0x101, 0x3a6c, 0x101, 0x654f, 0x101, 0x656c, 0x201,
- 0xd84c, 0xdc0a, 0x101, 0x65e3, 0x101, 0x66f8, 0x101, 0x6649,
- 0x101, 0x3b19, 0x101, 0x6691, 0x101, 0x3b08, 0x101, 0x3ae4,
- 0x101, 0x5192, 0x101, 0x5195, 0x101, 0x6700, 0x101, 0x669c,
- 0x101, 0x80ad, 0x101, 0x43d9, 0x101, 0x6717, 0x101, 0x671b,
- 0x101, 0x6721, 0x101, 0x675e, 0x101, 0x6753, 0x201, 0xd84c,
- 0xdfc3, 0x101, 0x3b49, 0x101, 0x67fa, 0x101, 0x6785, 0x101,
- 0x6852, 0x101, 0x6885, 0x201, 0xd84d, 0xdc6d, 0x101, 0x688e,
- 0x101, 0x681f, 0x101, 0x6914, 0x101, 0x3b9d, 0x101, 0x6942,
- 0x101, 0x69a3, 0x101, 0x69ea, 0x101, 0x6aa8, 0x201, 0xd84d,
- 0xdea3, 0x101, 0x6adb, 0x101, 0x3c18, 0x101, 0x6b21, 0x201,
- 0xd84e, 0xdca7, 0x101, 0x6b54, 0x101, 0x3c4e, 0x101, 0x6b72,
- 0x101, 0x6b9f, 0x101, 0x6bba, 0x101, 0x6bbb, 0x201, 0xd84e,
- 0xde8d, 0x201, 0xd847, 0xdd0b, 0x201, 0xd84e, 0xdefa, 0x101,
- 0x6c4e, 0x201, 0xd84f, 0xdcbc, 0x101, 0x6cbf, 0x101, 0x6ccd,
- 0x101, 0x6c67, 0x101, 0x6d16, 0x101, 0x6d3e, 0x101, 0x6d77,
- 0x101, 0x6d41, 0x101, 0x6d69, 0x101, 0x6d78, 0x101, 0x6d85,
- 0x201, 0xd84f, 0xdd1e, 0x101, 0x6d34, 0x101, 0x6e2f, 0x101,
- 0x6e6e, 0x101, 0x3d33, 0x101, 0x6ecb, 0x101, 0x6ec7, 0x201,
- 0xd84f, 0xded1, 0x101, 0x6df9, 0x101, 0x6f6e, 0x201, 0xd84f,
- 0xdf5e, 0x201, 0xd84f, 0xdf8e, 0x101, 0x6fc6, 0x101, 0x7039,
- 0x101, 0x701e, 0x101, 0x701b, 0x101, 0x3d96, 0x101, 0x704a,
- 0x101, 0x707d, 0x101, 0x7077, 0x101, 0x70ad, 0x201, 0xd841,
- 0xdd25, 0x101, 0x7145, 0x201, 0xd850, 0xde63, 0x101, 0x719c,
- 0x201, 0xd850, 0xdfab, 0x101, 0x7228, 0x101, 0x7235, 0x101,
- 0x7250, 0x201, 0xd851, 0xde08, 0x101, 0x7280, 0x101, 0x7295,
- 0x201, 0xd851, 0xdf35, 0x201, 0xd852, 0xdc14, 0x101, 0x737a,
- 0x101, 0x738b, 0x101, 0x3eac, 0x101, 0x73a5, 0x101, 0x3eb8,
- 0x101, 0x3eb8, 0x101, 0x7447, 0x101, 0x745c, 0x101, 0x7471,
- 0x101, 0x7485, 0x101, 0x74ca, 0x101, 0x3f1b, 0x101, 0x7524,
- 0x201, 0xd853, 0xdc36, 0x101, 0x753e, 0x201, 0xd853, 0xdc92,
- 0x101, 0x7570, 0x201, 0xd848, 0xdd9f, 0x101, 0x7610, 0x201,
- 0xd853, 0xdfa1, 0x201, 0xd853, 0xdfb8, 0x201, 0xd854, 0xdc44,
- 0x101, 0x3ffc, 0x101, 0x4008, 0x101, 0x76f4, 0x201, 0xd854,
- 0xdcf3, 0x201, 0xd854, 0xdcf2, 0x201, 0xd854, 0xdd19, 0x201,
- 0xd854, 0xdd33, 0x101, 0x771e, 0x101, 0x771f, 0x101, 0x771f,
- 0x101, 0x774a, 0x101, 0x4039, 0x101, 0x778b, 0x101, 0x4046,
- 0x101, 0x4096, 0x201, 0xd855, 0xdc1d, 0x101, 0x784e, 0x101,
- 0x788c, 0x101, 0x78cc, 0x101, 0x40e3, 0x201, 0xd855, 0xde26,
- 0x101, 0x7956, 0x201, 0xd855, 0xde9a, 0x201, 0xd855, 0xdec5,
- 0x101, 0x798f, 0x101, 0x79eb, 0x101, 0x412f, 0x101, 0x7a40,
- 0x101, 0x7a4a, 0x101, 0x7a4f, 0x201, 0xd856, 0xdd7c, 0x201,
- 0xd856, 0xdea7, 0x201, 0xd856, 0xdea7, 0x101, 0x7aee, 0x101,
- 0x4202, 0x201, 0xd856, 0xdfab, 0x101, 0x7bc6, 0x101, 0x7bc9,
- 0x101, 0x4227, 0x201, 0xd857, 0xdc80, 0x101, 0x7cd2, 0x101,
- 0x42a0, 0x101, 0x7ce8, 0x101, 0x7ce3, 0x101, 0x7d00, 0x201,
- 0xd857, 0xdf86, 0x101, 0x7d63, 0x101, 0x4301, 0x101, 0x7dc7,
- 0x101, 0x7e02, 0x101, 0x7e45, 0x101, 0x4334, 0x201, 0xd858,
- 0xde28, 0x201, 0xd858, 0xde47, 0x101, 0x4359, 0x201, 0xd858,
- 0xded9, 0x101, 0x7f7a, 0x201, 0xd858, 0xdf3e, 0x101, 0x7f95,
- 0x101, 0x7ffa, 0x101, 0x8005, 0x201, 0xd859, 0xdcda, 0x201,
- 0xd859, 0xdd23, 0x101, 0x8060, 0x201, 0xd859, 0xdda8, 0x101,
- 0x8070, 0x201, 0xd84c, 0xdf5f, 0x101, 0x43d5, 0x101, 0x80b2,
- 0x101, 0x8103, 0x101, 0x440b, 0x101, 0x813e, 0x101, 0x5ab5,
- 0x201, 0xd859, 0xdfa7, 0x201, 0xd859, 0xdfb5, 0x201, 0xd84c,
- 0xdf93, 0x201, 0xd84c, 0xdf9c, 0x101, 0x8201, 0x101, 0x8204,
- 0x101, 0x8f9e, 0x101, 0x446b, 0x101, 0x8291, 0x101, 0x828b,
- 0x101, 0x829d, 0x101, 0x52b3, 0x101, 0x82b1, 0x101, 0x82b3,
- 0x101, 0x82bd, 0x101, 0x82e6, 0x201, 0xd85a, 0xdf3c, 0x101,
- 0x82e5, 0x101, 0x831d, 0x101, 0x8363, 0x101, 0x83ad, 0x101,
- 0x8323, 0x101, 0x83bd, 0x101, 0x83e7, 0x101, 0x8457, 0x101,
- 0x8353, 0x101, 0x83ca, 0x101, 0x83cc, 0x101, 0x83dc, 0x201,
- 0xd85b, 0xdc36, 0x201, 0xd85b, 0xdd6b, 0x201, 0xd85b, 0xdcd5,
- 0x101, 0x452b, 0x101, 0x84f1, 0x101, 0x84f3, 0x101, 0x8516,
- 0x201, 0xd85c, 0xdfca, 0x101, 0x8564, 0x201, 0xd85b, 0xdf2c,
- 0x101, 0x455d, 0x101, 0x4561, 0x201, 0xd85b, 0xdfb1, 0x201,
- 0xd85c, 0xdcd2, 0x101, 0x456b, 0x101, 0x8650, 0x101, 0x865c,
- 0x101, 0x8667, 0x101, 0x8669, 0x101, 0x86a9, 0x101, 0x8688,
- 0x101, 0x870e, 0x101, 0x86e2, 0x101, 0x8779, 0x101, 0x8728,
- 0x101, 0x876b, 0x101, 0x8786, 0x101, 0x45d7, 0x101, 0x87e1,
- 0x101, 0x8801, 0x101, 0x45f9, 0x101, 0x8860, 0x101, 0x8863,
- 0x201, 0xd85d, 0xde67, 0x101, 0x88d7, 0x101, 0x88de, 0x101,
- 0x4635, 0x101, 0x88fa, 0x101, 0x34bb, 0x201, 0xd85e, 0xdcae,
- 0x201, 0xd85e, 0xdd66, 0x101, 0x46be, 0x101, 0x46c7, 0x101,
- 0x8aa0, 0x101, 0x8aed, 0x101, 0x8b8a, 0x101, 0x8c55, 0x201,
- 0xd85f, 0xdca8, 0x101, 0x8cab, 0x101, 0x8cc1, 0x101, 0x8d1b,
- 0x101, 0x8d77, 0x201, 0xd85f, 0xdf2f, 0x201, 0xd842, 0xdc04,
- 0x101, 0x8dcb, 0x101, 0x8dbc, 0x101, 0x8df0, 0x201, 0xd842,
- 0xdcde, 0x101, 0x8ed4, 0x101, 0x8f38, 0x201, 0xd861, 0xddd2,
- 0x201, 0xd861, 0xdded, 0x101, 0x9094, 0x101, 0x90f1, 0x101,
- 0x9111, 0x201, 0xd861, 0xdf2e, 0x101, 0x911b, 0x101, 0x9238,
- 0x101, 0x92d7, 0x101, 0x92d8, 0x101, 0x927c, 0x101, 0x93f9,
- 0x101, 0x9415, 0x201, 0xd862, 0xdffa, 0x101, 0x958b, 0x101,
- 0x4995, 0x101, 0x95b7, 0x201, 0xd863, 0xdd77, 0x101, 0x49e6,
- 0x101, 0x96c3, 0x101, 0x5db2, 0x101, 0x9723, 0x201, 0xd864,
- 0xdd45, 0x201, 0xd864, 0xde1a, 0x101, 0x4a6e, 0x101, 0x4a76,
- 0x101, 0x97e0, 0x201, 0xd865, 0xdc0a, 0x101, 0x4ab2, 0x201,
- 0xd865, 0xdc96, 0x101, 0x980b, 0x101, 0x980b, 0x101, 0x9829,
- 0x201, 0xd865, 0xddb6, 0x101, 0x98e2, 0x101, 0x4b33, 0x101,
- 0x9929, 0x101, 0x99a7, 0x101, 0x99c2, 0x101, 0x99fe, 0x101,
- 0x4bce, 0x201, 0xd866, 0xdf30, 0x101, 0x9b12, 0x101, 0x9c40,
- 0x101, 0x9cfd, 0x101, 0x4cce, 0x101, 0x4ced, 0x101, 0x9d67,
- 0x201, 0xd868, 0xdcce, 0x101, 0x4cf8, 0x201, 0xd868, 0xdd05,
- 0x201, 0xd868, 0xde0e, 0x201, 0xd868, 0xde91, 0x101, 0x9ebb,
- 0x101, 0x4d56, 0x101, 0x9ef9, 0x101, 0x9efe, 0x101, 0x9f05,
- 0x101, 0x9f0f, 0x101, 0x9f16, 0x101, 0x9f3b, 0x201, 0xd869,
- 0xde00
-};
-
-static const unsigned short uc_ligature_trie[] = {
- // 0 - 0x3100
-
- 631, 631, 631, 631, 631, 631, 631, 631,
- 631, 631, 631, 631, 631, 631, 631, 631,
- 631, 631, 631, 631, 631, 631, 631, 631,
- 663, 695, 727, 631, 631, 631, 631, 631,
- 631, 631, 631, 631, 631, 631, 631, 631,
- 631, 631, 631, 631, 631, 631, 631, 631,
- 631, 631, 759, 631, 631, 631, 631, 631,
- 631, 631, 631, 631, 631, 631, 631, 631,
- 631, 631, 631, 631, 631, 631, 631, 631,
- 631, 791, 631, 631, 631, 823, 855, 631,
- 631, 631, 631, 631, 631, 631, 631, 631,
- 631, 887, 919, 631, 631, 951, 983, 631,
- 631, 631, 1015, 631, 631, 631, 1047, 631,
- 631, 1079, 1111, 631, 631, 631, 1143, 631,
- 631, 631, 631, 631, 631, 631, 631, 631,
- 631, 631, 631, 631, 631, 631, 631, 631,
-
- 631, 1175, 631, 631, 631, 631, 631, 631,
- 631, 631, 631, 631, 631, 631, 631, 631,
- 631, 631, 631, 631, 631, 631, 631, 631,
- 631, 631, 631, 631, 631, 631, 631, 631,
- 631, 631, 631, 631, 631, 631, 631, 631,
- 631, 631, 631, 631, 631, 631, 631, 631,
- 631, 631, 631, 631, 631, 631, 631, 631,
- 631, 631, 631, 631, 631, 631, 631, 631,
- 631, 631, 631, 631, 631, 631, 631, 631,
- 631, 631, 631, 631, 631, 631, 631, 631,
- 631, 631, 631, 631, 631, 631, 631, 631,
- 631, 1207, 631, 631, 631, 631, 631, 631,
- 631, 631, 631, 631, 631, 631, 631, 631,
- 631, 631, 631, 631, 631, 631, 631, 631,
- 631, 631, 631, 631, 631, 631, 631, 631,
- 631, 631, 631, 631, 631, 631, 631, 631,
-
- 631, 631, 631, 631, 631, 631, 631, 631,
- 631, 631, 631, 631, 631, 631, 631, 631,
- 631, 631, 631, 631, 631, 631, 631, 631,
- 631, 631, 631, 631, 631, 631, 631, 631,
- 631, 631, 631, 631, 631, 631, 631, 631,
- 631, 631, 631, 631, 631, 631, 631, 631,
- 631, 631, 631, 631, 631, 631, 631, 631,
- 631, 631, 631, 631, 631, 631, 631, 631,
- 631, 631, 631, 631, 631, 631, 631, 631,
- 631, 631, 631, 631, 631, 631, 631, 631,
- 631, 631, 631, 631, 631, 631, 631, 631,
- 631, 631, 631, 631, 631, 631, 631, 631,
- 631, 631, 631, 631, 631, 631, 631, 631,
- 631, 631, 631, 631, 631, 631, 631, 631,
- 631, 631, 631, 631, 631, 631, 631, 631,
- 631, 631, 631, 631, 631, 631, 631, 631,
-
- 631, 631, 631, 631, 1239, 631, 631, 631,
-
- // 0x3100 - 0x12000
-
- 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271,
- 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271,
- 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271,
- 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271,
- 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271,
- 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271,
- 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271,
- 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271,
- 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271,
- 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271,
- 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271,
- 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271,
- 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271,
- 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271,
- 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271,
-
- 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271,
- 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271,
- 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271,
- 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271,
- 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271,
- 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271,
- 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271,
- 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271,
- 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271,
- 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271,
- 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271,
- 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271,
- 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1527,
- 1783, 1271, 2039, 2295, 2551, 1271, 1271, 1271,
- 1271, 1271, 1271, 1271, 1271, 1271, 1271,
-
-
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
-
- 0x0, 0xa9, 0x194, 0x1d5, 0x20e, 0xffff, 0x267, 0x2a8,
- 0x305, 0x372, 0x3a3, 0x3b0, 0x3bd, 0xffff, 0xffff, 0x408,
- 0xffff, 0x425, 0xffff, 0x43e, 0x45b, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0x47c, 0xffff, 0xffff, 0xffff, 0xffff,
-
- 0xffff, 0xffff, 0xffff, 0x485, 0x4da, 0x4df, 0x4e4, 0x4ed,
- 0x51a, 0xffff, 0xffff, 0xffff, 0xffff, 0x52f, 0x548, 0xffff,
- 0x54d, 0x55a, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0x57d, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
-
- 0xffff, 0xffff, 0x5d6, 0xffff, 0xffff, 0x611, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
-
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0x690, 0x693, 0x6a0, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
-
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0x6a3, 0xffff, 0xffff, 0xffff,
-
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0x6aa, 0xffff,
-
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0x6ad,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
-
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0x6b0, 0xffff,
-
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0x6b3, 0x6b6,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
-
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0x6b9, 0xffff,
-
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0x6be,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
-
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0x6c3, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
-
- 0xffff, 0xffff, 0x6c6, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0x6c9, 0x6d0, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
-
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0x6d3, 0xffff,
-
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0x6d8,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
-
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0x6db, 0xffff, 0xffff, 0xffff, 0xffff, 0x6e0,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0x6e3,
-
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0x6e6, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
-
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0x6e9, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
-
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0x700, 0x761, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
-
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
-
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0x776, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
-
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0x783,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
-
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0x78c, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0x791,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
-
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0x796, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0x79b, 0xffff, 0xffff, 0x7a0, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
-
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0x7a5,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
- 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff
-};
-
-#define GET_LIGATURE_INDEX(ucs4) \
- (ucs4 < 0x3100 \
- ? (uc_ligature_trie[uc_ligature_trie[ucs4>>5] + (ucs4 & 0x1f)]) \
- : (ucs4 < 0x12000 \
- ? uc_ligature_trie[uc_ligature_trie[((ucs4 - 0x3100)>>8) + 0x188] + (ucs4 & 0xff)] \
- : 0xffff))
-
-static const unsigned short uc_ligature_map[] = {
- 0x54, 0x41, 0xc0, 0x45, 0xc8, 0x49, 0xcc, 0x4e,
- 0x1f8, 0x4f, 0xd2, 0x55, 0xd9, 0x57, 0x1e80, 0x59,
- 0x1ef2, 0x61, 0xe0, 0x65, 0xe8, 0x69, 0xec, 0x6e,
- 0x1f9, 0x6f, 0xf2, 0x75, 0xf9, 0x77, 0x1e81, 0x79,
- 0x1ef3, 0xa8, 0x1fed, 0xc2, 0x1ea6, 0xca, 0x1ec0, 0xd4,
- 0x1ed2, 0xdc, 0x1db, 0xe2, 0x1ea7, 0xea, 0x1ec1, 0xf4,
- 0x1ed3, 0xfc, 0x1dc, 0x102, 0x1eb0, 0x103, 0x1eb1, 0x112,
- 0x1e14, 0x113, 0x1e15, 0x14c, 0x1e50, 0x14d, 0x1e51, 0x1a0,
- 0x1edc, 0x1a1, 0x1edd, 0x1af, 0x1eea, 0x1b0, 0x1eeb, 0x391,
- 0x1fba, 0x395, 0x1fc8, 0x397, 0x1fca, 0x399, 0x1fda, 0x39f,
- 0x1ff8, 0x3a5, 0x1fea, 0x3a9, 0x1ffa, 0x3b1, 0x1f70, 0x3b5,
- 0x1f72, 0x3b7, 0x1f74, 0x3b9, 0x1f76, 0x3bf, 0x1f78, 0x3c5,
- 0x1f7a, 0x3c9, 0x1f7c, 0x3ca, 0x1fd2, 0x3cb, 0x1fe2, 0x415,
- 0x400, 0x418, 0x40d, 0x435, 0x450, 0x438, 0x45d, 0x1f00,
- 0x1f02, 0x1f01, 0x1f03, 0x1f08, 0x1f0a, 0x1f09, 0x1f0b, 0x1f10,
- 0x1f12, 0x1f11, 0x1f13, 0x1f18, 0x1f1a, 0x1f19, 0x1f1b, 0x1f20,
- 0x1f22, 0x1f21, 0x1f23, 0x1f28, 0x1f2a, 0x1f29, 0x1f2b, 0x1f30,
- 0x1f32, 0x1f31, 0x1f33, 0x1f38, 0x1f3a, 0x1f39, 0x1f3b, 0x1f40,
- 0x1f42, 0x1f41, 0x1f43, 0x1f48, 0x1f4a, 0x1f49, 0x1f4b, 0x1f50,
- 0x1f52, 0x1f51, 0x1f53, 0x1f59, 0x1f5b, 0x1f60, 0x1f62, 0x1f61,
- 0x1f63, 0x1f68, 0x1f6a, 0x1f69, 0x1f6b, 0x1fbf, 0x1fcd, 0x1ffe,
- 0x1fdd, 0x75, 0x41, 0xc1, 0x43, 0x106, 0x45, 0xc9,
- 0x47, 0x1f4, 0x49, 0xcd, 0x4b, 0x1e30, 0x4c, 0x139,
- 0x4d, 0x1e3e, 0x4e, 0x143, 0x4f, 0xd3, 0x50, 0x1e54,
- 0x52, 0x154, 0x53, 0x15a, 0x55, 0xda, 0x57, 0x1e82,
- 0x59, 0xdd, 0x5a, 0x179, 0x61, 0xe1, 0x63, 0x107,
- 0x65, 0xe9, 0x67, 0x1f5, 0x69, 0xed, 0x6b, 0x1e31,
- 0x6c, 0x13a, 0x6d, 0x1e3f, 0x6e, 0x144, 0x6f, 0xf3,
- 0x70, 0x1e55, 0x72, 0x155, 0x73, 0x15b, 0x75, 0xfa,
- 0x77, 0x1e83, 0x79, 0xfd, 0x7a, 0x17a, 0xa8, 0x385,
- 0xc2, 0x1ea4, 0xc5, 0x1fa, 0xc6, 0x1fc, 0xc7, 0x1e08,
- 0xca, 0x1ebe, 0xcf, 0x1e2e, 0xd4, 0x1ed0, 0xd5, 0x1e4c,
- 0xd8, 0x1fe, 0xdc, 0x1d7, 0xe2, 0x1ea5, 0xe5, 0x1fb,
- 0xe6, 0x1fd, 0xe7, 0x1e09, 0xea, 0x1ebf, 0xef, 0x1e2f,
- 0xf4, 0x1ed1, 0xf5, 0x1e4d, 0xf8, 0x1ff, 0xfc, 0x1d8,
- 0x102, 0x1eae, 0x103, 0x1eaf, 0x112, 0x1e16, 0x113, 0x1e17,
- 0x14c, 0x1e52, 0x14d, 0x1e53, 0x168, 0x1e78, 0x169, 0x1e79,
- 0x1a0, 0x1eda, 0x1a1, 0x1edb, 0x1af, 0x1ee8, 0x1b0, 0x1ee9,
- 0x391, 0x386, 0x395, 0x388, 0x397, 0x389, 0x399, 0x38a,
- 0x39f, 0x38c, 0x3a5, 0x38e, 0x3a9, 0x38f, 0x3b1, 0x3ac,
- 0x3b5, 0x3ad, 0x3b7, 0x3ae, 0x3b9, 0x3af, 0x3bf, 0x3cc,
- 0x3c5, 0x3cd, 0x3c9, 0x3ce, 0x3ca, 0x390, 0x3cb, 0x3b0,
- 0x3d2, 0x3d3, 0x413, 0x403, 0x41a, 0x40c, 0x433, 0x453,
- 0x43a, 0x45c, 0x1f00, 0x1f04, 0x1f01, 0x1f05, 0x1f08, 0x1f0c,
- 0x1f09, 0x1f0d, 0x1f10, 0x1f14, 0x1f11, 0x1f15, 0x1f18, 0x1f1c,
- 0x1f19, 0x1f1d, 0x1f20, 0x1f24, 0x1f21, 0x1f25, 0x1f28, 0x1f2c,
- 0x1f29, 0x1f2d, 0x1f30, 0x1f34, 0x1f31, 0x1f35, 0x1f38, 0x1f3c,
- 0x1f39, 0x1f3d, 0x1f40, 0x1f44, 0x1f41, 0x1f45, 0x1f48, 0x1f4c,
- 0x1f49, 0x1f4d, 0x1f50, 0x1f54, 0x1f51, 0x1f55, 0x1f59, 0x1f5d,
- 0x1f60, 0x1f64, 0x1f61, 0x1f65, 0x1f68, 0x1f6c, 0x1f69, 0x1f6d,
- 0x1fbf, 0x1fce, 0x1ffe, 0x1fde, 0x20, 0x41, 0xc2, 0x43,
- 0x108, 0x45, 0xca, 0x47, 0x11c, 0x48, 0x124, 0x49,
- 0xce, 0x4a, 0x134, 0x4f, 0xd4, 0x53, 0x15c, 0x55,
- 0xdb, 0x57, 0x174, 0x59, 0x176, 0x5a, 0x1e90, 0x61,
- 0xe2, 0x63, 0x109, 0x65, 0xea, 0x67, 0x11d, 0x68,
- 0x125, 0x69, 0xee, 0x6a, 0x135, 0x6f, 0xf4, 0x73,
- 0x15d, 0x75, 0xfb, 0x77, 0x175, 0x79, 0x177, 0x7a,
- 0x1e91, 0x1ea0, 0x1eac, 0x1ea1, 0x1ead, 0x1eb8, 0x1ec6, 0x1eb9,
- 0x1ec7, 0x1ecc, 0x1ed8, 0x1ecd, 0x1ed9, 0x1c, 0x41, 0xc3,
- 0x45, 0x1ebc, 0x49, 0x128, 0x4e, 0xd1, 0x4f, 0xd5,
- 0x55, 0x168, 0x56, 0x1e7c, 0x59, 0x1ef8, 0x61, 0xe3,
- 0x65, 0x1ebd, 0x69, 0x129, 0x6e, 0xf1, 0x6f, 0xf5,
- 0x75, 0x169, 0x76, 0x1e7d, 0x79, 0x1ef9, 0xc2, 0x1eaa,
- 0xca, 0x1ec4, 0xd4, 0x1ed6, 0xe2, 0x1eab, 0xea, 0x1ec5,
- 0xf4, 0x1ed7, 0x102, 0x1eb4, 0x103, 0x1eb5, 0x1a0, 0x1ee0,
- 0x1a1, 0x1ee1, 0x1af, 0x1eee, 0x1b0, 0x1eef, 0x2c, 0x41,
- 0x100, 0x45, 0x112, 0x47, 0x1e20, 0x49, 0x12a, 0x4f,
- 0x14c, 0x55, 0x16a, 0x59, 0x232, 0x61, 0x101, 0x65,
- 0x113, 0x67, 0x1e21, 0x69, 0x12b, 0x6f, 0x14d, 0x75,
- 0x16b, 0x79, 0x233, 0xc4, 0x1de, 0xc6, 0x1e2, 0xd5,
- 0x22c, 0xd6, 0x22a, 0xdc, 0x1d5, 0xe4, 0x1df, 0xe6,
- 0x1e3, 0xf5, 0x22d, 0xf6, 0x22b, 0xfc, 0x1d6, 0x1ea,
- 0x1ec, 0x1eb, 0x1ed, 0x226, 0x1e0, 0x227, 0x1e1, 0x22e,
- 0x230, 0x22f, 0x231, 0x391, 0x1fb9, 0x399, 0x1fd9, 0x3a5,
- 0x1fe9, 0x3b1, 0x1fb1, 0x3b9, 0x1fd1, 0x3c5, 0x1fe1, 0x418,
- 0x4e2, 0x423, 0x4ee, 0x438, 0x4e3, 0x443, 0x4ef, 0x1e36,
- 0x1e38, 0x1e37, 0x1e39, 0x1e5a, 0x1e5c, 0x1e5b, 0x1e5d, 0x20,
- 0x41, 0x102, 0x45, 0x114, 0x47, 0x11e, 0x49, 0x12c,
- 0x4f, 0x14e, 0x55, 0x16c, 0x61, 0x103, 0x65, 0x115,
- 0x67, 0x11f, 0x69, 0x12d, 0x6f, 0x14f, 0x75, 0x16d,
- 0x228, 0x1e1c, 0x229, 0x1e1d, 0x391, 0x1fb8, 0x399, 0x1fd8,
- 0x3a5, 0x1fe8, 0x3b1, 0x1fb0, 0x3b9, 0x1fd0, 0x3c5, 0x1fe0,
- 0x410, 0x4d0, 0x415, 0x4d6, 0x416, 0x4c1, 0x418, 0x419,
- 0x423, 0x40e, 0x430, 0x4d1, 0x435, 0x4d7, 0x436, 0x4c2,
- 0x438, 0x439, 0x443, 0x45e, 0x1ea0, 0x1eb6, 0x1ea1, 0x1eb7,
- 0x2e, 0x41, 0x226, 0x42, 0x1e02, 0x43, 0x10a, 0x44,
- 0x1e0a, 0x45, 0x116, 0x46, 0x1e1e, 0x47, 0x120, 0x48,
- 0x1e22, 0x49, 0x130, 0x4d, 0x1e40, 0x4e, 0x1e44, 0x4f,
- 0x22e, 0x50, 0x1e56, 0x52, 0x1e58, 0x53, 0x1e60, 0x54,
- 0x1e6a, 0x57, 0x1e86, 0x58, 0x1e8a, 0x59, 0x1e8e, 0x5a,
- 0x17b, 0x61, 0x227, 0x62, 0x1e03, 0x63, 0x10b, 0x64,
- 0x1e0b, 0x65, 0x117, 0x66, 0x1e1f, 0x67, 0x121, 0x68,
- 0x1e23, 0x6d, 0x1e41, 0x6e, 0x1e45, 0x6f, 0x22f, 0x70,
- 0x1e57, 0x72, 0x1e59, 0x73, 0x1e61, 0x74, 0x1e6b, 0x77,
- 0x1e87, 0x78, 0x1e8b, 0x79, 0x1e8f, 0x7a, 0x17c, 0x15a,
- 0x1e64, 0x15b, 0x1e65, 0x160, 0x1e66, 0x161, 0x1e67, 0x17f,
- 0x1e9b, 0x1e62, 0x1e68, 0x1e63, 0x1e69, 0x36, 0x41, 0xc4,
- 0x45, 0xcb, 0x48, 0x1e26, 0x49, 0xcf, 0x4f, 0xd6,
- 0x55, 0xdc, 0x57, 0x1e84, 0x58, 0x1e8c, 0x59, 0x178,
- 0x61, 0xe4, 0x65, 0xeb, 0x68, 0x1e27, 0x69, 0xef,
- 0x6f, 0xf6, 0x74, 0x1e97, 0x75, 0xfc, 0x77, 0x1e85,
- 0x78, 0x1e8d, 0x79, 0xff, 0xd5, 0x1e4e, 0xf5, 0x1e4f,
- 0x16a, 0x1e7a, 0x16b, 0x1e7b, 0x399, 0x3aa, 0x3a5, 0x3ab,
- 0x3b9, 0x3ca, 0x3c5, 0x3cb, 0x3d2, 0x3d4, 0x406, 0x407,
- 0x410, 0x4d2, 0x415, 0x401, 0x416, 0x4dc, 0x417, 0x4de,
- 0x418, 0x4e4, 0x41e, 0x4e6, 0x423, 0x4f0, 0x427, 0x4f4,
- 0x42b, 0x4f8, 0x42d, 0x4ec, 0x430, 0x4d3, 0x435, 0x451,
- 0x436, 0x4dd, 0x437, 0x4df, 0x438, 0x4e5, 0x43e, 0x4e7,
- 0x443, 0x4f1, 0x447, 0x4f5, 0x44b, 0x4f9, 0x44d, 0x4ed,
- 0x456, 0x457, 0x4d8, 0x4da, 0x4d9, 0x4db, 0x4e8, 0x4ea,
- 0x4e9, 0x4eb, 0x18, 0x41, 0x1ea2, 0x45, 0x1eba, 0x49,
- 0x1ec8, 0x4f, 0x1ece, 0x55, 0x1ee6, 0x59, 0x1ef6, 0x61,
- 0x1ea3, 0x65, 0x1ebb, 0x69, 0x1ec9, 0x6f, 0x1ecf, 0x75,
- 0x1ee7, 0x79, 0x1ef7, 0xc2, 0x1ea8, 0xca, 0x1ec2, 0xd4,
- 0x1ed4, 0xe2, 0x1ea9, 0xea, 0x1ec3, 0xf4, 0x1ed5, 0x102,
- 0x1eb2, 0x103, 0x1eb3, 0x1a0, 0x1ede, 0x1a1, 0x1edf, 0x1af,
- 0x1eec, 0x1b0, 0x1eed, 0x6, 0x41, 0xc5, 0x55, 0x16e,
- 0x61, 0xe5, 0x75, 0x16f, 0x77, 0x1e98, 0x79, 0x1e99,
- 0x6, 0x4f, 0x150, 0x55, 0x170, 0x6f, 0x151, 0x75,
- 0x171, 0x423, 0x4f2, 0x443, 0x4f3, 0x25, 0x41, 0x1cd,
- 0x43, 0x10c, 0x44, 0x10e, 0x45, 0x11a, 0x47, 0x1e6,
- 0x48, 0x21e, 0x49, 0x1cf, 0x4b, 0x1e8, 0x4c, 0x13d,
- 0x4e, 0x147, 0x4f, 0x1d1, 0x52, 0x158, 0x53, 0x160,
- 0x54, 0x164, 0x55, 0x1d3, 0x5a, 0x17d, 0x61, 0x1ce,
- 0x63, 0x10d, 0x64, 0x10f, 0x65, 0x11b, 0x67, 0x1e7,
- 0x68, 0x21f, 0x69, 0x1d0, 0x6a, 0x1f0, 0x6b, 0x1e9,
- 0x6c, 0x13e, 0x6e, 0x148, 0x6f, 0x1d2, 0x72, 0x159,
- 0x73, 0x161, 0x74, 0x165, 0x75, 0x1d4, 0x7a, 0x17e,
- 0xdc, 0x1d9, 0xfc, 0x1da, 0x1b7, 0x1ee, 0x292, 0x1ef,
- 0xe, 0x41, 0x200, 0x45, 0x204, 0x49, 0x208, 0x4f,
- 0x20c, 0x52, 0x210, 0x55, 0x214, 0x61, 0x201, 0x65,
- 0x205, 0x69, 0x209, 0x6f, 0x20d, 0x72, 0x211, 0x75,
- 0x215, 0x474, 0x476, 0x475, 0x477, 0xc, 0x41, 0x202,
- 0x45, 0x206, 0x49, 0x20a, 0x4f, 0x20e, 0x52, 0x212,
- 0x55, 0x216, 0x61, 0x203, 0x65, 0x207, 0x69, 0x20b,
- 0x6f, 0x20f, 0x72, 0x213, 0x75, 0x217, 0xe, 0x391,
- 0x1f08, 0x395, 0x1f18, 0x397, 0x1f28, 0x399, 0x1f38, 0x39f,
- 0x1f48, 0x3a9, 0x1f68, 0x3b1, 0x1f00, 0x3b5, 0x1f10, 0x3b7,
- 0x1f20, 0x3b9, 0x1f30, 0x3bf, 0x1f40, 0x3c1, 0x1fe4, 0x3c5,
- 0x1f50, 0x3c9, 0x1f60, 0x10, 0x391, 0x1f09, 0x395, 0x1f19,
- 0x397, 0x1f29, 0x399, 0x1f39, 0x39f, 0x1f49, 0x3a1, 0x1fec,
- 0x3a5, 0x1f59, 0x3a9, 0x1f69, 0x3b1, 0x1f01, 0x3b5, 0x1f11,
- 0x3b7, 0x1f21, 0x3b9, 0x1f31, 0x3bf, 0x1f41, 0x3c1, 0x1fe5,
- 0x3c5, 0x1f51, 0x3c9, 0x1f61, 0x4, 0x4f, 0x1a0, 0x55,
- 0x1af, 0x6f, 0x1a1, 0x75, 0x1b0, 0x2a, 0x41, 0x1ea0,
- 0x42, 0x1e04, 0x44, 0x1e0c, 0x45, 0x1eb8, 0x48, 0x1e24,
- 0x49, 0x1eca, 0x4b, 0x1e32, 0x4c, 0x1e36, 0x4d, 0x1e42,
- 0x4e, 0x1e46, 0x4f, 0x1ecc, 0x52, 0x1e5a, 0x53, 0x1e62,
- 0x54, 0x1e6c, 0x55, 0x1ee4, 0x56, 0x1e7e, 0x57, 0x1e88,
- 0x59, 0x1ef4, 0x5a, 0x1e92, 0x61, 0x1ea1, 0x62, 0x1e05,
- 0x64, 0x1e0d, 0x65, 0x1eb9, 0x68, 0x1e25, 0x69, 0x1ecb,
- 0x6b, 0x1e33, 0x6c, 0x1e37, 0x6d, 0x1e43, 0x6e, 0x1e47,
- 0x6f, 0x1ecd, 0x72, 0x1e5b, 0x73, 0x1e63, 0x74, 0x1e6d,
- 0x75, 0x1ee5, 0x76, 0x1e7f, 0x77, 0x1e89, 0x79, 0x1ef5,
- 0x7a, 0x1e93, 0x1a0, 0x1ee2, 0x1a1, 0x1ee3, 0x1af, 0x1ef0,
- 0x1b0, 0x1ef1, 0x2, 0x55, 0x1e72, 0x75, 0x1e73, 0x2,
- 0x41, 0x1e00, 0x61, 0x1e01, 0x4, 0x53, 0x218, 0x54,
- 0x21a, 0x73, 0x219, 0x74, 0x21b, 0x16, 0x43, 0xc7,
- 0x44, 0x1e10, 0x45, 0x228, 0x47, 0x122, 0x48, 0x1e28,
- 0x4b, 0x136, 0x4c, 0x13b, 0x4e, 0x145, 0x52, 0x156,
- 0x53, 0x15e, 0x54, 0x162, 0x63, 0xe7, 0x64, 0x1e11,
- 0x65, 0x229, 0x67, 0x123, 0x68, 0x1e29, 0x6b, 0x137,
- 0x6c, 0x13c, 0x6e, 0x146, 0x72, 0x157, 0x73, 0x15f,
- 0x74, 0x163, 0xa, 0x41, 0x104, 0x45, 0x118, 0x49,
- 0x12e, 0x4f, 0x1ea, 0x55, 0x172, 0x61, 0x105, 0x65,
- 0x119, 0x69, 0x12f, 0x6f, 0x1eb, 0x75, 0x173, 0xc,
- 0x44, 0x1e12, 0x45, 0x1e18, 0x4c, 0x1e3c, 0x4e, 0x1e4a,
- 0x54, 0x1e70, 0x55, 0x1e76, 0x64, 0x1e13, 0x65, 0x1e19,
- 0x6c, 0x1e3d, 0x6e, 0x1e4b, 0x74, 0x1e71, 0x75, 0x1e77,
- 0x2, 0x48, 0x1e2a, 0x68, 0x1e2b, 0x6, 0x45, 0x1e1a,
- 0x49, 0x1e2c, 0x55, 0x1e74, 0x65, 0x1e1b, 0x69, 0x1e2d,
- 0x75, 0x1e75, 0x11, 0x42, 0x1e06, 0x44, 0x1e0e, 0x4b,
- 0x1e34, 0x4c, 0x1e3a, 0x4e, 0x1e48, 0x52, 0x1e5e, 0x54,
- 0x1e6e, 0x5a, 0x1e94, 0x62, 0x1e07, 0x64, 0x1e0f, 0x68,
- 0x1e96, 0x6b, 0x1e35, 0x6c, 0x1e3b, 0x6e, 0x1e49, 0x72,
- 0x1e5f, 0x74, 0x1e6f, 0x7a, 0x1e95, 0x2c, 0x3c, 0x226e,
- 0x3d, 0x2260, 0x3e, 0x226f, 0x2190, 0x219a, 0x2192, 0x219b,
- 0x2194, 0x21ae, 0x21d0, 0x21cd, 0x21d2, 0x21cf, 0x21d4, 0x21ce,
- 0x2203, 0x2204, 0x2208, 0x2209, 0x220b, 0x220c, 0x2223, 0x2224,
- 0x2225, 0x2226, 0x223c, 0x2241, 0x2243, 0x2244, 0x2245, 0x2247,
- 0x2248, 0x2249, 0x224d, 0x226d, 0x2261, 0x2262, 0x2264, 0x2270,
- 0x2265, 0x2271, 0x2272, 0x2274, 0x2273, 0x2275, 0x2276, 0x2278,
- 0x2277, 0x2279, 0x227a, 0x2280, 0x227b, 0x2281, 0x227c, 0x22e0,
- 0x227d, 0x22e1, 0x2282, 0x2284, 0x2283, 0x2285, 0x2286, 0x2288,
- 0x2287, 0x2289, 0x2291, 0x22e2, 0x2292, 0x22e3, 0x22a2, 0x22ac,
- 0x22a8, 0x22ad, 0x22a9, 0x22ae, 0x22ab, 0x22af, 0x22b2, 0x22ea,
- 0x22b3, 0x22eb, 0x22b4, 0x22ec, 0x22b5, 0x22ed, 0x1d, 0xa8,
- 0x1fc1, 0x3b1, 0x1fb6, 0x3b7, 0x1fc6, 0x3b9, 0x1fd6, 0x3c5,
- 0x1fe6, 0x3c9, 0x1ff6, 0x3ca, 0x1fd7, 0x3cb, 0x1fe7, 0x1f00,
- 0x1f06, 0x1f01, 0x1f07, 0x1f08, 0x1f0e, 0x1f09, 0x1f0f, 0x1f20,
- 0x1f26, 0x1f21, 0x1f27, 0x1f28, 0x1f2e, 0x1f29, 0x1f2f, 0x1f30,
- 0x1f36, 0x1f31, 0x1f37, 0x1f38, 0x1f3e, 0x1f39, 0x1f3f, 0x1f50,
- 0x1f56, 0x1f51, 0x1f57, 0x1f59, 0x1f5f, 0x1f60, 0x1f66, 0x1f61,
- 0x1f67, 0x1f68, 0x1f6e, 0x1f69, 0x1f6f, 0x1fbf, 0x1fcf, 0x1ffe,
- 0x1fdf, 0x3f, 0x391, 0x1fbc, 0x397, 0x1fcc, 0x3a9, 0x1ffc,
- 0x3ac, 0x1fb4, 0x3ae, 0x1fc4, 0x3b1, 0x1fb3, 0x3b7, 0x1fc3,
- 0x3c9, 0x1ff3, 0x3ce, 0x1ff4, 0x1f00, 0x1f80, 0x1f01, 0x1f81,
- 0x1f02, 0x1f82, 0x1f03, 0x1f83, 0x1f04, 0x1f84, 0x1f05, 0x1f85,
- 0x1f06, 0x1f86, 0x1f07, 0x1f87, 0x1f08, 0x1f88, 0x1f09, 0x1f89,
- 0x1f0a, 0x1f8a, 0x1f0b, 0x1f8b, 0x1f0c, 0x1f8c, 0x1f0d, 0x1f8d,
- 0x1f0e, 0x1f8e, 0x1f0f, 0x1f8f, 0x1f20, 0x1f90, 0x1f21, 0x1f91,
- 0x1f22, 0x1f92, 0x1f23, 0x1f93, 0x1f24, 0x1f94, 0x1f25, 0x1f95,
- 0x1f26, 0x1f96, 0x1f27, 0x1f97, 0x1f28, 0x1f98, 0x1f29, 0x1f99,
- 0x1f2a, 0x1f9a, 0x1f2b, 0x1f9b, 0x1f2c, 0x1f9c, 0x1f2d, 0x1f9d,
- 0x1f2e, 0x1f9e, 0x1f2f, 0x1f9f, 0x1f60, 0x1fa0, 0x1f61, 0x1fa1,
- 0x1f62, 0x1fa2, 0x1f63, 0x1fa3, 0x1f64, 0x1fa4, 0x1f65, 0x1fa5,
- 0x1f66, 0x1fa6, 0x1f67, 0x1fa7, 0x1f68, 0x1fa8, 0x1f69, 0x1fa9,
- 0x1f6a, 0x1faa, 0x1f6b, 0x1fab, 0x1f6c, 0x1fac, 0x1f6d, 0x1fad,
- 0x1f6e, 0x1fae, 0x1f6f, 0x1faf, 0x1f70, 0x1fb2, 0x1f74, 0x1fc2,
- 0x1f7c, 0x1ff2, 0x1fb6, 0x1fb7, 0x1fc6, 0x1fc7, 0x1ff6, 0x1ff7,
- 0x1, 0x627, 0x622, 0x6, 0x627, 0x623, 0x648, 0x624,
- 0x64a, 0x626, 0x6c1, 0x6c2, 0x6d2, 0x6d3, 0x6d5, 0x6c0,
- 0x1, 0x627, 0x625, 0x3, 0x928, 0x929, 0x930, 0x931,
- 0x933, 0x934, 0x1, 0x9c7, 0x9cb, 0x1, 0x9c7, 0x9cc,
- 0x1, 0xb47, 0xb4b, 0x1, 0xb47, 0xb48, 0x1, 0xb47,
- 0xb4c, 0x2, 0xbc6, 0xbca, 0xbc7, 0xbcb, 0x2, 0xb92,
- 0xb94, 0xbc6, 0xbcc, 0x1, 0xc46, 0xc48, 0x1, 0xcc6,
- 0xcca, 0x3, 0xcbf, 0xcc0, 0xcc6, 0xcc7, 0xcca, 0xccb,
- 0x1, 0xcc6, 0xcc8, 0x2, 0xd46, 0xd4a, 0xd47, 0xd4b,
- 0x1, 0xd46, 0xd4c, 0x2, 0xdd9, 0xdda, 0xddc, 0xddd,
- 0x1, 0xdd9, 0xddc, 0x1, 0xdd9, 0xdde, 0x1, 0x1025,
- 0x1026, 0xb, 0x1b05, 0x1b06, 0x1b07, 0x1b08, 0x1b09, 0x1b0a,
- 0x1b0b, 0x1b0c, 0x1b0d, 0x1b0e, 0x1b11, 0x1b12, 0x1b3a, 0x1b3b,
- 0x1b3c, 0x1b3d, 0x1b3e, 0x1b40, 0x1b3f, 0x1b41, 0x1b42, 0x1b43,
- 0x30, 0x3046, 0x3094, 0x304b, 0x304c, 0x304d, 0x304e, 0x304f,
- 0x3050, 0x3051, 0x3052, 0x3053, 0x3054, 0x3055, 0x3056, 0x3057,
- 0x3058, 0x3059, 0x305a, 0x305b, 0x305c, 0x305d, 0x305e, 0x305f,
- 0x3060, 0x3061, 0x3062, 0x3064, 0x3065, 0x3066, 0x3067, 0x3068,
- 0x3069, 0x306f, 0x3070, 0x3072, 0x3073, 0x3075, 0x3076, 0x3078,
- 0x3079, 0x307b, 0x307c, 0x309d, 0x309e, 0x30a6, 0x30f4, 0x30ab,
- 0x30ac, 0x30ad, 0x30ae, 0x30af, 0x30b0, 0x30b1, 0x30b2, 0x30b3,
- 0x30b4, 0x30b5, 0x30b6, 0x30b7, 0x30b8, 0x30b9, 0x30ba, 0x30bb,
- 0x30bc, 0x30bd, 0x30be, 0x30bf, 0x30c0, 0x30c1, 0x30c2, 0x30c4,
- 0x30c5, 0x30c6, 0x30c7, 0x30c8, 0x30c9, 0x30cf, 0x30d0, 0x30d2,
- 0x30d3, 0x30d5, 0x30d6, 0x30d8, 0x30d9, 0x30db, 0x30dc, 0x30ef,
- 0x30f7, 0x30f0, 0x30f8, 0x30f1, 0x30f9, 0x30f2, 0x30fa, 0x30fd,
- 0x30fe, 0xa, 0x306f, 0x3071, 0x3072, 0x3074, 0x3075, 0x3077,
- 0x3078, 0x307a, 0x307b, 0x307d, 0x30cf, 0x30d1, 0x30d2, 0x30d4,
- 0x30d5, 0x30d7, 0x30d8, 0x30da, 0x30db, 0x30dd, 0x3, 0xd804,
- 0xdc99, 0xd804, 0xdc9a, 0xd804, 0xdc9b, 0xd804, 0xdc9c, 0xd804,
- 0xdca5, 0xd804, 0xdcab, 0x2, 0xd804, 0xdd31, 0xd804, 0xdd2e,
- 0xd804, 0xdd32, 0xd804, 0xdd2f, 0x1, 0xd804, 0xdf47, 0xd804,
- 0xdf4b, 0x1, 0xd804, 0xdf47, 0xd804, 0xdf4c, 0x1, 0xd805,
- 0xdcb9, 0xd805, 0xdcbc, 0x1, 0xd805, 0xdcb9, 0xd805, 0xdcbb,
- 0x1, 0xd805, 0xdcb9, 0xd805, 0xdcbe, 0x2, 0xd805, 0xddb8,
- 0xd805, 0xddba, 0xd805, 0xddb9, 0xd805, 0xddbb
-};
-
-
-struct NormalizationCorrection {
- uint ucs4;
- uint old_mapping;
- int version;
-};
-
-static const NormalizationCorrection uc_normalization_corrections[] = {
- { 0xf951, 0x96fb, 6 },
- { 0x2f868, 0x2136a, 7 },
- { 0x2f874, 0x5f33, 7 },
- { 0x2f91f, 0x43ab, 7 },
- { 0x2f95f, 0x7aae, 7 },
- { 0x2f9bf, 0x4d57, 7 }
-};
-
-enum { NumNormalizationCorrections = 6 };
-enum { NormalizationCorrectionsVersionMax = 7 };
-
-} // namespace QUnicodeTables
-
-using namespace QUnicodeTables;
-
-QT_END_NAMESPACE
diff --git a/src/corelib/tools/qunicodetables_p.h b/src/corelib/tools/qunicodetables_p.h
deleted file mode 100644
index 3f2e91a9b2..0000000000
--- a/src/corelib/tools/qunicodetables_p.h
+++ /dev/null
@@ -1,232 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-/* This file is autogenerated from the Unicode 10.0 database. Do not edit */
-
-//
-// W A R N I N G
-// -------------
-//
-// This file is not part of the Qt API. It exists for the convenience
-// of internal files. This header file may change from version to version
-// without notice, or even be removed.
-//
-// We mean it.
-//
-
-#ifndef QUNICODETABLES_P_H
-#define QUNICODETABLES_P_H
-
-#include <QtCore/private/qglobal_p.h>
-
-#include <QtCore/qchar.h>
-
-QT_BEGIN_NAMESPACE
-
-#define UNICODE_DATA_VERSION QChar::Unicode_10_0
-
-namespace QUnicodeTables {
-
-struct Properties {
- ushort category : 8; /* 5 used */
- ushort direction : 8; /* 5 used */
- ushort combiningClass : 8;
- ushort joining : 3;
- signed short digitValue : 5;
- signed short mirrorDiff : 16;
- ushort lowerCaseSpecial : 1;
- signed short lowerCaseDiff : 15;
-#ifdef Q_OS_WASM
- unsigned char : 0; //wasm 64 packing trick
-#endif
- ushort upperCaseSpecial : 1;
- signed short upperCaseDiff : 15;
- ushort titleCaseSpecial : 1;
- signed short titleCaseDiff : 15;
- ushort caseFoldSpecial : 1;
- signed short caseFoldDiff : 15;
- ushort unicodeVersion : 8; /* 5 used */
- ushort nfQuickCheck : 8;
-#ifdef Q_OS_WASM
- unsigned char : 0; //wasm 64 packing trick
-#endif
- ushort graphemeBreakClass : 5; /* 5 used */
- ushort wordBreakClass : 5; /* 5 used */
- ushort sentenceBreakClass : 8; /* 4 used */
- ushort lineBreakClass : 6; /* 6 used */
- ushort script : 8;
-};
-
-Q_CORE_EXPORT const Properties * QT_FASTCALL properties(uint ucs4) Q_DECL_NOTHROW;
-Q_CORE_EXPORT const Properties * QT_FASTCALL properties(ushort ucs2) Q_DECL_NOTHROW;
-
-struct LowercaseTraits
-{
- static inline signed short caseDiff(const Properties *prop)
- { return prop->lowerCaseDiff; }
- static inline bool caseSpecial(const Properties *prop)
- { return prop->lowerCaseSpecial; }
-};
-
-struct UppercaseTraits
-{
- static inline signed short caseDiff(const Properties *prop)
- { return prop->upperCaseDiff; }
- static inline bool caseSpecial(const Properties *prop)
- { return prop->upperCaseSpecial; }
-};
-
-struct TitlecaseTraits
-{
- static inline signed short caseDiff(const Properties *prop)
- { return prop->titleCaseDiff; }
- static inline bool caseSpecial(const Properties *prop)
- { return prop->titleCaseSpecial; }
-};
-
-struct CasefoldTraits
-{
- static inline signed short caseDiff(const Properties *prop)
- { return prop->caseFoldDiff; }
- static inline bool caseSpecial(const Properties *prop)
- { return prop->caseFoldSpecial; }
-};
-
-enum GraphemeBreakClass {
- GraphemeBreak_Any,
- GraphemeBreak_CR,
- GraphemeBreak_LF,
- GraphemeBreak_Control,
- GraphemeBreak_Extend,
- GraphemeBreak_ZWJ,
- GraphemeBreak_RegionalIndicator,
- GraphemeBreak_Prepend,
- GraphemeBreak_SpacingMark,
- GraphemeBreak_L,
- GraphemeBreak_V,
- GraphemeBreak_T,
- GraphemeBreak_LV,
- GraphemeBreak_LVT,
- Graphemebreak_E_Base,
- Graphemebreak_E_Modifier,
- Graphemebreak_Glue_After_Zwj,
- Graphemebreak_E_Base_GAZ,
- NumGraphemeBreakClasses,
-};
-
-enum WordBreakClass {
- WordBreak_Any,
- WordBreak_CR,
- WordBreak_LF,
- WordBreak_Newline,
- WordBreak_Extend,
- WordBreak_ZWJ,
- WordBreak_Format,
- WordBreak_RegionalIndicator,
- WordBreak_Katakana,
- WordBreak_HebrewLetter,
- WordBreak_ALetter,
- WordBreak_SingleQuote,
- WordBreak_DoubleQuote,
- WordBreak_MidNumLet,
- WordBreak_MidLetter,
- WordBreak_MidNum,
- WordBreak_Numeric,
- WordBreak_ExtendNumLet,
- WordBreak_E_Base,
- WordBreak_E_Modifier,
- WordBreak_Glue_After_Zwj,
- WordBreak_E_Base_GAZ,
- NumWordBreakClasses,
-};
-
-enum SentenceBreakClass {
- SentenceBreak_Any,
- SentenceBreak_CR,
- SentenceBreak_LF,
- SentenceBreak_Sep,
- SentenceBreak_Extend,
- SentenceBreak_Sp,
- SentenceBreak_Lower,
- SentenceBreak_Upper,
- SentenceBreak_OLetter,
- SentenceBreak_Numeric,
- SentenceBreak_ATerm,
- SentenceBreak_SContinue,
- SentenceBreak_STerm,
- SentenceBreak_Close,
- NumSentenceBreakClasses
-};
-
-// see http://www.unicode.org/reports/tr14/tr14-30.html
-// we don't use the XX and AI classes and map them to AL instead.
-enum LineBreakClass {
- LineBreak_OP, LineBreak_CL, LineBreak_CP, LineBreak_QU, LineBreak_GL,
- LineBreak_NS, LineBreak_EX, LineBreak_SY, LineBreak_IS, LineBreak_PR,
- LineBreak_PO, LineBreak_NU, LineBreak_AL, LineBreak_HL, LineBreak_ID,
- LineBreak_IN, LineBreak_HY, LineBreak_BA, LineBreak_BB, LineBreak_B2,
- LineBreak_ZW, LineBreak_CM, LineBreak_WJ, LineBreak_H2, LineBreak_H3,
- LineBreak_JL, LineBreak_JV, LineBreak_JT, LineBreak_RI, LineBreak_CB,
- LineBreak_EB, LineBreak_EM, LineBreak_ZWJ,
- LineBreak_SA, LineBreak_SG, LineBreak_SP,
- LineBreak_CR, LineBreak_LF, LineBreak_BK,
- NumLineBreakClasses
-};
-
-Q_CORE_EXPORT GraphemeBreakClass QT_FASTCALL graphemeBreakClass(uint ucs4) Q_DECL_NOTHROW;
-inline GraphemeBreakClass graphemeBreakClass(QChar ch) Q_DECL_NOTHROW
-{ return graphemeBreakClass(ch.unicode()); }
-
-Q_CORE_EXPORT WordBreakClass QT_FASTCALL wordBreakClass(uint ucs4) Q_DECL_NOTHROW;
-inline WordBreakClass wordBreakClass(QChar ch) Q_DECL_NOTHROW
-{ return wordBreakClass(ch.unicode()); }
-
-Q_CORE_EXPORT SentenceBreakClass QT_FASTCALL sentenceBreakClass(uint ucs4) Q_DECL_NOTHROW;
-inline SentenceBreakClass sentenceBreakClass(QChar ch) Q_DECL_NOTHROW
-{ return sentenceBreakClass(ch.unicode()); }
-
-Q_CORE_EXPORT LineBreakClass QT_FASTCALL lineBreakClass(uint ucs4) Q_DECL_NOTHROW;
-inline LineBreakClass lineBreakClass(QChar ch) Q_DECL_NOTHROW
-{ return lineBreakClass(ch.unicode()); }
-
-} // namespace QUnicodeTables
-
-QT_END_NAMESPACE
-
-#endif // QUNICODETABLES_P_H
diff --git a/src/corelib/tools/qunicodetools.cpp b/src/corelib/tools/qunicodetools.cpp
deleted file mode 100644
index 0a2bea28e2..0000000000
--- a/src/corelib/tools/qunicodetools.cpp
+++ /dev/null
@@ -1,822 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#include "qunicodetools_p.h"
-
-#include "qunicodetables_p.h"
-#include "qvarlengtharray.h"
-
-#include "qharfbuzz_p.h"
-
-#define FLAG(x) (1 << (x))
-
-QT_BEGIN_NAMESPACE
-
-Q_AUTOTEST_EXPORT int qt_initcharattributes_default_algorithm_only = 0;
-
-namespace QUnicodeTools {
-
-// -----------------------------------------------------------------------------------------------------
-//
-// The text boundaries determination algorithm.
-// See http://www.unicode.org/reports/tr29/tr29-31.html
-//
-// -----------------------------------------------------------------------------------------------------
-
-namespace GB {
-
-/*
- * Most grapheme break rules can be implemented table driven, but rules GB10, GB12 and GB13 need a bit
- * of special treatment.
- */
-enum State : uchar {
- Break,
- Inside,
- GB10,
- GB10_2,
- GB10_3,
- GB13, // also covers GB12
-};
-
-static const State breakTable[QUnicodeTables::NumGraphemeBreakClasses][QUnicodeTables::NumGraphemeBreakClasses] = {
-// Any CR LF Control Extend ZWJ RI Prepend S-Mark L V T LV LVT E_B E_M GAZ EBG
- { Break , Break , Break , Break , Inside, Inside, Break , Break , Inside, Break , Break , Break , Break , Break , Break , Break , Break , Break }, // Any
- { Break , Break , Inside, Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break }, // CR
- { Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break }, // LF
- { Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break }, // Control
- { Break , Break , Break , Break , GB10_2, Inside, Break , Break , Inside, Break , Break , Break , Break , Break , Break , GB10_3, Break , Break }, // Extend
- { Break , Break , Break , Break , Inside, Inside, Break , Break , Inside, Break , Break , Break , Break , Break , Break , Break , Inside, Inside }, // ZWJ
- { Break , Break , Break , Break , Inside, Inside, GB13 , Break , Inside, Break , Break , Break , Break , Break , Break , Break , Break , Break }, // RegionalIndicator
- { Inside, Break , Break , Break , Inside, Inside, Inside, Inside, Inside, Inside, Inside, Inside, Inside, Inside, Inside, Inside, Inside, Inside }, // Prepend
- { Break , Break , Break , Break , Inside, Inside, Break , Break , Inside, Break , Break , Break , Break , Break , Break , Break , Break , Break }, // SpacingMark
- { Break , Break , Break , Break , Inside, Inside, Break , Break , Inside, Inside, Inside, Break , Inside, Inside, Break , Break , Break , Break }, // L
- { Break , Break , Break , Break , Inside, Inside, Break , Break , Inside, Break , Inside, Inside, Break , Break , Break , Break , Break , Break }, // V
- { Break , Break , Break , Break , Inside, Inside, Break , Break , Inside, Break , Break , Inside, Break , Break , Break , Break , Break , Break }, // T
- { Break , Break , Break , Break , Inside, Inside, Break , Break , Inside, Break , Inside, Inside, Break , Break , Break , Break , Break , Break }, // LV
- { Break , Break , Break , Break , Inside, Inside, Break , Break , Inside, Break , Break , Inside, Break , Break , Break , Break , Break , Break }, // LVT
- { Break , Break , Break , Break , GB10 , Inside, Break , Break , Inside, Break , Break , Break , Break , Break , Break , Inside, Break , Break }, // E_B
- { Break , Break , Break , Break , Inside, Inside, Break , Break , Inside, Break , Break , Break , Break , Break , Break , Break , Break , Break }, // E_M
- { Break , Break , Break , Break , Inside, Inside, Break , Break , Inside, Break , Break , Break , Break , Break , Break , Break , Break , Break }, // GAZ
- { Break , Break , Break , Break , GB10 , Inside, Break , Break , Inside, Break , Break , Break , Break , Break , Break , Inside, Break , Break }, // EBG
-};
-
-} // namespace GB
-
-static void getGraphemeBreaks(const ushort *string, quint32 len, QCharAttributes *attributes)
-{
- QUnicodeTables::GraphemeBreakClass lcls = QUnicodeTables::GraphemeBreak_LF; // to meet GB1
- GB::State state = GB::Break; // only required to track some of the rules
- for (quint32 i = 0; i != len; ++i) {
- quint32 pos = i;
- uint ucs4 = string[i];
- if (QChar::isHighSurrogate(ucs4) && i + 1 != len) {
- ushort low = string[i + 1];
- if (QChar::isLowSurrogate(low)) {
- ucs4 = QChar::surrogateToUcs4(ucs4, low);
- ++i;
- }
- }
-
- const QUnicodeTables::Properties *prop = QUnicodeTables::properties(ucs4);
- QUnicodeTables::GraphemeBreakClass cls = (QUnicodeTables::GraphemeBreakClass) prop->graphemeBreakClass;
-
- switch (GB::breakTable[lcls][cls]) {
- case GB::Break:
- attributes[pos].graphemeBoundary = true;
- state = GB::Break;
- break;
- case GB::Inside:
- state = GB::Break;
- break;
- case GB::GB10:
- state = GB::GB10;
- break;
- case GB::GB10_2:
- if (state == GB::GB10 || state == GB::GB10_2)
- state = GB::GB10_2;
- else
- state = GB::Break;
- break;
- case GB::GB10_3:
- if (state != GB::GB10 && state != GB::GB10_2)
- attributes[pos].graphemeBoundary = true;
- state = GB::Break;
- break;
- case GB::GB13:
- if (state != GB::GB13) {
- state = GB::GB13;
- } else {
- attributes[pos].graphemeBoundary = true;
- state = GB::Break;
- }
- }
-
- lcls = cls;
- }
-
- attributes[len].graphemeBoundary = true; // GB2
-}
-
-
-namespace WB {
-
-enum Action {
- NoBreak,
- Break,
- Lookup,
- LookupW
-};
-
-static const uchar breakTable[QUnicodeTables::NumWordBreakClasses][QUnicodeTables::NumWordBreakClasses] = {
-// Any CR LF Newline Extend ZWJ Format RI Katakana HLetter ALetter SQuote DQuote MidNumLet MidLetter MidNum Numeric ExtNumLet E_Base E_Mod GAZ EBG
- { Break , Break , Break , Break , NoBreak, NoBreak, NoBreak, Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break }, // Any
- { Break , Break , NoBreak, Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break }, // CR
- { Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break }, // LF
- { Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break }, // Newline
- { Break , Break , Break , Break , NoBreak, NoBreak, NoBreak, Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break }, // Extend
- { Break , Break , Break , Break , NoBreak, NoBreak, NoBreak, Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , NoBreak, NoBreak }, // ZWJ
- { Break , Break , Break , Break , NoBreak, NoBreak, NoBreak, Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break }, // Format
- { Break , Break , Break , Break , NoBreak, NoBreak, NoBreak, NoBreak, Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break }, // RegionalIndicator
- { Break , Break , Break , Break , NoBreak, NoBreak, NoBreak, Break , NoBreak, Break , Break , Break , Break , Break , Break , Break , Break , NoBreak, Break , Break , Break , Break }, // Katakana
- { Break , Break , Break , Break , NoBreak, NoBreak, NoBreak, Break , Break , NoBreak, NoBreak, LookupW, Lookup , LookupW, LookupW, Break , NoBreak, NoBreak, Break , Break , Break , Break }, // HebrewLetter
- { Break , Break , Break , Break , NoBreak, NoBreak, NoBreak, Break , Break , NoBreak, NoBreak, LookupW, Break , LookupW, LookupW, Break , NoBreak, NoBreak, Break , Break , Break , Break }, // ALetter
- { Break , Break , Break , Break , NoBreak, NoBreak, NoBreak, Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break }, // SingleQuote
- { Break , Break , Break , Break , NoBreak, NoBreak, NoBreak, Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break }, // DoubleQuote
- { Break , Break , Break , Break , NoBreak, NoBreak, NoBreak, Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break }, // MidNumLet
- { Break , Break , Break , Break , NoBreak, NoBreak, NoBreak, Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break }, // MidLetter
- { Break , Break , Break , Break , NoBreak, NoBreak, NoBreak, Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break }, // MidNum
- { Break , Break , Break , Break , NoBreak, NoBreak, NoBreak, Break , Break , NoBreak, NoBreak, Lookup , Break , Lookup , Break , Lookup , NoBreak, NoBreak, Break , Break , Break , Break }, // Numeric
- { Break , Break , Break , Break , NoBreak, NoBreak, NoBreak, Break , NoBreak, NoBreak, NoBreak, Break , Break , Break , Break , Break , NoBreak, NoBreak, Break , Break , Break , Break }, // ExtendNumLet
- { Break , Break , Break , Break , NoBreak, NoBreak, NoBreak, Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , NoBreak, Break , Break }, // E_Base
- { Break , Break , Break , Break , NoBreak, NoBreak, NoBreak, Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break }, // E_Mod
- { Break , Break , Break , Break , NoBreak, NoBreak, NoBreak, Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break }, // GAZ
- { Break , Break , Break , Break , NoBreak, NoBreak, NoBreak, Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , NoBreak, Break , Break }, // EBG
-};
-
-} // namespace WB
-
-static void getWordBreaks(const ushort *string, quint32 len, QCharAttributes *attributes)
-{
- enum WordType {
- WordTypeNone, WordTypeAlphaNumeric, WordTypeHiraganaKatakana
- } currentWordType = WordTypeNone;
-
- QUnicodeTables::WordBreakClass cls = QUnicodeTables::WordBreak_LF; // to meet WB1
- for (quint32 i = 0; i != len; ++i) {
- quint32 pos = i;
- uint ucs4 = string[i];
- if (QChar::isHighSurrogate(ucs4) && i + 1 != len) {
- ushort low = string[i + 1];
- if (QChar::isLowSurrogate(low)) {
- ucs4 = QChar::surrogateToUcs4(ucs4, low);
- ++i;
- }
- }
-
- const QUnicodeTables::Properties *prop = QUnicodeTables::properties(ucs4);
- QUnicodeTables::WordBreakClass ncls = (QUnicodeTables::WordBreakClass) prop->wordBreakClass;
-#ifdef QT_BUILD_INTERNAL
- if (qt_initcharattributes_default_algorithm_only) {
- // as of Unicode 5.1, some punctuation marks were mapped to MidLetter and MidNumLet
- // which caused "hi.there" to be treated like if it were just a single word;
- // we keep the pre-5.1 behavior by remapping these characters in the Unicode tables generator
- // and this code is needed to pass the coverage tests; remove once the issue is fixed.
- if (ucs4 == 0x002E) // FULL STOP
- ncls = QUnicodeTables::WordBreak_MidNumLet;
- else if (ucs4 == 0x003A) // COLON
- ncls = QUnicodeTables::WordBreak_MidLetter;
- }
-#endif
-
- uchar action = WB::breakTable[cls][ncls];
- switch (action) {
- case WB::Break:
- break;
- case WB::NoBreak:
- if (Q_UNLIKELY(ncls == QUnicodeTables::WordBreak_Extend || ncls == QUnicodeTables::WordBreak_ZWJ || ncls == QUnicodeTables::WordBreak_Format)) {
- // WB4: X(Extend|Format)* -> X
- if (cls != QUnicodeTables::WordBreak_ZWJ) // WB3c
- continue;
- }
- if (Q_UNLIKELY(cls == QUnicodeTables::WordBreak_RegionalIndicator)) {
- // WB15/WB16: break between pairs of Regional indicator
- ncls = QUnicodeTables::WordBreak_Any;
- }
- break;
- case WB::Lookup:
- case WB::LookupW:
- for (quint32 lookahead = i + 1; lookahead < len; ++lookahead) {
- ucs4 = string[lookahead];
- if (QChar::isHighSurrogate(ucs4) && lookahead + 1 != len) {
- ushort low = string[lookahead + 1];
- if (QChar::isLowSurrogate(low)) {
- ucs4 = QChar::surrogateToUcs4(ucs4, low);
- ++lookahead;
- }
- }
-
- prop = QUnicodeTables::properties(ucs4);
- QUnicodeTables::WordBreakClass tcls = (QUnicodeTables::WordBreakClass) prop->wordBreakClass;
-
- if (Q_UNLIKELY(tcls == QUnicodeTables::WordBreak_Extend || tcls == QUnicodeTables::WordBreak_ZWJ || tcls == QUnicodeTables::WordBreak_Format)) {
- // WB4: X(Extend|Format)* -> X
- continue;
- }
-
- if (Q_LIKELY(tcls == cls || (action == WB::LookupW && (tcls == QUnicodeTables::WordBreak_HebrewLetter
- || tcls == QUnicodeTables::WordBreak_ALetter)))) {
- i = lookahead;
- ncls = tcls;
- action = WB::NoBreak;
- }
- break;
- }
- if (action != WB::NoBreak) {
- action = WB::Break;
- if (Q_UNLIKELY(ncls == QUnicodeTables::WordBreak_SingleQuote && cls == QUnicodeTables::WordBreak_HebrewLetter))
- action = WB::NoBreak; // WB7a
- }
- break;
- }
-
- cls = ncls;
- if (action == WB::Break) {
- attributes[pos].wordBreak = true;
- if (currentWordType != WordTypeNone)
- attributes[pos].wordEnd = true;
- switch (cls) {
- case QUnicodeTables::WordBreak_Katakana:
- currentWordType = WordTypeHiraganaKatakana;
- attributes[pos].wordStart = true;
- break;
- case QUnicodeTables::WordBreak_HebrewLetter:
- case QUnicodeTables::WordBreak_ALetter:
- case QUnicodeTables::WordBreak_Numeric:
- currentWordType = WordTypeAlphaNumeric;
- attributes[pos].wordStart = true;
- break;
- default:
- currentWordType = WordTypeNone;
- break;
- }
- }
- }
-
- if (currentWordType != WordTypeNone)
- attributes[len].wordEnd = true;
- attributes[len].wordBreak = true; // WB2
-}
-
-
-namespace SB {
-
-enum State {
- Initial,
- Lower,
- Upper,
- LUATerm,
- ATerm,
- ATermC,
- ACS,
- STerm,
- STermC,
- SCS,
- BAfterC,
- BAfter,
- Break,
- Lookup
-};
-
-static const uchar breakTable[BAfter + 1][QUnicodeTables::NumSentenceBreakClasses] = {
-// Any CR LF Sep Extend Sp Lower Upper OLetter Numeric ATerm SContinue STerm Close
- { Initial, BAfterC, BAfter , BAfter , Initial, Initial, Lower , Upper , Initial, Initial, ATerm , Initial, STerm , Initial }, // Initial
- { Initial, BAfterC, BAfter , BAfter , Lower , Initial, Initial, Initial, Initial, Initial, LUATerm, Initial, STerm , Initial }, // Lower
- { Initial, BAfterC, BAfter , BAfter , Upper , Initial, Initial, Upper , Initial, Initial, LUATerm, Initial, STerm , Initial }, // Upper
-
- { Lookup , BAfterC, BAfter , BAfter , LUATerm, ACS , Initial, Upper , Break , Initial, ATerm , STerm , STerm , ATermC }, // LUATerm
- { Lookup , BAfterC, BAfter , BAfter , ATerm , ACS , Initial, Break , Break , Initial, ATerm , STerm , STerm , ATermC }, // ATerm
- { Lookup , BAfterC, BAfter , BAfter , ATermC , ACS , Initial, Break , Break , Lookup , ATerm , STerm , STerm , ATermC }, // ATermC
- { Lookup , BAfterC, BAfter , BAfter , ACS , ACS , Initial, Break , Break , Lookup , ATerm , STerm , STerm , Lookup }, // ACS
-
- { Break , BAfterC, BAfter , BAfter , STerm , SCS , Break , Break , Break , Break , ATerm , STerm , STerm , STermC }, // STerm,
- { Break , BAfterC, BAfter , BAfter , STermC , SCS , Break , Break , Break , Break , ATerm , STerm , STerm , STermC }, // STermC
- { Break , BAfterC, BAfter , BAfter , SCS , SCS , Break , Break , Break , Break , ATerm , STerm , STerm , Break }, // SCS
- { Break , Break , BAfter , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break }, // BAfterC
- { Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break , Break }, // BAfter
-};
-
-} // namespace SB
-
-static void getSentenceBreaks(const ushort *string, quint32 len, QCharAttributes *attributes)
-{
- uchar state = SB::BAfter; // to meet SB1
- for (quint32 i = 0; i != len; ++i) {
- quint32 pos = i;
- uint ucs4 = string[i];
- if (QChar::isHighSurrogate(ucs4) && i + 1 != len) {
- ushort low = string[i + 1];
- if (QChar::isLowSurrogate(low)) {
- ucs4 = QChar::surrogateToUcs4(ucs4, low);
- ++i;
- }
- }
-
- const QUnicodeTables::Properties *prop = QUnicodeTables::properties(ucs4);
- QUnicodeTables::SentenceBreakClass ncls = (QUnicodeTables::SentenceBreakClass) prop->sentenceBreakClass;
-
- Q_ASSERT(state <= SB::BAfter);
- state = SB::breakTable[state][ncls];
- if (Q_UNLIKELY(state == SB::Lookup)) { // SB8
- state = SB::Break;
- for (quint32 lookahead = i + 1; lookahead < len; ++lookahead) {
- ucs4 = string[lookahead];
- if (QChar::isHighSurrogate(ucs4) && lookahead + 1 != len) {
- ushort low = string[lookahead + 1];
- if (QChar::isLowSurrogate(low)) {
- ucs4 = QChar::surrogateToUcs4(ucs4, low);
- ++lookahead;
- }
- }
-
- prop = QUnicodeTables::properties(ucs4);
- QUnicodeTables::SentenceBreakClass tcls = (QUnicodeTables::SentenceBreakClass) prop->sentenceBreakClass;
- switch (tcls) {
- case QUnicodeTables::SentenceBreak_Any:
- case QUnicodeTables::SentenceBreak_Extend:
- case QUnicodeTables::SentenceBreak_Sp:
- case QUnicodeTables::SentenceBreak_Numeric:
- case QUnicodeTables::SentenceBreak_SContinue:
- case QUnicodeTables::SentenceBreak_Close:
- continue;
- case QUnicodeTables::SentenceBreak_Lower:
- i = lookahead;
- state = SB::Initial;
- break;
- default:
- break;
- }
- break;
- }
- }
- if (Q_UNLIKELY(state == SB::Break)) {
- attributes[pos].sentenceBoundary = true;
- state = SB::breakTable[SB::Initial][ncls];
- }
- }
-
- attributes[len].sentenceBoundary = true; // SB2
-}
-
-
-// -----------------------------------------------------------------------------------------------------
-//
-// The line breaking algorithm.
-// See http://www.unicode.org/reports/tr14/tr14-39.html
-//
-// -----------------------------------------------------------------------------------------------------
-
-namespace LB {
-
-namespace NS { // Number Sequence
-
-// LB25 recommends to not break lines inside numbers of the form
-// described by the following regular expression:
-// (PR|PO)?(OP|HY)?NU(NU|SY|IS)*(CL|CP)?(PR|PO)?
-
-enum Action {
- None,
- Start,
- Continue,
- Break
-};
-
-enum Class {
- XX,
- PRPO,
- OPHY,
- NU,
- SYIS,
- CLCP
-};
-
-static const uchar actionTable[CLCP + 1][CLCP + 1] = {
-// XX PRPO OPHY NU SYIS CLCP
- { None , Start , Start , Start , None , None }, // XX
- { None , Start , Continue, Continue, None , None }, // PRPO
- { None , Start , Start , Continue, None , None }, // OPHY
- { Break , Break , Break , Continue, Continue, Continue }, // NU
- { Break , Break , Break , Continue, Continue, Continue }, // SYIS
- { Break , Continue, Break , Break , Break , Break }, // CLCP
-};
-
-inline Class toClass(QUnicodeTables::LineBreakClass lbc, QChar::Category category)
-{
- switch (lbc) {
- case QUnicodeTables::LineBreak_AL:// case QUnicodeTables::LineBreak_AI:
- // resolve AI math symbols in numerical context to IS
- if (category == QChar::Symbol_Math)
- return SYIS;
- break;
- case QUnicodeTables::LineBreak_PR: case QUnicodeTables::LineBreak_PO:
- return PRPO;
- case QUnicodeTables::LineBreak_OP: case QUnicodeTables::LineBreak_HY:
- return OPHY;
- case QUnicodeTables::LineBreak_NU:
- return NU;
- case QUnicodeTables::LineBreak_SY: case QUnicodeTables::LineBreak_IS:
- return SYIS;
- case QUnicodeTables::LineBreak_CL: case QUnicodeTables::LineBreak_CP:
- return CLCP;
- default:
- break;
- }
- return XX;
-}
-
-} // namespace NS
-
-/* In order to support the tailored implementation of LB25 properly
- the following changes were made in the pair table to allow breaks
- where the numeric expression doesn't match the template (i.e. [^NU](IS|SY)NU):
- (CL)(PO) from IB to DB
- (CP)(PO) from IB to DB
- (CL)(PR) from IB to DB
- (CP)(PR) from IB to DB
- (PO)(OP) from IB to DB
- (PR)(OP) from IB to DB
- (IS)(NU) from IB to DB
- (SY)(NU) from IB to DB
-*/
-
-/* In order to implementat LB21a properly a special rule HH has been introduced and
- the following changes were made in the pair table to disallow breaks after Hebrew + Hyphen:
- (HL)(HY|BA) from IB to CI
- (HY|BA)(!CB) from DB to HH
-*/
-
-enum Action {
- ProhibitedBreak, PB = ProhibitedBreak,
- DirectBreak, DB = DirectBreak,
- IndirectBreak, IB = IndirectBreak,
- CombiningIndirectBreak, CI = CombiningIndirectBreak,
- CombiningProhibitedBreak, CP = CombiningProhibitedBreak,
- ProhibitedBreakAfterHebrewPlusHyphen, HH = ProhibitedBreakAfterHebrewPlusHyphen
-};
-
-static const uchar breakTable[QUnicodeTables::LineBreak_SA][QUnicodeTables::LineBreak_SA] = {
-/* OP CL CP QU GL NS EX SY IS PR PO NU AL HL ID IN HY BA BB B2 ZW CM WJ H2 H3 JL JV JT RI CB EB EM ZWJ*/
-/* OP */ { PB, PB, PB, PB, PB, PB, PB, PB, PB, PB, PB, PB, PB, PB, PB, PB, PB, PB, PB, PB, PB, CP, PB, PB, PB, PB, PB, PB, PB, PB, PB, PB, PB },
-/* CL */ { DB, PB, PB, IB, IB, PB, PB, PB, PB, DB, DB, DB, DB, DB, DB, DB, IB, IB, DB, DB, PB, CI, PB, DB, DB, DB, DB, DB, DB, DB, DB, DB, IB },
-/* CP */ { DB, PB, PB, IB, IB, PB, PB, PB, PB, DB, DB, IB, IB, IB, DB, DB, IB, IB, DB, DB, PB, CI, PB, DB, DB, DB, DB, DB, DB, DB, DB, DB, IB },
-/* QU */ { PB, PB, PB, IB, IB, IB, PB, PB, PB, IB, IB, IB, IB, IB, IB, IB, IB, IB, IB, IB, PB, CI, PB, IB, IB, IB, IB, IB, IB, IB, IB, IB, IB },
-/* GL */ { IB, PB, PB, IB, IB, IB, PB, PB, PB, IB, IB, IB, IB, IB, IB, IB, IB, IB, IB, IB, PB, CI, PB, IB, IB, IB, IB, IB, IB, IB, IB, IB, IB },
-/* NS */ { DB, PB, PB, IB, IB, IB, PB, PB, PB, DB, DB, DB, DB, DB, DB, DB, IB, IB, DB, DB, PB, CI, PB, DB, DB, DB, DB, DB, DB, DB, DB, DB, IB },
-/* EX */ { DB, PB, PB, IB, IB, IB, PB, PB, PB, DB, DB, DB, DB, DB, DB, IB, IB, IB, DB, DB, PB, CI, PB, DB, DB, DB, DB, DB, DB, DB, DB, DB, IB },
-/* SY */ { DB, PB, PB, IB, IB, IB, PB, PB, PB, DB, DB, DB, DB, IB, DB, DB, IB, IB, DB, DB, PB, CI, PB, DB, DB, DB, DB, DB, DB, DB, DB, DB, IB },
-/* IS */ { DB, PB, PB, IB, IB, IB, PB, PB, PB, DB, DB, DB, IB, IB, DB, DB, IB, IB, DB, DB, PB, CI, PB, DB, DB, DB, DB, DB, DB, DB, DB, DB, IB },
-/* PR */ { DB, PB, PB, IB, IB, IB, PB, PB, PB, DB, DB, IB, IB, IB, IB, DB, IB, IB, DB, DB, PB, CI, PB, IB, IB, IB, IB, IB, DB, DB, IB, IB, IB },
-/* PO */ { DB, PB, PB, IB, IB, IB, PB, PB, PB, DB, DB, IB, IB, IB, DB, DB, IB, IB, DB, DB, PB, CI, PB, DB, DB, DB, DB, DB, DB, DB, DB, DB, IB },
-/* NU */ { IB, PB, PB, IB, IB, IB, PB, PB, PB, IB, IB, IB, IB, IB, DB, IB, IB, IB, DB, DB, PB, CI, PB, DB, DB, DB, DB, DB, DB, DB, DB, DB, IB },
-/* AL */ { IB, PB, PB, IB, IB, IB, PB, PB, PB, IB, IB, IB, IB, IB, DB, IB, IB, IB, DB, DB, PB, CI, PB, DB, DB, DB, DB, DB, DB, DB, DB, DB, IB },
-/* HL */ { IB, PB, PB, IB, IB, IB, PB, PB, PB, IB, IB, IB, IB, IB, DB, IB, CI, CI, DB, DB, PB, CI, PB, DB, DB, DB, DB, DB, DB, DB, DB, DB, IB },
-/* ID */ { DB, PB, PB, IB, IB, IB, PB, PB, PB, DB, IB, DB, DB, DB, DB, IB, IB, IB, DB, DB, PB, CI, PB, DB, DB, DB, DB, DB, DB, DB, DB, DB, IB },
-/* IN */ { DB, PB, PB, IB, IB, IB, PB, PB, PB, DB, DB, DB, DB, DB, DB, IB, IB, IB, DB, DB, PB, CI, PB, DB, DB, DB, DB, DB, DB, DB, DB, DB, IB },
-/* HY */ { HH, PB, PB, IB, HH, IB, PB, PB, PB, HH, HH, IB, HH, HH, HH, HH, IB, IB, HH, HH, PB, CI, PB, HH, HH, HH, HH, HH, HH, DB, DB, DB, IB },
-/* BA */ { HH, PB, PB, IB, HH, IB, PB, PB, PB, HH, HH, HH, HH, HH, HH, HH, IB, IB, HH, HH, PB, CI, PB, HH, HH, HH, HH, HH, HH, DB, DB, DB, IB },
-/* BB */ { IB, PB, PB, IB, IB, IB, PB, PB, PB, IB, IB, IB, IB, IB, IB, IB, IB, IB, IB, IB, PB, CI, PB, IB, IB, IB, IB, IB, IB, DB, IB, IB, IB },
-/* B2 */ { DB, PB, PB, IB, IB, IB, PB, PB, PB, DB, DB, DB, DB, DB, DB, DB, IB, IB, DB, PB, PB, CI, PB, DB, DB, DB, DB, DB, DB, DB, DB, DB, IB },
-/* ZW */ { DB, DB, DB, DB, DB, DB, DB, DB, DB, DB, DB, DB, DB, DB, DB, DB, DB, DB, DB, DB, PB, DB, DB, DB, DB, DB, DB, DB, DB, DB, DB, DB, DB },
-/* CM */ { IB, PB, PB, IB, IB, IB, PB, PB, PB, DB, DB, IB, IB, IB, DB, IB, IB, IB, DB, DB, PB, CI, PB, DB, DB, DB, DB, DB, DB, DB, DB, DB, IB },
-/* WJ */ { IB, PB, PB, IB, IB, IB, PB, PB, PB, IB, IB, IB, IB, IB, IB, IB, IB, IB, IB, IB, PB, CI, PB, IB, IB, IB, IB, IB, IB, IB, IB, IB, IB },
-/* H2 */ { DB, PB, PB, IB, IB, IB, PB, PB, PB, DB, IB, DB, DB, DB, DB, IB, IB, IB, DB, DB, PB, CI, PB, DB, DB, DB, IB, IB, DB, DB, DB, DB, IB },
-/* H3 */ { DB, PB, PB, IB, IB, IB, PB, PB, PB, DB, IB, DB, DB, DB, DB, IB, IB, IB, DB, DB, PB, CI, PB, DB, DB, DB, DB, IB, DB, DB, DB, DB, IB },
-/* JL */ { DB, PB, PB, IB, IB, IB, PB, PB, PB, DB, IB, DB, DB, DB, DB, IB, IB, IB, DB, DB, PB, CI, PB, IB, IB, IB, IB, DB, DB, DB, DB, DB, IB },
-/* JV */ { DB, PB, PB, IB, IB, IB, PB, PB, PB, DB, IB, DB, DB, DB, DB, IB, IB, IB, DB, DB, PB, CI, PB, DB, DB, DB, IB, IB, DB, DB, DB, DB, IB },
-/* JT */ { DB, PB, PB, IB, IB, IB, PB, PB, PB, DB, IB, DB, DB, DB, DB, IB, IB, IB, DB, DB, PB, CI, PB, DB, DB, DB, DB, IB, DB, DB, DB, DB, IB },
-/* RI */ { DB, PB, PB, IB, IB, IB, PB, PB, PB, DB, DB, DB, DB, DB, DB, DB, IB, IB, DB, DB, PB, CI, PB, DB, DB, DB, DB, DB, IB, DB, DB, DB, IB },
-/* CB */ { DB, PB, PB, IB, IB, DB, PB, PB, PB, DB, DB, DB, DB, DB, DB, DB, DB, DB, DB, DB, PB, CI, PB, DB, DB, DB, DB, DB, DB, DB, DB, DB, IB },
-/* EB */ { DB, PB, PB, IB, IB, IB, PB, PB, PB, DB, IB, DB, DB, DB, DB, IB, IB, IB, DB, DB, PB, CI, PB, DB, DB, DB, DB, DB, DB, DB, DB, IB, IB },
-/* EM */ { DB, PB, PB, IB, IB, IB, PB, PB, PB, DB, IB, DB, DB, DB, DB, IB, IB, IB, DB, DB, PB, CI, PB, DB, DB, DB, DB, DB, DB, DB, DB, DB, IB },
-/* ZWJ*/ { IB, PB, PB, IB, IB, IB, PB, PB, PB, IB, IB, IB, IB, IB, IB, IB, IB, IB, DB, DB, PB, CI, PB, DB, DB, DB, DB, DB, DB, DB, IB, IB, IB }
-};
-
-// The following line break classes are not treated by the pair table
-// and must be resolved outside:
-// AI, BK, CB, CJ, CR, LF, NL, SA, SG, SP, XX
-
-} // namespace LB
-
-static void getLineBreaks(const ushort *string, quint32 len, QCharAttributes *attributes)
-{
- quint32 nestart = 0;
- LB::NS::Class nelast = LB::NS::XX;
-
- QUnicodeTables::LineBreakClass lcls = QUnicodeTables::LineBreak_LF; // to meet LB10
- QUnicodeTables::LineBreakClass cls = lcls;
- for (quint32 i = 0; i != len; ++i) {
- quint32 pos = i;
- uint ucs4 = string[i];
- if (QChar::isHighSurrogate(ucs4) && i + 1 != len) {
- ushort low = string[i + 1];
- if (QChar::isLowSurrogate(low)) {
- ucs4 = QChar::surrogateToUcs4(ucs4, low);
- ++i;
- }
- }
-
- const QUnicodeTables::Properties *prop = QUnicodeTables::properties(ucs4);
- QUnicodeTables::LineBreakClass ncls = (QUnicodeTables::LineBreakClass) prop->lineBreakClass;
- QUnicodeTables::LineBreakClass tcls;
-
- if (Q_UNLIKELY(ncls == QUnicodeTables::LineBreak_SA)) {
- // LB1: resolve SA to AL, except of those that have Category Mn or Mc be resolved to CM
- static const int test = FLAG(QChar::Mark_NonSpacing) | FLAG(QChar::Mark_SpacingCombining);
- if (FLAG(prop->category) & test)
- ncls = QUnicodeTables::LineBreak_CM;
- }
-
- if (Q_UNLIKELY(lcls >= QUnicodeTables::LineBreak_CR)) {
- // LB4: BK!, LB5: (CRxLF|CR|LF|NL)!
- if (lcls > QUnicodeTables::LineBreak_CR || ncls != QUnicodeTables::LineBreak_LF)
- attributes[pos].lineBreak = attributes[pos].mandatoryBreak = true;
- if (Q_UNLIKELY(ncls == QUnicodeTables::LineBreak_CM || ncls == QUnicodeTables::LineBreak_ZWJ)) {
- cls = QUnicodeTables::LineBreak_AL;
- goto next_no_cls_update;
- }
- goto next;
- }
-
- if (Q_UNLIKELY(ncls >= QUnicodeTables::LineBreak_SP)) {
- if (ncls > QUnicodeTables::LineBreak_SP)
- goto next; // LB6: x(BK|CR|LF|NL)
- goto next_no_cls_update; // LB7: xSP
- }
-
- if (Q_UNLIKELY(ncls == QUnicodeTables::LineBreak_CM || ncls == QUnicodeTables::LineBreak_ZWJ)) {
- // LB9: treat CM that don't follows SP, BK, CR, LF, NL, or ZW as X
- if (lcls != QUnicodeTables::LineBreak_ZW && lcls < QUnicodeTables::LineBreak_SP)
- // don't update anything
- goto next_no_cls_update;
- }
-
- if (Q_UNLIKELY(lcls == QUnicodeTables::LineBreak_ZWJ)) {
- // LB8a: ZWJ x (ID | EB | EM)
- if (ncls == QUnicodeTables::LineBreak_ID || ncls == QUnicodeTables::LineBreak_EB || ncls == QUnicodeTables::LineBreak_EM)
- goto next;
- }
-
- // LB25: do not break lines inside numbers
- {
- LB::NS::Class necur = LB::NS::toClass(ncls, (QChar::Category)prop->category);
- switch (LB::NS::actionTable[nelast][necur]) {
- case LB::NS::Break:
- // do not change breaks before and after the expression
- for (quint32 j = nestart + 1; j < pos; ++j)
- attributes[j].lineBreak = false;
- Q_FALLTHROUGH();
- case LB::NS::None:
- nelast = LB::NS::XX; // reset state
- break;
- case LB::NS::Start:
- nestart = i;
- Q_FALLTHROUGH();
- default:
- nelast = necur;
- break;
- }
- }
-
- if (Q_UNLIKELY(ncls == QUnicodeTables::LineBreak_RI && lcls == QUnicodeTables::LineBreak_RI)) {
- // LB30a
- ncls = QUnicodeTables::LineBreak_SP;
- goto next;
- }
-
- // for South East Asian chars that require a complex analysis, the Unicode
- // standard recommends to treat them as AL. tailoring that do dictionary analysis can override
- if (Q_UNLIKELY(cls >= QUnicodeTables::LineBreak_SA))
- cls = QUnicodeTables::LineBreak_AL;
-
- tcls = cls;
- if (tcls == QUnicodeTables::LineBreak_CM)
- // LB10
- tcls = QUnicodeTables::LineBreak_AL;
- switch (LB::breakTable[tcls][ncls < QUnicodeTables::LineBreak_SA ? ncls : QUnicodeTables::LineBreak_AL]) {
- case LB::DirectBreak:
- attributes[pos].lineBreak = true;
- break;
- case LB::IndirectBreak:
- if (lcls == QUnicodeTables::LineBreak_SP)
- attributes[pos].lineBreak = true;
- break;
- case LB::CombiningIndirectBreak:
- if (lcls != QUnicodeTables::LineBreak_SP)
- goto next_no_cls_update;
- attributes[pos].lineBreak = true;
- break;
- case LB::CombiningProhibitedBreak:
- if (lcls != QUnicodeTables::LineBreak_SP)
- goto next_no_cls_update;
- break;
- case LB::ProhibitedBreakAfterHebrewPlusHyphen:
- if (lcls != QUnicodeTables::LineBreak_HL)
- attributes[pos].lineBreak = true;
- break;
- case LB::ProhibitedBreak:
- // nothing to do
- default:
- break;
- }
-
- next:
- cls = ncls;
- next_no_cls_update:
- lcls = ncls;
- }
-
- if (Q_UNLIKELY(LB::NS::actionTable[nelast][LB::NS::XX] == LB::NS::Break)) {
- // LB25: do not break lines inside numbers
- for (quint32 j = nestart + 1; j < len; ++j)
- attributes[j].lineBreak = false;
- }
-
- attributes[0].lineBreak = attributes[0].mandatoryBreak = false; // LB2
- attributes[len].lineBreak = attributes[len].mandatoryBreak = true; // LB3
-}
-
-
-static void getWhiteSpaces(const ushort *string, quint32 len, QCharAttributes *attributes)
-{
- for (quint32 i = 0; i != len; ++i) {
- uint ucs4 = string[i];
- if (QChar::isHighSurrogate(ucs4) && i + 1 != len) {
- ushort low = string[i + 1];
- if (QChar::isLowSurrogate(low)) {
- ucs4 = QChar::surrogateToUcs4(ucs4, low);
- ++i;
- }
- }
-
- if (Q_UNLIKELY(QChar::isSpace(ucs4)))
- attributes[i].whiteSpace = true;
- }
-}
-
-
-Q_CORE_EXPORT void initCharAttributes(const ushort *string, int length,
- const ScriptItem *items, int numItems,
- QCharAttributes *attributes, CharAttributeOptions options)
-{
- if (length <= 0)
- return;
-
- if (!(options & DontClearAttributes))
- ::memset(attributes, 0, (length + 1) * sizeof(QCharAttributes));
-
- if (options & GraphemeBreaks)
- getGraphemeBreaks(string, length, attributes);
- if (options & WordBreaks)
- getWordBreaks(string, length, attributes);
- if (options & SentenceBreaks)
- getSentenceBreaks(string, length, attributes);
- if (options & LineBreaks)
- getLineBreaks(string, length, attributes);
- if (options & WhiteSpaces)
- getWhiteSpaces(string, length, attributes);
-
- if (!qt_initcharattributes_default_algorithm_only) {
- if (!items || numItems <= 0)
- return;
-
- QVarLengthArray<HB_ScriptItem, 64> scriptItems;
- scriptItems.reserve(numItems);
- int start = 0;
- HB_Script startScript = script_to_hbscript(items[start].script);
- if (Q_UNLIKELY(startScript == HB_Script_Inherited))
- startScript = HB_Script_Common;
- for (int i = start + 1; i < numItems; ++i) {
- HB_Script script = script_to_hbscript(items[i].script);
- if (Q_LIKELY(script == startScript || script == HB_Script_Inherited))
- continue;
- Q_ASSERT(items[i].position > items[start].position);
- HB_ScriptItem item;
- item.pos = items[start].position;
- item.length = items[i].position - items[start].position;
- item.script = startScript;
- item.bidiLevel = 0; // unused
- scriptItems.append(item);
- start = i;
- startScript = script;
- }
- if (items[start].position + 1 < length) {
- HB_ScriptItem item;
- item.pos = items[start].position;
- item.length = length - items[start].position;
- item.script = startScript;
- item.bidiLevel = 0; // unused
- scriptItems.append(item);
- }
- Q_STATIC_ASSERT(sizeof(QCharAttributes) == sizeof(HB_CharAttributes));
- HB_GetTailoredCharAttributes(string, length,
- scriptItems.constData(), scriptItems.size(),
- reinterpret_cast<HB_CharAttributes *>(attributes));
- }
-}
-
-
-// ----------------------------------------------------------------------------
-//
-// The Unicode script property. See http://www.unicode.org/reports/tr24/tr24-24.html
-//
-// ----------------------------------------------------------------------------
-
-Q_CORE_EXPORT void initScripts(const ushort *string, int length, uchar *scripts)
-{
- int sor = 0;
- int eor = 0;
- uchar script = QChar::Script_Common;
-
- for (int i = 0; i < length; ++i, eor = i) {
- uint ucs4 = string[i];
- if (QChar::isHighSurrogate(ucs4) && i + 1 < length) {
- ushort low = string[i + 1];
- if (QChar::isLowSurrogate(low)) {
- ucs4 = QChar::surrogateToUcs4(ucs4, low);
- ++i;
- }
- }
-
- const QUnicodeTables::Properties *prop = QUnicodeTables::properties(ucs4);
-
- uchar nscript = prop->script;
-
- if (Q_LIKELY(nscript == script || nscript <= QChar::Script_Common))
- continue;
-
- // inherit preceding Common-s
- if (Q_UNLIKELY(script <= QChar::Script_Common)) {
- // also covers a case where the base character of Common script followed
- // by one or more combining marks of non-Inherited, non-Common script
- script = nscript;
- continue;
- }
-
- // Never break between a combining mark (gc= Mc, Mn or Me) and its base character.
- // Thus, a combining mark - whatever its script property value is - should inherit
- // the script property value of its base character.
- static const int test = (FLAG(QChar::Mark_NonSpacing) | FLAG(QChar::Mark_SpacingCombining) | FLAG(QChar::Mark_Enclosing));
- if (Q_UNLIKELY(FLAG(prop->category) & test))
- continue;
-
- Q_ASSERT(script > QChar::Script_Common);
- Q_ASSERT(sor < eor);
- ::memset(scripts + sor, script, (eor - sor) * sizeof(uchar));
- sor = eor;
-
- script = nscript;
- }
-
- Q_ASSERT(script >= QChar::Script_Common);
- Q_ASSERT(eor == length);
- ::memset(scripts + sor, script, (eor - sor) * sizeof(uchar));
-}
-
-} // namespace QUnicodeTools
-
-QT_END_NAMESPACE
diff --git a/src/corelib/tools/qunicodetools_p.h b/src/corelib/tools/qunicodetools_p.h
deleted file mode 100644
index 5e2d56a226..0000000000
--- a/src/corelib/tools/qunicodetools_p.h
+++ /dev/null
@@ -1,109 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#ifndef QUNICODETOOLS_P_H
-#define QUNICODETOOLS_P_H
-
-//
-// W A R N I N G
-// -------------
-//
-// This file is not part of the Qt API. It exists for the convenience
-// of other Qt classes. This header file may change from version to
-// version without notice, or even be removed.
-//
-// We mean it.
-//
-
-#include <QtCore/private/qglobal_p.h>
-#include <QtCore/qchar.h>
-
-QT_BEGIN_NAMESPACE
-
-struct QCharAttributes
-{
- uchar graphemeBoundary : 1;
- uchar wordBreak : 1;
- uchar sentenceBoundary : 1;
- uchar lineBreak : 1;
- uchar whiteSpace : 1;
- uchar wordStart : 1;
- uchar wordEnd : 1;
- uchar mandatoryBreak : 1;
-};
-Q_DECLARE_TYPEINFO(QCharAttributes, Q_PRIMITIVE_TYPE);
-
-namespace QUnicodeTools {
-
-// ### temporary
-struct ScriptItem
-{
- int position;
- int script;
-};
-
-} // namespace QUnicodeTools
-Q_DECLARE_TYPEINFO(QUnicodeTools::ScriptItem, Q_PRIMITIVE_TYPE);
-namespace QUnicodeTools {
-
-enum CharAttributeOption {
- GraphemeBreaks = 0x01,
- WordBreaks = 0x02,
- SentenceBreaks = 0x04,
- LineBreaks = 0x08,
- WhiteSpaces = 0x10,
- DefaultOptionsCompat = GraphemeBreaks | LineBreaks | WhiteSpaces, // ### remove
-
- DontClearAttributes = 0x1000
-};
-Q_DECLARE_FLAGS(CharAttributeOptions, CharAttributeOption)
-
-// attributes buffer has to have a length of string length + 1
-Q_CORE_EXPORT void initCharAttributes(const ushort *string, int length,
- const ScriptItem *items, int numItems,
- QCharAttributes *attributes, CharAttributeOptions options = DefaultOptionsCompat);
-
-
-Q_CORE_EXPORT void initScripts(const ushort *string, int length, uchar *scripts);
-
-} // namespace QUnicodeTools
-
-QT_END_NAMESPACE
-
-#endif // QUNICODETOOLS_P_H
diff --git a/src/corelib/tools/qvarlengtharray.h b/src/corelib/tools/qvarlengtharray.h
index ef3a9884bf..6be695e317 100644
--- a/src/corelib/tools/qvarlengtharray.h
+++ b/src/corelib/tools/qvarlengtharray.h
@@ -43,15 +43,15 @@
#include <QtCore/qcontainerfwd.h>
#include <QtCore/qglobal.h>
#include <QtCore/qalgorithms.h>
+#include <QtCore/qcontainertools_impl.h>
+#include <QtCore/qhashfunctions.h>
-#include <new>
-#include <string.h>
-#include <stdlib.h>
#include <algorithm>
-#ifdef Q_COMPILER_INITIALIZER_LISTS
#include <initializer_list>
-#endif
#include <iterator>
+#include <new>
+#include <string.h>
+#include <stdlib.h>
QT_BEGIN_NAMESPACE
@@ -61,7 +61,9 @@ template<class T, int Prealloc>
class QVarLengthArray
{
public:
- inline explicit QVarLengthArray(int size = 0);
+ QVarLengthArray() : QVarLengthArray(0) {}
+
+ inline explicit QVarLengthArray(int size);
inline QVarLengthArray(const QVarLengthArray<T, Prealloc> &other)
: a(Prealloc), s(0), ptr(reinterpret_cast<T *>(array))
@@ -69,14 +71,18 @@ public:
append(other.constData(), other.size());
}
-#ifdef Q_COMPILER_INITIALIZER_LISTS
QVarLengthArray(std::initializer_list<T> args)
- : a(Prealloc), s(0), ptr(reinterpret_cast<T *>(array))
+ : QVarLengthArray(args.begin(), args.end())
{
- if (args.size())
- append(args.begin(), int(args.size()));
}
-#endif
+
+ template <typename InputIterator, QtPrivate::IfIsInputIterator<InputIterator> = true>
+ inline QVarLengthArray(InputIterator first, InputIterator last)
+ : QVarLengthArray()
+ {
+ QtPrivate::reserveIfForwardIterator(this, first, last);
+ std::copy(first, last, std::back_inserter(*this));
+ }
inline ~QVarLengthArray() {
if (QTypeInfo<T>::isComplex) {
@@ -96,7 +102,6 @@ public:
return *this;
}
-#ifdef Q_COMPILER_INITIALIZER_LISTS
QVarLengthArray<T, Prealloc> &operator=(std::initializer_list<T> list)
{
resize(int(list.size())); // ### q6sizetype
@@ -104,11 +109,12 @@ public:
QT_MAKE_CHECKED_ARRAY_ITERATOR(this->begin(), this->size()));
return *this;
}
-#endif
inline void removeLast() {
Q_ASSERT(s > 0);
- realloc(s - 1, a);
+ if (QTypeInfo<T>::isComplex)
+ ptr[s - 1].~T();
+ --s;
}
inline int size() const { return s; }
inline int count() const { return s; }
@@ -259,6 +265,13 @@ private:
}
};
+#if defined(__cpp_deduction_guides) && __cpp_deduction_guides >= 201606
+template <typename InputIterator,
+ typename ValueType = typename std::iterator_traits<InputIterator>::value_type,
+ QtPrivate::IfIsInputIterator<InputIterator> = true>
+QVarLengthArray(InputIterator, InputIterator) -> QVarLengthArray<ValueType>;
+#endif
+
template <class T, int Prealloc>
Q_INLINE_TEMPLATE QVarLengthArray<T, Prealloc>::QVarLengthArray(int asize)
: s(asize) {
@@ -570,7 +583,7 @@ bool operator!=(const QVarLengthArray<T, Prealloc1> &l, const QVarLengthArray<T,
template <typename T, int Prealloc1, int Prealloc2>
bool operator<(const QVarLengthArray<T, Prealloc1> &lhs, const QVarLengthArray<T, Prealloc2> &rhs)
- Q_DECL_NOEXCEPT_EXPR(noexcept(std::lexicographical_compare(lhs.begin(), lhs.end(),
+ noexcept(noexcept(std::lexicographical_compare(lhs.begin(), lhs.end(),
rhs.begin(), rhs.end())))
{
return std::lexicographical_compare(lhs.begin(), lhs.end(),
@@ -579,25 +592,32 @@ bool operator<(const QVarLengthArray<T, Prealloc1> &lhs, const QVarLengthArray<T
template <typename T, int Prealloc1, int Prealloc2>
inline bool operator>(const QVarLengthArray<T, Prealloc1> &lhs, const QVarLengthArray<T, Prealloc2> &rhs)
- Q_DECL_NOEXCEPT_EXPR(noexcept(lhs < rhs))
+ noexcept(noexcept(lhs < rhs))
{
return rhs < lhs;
}
template <typename T, int Prealloc1, int Prealloc2>
inline bool operator<=(const QVarLengthArray<T, Prealloc1> &lhs, const QVarLengthArray<T, Prealloc2> &rhs)
- Q_DECL_NOEXCEPT_EXPR(noexcept(lhs < rhs))
+ noexcept(noexcept(lhs < rhs))
{
return !(lhs > rhs);
}
template <typename T, int Prealloc1, int Prealloc2>
inline bool operator>=(const QVarLengthArray<T, Prealloc1> &lhs, const QVarLengthArray<T, Prealloc2> &rhs)
- Q_DECL_NOEXCEPT_EXPR(noexcept(lhs < rhs))
+ noexcept(noexcept(lhs < rhs))
{
return !(lhs < rhs);
}
+template <typename T, int Prealloc>
+uint qHash(const QVarLengthArray<T, Prealloc> &key, uint seed = 0)
+ noexcept(noexcept(qHashRange(key.cbegin(), key.cend(), seed)))
+{
+ return qHashRange(key.cbegin(), key.cend(), seed);
+}
+
QT_END_NAMESPACE
#endif // QVARLENGTHARRAY_H
diff --git a/src/corelib/tools/qvarlengtharray.qdoc b/src/corelib/tools/qvarlengtharray.qdoc
index bc8df82517..e5ba47b8ef 100644
--- a/src/corelib/tools/qvarlengtharray.qdoc
+++ b/src/corelib/tools/qvarlengtharray.qdoc
@@ -110,6 +110,14 @@
lists.
*/
+/*! \fn template<class T, int Prealloc> template<typename InputIterator> QVarLengthArray<T, Prealloc>::QVarLengthArray(InputIterator first, InputIterator last)
+ \since 5.14
+
+ Constructs an array with the contents in the iterator range [\a first, \a last).
+
+ The value type of \c InputIterator must be convertible to \c T.
+*/
+
/*! \fn template<class T, int Prealloc> QVarLengthArray<T, Prealloc>::~QVarLengthArray()
@@ -895,3 +903,11 @@
\sa indexOf(), lastIndexOf()
*/
+/*!
+ template <typename T, int Prealloc> uint qHash(const QVarLengthArray<T, Prealloc> &key, uint seed = 0)
+ \relates QVarLengthArray
+ \since 5.14
+
+ Returns the hash value for \a key, using \a seed to seed the
+ calculation.
+*/
diff --git a/src/corelib/tools/qvector.h b/src/corelib/tools/qvector.h
index 57cf6e51ce..62fbdb4a2a 100644
--- a/src/corelib/tools/qvector.h
+++ b/src/corelib/tools/qvector.h
@@ -45,14 +45,15 @@
#include <QtCore/qrefcount.h>
#include <QtCore/qarraydata.h>
#include <QtCore/qhashfunctions.h>
+#include <QtCore/qcontainertools_impl.h>
#include <iterator>
+#include <initializer_list>
+#if QT_VERSION < QT_VERSION_CHECK(6,0,0)
#include <vector>
+#endif
#include <stdlib.h>
#include <string.h>
-#ifdef Q_COMPILER_INITIALIZER_LISTS
-#include <initializer_list>
-#endif
#include <algorithm>
@@ -65,21 +66,22 @@ class QVector
Data *d;
public:
- inline QVector() Q_DECL_NOTHROW : d(Data::sharedNull()) { }
+ inline QVector() noexcept : d(Data::sharedNull()) { }
explicit QVector(int size);
QVector(int size, const T &t);
inline QVector(const QVector<T> &v);
inline ~QVector() { if (!d->ref.deref()) freeData(d); }
QVector<T> &operator=(const QVector<T> &v);
-#if defined(Q_COMPILER_RVALUE_REFS) || defined(Q_CLANG_QDOC)
- QVector(QVector<T> &&other) Q_DECL_NOTHROW : d(other.d) { other.d = Data::sharedNull(); }
- QVector<T> &operator=(QVector<T> &&other) Q_DECL_NOTHROW
+ QVector(QVector<T> &&other) noexcept : d(other.d) { other.d = Data::sharedNull(); }
+ QVector<T> &operator=(QVector<T> &&other) noexcept
{ QVector moved(std::move(other)); swap(moved); return *this; }
-#endif
- void swap(QVector<T> &other) Q_DECL_NOTHROW { qSwap(d, other.d); }
-#ifdef Q_COMPILER_INITIALIZER_LISTS
+ void swap(QVector<T> &other) noexcept { qSwap(d, other.d); }
inline QVector(std::initializer_list<T> args);
-#endif
+ QVector<T> &operator=(std::initializer_list<T> args);
+ template <typename InputIterator, QtPrivate::IfIsInputIterator<InputIterator> = true>
+ inline QVector(InputIterator first, InputIterator last);
+ explicit QVector(QArrayDataPointerRef<T> ref) noexcept : d(ref.ptr) {}
+
bool operator==(const QVector<T> &v) const;
inline bool operator!=(const QVector<T> &v) const { return !(*this == v); }
@@ -138,9 +140,7 @@ public:
T &operator[](int i);
const T &operator[](int i) const;
void append(const T &t);
-#if defined(Q_COMPILER_RVALUE_REFS) || defined(Q_CLANG_QDOC)
void append(T &&t);
-#endif
inline void append(const QVector<T> &l) { *this += l; }
void prepend(T &&t);
void prepend(const T &t);
@@ -208,29 +208,29 @@ public:
typedef std::reverse_iterator<const_iterator> const_reverse_iterator;
#if !defined(QT_STRICT_ITERATORS) || defined(Q_CLANG_QDOC)
inline iterator begin() { detach(); return d->begin(); }
- inline const_iterator begin() const Q_DECL_NOTHROW { return d->constBegin(); }
- inline const_iterator cbegin() const Q_DECL_NOTHROW { return d->constBegin(); }
- inline const_iterator constBegin() const Q_DECL_NOTHROW { return d->constBegin(); }
+ inline const_iterator begin() const noexcept { return d->constBegin(); }
+ inline const_iterator cbegin() const noexcept { return d->constBegin(); }
+ inline const_iterator constBegin() const noexcept { return d->constBegin(); }
inline iterator end() { detach(); return d->end(); }
- inline const_iterator end() const Q_DECL_NOTHROW { return d->constEnd(); }
- inline const_iterator cend() const Q_DECL_NOTHROW { return d->constEnd(); }
- inline const_iterator constEnd() const Q_DECL_NOTHROW { return d->constEnd(); }
+ inline const_iterator end() const noexcept { return d->constEnd(); }
+ inline const_iterator cend() const noexcept { return d->constEnd(); }
+ inline const_iterator constEnd() const noexcept { return d->constEnd(); }
#else
inline iterator begin(iterator = iterator()) { detach(); return d->begin(); }
- inline const_iterator begin(const_iterator = const_iterator()) const Q_DECL_NOTHROW { return d->constBegin(); }
- inline const_iterator cbegin(const_iterator = const_iterator()) const Q_DECL_NOTHROW { return d->constBegin(); }
- inline const_iterator constBegin(const_iterator = const_iterator()) const Q_DECL_NOTHROW { return d->constBegin(); }
+ inline const_iterator begin(const_iterator = const_iterator()) const noexcept { return d->constBegin(); }
+ inline const_iterator cbegin(const_iterator = const_iterator()) const noexcept { return d->constBegin(); }
+ inline const_iterator constBegin(const_iterator = const_iterator()) const noexcept { return d->constBegin(); }
inline iterator end(iterator = iterator()) { detach(); return d->end(); }
- inline const_iterator end(const_iterator = const_iterator()) const Q_DECL_NOTHROW { return d->constEnd(); }
- inline const_iterator cend(const_iterator = const_iterator()) const Q_DECL_NOTHROW { return d->constEnd(); }
- inline const_iterator constEnd(const_iterator = const_iterator()) const Q_DECL_NOTHROW { return d->constEnd(); }
+ inline const_iterator end(const_iterator = const_iterator()) const noexcept { return d->constEnd(); }
+ inline const_iterator cend(const_iterator = const_iterator()) const noexcept { return d->constEnd(); }
+ inline const_iterator constEnd(const_iterator = const_iterator()) const noexcept { return d->constEnd(); }
#endif
reverse_iterator rbegin() { return reverse_iterator(end()); }
reverse_iterator rend() { return reverse_iterator(begin()); }
- const_reverse_iterator rbegin() const Q_DECL_NOTHROW { return const_reverse_iterator(end()); }
- const_reverse_iterator rend() const Q_DECL_NOTHROW { return const_reverse_iterator(begin()); }
- const_reverse_iterator crbegin() const Q_DECL_NOTHROW { return const_reverse_iterator(end()); }
- const_reverse_iterator crend() const Q_DECL_NOTHROW { return const_reverse_iterator(begin()); }
+ const_reverse_iterator rbegin() const noexcept { return const_reverse_iterator(end()); }
+ const_reverse_iterator rend() const noexcept { return const_reverse_iterator(begin()); }
+ const_reverse_iterator crbegin() const noexcept { return const_reverse_iterator(end()); }
+ const_reverse_iterator crend() const noexcept { return const_reverse_iterator(begin()); }
iterator insert(iterator before, int n, const T &x);
inline iterator insert(iterator before, const T &x) { return insert(before, 1, x); }
inline iterator insert(iterator before, T &&x);
@@ -252,6 +252,13 @@ public:
T value(int i) const;
T value(int i, const T &defaultValue) const;
+ void swapItemsAt(int i, int j) {
+ Q_ASSERT_X(i >= 0 && i < size() && j >= 0 && j < size(),
+ "QVector<T>::swap", "index out of range");
+ detach();
+ qSwap(d->begin()[i], d->begin()[j]);
+ }
+
// STL compatibility
typedef T value_type;
typedef value_type* pointer;
@@ -263,10 +270,8 @@ public:
typedef const_iterator ConstIterator;
typedef int size_type;
inline void push_back(const T &t) { append(t); }
-#if defined(Q_COMPILER_RVALUE_REFS) || defined(Q_CLANG_QDOC)
void push_back(T &&t) { append(std::move(t)); }
void push_front(T &&t) { prepend(std::move(t)); }
-#endif
inline void push_front(const T &t) { prepend(t); }
void pop_back() { removeLast(); }
void pop_front() { removeFirst(); }
@@ -293,14 +298,17 @@ public:
inline QVector<T> &operator<<(T &&t)
{ append(std::move(t)); return *this; }
- QList<T> toList() const;
-
static QVector<T> fromList(const QList<T> &list);
+ QList<T> toList() const;
+#if QT_VERSION < QT_VERSION_CHECK(6,0,0)
+ Q_DECL_DEPRECATED_X("Use QVector<T>(vector.begin(), vector.end()) instead.")
static inline QVector<T> fromStdVector(const std::vector<T> &vector)
- { QVector<T> tmp; tmp.reserve(int(vector.size())); std::copy(vector.begin(), vector.end(), std::back_inserter(tmp)); return tmp; }
+ { return QVector<T>(vector.begin(), vector.end()); }
+ Q_DECL_DEPRECATED_X("Use std::vector<T>(vector.begin(), vector.end()) instead.")
inline std::vector<T> toStdVector() const
{ return std::vector<T>(d->begin(), d->end()); }
+#endif
private:
// ### Qt6: remove methods, they are unused
void reallocData(const int size, const int alloc, QArrayData::AllocationOptions options = QArrayData::Default);
@@ -318,6 +326,13 @@ private:
class AlignmentDummy { Data header; T array[1]; };
};
+#if defined(__cpp_deduction_guides) && __cpp_deduction_guides >= 201606
+template <typename InputIterator,
+ typename ValueType = typename std::iterator_traits<InputIterator>::value_type,
+ QtPrivate::IfIsInputIterator<InputIterator> = true>
+QVector(InputIterator, InputIterator) -> QVector<ValueType>;
+#endif
+
#ifdef Q_CC_MSVC
// behavior change: an object of POD type constructed with an initializer of the form ()
// will be default-initialized
@@ -522,11 +537,10 @@ QVector<T>::QVector(int asize, const T &t)
}
}
-#ifdef Q_COMPILER_INITIALIZER_LISTS
-# if defined(Q_CC_MSVC)
+#if defined(Q_CC_MSVC)
QT_WARNING_PUSH
QT_WARNING_DISABLE_MSVC(4127) // conditional expression is constant
-# endif // Q_CC_MSVC
+#endif // Q_CC_MSVC
template <typename T>
QVector<T>::QVector(std::initializer_list<T> args)
@@ -542,10 +556,27 @@ QVector<T>::QVector(std::initializer_list<T> args)
d = Data::sharedNull();
}
}
-# if defined(Q_CC_MSVC)
+
+template <typename T>
+QVector<T> &QVector<T>::operator=(std::initializer_list<T> args)
+{
+ QVector<T> tmp(args);
+ tmp.swap(*this);
+ return *this;
+}
+
+#if defined(Q_CC_MSVC)
QT_WARNING_POP
-# endif // Q_CC_MSVC
-#endif // Q_COMPILER_INITALIZER_LISTS
+#endif // Q_CC_MSVC
+
+template <typename T>
+template <typename InputIterator, QtPrivate::IfIsInputIterator<InputIterator>>
+QVector<T>::QVector(InputIterator first, InputIterator last)
+ : QVector()
+{
+ QtPrivate::reserveIfForwardIterator(this, first, last);
+ std::copy(first, last, std::back_inserter(*this));
+}
template <typename T>
void QVector<T>::freeData(Data *x)
@@ -763,9 +794,9 @@ void QVector<T>::append(const T &t)
realloc(isTooSmall ? d->size + 1 : d->alloc, opt);
if (QTypeInfo<T>::isComplex)
- new (d->end()) T(qMove(copy));
+ new (d->end()) T(std::move(copy));
else
- *d->end() = qMove(copy);
+ *d->end() = std::move(copy);
} else {
if (QTypeInfo<T>::isComplex)
@@ -776,7 +807,6 @@ void QVector<T>::append(const T &t)
++d->size;
}
-#ifdef Q_COMPILER_RVALUE_REFS
template <typename T>
void QVector<T>::append(T &&t)
{
@@ -790,7 +820,6 @@ void QVector<T>::append(T &&t)
++d->size;
}
-#endif
template <typename T>
void QVector<T>::removeLast()
@@ -1052,14 +1081,14 @@ Q_DECLARE_MUTABLE_SEQUENTIAL_ITERATOR(Vector)
template <typename T>
uint qHash(const QVector<T> &key, uint seed = 0)
- Q_DECL_NOEXCEPT_EXPR(noexcept(qHashRange(key.cbegin(), key.cend(), seed)))
+ noexcept(noexcept(qHashRange(key.cbegin(), key.cend(), seed)))
{
return qHashRange(key.cbegin(), key.cend(), seed);
}
template <typename T>
bool operator<(const QVector<T> &lhs, const QVector<T> &rhs)
- Q_DECL_NOEXCEPT_EXPR(noexcept(std::lexicographical_compare(lhs.begin(), lhs.end(),
+ noexcept(noexcept(std::lexicographical_compare(lhs.begin(), lhs.end(),
rhs.begin(), rhs.end())))
{
return std::lexicographical_compare(lhs.begin(), lhs.end(),
@@ -1068,21 +1097,21 @@ bool operator<(const QVector<T> &lhs, const QVector<T> &rhs)
template <typename T>
inline bool operator>(const QVector<T> &lhs, const QVector<T> &rhs)
- Q_DECL_NOEXCEPT_EXPR(noexcept(lhs < rhs))
+ noexcept(noexcept(lhs < rhs))
{
return rhs < lhs;
}
template <typename T>
inline bool operator<=(const QVector<T> &lhs, const QVector<T> &rhs)
- Q_DECL_NOEXCEPT_EXPR(noexcept(lhs < rhs))
+ noexcept(noexcept(lhs < rhs))
{
return !(lhs > rhs);
}
template <typename T>
inline bool operator>=(const QVector<T> &lhs, const QVector<T> &rhs)
- Q_DECL_NOEXCEPT_EXPR(noexcept(lhs < rhs))
+ noexcept(noexcept(lhs < rhs))
{
return !(lhs < rhs);
}
@@ -1104,6 +1133,24 @@ extern template class Q_CORE_EXPORT QVector<QPoint>;
QVector<uint> QStringView::toUcs4() const { return QtPrivate::convertToUcs4(*this); }
+QVector<QStringRef> QString::splitRef(const QString &sep, Qt::SplitBehavior behavior, Qt::CaseSensitivity cs) const
+{ return splitRef(sep, _sb(behavior), cs); }
+QVector<QStringRef> QString::splitRef(QChar sep, Qt::SplitBehavior behavior, Qt::CaseSensitivity cs) const
+{ return splitRef(sep, _sb(behavior), cs); }
+#ifndef QT_NO_REGEXP
+QVector<QStringRef> QString::splitRef(const QRegExp &sep, Qt::SplitBehavior behavior) const
+{ return splitRef(sep, _sb(behavior)); }
+#endif
+#if QT_CONFIG(regularexpression)
+QVector<QStringRef> QString::splitRef(const QRegularExpression &sep, Qt::SplitBehavior behavior) const
+{ return splitRef(sep, _sb(behavior)); }
+#endif
+QVector<QStringRef> QStringRef::split(const QString &sep, Qt::SplitBehavior behavior, Qt::CaseSensitivity cs) const
+{ return split(sep, QString::_sb(behavior), cs); }
+QVector<QStringRef> QStringRef::split(QChar sep, Qt::SplitBehavior behavior, Qt::CaseSensitivity cs) const
+{ return split(sep, QString::_sb(behavior), cs); }
+
+
QT_END_NAMESPACE
#endif // QVECTOR_H
diff --git a/src/corelib/tools/qvector.qdoc b/src/corelib/tools/qvector.qdoc
index ad5821e73b..116d962411 100644
--- a/src/corelib/tools/qvector.qdoc
+++ b/src/corelib/tools/qvector.qdoc
@@ -261,6 +261,18 @@
lists.
*/
+/*! \fn template <typename T> template<typename InputIterator> QVector<T>::QVector(InputIterator first, InputIterator last)
+ \since 5.14
+
+ Constructs a vector with the contents in the iterator range [\a first, \a last).
+
+ The value type of \c InputIterator must be convertible to \c T.
+*/
+
+/*!
+ \fn template <typename T> QVector<T>::QVector(QArrayDataPointerRef<T> ref)
+ \internal
+*/
/*! \fn template <typename T> QVector<T>::~QVector()
@@ -281,6 +293,17 @@
\since 5.2
*/
+/*!
+ \fn template <typename T> QVector<T> &QVector<T>::operator=(std::initializer_list<T> args)
+
+ Assigns the collection of values in \a args to this QVector instance.
+
+ This operator is only enabled if the compiler supports C++11 initializer
+ lists.
+
+ \since 5.14
+*/
+
/*! \fn template <typename T> void QVector<T>::swap(QVector<T> &other)
\since 4.8
@@ -288,6 +311,16 @@
never fails.
*/
+/*! \fn template <typename T> void QVector<T>::swapItemsAt(int i, int j)
+ \since 5.14
+
+ Exchange the item at index position \a i with the item at index
+ position \a j. This function assumes that both \a i and \a j are
+ at least 0 but less than size(). To avoid failure, test that both
+ \a i and \a j are at least 0 and less than size().
+*/
+
+
/*! \fn template <typename T> bool QVector<T>::operator==(const QVector<T> &other) const
Returns \c true if \a other is equal to this vector; otherwise
@@ -1326,6 +1359,8 @@
\snippet code/src_corelib_tools_qvector.cpp 14
+ \include containers-range-constructor.qdocinc
+
\sa fromList(), QList::fromVector()
*/
@@ -1337,6 +1372,8 @@
\snippet code/src_corelib_tools_qvector.cpp 15
+ \include containers-range-constructor.qdocinc
+
\sa toList(), QList::toVector()
*/
@@ -1349,6 +1386,8 @@
\snippet code/src_corelib_tools_qvector.cpp 16
+ \include containers-range-constructor.qdocinc
+
\sa toStdVector(), QList::fromStdList()
*/
@@ -1359,6 +1398,8 @@
\snippet code/src_corelib_tools_qvector.cpp 17
+ \include containers-range-constructor.qdocinc
+
\sa fromStdVector(), QList::toStdList()
*/
diff --git a/src/corelib/tools/qversionnumber.cpp b/src/corelib/tools/qversionnumber.cpp
index b96e48252e..58e3c15560 100644
--- a/src/corelib/tools/qversionnumber.cpp
+++ b/src/corelib/tools/qversionnumber.cpp
@@ -235,7 +235,7 @@ QVersionNumber QVersionNumber::normalized() const
\sa commonPrefix()
*/
-bool QVersionNumber::isPrefixOf(const QVersionNumber &other) const Q_DECL_NOTHROW
+bool QVersionNumber::isPrefixOf(const QVersionNumber &other) const noexcept
{
if (segmentCount() > other.segmentCount())
return false;
@@ -259,7 +259,7 @@ bool QVersionNumber::isPrefixOf(const QVersionNumber &other) const Q_DECL_NOTHRO
\snippet qversionnumber/main.cpp 1
*/
-int QVersionNumber::compare(const QVersionNumber &v1, const QVersionNumber &v2) Q_DECL_NOTHROW
+int QVersionNumber::compare(const QVersionNumber &v1, const QVersionNumber &v2) noexcept
{
int commonlen;
@@ -482,7 +482,7 @@ QVersionNumber QVersionNumber::fromString(QLatin1String string, int *suffixIndex
if (suffixIndex)
*suffixIndex = int(lastGoodEnd - string.begin());
- return QVersionNumber(qMove(seg));
+ return QVersionNumber(std::move(seg));
}
void QVersionNumber::SegmentStorage::setVector(int len, int maj, int min, int mic)
diff --git a/src/corelib/tools/qversionnumber.h b/src/corelib/tools/qversionnumber.h
index 1bfb4aab39..d43b86ba51 100644
--- a/src/corelib/tools/qversionnumber.h
+++ b/src/corelib/tools/qversionnumber.h
@@ -87,7 +87,7 @@ class QVersionNumber
};
// set the InlineSegmentMarker and set length to zero
- SegmentStorage() Q_DECL_NOTHROW : dummy(1) {}
+ SegmentStorage() noexcept : dummy(1) {}
SegmentStorage(const QVector<int> &seg)
{
@@ -119,14 +119,13 @@ class QVersionNumber
return *this;
}
-#ifdef Q_COMPILER_RVALUE_REFS
- SegmentStorage(SegmentStorage &&other) Q_DECL_NOTHROW
+ SegmentStorage(SegmentStorage &&other) noexcept
: dummy(other.dummy)
{
other.dummy = 1;
}
- SegmentStorage &operator=(SegmentStorage &&other) Q_DECL_NOTHROW
+ SegmentStorage &operator=(SegmentStorage &&other) noexcept
{
qSwap(dummy, other.dummy);
return *this;
@@ -139,8 +138,6 @@ class QVersionNumber
else
pointer_segments = new QVector<int>(std::move(seg));
}
-#endif
-#ifdef Q_COMPILER_INITIALIZER_LISTS
SegmentStorage(std::initializer_list<int> args)
{
if (dataFitsInline(args.begin(), int(args.size()))) {
@@ -149,14 +146,13 @@ class QVersionNumber
pointer_segments = new QVector<int>(args);
}
}
-#endif
~SegmentStorage() { if (isUsingPointer()) delete pointer_segments; }
- bool isUsingPointer() const Q_DECL_NOTHROW
+ bool isUsingPointer() const noexcept
{ return (inline_segments[InlineSegmentMarker] & 1) == 0; }
- int size() const Q_DECL_NOTHROW
+ int size() const noexcept
{ return isUsingPointer() ? pointer_segments->size() : (inline_segments[InlineSegmentMarker] >> 1); }
void setInlineSize(int len)
@@ -218,7 +214,7 @@ class QVersionNumber
} m_segments;
public:
- inline QVersionNumber() Q_DECL_NOTHROW
+ inline QVersionNumber() noexcept
: m_segments()
{}
inline explicit QVersionNumber(const QVector<int> &seg)
@@ -227,17 +223,13 @@ public:
// compiler-generated copy/move ctor/assignment operators and the destructor are ok
-#ifdef Q_COMPILER_RVALUE_REFS
explicit QVersionNumber(QVector<int> &&seg)
: m_segments(std::move(seg))
{}
-#endif
-#ifdef Q_COMPILER_INITIALIZER_LISTS
inline QVersionNumber(std::initializer_list<int> args)
: m_segments(args)
{}
-#endif
inline explicit QVersionNumber(int maj)
{ m_segments.setSegments(1, maj); }
@@ -248,34 +240,34 @@ public:
inline explicit QVersionNumber(int maj, int min, int mic)
{ m_segments.setSegments(3, maj, min, mic); }
- Q_REQUIRED_RESULT inline bool isNull() const Q_DECL_NOTHROW
+ Q_REQUIRED_RESULT inline bool isNull() const noexcept
{ return segmentCount() == 0; }
- Q_REQUIRED_RESULT inline bool isNormalized() const Q_DECL_NOTHROW
+ Q_REQUIRED_RESULT inline bool isNormalized() const noexcept
{ return isNull() || segmentAt(segmentCount() - 1) != 0; }
- Q_REQUIRED_RESULT inline int majorVersion() const Q_DECL_NOTHROW
+ Q_REQUIRED_RESULT inline int majorVersion() const noexcept
{ return segmentAt(0); }
- Q_REQUIRED_RESULT inline int minorVersion() const Q_DECL_NOTHROW
+ Q_REQUIRED_RESULT inline int minorVersion() const noexcept
{ return segmentAt(1); }
- Q_REQUIRED_RESULT inline int microVersion() const Q_DECL_NOTHROW
+ Q_REQUIRED_RESULT inline int microVersion() const noexcept
{ return segmentAt(2); }
Q_REQUIRED_RESULT Q_CORE_EXPORT QVersionNumber normalized() const;
Q_REQUIRED_RESULT Q_CORE_EXPORT QVector<int> segments() const;
- Q_REQUIRED_RESULT inline int segmentAt(int index) const Q_DECL_NOTHROW
+ Q_REQUIRED_RESULT inline int segmentAt(int index) const noexcept
{ return (m_segments.size() > index) ? m_segments.at(index) : 0; }
- Q_REQUIRED_RESULT inline int segmentCount() const Q_DECL_NOTHROW
+ Q_REQUIRED_RESULT inline int segmentCount() const noexcept
{ return m_segments.size(); }
- Q_REQUIRED_RESULT Q_CORE_EXPORT bool isPrefixOf(const QVersionNumber &other) const Q_DECL_NOTHROW;
+ Q_REQUIRED_RESULT Q_CORE_EXPORT bool isPrefixOf(const QVersionNumber &other) const noexcept;
- Q_REQUIRED_RESULT Q_CORE_EXPORT static int compare(const QVersionNumber &v1, const QVersionNumber &v2) Q_DECL_NOTHROW;
+ Q_REQUIRED_RESULT Q_CORE_EXPORT static int compare(const QVersionNumber &v1, const QVersionNumber &v2) noexcept;
Q_REQUIRED_RESULT Q_CORE_EXPORT static Q_DECL_PURE_FUNCTION QVersionNumber commonPrefix(const QVersionNumber &v1, const QVersionNumber &v2);
@@ -299,22 +291,22 @@ Q_DECLARE_TYPEINFO(QVersionNumber, Q_MOVABLE_TYPE);
Q_CORE_EXPORT QDebug operator<<(QDebug, const QVersionNumber &version);
#endif
-Q_REQUIRED_RESULT inline bool operator> (const QVersionNumber &lhs, const QVersionNumber &rhs) Q_DECL_NOTHROW
+Q_REQUIRED_RESULT inline bool operator> (const QVersionNumber &lhs, const QVersionNumber &rhs) noexcept
{ return QVersionNumber::compare(lhs, rhs) > 0; }
-Q_REQUIRED_RESULT inline bool operator>=(const QVersionNumber &lhs, const QVersionNumber &rhs) Q_DECL_NOTHROW
+Q_REQUIRED_RESULT inline bool operator>=(const QVersionNumber &lhs, const QVersionNumber &rhs) noexcept
{ return QVersionNumber::compare(lhs, rhs) >= 0; }
-Q_REQUIRED_RESULT inline bool operator< (const QVersionNumber &lhs, const QVersionNumber &rhs) Q_DECL_NOTHROW
+Q_REQUIRED_RESULT inline bool operator< (const QVersionNumber &lhs, const QVersionNumber &rhs) noexcept
{ return QVersionNumber::compare(lhs, rhs) < 0; }
-Q_REQUIRED_RESULT inline bool operator<=(const QVersionNumber &lhs, const QVersionNumber &rhs) Q_DECL_NOTHROW
+Q_REQUIRED_RESULT inline bool operator<=(const QVersionNumber &lhs, const QVersionNumber &rhs) noexcept
{ return QVersionNumber::compare(lhs, rhs) <= 0; }
-Q_REQUIRED_RESULT inline bool operator==(const QVersionNumber &lhs, const QVersionNumber &rhs) Q_DECL_NOTHROW
+Q_REQUIRED_RESULT inline bool operator==(const QVersionNumber &lhs, const QVersionNumber &rhs) noexcept
{ return QVersionNumber::compare(lhs, rhs) == 0; }
-Q_REQUIRED_RESULT inline bool operator!=(const QVersionNumber &lhs, const QVersionNumber &rhs) Q_DECL_NOTHROW
+Q_REQUIRED_RESULT inline bool operator!=(const QVersionNumber &lhs, const QVersionNumber &rhs) noexcept
{ return QVersionNumber::compare(lhs, rhs) != 0; }
QT_END_NAMESPACE
diff --git a/src/corelib/tools/qvsnprintf.cpp b/src/corelib/tools/qvsnprintf.cpp
deleted file mode 100644
index 43a21771a1..0000000000
--- a/src/corelib/tools/qvsnprintf.cpp
+++ /dev/null
@@ -1,129 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#include "qplatformdefs.h"
-
-#include "qbytearray.h"
-#include "qstring.h"
-
-#include "string.h"
-
-QT_BEGIN_NAMESPACE
-
-#if !defined(QT_VSNPRINTF) || defined(Q_CLANG_QDOC)
-
-/*!
- \relates QByteArray
-
- A portable \c vsnprintf() function. Will call \c ::vsnprintf(), \c
- ::_vsnprintf(), or \c ::vsnprintf_s depending on the system, or
- fall back to an internal version.
-
- \a fmt is the \c printf() format string. The result is put into
- \a str, which is a buffer of at least \a n bytes.
-
- The caller is responsible to call \c va_end() on \a ap.
-
- \warning Since vsnprintf() shows different behavior on certain
- platforms, you should not rely on the return value or on the fact
- that you will always get a 0 terminated string back.
-
- Ideally, you should never call this function but use QString::asprintf()
- instead.
-
- \sa qsnprintf(), QString::asprintf()
-*/
-
-int qvsnprintf(char *str, size_t n, const char *fmt, va_list ap)
-{
- if (!str || !fmt)
- return -1;
-
- const QByteArray ba = QString::vasprintf(fmt, ap).toLocal8Bit();
-
- if (n > 0) {
- size_t blen = qMin(size_t(ba.length()), size_t(n - 1));
- memcpy(str, ba.constData(), blen);
- str[blen] = '\0'; // make sure str is always 0 terminated
- }
-
- return ba.length();
-}
-
-#else
-
-QT_BEGIN_INCLUDE_NAMESPACE
-#include <stdio.h>
-QT_END_INCLUDE_NAMESPACE
-
-int qvsnprintf(char *str, size_t n, const char *fmt, va_list ap)
-{
- return QT_VSNPRINTF(str, n, fmt, ap);
-}
-
-#endif
-
-/*!
- \target bytearray-qsnprintf
- \relates QByteArray
-
- A portable snprintf() function, calls qvsnprintf.
-
- \a fmt is the \c printf() format string. The result is put into
- \a str, which is a buffer of at least \a n bytes.
-
- \warning Call this function only when you know what you are doing
- since it shows different behavior on certain platforms.
- Use QString::asprintf() to format a string instead.
-
- \sa qvsnprintf(), QString::asprintf()
-*/
-
-int qsnprintf(char *str, size_t n, const char *fmt, ...)
-{
- va_list ap;
- va_start(ap, fmt);
-
- int ret = qvsnprintf(str, n, fmt, ap);
- va_end(ap);
-
- return ret;
-}
-
-QT_END_NAMESPACE
diff --git a/src/corelib/tools/tools.pri b/src/corelib/tools/tools.pri
index 995bab694e..40c84157cd 100644
--- a/src/corelib/tools/tools.pri
+++ b/src/corelib/tools/tools.pri
@@ -8,21 +8,10 @@ HEADERS += \
tools/qarraydataops.h \
tools/qarraydatapointer.h \
tools/qbitarray.h \
- tools/qbytearray.h \
- tools/qbytearray_p.h \
- tools/qbytearraylist.h \
- tools/qbytearraymatcher.h \
- tools/qbytedata_p.h \
tools/qcache.h \
- tools/qchar.h \
- tools/qcollator.h \
- tools/qcollator_p.h \
tools/qcontainerfwd.h \
+ tools/qcontainertools_impl.h \
tools/qcryptographichash.h \
- tools/qdatetime.h \
- tools/qdatetime_p.h \
- tools/qdoublescanprint_p.h \
- tools/qeasingcurve.h \
tools/qfreelist_p.h \
tools/qhash.h \
tools/qhashfunctions.h \
@@ -30,10 +19,6 @@ HEADERS += \
tools/qline.h \
tools/qlinkedlist.h \
tools/qlist.h \
- tools/qlocale.h \
- tools/qlocale_p.h \
- tools/qlocale_tools_p.h \
- tools/qlocale_data_p.h \
tools/qmakearray_p.h \
tools/qmap.h \
tools/qmargins.h \
@@ -44,7 +29,6 @@ HEADERS += \
tools/qpoint.h \
tools/qqueue.h \
tools/qrect.h \
- tools/qregexp.h \
tools/qringbuffer_p.h \
tools/qrefcount.h \
tools/qscopeguard.h \
@@ -58,20 +42,7 @@ HEADERS += \
tools/qsimd_p.h \
tools/qsize.h \
tools/qstack.h \
- tools/qstring.h \
- tools/qstringalgorithms.h \
- tools/qstringalgorithms_p.h \
- tools/qstringbuilder.h \
- tools/qstringiterator_p.h \
- tools/qstringlist.h \
- tools/qstringliteral.h \
- tools/qstringmatcher.h \
- tools/qstringview.h \
- tools/qtextboundaryfinder.h \
- tools/qtimeline.h \
tools/qtools_p.h \
- tools/qunicodetables_p.h \
- tools/qunicodetools_p.h \
tools/qvarlengtharray.h \
tools/qvector.h \
tools/qversionnumber.h
@@ -80,59 +51,29 @@ HEADERS += \
SOURCES += \
tools/qarraydata.cpp \
tools/qbitarray.cpp \
- tools/qbytearray.cpp \
- tools/qbytearraylist.cpp \
- tools/qbytearraymatcher.cpp \
- tools/qcollator.cpp \
tools/qcryptographichash.cpp \
- tools/qdatetime.cpp \
- tools/qeasingcurve.cpp \
tools/qfreelist.cpp \
tools/qhash.cpp \
tools/qline.cpp \
tools/qlinkedlist.cpp \
tools/qlist.cpp \
- tools/qlocale.cpp \
- tools/qlocale_tools.cpp \
tools/qpoint.cpp \
tools/qmap.cpp \
tools/qmargins.cpp \
tools/qmessageauthenticationcode.cpp \
tools/qcontiguouscache.cpp \
tools/qrect.cpp \
- tools/qregexp.cpp \
tools/qrefcount.cpp \
tools/qringbuffer.cpp \
tools/qshareddata.cpp \
tools/qsharedpointer.cpp \
tools/qsimd.cpp \
tools/qsize.cpp \
- tools/qstring.cpp \
- tools/qstringbuilder.cpp \
- tools/qstringlist.cpp \
- tools/qstringview.cpp \
- tools/qtextboundaryfinder.cpp \
- tools/qtimeline.cpp \
- tools/qunicodetools.cpp \
- tools/qvsnprintf.cpp \
tools/qversionnumber.cpp
-NO_PCH_SOURCES = tools/qstring_compat.cpp
msvc: NO_PCH_SOURCES += tools/qvector_msvc.cpp
false: SOURCES += $$NO_PCH_SOURCES # Hack for QtCreator
-!nacl:mac: {
- SOURCES += tools/qlocale_mac.mm
-}
-else:unix {
- SOURCES += tools/qlocale_unix.cpp
-}
-else:win32 {
- SOURCES += tools/qlocale_win.cpp
-} else:integrity {
- SOURCES += tools/qlocale_unix.cpp
-}
-
qtConfig(system-zlib) {
include($$PWD/../../3rdparty/zlib_dependency.pri)
} else {
@@ -140,54 +81,6 @@ qtConfig(system-zlib) {
include($$PWD/../../3rdparty/zlib.pri)
}
-qtConfig(icu) {
- QMAKE_USE_PRIVATE += icu
-
- SOURCES += tools/qlocale_icu.cpp \
- tools/qcollator_icu.cpp
-} else: win32 {
- SOURCES += tools/qcollator_win.cpp
-} else: macx {
- SOURCES += tools/qcollator_macx.cpp
-} else {
- SOURCES += tools/qcollator_posix.cpp
-}
-
-qtConfig(timezone) {
- HEADERS += \
- tools/qtimezone.h \
- tools/qtimezoneprivate_p.h \
- tools/qtimezoneprivate_data_p.h
- SOURCES += \
- tools/qtimezone.cpp \
- tools/qtimezoneprivate.cpp
- !nacl:darwin: {
- SOURCES += tools/qtimezoneprivate_mac.mm
- } else: android:!android-embedded: {
- SOURCES += tools/qtimezoneprivate_android.cpp
- } else: unix: {
- SOURCES += tools/qtimezoneprivate_tz.cpp
- qtConfig(icu): SOURCES += tools/qtimezoneprivate_icu.cpp
- } else: qtConfig(icu): {
- SOURCES += tools/qtimezoneprivate_icu.cpp
- } else: win32: {
- SOURCES += tools/qtimezoneprivate_win.cpp
- }
-}
-
-qtConfig(datetimeparser) {
- HEADERS += tools/qdatetimeparser_p.h
- SOURCES += tools/qdatetimeparser.cpp
-}
-
-qtConfig(regularexpression) {
- QMAKE_USE_PRIVATE += pcre2
-
- HEADERS += \
- tools/qregularexpression.h
- SOURCES += tools/qregularexpression.cpp
-}
-
qtConfig(commandlineparser) {
HEADERS += \
tools/qcommandlineoption.h \
@@ -197,19 +90,6 @@ qtConfig(commandlineparser) {
tools/qcommandlineparser.cpp
}
-INCLUDEPATH += ../3rdparty/harfbuzz/src
-HEADERS += ../3rdparty/harfbuzz/src/harfbuzz.h
-SOURCES += ../3rdparty/harfbuzz/src/harfbuzz-buffer.c \
- ../3rdparty/harfbuzz/src/harfbuzz-gdef.c \
- ../3rdparty/harfbuzz/src/harfbuzz-gsub.c \
- ../3rdparty/harfbuzz/src/harfbuzz-gpos.c \
- ../3rdparty/harfbuzz/src/harfbuzz-impl.c \
- ../3rdparty/harfbuzz/src/harfbuzz-open.c \
- ../3rdparty/harfbuzz/src/harfbuzz-stream.c \
- ../3rdparty/harfbuzz/src/harfbuzz-shaper-all.cpp \
- tools/qharfbuzz.cpp
-HEADERS += tools/qharfbuzz_p.h
-
INCLUDEPATH += ../3rdparty/md5 \
../3rdparty/md4 \
../3rdparty/sha3
@@ -220,11 +100,20 @@ qtConfig(system-doubleconversion) {
include($$PWD/../../3rdparty/double-conversion/double-conversion.pri)
}
+qtConfig(easingcurve) {
+ HEADERS += \
+ tools/qeasingcurve.h \
+ tools/qtimeline.h
+
+ SOURCES += \
+ tools/qeasingcurve.cpp \
+ tools/qtimeline.cpp
+}
+
# Note: libm should be present by default becaue this is C++
unix:!macx-icc:!vxworks:!haiku:!integrity:!wasm: LIBS_PRIVATE += -lm
TR_EXCLUDE += ../3rdparty/*
# MIPS DSP
-MIPS_DSP_ASM += tools/qstring_mips_dsp_asm.S
MIPS_DSP_HEADERS += ../gui/painting/qt_mips_asm_dsp_p.h