File indexing completed on 2025-06-30 08:36:05
0001
0002
0003
0004
0005
0006
0007
0008 #ifndef FMT_FORMAT_INL_H_
0009 #define FMT_FORMAT_INL_H_
0010
0011 #include <algorithm>
0012 #include <cerrno> // errno
0013 #include <climits>
0014 #include <cmath>
0015 #include <exception>
0016
0017 #ifndef FMT_STATIC_THOUSANDS_SEPARATOR
0018 # include <locale>
0019 #endif
0020
0021 #if defined(_WIN32) && !defined(FMT_WINDOWS_NO_WCHAR)
0022 # include <io.h> // _isatty
0023 #endif
0024
0025 #include "format.h"
0026
0027 FMT_BEGIN_NAMESPACE
0028 namespace detail {
0029
0030 FMT_FUNC void assert_fail(const char* file, int line, const char* message) {
0031
0032
0033 std::fprintf(stderr, "%s:%d: assertion failed: %s", file, line, message);
0034
0035
0036 std::terminate();
0037 }
0038
0039 FMT_FUNC void throw_format_error(const char* message) {
0040 FMT_THROW(format_error(message));
0041 }
0042
0043 FMT_FUNC void format_error_code(detail::buffer<char>& out, int error_code,
0044 string_view message) noexcept {
0045
0046
0047
0048 out.try_resize(0);
0049 static const char SEP[] = ": ";
0050 static const char ERROR_STR[] = "error ";
0051
0052 size_t error_code_size = sizeof(SEP) + sizeof(ERROR_STR) - 2;
0053 auto abs_value = static_cast<uint32_or_64_or_128_t<int>>(error_code);
0054 if (detail::is_negative(error_code)) {
0055 abs_value = 0 - abs_value;
0056 ++error_code_size;
0057 }
0058 error_code_size += detail::to_unsigned(detail::count_digits(abs_value));
0059 auto it = buffer_appender<char>(out);
0060 if (message.size() <= inline_buffer_size - error_code_size)
0061 fmt::format_to(it, FMT_STRING("{}{}"), message, SEP);
0062 fmt::format_to(it, FMT_STRING("{}{}"), ERROR_STR, error_code);
0063 FMT_ASSERT(out.size() <= inline_buffer_size, "");
0064 }
0065
0066 FMT_FUNC void report_error(format_func func, int error_code,
0067 const char* message) noexcept {
0068 memory_buffer full_message;
0069 func(full_message, error_code, message);
0070
0071 if (std::fwrite(full_message.data(), full_message.size(), 1, stderr) > 0)
0072 std::fputc('\n', stderr);
0073 }
0074
0075
0076 inline void fwrite_fully(const void* ptr, size_t count, FILE* stream) {
0077 size_t written = std::fwrite(ptr, 1, count, stream);
0078 if (written < count)
0079 FMT_THROW(system_error(errno, FMT_STRING("cannot write to file")));
0080 }
0081
0082 #ifndef FMT_STATIC_THOUSANDS_SEPARATOR
0083 template <typename Locale>
0084 locale_ref::locale_ref(const Locale& loc) : locale_(&loc) {
0085 static_assert(std::is_same<Locale, std::locale>::value, "");
0086 }
0087
0088 template <typename Locale> auto locale_ref::get() const -> Locale {
0089 static_assert(std::is_same<Locale, std::locale>::value, "");
0090 return locale_ ? *static_cast<const std::locale*>(locale_) : std::locale();
0091 }
0092
0093 template <typename Char>
0094 FMT_FUNC auto thousands_sep_impl(locale_ref loc) -> thousands_sep_result<Char> {
0095 auto& facet = std::use_facet<std::numpunct<Char>>(loc.get<std::locale>());
0096 auto grouping = facet.grouping();
0097 auto thousands_sep = grouping.empty() ? Char() : facet.thousands_sep();
0098 return {std::move(grouping), thousands_sep};
0099 }
0100 template <typename Char>
0101 FMT_FUNC auto decimal_point_impl(locale_ref loc) -> Char {
0102 return std::use_facet<std::numpunct<Char>>(loc.get<std::locale>())
0103 .decimal_point();
0104 }
0105 #else
0106 template <typename Char>
0107 FMT_FUNC auto thousands_sep_impl(locale_ref) -> thousands_sep_result<Char> {
0108 return {"\03", FMT_STATIC_THOUSANDS_SEPARATOR};
0109 }
0110 template <typename Char> FMT_FUNC Char decimal_point_impl(locale_ref) {
0111 return '.';
0112 }
0113 #endif
0114
0115 FMT_FUNC auto write_loc(appender out, loc_value value,
0116 const format_specs<>& specs, locale_ref loc) -> bool {
0117 #ifndef FMT_STATIC_THOUSANDS_SEPARATOR
0118 auto locale = loc.get<std::locale>();
0119
0120
0121 using facet = format_facet<std::locale>;
0122 if (std::has_facet<facet>(locale))
0123 return std::use_facet<facet>(locale).put(out, value, specs);
0124 return facet(locale).put(out, value, specs);
0125 #endif
0126 return false;
0127 }
0128 }
0129
0130 template <typename Locale> typename Locale::id format_facet<Locale>::id;
0131
0132 #ifndef FMT_STATIC_THOUSANDS_SEPARATOR
0133 template <typename Locale> format_facet<Locale>::format_facet(Locale& loc) {
0134 auto& numpunct = std::use_facet<std::numpunct<char>>(loc);
0135 grouping_ = numpunct.grouping();
0136 if (!grouping_.empty()) separator_ = std::string(1, numpunct.thousands_sep());
0137 }
0138
0139 template <>
0140 FMT_API FMT_FUNC auto format_facet<std::locale>::do_put(
0141 appender out, loc_value val, const format_specs<>& specs) const -> bool {
0142 return val.visit(
0143 detail::loc_writer<>{out, specs, separator_, grouping_, decimal_point_});
0144 }
0145 #endif
0146
0147 FMT_FUNC auto vsystem_error(int error_code, string_view fmt, format_args args)
0148 -> std::system_error {
0149 auto ec = std::error_code(error_code, std::generic_category());
0150 return std::system_error(ec, vformat(fmt, args));
0151 }
0152
0153 namespace detail {
0154
0155 template <typename F>
0156 inline auto operator==(basic_fp<F> x, basic_fp<F> y) -> bool {
0157 return x.f == y.f && x.e == y.e;
0158 }
0159
0160
0161 FMT_CONSTEXPR inline auto rotr(uint32_t n, uint32_t r) noexcept -> uint32_t {
0162 r &= 31;
0163 return (n >> r) | (n << (32 - r));
0164 }
0165 FMT_CONSTEXPR inline auto rotr(uint64_t n, uint32_t r) noexcept -> uint64_t {
0166 r &= 63;
0167 return (n >> r) | (n << (64 - r));
0168 }
0169
0170
0171 namespace dragonbox {
0172
0173
0174 inline auto umul96_upper64(uint32_t x, uint64_t y) noexcept -> uint64_t {
0175 return umul128_upper64(static_cast<uint64_t>(x) << 32, y);
0176 }
0177
0178
0179
0180 inline auto umul192_lower128(uint64_t x, uint128_fallback y) noexcept
0181 -> uint128_fallback {
0182 uint64_t high = x * y.high();
0183 uint128_fallback high_low = umul128(x, y.low());
0184 return {high + high_low.high(), high_low.low()};
0185 }
0186
0187
0188
0189 inline auto umul96_lower64(uint32_t x, uint64_t y) noexcept -> uint64_t {
0190 return x * y;
0191 }
0192
0193
0194 inline auto floor_log10_pow2_minus_log10_4_over_3(int e) noexcept -> int {
0195 FMT_ASSERT(e <= 2936 && e >= -2985, "too large exponent");
0196 return (e * 631305 - 261663) >> 21;
0197 }
0198
0199 FMT_INLINE_VARIABLE constexpr struct {
0200 uint32_t divisor;
0201 int shift_amount;
0202 } div_small_pow10_infos[] = {{10, 16}, {100, 16}};
0203
0204
0205
0206
0207 template <int N>
0208 auto check_divisibility_and_divide_by_pow10(uint32_t& n) noexcept -> bool {
0209
0210
0211
0212
0213
0214
0215
0216
0217
0218
0219
0220 constexpr auto info = div_small_pow10_infos[N - 1];
0221 FMT_ASSERT(n <= info.divisor * 10, "n is too large");
0222 constexpr uint32_t magic_number =
0223 (1u << info.shift_amount) / info.divisor + 1;
0224 n *= magic_number;
0225 const uint32_t comparison_mask = (1u << info.shift_amount) - 1;
0226 bool result = (n & comparison_mask) < magic_number;
0227 n >>= info.shift_amount;
0228 return result;
0229 }
0230
0231
0232
0233 template <int N> auto small_division_by_pow10(uint32_t n) noexcept -> uint32_t {
0234 constexpr auto info = div_small_pow10_infos[N - 1];
0235 FMT_ASSERT(n <= info.divisor * 10, "n is too large");
0236 constexpr uint32_t magic_number =
0237 (1u << info.shift_amount) / info.divisor + 1;
0238 return (n * magic_number) >> info.shift_amount;
0239 }
0240
0241
0242 inline auto divide_by_10_to_kappa_plus_1(uint32_t n) noexcept -> uint32_t {
0243
0244 return static_cast<uint32_t>((static_cast<uint64_t>(n) * 1374389535) >> 37);
0245 }
0246
0247 inline auto divide_by_10_to_kappa_plus_1(uint64_t n) noexcept -> uint64_t {
0248
0249 return umul128_upper64(n, 2361183241434822607ull) >> 7;
0250 }
0251
0252
0253 template <typename T> struct cache_accessor;
0254
0255 template <> struct cache_accessor<float> {
0256 using carrier_uint = float_info<float>::carrier_uint;
0257 using cache_entry_type = uint64_t;
0258
0259 static auto get_cached_power(int k) noexcept -> uint64_t {
0260 FMT_ASSERT(k >= float_info<float>::min_k && k <= float_info<float>::max_k,
0261 "k is out of range");
0262 static constexpr const uint64_t pow10_significands[] = {
0263 0x81ceb32c4b43fcf5, 0xa2425ff75e14fc32, 0xcad2f7f5359a3b3f,
0264 0xfd87b5f28300ca0e, 0x9e74d1b791e07e49, 0xc612062576589ddb,
0265 0xf79687aed3eec552, 0x9abe14cd44753b53, 0xc16d9a0095928a28,
0266 0xf1c90080baf72cb2, 0x971da05074da7bef, 0xbce5086492111aeb,
0267 0xec1e4a7db69561a6, 0x9392ee8e921d5d08, 0xb877aa3236a4b44a,
0268 0xe69594bec44de15c, 0x901d7cf73ab0acda, 0xb424dc35095cd810,
0269 0xe12e13424bb40e14, 0x8cbccc096f5088cc, 0xafebff0bcb24aaff,
0270 0xdbe6fecebdedd5bf, 0x89705f4136b4a598, 0xabcc77118461cefd,
0271 0xd6bf94d5e57a42bd, 0x8637bd05af6c69b6, 0xa7c5ac471b478424,
0272 0xd1b71758e219652c, 0x83126e978d4fdf3c, 0xa3d70a3d70a3d70b,
0273 0xcccccccccccccccd, 0x8000000000000000, 0xa000000000000000,
0274 0xc800000000000000, 0xfa00000000000000, 0x9c40000000000000,
0275 0xc350000000000000, 0xf424000000000000, 0x9896800000000000,
0276 0xbebc200000000000, 0xee6b280000000000, 0x9502f90000000000,
0277 0xba43b74000000000, 0xe8d4a51000000000, 0x9184e72a00000000,
0278 0xb5e620f480000000, 0xe35fa931a0000000, 0x8e1bc9bf04000000,
0279 0xb1a2bc2ec5000000, 0xde0b6b3a76400000, 0x8ac7230489e80000,
0280 0xad78ebc5ac620000, 0xd8d726b7177a8000, 0x878678326eac9000,
0281 0xa968163f0a57b400, 0xd3c21bcecceda100, 0x84595161401484a0,
0282 0xa56fa5b99019a5c8, 0xcecb8f27f4200f3a, 0x813f3978f8940985,
0283 0xa18f07d736b90be6, 0xc9f2c9cd04674edf, 0xfc6f7c4045812297,
0284 0x9dc5ada82b70b59e, 0xc5371912364ce306, 0xf684df56c3e01bc7,
0285 0x9a130b963a6c115d, 0xc097ce7bc90715b4, 0xf0bdc21abb48db21,
0286 0x96769950b50d88f5, 0xbc143fa4e250eb32, 0xeb194f8e1ae525fe,
0287 0x92efd1b8d0cf37bf, 0xb7abc627050305ae, 0xe596b7b0c643c71a,
0288 0x8f7e32ce7bea5c70, 0xb35dbf821ae4f38c, 0xe0352f62a19e306f};
0289 return pow10_significands[k - float_info<float>::min_k];
0290 }
0291
0292 struct compute_mul_result {
0293 carrier_uint result;
0294 bool is_integer;
0295 };
0296 struct compute_mul_parity_result {
0297 bool parity;
0298 bool is_integer;
0299 };
0300
0301 static auto compute_mul(carrier_uint u,
0302 const cache_entry_type& cache) noexcept
0303 -> compute_mul_result {
0304 auto r = umul96_upper64(u, cache);
0305 return {static_cast<carrier_uint>(r >> 32),
0306 static_cast<carrier_uint>(r) == 0};
0307 }
0308
0309 static auto compute_delta(const cache_entry_type& cache, int beta) noexcept
0310 -> uint32_t {
0311 return static_cast<uint32_t>(cache >> (64 - 1 - beta));
0312 }
0313
0314 static auto compute_mul_parity(carrier_uint two_f,
0315 const cache_entry_type& cache,
0316 int beta) noexcept
0317 -> compute_mul_parity_result {
0318 FMT_ASSERT(beta >= 1, "");
0319 FMT_ASSERT(beta < 64, "");
0320
0321 auto r = umul96_lower64(two_f, cache);
0322 return {((r >> (64 - beta)) & 1) != 0,
0323 static_cast<uint32_t>(r >> (32 - beta)) == 0};
0324 }
0325
0326 static auto compute_left_endpoint_for_shorter_interval_case(
0327 const cache_entry_type& cache, int beta) noexcept -> carrier_uint {
0328 return static_cast<carrier_uint>(
0329 (cache - (cache >> (num_significand_bits<float>() + 2))) >>
0330 (64 - num_significand_bits<float>() - 1 - beta));
0331 }
0332
0333 static auto compute_right_endpoint_for_shorter_interval_case(
0334 const cache_entry_type& cache, int beta) noexcept -> carrier_uint {
0335 return static_cast<carrier_uint>(
0336 (cache + (cache >> (num_significand_bits<float>() + 1))) >>
0337 (64 - num_significand_bits<float>() - 1 - beta));
0338 }
0339
0340 static auto compute_round_up_for_shorter_interval_case(
0341 const cache_entry_type& cache, int beta) noexcept -> carrier_uint {
0342 return (static_cast<carrier_uint>(
0343 cache >> (64 - num_significand_bits<float>() - 2 - beta)) +
0344 1) /
0345 2;
0346 }
0347 };
0348
0349 template <> struct cache_accessor<double> {
0350 using carrier_uint = float_info<double>::carrier_uint;
0351 using cache_entry_type = uint128_fallback;
0352
0353 static auto get_cached_power(int k) noexcept -> uint128_fallback {
0354 FMT_ASSERT(k >= float_info<double>::min_k && k <= float_info<double>::max_k,
0355 "k is out of range");
0356
0357 static constexpr const uint128_fallback pow10_significands[] = {
0358 #if FMT_USE_FULL_CACHE_DRAGONBOX
0359 {0xff77b1fcbebcdc4f, 0x25e8e89c13bb0f7b},
0360 {0x9faacf3df73609b1, 0x77b191618c54e9ad},
0361 {0xc795830d75038c1d, 0xd59df5b9ef6a2418},
0362 {0xf97ae3d0d2446f25, 0x4b0573286b44ad1e},
0363 {0x9becce62836ac577, 0x4ee367f9430aec33},
0364 {0xc2e801fb244576d5, 0x229c41f793cda740},
0365 {0xf3a20279ed56d48a, 0x6b43527578c11110},
0366 {0x9845418c345644d6, 0x830a13896b78aaaa},
0367 {0xbe5691ef416bd60c, 0x23cc986bc656d554},
0368 {0xedec366b11c6cb8f, 0x2cbfbe86b7ec8aa9},
0369 {0x94b3a202eb1c3f39, 0x7bf7d71432f3d6aa},
0370 {0xb9e08a83a5e34f07, 0xdaf5ccd93fb0cc54},
0371 {0xe858ad248f5c22c9, 0xd1b3400f8f9cff69},
0372 {0x91376c36d99995be, 0x23100809b9c21fa2},
0373 {0xb58547448ffffb2d, 0xabd40a0c2832a78b},
0374 {0xe2e69915b3fff9f9, 0x16c90c8f323f516d},
0375 {0x8dd01fad907ffc3b, 0xae3da7d97f6792e4},
0376 {0xb1442798f49ffb4a, 0x99cd11cfdf41779d},
0377 {0xdd95317f31c7fa1d, 0x40405643d711d584},
0378 {0x8a7d3eef7f1cfc52, 0x482835ea666b2573},
0379 {0xad1c8eab5ee43b66, 0xda3243650005eed0},
0380 {0xd863b256369d4a40, 0x90bed43e40076a83},
0381 {0x873e4f75e2224e68, 0x5a7744a6e804a292},
0382 {0xa90de3535aaae202, 0x711515d0a205cb37},
0383 {0xd3515c2831559a83, 0x0d5a5b44ca873e04},
0384 {0x8412d9991ed58091, 0xe858790afe9486c3},
0385 {0xa5178fff668ae0b6, 0x626e974dbe39a873},
0386 {0xce5d73ff402d98e3, 0xfb0a3d212dc81290},
0387 {0x80fa687f881c7f8e, 0x7ce66634bc9d0b9a},
0388 {0xa139029f6a239f72, 0x1c1fffc1ebc44e81},
0389 {0xc987434744ac874e, 0xa327ffb266b56221},
0390 {0xfbe9141915d7a922, 0x4bf1ff9f0062baa9},
0391 {0x9d71ac8fada6c9b5, 0x6f773fc3603db4aa},
0392 {0xc4ce17b399107c22, 0xcb550fb4384d21d4},
0393 {0xf6019da07f549b2b, 0x7e2a53a146606a49},
0394 {0x99c102844f94e0fb, 0x2eda7444cbfc426e},
0395 {0xc0314325637a1939, 0xfa911155fefb5309},
0396 {0xf03d93eebc589f88, 0x793555ab7eba27cb},
0397 {0x96267c7535b763b5, 0x4bc1558b2f3458df},
0398 {0xbbb01b9283253ca2, 0x9eb1aaedfb016f17},
0399 {0xea9c227723ee8bcb, 0x465e15a979c1cadd},
0400 {0x92a1958a7675175f, 0x0bfacd89ec191eca},
0401 {0xb749faed14125d36, 0xcef980ec671f667c},
0402 {0xe51c79a85916f484, 0x82b7e12780e7401b},
0403 {0x8f31cc0937ae58d2, 0xd1b2ecb8b0908811},
0404 {0xb2fe3f0b8599ef07, 0x861fa7e6dcb4aa16},
0405 {0xdfbdcece67006ac9, 0x67a791e093e1d49b},
0406 {0x8bd6a141006042bd, 0xe0c8bb2c5c6d24e1},
0407 {0xaecc49914078536d, 0x58fae9f773886e19},
0408 {0xda7f5bf590966848, 0xaf39a475506a899f},
0409 {0x888f99797a5e012d, 0x6d8406c952429604},
0410 {0xaab37fd7d8f58178, 0xc8e5087ba6d33b84},
0411 {0xd5605fcdcf32e1d6, 0xfb1e4a9a90880a65},
0412 {0x855c3be0a17fcd26, 0x5cf2eea09a550680},
0413 {0xa6b34ad8c9dfc06f, 0xf42faa48c0ea481f},
0414 {0xd0601d8efc57b08b, 0xf13b94daf124da27},
0415 {0x823c12795db6ce57, 0x76c53d08d6b70859},
0416 {0xa2cb1717b52481ed, 0x54768c4b0c64ca6f},
0417 {0xcb7ddcdda26da268, 0xa9942f5dcf7dfd0a},
0418 {0xfe5d54150b090b02, 0xd3f93b35435d7c4d},
0419 {0x9efa548d26e5a6e1, 0xc47bc5014a1a6db0},
0420 {0xc6b8e9b0709f109a, 0x359ab6419ca1091c},
0421 {0xf867241c8cc6d4c0, 0xc30163d203c94b63},
0422 {0x9b407691d7fc44f8, 0x79e0de63425dcf1e},
0423 {0xc21094364dfb5636, 0x985915fc12f542e5},
0424 {0xf294b943e17a2bc4, 0x3e6f5b7b17b2939e},
0425 {0x979cf3ca6cec5b5a, 0xa705992ceecf9c43},
0426 {0xbd8430bd08277231, 0x50c6ff782a838354},
0427 {0xece53cec4a314ebd, 0xa4f8bf5635246429},
0428 {0x940f4613ae5ed136, 0x871b7795e136be9a},
0429 {0xb913179899f68584, 0x28e2557b59846e40},
0430 {0xe757dd7ec07426e5, 0x331aeada2fe589d0},
0431 {0x9096ea6f3848984f, 0x3ff0d2c85def7622},
0432 {0xb4bca50b065abe63, 0x0fed077a756b53aa},
0433 {0xe1ebce4dc7f16dfb, 0xd3e8495912c62895},
0434 {0x8d3360f09cf6e4bd, 0x64712dd7abbbd95d},
0435 {0xb080392cc4349dec, 0xbd8d794d96aacfb4},
0436 {0xdca04777f541c567, 0xecf0d7a0fc5583a1},
0437 {0x89e42caaf9491b60, 0xf41686c49db57245},
0438 {0xac5d37d5b79b6239, 0x311c2875c522ced6},
0439 {0xd77485cb25823ac7, 0x7d633293366b828c},
0440 {0x86a8d39ef77164bc, 0xae5dff9c02033198},
0441 {0xa8530886b54dbdeb, 0xd9f57f830283fdfd},
0442 {0xd267caa862a12d66, 0xd072df63c324fd7c},
0443 {0x8380dea93da4bc60, 0x4247cb9e59f71e6e},
0444 {0xa46116538d0deb78, 0x52d9be85f074e609},
0445 {0xcd795be870516656, 0x67902e276c921f8c},
0446 {0x806bd9714632dff6, 0x00ba1cd8a3db53b7},
0447 {0xa086cfcd97bf97f3, 0x80e8a40eccd228a5},
0448 {0xc8a883c0fdaf7df0, 0x6122cd128006b2ce},
0449 {0xfad2a4b13d1b5d6c, 0x796b805720085f82},
0450 {0x9cc3a6eec6311a63, 0xcbe3303674053bb1},
0451 {0xc3f490aa77bd60fc, 0xbedbfc4411068a9d},
0452 {0xf4f1b4d515acb93b, 0xee92fb5515482d45},
0453 {0x991711052d8bf3c5, 0x751bdd152d4d1c4b},
0454 {0xbf5cd54678eef0b6, 0xd262d45a78a0635e},
0455 {0xef340a98172aace4, 0x86fb897116c87c35},
0456 {0x9580869f0e7aac0e, 0xd45d35e6ae3d4da1},
0457 {0xbae0a846d2195712, 0x8974836059cca10a},
0458 {0xe998d258869facd7, 0x2bd1a438703fc94c},
0459 {0x91ff83775423cc06, 0x7b6306a34627ddd0},
0460 {0xb67f6455292cbf08, 0x1a3bc84c17b1d543},
0461 {0xe41f3d6a7377eeca, 0x20caba5f1d9e4a94},
0462 {0x8e938662882af53e, 0x547eb47b7282ee9d},
0463 {0xb23867fb2a35b28d, 0xe99e619a4f23aa44},
0464 {0xdec681f9f4c31f31, 0x6405fa00e2ec94d5},
0465 {0x8b3c113c38f9f37e, 0xde83bc408dd3dd05},
0466 {0xae0b158b4738705e, 0x9624ab50b148d446},
0467 {0xd98ddaee19068c76, 0x3badd624dd9b0958},
0468 {0x87f8a8d4cfa417c9, 0xe54ca5d70a80e5d7},
0469 {0xa9f6d30a038d1dbc, 0x5e9fcf4ccd211f4d},
0470 {0xd47487cc8470652b, 0x7647c32000696720},
0471 {0x84c8d4dfd2c63f3b, 0x29ecd9f40041e074},
0472 {0xa5fb0a17c777cf09, 0xf468107100525891},
0473 {0xcf79cc9db955c2cc, 0x7182148d4066eeb5},
0474 {0x81ac1fe293d599bf, 0xc6f14cd848405531},
0475 {0xa21727db38cb002f, 0xb8ada00e5a506a7d},
0476 {0xca9cf1d206fdc03b, 0xa6d90811f0e4851d},
0477 {0xfd442e4688bd304a, 0x908f4a166d1da664},
0478 {0x9e4a9cec15763e2e, 0x9a598e4e043287ff},
0479 {0xc5dd44271ad3cdba, 0x40eff1e1853f29fe},
0480 {0xf7549530e188c128, 0xd12bee59e68ef47d},
0481 {0x9a94dd3e8cf578b9, 0x82bb74f8301958cf},
0482 {0xc13a148e3032d6e7, 0xe36a52363c1faf02},
0483 {0xf18899b1bc3f8ca1, 0xdc44e6c3cb279ac2},
0484 {0x96f5600f15a7b7e5, 0x29ab103a5ef8c0ba},
0485 {0xbcb2b812db11a5de, 0x7415d448f6b6f0e8},
0486 {0xebdf661791d60f56, 0x111b495b3464ad22},
0487 {0x936b9fcebb25c995, 0xcab10dd900beec35},
0488 {0xb84687c269ef3bfb, 0x3d5d514f40eea743},
0489 {0xe65829b3046b0afa, 0x0cb4a5a3112a5113},
0490 {0x8ff71a0fe2c2e6dc, 0x47f0e785eaba72ac},
0491 {0xb3f4e093db73a093, 0x59ed216765690f57},
0492 {0xe0f218b8d25088b8, 0x306869c13ec3532d},
0493 {0x8c974f7383725573, 0x1e414218c73a13fc},
0494 {0xafbd2350644eeacf, 0xe5d1929ef90898fb},
0495 {0xdbac6c247d62a583, 0xdf45f746b74abf3a},
0496 {0x894bc396ce5da772, 0x6b8bba8c328eb784},
0497 {0xab9eb47c81f5114f, 0x066ea92f3f326565},
0498 {0xd686619ba27255a2, 0xc80a537b0efefebe},
0499 {0x8613fd0145877585, 0xbd06742ce95f5f37},
0500 {0xa798fc4196e952e7, 0x2c48113823b73705},
0501 {0xd17f3b51fca3a7a0, 0xf75a15862ca504c6},
0502 {0x82ef85133de648c4, 0x9a984d73dbe722fc},
0503 {0xa3ab66580d5fdaf5, 0xc13e60d0d2e0ebbb},
0504 {0xcc963fee10b7d1b3, 0x318df905079926a9},
0505 {0xffbbcfe994e5c61f, 0xfdf17746497f7053},
0506 {0x9fd561f1fd0f9bd3, 0xfeb6ea8bedefa634},
0507 {0xc7caba6e7c5382c8, 0xfe64a52ee96b8fc1},
0508 {0xf9bd690a1b68637b, 0x3dfdce7aa3c673b1},
0509 {0x9c1661a651213e2d, 0x06bea10ca65c084f},
0510 {0xc31bfa0fe5698db8, 0x486e494fcff30a63},
0511 {0xf3e2f893dec3f126, 0x5a89dba3c3efccfb},
0512 {0x986ddb5c6b3a76b7, 0xf89629465a75e01d},
0513 {0xbe89523386091465, 0xf6bbb397f1135824},
0514 {0xee2ba6c0678b597f, 0x746aa07ded582e2d},
0515 {0x94db483840b717ef, 0xa8c2a44eb4571cdd},
0516 {0xba121a4650e4ddeb, 0x92f34d62616ce414},
0517 {0xe896a0d7e51e1566, 0x77b020baf9c81d18},
0518 {0x915e2486ef32cd60, 0x0ace1474dc1d122f},
0519 {0xb5b5ada8aaff80b8, 0x0d819992132456bb},
0520 {0xe3231912d5bf60e6, 0x10e1fff697ed6c6a},
0521 {0x8df5efabc5979c8f, 0xca8d3ffa1ef463c2},
0522 {0xb1736b96b6fd83b3, 0xbd308ff8a6b17cb3},
0523 {0xddd0467c64bce4a0, 0xac7cb3f6d05ddbdf},
0524 {0x8aa22c0dbef60ee4, 0x6bcdf07a423aa96c},
0525 {0xad4ab7112eb3929d, 0x86c16c98d2c953c7},
0526 {0xd89d64d57a607744, 0xe871c7bf077ba8b8},
0527 {0x87625f056c7c4a8b, 0x11471cd764ad4973},
0528 {0xa93af6c6c79b5d2d, 0xd598e40d3dd89bd0},
0529 {0xd389b47879823479, 0x4aff1d108d4ec2c4},
0530 {0x843610cb4bf160cb, 0xcedf722a585139bb},
0531 {0xa54394fe1eedb8fe, 0xc2974eb4ee658829},
0532 {0xce947a3da6a9273e, 0x733d226229feea33},
0533 {0x811ccc668829b887, 0x0806357d5a3f5260},
0534 {0xa163ff802a3426a8, 0xca07c2dcb0cf26f8},
0535 {0xc9bcff6034c13052, 0xfc89b393dd02f0b6},
0536 {0xfc2c3f3841f17c67, 0xbbac2078d443ace3},
0537 {0x9d9ba7832936edc0, 0xd54b944b84aa4c0e},
0538 {0xc5029163f384a931, 0x0a9e795e65d4df12},
0539 {0xf64335bcf065d37d, 0x4d4617b5ff4a16d6},
0540 {0x99ea0196163fa42e, 0x504bced1bf8e4e46},
0541 {0xc06481fb9bcf8d39, 0xe45ec2862f71e1d7},
0542 {0xf07da27a82c37088, 0x5d767327bb4e5a4d},
0543 {0x964e858c91ba2655, 0x3a6a07f8d510f870},
0544 {0xbbe226efb628afea, 0x890489f70a55368c},
0545 {0xeadab0aba3b2dbe5, 0x2b45ac74ccea842f},
0546 {0x92c8ae6b464fc96f, 0x3b0b8bc90012929e},
0547 {0xb77ada0617e3bbcb, 0x09ce6ebb40173745},
0548 {0xe55990879ddcaabd, 0xcc420a6a101d0516},
0549 {0x8f57fa54c2a9eab6, 0x9fa946824a12232e},
0550 {0xb32df8e9f3546564, 0x47939822dc96abfa},
0551 {0xdff9772470297ebd, 0x59787e2b93bc56f8},
0552 {0x8bfbea76c619ef36, 0x57eb4edb3c55b65b},
0553 {0xaefae51477a06b03, 0xede622920b6b23f2},
0554 {0xdab99e59958885c4, 0xe95fab368e45ecee},
0555 {0x88b402f7fd75539b, 0x11dbcb0218ebb415},
0556 {0xaae103b5fcd2a881, 0xd652bdc29f26a11a},
0557 {0xd59944a37c0752a2, 0x4be76d3346f04960},
0558 {0x857fcae62d8493a5, 0x6f70a4400c562ddc},
0559 {0xa6dfbd9fb8e5b88e, 0xcb4ccd500f6bb953},
0560 {0xd097ad07a71f26b2, 0x7e2000a41346a7a8},
0561 {0x825ecc24c873782f, 0x8ed400668c0c28c9},
0562 {0xa2f67f2dfa90563b, 0x728900802f0f32fb},
0563 {0xcbb41ef979346bca, 0x4f2b40a03ad2ffba},
0564 {0xfea126b7d78186bc, 0xe2f610c84987bfa9},
0565 {0x9f24b832e6b0f436, 0x0dd9ca7d2df4d7ca},
0566 {0xc6ede63fa05d3143, 0x91503d1c79720dbc},
0567 {0xf8a95fcf88747d94, 0x75a44c6397ce912b},
0568 {0x9b69dbe1b548ce7c, 0xc986afbe3ee11abb},
0569 {0xc24452da229b021b, 0xfbe85badce996169},
0570 {0xf2d56790ab41c2a2, 0xfae27299423fb9c4},
0571 {0x97c560ba6b0919a5, 0xdccd879fc967d41b},
0572 {0xbdb6b8e905cb600f, 0x5400e987bbc1c921},
0573 {0xed246723473e3813, 0x290123e9aab23b69},
0574 {0x9436c0760c86e30b, 0xf9a0b6720aaf6522},
0575 {0xb94470938fa89bce, 0xf808e40e8d5b3e6a},
0576 {0xe7958cb87392c2c2, 0xb60b1d1230b20e05},
0577 {0x90bd77f3483bb9b9, 0xb1c6f22b5e6f48c3},
0578 {0xb4ecd5f01a4aa828, 0x1e38aeb6360b1af4},
0579 {0xe2280b6c20dd5232, 0x25c6da63c38de1b1},
0580 {0x8d590723948a535f, 0x579c487e5a38ad0f},
0581 {0xb0af48ec79ace837, 0x2d835a9df0c6d852},
0582 {0xdcdb1b2798182244, 0xf8e431456cf88e66},
0583 {0x8a08f0f8bf0f156b, 0x1b8e9ecb641b5900},
0584 {0xac8b2d36eed2dac5, 0xe272467e3d222f40},
0585 {0xd7adf884aa879177, 0x5b0ed81dcc6abb10},
0586 {0x86ccbb52ea94baea, 0x98e947129fc2b4ea},
0587 {0xa87fea27a539e9a5, 0x3f2398d747b36225},
0588 {0xd29fe4b18e88640e, 0x8eec7f0d19a03aae},
0589 {0x83a3eeeef9153e89, 0x1953cf68300424ad},
0590 {0xa48ceaaab75a8e2b, 0x5fa8c3423c052dd8},
0591 {0xcdb02555653131b6, 0x3792f412cb06794e},
0592 {0x808e17555f3ebf11, 0xe2bbd88bbee40bd1},
0593 {0xa0b19d2ab70e6ed6, 0x5b6aceaeae9d0ec5},
0594 {0xc8de047564d20a8b, 0xf245825a5a445276},
0595 {0xfb158592be068d2e, 0xeed6e2f0f0d56713},
0596 {0x9ced737bb6c4183d, 0x55464dd69685606c},
0597 {0xc428d05aa4751e4c, 0xaa97e14c3c26b887},
0598 {0xf53304714d9265df, 0xd53dd99f4b3066a9},
0599 {0x993fe2c6d07b7fab, 0xe546a8038efe402a},
0600 {0xbf8fdb78849a5f96, 0xde98520472bdd034},
0601 {0xef73d256a5c0f77c, 0x963e66858f6d4441},
0602 {0x95a8637627989aad, 0xdde7001379a44aa9},
0603 {0xbb127c53b17ec159, 0x5560c018580d5d53},
0604 {0xe9d71b689dde71af, 0xaab8f01e6e10b4a7},
0605 {0x9226712162ab070d, 0xcab3961304ca70e9},
0606 {0xb6b00d69bb55c8d1, 0x3d607b97c5fd0d23},
0607 {0xe45c10c42a2b3b05, 0x8cb89a7db77c506b},
0608 {0x8eb98a7a9a5b04e3, 0x77f3608e92adb243},
0609 {0xb267ed1940f1c61c, 0x55f038b237591ed4},
0610 {0xdf01e85f912e37a3, 0x6b6c46dec52f6689},
0611 {0x8b61313bbabce2c6, 0x2323ac4b3b3da016},
0612 {0xae397d8aa96c1b77, 0xabec975e0a0d081b},
0613 {0xd9c7dced53c72255, 0x96e7bd358c904a22},
0614 {0x881cea14545c7575, 0x7e50d64177da2e55},
0615 {0xaa242499697392d2, 0xdde50bd1d5d0b9ea},
0616 {0xd4ad2dbfc3d07787, 0x955e4ec64b44e865},
0617 {0x84ec3c97da624ab4, 0xbd5af13bef0b113f},
0618 {0xa6274bbdd0fadd61, 0xecb1ad8aeacdd58f},
0619 {0xcfb11ead453994ba, 0x67de18eda5814af3},
0620 {0x81ceb32c4b43fcf4, 0x80eacf948770ced8},
0621 {0xa2425ff75e14fc31, 0xa1258379a94d028e},
0622 {0xcad2f7f5359a3b3e, 0x096ee45813a04331},
0623 {0xfd87b5f28300ca0d, 0x8bca9d6e188853fd},
0624 {0x9e74d1b791e07e48, 0x775ea264cf55347e},
0625 {0xc612062576589dda, 0x95364afe032a819e},
0626 {0xf79687aed3eec551, 0x3a83ddbd83f52205},
0627 {0x9abe14cd44753b52, 0xc4926a9672793543},
0628 {0xc16d9a0095928a27, 0x75b7053c0f178294},
0629 {0xf1c90080baf72cb1, 0x5324c68b12dd6339},
0630 {0x971da05074da7bee, 0xd3f6fc16ebca5e04},
0631 {0xbce5086492111aea, 0x88f4bb1ca6bcf585},
0632 {0xec1e4a7db69561a5, 0x2b31e9e3d06c32e6},
0633 {0x9392ee8e921d5d07, 0x3aff322e62439fd0},
0634 {0xb877aa3236a4b449, 0x09befeb9fad487c3},
0635 {0xe69594bec44de15b, 0x4c2ebe687989a9b4},
0636 {0x901d7cf73ab0acd9, 0x0f9d37014bf60a11},
0637 {0xb424dc35095cd80f, 0x538484c19ef38c95},
0638 {0xe12e13424bb40e13, 0x2865a5f206b06fba},
0639 {0x8cbccc096f5088cb, 0xf93f87b7442e45d4},
0640 {0xafebff0bcb24aafe, 0xf78f69a51539d749},
0641 {0xdbe6fecebdedd5be, 0xb573440e5a884d1c},
0642 {0x89705f4136b4a597, 0x31680a88f8953031},
0643 {0xabcc77118461cefc, 0xfdc20d2b36ba7c3e},
0644 {0xd6bf94d5e57a42bc, 0x3d32907604691b4d},
0645 {0x8637bd05af6c69b5, 0xa63f9a49c2c1b110},
0646 {0xa7c5ac471b478423, 0x0fcf80dc33721d54},
0647 {0xd1b71758e219652b, 0xd3c36113404ea4a9},
0648 {0x83126e978d4fdf3b, 0x645a1cac083126ea},
0649 {0xa3d70a3d70a3d70a, 0x3d70a3d70a3d70a4},
0650 {0xcccccccccccccccc, 0xcccccccccccccccd},
0651 {0x8000000000000000, 0x0000000000000000},
0652 {0xa000000000000000, 0x0000000000000000},
0653 {0xc800000000000000, 0x0000000000000000},
0654 {0xfa00000000000000, 0x0000000000000000},
0655 {0x9c40000000000000, 0x0000000000000000},
0656 {0xc350000000000000, 0x0000000000000000},
0657 {0xf424000000000000, 0x0000000000000000},
0658 {0x9896800000000000, 0x0000000000000000},
0659 {0xbebc200000000000, 0x0000000000000000},
0660 {0xee6b280000000000, 0x0000000000000000},
0661 {0x9502f90000000000, 0x0000000000000000},
0662 {0xba43b74000000000, 0x0000000000000000},
0663 {0xe8d4a51000000000, 0x0000000000000000},
0664 {0x9184e72a00000000, 0x0000000000000000},
0665 {0xb5e620f480000000, 0x0000000000000000},
0666 {0xe35fa931a0000000, 0x0000000000000000},
0667 {0x8e1bc9bf04000000, 0x0000000000000000},
0668 {0xb1a2bc2ec5000000, 0x0000000000000000},
0669 {0xde0b6b3a76400000, 0x0000000000000000},
0670 {0x8ac7230489e80000, 0x0000000000000000},
0671 {0xad78ebc5ac620000, 0x0000000000000000},
0672 {0xd8d726b7177a8000, 0x0000000000000000},
0673 {0x878678326eac9000, 0x0000000000000000},
0674 {0xa968163f0a57b400, 0x0000000000000000},
0675 {0xd3c21bcecceda100, 0x0000000000000000},
0676 {0x84595161401484a0, 0x0000000000000000},
0677 {0xa56fa5b99019a5c8, 0x0000000000000000},
0678 {0xcecb8f27f4200f3a, 0x0000000000000000},
0679 {0x813f3978f8940984, 0x4000000000000000},
0680 {0xa18f07d736b90be5, 0x5000000000000000},
0681 {0xc9f2c9cd04674ede, 0xa400000000000000},
0682 {0xfc6f7c4045812296, 0x4d00000000000000},
0683 {0x9dc5ada82b70b59d, 0xf020000000000000},
0684 {0xc5371912364ce305, 0x6c28000000000000},
0685 {0xf684df56c3e01bc6, 0xc732000000000000},
0686 {0x9a130b963a6c115c, 0x3c7f400000000000},
0687 {0xc097ce7bc90715b3, 0x4b9f100000000000},
0688 {0xf0bdc21abb48db20, 0x1e86d40000000000},
0689 {0x96769950b50d88f4, 0x1314448000000000},
0690 {0xbc143fa4e250eb31, 0x17d955a000000000},
0691 {0xeb194f8e1ae525fd, 0x5dcfab0800000000},
0692 {0x92efd1b8d0cf37be, 0x5aa1cae500000000},
0693 {0xb7abc627050305ad, 0xf14a3d9e40000000},
0694 {0xe596b7b0c643c719, 0x6d9ccd05d0000000},
0695 {0x8f7e32ce7bea5c6f, 0xe4820023a2000000},
0696 {0xb35dbf821ae4f38b, 0xdda2802c8a800000},
0697 {0xe0352f62a19e306e, 0xd50b2037ad200000},
0698 {0x8c213d9da502de45, 0x4526f422cc340000},
0699 {0xaf298d050e4395d6, 0x9670b12b7f410000},
0700 {0xdaf3f04651d47b4c, 0x3c0cdd765f114000},
0701 {0x88d8762bf324cd0f, 0xa5880a69fb6ac800},
0702 {0xab0e93b6efee0053, 0x8eea0d047a457a00},
0703 {0xd5d238a4abe98068, 0x72a4904598d6d880},
0704 {0x85a36366eb71f041, 0x47a6da2b7f864750},
0705 {0xa70c3c40a64e6c51, 0x999090b65f67d924},
0706 {0xd0cf4b50cfe20765, 0xfff4b4e3f741cf6d},
0707 {0x82818f1281ed449f, 0xbff8f10e7a8921a5},
0708 {0xa321f2d7226895c7, 0xaff72d52192b6a0e},
0709 {0xcbea6f8ceb02bb39, 0x9bf4f8a69f764491},
0710 {0xfee50b7025c36a08, 0x02f236d04753d5b5},
0711 {0x9f4f2726179a2245, 0x01d762422c946591},
0712 {0xc722f0ef9d80aad6, 0x424d3ad2b7b97ef6},
0713 {0xf8ebad2b84e0d58b, 0xd2e0898765a7deb3},
0714 {0x9b934c3b330c8577, 0x63cc55f49f88eb30},
0715 {0xc2781f49ffcfa6d5, 0x3cbf6b71c76b25fc},
0716 {0xf316271c7fc3908a, 0x8bef464e3945ef7b},
0717 {0x97edd871cfda3a56, 0x97758bf0e3cbb5ad},
0718 {0xbde94e8e43d0c8ec, 0x3d52eeed1cbea318},
0719 {0xed63a231d4c4fb27, 0x4ca7aaa863ee4bde},
0720 {0x945e455f24fb1cf8, 0x8fe8caa93e74ef6b},
0721 {0xb975d6b6ee39e436, 0xb3e2fd538e122b45},
0722 {0xe7d34c64a9c85d44, 0x60dbbca87196b617},
0723 {0x90e40fbeea1d3a4a, 0xbc8955e946fe31ce},
0724 {0xb51d13aea4a488dd, 0x6babab6398bdbe42},
0725 {0xe264589a4dcdab14, 0xc696963c7eed2dd2},
0726 {0x8d7eb76070a08aec, 0xfc1e1de5cf543ca3},
0727 {0xb0de65388cc8ada8, 0x3b25a55f43294bcc},
0728 {0xdd15fe86affad912, 0x49ef0eb713f39ebf},
0729 {0x8a2dbf142dfcc7ab, 0x6e3569326c784338},
0730 {0xacb92ed9397bf996, 0x49c2c37f07965405},
0731 {0xd7e77a8f87daf7fb, 0xdc33745ec97be907},
0732 {0x86f0ac99b4e8dafd, 0x69a028bb3ded71a4},
0733 {0xa8acd7c0222311bc, 0xc40832ea0d68ce0d},
0734 {0xd2d80db02aabd62b, 0xf50a3fa490c30191},
0735 {0x83c7088e1aab65db, 0x792667c6da79e0fb},
0736 {0xa4b8cab1a1563f52, 0x577001b891185939},
0737 {0xcde6fd5e09abcf26, 0xed4c0226b55e6f87},
0738 {0x80b05e5ac60b6178, 0x544f8158315b05b5},
0739 {0xa0dc75f1778e39d6, 0x696361ae3db1c722},
0740 {0xc913936dd571c84c, 0x03bc3a19cd1e38ea},
0741 {0xfb5878494ace3a5f, 0x04ab48a04065c724},
0742 {0x9d174b2dcec0e47b, 0x62eb0d64283f9c77},
0743 {0xc45d1df942711d9a, 0x3ba5d0bd324f8395},
0744 {0xf5746577930d6500, 0xca8f44ec7ee3647a},
0745 {0x9968bf6abbe85f20, 0x7e998b13cf4e1ecc},
0746 {0xbfc2ef456ae276e8, 0x9e3fedd8c321a67f},
0747 {0xefb3ab16c59b14a2, 0xc5cfe94ef3ea101f},
0748 {0x95d04aee3b80ece5, 0xbba1f1d158724a13},
0749 {0xbb445da9ca61281f, 0x2a8a6e45ae8edc98},
0750 {0xea1575143cf97226, 0xf52d09d71a3293be},
0751 {0x924d692ca61be758, 0x593c2626705f9c57},
0752 {0xb6e0c377cfa2e12e, 0x6f8b2fb00c77836d},
0753 {0xe498f455c38b997a, 0x0b6dfb9c0f956448},
0754 {0x8edf98b59a373fec, 0x4724bd4189bd5ead},
0755 {0xb2977ee300c50fe7, 0x58edec91ec2cb658},
0756 {0xdf3d5e9bc0f653e1, 0x2f2967b66737e3ee},
0757 {0x8b865b215899f46c, 0xbd79e0d20082ee75},
0758 {0xae67f1e9aec07187, 0xecd8590680a3aa12},
0759 {0xda01ee641a708de9, 0xe80e6f4820cc9496},
0760 {0x884134fe908658b2, 0x3109058d147fdcde},
0761 {0xaa51823e34a7eede, 0xbd4b46f0599fd416},
0762 {0xd4e5e2cdc1d1ea96, 0x6c9e18ac7007c91b},
0763 {0x850fadc09923329e, 0x03e2cf6bc604ddb1},
0764 {0xa6539930bf6bff45, 0x84db8346b786151d},
0765 {0xcfe87f7cef46ff16, 0xe612641865679a64},
0766 {0x81f14fae158c5f6e, 0x4fcb7e8f3f60c07f},
0767 {0xa26da3999aef7749, 0xe3be5e330f38f09e},
0768 {0xcb090c8001ab551c, 0x5cadf5bfd3072cc6},
0769 {0xfdcb4fa002162a63, 0x73d9732fc7c8f7f7},
0770 {0x9e9f11c4014dda7e, 0x2867e7fddcdd9afb},
0771 {0xc646d63501a1511d, 0xb281e1fd541501b9},
0772 {0xf7d88bc24209a565, 0x1f225a7ca91a4227},
0773 {0x9ae757596946075f, 0x3375788de9b06959},
0774 {0xc1a12d2fc3978937, 0x0052d6b1641c83af},
0775 {0xf209787bb47d6b84, 0xc0678c5dbd23a49b},
0776 {0x9745eb4d50ce6332, 0xf840b7ba963646e1},
0777 {0xbd176620a501fbff, 0xb650e5a93bc3d899},
0778 {0xec5d3fa8ce427aff, 0xa3e51f138ab4cebf},
0779 {0x93ba47c980e98cdf, 0xc66f336c36b10138},
0780 {0xb8a8d9bbe123f017, 0xb80b0047445d4185},
0781 {0xe6d3102ad96cec1d, 0xa60dc059157491e6},
0782 {0x9043ea1ac7e41392, 0x87c89837ad68db30},
0783 {0xb454e4a179dd1877, 0x29babe4598c311fc},
0784 {0xe16a1dc9d8545e94, 0xf4296dd6fef3d67b},
0785 {0x8ce2529e2734bb1d, 0x1899e4a65f58660d},
0786 {0xb01ae745b101e9e4, 0x5ec05dcff72e7f90},
0787 {0xdc21a1171d42645d, 0x76707543f4fa1f74},
0788 {0x899504ae72497eba, 0x6a06494a791c53a9},
0789 {0xabfa45da0edbde69, 0x0487db9d17636893},
0790 {0xd6f8d7509292d603, 0x45a9d2845d3c42b7},
0791 {0x865b86925b9bc5c2, 0x0b8a2392ba45a9b3},
0792 {0xa7f26836f282b732, 0x8e6cac7768d7141f},
0793 {0xd1ef0244af2364ff, 0x3207d795430cd927},
0794 {0x8335616aed761f1f, 0x7f44e6bd49e807b9},
0795 {0xa402b9c5a8d3a6e7, 0x5f16206c9c6209a7},
0796 {0xcd036837130890a1, 0x36dba887c37a8c10},
0797 {0x802221226be55a64, 0xc2494954da2c978a},
0798 {0xa02aa96b06deb0fd, 0xf2db9baa10b7bd6d},
0799 {0xc83553c5c8965d3d, 0x6f92829494e5acc8},
0800 {0xfa42a8b73abbf48c, 0xcb772339ba1f17fa},
0801 {0x9c69a97284b578d7, 0xff2a760414536efc},
0802 {0xc38413cf25e2d70d, 0xfef5138519684abb},
0803 {0xf46518c2ef5b8cd1, 0x7eb258665fc25d6a},
0804 {0x98bf2f79d5993802, 0xef2f773ffbd97a62},
0805 {0xbeeefb584aff8603, 0xaafb550ffacfd8fb},
0806 {0xeeaaba2e5dbf6784, 0x95ba2a53f983cf39},
0807 {0x952ab45cfa97a0b2, 0xdd945a747bf26184},
0808 {0xba756174393d88df, 0x94f971119aeef9e5},
0809 {0xe912b9d1478ceb17, 0x7a37cd5601aab85e},
0810 {0x91abb422ccb812ee, 0xac62e055c10ab33b},
0811 {0xb616a12b7fe617aa, 0x577b986b314d600a},
0812 {0xe39c49765fdf9d94, 0xed5a7e85fda0b80c},
0813 {0x8e41ade9fbebc27d, 0x14588f13be847308},
0814 {0xb1d219647ae6b31c, 0x596eb2d8ae258fc9},
0815 {0xde469fbd99a05fe3, 0x6fca5f8ed9aef3bc},
0816 {0x8aec23d680043bee, 0x25de7bb9480d5855},
0817 {0xada72ccc20054ae9, 0xaf561aa79a10ae6b},
0818 {0xd910f7ff28069da4, 0x1b2ba1518094da05},
0819 {0x87aa9aff79042286, 0x90fb44d2f05d0843},
0820 {0xa99541bf57452b28, 0x353a1607ac744a54},
0821 {0xd3fa922f2d1675f2, 0x42889b8997915ce9},
0822 {0x847c9b5d7c2e09b7, 0x69956135febada12},
0823 {0xa59bc234db398c25, 0x43fab9837e699096},
0824 {0xcf02b2c21207ef2e, 0x94f967e45e03f4bc},
0825 {0x8161afb94b44f57d, 0x1d1be0eebac278f6},
0826 {0xa1ba1ba79e1632dc, 0x6462d92a69731733},
0827 {0xca28a291859bbf93, 0x7d7b8f7503cfdcff},
0828 {0xfcb2cb35e702af78, 0x5cda735244c3d43f},
0829 {0x9defbf01b061adab, 0x3a0888136afa64a8},
0830 {0xc56baec21c7a1916, 0x088aaa1845b8fdd1},
0831 {0xf6c69a72a3989f5b, 0x8aad549e57273d46},
0832 {0x9a3c2087a63f6399, 0x36ac54e2f678864c},
0833 {0xc0cb28a98fcf3c7f, 0x84576a1bb416a7de},
0834 {0xf0fdf2d3f3c30b9f, 0x656d44a2a11c51d6},
0835 {0x969eb7c47859e743, 0x9f644ae5a4b1b326},
0836 {0xbc4665b596706114, 0x873d5d9f0dde1fef},
0837 {0xeb57ff22fc0c7959, 0xa90cb506d155a7eb},
0838 {0x9316ff75dd87cbd8, 0x09a7f12442d588f3},
0839 {0xb7dcbf5354e9bece, 0x0c11ed6d538aeb30},
0840 {0xe5d3ef282a242e81, 0x8f1668c8a86da5fb},
0841 {0x8fa475791a569d10, 0xf96e017d694487bd},
0842 {0xb38d92d760ec4455, 0x37c981dcc395a9ad},
0843 {0xe070f78d3927556a, 0x85bbe253f47b1418},
0844 {0x8c469ab843b89562, 0x93956d7478ccec8f},
0845 {0xaf58416654a6babb, 0x387ac8d1970027b3},
0846 {0xdb2e51bfe9d0696a, 0x06997b05fcc0319f},
0847 {0x88fcf317f22241e2, 0x441fece3bdf81f04},
0848 {0xab3c2fddeeaad25a, 0xd527e81cad7626c4},
0849 {0xd60b3bd56a5586f1, 0x8a71e223d8d3b075},
0850 {0x85c7056562757456, 0xf6872d5667844e4a},
0851 {0xa738c6bebb12d16c, 0xb428f8ac016561dc},
0852 {0xd106f86e69d785c7, 0xe13336d701beba53},
0853 {0x82a45b450226b39c, 0xecc0024661173474},
0854 {0xa34d721642b06084, 0x27f002d7f95d0191},
0855 {0xcc20ce9bd35c78a5, 0x31ec038df7b441f5},
0856 {0xff290242c83396ce, 0x7e67047175a15272},
0857 {0x9f79a169bd203e41, 0x0f0062c6e984d387},
0858 {0xc75809c42c684dd1, 0x52c07b78a3e60869},
0859 {0xf92e0c3537826145, 0xa7709a56ccdf8a83},
0860 {0x9bbcc7a142b17ccb, 0x88a66076400bb692},
0861 {0xc2abf989935ddbfe, 0x6acff893d00ea436},
0862 {0xf356f7ebf83552fe, 0x0583f6b8c4124d44},
0863 {0x98165af37b2153de, 0xc3727a337a8b704b},
0864 {0xbe1bf1b059e9a8d6, 0x744f18c0592e4c5d},
0865 {0xeda2ee1c7064130c, 0x1162def06f79df74},
0866 {0x9485d4d1c63e8be7, 0x8addcb5645ac2ba9},
0867 {0xb9a74a0637ce2ee1, 0x6d953e2bd7173693},
0868 {0xe8111c87c5c1ba99, 0xc8fa8db6ccdd0438},
0869 {0x910ab1d4db9914a0, 0x1d9c9892400a22a3},
0870 {0xb54d5e4a127f59c8, 0x2503beb6d00cab4c},
0871 {0xe2a0b5dc971f303a, 0x2e44ae64840fd61e},
0872 {0x8da471a9de737e24, 0x5ceaecfed289e5d3},
0873 {0xb10d8e1456105dad, 0x7425a83e872c5f48},
0874 {0xdd50f1996b947518, 0xd12f124e28f7771a},
0875 {0x8a5296ffe33cc92f, 0x82bd6b70d99aaa70},
0876 {0xace73cbfdc0bfb7b, 0x636cc64d1001550c},
0877 {0xd8210befd30efa5a, 0x3c47f7e05401aa4f},
0878 {0x8714a775e3e95c78, 0x65acfaec34810a72},
0879 {0xa8d9d1535ce3b396, 0x7f1839a741a14d0e},
0880 {0xd31045a8341ca07c, 0x1ede48111209a051},
0881 {0x83ea2b892091e44d, 0x934aed0aab460433},
0882 {0xa4e4b66b68b65d60, 0xf81da84d56178540},
0883 {0xce1de40642e3f4b9, 0x36251260ab9d668f},
0884 {0x80d2ae83e9ce78f3, 0xc1d72b7c6b42601a},
0885 {0xa1075a24e4421730, 0xb24cf65b8612f820},
0886 {0xc94930ae1d529cfc, 0xdee033f26797b628},
0887 {0xfb9b7cd9a4a7443c, 0x169840ef017da3b2},
0888 {0x9d412e0806e88aa5, 0x8e1f289560ee864f},
0889 {0xc491798a08a2ad4e, 0xf1a6f2bab92a27e3},
0890 {0xf5b5d7ec8acb58a2, 0xae10af696774b1dc},
0891 {0x9991a6f3d6bf1765, 0xacca6da1e0a8ef2a},
0892 {0xbff610b0cc6edd3f, 0x17fd090a58d32af4},
0893 {0xeff394dcff8a948e, 0xddfc4b4cef07f5b1},
0894 {0x95f83d0a1fb69cd9, 0x4abdaf101564f98f},
0895 {0xbb764c4ca7a4440f, 0x9d6d1ad41abe37f2},
0896 {0xea53df5fd18d5513, 0x84c86189216dc5ee},
0897 {0x92746b9be2f8552c, 0x32fd3cf5b4e49bb5},
0898 {0xb7118682dbb66a77, 0x3fbc8c33221dc2a2},
0899 {0xe4d5e82392a40515, 0x0fabaf3feaa5334b},
0900 {0x8f05b1163ba6832d, 0x29cb4d87f2a7400f},
0901 {0xb2c71d5bca9023f8, 0x743e20e9ef511013},
0902 {0xdf78e4b2bd342cf6, 0x914da9246b255417},
0903 {0x8bab8eefb6409c1a, 0x1ad089b6c2f7548f},
0904 {0xae9672aba3d0c320, 0xa184ac2473b529b2},
0905 {0xda3c0f568cc4f3e8, 0xc9e5d72d90a2741f},
0906 {0x8865899617fb1871, 0x7e2fa67c7a658893},
0907 {0xaa7eebfb9df9de8d, 0xddbb901b98feeab8},
0908 {0xd51ea6fa85785631, 0x552a74227f3ea566},
0909 {0x8533285c936b35de, 0xd53a88958f872760},
0910 {0xa67ff273b8460356, 0x8a892abaf368f138},
0911 {0xd01fef10a657842c, 0x2d2b7569b0432d86},
0912 {0x8213f56a67f6b29b, 0x9c3b29620e29fc74},
0913 {0xa298f2c501f45f42, 0x8349f3ba91b47b90},
0914 {0xcb3f2f7642717713, 0x241c70a936219a74},
0915 {0xfe0efb53d30dd4d7, 0xed238cd383aa0111},
0916 {0x9ec95d1463e8a506, 0xf4363804324a40ab},
0917 {0xc67bb4597ce2ce48, 0xb143c6053edcd0d6},
0918 {0xf81aa16fdc1b81da, 0xdd94b7868e94050b},
0919 {0x9b10a4e5e9913128, 0xca7cf2b4191c8327},
0920 {0xc1d4ce1f63f57d72, 0xfd1c2f611f63a3f1},
0921 {0xf24a01a73cf2dccf, 0xbc633b39673c8ced},
0922 {0x976e41088617ca01, 0xd5be0503e085d814},
0923 {0xbd49d14aa79dbc82, 0x4b2d8644d8a74e19},
0924 {0xec9c459d51852ba2, 0xddf8e7d60ed1219f},
0925 {0x93e1ab8252f33b45, 0xcabb90e5c942b504},
0926 {0xb8da1662e7b00a17, 0x3d6a751f3b936244},
0927 {0xe7109bfba19c0c9d, 0x0cc512670a783ad5},
0928 {0x906a617d450187e2, 0x27fb2b80668b24c6},
0929 {0xb484f9dc9641e9da, 0xb1f9f660802dedf7},
0930 {0xe1a63853bbd26451, 0x5e7873f8a0396974},
0931 {0x8d07e33455637eb2, 0xdb0b487b6423e1e9},
0932 {0xb049dc016abc5e5f, 0x91ce1a9a3d2cda63},
0933 {0xdc5c5301c56b75f7, 0x7641a140cc7810fc},
0934 {0x89b9b3e11b6329ba, 0xa9e904c87fcb0a9e},
0935 {0xac2820d9623bf429, 0x546345fa9fbdcd45},
0936 {0xd732290fbacaf133, 0xa97c177947ad4096},
0937 {0x867f59a9d4bed6c0, 0x49ed8eabcccc485e},
0938 {0xa81f301449ee8c70, 0x5c68f256bfff5a75},
0939 {0xd226fc195c6a2f8c, 0x73832eec6fff3112},
0940 {0x83585d8fd9c25db7, 0xc831fd53c5ff7eac},
0941 {0xa42e74f3d032f525, 0xba3e7ca8b77f5e56},
0942 {0xcd3a1230c43fb26f, 0x28ce1bd2e55f35ec},
0943 {0x80444b5e7aa7cf85, 0x7980d163cf5b81b4},
0944 {0xa0555e361951c366, 0xd7e105bcc3326220},
0945 {0xc86ab5c39fa63440, 0x8dd9472bf3fefaa8},
0946 {0xfa856334878fc150, 0xb14f98f6f0feb952},
0947 {0x9c935e00d4b9d8d2, 0x6ed1bf9a569f33d4},
0948 {0xc3b8358109e84f07, 0x0a862f80ec4700c9},
0949 {0xf4a642e14c6262c8, 0xcd27bb612758c0fb},
0950 {0x98e7e9cccfbd7dbd, 0x8038d51cb897789d},
0951 {0xbf21e44003acdd2c, 0xe0470a63e6bd56c4},
0952 {0xeeea5d5004981478, 0x1858ccfce06cac75},
0953 {0x95527a5202df0ccb, 0x0f37801e0c43ebc9},
0954 {0xbaa718e68396cffd, 0xd30560258f54e6bb},
0955 {0xe950df20247c83fd, 0x47c6b82ef32a206a},
0956 {0x91d28b7416cdd27e, 0x4cdc331d57fa5442},
0957 {0xb6472e511c81471d, 0xe0133fe4adf8e953},
0958 {0xe3d8f9e563a198e5, 0x58180fddd97723a7},
0959 {0x8e679c2f5e44ff8f, 0x570f09eaa7ea7649},
0960 {0xb201833b35d63f73, 0x2cd2cc6551e513db},
0961 {0xde81e40a034bcf4f, 0xf8077f7ea65e58d2},
0962 {0x8b112e86420f6191, 0xfb04afaf27faf783},
0963 {0xadd57a27d29339f6, 0x79c5db9af1f9b564},
0964 {0xd94ad8b1c7380874, 0x18375281ae7822bd},
0965 {0x87cec76f1c830548, 0x8f2293910d0b15b6},
0966 {0xa9c2794ae3a3c69a, 0xb2eb3875504ddb23},
0967 {0xd433179d9c8cb841, 0x5fa60692a46151ec},
0968 {0x849feec281d7f328, 0xdbc7c41ba6bcd334},
0969 {0xa5c7ea73224deff3, 0x12b9b522906c0801},
0970 {0xcf39e50feae16bef, 0xd768226b34870a01},
0971 {0x81842f29f2cce375, 0xe6a1158300d46641},
0972 {0xa1e53af46f801c53, 0x60495ae3c1097fd1},
0973 {0xca5e89b18b602368, 0x385bb19cb14bdfc5},
0974 {0xfcf62c1dee382c42, 0x46729e03dd9ed7b6},
0975 {0x9e19db92b4e31ba9, 0x6c07a2c26a8346d2},
0976 {0xc5a05277621be293, 0xc7098b7305241886},
0977 {0xf70867153aa2db38, 0xb8cbee4fc66d1ea8},
0978 {0x9a65406d44a5c903, 0x737f74f1dc043329},
0979 {0xc0fe908895cf3b44, 0x505f522e53053ff3},
0980 {0xf13e34aabb430a15, 0x647726b9e7c68ff0},
0981 {0x96c6e0eab509e64d, 0x5eca783430dc19f6},
0982 {0xbc789925624c5fe0, 0xb67d16413d132073},
0983 {0xeb96bf6ebadf77d8, 0xe41c5bd18c57e890},
0984 {0x933e37a534cbaae7, 0x8e91b962f7b6f15a},
0985 {0xb80dc58e81fe95a1, 0x723627bbb5a4adb1},
0986 {0xe61136f2227e3b09, 0xcec3b1aaa30dd91d},
0987 {0x8fcac257558ee4e6, 0x213a4f0aa5e8a7b2},
0988 {0xb3bd72ed2af29e1f, 0xa988e2cd4f62d19e},
0989 {0xe0accfa875af45a7, 0x93eb1b80a33b8606},
0990 {0x8c6c01c9498d8b88, 0xbc72f130660533c4},
0991 {0xaf87023b9bf0ee6a, 0xeb8fad7c7f8680b5},
0992 {0xdb68c2ca82ed2a05, 0xa67398db9f6820e2},
0993 #else
0994 {0xff77b1fcbebcdc4f, 0x25e8e89c13bb0f7b},
0995 {0xce5d73ff402d98e3, 0xfb0a3d212dc81290},
0996 {0xa6b34ad8c9dfc06f, 0xf42faa48c0ea481f},
0997 {0x86a8d39ef77164bc, 0xae5dff9c02033198},
0998 {0xd98ddaee19068c76, 0x3badd624dd9b0958},
0999 {0xafbd2350644eeacf, 0xe5d1929ef90898fb},
1000 {0x8df5efabc5979c8f, 0xca8d3ffa1ef463c2},
1001 {0xe55990879ddcaabd, 0xcc420a6a101d0516},
1002 {0xb94470938fa89bce, 0xf808e40e8d5b3e6a},
1003 {0x95a8637627989aad, 0xdde7001379a44aa9},
1004 {0xf1c90080baf72cb1, 0x5324c68b12dd6339},
1005 {0xc350000000000000, 0x0000000000000000},
1006 {0x9dc5ada82b70b59d, 0xf020000000000000},
1007 {0xfee50b7025c36a08, 0x02f236d04753d5b5},
1008 {0xcde6fd5e09abcf26, 0xed4c0226b55e6f87},
1009 {0xa6539930bf6bff45, 0x84db8346b786151d},
1010 {0x865b86925b9bc5c2, 0x0b8a2392ba45a9b3},
1011 {0xd910f7ff28069da4, 0x1b2ba1518094da05},
1012 {0xaf58416654a6babb, 0x387ac8d1970027b3},
1013 {0x8da471a9de737e24, 0x5ceaecfed289e5d3},
1014 {0xe4d5e82392a40515, 0x0fabaf3feaa5334b},
1015 {0xb8da1662e7b00a17, 0x3d6a751f3b936244},
1016 {0x95527a5202df0ccb, 0x0f37801e0c43ebc9},
1017 {0xf13e34aabb430a15, 0x647726b9e7c68ff0}
1018 #endif
1019 };
1020
1021 #if FMT_USE_FULL_CACHE_DRAGONBOX
1022 return pow10_significands[k - float_info<double>::min_k];
1023 #else
1024 static constexpr const uint64_t powers_of_5_64[] = {
1025 0x0000000000000001, 0x0000000000000005, 0x0000000000000019,
1026 0x000000000000007d, 0x0000000000000271, 0x0000000000000c35,
1027 0x0000000000003d09, 0x000000000001312d, 0x000000000005f5e1,
1028 0x00000000001dcd65, 0x00000000009502f9, 0x0000000002e90edd,
1029 0x000000000e8d4a51, 0x0000000048c27395, 0x000000016bcc41e9,
1030 0x000000071afd498d, 0x0000002386f26fc1, 0x000000b1a2bc2ec5,
1031 0x000003782dace9d9, 0x00001158e460913d, 0x000056bc75e2d631,
1032 0x0001b1ae4d6e2ef5, 0x000878678326eac9, 0x002a5a058fc295ed,
1033 0x00d3c21bcecceda1, 0x0422ca8b0a00a425, 0x14adf4b7320334b9};
1034
1035 static const int compression_ratio = 27;
1036
1037
1038 int cache_index = (k - float_info<double>::min_k) / compression_ratio;
1039 int kb = cache_index * compression_ratio + float_info<double>::min_k;
1040 int offset = k - kb;
1041
1042
1043 uint128_fallback base_cache = pow10_significands[cache_index];
1044 if (offset == 0) return base_cache;
1045
1046
1047 int alpha = floor_log2_pow10(kb + offset) - floor_log2_pow10(kb) - offset;
1048 FMT_ASSERT(alpha > 0 && alpha < 64, "shifting error detected");
1049
1050
1051 uint64_t pow5 = powers_of_5_64[offset];
1052 uint128_fallback recovered_cache = umul128(base_cache.high(), pow5);
1053 uint128_fallback middle_low = umul128(base_cache.low(), pow5);
1054
1055 recovered_cache += middle_low.high();
1056
1057 uint64_t high_to_middle = recovered_cache.high() << (64 - alpha);
1058 uint64_t middle_to_low = recovered_cache.low() << (64 - alpha);
1059
1060 recovered_cache =
1061 uint128_fallback{(recovered_cache.low() >> alpha) | high_to_middle,
1062 ((middle_low.low() >> alpha) | middle_to_low)};
1063 FMT_ASSERT(recovered_cache.low() + 1 != 0, "");
1064 return {recovered_cache.high(), recovered_cache.low() + 1};
1065 #endif
1066 }
1067
1068 struct compute_mul_result {
1069 carrier_uint result;
1070 bool is_integer;
1071 };
1072 struct compute_mul_parity_result {
1073 bool parity;
1074 bool is_integer;
1075 };
1076
1077 static auto compute_mul(carrier_uint u,
1078 const cache_entry_type& cache) noexcept
1079 -> compute_mul_result {
1080 auto r = umul192_upper128(u, cache);
1081 return {r.high(), r.low() == 0};
1082 }
1083
1084 static auto compute_delta(cache_entry_type const& cache, int beta) noexcept
1085 -> uint32_t {
1086 return static_cast<uint32_t>(cache.high() >> (64 - 1 - beta));
1087 }
1088
1089 static auto compute_mul_parity(carrier_uint two_f,
1090 const cache_entry_type& cache,
1091 int beta) noexcept
1092 -> compute_mul_parity_result {
1093 FMT_ASSERT(beta >= 1, "");
1094 FMT_ASSERT(beta < 64, "");
1095
1096 auto r = umul192_lower128(two_f, cache);
1097 return {((r.high() >> (64 - beta)) & 1) != 0,
1098 ((r.high() << beta) | (r.low() >> (64 - beta))) == 0};
1099 }
1100
1101 static auto compute_left_endpoint_for_shorter_interval_case(
1102 const cache_entry_type& cache, int beta) noexcept -> carrier_uint {
1103 return (cache.high() -
1104 (cache.high() >> (num_significand_bits<double>() + 2))) >>
1105 (64 - num_significand_bits<double>() - 1 - beta);
1106 }
1107
1108 static auto compute_right_endpoint_for_shorter_interval_case(
1109 const cache_entry_type& cache, int beta) noexcept -> carrier_uint {
1110 return (cache.high() +
1111 (cache.high() >> (num_significand_bits<double>() + 1))) >>
1112 (64 - num_significand_bits<double>() - 1 - beta);
1113 }
1114
1115 static auto compute_round_up_for_shorter_interval_case(
1116 const cache_entry_type& cache, int beta) noexcept -> carrier_uint {
1117 return ((cache.high() >> (64 - num_significand_bits<double>() - 2 - beta)) +
1118 1) /
1119 2;
1120 }
1121 };
1122
1123 FMT_FUNC auto get_cached_power(int k) noexcept -> uint128_fallback {
1124 return cache_accessor<double>::get_cached_power(k);
1125 }
1126
1127
1128 template <typename T>
1129 auto is_left_endpoint_integer_shorter_interval(int exponent) noexcept -> bool {
1130 const int case_shorter_interval_left_endpoint_lower_threshold = 2;
1131 const int case_shorter_interval_left_endpoint_upper_threshold = 3;
1132 return exponent >= case_shorter_interval_left_endpoint_lower_threshold &&
1133 exponent <= case_shorter_interval_left_endpoint_upper_threshold;
1134 }
1135
1136
1137 FMT_INLINE int remove_trailing_zeros(uint32_t& n, int s = 0) noexcept {
1138 FMT_ASSERT(n != 0, "");
1139
1140 constexpr uint32_t mod_inv_5 = 0xcccccccd;
1141 constexpr uint32_t mod_inv_25 = 0xc28f5c29;
1142
1143 while (true) {
1144 auto q = rotr(n * mod_inv_25, 2);
1145 if (q > max_value<uint32_t>() / 100) break;
1146 n = q;
1147 s += 2;
1148 }
1149 auto q = rotr(n * mod_inv_5, 1);
1150 if (q <= max_value<uint32_t>() / 10) {
1151 n = q;
1152 s |= 1;
1153 }
1154 return s;
1155 }
1156
1157
1158 FMT_INLINE int remove_trailing_zeros(uint64_t& n) noexcept {
1159 FMT_ASSERT(n != 0, "");
1160
1161
1162 constexpr uint64_t magic_number = 12379400392853802749ull;
1163 auto nm = umul128(n, magic_number);
1164
1165
1166 if ((nm.high() & ((1ull << (90 - 64)) - 1)) == 0 && nm.low() < magic_number) {
1167
1168 auto n32 = static_cast<uint32_t>(nm.high() >> (90 - 64));
1169
1170 int s = remove_trailing_zeros(n32, 8);
1171 n = n32;
1172 return s;
1173 }
1174
1175
1176 constexpr uint64_t mod_inv_5 = 0xcccccccccccccccd;
1177 constexpr uint64_t mod_inv_25 = 0x8f5c28f5c28f5c29;
1178
1179 int s = 0;
1180 while (true) {
1181 auto q = rotr(n * mod_inv_25, 2);
1182 if (q > max_value<uint64_t>() / 100) break;
1183 n = q;
1184 s += 2;
1185 }
1186 auto q = rotr(n * mod_inv_5, 1);
1187 if (q <= max_value<uint64_t>() / 10) {
1188 n = q;
1189 s |= 1;
1190 }
1191
1192 return s;
1193 }
1194
1195
1196 template <typename T>
1197 FMT_INLINE decimal_fp<T> shorter_interval_case(int exponent) noexcept {
1198 decimal_fp<T> ret_value;
1199
1200 const int minus_k = floor_log10_pow2_minus_log10_4_over_3(exponent);
1201 const int beta = exponent + floor_log2_pow10(-minus_k);
1202
1203
1204 using cache_entry_type = typename cache_accessor<T>::cache_entry_type;
1205 const cache_entry_type cache = cache_accessor<T>::get_cached_power(-minus_k);
1206
1207 auto xi = cache_accessor<T>::compute_left_endpoint_for_shorter_interval_case(
1208 cache, beta);
1209 auto zi = cache_accessor<T>::compute_right_endpoint_for_shorter_interval_case(
1210 cache, beta);
1211
1212
1213 if (!is_left_endpoint_integer_shorter_interval<T>(exponent)) ++xi;
1214
1215
1216 ret_value.significand = zi / 10;
1217
1218
1219 if (ret_value.significand * 10 >= xi) {
1220 ret_value.exponent = minus_k + 1;
1221 ret_value.exponent += remove_trailing_zeros(ret_value.significand);
1222 return ret_value;
1223 }
1224
1225
1226 ret_value.significand =
1227 cache_accessor<T>::compute_round_up_for_shorter_interval_case(cache,
1228 beta);
1229 ret_value.exponent = minus_k;
1230
1231
1232 if (exponent >= float_info<T>::shorter_interval_tie_lower_threshold &&
1233 exponent <= float_info<T>::shorter_interval_tie_upper_threshold) {
1234 ret_value.significand = ret_value.significand % 2 == 0
1235 ? ret_value.significand
1236 : ret_value.significand - 1;
1237 } else if (ret_value.significand < xi) {
1238 ++ret_value.significand;
1239 }
1240 return ret_value;
1241 }
1242
1243 template <typename T> auto to_decimal(T x) noexcept -> decimal_fp<T> {
1244
1245
1246 using carrier_uint = typename float_info<T>::carrier_uint;
1247 using cache_entry_type = typename cache_accessor<T>::cache_entry_type;
1248 auto br = bit_cast<carrier_uint>(x);
1249
1250
1251 const carrier_uint significand_mask =
1252 (static_cast<carrier_uint>(1) << num_significand_bits<T>()) - 1;
1253 carrier_uint significand = (br & significand_mask);
1254 int exponent =
1255 static_cast<int>((br & exponent_mask<T>()) >> num_significand_bits<T>());
1256
1257 if (exponent != 0) {
1258 exponent -= exponent_bias<T>() + num_significand_bits<T>();
1259
1260
1261
1262
1263 if (significand == 0) return shorter_interval_case<T>(exponent);
1264
1265 significand |= (static_cast<carrier_uint>(1) << num_significand_bits<T>());
1266 } else {
1267
1268 if (significand == 0) return {0, 0};
1269 exponent =
1270 std::numeric_limits<T>::min_exponent - num_significand_bits<T>() - 1;
1271 }
1272
1273 const bool include_left_endpoint = (significand % 2 == 0);
1274 const bool include_right_endpoint = include_left_endpoint;
1275
1276
1277 const int minus_k = floor_log10_pow2(exponent) - float_info<T>::kappa;
1278 const cache_entry_type cache = cache_accessor<T>::get_cached_power(-minus_k);
1279 const int beta = exponent + floor_log2_pow10(-minus_k);
1280
1281
1282
1283 const uint32_t deltai = cache_accessor<T>::compute_delta(cache, beta);
1284 const carrier_uint two_fc = significand << 1;
1285
1286
1287
1288
1289
1290
1291
1292
1293
1294
1295
1296 const typename cache_accessor<T>::compute_mul_result z_mul =
1297 cache_accessor<T>::compute_mul((two_fc | 1) << beta, cache);
1298
1299
1300
1301
1302
1303 decimal_fp<T> ret_value;
1304 ret_value.significand = divide_by_10_to_kappa_plus_1(z_mul.result);
1305 uint32_t r = static_cast<uint32_t>(z_mul.result - float_info<T>::big_divisor *
1306 ret_value.significand);
1307
1308 if (r < deltai) {
1309
1310 if (r == 0 && (z_mul.is_integer & !include_right_endpoint)) {
1311 --ret_value.significand;
1312 r = float_info<T>::big_divisor;
1313 goto small_divisor_case_label;
1314 }
1315 } else if (r > deltai) {
1316 goto small_divisor_case_label;
1317 } else {
1318
1319 const typename cache_accessor<T>::compute_mul_parity_result x_mul =
1320 cache_accessor<T>::compute_mul_parity(two_fc - 1, cache, beta);
1321
1322 if (!(x_mul.parity | (x_mul.is_integer & include_left_endpoint)))
1323 goto small_divisor_case_label;
1324 }
1325 ret_value.exponent = minus_k + float_info<T>::kappa + 1;
1326
1327
1328 ret_value.exponent += remove_trailing_zeros(ret_value.significand);
1329 return ret_value;
1330
1331
1332
1333 small_divisor_case_label:
1334 ret_value.significand *= 10;
1335 ret_value.exponent = minus_k + float_info<T>::kappa;
1336
1337 uint32_t dist = r - (deltai / 2) + (float_info<T>::small_divisor / 2);
1338 const bool approx_y_parity =
1339 ((dist ^ (float_info<T>::small_divisor / 2)) & 1) != 0;
1340
1341
1342 const bool divisible_by_small_divisor =
1343 check_divisibility_and_divide_by_pow10<float_info<T>::kappa>(dist);
1344
1345
1346 ret_value.significand += dist;
1347
1348 if (!divisible_by_small_divisor) return ret_value;
1349
1350
1351
1352
1353
1354
1355
1356 const auto y_mul = cache_accessor<T>::compute_mul_parity(two_fc, cache, beta);
1357
1358
1359
1360 if (y_mul.parity != approx_y_parity)
1361 --ret_value.significand;
1362 else if (y_mul.is_integer & (ret_value.significand % 2 != 0))
1363 --ret_value.significand;
1364 return ret_value;
1365 }
1366 }
1367 }
1368
1369 template <> struct formatter<detail::bigint> {
1370 FMT_CONSTEXPR auto parse(format_parse_context& ctx)
1371 -> format_parse_context::iterator {
1372 return ctx.begin();
1373 }
1374
1375 auto format(const detail::bigint& n, format_context& ctx) const
1376 -> format_context::iterator {
1377 auto out = ctx.out();
1378 bool first = true;
1379 for (auto i = n.bigits_.size(); i > 0; --i) {
1380 auto value = n.bigits_[i - 1u];
1381 if (first) {
1382 out = fmt::format_to(out, FMT_STRING("{:x}"), value);
1383 first = false;
1384 continue;
1385 }
1386 out = fmt::format_to(out, FMT_STRING("{:08x}"), value);
1387 }
1388 if (n.exp_ > 0)
1389 out = fmt::format_to(out, FMT_STRING("p{}"),
1390 n.exp_ * detail::bigint::bigit_bits);
1391 return out;
1392 }
1393 };
1394
1395 FMT_FUNC detail::utf8_to_utf16::utf8_to_utf16(string_view s) {
1396 for_each_codepoint(s, [this](uint32_t cp, string_view) {
1397 if (cp == invalid_code_point) FMT_THROW(std::runtime_error("invalid utf8"));
1398 if (cp <= 0xFFFF) {
1399 buffer_.push_back(static_cast<wchar_t>(cp));
1400 } else {
1401 cp -= 0x10000;
1402 buffer_.push_back(static_cast<wchar_t>(0xD800 + (cp >> 10)));
1403 buffer_.push_back(static_cast<wchar_t>(0xDC00 + (cp & 0x3FF)));
1404 }
1405 return true;
1406 });
1407 buffer_.push_back(0);
1408 }
1409
1410 FMT_FUNC void format_system_error(detail::buffer<char>& out, int error_code,
1411 const char* message) noexcept {
1412 FMT_TRY {
1413 auto ec = std::error_code(error_code, std::generic_category());
1414 write(std::back_inserter(out), std::system_error(ec, message).what());
1415 return;
1416 }
1417 FMT_CATCH(...) {}
1418 format_error_code(out, error_code, message);
1419 }
1420
1421 FMT_FUNC void report_system_error(int error_code,
1422 const char* message) noexcept {
1423 report_error(format_system_error, error_code, message);
1424 }
1425
1426 FMT_FUNC auto vformat(string_view fmt, format_args args) -> std::string {
1427
1428
1429 auto buffer = memory_buffer();
1430 detail::vformat_to(buffer, fmt, args);
1431 return to_string(buffer);
1432 }
1433
1434 namespace detail {
1435 #if !defined(_WIN32) || defined(FMT_WINDOWS_NO_WCHAR)
1436 FMT_FUNC auto write_console(int, string_view) -> bool { return false; }
1437 FMT_FUNC auto write_console(std::FILE*, string_view) -> bool { return false; }
1438 #else
1439 using dword = conditional_t<sizeof(long) == 4, unsigned long, unsigned>;
1440 extern "C" __declspec(dllimport) int __stdcall WriteConsoleW(
1441 void*, const void*, dword, dword*, void*);
1442
1443 FMT_FUNC bool write_console(int fd, string_view text) {
1444 auto u16 = utf8_to_utf16(text);
1445 return WriteConsoleW(reinterpret_cast<void*>(_get_osfhandle(fd)), u16.c_str(),
1446 static_cast<dword>(u16.size()), nullptr, nullptr) != 0;
1447 }
1448
1449 FMT_FUNC auto write_console(std::FILE* f, string_view text) -> bool {
1450 return write_console(_fileno(f), text);
1451 }
1452 #endif
1453
1454 #ifdef _WIN32
1455
1456 FMT_FUNC void vprint_mojibake(std::FILE* f, string_view fmt, format_args args) {
1457 auto buffer = memory_buffer();
1458 detail::vformat_to(buffer, fmt, args);
1459 fwrite_fully(buffer.data(), buffer.size(), f);
1460 }
1461 #endif
1462
1463 FMT_FUNC void print(std::FILE* f, string_view text) {
1464 #ifdef _WIN32
1465 int fd = _fileno(f);
1466 if (_isatty(fd)) {
1467 std::fflush(f);
1468 if (write_console(fd, text)) return;
1469 }
1470 #endif
1471 fwrite_fully(text.data(), text.size(), f);
1472 }
1473 }
1474
1475 FMT_FUNC void vprint(std::FILE* f, string_view fmt, format_args args) {
1476 auto buffer = memory_buffer();
1477 detail::vformat_to(buffer, fmt, args);
1478 detail::print(f, {buffer.data(), buffer.size()});
1479 }
1480
1481 FMT_FUNC void vprint(string_view fmt, format_args args) {
1482 vprint(stdout, fmt, args);
1483 }
1484
1485 namespace detail {
1486
1487 struct singleton {
1488 unsigned char upper;
1489 unsigned char lower_count;
1490 };
1491
1492 inline auto is_printable(uint16_t x, const singleton* singletons,
1493 size_t singletons_size,
1494 const unsigned char* singleton_lowers,
1495 const unsigned char* normal, size_t normal_size)
1496 -> bool {
1497 auto upper = x >> 8;
1498 auto lower_start = 0;
1499 for (size_t i = 0; i < singletons_size; ++i) {
1500 auto s = singletons[i];
1501 auto lower_end = lower_start + s.lower_count;
1502 if (upper < s.upper) break;
1503 if (upper == s.upper) {
1504 for (auto j = lower_start; j < lower_end; ++j) {
1505 if (singleton_lowers[j] == (x & 0xff)) return false;
1506 }
1507 }
1508 lower_start = lower_end;
1509 }
1510
1511 auto xsigned = static_cast<int>(x);
1512 auto current = true;
1513 for (size_t i = 0; i < normal_size; ++i) {
1514 auto v = static_cast<int>(normal[i]);
1515 auto len = (v & 0x80) != 0 ? (v & 0x7f) << 8 | normal[++i] : v;
1516 xsigned -= len;
1517 if (xsigned < 0) break;
1518 current = !current;
1519 }
1520 return current;
1521 }
1522
1523
1524 FMT_FUNC auto is_printable(uint32_t cp) -> bool {
1525 static constexpr singleton singletons0[] = {
1526 {0x00, 1}, {0x03, 5}, {0x05, 6}, {0x06, 3}, {0x07, 6}, {0x08, 8},
1527 {0x09, 17}, {0x0a, 28}, {0x0b, 25}, {0x0c, 20}, {0x0d, 16}, {0x0e, 13},
1528 {0x0f, 4}, {0x10, 3}, {0x12, 18}, {0x13, 9}, {0x16, 1}, {0x17, 5},
1529 {0x18, 2}, {0x19, 3}, {0x1a, 7}, {0x1c, 2}, {0x1d, 1}, {0x1f, 22},
1530 {0x20, 3}, {0x2b, 3}, {0x2c, 2}, {0x2d, 11}, {0x2e, 1}, {0x30, 3},
1531 {0x31, 2}, {0x32, 1}, {0xa7, 2}, {0xa9, 2}, {0xaa, 4}, {0xab, 8},
1532 {0xfa, 2}, {0xfb, 5}, {0xfd, 4}, {0xfe, 3}, {0xff, 9},
1533 };
1534 static constexpr unsigned char singletons0_lower[] = {
1535 0xad, 0x78, 0x79, 0x8b, 0x8d, 0xa2, 0x30, 0x57, 0x58, 0x8b, 0x8c, 0x90,
1536 0x1c, 0x1d, 0xdd, 0x0e, 0x0f, 0x4b, 0x4c, 0xfb, 0xfc, 0x2e, 0x2f, 0x3f,
1537 0x5c, 0x5d, 0x5f, 0xb5, 0xe2, 0x84, 0x8d, 0x8e, 0x91, 0x92, 0xa9, 0xb1,
1538 0xba, 0xbb, 0xc5, 0xc6, 0xc9, 0xca, 0xde, 0xe4, 0xe5, 0xff, 0x00, 0x04,
1539 0x11, 0x12, 0x29, 0x31, 0x34, 0x37, 0x3a, 0x3b, 0x3d, 0x49, 0x4a, 0x5d,
1540 0x84, 0x8e, 0x92, 0xa9, 0xb1, 0xb4, 0xba, 0xbb, 0xc6, 0xca, 0xce, 0xcf,
1541 0xe4, 0xe5, 0x00, 0x04, 0x0d, 0x0e, 0x11, 0x12, 0x29, 0x31, 0x34, 0x3a,
1542 0x3b, 0x45, 0x46, 0x49, 0x4a, 0x5e, 0x64, 0x65, 0x84, 0x91, 0x9b, 0x9d,
1543 0xc9, 0xce, 0xcf, 0x0d, 0x11, 0x29, 0x45, 0x49, 0x57, 0x64, 0x65, 0x8d,
1544 0x91, 0xa9, 0xb4, 0xba, 0xbb, 0xc5, 0xc9, 0xdf, 0xe4, 0xe5, 0xf0, 0x0d,
1545 0x11, 0x45, 0x49, 0x64, 0x65, 0x80, 0x84, 0xb2, 0xbc, 0xbe, 0xbf, 0xd5,
1546 0xd7, 0xf0, 0xf1, 0x83, 0x85, 0x8b, 0xa4, 0xa6, 0xbe, 0xbf, 0xc5, 0xc7,
1547 0xce, 0xcf, 0xda, 0xdb, 0x48, 0x98, 0xbd, 0xcd, 0xc6, 0xce, 0xcf, 0x49,
1548 0x4e, 0x4f, 0x57, 0x59, 0x5e, 0x5f, 0x89, 0x8e, 0x8f, 0xb1, 0xb6, 0xb7,
1549 0xbf, 0xc1, 0xc6, 0xc7, 0xd7, 0x11, 0x16, 0x17, 0x5b, 0x5c, 0xf6, 0xf7,
1550 0xfe, 0xff, 0x80, 0x0d, 0x6d, 0x71, 0xde, 0xdf, 0x0e, 0x0f, 0x1f, 0x6e,
1551 0x6f, 0x1c, 0x1d, 0x5f, 0x7d, 0x7e, 0xae, 0xaf, 0xbb, 0xbc, 0xfa, 0x16,
1552 0x17, 0x1e, 0x1f, 0x46, 0x47, 0x4e, 0x4f, 0x58, 0x5a, 0x5c, 0x5e, 0x7e,
1553 0x7f, 0xb5, 0xc5, 0xd4, 0xd5, 0xdc, 0xf0, 0xf1, 0xf5, 0x72, 0x73, 0x8f,
1554 0x74, 0x75, 0x96, 0x2f, 0x5f, 0x26, 0x2e, 0x2f, 0xa7, 0xaf, 0xb7, 0xbf,
1555 0xc7, 0xcf, 0xd7, 0xdf, 0x9a, 0x40, 0x97, 0x98, 0x30, 0x8f, 0x1f, 0xc0,
1556 0xc1, 0xce, 0xff, 0x4e, 0x4f, 0x5a, 0x5b, 0x07, 0x08, 0x0f, 0x10, 0x27,
1557 0x2f, 0xee, 0xef, 0x6e, 0x6f, 0x37, 0x3d, 0x3f, 0x42, 0x45, 0x90, 0x91,
1558 0xfe, 0xff, 0x53, 0x67, 0x75, 0xc8, 0xc9, 0xd0, 0xd1, 0xd8, 0xd9, 0xe7,
1559 0xfe, 0xff,
1560 };
1561 static constexpr singleton singletons1[] = {
1562 {0x00, 6}, {0x01, 1}, {0x03, 1}, {0x04, 2}, {0x08, 8}, {0x09, 2},
1563 {0x0a, 5}, {0x0b, 2}, {0x0e, 4}, {0x10, 1}, {0x11, 2}, {0x12, 5},
1564 {0x13, 17}, {0x14, 1}, {0x15, 2}, {0x17, 2}, {0x19, 13}, {0x1c, 5},
1565 {0x1d, 8}, {0x24, 1}, {0x6a, 3}, {0x6b, 2}, {0xbc, 2}, {0xd1, 2},
1566 {0xd4, 12}, {0xd5, 9}, {0xd6, 2}, {0xd7, 2}, {0xda, 1}, {0xe0, 5},
1567 {0xe1, 2}, {0xe8, 2}, {0xee, 32}, {0xf0, 4}, {0xf8, 2}, {0xf9, 2},
1568 {0xfa, 2}, {0xfb, 1},
1569 };
1570 static constexpr unsigned char singletons1_lower[] = {
1571 0x0c, 0x27, 0x3b, 0x3e, 0x4e, 0x4f, 0x8f, 0x9e, 0x9e, 0x9f, 0x06, 0x07,
1572 0x09, 0x36, 0x3d, 0x3e, 0x56, 0xf3, 0xd0, 0xd1, 0x04, 0x14, 0x18, 0x36,
1573 0x37, 0x56, 0x57, 0x7f, 0xaa, 0xae, 0xaf, 0xbd, 0x35, 0xe0, 0x12, 0x87,
1574 0x89, 0x8e, 0x9e, 0x04, 0x0d, 0x0e, 0x11, 0x12, 0x29, 0x31, 0x34, 0x3a,
1575 0x45, 0x46, 0x49, 0x4a, 0x4e, 0x4f, 0x64, 0x65, 0x5c, 0xb6, 0xb7, 0x1b,
1576 0x1c, 0x07, 0x08, 0x0a, 0x0b, 0x14, 0x17, 0x36, 0x39, 0x3a, 0xa8, 0xa9,
1577 0xd8, 0xd9, 0x09, 0x37, 0x90, 0x91, 0xa8, 0x07, 0x0a, 0x3b, 0x3e, 0x66,
1578 0x69, 0x8f, 0x92, 0x6f, 0x5f, 0xee, 0xef, 0x5a, 0x62, 0x9a, 0x9b, 0x27,
1579 0x28, 0x55, 0x9d, 0xa0, 0xa1, 0xa3, 0xa4, 0xa7, 0xa8, 0xad, 0xba, 0xbc,
1580 0xc4, 0x06, 0x0b, 0x0c, 0x15, 0x1d, 0x3a, 0x3f, 0x45, 0x51, 0xa6, 0xa7,
1581 0xcc, 0xcd, 0xa0, 0x07, 0x19, 0x1a, 0x22, 0x25, 0x3e, 0x3f, 0xc5, 0xc6,
1582 0x04, 0x20, 0x23, 0x25, 0x26, 0x28, 0x33, 0x38, 0x3a, 0x48, 0x4a, 0x4c,
1583 0x50, 0x53, 0x55, 0x56, 0x58, 0x5a, 0x5c, 0x5e, 0x60, 0x63, 0x65, 0x66,
1584 0x6b, 0x73, 0x78, 0x7d, 0x7f, 0x8a, 0xa4, 0xaa, 0xaf, 0xb0, 0xc0, 0xd0,
1585 0xae, 0xaf, 0x79, 0xcc, 0x6e, 0x6f, 0x93,
1586 };
1587 static constexpr unsigned char normal0[] = {
1588 0x00, 0x20, 0x5f, 0x22, 0x82, 0xdf, 0x04, 0x82, 0x44, 0x08, 0x1b, 0x04,
1589 0x06, 0x11, 0x81, 0xac, 0x0e, 0x80, 0xab, 0x35, 0x28, 0x0b, 0x80, 0xe0,
1590 0x03, 0x19, 0x08, 0x01, 0x04, 0x2f, 0x04, 0x34, 0x04, 0x07, 0x03, 0x01,
1591 0x07, 0x06, 0x07, 0x11, 0x0a, 0x50, 0x0f, 0x12, 0x07, 0x55, 0x07, 0x03,
1592 0x04, 0x1c, 0x0a, 0x09, 0x03, 0x08, 0x03, 0x07, 0x03, 0x02, 0x03, 0x03,
1593 0x03, 0x0c, 0x04, 0x05, 0x03, 0x0b, 0x06, 0x01, 0x0e, 0x15, 0x05, 0x3a,
1594 0x03, 0x11, 0x07, 0x06, 0x05, 0x10, 0x07, 0x57, 0x07, 0x02, 0x07, 0x15,
1595 0x0d, 0x50, 0x04, 0x43, 0x03, 0x2d, 0x03, 0x01, 0x04, 0x11, 0x06, 0x0f,
1596 0x0c, 0x3a, 0x04, 0x1d, 0x25, 0x5f, 0x20, 0x6d, 0x04, 0x6a, 0x25, 0x80,
1597 0xc8, 0x05, 0x82, 0xb0, 0x03, 0x1a, 0x06, 0x82, 0xfd, 0x03, 0x59, 0x07,
1598 0x15, 0x0b, 0x17, 0x09, 0x14, 0x0c, 0x14, 0x0c, 0x6a, 0x06, 0x0a, 0x06,
1599 0x1a, 0x06, 0x59, 0x07, 0x2b, 0x05, 0x46, 0x0a, 0x2c, 0x04, 0x0c, 0x04,
1600 0x01, 0x03, 0x31, 0x0b, 0x2c, 0x04, 0x1a, 0x06, 0x0b, 0x03, 0x80, 0xac,
1601 0x06, 0x0a, 0x06, 0x21, 0x3f, 0x4c, 0x04, 0x2d, 0x03, 0x74, 0x08, 0x3c,
1602 0x03, 0x0f, 0x03, 0x3c, 0x07, 0x38, 0x08, 0x2b, 0x05, 0x82, 0xff, 0x11,
1603 0x18, 0x08, 0x2f, 0x11, 0x2d, 0x03, 0x20, 0x10, 0x21, 0x0f, 0x80, 0x8c,
1604 0x04, 0x82, 0x97, 0x19, 0x0b, 0x15, 0x88, 0x94, 0x05, 0x2f, 0x05, 0x3b,
1605 0x07, 0x02, 0x0e, 0x18, 0x09, 0x80, 0xb3, 0x2d, 0x74, 0x0c, 0x80, 0xd6,
1606 0x1a, 0x0c, 0x05, 0x80, 0xff, 0x05, 0x80, 0xdf, 0x0c, 0xee, 0x0d, 0x03,
1607 0x84, 0x8d, 0x03, 0x37, 0x09, 0x81, 0x5c, 0x14, 0x80, 0xb8, 0x08, 0x80,
1608 0xcb, 0x2a, 0x38, 0x03, 0x0a, 0x06, 0x38, 0x08, 0x46, 0x08, 0x0c, 0x06,
1609 0x74, 0x0b, 0x1e, 0x03, 0x5a, 0x04, 0x59, 0x09, 0x80, 0x83, 0x18, 0x1c,
1610 0x0a, 0x16, 0x09, 0x4c, 0x04, 0x80, 0x8a, 0x06, 0xab, 0xa4, 0x0c, 0x17,
1611 0x04, 0x31, 0xa1, 0x04, 0x81, 0xda, 0x26, 0x07, 0x0c, 0x05, 0x05, 0x80,
1612 0xa5, 0x11, 0x81, 0x6d, 0x10, 0x78, 0x28, 0x2a, 0x06, 0x4c, 0x04, 0x80,
1613 0x8d, 0x04, 0x80, 0xbe, 0x03, 0x1b, 0x03, 0x0f, 0x0d,
1614 };
1615 static constexpr unsigned char normal1[] = {
1616 0x5e, 0x22, 0x7b, 0x05, 0x03, 0x04, 0x2d, 0x03, 0x66, 0x03, 0x01, 0x2f,
1617 0x2e, 0x80, 0x82, 0x1d, 0x03, 0x31, 0x0f, 0x1c, 0x04, 0x24, 0x09, 0x1e,
1618 0x05, 0x2b, 0x05, 0x44, 0x04, 0x0e, 0x2a, 0x80, 0xaa, 0x06, 0x24, 0x04,
1619 0x24, 0x04, 0x28, 0x08, 0x34, 0x0b, 0x01, 0x80, 0x90, 0x81, 0x37, 0x09,
1620 0x16, 0x0a, 0x08, 0x80, 0x98, 0x39, 0x03, 0x63, 0x08, 0x09, 0x30, 0x16,
1621 0x05, 0x21, 0x03, 0x1b, 0x05, 0x01, 0x40, 0x38, 0x04, 0x4b, 0x05, 0x2f,
1622 0x04, 0x0a, 0x07, 0x09, 0x07, 0x40, 0x20, 0x27, 0x04, 0x0c, 0x09, 0x36,
1623 0x03, 0x3a, 0x05, 0x1a, 0x07, 0x04, 0x0c, 0x07, 0x50, 0x49, 0x37, 0x33,
1624 0x0d, 0x33, 0x07, 0x2e, 0x08, 0x0a, 0x81, 0x26, 0x52, 0x4e, 0x28, 0x08,
1625 0x2a, 0x56, 0x1c, 0x14, 0x17, 0x09, 0x4e, 0x04, 0x1e, 0x0f, 0x43, 0x0e,
1626 0x19, 0x07, 0x0a, 0x06, 0x48, 0x08, 0x27, 0x09, 0x75, 0x0b, 0x3f, 0x41,
1627 0x2a, 0x06, 0x3b, 0x05, 0x0a, 0x06, 0x51, 0x06, 0x01, 0x05, 0x10, 0x03,
1628 0x05, 0x80, 0x8b, 0x62, 0x1e, 0x48, 0x08, 0x0a, 0x80, 0xa6, 0x5e, 0x22,
1629 0x45, 0x0b, 0x0a, 0x06, 0x0d, 0x13, 0x39, 0x07, 0x0a, 0x36, 0x2c, 0x04,
1630 0x10, 0x80, 0xc0, 0x3c, 0x64, 0x53, 0x0c, 0x48, 0x09, 0x0a, 0x46, 0x45,
1631 0x1b, 0x48, 0x08, 0x53, 0x1d, 0x39, 0x81, 0x07, 0x46, 0x0a, 0x1d, 0x03,
1632 0x47, 0x49, 0x37, 0x03, 0x0e, 0x08, 0x0a, 0x06, 0x39, 0x07, 0x0a, 0x81,
1633 0x36, 0x19, 0x80, 0xb7, 0x01, 0x0f, 0x32, 0x0d, 0x83, 0x9b, 0x66, 0x75,
1634 0x0b, 0x80, 0xc4, 0x8a, 0xbc, 0x84, 0x2f, 0x8f, 0xd1, 0x82, 0x47, 0xa1,
1635 0xb9, 0x82, 0x39, 0x07, 0x2a, 0x04, 0x02, 0x60, 0x26, 0x0a, 0x46, 0x0a,
1636 0x28, 0x05, 0x13, 0x82, 0xb0, 0x5b, 0x65, 0x4b, 0x04, 0x39, 0x07, 0x11,
1637 0x40, 0x05, 0x0b, 0x02, 0x0e, 0x97, 0xf8, 0x08, 0x84, 0xd6, 0x2a, 0x09,
1638 0xa2, 0xf7, 0x81, 0x1f, 0x31, 0x03, 0x11, 0x04, 0x08, 0x81, 0x8c, 0x89,
1639 0x04, 0x6b, 0x05, 0x0d, 0x03, 0x09, 0x07, 0x10, 0x93, 0x60, 0x80, 0xf6,
1640 0x0a, 0x73, 0x08, 0x6e, 0x17, 0x46, 0x80, 0x9a, 0x14, 0x0c, 0x57, 0x09,
1641 0x19, 0x80, 0x87, 0x81, 0x47, 0x03, 0x85, 0x42, 0x0f, 0x15, 0x85, 0x50,
1642 0x2b, 0x80, 0xd5, 0x2d, 0x03, 0x1a, 0x04, 0x02, 0x81, 0x70, 0x3a, 0x05,
1643 0x01, 0x85, 0x00, 0x80, 0xd7, 0x29, 0x4c, 0x04, 0x0a, 0x04, 0x02, 0x83,
1644 0x11, 0x44, 0x4c, 0x3d, 0x80, 0xc2, 0x3c, 0x06, 0x01, 0x04, 0x55, 0x05,
1645 0x1b, 0x34, 0x02, 0x81, 0x0e, 0x2c, 0x04, 0x64, 0x0c, 0x56, 0x0a, 0x80,
1646 0xae, 0x38, 0x1d, 0x0d, 0x2c, 0x04, 0x09, 0x07, 0x02, 0x0e, 0x06, 0x80,
1647 0x9a, 0x83, 0xd8, 0x08, 0x0d, 0x03, 0x0d, 0x03, 0x74, 0x0c, 0x59, 0x07,
1648 0x0c, 0x14, 0x0c, 0x04, 0x38, 0x08, 0x0a, 0x06, 0x28, 0x08, 0x22, 0x4e,
1649 0x81, 0x54, 0x0c, 0x15, 0x03, 0x03, 0x05, 0x07, 0x09, 0x19, 0x07, 0x07,
1650 0x09, 0x03, 0x0d, 0x07, 0x29, 0x80, 0xcb, 0x25, 0x0a, 0x84, 0x06,
1651 };
1652 auto lower = static_cast<uint16_t>(cp);
1653 if (cp < 0x10000) {
1654 return is_printable(lower, singletons0,
1655 sizeof(singletons0) / sizeof(*singletons0),
1656 singletons0_lower, normal0, sizeof(normal0));
1657 }
1658 if (cp < 0x20000) {
1659 return is_printable(lower, singletons1,
1660 sizeof(singletons1) / sizeof(*singletons1),
1661 singletons1_lower, normal1, sizeof(normal1));
1662 }
1663 if (0x2a6de <= cp && cp < 0x2a700) return false;
1664 if (0x2b735 <= cp && cp < 0x2b740) return false;
1665 if (0x2b81e <= cp && cp < 0x2b820) return false;
1666 if (0x2cea2 <= cp && cp < 0x2ceb0) return false;
1667 if (0x2ebe1 <= cp && cp < 0x2f800) return false;
1668 if (0x2fa1e <= cp && cp < 0x30000) return false;
1669 if (0x3134b <= cp && cp < 0xe0100) return false;
1670 if (0xe01f0 <= cp && cp < 0x110000) return false;
1671 return cp < 0x110000;
1672 }
1673
1674 }
1675
1676 FMT_END_NAMESPACE
1677
1678 #endif