Back to home page

EIC code displayed by LXR

 
 

    


File indexing completed on 2025-04-19 08:19:36

0001 // Copyright 2020-2022 Junekey Jeon
0002 //
0003 // The contents of this file may be used under the terms of
0004 // the Apache License v2.0 with LLVM Exceptions.
0005 //
0006 //    (See accompanying file LICENSE-Apache or copy at
0007 //     https://llvm.org/foundation/relicensing/LICENSE.txt)
0008 //
0009 // Alternatively, the contents of this file may be used under the terms of
0010 // the Boost Software License, Version 1.0.
0011 //    (See accompanying file LICENSE-Boost or copy at
0012 //     https://www.boost.org/LICENSE_1_0.txt)
0013 //
0014 // Unless required by applicable law or agreed to in writing, this software
0015 // is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
0016 // KIND, either express or implied.
0017 //
0018 // Some parts are copied from Dragonbox project.
0019 //
0020 // Copyright 2023 Matt Borland
0021 // Distributed under the Boost Software License, Version 1.0.
0022 // https://www.boost.org/LICENSE_1_0.txt
0023 
0024 #ifndef BOOST_CHARCONV_DETAIL_DRAGONBOX_COMMON_HPP
0025 #define BOOST_CHARCONV_DETAIL_DRAGONBOX_COMMON_HPP
0026 
0027 #include <boost/charconv/detail/config.hpp>
0028 #include <boost/charconv/detail/bit_layouts.hpp>
0029 #include <boost/charconv/detail/emulated128.hpp>
0030 #include <boost/charconv/chars_format.hpp>
0031 #include <boost/core/bit.hpp>
0032 #include <type_traits>
0033 #include <limits>
0034 #include <cstdint>
0035 #include <cstring>
0036 #include <cstddef>
0037 #include <climits>
0038 
0039 namespace boost { namespace charconv { namespace detail {
0040 
0041 template <typename T>
0042 struct physical_bits
0043 {
0044     static constexpr std::size_t value = sizeof(T) * CHAR_BIT;
0045 };
0046 
0047 template <typename T>
0048 struct value_bits
0049 {
0050     static constexpr std::size_t value = std::numeric_limits<typename std::enable_if<std::is_unsigned<T>::value, T>::type>::digits;
0051 };
0052 
0053 #ifdef BOOST_NO_CXX17_INLINE_VARIABLES
0054 
0055 template <typename T> constexpr std::size_t physical_bits<T>::value;
0056 template <typename T> constexpr std::size_t value_bits<T>::value;
0057 
0058 #endif
0059 
0060 // A floating-point traits class defines ways to interpret a bit pattern of given size as an
0061 // encoding of floating-point number. This is a default implementation of such a traits class,
0062 // supporting ways to interpret 32-bits into a binary32-encoded floating-point number and to
0063 // interpret 64-bits into a binary64-encoded floating-point number. Users might specialize this
0064 // class to change the default behavior for certain types.
0065 template <typename T>
0066 struct default_float_traits 
0067 {
0068     // I don't know if there is a truly reliable way of detecting
0069     // IEEE-754 binary32/binary64 formats; I just did my best here.
0070     static_assert(std::numeric_limits<T>::is_iec559 && std::numeric_limits<T>::radix == 2 &&
0071                   (detail::physical_bits<T>::value == 32 || detail::physical_bits<T>::value == 64),
0072                     "default_ieee754_traits only works for 32-bits or 64-bits types "
0073                     "supporting binary32 or binary64 formats!");
0074 
0075     // The type that is being viewed.
0076     using type = T;
0077 
0078     // Refers to the format specification class.
0079     using format =
0080         typename std::conditional<detail::physical_bits<T>::value == 32, detail::ieee754_binary32, detail::ieee754_binary64>::type;
0081 
0082     // Defines an unsignedeger type that is large enough to carry a variable of type T.
0083     // Most of the operations will be done on this integer type.
0084     using carrier_uint = typename std::conditional<detail::physical_bits<T>::value == 32, std::uint32_t, std::uint64_t>::type;
0085     
0086     static_assert(sizeof(carrier_uint) == sizeof(T), "carrier_uint must be T");
0087 
0088     // Number of bits in the above unsignedeger type.
0089     static constexpr int carrier_bits = static_cast<int>(detail::physical_bits<carrier_uint>::value);
0090 
0091     // Convert from carrier_uint into the original type.
0092     // Depending on the floating-point encoding format, this operation might not be possible for
0093     // some specific bit patterns. However, the contract is that u always denotes a
0094     // valid bit pattern, so this function must be assumed to be noexcept.
0095     static T carrier_to_float(carrier_uint u) noexcept
0096     {
0097         T x;
0098         std::memcpy(&x, &u, sizeof(carrier_uint));
0099         return x;
0100     }
0101 
0102     // Same as above.
0103     static carrier_uint float_to_carrier(T x) noexcept
0104     {
0105         carrier_uint u;
0106         std::memcpy(&u, &x, sizeof(carrier_uint));
0107         return u;
0108     }
0109 
0110     // Extract exponent bits from a bit pattern.
0111     // The result must be aligned to the LSB so that there is no additional zero paddings
0112     // on the right. This function does not do bias adjustment.
0113     static constexpr unsigned extract_exponent_bits(carrier_uint u) noexcept
0114     {
0115         return static_cast<unsigned>(u >> format::exponent_bits) & static_cast<unsigned>((1U << format::exponent_bits) - 1);
0116     }
0117 
0118     // Extract significand bits from a bit pattern.
0119     // The result must be aligned to the LSB so that there is no additional zero paddings
0120     // on the right. The result does not contain the implicit bit.
0121     static constexpr carrier_uint extract_significand_bits(carrier_uint u) noexcept 
0122     {
0123         return static_cast<carrier_uint>(u & static_cast<carrier_uint>((static_cast<carrier_uint>(1) << format::significand_bits) - 1));
0124     }
0125 
0126     // Remove the exponent bits and extract significand bits together with the sign bit.
0127     static constexpr carrier_uint remove_exponent_bits(carrier_uint u, unsigned exponent_bits) noexcept
0128     {
0129         return u ^ (static_cast<carrier_uint>(exponent_bits) << format::significand_bits);
0130     }
0131 
0132     // Shift the obtained signed significand bits to the left by 1 to remove the sign bit.
0133     static constexpr carrier_uint remove_sign_bit_and_shift(carrier_uint u) noexcept
0134     {
0135         return static_cast<carrier_uint>(static_cast<carrier_uint>(u) << 1);
0136     }
0137 
0138     // The actual value of exponent is obtained by adding this value to the extracted exponent bits
0139     static constexpr int exponent_bias = 1 - (1 << (carrier_bits - format::significand_bits - 2));
0140 
0141     // Obtain the actual value of the binary exponent from the extracted exponent bits.
0142     static constexpr int binary_exponent(unsigned exponent_bits) noexcept 
0143     {
0144         return exponent_bits == 0 ? format::min_exponent : static_cast<int>(exponent_bits) + format::exponent_bias;
0145     }
0146 
0147     // Obtain the actual value of the binary exponent from the extracted significand bits and
0148     // exponent bits.
0149     static constexpr carrier_uint binary_significand(carrier_uint significand_bits, unsigned exponent_bits) noexcept 
0150     {
0151         return exponent_bits == 0 ? significand_bits : (significand_bits | (static_cast<carrier_uint>(1) << format::significand_bits));
0152     }
0153 
0154 
0155     // Various boolean observer functions
0156 
0157     static constexpr bool is_nonzero(carrier_uint u) noexcept { return (u << 1) != 0; }
0158     
0159     static constexpr bool is_positive(carrier_uint u) noexcept 
0160     {
0161         return u < static_cast<carrier_uint>(1) << (format::significand_bits + format::exponent_bits);
0162     }
0163     
0164     static constexpr bool is_negative(carrier_uint u) noexcept { return !is_positive(u); }
0165     
0166     static constexpr bool is_finite(unsigned exponent_bits) noexcept
0167     {
0168         //constexpr unsigned exponent_bits_all_set = (1u << format::exponent_bits) - 1;
0169         return exponent_bits != (1u << format::exponent_bits) - 1;
0170     }
0171     
0172     static constexpr bool has_all_zero_significand_bits(carrier_uint u) noexcept
0173     {
0174         return (u << 1) == 0;
0175     }
0176     
0177     static constexpr bool has_even_significand_bits(carrier_uint u) noexcept
0178     {
0179         return u % 2 == 0;
0180     }
0181 };
0182 
0183 // Convenient wrappers for floating-point traits classes.
0184 // In order to reduce the argument passing overhead, these classes should be as simple as
0185 // possible (e.g., no inheritance, no private non-static data member, etc.; this is an
0186 // unfortunate fact about common ABI convention).
0187 
0188 template <typename T, typename Traits = default_float_traits<T>>
0189 struct float_bits;
0190 
0191 template <typename T, typename Traits = default_float_traits<T>>
0192 struct signed_significand_bits;
0193 
0194 template <typename T, typename Traits>
0195 struct float_bits
0196 {
0197     using type = T;
0198     using traits_type = Traits;
0199     using carrier_uint = typename traits_type::carrier_uint;
0200 
0201     carrier_uint u;
0202 
0203     float_bits() = default;
0204     constexpr explicit float_bits(carrier_uint bit_pattern) noexcept : u{bit_pattern} {}
0205     constexpr explicit float_bits(T float_value) noexcept : u{traits_type::float_to_carrier(float_value)} {}
0206 
0207     constexpr T to_float() const noexcept { return traits_type::carrier_to_float(u); }
0208 
0209     // Extract exponent bits from a bit pattern.
0210     // The result must be aligned to the LSB so that there is no additional zero paddings
0211     // on the right. This function does not do bias adjustment.
0212     constexpr unsigned extract_exponent_bits() const noexcept
0213     {
0214         return traits_type::extract_exponent_bits(u);
0215     }
0216 
0217     // Extract significand bits from a bit pattern.
0218     // The result must be aligned to the LSB so that there is no additional zero paddings
0219     // on the right. The result does not contain the implicit bit.
0220     constexpr carrier_uint extract_significand_bits() const noexcept
0221     {
0222         return traits_type::extract_significand_bits(u);
0223     }
0224 
0225     // Remove the exponent bits and extract significand bits together with the sign bit.
0226     constexpr signed_significand_bits<type, traits_type> remove_exponent_bits(unsigned exponent_bits) const noexcept 
0227     {
0228         return signed_significand_bits<type, traits_type>(traits_type::remove_exponent_bits(u, exponent_bits));
0229     }
0230 
0231     // Obtain the actual value of the binary exponent from the extracted exponent bits.
0232     static constexpr int binary_exponent(unsigned exponent_bits) noexcept 
0233     {
0234         return traits_type::binary_exponent(exponent_bits);
0235     }
0236 
0237     constexpr int binary_exponent() const noexcept
0238     {
0239         return binary_exponent(extract_exponent_bits());
0240     }
0241 
0242     // Obtain the actual value of the binary exponent from the extracted significand bits and
0243     // exponent bits.
0244     static constexpr carrier_uint binary_significand(carrier_uint significand_bits, unsigned exponent_bits) noexcept 
0245     {
0246         return traits_type::binary_significand(significand_bits, exponent_bits);
0247     }
0248 
0249     constexpr carrier_uint binary_significand() const noexcept 
0250     {
0251         return binary_significand(extract_significand_bits(), extract_exponent_bits());
0252     }
0253 
0254     constexpr bool is_nonzero() const noexcept { return traits_type::is_nonzero(u); }
0255     
0256     constexpr bool is_positive() const noexcept { return traits_type::is_positive(u); }
0257     
0258     constexpr bool is_negative() const noexcept { return traits_type::is_negative(u); }
0259     
0260     constexpr bool is_finite(unsigned exponent_bits) const noexcept { return traits_type::is_finite(exponent_bits); }
0261     
0262     constexpr bool is_finite() const noexcept { return traits_type::is_finite(extract_exponent_bits()); }
0263     
0264     constexpr bool has_even_significand_bits() const noexcept { return traits_type::has_even_significand_bits(u); }
0265 };
0266 
0267 template <typename T, typename Traits>
0268 struct signed_significand_bits 
0269 {
0270     using type = T;
0271     using traits_type = Traits;
0272     using carrier_uint = typename traits_type::carrier_uint;
0273 
0274     carrier_uint u;
0275 
0276     signed_significand_bits() = default;
0277     constexpr explicit signed_significand_bits(carrier_uint bit_pattern) noexcept
0278         : u{bit_pattern} {}
0279 
0280     // Shift the obtained signed significand bits to the left by 1 to remove the sign bit.
0281     constexpr carrier_uint remove_sign_bit_and_shift() const noexcept 
0282     {
0283         return traits_type::remove_sign_bit_and_shift(u);
0284     }
0285 
0286     constexpr bool is_positive() const noexcept { return traits_type::is_positive(u); }
0287     
0288     constexpr bool is_negative() const noexcept { return traits_type::is_negative(u); }
0289     
0290     constexpr bool has_all_zero_significand_bits() const noexcept 
0291     {
0292         return traits_type::has_all_zero_significand_bits(u);
0293     }
0294     
0295     constexpr bool has_even_significand_bits() const noexcept
0296     {
0297         return traits_type::has_even_significand_bits(u);
0298     }
0299 };
0300 
0301 ////////////////////////////////////////////////////////////////////////////////////////
0302 // Some simple utilities for constexpr computation.
0303 ////////////////////////////////////////////////////////////////////////////////////////
0304 
0305 template <class Int, class Int2>
0306 BOOST_CHARCONV_CXX14_CONSTEXPR Int compute_power(Int a, Int2 exp) noexcept
0307 {
0308     BOOST_CHARCONV_ASSERT(exp >= 0);
0309 
0310     Int res = 1;
0311     while (exp > 0)
0312     {
0313         if (exp % 2 != 0)
0314         {
0315             res *= a;
0316         }
0317 
0318         a *= a;
0319         exp >>= 1;
0320     }
0321     return res;
0322 }
0323 
0324 static constexpr std::uint64_t power_of_10[] = {
0325     UINT64_C(1), UINT64_C(10), UINT64_C(100), UINT64_C(1000), UINT64_C(10000), 
0326     UINT64_C(100000), UINT64_C(1000000), UINT64_C(10000000), UINT64_C(100000000),
0327     UINT64_C(1000000000), UINT64_C(10000000000), UINT64_C(100000000000), UINT64_C(1000000000000),
0328     UINT64_C(10000000000000), UINT64_C(100000000000000), UINT64_C(1000000000000000), 
0329     UINT64_C(10000000000000000), UINT64_C(100000000000000000), UINT64_C(1000000000000000000), 
0330     UINT64_C(10000000000000000000)
0331 };
0332 
0333 static_assert(sizeof(power_of_10) == 20 * sizeof(std::uint64_t), "There should be the first 20 powers of 10");
0334 
0335 
0336 template <unsigned a, typename UInt>
0337 BOOST_CHARCONV_CXX14_CONSTEXPR int count_factors(UInt n) noexcept
0338 {
0339     int c = 0;
0340 
0341     while (n % a == 0)
0342     {
0343         n /= a;
0344         ++c;
0345     }
0346     return c;
0347 }
0348 
0349 ////////////////////////////////////////////////////////////////////////////////////////
0350 // Utilities for fast/constexpr log computation.
0351 ////////////////////////////////////////////////////////////////////////////////////////
0352 
0353 namespace log  {
0354 static_assert((-1 >> 1) == -1, "right-shift for signed integers must be arithmetic");
0355 
0356 // Compute floor(e * c - s).
0357 enum class multiply : std::uint32_t {};
0358 enum class subtract : std::uint32_t {};
0359 enum class shift : std::size_t {};
0360 enum class min_exponent : std::int32_t {};
0361 enum class max_exponent : std::int32_t {};
0362 
0363 template <multiply m, subtract f, shift k, min_exponent e_min, max_exponent e_max>
0364 constexpr int compute(int e) noexcept
0365 {
0366     return static_cast<int>((std::int32_t(e) * std::int32_t(m) - std::int32_t(f)) >> std::size_t(k));
0367 }
0368 
0369 // For constexpr computation.
0370 // Returns -1 when n = 0.
0371 template <class UInt>
0372 BOOST_CHARCONV_CXX14_CONSTEXPR int floor_log2(UInt n) noexcept
0373 {
0374     int count = -1;
0375     while (n != 0) 
0376     {
0377         ++count;
0378         n >>= 1;
0379     }
0380     
0381     return count;
0382 }
0383 
0384 static constexpr int floor_log10_pow2_min_exponent = -2620;
0385 
0386 static constexpr int floor_log10_pow2_max_exponent = 2620;
0387 
0388 constexpr int floor_log10_pow2(int e) noexcept
0389 {
0390     using namespace log;
0391     return compute<multiply(315653), subtract(0), shift(20),
0392                     min_exponent(floor_log10_pow2_min_exponent),
0393                     max_exponent(floor_log10_pow2_max_exponent)>(e);
0394 }
0395 
0396 static constexpr int floor_log2_pow10_min_exponent = -1233;
0397 
0398 static constexpr int floor_log2_pow10_max_exponent = 1233;
0399 
0400 constexpr int floor_log2_pow10(int e) noexcept 
0401 {
0402     using namespace log;
0403     return compute<multiply(1741647), subtract(0), shift(19),
0404                     min_exponent(floor_log2_pow10_min_exponent),
0405                     max_exponent(floor_log2_pow10_max_exponent)>(e);
0406 }
0407 
0408 static constexpr int floor_log10_pow2_minus_log10_4_over_3_min_exponent = -2985;
0409 
0410 static constexpr int floor_log10_pow2_minus_log10_4_over_3_max_exponent = 2936;
0411 
0412 constexpr int floor_log10_pow2_minus_log10_4_over_3(int e) noexcept
0413 {
0414     using namespace log;
0415     return compute<multiply(631305), subtract(261663), shift(21),
0416                     min_exponent(floor_log10_pow2_minus_log10_4_over_3_min_exponent),
0417                     max_exponent(floor_log10_pow2_minus_log10_4_over_3_max_exponent)>(e);
0418 }
0419 
0420 static constexpr int floor_log5_pow2_min_exponent = -1831;
0421 
0422 static constexpr int floor_log5_pow2_max_exponent = 1831;
0423 
0424 constexpr int floor_log5_pow2(int e) noexcept
0425 {
0426     using namespace log;
0427     return compute<multiply(225799), subtract(0), shift(19),
0428                     min_exponent(floor_log5_pow2_min_exponent),
0429                     max_exponent(floor_log5_pow2_max_exponent)>(e);
0430 }
0431 
0432 static constexpr int floor_log5_pow2_minus_log5_3_min_exponent = -3543;
0433 
0434 static constexpr int floor_log5_pow2_minus_log5_3_max_exponent = 2427;
0435 
0436 constexpr int floor_log5_pow2_minus_log5_3(int e) noexcept 
0437 {
0438     using namespace log;
0439     return compute<multiply(451597), subtract(715764), shift(20),
0440                     min_exponent(floor_log5_pow2_minus_log5_3_min_exponent),
0441                     max_exponent(floor_log5_pow2_minus_log5_3_max_exponent)>(e);
0442 }
0443 } // Namespace log
0444 
0445 template <bool b>
0446 struct main_cache_holder_impl
0447 {
0448     using cache_entry_type = boost::charconv::detail::uint128;
0449     static constexpr int cache_bits = 128;
0450     static constexpr int min_k = -292;
0451     static constexpr int max_k = 326;
0452     static constexpr cache_entry_type cache[] = {
0453         {0xff77b1fcbebcdc4f, 0x25e8e89c13bb0f7b}, {0x9faacf3df73609b1, 0x77b191618c54e9ad},
0454         {0xc795830d75038c1d, 0xd59df5b9ef6a2418}, {0xf97ae3d0d2446f25, 0x4b0573286b44ad1e},
0455         {0x9becce62836ac577, 0x4ee367f9430aec33}, {0xc2e801fb244576d5, 0x229c41f793cda740},
0456         {0xf3a20279ed56d48a, 0x6b43527578c11110}, {0x9845418c345644d6, 0x830a13896b78aaaa},
0457         {0xbe5691ef416bd60c, 0x23cc986bc656d554}, {0xedec366b11c6cb8f, 0x2cbfbe86b7ec8aa9},
0458         {0x94b3a202eb1c3f39, 0x7bf7d71432f3d6aa}, {0xb9e08a83a5e34f07, 0xdaf5ccd93fb0cc54},
0459         {0xe858ad248f5c22c9, 0xd1b3400f8f9cff69}, {0x91376c36d99995be, 0x23100809b9c21fa2},
0460         {0xb58547448ffffb2d, 0xabd40a0c2832a78b}, {0xe2e69915b3fff9f9, 0x16c90c8f323f516d},
0461         {0x8dd01fad907ffc3b, 0xae3da7d97f6792e4}, {0xb1442798f49ffb4a, 0x99cd11cfdf41779d},
0462         {0xdd95317f31c7fa1d, 0x40405643d711d584}, {0x8a7d3eef7f1cfc52, 0x482835ea666b2573},
0463         {0xad1c8eab5ee43b66, 0xda3243650005eed0}, {0xd863b256369d4a40, 0x90bed43e40076a83},
0464         {0x873e4f75e2224e68, 0x5a7744a6e804a292}, {0xa90de3535aaae202, 0x711515d0a205cb37},
0465         {0xd3515c2831559a83, 0x0d5a5b44ca873e04}, {0x8412d9991ed58091, 0xe858790afe9486c3},
0466         {0xa5178fff668ae0b6, 0x626e974dbe39a873}, {0xce5d73ff402d98e3, 0xfb0a3d212dc81290},
0467         {0x80fa687f881c7f8e, 0x7ce66634bc9d0b9a}, {0xa139029f6a239f72, 0x1c1fffc1ebc44e81},
0468         {0xc987434744ac874e, 0xa327ffb266b56221}, {0xfbe9141915d7a922, 0x4bf1ff9f0062baa9},
0469         {0x9d71ac8fada6c9b5, 0x6f773fc3603db4aa}, {0xc4ce17b399107c22, 0xcb550fb4384d21d4},
0470         {0xf6019da07f549b2b, 0x7e2a53a146606a49}, {0x99c102844f94e0fb, 0x2eda7444cbfc426e},
0471         {0xc0314325637a1939, 0xfa911155fefb5309}, {0xf03d93eebc589f88, 0x793555ab7eba27cb},
0472         {0x96267c7535b763b5, 0x4bc1558b2f3458df}, {0xbbb01b9283253ca2, 0x9eb1aaedfb016f17},
0473         {0xea9c227723ee8bcb, 0x465e15a979c1cadd}, {0x92a1958a7675175f, 0x0bfacd89ec191eca},
0474         {0xb749faed14125d36, 0xcef980ec671f667c}, {0xe51c79a85916f484, 0x82b7e12780e7401b},
0475         {0x8f31cc0937ae58d2, 0xd1b2ecb8b0908811}, {0xb2fe3f0b8599ef07, 0x861fa7e6dcb4aa16},
0476         {0xdfbdcece67006ac9, 0x67a791e093e1d49b}, {0x8bd6a141006042bd, 0xe0c8bb2c5c6d24e1},
0477         {0xaecc49914078536d, 0x58fae9f773886e19}, {0xda7f5bf590966848, 0xaf39a475506a899f},
0478         {0x888f99797a5e012d, 0x6d8406c952429604}, {0xaab37fd7d8f58178, 0xc8e5087ba6d33b84},
0479         {0xd5605fcdcf32e1d6, 0xfb1e4a9a90880a65}, {0x855c3be0a17fcd26, 0x5cf2eea09a550680},
0480         {0xa6b34ad8c9dfc06f, 0xf42faa48c0ea481f}, {0xd0601d8efc57b08b, 0xf13b94daf124da27},
0481         {0x823c12795db6ce57, 0x76c53d08d6b70859}, {0xa2cb1717b52481ed, 0x54768c4b0c64ca6f},
0482         {0xcb7ddcdda26da268, 0xa9942f5dcf7dfd0a}, {0xfe5d54150b090b02, 0xd3f93b35435d7c4d},
0483         {0x9efa548d26e5a6e1, 0xc47bc5014a1a6db0}, {0xc6b8e9b0709f109a, 0x359ab6419ca1091c},
0484         {0xf867241c8cc6d4c0, 0xc30163d203c94b63}, {0x9b407691d7fc44f8, 0x79e0de63425dcf1e},
0485         {0xc21094364dfb5636, 0x985915fc12f542e5}, {0xf294b943e17a2bc4, 0x3e6f5b7b17b2939e},
0486         {0x979cf3ca6cec5b5a, 0xa705992ceecf9c43}, {0xbd8430bd08277231, 0x50c6ff782a838354},
0487         {0xece53cec4a314ebd, 0xa4f8bf5635246429}, {0x940f4613ae5ed136, 0x871b7795e136be9a},
0488         {0xb913179899f68584, 0x28e2557b59846e40}, {0xe757dd7ec07426e5, 0x331aeada2fe589d0},
0489         {0x9096ea6f3848984f, 0x3ff0d2c85def7622}, {0xb4bca50b065abe63, 0x0fed077a756b53aa},
0490         {0xe1ebce4dc7f16dfb, 0xd3e8495912c62895}, {0x8d3360f09cf6e4bd, 0x64712dd7abbbd95d},
0491         {0xb080392cc4349dec, 0xbd8d794d96aacfb4}, {0xdca04777f541c567, 0xecf0d7a0fc5583a1},
0492         {0x89e42caaf9491b60, 0xf41686c49db57245}, {0xac5d37d5b79b6239, 0x311c2875c522ced6},
0493         {0xd77485cb25823ac7, 0x7d633293366b828c}, {0x86a8d39ef77164bc, 0xae5dff9c02033198},
0494         {0xa8530886b54dbdeb, 0xd9f57f830283fdfd}, {0xd267caa862a12d66, 0xd072df63c324fd7c},
0495         {0x8380dea93da4bc60, 0x4247cb9e59f71e6e}, {0xa46116538d0deb78, 0x52d9be85f074e609},
0496         {0xcd795be870516656, 0x67902e276c921f8c}, {0x806bd9714632dff6, 0x00ba1cd8a3db53b7},
0497         {0xa086cfcd97bf97f3, 0x80e8a40eccd228a5}, {0xc8a883c0fdaf7df0, 0x6122cd128006b2ce},
0498         {0xfad2a4b13d1b5d6c, 0x796b805720085f82}, {0x9cc3a6eec6311a63, 0xcbe3303674053bb1},
0499         {0xc3f490aa77bd60fc, 0xbedbfc4411068a9d}, {0xf4f1b4d515acb93b, 0xee92fb5515482d45},
0500         {0x991711052d8bf3c5, 0x751bdd152d4d1c4b}, {0xbf5cd54678eef0b6, 0xd262d45a78a0635e},
0501         {0xef340a98172aace4, 0x86fb897116c87c35}, {0x9580869f0e7aac0e, 0xd45d35e6ae3d4da1},
0502         {0xbae0a846d2195712, 0x8974836059cca10a}, {0xe998d258869facd7, 0x2bd1a438703fc94c},
0503         {0x91ff83775423cc06, 0x7b6306a34627ddd0}, {0xb67f6455292cbf08, 0x1a3bc84c17b1d543},
0504         {0xe41f3d6a7377eeca, 0x20caba5f1d9e4a94}, {0x8e938662882af53e, 0x547eb47b7282ee9d},
0505         {0xb23867fb2a35b28d, 0xe99e619a4f23aa44}, {0xdec681f9f4c31f31, 0x6405fa00e2ec94d5},
0506         {0x8b3c113c38f9f37e, 0xde83bc408dd3dd05}, {0xae0b158b4738705e, 0x9624ab50b148d446},
0507         {0xd98ddaee19068c76, 0x3badd624dd9b0958}, {0x87f8a8d4cfa417c9, 0xe54ca5d70a80e5d7},
0508         {0xa9f6d30a038d1dbc, 0x5e9fcf4ccd211f4d}, {0xd47487cc8470652b, 0x7647c32000696720},
0509         {0x84c8d4dfd2c63f3b, 0x29ecd9f40041e074}, {0xa5fb0a17c777cf09, 0xf468107100525891},
0510         {0xcf79cc9db955c2cc, 0x7182148d4066eeb5}, {0x81ac1fe293d599bf, 0xc6f14cd848405531},
0511         {0xa21727db38cb002f, 0xb8ada00e5a506a7d}, {0xca9cf1d206fdc03b, 0xa6d90811f0e4851d},
0512         {0xfd442e4688bd304a, 0x908f4a166d1da664}, {0x9e4a9cec15763e2e, 0x9a598e4e043287ff},
0513         {0xc5dd44271ad3cdba, 0x40eff1e1853f29fe}, {0xf7549530e188c128, 0xd12bee59e68ef47d},
0514         {0x9a94dd3e8cf578b9, 0x82bb74f8301958cf}, {0xc13a148e3032d6e7, 0xe36a52363c1faf02},
0515         {0xf18899b1bc3f8ca1, 0xdc44e6c3cb279ac2}, {0x96f5600f15a7b7e5, 0x29ab103a5ef8c0ba},
0516         {0xbcb2b812db11a5de, 0x7415d448f6b6f0e8}, {0xebdf661791d60f56, 0x111b495b3464ad22},
0517         {0x936b9fcebb25c995, 0xcab10dd900beec35}, {0xb84687c269ef3bfb, 0x3d5d514f40eea743},
0518         {0xe65829b3046b0afa, 0x0cb4a5a3112a5113}, {0x8ff71a0fe2c2e6dc, 0x47f0e785eaba72ac},
0519         {0xb3f4e093db73a093, 0x59ed216765690f57}, {0xe0f218b8d25088b8, 0x306869c13ec3532d},
0520         {0x8c974f7383725573, 0x1e414218c73a13fc}, {0xafbd2350644eeacf, 0xe5d1929ef90898fb},
0521         {0xdbac6c247d62a583, 0xdf45f746b74abf3a}, {0x894bc396ce5da772, 0x6b8bba8c328eb784},
0522         {0xab9eb47c81f5114f, 0x066ea92f3f326565}, {0xd686619ba27255a2, 0xc80a537b0efefebe},
0523         {0x8613fd0145877585, 0xbd06742ce95f5f37}, {0xa798fc4196e952e7, 0x2c48113823b73705},
0524         {0xd17f3b51fca3a7a0, 0xf75a15862ca504c6}, {0x82ef85133de648c4, 0x9a984d73dbe722fc},
0525         {0xa3ab66580d5fdaf5, 0xc13e60d0d2e0ebbb}, {0xcc963fee10b7d1b3, 0x318df905079926a9},
0526         {0xffbbcfe994e5c61f, 0xfdf17746497f7053}, {0x9fd561f1fd0f9bd3, 0xfeb6ea8bedefa634},
0527         {0xc7caba6e7c5382c8, 0xfe64a52ee96b8fc1}, {0xf9bd690a1b68637b, 0x3dfdce7aa3c673b1},
0528         {0x9c1661a651213e2d, 0x06bea10ca65c084f}, {0xc31bfa0fe5698db8, 0x486e494fcff30a63},
0529         {0xf3e2f893dec3f126, 0x5a89dba3c3efccfb}, {0x986ddb5c6b3a76b7, 0xf89629465a75e01d},
0530         {0xbe89523386091465, 0xf6bbb397f1135824}, {0xee2ba6c0678b597f, 0x746aa07ded582e2d},
0531         {0x94db483840b717ef, 0xa8c2a44eb4571cdd}, {0xba121a4650e4ddeb, 0x92f34d62616ce414},
0532         {0xe896a0d7e51e1566, 0x77b020baf9c81d18}, {0x915e2486ef32cd60, 0x0ace1474dc1d122f},
0533         {0xb5b5ada8aaff80b8, 0x0d819992132456bb}, {0xe3231912d5bf60e6, 0x10e1fff697ed6c6a},
0534         {0x8df5efabc5979c8f, 0xca8d3ffa1ef463c2}, {0xb1736b96b6fd83b3, 0xbd308ff8a6b17cb3},
0535         {0xddd0467c64bce4a0, 0xac7cb3f6d05ddbdf}, {0x8aa22c0dbef60ee4, 0x6bcdf07a423aa96c},
0536         {0xad4ab7112eb3929d, 0x86c16c98d2c953c7}, {0xd89d64d57a607744, 0xe871c7bf077ba8b8},
0537         {0x87625f056c7c4a8b, 0x11471cd764ad4973}, {0xa93af6c6c79b5d2d, 0xd598e40d3dd89bd0},
0538         {0xd389b47879823479, 0x4aff1d108d4ec2c4}, {0x843610cb4bf160cb, 0xcedf722a585139bb},
0539         {0xa54394fe1eedb8fe, 0xc2974eb4ee658829}, {0xce947a3da6a9273e, 0x733d226229feea33},
0540         {0x811ccc668829b887, 0x0806357d5a3f5260}, {0xa163ff802a3426a8, 0xca07c2dcb0cf26f8},
0541         {0xc9bcff6034c13052, 0xfc89b393dd02f0b6}, {0xfc2c3f3841f17c67, 0xbbac2078d443ace3},
0542         {0x9d9ba7832936edc0, 0xd54b944b84aa4c0e}, {0xc5029163f384a931, 0x0a9e795e65d4df12},
0543         {0xf64335bcf065d37d, 0x4d4617b5ff4a16d6}, {0x99ea0196163fa42e, 0x504bced1bf8e4e46},
0544         {0xc06481fb9bcf8d39, 0xe45ec2862f71e1d7}, {0xf07da27a82c37088, 0x5d767327bb4e5a4d},
0545         {0x964e858c91ba2655, 0x3a6a07f8d510f870}, {0xbbe226efb628afea, 0x890489f70a55368c},
0546         {0xeadab0aba3b2dbe5, 0x2b45ac74ccea842f}, {0x92c8ae6b464fc96f, 0x3b0b8bc90012929e},
0547         {0xb77ada0617e3bbcb, 0x09ce6ebb40173745}, {0xe55990879ddcaabd, 0xcc420a6a101d0516},
0548         {0x8f57fa54c2a9eab6, 0x9fa946824a12232e}, {0xb32df8e9f3546564, 0x47939822dc96abfa},
0549         {0xdff9772470297ebd, 0x59787e2b93bc56f8}, {0x8bfbea76c619ef36, 0x57eb4edb3c55b65b},
0550         {0xaefae51477a06b03, 0xede622920b6b23f2}, {0xdab99e59958885c4, 0xe95fab368e45ecee},
0551         {0x88b402f7fd75539b, 0x11dbcb0218ebb415}, {0xaae103b5fcd2a881, 0xd652bdc29f26a11a},
0552         {0xd59944a37c0752a2, 0x4be76d3346f04960}, {0x857fcae62d8493a5, 0x6f70a4400c562ddc},
0553         {0xa6dfbd9fb8e5b88e, 0xcb4ccd500f6bb953}, {0xd097ad07a71f26b2, 0x7e2000a41346a7a8},
0554         {0x825ecc24c873782f, 0x8ed400668c0c28c9}, {0xa2f67f2dfa90563b, 0x728900802f0f32fb},
0555         {0xcbb41ef979346bca, 0x4f2b40a03ad2ffba}, {0xfea126b7d78186bc, 0xe2f610c84987bfa9},
0556         {0x9f24b832e6b0f436, 0x0dd9ca7d2df4d7ca}, {0xc6ede63fa05d3143, 0x91503d1c79720dbc},
0557         {0xf8a95fcf88747d94, 0x75a44c6397ce912b}, {0x9b69dbe1b548ce7c, 0xc986afbe3ee11abb},
0558         {0xc24452da229b021b, 0xfbe85badce996169}, {0xf2d56790ab41c2a2, 0xfae27299423fb9c4},
0559         {0x97c560ba6b0919a5, 0xdccd879fc967d41b}, {0xbdb6b8e905cb600f, 0x5400e987bbc1c921},
0560         {0xed246723473e3813, 0x290123e9aab23b69}, {0x9436c0760c86e30b, 0xf9a0b6720aaf6522},
0561         {0xb94470938fa89bce, 0xf808e40e8d5b3e6a}, {0xe7958cb87392c2c2, 0xb60b1d1230b20e05},
0562         {0x90bd77f3483bb9b9, 0xb1c6f22b5e6f48c3}, {0xb4ecd5f01a4aa828, 0x1e38aeb6360b1af4},
0563         {0xe2280b6c20dd5232, 0x25c6da63c38de1b1}, {0x8d590723948a535f, 0x579c487e5a38ad0f},
0564         {0xb0af48ec79ace837, 0x2d835a9df0c6d852}, {0xdcdb1b2798182244, 0xf8e431456cf88e66},
0565         {0x8a08f0f8bf0f156b, 0x1b8e9ecb641b5900}, {0xac8b2d36eed2dac5, 0xe272467e3d222f40},
0566         {0xd7adf884aa879177, 0x5b0ed81dcc6abb10}, {0x86ccbb52ea94baea, 0x98e947129fc2b4ea},
0567         {0xa87fea27a539e9a5, 0x3f2398d747b36225}, {0xd29fe4b18e88640e, 0x8eec7f0d19a03aae},
0568         {0x83a3eeeef9153e89, 0x1953cf68300424ad}, {0xa48ceaaab75a8e2b, 0x5fa8c3423c052dd8},
0569         {0xcdb02555653131b6, 0x3792f412cb06794e}, {0x808e17555f3ebf11, 0xe2bbd88bbee40bd1},
0570         {0xa0b19d2ab70e6ed6, 0x5b6aceaeae9d0ec5}, {0xc8de047564d20a8b, 0xf245825a5a445276},
0571         {0xfb158592be068d2e, 0xeed6e2f0f0d56713}, {0x9ced737bb6c4183d, 0x55464dd69685606c},
0572         {0xc428d05aa4751e4c, 0xaa97e14c3c26b887}, {0xf53304714d9265df, 0xd53dd99f4b3066a9},
0573         {0x993fe2c6d07b7fab, 0xe546a8038efe402a}, {0xbf8fdb78849a5f96, 0xde98520472bdd034},
0574         {0xef73d256a5c0f77c, 0x963e66858f6d4441}, {0x95a8637627989aad, 0xdde7001379a44aa9},
0575         {0xbb127c53b17ec159, 0x5560c018580d5d53}, {0xe9d71b689dde71af, 0xaab8f01e6e10b4a7},
0576         {0x9226712162ab070d, 0xcab3961304ca70e9}, {0xb6b00d69bb55c8d1, 0x3d607b97c5fd0d23},
0577         {0xe45c10c42a2b3b05, 0x8cb89a7db77c506b}, {0x8eb98a7a9a5b04e3, 0x77f3608e92adb243},
0578         {0xb267ed1940f1c61c, 0x55f038b237591ed4}, {0xdf01e85f912e37a3, 0x6b6c46dec52f6689},
0579         {0x8b61313bbabce2c6, 0x2323ac4b3b3da016}, {0xae397d8aa96c1b77, 0xabec975e0a0d081b},
0580         {0xd9c7dced53c72255, 0x96e7bd358c904a22}, {0x881cea14545c7575, 0x7e50d64177da2e55},
0581         {0xaa242499697392d2, 0xdde50bd1d5d0b9ea}, {0xd4ad2dbfc3d07787, 0x955e4ec64b44e865},
0582         {0x84ec3c97da624ab4, 0xbd5af13bef0b113f}, {0xa6274bbdd0fadd61, 0xecb1ad8aeacdd58f},
0583         {0xcfb11ead453994ba, 0x67de18eda5814af3}, {0x81ceb32c4b43fcf4, 0x80eacf948770ced8},
0584         {0xa2425ff75e14fc31, 0xa1258379a94d028e}, {0xcad2f7f5359a3b3e, 0x096ee45813a04331},
0585         {0xfd87b5f28300ca0d, 0x8bca9d6e188853fd}, {0x9e74d1b791e07e48, 0x775ea264cf55347e},
0586         {0xc612062576589dda, 0x95364afe032a819e}, {0xf79687aed3eec551, 0x3a83ddbd83f52205},
0587         {0x9abe14cd44753b52, 0xc4926a9672793543}, {0xc16d9a0095928a27, 0x75b7053c0f178294},
0588         {0xf1c90080baf72cb1, 0x5324c68b12dd6339}, {0x971da05074da7bee, 0xd3f6fc16ebca5e04},
0589         {0xbce5086492111aea, 0x88f4bb1ca6bcf585}, {0xec1e4a7db69561a5, 0x2b31e9e3d06c32e6},
0590         {0x9392ee8e921d5d07, 0x3aff322e62439fd0}, {0xb877aa3236a4b449, 0x09befeb9fad487c3},
0591         {0xe69594bec44de15b, 0x4c2ebe687989a9b4}, {0x901d7cf73ab0acd9, 0x0f9d37014bf60a11},
0592         {0xb424dc35095cd80f, 0x538484c19ef38c95}, {0xe12e13424bb40e13, 0x2865a5f206b06fba},
0593         {0x8cbccc096f5088cb, 0xf93f87b7442e45d4}, {0xafebff0bcb24aafe, 0xf78f69a51539d749},
0594         {0xdbe6fecebdedd5be, 0xb573440e5a884d1c}, {0x89705f4136b4a597, 0x31680a88f8953031},
0595         {0xabcc77118461cefc, 0xfdc20d2b36ba7c3e}, {0xd6bf94d5e57a42bc, 0x3d32907604691b4d},
0596         {0x8637bd05af6c69b5, 0xa63f9a49c2c1b110}, {0xa7c5ac471b478423, 0x0fcf80dc33721d54},
0597         {0xd1b71758e219652b, 0xd3c36113404ea4a9}, {0x83126e978d4fdf3b, 0x645a1cac083126ea},
0598         {0xa3d70a3d70a3d70a, 0x3d70a3d70a3d70a4}, {0xcccccccccccccccc, 0xcccccccccccccccd},
0599         {0x8000000000000000, 0x0000000000000000}, {0xa000000000000000, 0x0000000000000000},
0600         {0xc800000000000000, 0x0000000000000000}, {0xfa00000000000000, 0x0000000000000000},
0601         {0x9c40000000000000, 0x0000000000000000}, {0xc350000000000000, 0x0000000000000000},
0602         {0xf424000000000000, 0x0000000000000000}, {0x9896800000000000, 0x0000000000000000},
0603         {0xbebc200000000000, 0x0000000000000000}, {0xee6b280000000000, 0x0000000000000000},
0604         {0x9502f90000000000, 0x0000000000000000}, {0xba43b74000000000, 0x0000000000000000},
0605         {0xe8d4a51000000000, 0x0000000000000000}, {0x9184e72a00000000, 0x0000000000000000},
0606         {0xb5e620f480000000, 0x0000000000000000}, {0xe35fa931a0000000, 0x0000000000000000},
0607         {0x8e1bc9bf04000000, 0x0000000000000000}, {0xb1a2bc2ec5000000, 0x0000000000000000},
0608         {0xde0b6b3a76400000, 0x0000000000000000}, {0x8ac7230489e80000, 0x0000000000000000},
0609         {0xad78ebc5ac620000, 0x0000000000000000}, {0xd8d726b7177a8000, 0x0000000000000000},
0610         {0x878678326eac9000, 0x0000000000000000}, {0xa968163f0a57b400, 0x0000000000000000},
0611         {0xd3c21bcecceda100, 0x0000000000000000}, {0x84595161401484a0, 0x0000000000000000},
0612         {0xa56fa5b99019a5c8, 0x0000000000000000}, {0xcecb8f27f4200f3a, 0x0000000000000000},
0613         {0x813f3978f8940984, 0x4000000000000000}, {0xa18f07d736b90be5, 0x5000000000000000},
0614         {0xc9f2c9cd04674ede, 0xa400000000000000}, {0xfc6f7c4045812296, 0x4d00000000000000},
0615         {0x9dc5ada82b70b59d, 0xf020000000000000}, {0xc5371912364ce305, 0x6c28000000000000},
0616         {0xf684df56c3e01bc6, 0xc732000000000000}, {0x9a130b963a6c115c, 0x3c7f400000000000},
0617         {0xc097ce7bc90715b3, 0x4b9f100000000000}, {0xf0bdc21abb48db20, 0x1e86d40000000000},
0618         {0x96769950b50d88f4, 0x1314448000000000}, {0xbc143fa4e250eb31, 0x17d955a000000000},
0619         {0xeb194f8e1ae525fd, 0x5dcfab0800000000}, {0x92efd1b8d0cf37be, 0x5aa1cae500000000},
0620         {0xb7abc627050305ad, 0xf14a3d9e40000000}, {0xe596b7b0c643c719, 0x6d9ccd05d0000000},
0621         {0x8f7e32ce7bea5c6f, 0xe4820023a2000000}, {0xb35dbf821ae4f38b, 0xdda2802c8a800000},
0622         {0xe0352f62a19e306e, 0xd50b2037ad200000}, {0x8c213d9da502de45, 0x4526f422cc340000},
0623         {0xaf298d050e4395d6, 0x9670b12b7f410000}, {0xdaf3f04651d47b4c, 0x3c0cdd765f114000},
0624         {0x88d8762bf324cd0f, 0xa5880a69fb6ac800}, {0xab0e93b6efee0053, 0x8eea0d047a457a00},
0625         {0xd5d238a4abe98068, 0x72a4904598d6d880}, {0x85a36366eb71f041, 0x47a6da2b7f864750},
0626         {0xa70c3c40a64e6c51, 0x999090b65f67d924}, {0xd0cf4b50cfe20765, 0xfff4b4e3f741cf6d},
0627         {0x82818f1281ed449f, 0xbff8f10e7a8921a5}, {0xa321f2d7226895c7, 0xaff72d52192b6a0e},
0628         {0xcbea6f8ceb02bb39, 0x9bf4f8a69f764491}, {0xfee50b7025c36a08, 0x02f236d04753d5b5},
0629         {0x9f4f2726179a2245, 0x01d762422c946591}, {0xc722f0ef9d80aad6, 0x424d3ad2b7b97ef6},
0630         {0xf8ebad2b84e0d58b, 0xd2e0898765a7deb3}, {0x9b934c3b330c8577, 0x63cc55f49f88eb30},
0631         {0xc2781f49ffcfa6d5, 0x3cbf6b71c76b25fc}, {0xf316271c7fc3908a, 0x8bef464e3945ef7b},
0632         {0x97edd871cfda3a56, 0x97758bf0e3cbb5ad}, {0xbde94e8e43d0c8ec, 0x3d52eeed1cbea318},
0633         {0xed63a231d4c4fb27, 0x4ca7aaa863ee4bde}, {0x945e455f24fb1cf8, 0x8fe8caa93e74ef6b},
0634         {0xb975d6b6ee39e436, 0xb3e2fd538e122b45}, {0xe7d34c64a9c85d44, 0x60dbbca87196b617},
0635         {0x90e40fbeea1d3a4a, 0xbc8955e946fe31ce}, {0xb51d13aea4a488dd, 0x6babab6398bdbe42},
0636         {0xe264589a4dcdab14, 0xc696963c7eed2dd2}, {0x8d7eb76070a08aec, 0xfc1e1de5cf543ca3},
0637         {0xb0de65388cc8ada8, 0x3b25a55f43294bcc}, {0xdd15fe86affad912, 0x49ef0eb713f39ebf},
0638         {0x8a2dbf142dfcc7ab, 0x6e3569326c784338}, {0xacb92ed9397bf996, 0x49c2c37f07965405},
0639         {0xd7e77a8f87daf7fb, 0xdc33745ec97be907}, {0x86f0ac99b4e8dafd, 0x69a028bb3ded71a4},
0640         {0xa8acd7c0222311bc, 0xc40832ea0d68ce0d}, {0xd2d80db02aabd62b, 0xf50a3fa490c30191},
0641         {0x83c7088e1aab65db, 0x792667c6da79e0fb}, {0xa4b8cab1a1563f52, 0x577001b891185939},
0642         {0xcde6fd5e09abcf26, 0xed4c0226b55e6f87}, {0x80b05e5ac60b6178, 0x544f8158315b05b5},
0643         {0xa0dc75f1778e39d6, 0x696361ae3db1c722}, {0xc913936dd571c84c, 0x03bc3a19cd1e38ea},
0644         {0xfb5878494ace3a5f, 0x04ab48a04065c724}, {0x9d174b2dcec0e47b, 0x62eb0d64283f9c77},
0645         {0xc45d1df942711d9a, 0x3ba5d0bd324f8395}, {0xf5746577930d6500, 0xca8f44ec7ee3647a},
0646         {0x9968bf6abbe85f20, 0x7e998b13cf4e1ecc}, {0xbfc2ef456ae276e8, 0x9e3fedd8c321a67f},
0647         {0xefb3ab16c59b14a2, 0xc5cfe94ef3ea101f}, {0x95d04aee3b80ece5, 0xbba1f1d158724a13},
0648         {0xbb445da9ca61281f, 0x2a8a6e45ae8edc98}, {0xea1575143cf97226, 0xf52d09d71a3293be},
0649         {0x924d692ca61be758, 0x593c2626705f9c57}, {0xb6e0c377cfa2e12e, 0x6f8b2fb00c77836d},
0650         {0xe498f455c38b997a, 0x0b6dfb9c0f956448}, {0x8edf98b59a373fec, 0x4724bd4189bd5ead},
0651         {0xb2977ee300c50fe7, 0x58edec91ec2cb658}, {0xdf3d5e9bc0f653e1, 0x2f2967b66737e3ee},
0652         {0x8b865b215899f46c, 0xbd79e0d20082ee75}, {0xae67f1e9aec07187, 0xecd8590680a3aa12},
0653         {0xda01ee641a708de9, 0xe80e6f4820cc9496}, {0x884134fe908658b2, 0x3109058d147fdcde},
0654         {0xaa51823e34a7eede, 0xbd4b46f0599fd416}, {0xd4e5e2cdc1d1ea96, 0x6c9e18ac7007c91b},
0655         {0x850fadc09923329e, 0x03e2cf6bc604ddb1}, {0xa6539930bf6bff45, 0x84db8346b786151d},
0656         {0xcfe87f7cef46ff16, 0xe612641865679a64}, {0x81f14fae158c5f6e, 0x4fcb7e8f3f60c07f},
0657         {0xa26da3999aef7749, 0xe3be5e330f38f09e}, {0xcb090c8001ab551c, 0x5cadf5bfd3072cc6},
0658         {0xfdcb4fa002162a63, 0x73d9732fc7c8f7f7}, {0x9e9f11c4014dda7e, 0x2867e7fddcdd9afb},
0659         {0xc646d63501a1511d, 0xb281e1fd541501b9}, {0xf7d88bc24209a565, 0x1f225a7ca91a4227},
0660         {0x9ae757596946075f, 0x3375788de9b06959}, {0xc1a12d2fc3978937, 0x0052d6b1641c83af},
0661         {0xf209787bb47d6b84, 0xc0678c5dbd23a49b}, {0x9745eb4d50ce6332, 0xf840b7ba963646e1},
0662         {0xbd176620a501fbff, 0xb650e5a93bc3d899}, {0xec5d3fa8ce427aff, 0xa3e51f138ab4cebf},
0663         {0x93ba47c980e98cdf, 0xc66f336c36b10138}, {0xb8a8d9bbe123f017, 0xb80b0047445d4185},
0664         {0xe6d3102ad96cec1d, 0xa60dc059157491e6}, {0x9043ea1ac7e41392, 0x87c89837ad68db30},
0665         {0xb454e4a179dd1877, 0x29babe4598c311fc}, {0xe16a1dc9d8545e94, 0xf4296dd6fef3d67b},
0666         {0x8ce2529e2734bb1d, 0x1899e4a65f58660d}, {0xb01ae745b101e9e4, 0x5ec05dcff72e7f90},
0667         {0xdc21a1171d42645d, 0x76707543f4fa1f74}, {0x899504ae72497eba, 0x6a06494a791c53a9},
0668         {0xabfa45da0edbde69, 0x0487db9d17636893}, {0xd6f8d7509292d603, 0x45a9d2845d3c42b7},
0669         {0x865b86925b9bc5c2, 0x0b8a2392ba45a9b3}, {0xa7f26836f282b732, 0x8e6cac7768d7141f},
0670         {0xd1ef0244af2364ff, 0x3207d795430cd927}, {0x8335616aed761f1f, 0x7f44e6bd49e807b9},
0671         {0xa402b9c5a8d3a6e7, 0x5f16206c9c6209a7}, {0xcd036837130890a1, 0x36dba887c37a8c10},
0672         {0x802221226be55a64, 0xc2494954da2c978a}, {0xa02aa96b06deb0fd, 0xf2db9baa10b7bd6d},
0673         {0xc83553c5c8965d3d, 0x6f92829494e5acc8}, {0xfa42a8b73abbf48c, 0xcb772339ba1f17fa},
0674         {0x9c69a97284b578d7, 0xff2a760414536efc}, {0xc38413cf25e2d70d, 0xfef5138519684abb},
0675         {0xf46518c2ef5b8cd1, 0x7eb258665fc25d6a}, {0x98bf2f79d5993802, 0xef2f773ffbd97a62},
0676         {0xbeeefb584aff8603, 0xaafb550ffacfd8fb}, {0xeeaaba2e5dbf6784, 0x95ba2a53f983cf39},
0677         {0x952ab45cfa97a0b2, 0xdd945a747bf26184}, {0xba756174393d88df, 0x94f971119aeef9e5},
0678         {0xe912b9d1478ceb17, 0x7a37cd5601aab85e}, {0x91abb422ccb812ee, 0xac62e055c10ab33b},
0679         {0xb616a12b7fe617aa, 0x577b986b314d600a}, {0xe39c49765fdf9d94, 0xed5a7e85fda0b80c},
0680         {0x8e41ade9fbebc27d, 0x14588f13be847308}, {0xb1d219647ae6b31c, 0x596eb2d8ae258fc9},
0681         {0xde469fbd99a05fe3, 0x6fca5f8ed9aef3bc}, {0x8aec23d680043bee, 0x25de7bb9480d5855},
0682         {0xada72ccc20054ae9, 0xaf561aa79a10ae6b}, {0xd910f7ff28069da4, 0x1b2ba1518094da05},
0683         {0x87aa9aff79042286, 0x90fb44d2f05d0843}, {0xa99541bf57452b28, 0x353a1607ac744a54},
0684         {0xd3fa922f2d1675f2, 0x42889b8997915ce9}, {0x847c9b5d7c2e09b7, 0x69956135febada12},
0685         {0xa59bc234db398c25, 0x43fab9837e699096}, {0xcf02b2c21207ef2e, 0x94f967e45e03f4bc},
0686         {0x8161afb94b44f57d, 0x1d1be0eebac278f6}, {0xa1ba1ba79e1632dc, 0x6462d92a69731733},
0687         {0xca28a291859bbf93, 0x7d7b8f7503cfdcff}, {0xfcb2cb35e702af78, 0x5cda735244c3d43f},
0688         {0x9defbf01b061adab, 0x3a0888136afa64a8}, {0xc56baec21c7a1916, 0x088aaa1845b8fdd1},
0689         {0xf6c69a72a3989f5b, 0x8aad549e57273d46}, {0x9a3c2087a63f6399, 0x36ac54e2f678864c},
0690         {0xc0cb28a98fcf3c7f, 0x84576a1bb416a7de}, {0xf0fdf2d3f3c30b9f, 0x656d44a2a11c51d6},
0691         {0x969eb7c47859e743, 0x9f644ae5a4b1b326}, {0xbc4665b596706114, 0x873d5d9f0dde1fef},
0692         {0xeb57ff22fc0c7959, 0xa90cb506d155a7eb}, {0x9316ff75dd87cbd8, 0x09a7f12442d588f3},
0693         {0xb7dcbf5354e9bece, 0x0c11ed6d538aeb30}, {0xe5d3ef282a242e81, 0x8f1668c8a86da5fb},
0694         {0x8fa475791a569d10, 0xf96e017d694487bd}, {0xb38d92d760ec4455, 0x37c981dcc395a9ad},
0695         {0xe070f78d3927556a, 0x85bbe253f47b1418}, {0x8c469ab843b89562, 0x93956d7478ccec8f},
0696         {0xaf58416654a6babb, 0x387ac8d1970027b3}, {0xdb2e51bfe9d0696a, 0x06997b05fcc0319f},
0697         {0x88fcf317f22241e2, 0x441fece3bdf81f04}, {0xab3c2fddeeaad25a, 0xd527e81cad7626c4},
0698         {0xd60b3bd56a5586f1, 0x8a71e223d8d3b075}, {0x85c7056562757456, 0xf6872d5667844e4a},
0699         {0xa738c6bebb12d16c, 0xb428f8ac016561dc}, {0xd106f86e69d785c7, 0xe13336d701beba53},
0700         {0x82a45b450226b39c, 0xecc0024661173474}, {0xa34d721642b06084, 0x27f002d7f95d0191},
0701         {0xcc20ce9bd35c78a5, 0x31ec038df7b441f5}, {0xff290242c83396ce, 0x7e67047175a15272},
0702         {0x9f79a169bd203e41, 0x0f0062c6e984d387}, {0xc75809c42c684dd1, 0x52c07b78a3e60869},
0703         {0xf92e0c3537826145, 0xa7709a56ccdf8a83}, {0x9bbcc7a142b17ccb, 0x88a66076400bb692},
0704         {0xc2abf989935ddbfe, 0x6acff893d00ea436}, {0xf356f7ebf83552fe, 0x0583f6b8c4124d44},
0705         {0x98165af37b2153de, 0xc3727a337a8b704b}, {0xbe1bf1b059e9a8d6, 0x744f18c0592e4c5d},
0706         {0xeda2ee1c7064130c, 0x1162def06f79df74}, {0x9485d4d1c63e8be7, 0x8addcb5645ac2ba9},
0707         {0xb9a74a0637ce2ee1, 0x6d953e2bd7173693}, {0xe8111c87c5c1ba99, 0xc8fa8db6ccdd0438},
0708         {0x910ab1d4db9914a0, 0x1d9c9892400a22a3}, {0xb54d5e4a127f59c8, 0x2503beb6d00cab4c},
0709         {0xe2a0b5dc971f303a, 0x2e44ae64840fd61e}, {0x8da471a9de737e24, 0x5ceaecfed289e5d3},
0710         {0xb10d8e1456105dad, 0x7425a83e872c5f48}, {0xdd50f1996b947518, 0xd12f124e28f7771a},
0711         {0x8a5296ffe33cc92f, 0x82bd6b70d99aaa70}, {0xace73cbfdc0bfb7b, 0x636cc64d1001550c},
0712         {0xd8210befd30efa5a, 0x3c47f7e05401aa4f}, {0x8714a775e3e95c78, 0x65acfaec34810a72},
0713         {0xa8d9d1535ce3b396, 0x7f1839a741a14d0e}, {0xd31045a8341ca07c, 0x1ede48111209a051},
0714         {0x83ea2b892091e44d, 0x934aed0aab460433}, {0xa4e4b66b68b65d60, 0xf81da84d56178540},
0715         {0xce1de40642e3f4b9, 0x36251260ab9d668f}, {0x80d2ae83e9ce78f3, 0xc1d72b7c6b42601a},
0716         {0xa1075a24e4421730, 0xb24cf65b8612f820}, {0xc94930ae1d529cfc, 0xdee033f26797b628},
0717         {0xfb9b7cd9a4a7443c, 0x169840ef017da3b2}, {0x9d412e0806e88aa5, 0x8e1f289560ee864f},
0718         {0xc491798a08a2ad4e, 0xf1a6f2bab92a27e3}, {0xf5b5d7ec8acb58a2, 0xae10af696774b1dc},
0719         {0x9991a6f3d6bf1765, 0xacca6da1e0a8ef2a}, {0xbff610b0cc6edd3f, 0x17fd090a58d32af4},
0720         {0xeff394dcff8a948e, 0xddfc4b4cef07f5b1}, {0x95f83d0a1fb69cd9, 0x4abdaf101564f98f},
0721         {0xbb764c4ca7a4440f, 0x9d6d1ad41abe37f2}, {0xea53df5fd18d5513, 0x84c86189216dc5ee},
0722         {0x92746b9be2f8552c, 0x32fd3cf5b4e49bb5}, {0xb7118682dbb66a77, 0x3fbc8c33221dc2a2},
0723         {0xe4d5e82392a40515, 0x0fabaf3feaa5334b}, {0x8f05b1163ba6832d, 0x29cb4d87f2a7400f},
0724         {0xb2c71d5bca9023f8, 0x743e20e9ef511013}, {0xdf78e4b2bd342cf6, 0x914da9246b255417},
0725         {0x8bab8eefb6409c1a, 0x1ad089b6c2f7548f}, {0xae9672aba3d0c320, 0xa184ac2473b529b2},
0726         {0xda3c0f568cc4f3e8, 0xc9e5d72d90a2741f}, {0x8865899617fb1871, 0x7e2fa67c7a658893},
0727         {0xaa7eebfb9df9de8d, 0xddbb901b98feeab8}, {0xd51ea6fa85785631, 0x552a74227f3ea566},
0728         {0x8533285c936b35de, 0xd53a88958f872760}, {0xa67ff273b8460356, 0x8a892abaf368f138},
0729         {0xd01fef10a657842c, 0x2d2b7569b0432d86}, {0x8213f56a67f6b29b, 0x9c3b29620e29fc74},
0730         {0xa298f2c501f45f42, 0x8349f3ba91b47b90}, {0xcb3f2f7642717713, 0x241c70a936219a74},
0731         {0xfe0efb53d30dd4d7, 0xed238cd383aa0111}, {0x9ec95d1463e8a506, 0xf4363804324a40ab},
0732         {0xc67bb4597ce2ce48, 0xb143c6053edcd0d6}, {0xf81aa16fdc1b81da, 0xdd94b7868e94050b},
0733         {0x9b10a4e5e9913128, 0xca7cf2b4191c8327}, {0xc1d4ce1f63f57d72, 0xfd1c2f611f63a3f1},
0734         {0xf24a01a73cf2dccf, 0xbc633b39673c8ced}, {0x976e41088617ca01, 0xd5be0503e085d814},
0735         {0xbd49d14aa79dbc82, 0x4b2d8644d8a74e19}, {0xec9c459d51852ba2, 0xddf8e7d60ed1219f},
0736         {0x93e1ab8252f33b45, 0xcabb90e5c942b504}, {0xb8da1662e7b00a17, 0x3d6a751f3b936244},
0737         {0xe7109bfba19c0c9d, 0x0cc512670a783ad5}, {0x906a617d450187e2, 0x27fb2b80668b24c6},
0738         {0xb484f9dc9641e9da, 0xb1f9f660802dedf7}, {0xe1a63853bbd26451, 0x5e7873f8a0396974},
0739         {0x8d07e33455637eb2, 0xdb0b487b6423e1e9}, {0xb049dc016abc5e5f, 0x91ce1a9a3d2cda63},
0740         {0xdc5c5301c56b75f7, 0x7641a140cc7810fc}, {0x89b9b3e11b6329ba, 0xa9e904c87fcb0a9e},
0741         {0xac2820d9623bf429, 0x546345fa9fbdcd45}, {0xd732290fbacaf133, 0xa97c177947ad4096},
0742         {0x867f59a9d4bed6c0, 0x49ed8eabcccc485e}, {0xa81f301449ee8c70, 0x5c68f256bfff5a75},
0743         {0xd226fc195c6a2f8c, 0x73832eec6fff3112}, {0x83585d8fd9c25db7, 0xc831fd53c5ff7eac},
0744         {0xa42e74f3d032f525, 0xba3e7ca8b77f5e56}, {0xcd3a1230c43fb26f, 0x28ce1bd2e55f35ec},
0745         {0x80444b5e7aa7cf85, 0x7980d163cf5b81b4}, {0xa0555e361951c366, 0xd7e105bcc3326220},
0746         {0xc86ab5c39fa63440, 0x8dd9472bf3fefaa8}, {0xfa856334878fc150, 0xb14f98f6f0feb952},
0747         {0x9c935e00d4b9d8d2, 0x6ed1bf9a569f33d4}, {0xc3b8358109e84f07, 0x0a862f80ec4700c9},
0748         {0xf4a642e14c6262c8, 0xcd27bb612758c0fb}, {0x98e7e9cccfbd7dbd, 0x8038d51cb897789d},
0749         {0xbf21e44003acdd2c, 0xe0470a63e6bd56c4}, {0xeeea5d5004981478, 0x1858ccfce06cac75},
0750         {0x95527a5202df0ccb, 0x0f37801e0c43ebc9}, {0xbaa718e68396cffd, 0xd30560258f54e6bb},
0751         {0xe950df20247c83fd, 0x47c6b82ef32a206a}, {0x91d28b7416cdd27e, 0x4cdc331d57fa5442},
0752         {0xb6472e511c81471d, 0xe0133fe4adf8e953}, {0xe3d8f9e563a198e5, 0x58180fddd97723a7},
0753         {0x8e679c2f5e44ff8f, 0x570f09eaa7ea7649}, {0xb201833b35d63f73, 0x2cd2cc6551e513db},
0754         {0xde81e40a034bcf4f, 0xf8077f7ea65e58d2}, {0x8b112e86420f6191, 0xfb04afaf27faf783},
0755         {0xadd57a27d29339f6, 0x79c5db9af1f9b564}, {0xd94ad8b1c7380874, 0x18375281ae7822bd},
0756         {0x87cec76f1c830548, 0x8f2293910d0b15b6}, {0xa9c2794ae3a3c69a, 0xb2eb3875504ddb23},
0757         {0xd433179d9c8cb841, 0x5fa60692a46151ec}, {0x849feec281d7f328, 0xdbc7c41ba6bcd334},
0758         {0xa5c7ea73224deff3, 0x12b9b522906c0801}, {0xcf39e50feae16bef, 0xd768226b34870a01},
0759         {0x81842f29f2cce375, 0xe6a1158300d46641}, {0xa1e53af46f801c53, 0x60495ae3c1097fd1},
0760         {0xca5e89b18b602368, 0x385bb19cb14bdfc5}, {0xfcf62c1dee382c42, 0x46729e03dd9ed7b6},
0761         {0x9e19db92b4e31ba9, 0x6c07a2c26a8346d2}, {0xc5a05277621be293, 0xc7098b7305241886},
0762         {0xf70867153aa2db38, 0xb8cbee4fc66d1ea8}};
0763 };
0764 
0765 #if (defined(BOOST_NO_CXX17_INLINE_VARIABLES) && (!defined(BOOST_MSVC) || BOOST_MSVC != 1900)) || \
0766     (defined(__clang_major__) && __clang_major__ == 5)
0767 
0768 template <bool b> constexpr int main_cache_holder_impl<b>::cache_bits;
0769 template <bool b> constexpr int main_cache_holder_impl<b>::min_k;
0770 template <bool b> constexpr int main_cache_holder_impl<b>::max_k;
0771 template <bool b> constexpr typename main_cache_holder_impl<b>::cache_entry_type main_cache_holder_impl<b>::cache[];
0772 
0773 #endif
0774 
0775 using main_cache_holder = main_cache_holder_impl<true>;
0776 
0777 // Compressed cache for double
0778 struct compressed_cache_detail 
0779 {
0780     static constexpr int compression_ratio = 27;
0781     static constexpr std::size_t compressed_table_size = (main_cache_holder::max_k - main_cache_holder::min_k + compression_ratio) /
0782                                                          compression_ratio;
0783 
0784     struct cache_holder_t 
0785     {
0786         static constexpr uint128 table[] = {
0787             {0xff77b1fcbebcdc4f, 0x25e8e89c13bb0f7b},
0788             {0xa5178fff668ae0b6, 0x626e974dbe39a873},
0789             {0x855c3be0a17fcd26, 0x5cf2eea09a550680},
0790             {0xd77485cb25823ac7, 0x7d633293366b828c},
0791             {0xae0b158b4738705e, 0x9624ab50b148d446},
0792             {0x8c974f7383725573, 0x1e414218c73a13fc},
0793             {0xe3231912d5bf60e6, 0x10e1fff697ed6c6a},
0794             {0xb77ada0617e3bbcb, 0x09ce6ebb40173745},
0795             {0x9436c0760c86e30b, 0xf9a0b6720aaf6522},
0796             {0xef73d256a5c0f77c, 0x963e66858f6d4441},
0797             {0xc16d9a0095928a27, 0x75b7053c0f178294},
0798             {0x9c40000000000000, 0x0000000000000000},
0799             {0xfc6f7c4045812296, 0x4d00000000000000},
0800             {0xcbea6f8ceb02bb39, 0x9bf4f8a69f764491},
0801             {0xa4b8cab1a1563f52, 0x577001b891185939},
0802             {0x850fadc09923329e, 0x03e2cf6bc604ddb1},
0803             {0xd6f8d7509292d603, 0x45a9d2845d3c42b7},
0804             {0xada72ccc20054ae9, 0xaf561aa79a10ae6b},
0805             {0x8c469ab843b89562, 0x93956d7478ccec8f},
0806             {0xe2a0b5dc971f303a, 0x2e44ae64840fd61e},
0807             {0xb7118682dbb66a77, 0x3fbc8c33221dc2a2},
0808             {0x93e1ab8252f33b45, 0xcabb90e5c942b504},
0809             {0xeeea5d5004981478, 0x1858ccfce06cac75},
0810         };
0811 
0812         static_assert(sizeof(table) == compressed_table_size * sizeof(uint128), "Table should have 23 elements");
0813     };
0814 
0815     struct pow5_holder_t 
0816     {
0817         static constexpr std::uint64_t table[] = {
0818             1, 5, 25, 125, 625, 3125, 15625, 78125, 390625, 1953125, 9765625, 48828125, 244140625, 1220703125,
0819             6103515625, 30517578125, 152587890625, 762939453125, 3814697265625, 19073486328125, 95367431640625,
0820             476837158203125, 2384185791015625, 11920928955078125, 59604644775390625, 298023223876953125, 1490116119384765625
0821         };
0822 
0823         static_assert(sizeof(table) == compression_ratio * sizeof(std::uint64_t), "Table should have 27 elements");
0824     };
0825 };
0826 
0827 }}}
0828 
0829 #endif // BOOST_CHARCONV_DETAIL_DRAGONBOX_COMMON_HPP