Microsoft's floating-point to_chars powered by Ryu and Ryu Printf

Microsoft would like to contribute its implementation of floating-point to_chars to libc++. This uses the impossibly fast Ryu and Ryu Printf algorithms invented by Ulf Adams at Google. Upstream repos: https://github.com/microsoft/STL and https://github.com/ulfjack/ryu .

Licensing notes: MSVC's STL is available under the Apache License v2.0 with LLVM Exception, intentionally chosen to match libc++. We've used Ryu under the Boost Software License.

This patch contains minor changes from Jorg Brown at Google, to adapt the code to libc++. He verified that it works in Google's Linux-based environment, but then I applied more changes on top of his, so any compiler errors are my fault. (I haven't tried to build and test libc++ yet.) Please tell me if we need to do anything else in order to follow https://llvm.org/docs/DeveloperPolicy.html#attribution-of-changes .

Notes:

* libc++'s integer charconv is unchanged (except for a small refactoring). MSVC's integer charconv hasn't been tuned for performance yet, so you're not missing anything.
* Floating-point from_chars isn't part of this patch because Jorg found that MSVC's implementation (derived from our CRT's strtod) was slower than Abseil's. If you're unable to use Abseil or another implementation due to licensing or technical considerations, Microsoft would be delighted if you used MSVC's from_chars (and you can just take it, or ask us to provide a patch like this). Ulf is also working on a novel algorithm for from_chars.
* This assumes that float is IEEE 32-bit, double is IEEE 64-bit, and long double is also IEEE 64-bit.
* I have added MSVC's charconv tests (the whole thing: integer/floating from_chars/to_chars), but haven't adapted them to libcxx's harness at all. (These tests will be available in the microsoft/STL repo soon.)
* Jorg added int128 codepaths. These were originally present in upstream Ryu, and I removed them from microsoft/STL purely for performance reasons (MSVC doesn't support int128; Clang on Windows does, but I found that x64 intrinsics were slightly faster).
* The implementation is split into 3 headers. In MSVC's STL, charconv contains only Microsoft-written code. xcharconv_ryu.h contains code derived from Ryu (with significant modifications and additions). xcharconv_ryu_tables.h contains Ryu's large lookup tables (they were sufficiently large to make editing inconvenient, hence the separate file). The xmeow.h convention is MSVC's for internal headers; you may wish to rename them.
* You should consider separately compiling the lookup tables (see https://github.com/microsoft/STL/issues/172 ) for compiler throughput and reduced object file size.
* See https://github.com/StephanTLavavej/llvm-project/commits/charconv for fine-grained history. (If necessary, I can perform some rebase surgery to show you what Jorg changed relative to the microsoft/STL repo; currently that's all fused into the first commit.)

Differential Revision: https://reviews.llvm.org/D70631

NOKEYCHECK=True
GitOrigin-RevId: abb5dd6e99df623effc935b84e86f2e886580ad7
diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt
index 999f97b..12dcdf9 100644
--- a/src/CMakeLists.txt
+++ b/src/CMakeLists.txt
@@ -19,6 +19,16 @@
   include/atomic_support.h
   include/config_elast.h
   include/refstring.h
+  include/ryu/common.h
+  include/ryu/d2fixed.h
+  include/ryu/d2fixed_full_table.h
+  include/ryu/d2s.h
+  include/ryu/d2s_full_table.h
+  include/ryu/d2s_intrinsics.h
+  include/ryu/digit_table.h
+  include/ryu/f2s.h
+  include/ryu/ryu.h
+  include/to_chars_floating_point.h
   legacy_pointer_safety.cpp
   memory.cpp
   mutex.cpp
@@ -26,6 +36,9 @@
   new.cpp
   optional.cpp
   random_shuffle.cpp
+  ryu/d2fixed.cpp
+  ryu/d2s.cpp
+  ryu/f2s.cpp
   shared_mutex.cpp
   stdexcept.cpp
   string.cpp
diff --git a/src/charconv.cpp b/src/charconv.cpp
index 533e59b..60ec3ec 100644
--- a/src/charconv.cpp
+++ b/src/charconv.cpp
@@ -9,27 +9,14 @@
 #include "charconv"
 #include <string.h>
 
+#include "include/ryu/digit_table.h"
+#include "include/to_chars_floating_point.h"
+
 _LIBCPP_BEGIN_NAMESPACE_STD
 
 namespace __itoa
 {
 
-static constexpr char cDigitsLut[200] = {
-    '0', '0', '0', '1', '0', '2', '0', '3', '0', '4', '0', '5', '0', '6', '0',
-    '7', '0', '8', '0', '9', '1', '0', '1', '1', '1', '2', '1', '3', '1', '4',
-    '1', '5', '1', '6', '1', '7', '1', '8', '1', '9', '2', '0', '2', '1', '2',
-    '2', '2', '3', '2', '4', '2', '5', '2', '6', '2', '7', '2', '8', '2', '9',
-    '3', '0', '3', '1', '3', '2', '3', '3', '3', '4', '3', '5', '3', '6', '3',
-    '7', '3', '8', '3', '9', '4', '0', '4', '1', '4', '2', '4', '3', '4', '4',
-    '4', '5', '4', '6', '4', '7', '4', '8', '4', '9', '5', '0', '5', '1', '5',
-    '2', '5', '3', '5', '4', '5', '5', '5', '6', '5', '7', '5', '8', '5', '9',
-    '6', '0', '6', '1', '6', '2', '6', '3', '6', '4', '6', '5', '6', '6', '6',
-    '7', '6', '8', '6', '9', '7', '0', '7', '1', '7', '2', '7', '3', '7', '4',
-    '7', '5', '7', '6', '7', '7', '7', '8', '7', '9', '8', '0', '8', '1', '8',
-    '2', '8', '3', '8', '4', '8', '5', '8', '6', '8', '7', '8', '8', '8', '9',
-    '9', '0', '9', '1', '9', '2', '9', '3', '9', '4', '9', '5', '9', '6', '9',
-    '7', '9', '8', '9', '9'};
-
 template <typename T>
 inline _LIBCPP_INLINE_VISIBILITY char*
 append1(char* buffer, T i) noexcept
@@ -42,7 +29,7 @@
 inline _LIBCPP_INLINE_VISIBILITY char*
 append2(char* buffer, T i) noexcept
 {
-    memcpy(buffer, &cDigitsLut[(i)*2], 2);
+    memcpy(buffer, &__DIGIT_TABLE[(i)*2], 2);
     return buffer + 2;
 }
 
@@ -157,4 +144,53 @@
 
 }  // namespace __itoa
 
+// The original version of floating-point to_chars was written by Microsoft and
+// contributed with the following license.
+
+// Copyright (c) Microsoft Corporation.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+
+// This implementation is dedicated to the memory of Mary and Thavatchai.
+
+to_chars_result to_chars(char* __first, char* __last, float __value) {
+  return _Floating_to_chars<_Floating_to_chars_overload::_Plain>(__first, __last, __value, chars_format{}, 0);
+}
+
+to_chars_result to_chars(char* __first, char* __last, double __value) {
+  return _Floating_to_chars<_Floating_to_chars_overload::_Plain>(__first, __last, __value, chars_format{}, 0);
+}
+
+to_chars_result to_chars(char* __first, char* __last, long double __value) {
+  return _Floating_to_chars<_Floating_to_chars_overload::_Plain>(__first, __last, static_cast<double>(__value),
+                                                                 chars_format{}, 0);
+}
+
+to_chars_result to_chars(char* __first, char* __last, float __value, chars_format __fmt) {
+  return _Floating_to_chars<_Floating_to_chars_overload::_Format_only>(__first, __last, __value, __fmt, 0);
+}
+
+to_chars_result to_chars(char* __first, char* __last, double __value, chars_format __fmt) {
+  return _Floating_to_chars<_Floating_to_chars_overload::_Format_only>(__first, __last, __value, __fmt, 0);
+}
+
+to_chars_result to_chars(char* __first, char* __last, long double __value, chars_format __fmt) {
+  return _Floating_to_chars<_Floating_to_chars_overload::_Format_only>(__first, __last, static_cast<double>(__value),
+                                                                       __fmt, 0);
+}
+
+to_chars_result to_chars(char* __first, char* __last, float __value, chars_format __fmt, int __precision) {
+  return _Floating_to_chars<_Floating_to_chars_overload::_Format_precision>(__first, __last, __value, __fmt,
+                                                                            __precision);
+}
+
+to_chars_result to_chars(char* __first, char* __last, double __value, chars_format __fmt, int __precision) {
+  return _Floating_to_chars<_Floating_to_chars_overload::_Format_precision>(__first, __last, __value, __fmt,
+                                                                            __precision);
+}
+
+to_chars_result to_chars(char* __first, char* __last, long double __value, chars_format __fmt, int __precision) {
+  return _Floating_to_chars<_Floating_to_chars_overload::_Format_precision>(
+      __first, __last, static_cast<double>(__value), __fmt, __precision);
+}
+
 _LIBCPP_END_NAMESPACE_STD
diff --git a/src/include/ryu/common.h b/src/include/ryu/common.h
new file mode 100644
index 0000000..5291312
--- /dev/null
+++ b/src/include/ryu/common.h
@@ -0,0 +1,107 @@
+//===----------------------------------------------------------------------===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+
+// Copyright (c) Microsoft Corporation.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+
+// Copyright 2018 Ulf Adams
+// Copyright (c) Microsoft Corporation. All rights reserved.
+
+// Boost Software License - Version 1.0 - August 17th, 2003
+
+// Permission is hereby granted, free of charge, to any person or organization
+// obtaining a copy of the software and accompanying documentation covered by
+// this license (the "Software") to use, reproduce, display, distribute,
+// execute, and transmit the Software, and to prepare derivative works of the
+// Software, and to permit third-parties to whom the Software is furnished to
+// do so, all subject to the following:
+
+// The copyright notices in the Software and this entire statement, including
+// the above license grant, this restriction and the following disclaimer,
+// must be included in all copies of the Software, in whole or in part, and
+// all derivative works of the Software, unless such copies or derivative
+// works are solely in the form of machine-executable object code generated by
+// a source language processor.
+
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT
+// SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE
+// FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,
+// ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+// DEALINGS IN THE SOFTWARE.
+
+#ifndef _LIBCPP_SRC_INCLUDE_RYU_COMMON_H
+#define _LIBCPP_SRC_INCLUDE_RYU_COMMON_H
+
+// Avoid formatting to keep the changes with the original code minimal.
+// clang-format off
+
+#include "__config"
+
+_LIBCPP_BEGIN_NAMESPACE_STD
+
+[[nodiscard]] _LIBCPP_HIDE_FROM_ABI inline uint32_t __decimalLength9(const uint32_t __v) {
+  // Function precondition: __v is not a 10-digit number.
+  // (f2s: 9 digits are sufficient for round-tripping.)
+  // (d2fixed: We print 9-digit blocks.)
+  _LIBCPP_ASSERT(__v < 1000000000, "");
+  if (__v >= 100000000) { return 9; }
+  if (__v >= 10000000) { return 8; }
+  if (__v >= 1000000) { return 7; }
+  if (__v >= 100000) { return 6; }
+  if (__v >= 10000) { return 5; }
+  if (__v >= 1000) { return 4; }
+  if (__v >= 100) { return 3; }
+  if (__v >= 10) { return 2; }
+  return 1;
+}
+
+// Returns __e == 0 ? 1 : ceil(log_2(5^__e)).
+[[nodiscard]] _LIBCPP_HIDE_FROM_ABI  inline int32_t __pow5bits(const int32_t __e) {
+  // This approximation works up to the point that the multiplication overflows at __e = 3529.
+  // If the multiplication were done in 64 bits, it would fail at 5^4004 which is just greater
+  // than 2^9297.
+  _LIBCPP_ASSERT(__e >= 0, "");
+  _LIBCPP_ASSERT(__e <= 3528, "");
+  return static_cast<int32_t>(((static_cast<uint32_t>(__e) * 1217359) >> 19) + 1);
+}
+
+// Returns floor(log_10(2^__e)).
+[[nodiscard]] _LIBCPP_HIDE_FROM_ABI  inline uint32_t __log10Pow2(const int32_t __e) {
+  // The first value this approximation fails for is 2^1651 which is just greater than 10^297.
+  _LIBCPP_ASSERT(__e >= 0, "");
+  _LIBCPP_ASSERT(__e <= 1650, "");
+  return (static_cast<uint32_t>(__e) * 78913) >> 18;
+}
+
+// Returns floor(log_10(5^__e)).
+[[nodiscard]] _LIBCPP_HIDE_FROM_ABI inline uint32_t __log10Pow5(const int32_t __e) {
+  // The first value this approximation fails for is 5^2621 which is just greater than 10^1832.
+  _LIBCPP_ASSERT(__e >= 0, "");
+  _LIBCPP_ASSERT(__e <= 2620, "");
+  return (static_cast<uint32_t>(__e) * 732923) >> 20;
+}
+
+[[nodiscard]] _LIBCPP_HIDE_FROM_ABI inline uint32_t __float_to_bits(const float __f) {
+  uint32_t __bits = 0;
+  _VSTD::memcpy(&__bits, &__f, sizeof(float));
+  return __bits;
+}
+
+[[nodiscard]] _LIBCPP_HIDE_FROM_ABI inline uint64_t __double_to_bits(const double __d) {
+  uint64_t __bits = 0;
+  _VSTD::memcpy(&__bits, &__d, sizeof(double));
+  return __bits;
+}
+
+_LIBCPP_END_NAMESPACE_STD
+
+// clang-format on
+
+#endif // _LIBCPP_SRC_INCLUDE_RYU_COMMON_H
diff --git a/src/include/ryu/d2fixed.h b/src/include/ryu/d2fixed.h
new file mode 100644
index 0000000..e495c11
--- /dev/null
+++ b/src/include/ryu/d2fixed.h
@@ -0,0 +1,60 @@
+//===----------------------------------------------------------------------===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+
+// Copyright (c) Microsoft Corporation.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+
+// Copyright 2018 Ulf Adams
+// Copyright (c) Microsoft Corporation. All rights reserved.
+
+// Boost Software License - Version 1.0 - August 17th, 2003
+
+// Permission is hereby granted, free of charge, to any person or organization
+// obtaining a copy of the software and accompanying documentation covered by
+// this license (the "Software") to use, reproduce, display, distribute,
+// execute, and transmit the Software, and to prepare derivative works of the
+// Software, and to permit third-parties to whom the Software is furnished to
+// do so, all subject to the following:
+
+// The copyright notices in the Software and this entire statement, including
+// the above license grant, this restriction and the following disclaimer,
+// must be included in all copies of the Software, in whole or in part, and
+// all derivative works of the Software, unless such copies or derivative
+// works are solely in the form of machine-executable object code generated by
+// a source language processor.
+
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT
+// SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE
+// FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,
+// ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+// DEALINGS IN THE SOFTWARE.
+
+#ifndef _LIBCPP_SRC_INCLUDE_RYU_D2FIXED_H
+#define _LIBCPP_SRC_INCLUDE_RYU_D2FIXED_H
+
+// Avoid formatting to keep the changes with the original code minimal.
+// clang-format off
+
+#include "__config"
+#include "cstdint"
+
+_LIBCPP_BEGIN_NAMESPACE_STD
+
+void __append_n_digits(const uint32_t __olength, uint32_t __digits, char* const __result);
+void __append_nine_digits(uint32_t __digits, char* const __result);
+
+[[nodiscard]] to_chars_result __d2fixed_buffered_n(char* _First, char* const _Last, const double __d, const uint32_t __precision);
+[[nodiscard]] to_chars_result __d2exp_buffered_n(char* _First, char* const _Last, const double __d, uint32_t __precision);
+
+_LIBCPP_END_NAMESPACE_STD
+
+// clang-format on
+
+#endif // _LIBCPP_SRC_INCLUDE_RYU_D2FIXED_H
diff --git a/src/include/ryu/d2fixed_full_table.h b/src/include/ryu/d2fixed_full_table.h
new file mode 100644
index 0000000..7181cd8
--- /dev/null
+++ b/src/include/ryu/d2fixed_full_table.h
@@ -0,0 +1,4451 @@
+//===----------------------------------------------------------------------===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+
+// Copyright (c) Microsoft Corporation.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+
+// Copyright 2018 Ulf Adams
+// Copyright (c) Microsoft Corporation. All rights reserved.
+
+// Boost Software License - Version 1.0 - August 17th, 2003
+
+// Permission is hereby granted, free of charge, to any person or organization
+// obtaining a copy of the software and accompanying documentation covered by
+// this license (the "Software") to use, reproduce, display, distribute,
+// execute, and transmit the Software, and to prepare derivative works of the
+// Software, and to permit third-parties to whom the Software is furnished to
+// do so, all subject to the following:
+
+// The copyright notices in the Software and this entire statement, including
+// the above license grant, this restriction and the following disclaimer,
+// must be included in all copies of the Software, in whole or in part, and
+// all derivative works of the Software, unless such copies or derivative
+// works are solely in the form of machine-executable object code generated by
+// a source language processor.
+
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT
+// SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE
+// FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,
+// ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+// DEALINGS IN THE SOFTWARE.
+
+#ifndef _LIBCPP_SRC_INCLUDE_RYU_D2FIXED_FULL_TABLE_H
+#define _LIBCPP_SRC_INCLUDE_RYU_D2FIXED_FULL_TABLE_H
+
+// Avoid formatting to keep the changes with the original code minimal.
+// clang-format off
+
+#include "__config"
+
+_LIBCPP_BEGIN_NAMESPACE_STD
+
+inline constexpr int __TABLE_SIZE = 64;
+
+inline constexpr uint16_t __POW10_OFFSET[__TABLE_SIZE] = {
+  0, 2, 5, 8, 12, 16, 21, 26, 32, 39,
+  46, 54, 62, 71, 80, 90, 100, 111, 122, 134,
+  146, 159, 173, 187, 202, 217, 233, 249, 266, 283,
+  301, 319, 338, 357, 377, 397, 418, 440, 462, 485,
+  508, 532, 556, 581, 606, 632, 658, 685, 712, 740,
+  769, 798, 828, 858, 889, 920, 952, 984, 1017, 1050,
+  1084, 1118, 1153, 1188
+};
+
+inline constexpr uint64_t __POW10_SPLIT[1224][3] = {
+  {                    1u,    72057594037927936u,                    0u },
+  {   699646928636035157u,             72057594u,                    0u },
+  {                    1u,                    0u,                  256u },
+  { 11902091922964236229u,        4722366482869u,                    0u },
+  {  6760415703743915872u,                 4722u,                    0u },
+  {                    1u,                    0u,             16777216u },
+  { 13369850649504950658u,   309485009821345068u,                    0u },
+  { 15151142278969419334u,            309485009u,                    0u },
+  {                    1u,                    0u,          75511627776u },
+  {  4635408826454083567u,  9437866644873197963u,                 1099u },
+  { 12367138975830625353u,       20282409603651u,                    0u },
+  {  7555853734021184432u,                20282u,                    0u },
+  {                    1u,                    0u,         250037927936u },
+  {  5171444645924616995u,   699646928636035156u,             72057594u },
+  { 16672297533003297786u,  1329227995784915872u,                    0u },
+  { 14479142226848862515u,           1329227995u,                    0u },
+  {                    1u,                    0u,         181645213696u },
+  { 12214193123817091081u, 11902091922964236228u,         114366482869u },
+  { 16592893013671929435u,  6760415703743915871u,                 4722u },
+  {  4549827147718617003u,       87112285931760u,                    0u },
+  {  5274510003815168971u,                87112u,                    0u },
+  {                    1u,                    0u,          44724781056u },
+  {  9794971998307800535u, 13369850649504950657u,         209821345068u },
+  { 14720142899209240169u, 15151142278969419333u,            309485009u },
+  {  4300745446091561535u,  5708990770823839524u,                    0u },
+  { 15197156861335443364u,           5708990770u,                    0u },
+  {                    1u,                    0u,         139251286016u },
+  { 13484604155038683037u,  4635408826454083566u,          67670423947u },
+  {  8356963862052375699u, 12367138975830625352u,          58409603651u },
+  {  5850852848337610021u,  7555853734021184431u,                20282u },
+  {  2712780827214982050u,      374144419156711u,                    0u },
+  {  7732076577307618052u,               374144u,                    0u },
+  {                    1u,                    0u,          84280344576u },
+  { 17296309485351745867u,  5171444645924616994u,         160903807060u },
+  { 16598859101615853088u, 16672297533003297785u,         219784915872u },
+  {  7469952526870444257u, 14479142226848862514u,           1329227995u },
+  { 13531654022114669524u,  6073184580144670117u,                    1u },
+  { 15757609704383306943u,          24519928653u,                    0u },
+  {  9590990814237149590u,                   24u,                    0u },
+  {                    1u,                    0u,         196662132736u },
+  { 15408590707489433890u, 12214193123817091080u,          95899502532u },
+  { 18332056844289122710u, 16592893013671929434u,         240246646623u },
+  { 11114572877353986193u,  4549827147718617002u,          72285931760u },
+  {  1703393793997526525u,  5274510003815168970u,                87112u },
+  {  5082852056285196265u,     1606938044258990u,                    0u },
+  {   816434266573722365u,              1606938u,                    0u },
+  {                    1u,                    0u,         129530986496u },
+  {  5736523019264798742u,  9794971998307800534u,          69797980545u },
+  { 10129314776268243339u, 14720142899209240168u,          36233143877u },
+  { 16511595775483995364u,  4300745446091561534u,          50823839524u },
+  { 12367293405401453325u, 15197156861335443363u,           5708990770u },
+  { 16934621733248854291u, 13078571300009428617u,                    5u },
+  { 10278280417769171336u,         105312291668u,                    0u },
+  {  5760764486226151240u,                  105u,                    0u },
+  {                    1u,                    0u,         238731001856u },
+  {  4128368337188369761u, 13484604155038683036u,          72453031918u },
+  { 10240941003671005056u,  8356963862052375698u,         175317175368u },
+  { 17933378316822368251u,  5850852848337610020u,         231147060143u },
+  {  8346249813075698616u,  2712780827214982049u,         128419156711u },
+  { 15906203609160902695u,  7732076577307618051u,               374144u },
+  { 14525607416135386328u,     6901746346790563u,                    0u },
+  {  6397156777364256320u,              6901746u,                    0u },
+  {                    1u,                    0u,          34937634816u },
+  { 16798760952716600048u, 17296309485351745866u,         249899825954u },
+  {  2419982808370854967u, 16598859101615853087u,          50404946937u },
+  {  2922947087773078956u,  7469952526870444256u,         165733552434u },
+  { 15419220167069510190u, 13531654022114669523u,          77854221733u },
+  {  3452124642157173416u, 15757609704383306942u,          24519928653u },
+  {  5979700067267186899u,  9590990814237149589u,                   24u },
+  {  4913998146922579597u,         452312848583u,                    0u },
+  {  5771037749337678924u,                  452u,                    0u },
+  {                    1u,                    0u,           8835301376u },
+  {  3464734175350698519u, 15408590707489433889u,          90993782792u },
+  {  9334527711335850125u, 18332056844289122709u,         170602522202u },
+  {  7269882896518450106u, 11114572877353986192u,         202092341162u },
+  {  1372511258182263196u,  1703393793997526524u,         174275541962u },
+  {  7571228438575951046u,  5082852056285196264u,          26044258990u },
+  {  2992506536646070406u,   816434266573722364u,              1606938u },
+  {   524517896824344606u,    29642774844752946u,                    0u },
+  { 15582941400898702773u,             29642774u,                    0u },
+  {                    1u,                    0u,         214310977536u },
+  {  3846112492507251066u,  5736523019264798741u,         104549111254u },
+  { 16681117750123089487u, 10129314776268243338u,          62895095400u },
+  { 14986314536556547267u, 16511595775483995363u,         163670432318u },
+  {  2573712825027107389u, 12367293405401453324u,         137918027683u },
+  {  7504855874008324928u, 16934621733248854290u,          84557186697u },
+  {  9572138030626879787u, 10278280417769171335u,         105312291668u },
+  {  8520676959353394843u,  5760764486226151239u,                  105u },
+  { 13448984662897903496u,        1942668892225u,                    0u },
+  { 12338883700918130648u,                 1942u,                    0u },
+  {                    1u,                    0u,         156223799296u },
+  {  2517285787892561600u,  4128368337188369760u,         146555162524u },
+  {  4338831817635138103u, 10240941003671005055u,          36972170386u },
+  {  1561495325934523196u, 17933378316822368250u,         161452451108u },
+  { 12262635050079398786u,  8346249813075698615u,           3862277025u },
+  { 11144065765517284188u, 15906203609160902694u,         163787434755u },
+  {  1212260522471875711u, 14525607416135386327u,         242346790563u },
+  {  9695352922247418869u,  6397156777364256319u,              6901746u },
+  {  7227025834627242948u,   127314748520905380u,                    0u },
+  {  9609008238705447829u,            127314748u,                    0u },
+  {                    1u,                    0u,          74910662656u },
+  {  3609144142396852269u, 16798760952716600047u,          31131187530u },
+  { 11568848377382068865u,  2419982808370854966u,         224158453279u },
+  { 10068303578029323957u,  2922947087773078955u,         211835877600u },
+  { 11645070846862630231u, 15419220167069510189u,         190187140051u },
+  { 12449386705878485055u,  3452124642157173415u,         149324160190u },
+  { 15025619323517318418u,  5979700067267186898u,         199266388373u },
+  { 14996237555047131272u,  4913998146922579596u,         196312848583u },
+  { 10211005638256058413u,  5771037749337678923u,                  452u },
+  {  1014743503555840530u,        8343699359066u,                    0u },
+  { 12900897707145290678u,                 8343u,                    0u },
+  {                    1u,                    0u,          33187823616u },
+  {  4718003016239473662u,  3464734175350698518u,         149506025761u },
+  { 14865830648693666725u,  9334527711335850124u,         144394101141u },
+  { 14754517212823091778u,  7269882896518450105u,         252074403984u },
+  { 11113946551474911901u,  1372511258182263195u,         232410437116u },
+  {  1963520352638130630u,  7571228438575951045u,         252162224104u },
+  { 13342587341404964200u,  2992506536646070405u,          50028434172u },
+  {  6240392545013573291u,   524517896824344605u,          22844752946u },
+  { 14377490861349714758u, 15582941400898702772u,             29642774u },
+  {  1717863312631397839u,   546812681195752981u,                    0u },
+  {  3611005143890591770u,            546812681u,                    0u },
+  {                    1u,                    0u,          21208498176u },
+  { 13168252824351245504u,  3846112492507251065u,         138904285205u },
+  {   735883891883379688u, 16681117750123089486u,         227812409738u },
+  { 10609203866866106404u, 14986314536556547266u,          12139521251u },
+  { 12358191111890306470u,  2573712825027107388u,          18406839052u },
+  { 15229916368406413528u,  7504855874008324927u,         135518906642u },
+  {  7241424335568075942u,  9572138030626879786u,          71461906823u },
+  {  6049715868779871913u,  8520676959353394842u,          65729070919u },
+  {  2000548404719336762u, 13448984662897903495u,         150668892225u },
+  {  1410974761895205301u, 12338883700918130647u,                 1942u },
+  { 16000132467694084868u,       35835915874844u,                    0u },
+  { 16894908866816792556u,                35835u,                    0u },
+  {                    1u,                    0u,          96136462336u },
+  {   589096329272056762u,  2517285787892561599u,         127235208544u },
+  {  7097729792403256904u,  4338831817635138102u,         250084648831u },
+  {  8553736750439287020u,  1561495325934523195u,         183664758778u },
+  {  2114152625261065696u, 12262635050079398785u,          38604121015u },
+  {  9817523680007641224u, 11144065765517284187u,         215065716774u },
+  { 13047215537500048015u,  1212260522471875710u,          63525586135u },
+  { 16755544192002345880u,  9695352922247418868u,         164391777855u },
+  {  6930119832670648356u,  7227025834627242947u,          60520905380u },
+  { 14560698131901886167u,  9609008238705447828u,            127314748u },
+  { 16408020927503338035u,  2348542582773833227u,                    0u },
+  { 14274703510609809116u,           2348542582u,                    0u },
+  {                    1u,                    0u,         239195652096u },
+  { 16428432973129962470u,  3609144142396852268u,          54627148527u },
+  {  3721112279790863774u, 11568848377382068864u,         171545803830u },
+  { 18032764903259620753u, 10068303578029323956u,          45631280555u },
+  { 18058455550468776079u, 11645070846862630230u,         167674882605u },
+  { 15692090139033993190u, 12449386705878485054u,         210814540455u },
+  {   389416944300619393u, 15025619323517318417u,         140812947666u },
+  { 12009691357260487293u, 14996237555047131271u,          75553539724u },
+  { 13494259174449809900u, 10211005638256058412u,          90055009355u },
+  { 18288583400616279877u,  1014743503555840529u,         151699359066u },
+  {     7216107869057472u, 12900897707145290677u,                 8343u },
+  { 17237061291959073878u,      153914086704665u,                    0u },
+  {  1599418782488783273u,               153914u,                    0u },
+  {                    1u,                    0u,          22255763456u },
+  {  9565464987240335777u,  4718003016239473661u,         140805878294u },
+  {   857713933775880687u, 14865830648693666724u,         185799843980u },
+  {  4621617820081363356u, 14754517212823091777u,         155602488249u },
+  {  9630162611715632528u, 11113946551474911900u,         197106442651u },
+  {  9283986497984645815u,  1963520352638130629u,         133723303109u },
+  {  8981807745082630996u, 13342587341404964199u,          29338292357u },
+  { 18350140531565934622u,  6240392545013573290u,         180779405341u },
+  {  4411619033127524143u, 14377490861349714757u,          21093125556u },
+  {  1852297584111266889u,  1717863312631397838u,           9195752981u },
+  { 11746243463811666096u,  3611005143890591769u,            546812681u },
+  {  6335244004343789147u, 10086913586276986678u,                    0u },
+  {  5109502367228239844u,          10086913586u,                    0u },
+  {  1603272682579847821u,                   10u,                    0u },
+  {                    1u,                    0u,         121713852416u },
+  {  6609546910952910052u, 13168252824351245503u,          78039892345u },
+  {  3911171343112928288u,   735883891883379687u,         194575126094u },
+  {  5254510615100863555u, 10609203866866106403u,          60669938882u },
+  {  3881927570803887650u, 12358191111890306469u,          63825615420u },
+  {  6379348759607163190u, 15229916368406413527u,          42392558399u },
+  { 14595733737222406466u,  7241424335568075941u,         154327955754u },
+  { 14670223432002373542u,  6049715868779871912u,         135108449946u },
+  {  4045087795619708513u,  2000548404719336761u,         215076489095u },
+  { 12598467307137142718u,  1410974761895205300u,          28867368919u },
+  {   734704388050777108u, 16000132467694084867u,         251915874844u },
+  {  5682201693687285822u, 16894908866816792555u,                35835u },
+  { 11048712694145438788u,      661055968790248u,                    0u },
+  { 17871025777010319485u,               661055u,                    0u },
+  {                    1u,                    0u,         191031934976u },
+  { 15268761435931663695u,   589096329272056761u,          54384768703u },
+  {  5016238054648555438u,  7097729792403256903u,          59463698998u },
+  { 14236047313993899750u,  8553736750439287019u,         129114608443u },
+  {  6957759675154690848u,  2114152625261065695u,          91532209025u },
+  { 18439367135478514473u,  9817523680007641223u,         126707290971u },
+  {  8539004472540641041u, 13047215537500048014u,         244908319870u },
+  {  1908462039431738399u, 16755544192002345879u,         195375682548u },
+  {   714690453250792146u,  6930119832670648355u,         148789337027u },
+  { 13782189447673929633u, 14560698131901886166u,          11889480596u },
+  {  3584742913798803164u, 16408020927503338034u,         118773833227u },
+  {  4347581515245125291u, 14274703510609809115u,           2348542582u },
+  { 16836742268156371392u,  6429475823218628948u,                    2u },
+  { 11764082328865615308u,          43322963970u,                    0u },
+  {  5957633711383291746u,                   43u,                    0u },
+  {                    1u,                    0u,          44890587136u },
+  {  9917186842884466953u, 16428432973129962469u,         128201721900u },
+  {  4751011869809829335u,  3721112279790863773u,         180977558144u },
+  { 11068497969931435029u, 18032764903259620752u,          86978950836u },
+  { 17118056985122509954u, 18058455550468776078u,          62850669910u },
+  { 14607066080907684459u, 15692090139033993189u,          17021110334u },
+  { 11768892370493391107u,   389416944300619392u,         135651046673u },
+  {  4043396447647747170u, 12009691357260487292u,          44731525255u },
+  {  1670341095362518057u, 13494259174449809899u,          17991426092u },
+  {  3190817644167043165u, 18288583400616279876u,         181000391185u },
+  { 10425820027224322486u,     7216107869057471u,          25934422965u },
+  { 13139964660506311565u, 17237061291959073877u,          58086704665u },
+  {  2297772885416059937u,  1599418782488783272u,               153914u },
+  {  7677687919964523763u,     2839213766779714u,                    0u },
+  { 14144589152747892828u,              2839213u,                    0u },
+  {                    1u,                    0u,         253518544896u },
+  { 17069730341503660290u,  9565464987240335776u,         164046496765u },
+  { 18167423787163077107u,   857713933775880686u,          65250538404u },
+  {  3765746945827805904u,  4621617820081363355u,         156522052161u },
+  { 10241734342430761691u,  9630162611715632527u,         197503285916u },
+  { 13345717282537140784u,  9283986497984645814u,         103486904773u },
+  {  9313926784816939953u,  8981807745082630995u,         170994763111u },
+  {   550974205049535019u, 18350140531565934621u,          69239154346u },
+  {  4494692285504086222u,  4411619033127524142u,         206100413253u },
+  {  1134308559863725587u,  1852297584111266888u,          25636765134u },
+  { 17587558045116130233u, 11746243463811666095u,          54343434265u },
+  {  9817142032346161594u,  6335244004343789146u,          50276986678u },
+  {  6071944935834172568u,  5109502367228239843u,          10086913586u },
+  { 11564168293299416955u,  1603272682579847820u,                   10u },
+  { 12458266507226064437u,         186070713419u,                    0u },
+  {  1304432355328256915u,                  186u,                    0u },
+  {                    1u,                    0u,         191358304256u },
+  { 15946798815542087355u,  6609546910952910051u,         231212025023u },
+  { 12082566083831286138u,  3911171343112928287u,          35284847591u },
+  { 11449623684706196411u,  5254510615100863554u,         165210439715u },
+  { 17518743620362604446u,  3881927570803887649u,         215345825189u },
+  {  9451061563087633805u,  6379348759607163189u,         165791236311u },
+  { 13191114787623314926u, 14595733737222406465u,         168795274405u },
+  {  8367349876734474799u, 14670223432002373541u,          57219284648u },
+  {  6544253801674393507u,  4045087795619708512u,         180682964281u },
+  { 16113906253336597498u, 12598467307137142717u,           3039828404u },
+  { 10294087136797312392u,   734704388050777107u,         235308032771u },
+  {  9127173070014462803u,  5682201693687285821u,         232598951915u },
+  { 16266900839595484952u, 11048712694145438787u,          63968790248u },
+  {  3299745387370952632u, 17871025777010319484u,               661055u },
+  { 12061115182604399189u,    12194330274671844u,                    0u },
+  {  5066801222582989646u,             12194330u,                    0u },
+  {                    1u,                    0u,         185827721216u },
+  {  7568423425299591513u, 15268761435931663694u,          71271930809u },
+  { 16561505984665207377u,  5016238054648555437u,         235771737671u },
+  {  4329114621856906245u, 14236047313993899749u,         223377180907u },
+  {  1477500474861899139u,  6957759675154690847u,         135999600095u },
+  { 16891579639263969684u, 18439367135478514472u,         142462900359u },
+  {  4684451357140027420u,  8539004472540641040u,         151103457934u },
+  { 14727186580409080709u,  1908462039431738398u,          35038743447u },
+  { 15864176859687308834u,   714690453250792145u,         214747133987u },
+  {  1755486942842684438u, 13782189447673929632u,          50194329302u },
+  { 17417077516652710041u,  3584742913798803163u,         219235682866u },
+  {  4290982361913532783u,  4347581515245125290u,          84912721627u },
+  { 11826659981004351409u, 16836742268156371391u,           2637732180u },
+  {   932930645678090820u, 11764082328865615307u,          43322963970u },
+  { 12707792781328052617u,  5957633711383291745u,                   43u },
+  { 16491596426880311906u,         799167628880u,                    0u },
+  {  3092207065214166010u,                  799u,                    0u },
+  {                    1u,                    0u,         229537611776u },
+  {  8142946531605512550u,  9917186842884466952u,         157257552869u },
+  {  5328402096432654515u,  4751011869809829334u,         144600024477u },
+  {  1932004361303814512u, 11068497969931435028u,         142927971728u },
+  {  2511477647985517771u, 17118056985122509953u,         229791850638u },
+  { 17451375493324716694u, 14607066080907684458u,         128637992933u },
+  {  9489266854478998489u, 11768892370493391106u,         124219192960u },
+  {  8803053132063235169u,  4043396447647747169u,         235090549372u },
+  { 16198682197142616773u,  1670341095362518056u,          68172974571u },
+  { 13696242485403414202u,  3190817644167043164u,         191565184836u },
+  { 16409082426079859931u, 10425820027224322485u,          85712318911u },
+  { 11653410736879597610u, 13139964660506311564u,         168124562517u },
+  { 13589514120653213261u,  2297772885416059936u,          66416208296u },
+  {  8032934885905905774u,  7677687919964523762u,         173766779714u },
+  {  2753021350129449273u, 14144589152747892827u,              2839213u },
+  { 16974897459201404133u,    52374249726338269u,                    0u },
+  { 13398576176159101589u,             52374249u,                    0u },
+  {                    1u,                    0u,         160925351936u },
+  { 10284586955251725351u, 17069730341503660289u,         238984858016u },
+  {  5294476488634150891u, 18167423787163077106u,         155204141550u },
+  { 15833244538135063323u,  3765746945827805903u,         143555205531u },
+  { 10348512742273116664u, 10241734342430761690u,         182723472783u },
+  { 13658504610142595663u, 13345717282537140783u,          83504908982u },
+  { 11956362239240850266u,  9313926784816939952u,          29029868371u },
+  { 13415901703662731781u,   550974205049535018u,          46243657757u },
+  {  5161774027546852762u,  4494692285504086221u,          72061490990u },
+  { 15274384838790587711u,  1134308559863725586u,         175953423432u },
+  { 14233354597679374929u, 17587558045116130232u,          90532188335u },
+  {  4274656492162486921u,  9817142032346161593u,         227329160794u },
+  { 12040276505541795046u,  6071944935834172567u,         140626894819u },
+  { 13238307206256765457u, 11564168293299416954u,          75675363980u },
+  { 12850161204172713271u, 12458266507226064436u,         186070713419u },
+  { 17531777095001445154u,  1304432355328256914u,                  186u },
+  {  5623628114515245990u,        3432398830065u,                    0u },
+  {  7357116143579573377u,                 3432u,                    0u },
+  {                    1u,                    0u,         227864477696u },
+  {  3555734177475596582u, 15946798815542087354u,          31654997219u },
+  { 14001876724756424382u, 12082566083831286137u,          66620685343u },
+  { 18159905057231476140u, 11449623684706196410u,          33949692994u },
+  {  5585207679308509467u, 17518743620362604445u,          53512343073u },
+  { 13948697622866724672u,  9451061563087633804u,          65715091765u },
+  {  9807691927739036432u, 13191114787623314925u,         165453594945u },
+  { 15818010096140820918u,  8367349876734474798u,          96354764709u },
+  {  5629845624785010943u,  6544253801674393506u,         189873536608u },
+  {  9517635131137734707u, 16113906253336597497u,          19558043581u },
+  {   619338244618780585u, 10294087136797312391u,          61494785043u },
+  { 11632367007491958899u,  9127173070014462802u,          67881830461u },
+  { 12083314261009739916u, 16266900839595484951u,         124178879555u },
+  { 16880538609458881650u,  3299745387370952631u,         228653834364u },
+  { 17404223674486504228u, 12061115182604399188u,          26274671844u },
+  {  7089067015287185433u,  5066801222582989645u,             12194330u },
+  {  2592264228029443648u,   224945689727159819u,                    0u },
+  { 13413731084370224440u,            224945689u,                    0u },
+  {                    1u,                    0u,          78410285056u },
+  {  9323915941641553425u,  7568423425299591512u,         173897801038u },
+  { 12155831029092699564u, 16561505984665207376u,         229234681773u },
+  { 17397171276588232676u,  4329114621856906244u,          31080095461u },
+  { 11874560617553253769u,  1477500474861899138u,          40915694367u },
+  { 13444839516837727954u, 16891579639263969683u,          16253944616u },
+  { 16994416043584590671u,  4684451357140027419u,          30798362384u },
+  { 15879694502877015730u, 14727186580409080708u,         209859998750u },
+  {  4234647645735263359u, 15864176859687308833u,         160095165137u },
+  {  7978589901512919496u,  1755486942842684437u,         219944181664u },
+  {  6114237175390859894u, 17417077516652710040u,         170232614619u },
+  {  8658612872088282708u,  4290982361913532782u,         191641124522u },
+  { 10253813330683324853u, 11826659981004351408u,         203050574271u },
+  { 13289465061747830991u,   932930645678090819u,          97688890827u },
+  {  4123165538545565412u, 12707792781328052616u,          80894011233u },
+  {  7846417485927038481u, 16491596426880311905u,          31167628880u },
+  { 10562273346358018864u,  3092207065214166009u,                  799u },
+  {  2691512658346619120u,       14742040721959u,                    0u },
+  {   751187558544605998u,                14742u,                    0u },
+  {                    1u,                    0u,           8441430016u },
+  {  3757709791947931308u,  8142946531605512549u,         214288853256u },
+  {  3452755398462519465u,  5328402096432654514u,          20104734166u },
+  {  3105818720159874523u,  1932004361303814511u,         129136147476u },
+  { 16859138458894499364u,  2511477647985517770u,         106946040961u },
+  { 12271894740606233755u, 17451375493324716693u,           2514414186u },
+  {  5429638071845793701u,  9489266854478998488u,          97477214466u },
+  {   145278150038876889u,  8803053132063235168u,          40878132321u },
+  {  9050266019724932450u, 16198682197142616772u,          92742474792u },
+  { 11907016253451490866u, 13696242485403414201u,         181889538140u },
+  {  2472757296513770735u, 16409082426079859930u,         140631732661u },
+  { 10558733798178239360u, 11653410736879597609u,          32736689036u },
+  { 15917322570831255850u, 13589514120653213260u,         242435466272u },
+  { 12254334656791355238u,  8032934885905905773u,          91149241586u },
+  {  7869542424662730262u,  2753021350129449272u,         221920211035u },
+  {  1378558986933000253u, 16974897459201404132u,         233726338269u },
+  { 13521405041909411105u, 13398576176159101588u,             52374249u },
+  {  3206744593298092012u,   966134380754314586u,                    0u },
+  { 13914648122214918505u,            966134380u,                    0u },
+  {                    1u,                    0u,           1557528576u },
+  {  1235541077112082496u, 10284586955251725350u,         242287014145u },
+  { 12014985518315533846u,  5294476488634150890u,         207858321906u },
+  {  1561535086344155741u, 15833244538135063322u,         218560993999u },
+  { 12761747276316224577u, 10348512742273116663u,          47740429018u },
+  {  9745594781103966137u, 13658504610142595662u,         176648155695u },
+  { 17514238702394846785u, 11956362239240850265u,          42727277488u },
+  {  2428898913707151713u, 13415901703662731780u,         205279820330u },
+  {    71666709959904945u,  5161774027546852761u,          18828026061u },
+  {  4049380135452919193u, 15274384838790587710u,         184771591698u },
+  { 18422240861777453733u, 14233354597679374928u,         185231729592u },
+  {  2914504416394425696u,  4274656492162486920u,         151652704697u },
+  { 12721377795748989418u, 12040276505541795045u,         122717650071u },
+  {  2626074459217717422u, 13238307206256765456u,          52696608634u },
+  {  4261529925046307655u, 12850161204172713270u,         146950399540u },
+  { 11536038685430305586u, 17531777095001445153u,         241304857490u },
+  { 12555757789435162768u,  5623628114515245989u,         104398830065u },
+  { 11905178684546080059u,  7357116143579573376u,                 3432u },
+  { 14032797718924543051u,       63316582777114u,                    0u },
+  { 10750340288005853484u,                63316u,                    0u },
+  {                    1u,                    0u,         186192756736u },
+  {  9660290106216358253u,  3555734177475596581u,         121759043258u },
+  { 14820142034615351103u, 14001876724756424381u,         186984450425u },
+  { 12674041783707777619u, 18159905057231476139u,         157302774714u },
+  { 15386686816442679994u,  5585207679308509466u,         140756160413u },
+  {  5679510383719146248u, 13948697622866724671u,         237531676044u },
+  {  1391101719248678506u,  9807691927739036431u,          46857496045u },
+  {  3364596672173710517u, 15818010096140820917u,         162305194542u },
+  { 11276509210104319732u,  5629845624785010942u,         249515952034u },
+  {  5316312656902630164u,  9517635131137734706u,         135033574393u },
+  { 17470981304473644647u,   619338244618780584u,          82630591879u },
+  {  7373293636384920591u, 11632367007491958898u,          23655037778u },
+  {  7616810902585191937u, 12083314261009739915u,         183915095831u },
+  { 12740295655921903924u, 16880538609458881649u,          84943484855u },
+  { 18366635945916526940u, 17404223674486504227u,          77384299092u },
+  {  4472171448243407067u,  7089067015287185432u,          11140526925u },
+  {   229592460858185629u,  2592264228029443647u,          25727159819u },
+  { 12749672866417114996u, 13413731084370224439u,            224945689u },
+  {  9452256722867098693u,  4149515568880992958u,                    0u },
+  { 16251451636418604634u,           4149515568u,                    0u },
+  {                    1u,                    0u,          88505450496u },
+  {  4515791283442995454u,  9323915941641553424u,          80658968920u },
+  { 13306155670047701346u, 12155831029092699563u,           4943102544u },
+  {  4456930152933417601u, 17397171276588232675u,         130643721220u },
+  {  9089157128546489637u, 11874560617553253768u,         147728846210u },
+  { 12437332180345515840u, 13444839516837727953u,          27921269139u },
+  {  3433060408790452524u, 16994416043584590670u,         132860839963u },
+  {  8275594526021936172u, 15879694502877015729u,          33229560708u },
+  {  3846512444641107689u,  4234647645735263358u,          21432520225u },
+  {  6210962618469046250u,  7978589901512919495u,         152331453461u },
+  {  7272858906616296575u,  6114237175390859893u,         110469384344u },
+  {  3710743300451225347u,  8658612872088282707u,         176555860334u },
+  {  6424677242672030600u, 10253813330683324852u,          67720423344u },
+  { 11485842256170301862u, 13289465061747830990u,         136223517251u },
+  {  7355797963557024308u,  4123165538545565411u,          97425355144u },
+  {  6358188982569427273u,  7846417485927038480u,         249572581985u },
+  { 12475094728768767402u, 10562273346358018863u,          39145907193u },
+  { 17288154837907896183u,  2691512658346619119u,         150040721959u },
+  {  2983850577727105262u,   751187558544605997u,                14742u },
+  { 13918604635001185935u,      271942652322184u,                    0u },
+  { 12033220395769876327u,               271942u,                    0u },
+  {                    1u,                    0u,         101203705856u },
+  {  5782377197813462997u,  3757709791947931307u,         178187174245u },
+  { 17732139848231399226u,  3452755398462519464u,         111168366770u },
+  {  3628839527415562921u,  3105818720159874522u,         202913935727u },
+  {  3188692267613601004u, 16859138458894499363u,         149665260746u },
+  {  5168130193478377352u, 12271894740606233754u,         216294341269u },
+  { 12556227529405091290u,  5429638071845793700u,          96007875544u },
+  { 15087090312791441192u,   145278150038876888u,         196490615904u },
+  { 10281804758610642494u,  9050266019724932449u,         185645480644u },
+  { 14238177586158586580u, 11907016253451490865u,         218134048441u },
+  {  7107927498217678128u,  2472757296513770734u,          41572390106u },
+  {  3845814658485364450u, 10558733798178239359u,          76862879785u },
+  {   714293333681725946u, 15917322570831255849u,         109664308812u },
+  { 16766172658649116982u, 12254334656791355237u,          56426608749u },
+  {   812461421432632215u,  7869542424662730261u,         228074731832u },
+  { 15218024718633799196u,  1378558986933000252u,         148732996836u },
+  {  8110797782612805146u, 13521405041909411104u,          90173837972u },
+  { 15941193964933529227u,  3206744593298092011u,         108754314586u },
+  { 14144280602323277933u, 13914648122214918504u,            966134380u },
+  { 15072402647813125245u, 17822033662586700072u,                    0u },
+  { 10822706091283369889u,          17822033662u,                    0u },
+  { 15163844593710966731u,                   17u,                    0u },
+  {                    1u,                    0u,          38066978816u },
+  {  2408529687792073670u,  1235541077112082495u,         234651333670u },
+  {  3980682212356510808u, 12014985518315533845u,          26084650986u },
+  {  4202670442792148519u,  1561535086344155740u,         247691815706u },
+  {  9419583343154651922u, 12761747276316224576u,          78528309751u },
+  { 16359166491570434575u,  9745594781103966136u,          89949448782u },
+  { 12567727056384237385u, 17514238702394846784u,           4131670873u },
+  {  2068388267923286639u,  2428898913707151712u,         153003885060u },
+  {  5689135844565021196u,    71666709959904944u,          62219517337u },
+  {  3104061965171139313u,  4049380135452919192u,          80998671678u },
+  {  7955173880156328016u, 18422240861777453732u,         136157995600u },
+  {  1445179403240833754u,  2914504416394425695u,         229689627272u },
+  { 12538201164459126715u, 12721377795748989417u,          16142359781u },
+  {  7580606719088482667u,  2626074459217717421u,          54231018000u },
+  {  8168318283218819755u,  4261529925046307654u,          33625369910u },
+  {  5249615277755961676u, 11536038685430305585u,         165680648993u },
+  {  6312997372068219831u, 12555757789435162767u,         128645381029u },
+  {  9183815417025176703u, 11905178684546080058u,          26760719488u },
+  { 10683849953373876937u, 14032797718924543050u,          84582777114u },
+  { 17175012155615667568u, 10750340288005853483u,                63316u },
+  { 18003508288378896912u,     1167984798111281u,                    0u },
+  { 14722554560950996951u,              1167984u,                    0u },
+  {                    1u,                    0u,          37523685376u },
+  { 15059324482416394930u,  9660290106216358252u,         189803401509u },
+  {  4134778595813308312u, 14820142034615351102u,         171687061181u },
+  { 16321118342639660948u, 12674041783707777618u,          26834113963u },
+  {  1523550293123468805u, 15386686816442679993u,          63307886874u },
+  {  8016371634569878509u,  5679510383719146247u,          15075411775u },
+  {  9884220139611134110u,  1391101719248678505u,         181182395151u },
+  {  7218073002727840414u,  3364596672173710516u,         254611300789u },
+  { 16062235669481359233u, 11276509210104319731u,          50288197886u },
+  { 15558048660560338002u,  5316312656902630163u,         168947103794u },
+  {  8394398745765058609u, 17470981304473644646u,         114399707048u },
+  {  5693296366442904274u,  7373293636384920590u,         139412908146u },
+  { 11783494675061161358u,  7616810902585191936u,         113690652811u },
+  { 13377293110865447894u, 12740295655921903923u,          35995657329u },
+  { 12840734051093062130u, 18366635945916526939u,          24242436899u },
+  {  7009868331566697505u,  4472171448243407066u,          63012446232u },
+  {  5019690705031194477u,   229592460858185628u,          55691161151u },
+  {  8608277240439804984u, 12749672866417114995u,         190512407863u },
+  { 12172482590657749222u,  9452256722867098692u,          48880992958u },
+  { 16613484892678771990u, 16251451636418604633u,           4149515568u },
+  {  5721488662757049244u,  2758075434182769113u,                    4u },
+  {   386931106438877039u,          76545051729u,                    0u },
+  { 10054429752182825659u,                   76u,                    0u },
+  {                    1u,                    0u,          16244801536u },
+  {  8634592106137071313u,  4515791283442995453u,         171721328144u },
+  { 12626356501369830731u, 13306155670047701345u,         227241610667u },
+  {  4803333258178976933u,  4456930152933417600u,         136492724195u },
+  { 13613083223558209297u,  9089157128546489636u,         209674229128u },
+  { 16106967997237446989u, 12437332180345515839u,          78186106577u },
+  { 14832921244380020170u,  3433060408790452523u,         177448620878u },
+  { 13774024637717231397u,  8275594526021936171u,         126208519857u },
+  {  9673012968505228885u,  3846512444641107688u,         199336696958u },
+  {  5391832334264815667u,  6210962618469046249u,         117394262471u },
+  { 16514436292632703088u,  7272858906616296574u,          83201159797u },
+  { 12025036352783454153u,  3710743300451225346u,         180348282451u },
+  {  7059867105311401050u,  6424677242672030599u,         206622648756u },
+  { 12769210631552594670u, 11485842256170301861u,         227398758606u },
+  {  8328873878884556145u,  7355797963557024307u,          16344678115u },
+  {  1016565892414238685u,  6358188982569427272u,          47676276240u },
+  {  9662978461927250281u, 12475094728768767401u,         239937192751u },
+  { 13729967277551868112u, 17288154837907896182u,          45161754863u },
+  {  6371593776693359475u,  2983850577727105261u,         136754529069u },
+  { 17617208110845643245u, 13918604635001185934u,          70652322184u },
+  { 14960960225633086797u, 12033220395769876326u,               271942u },
+  { 12090634301321662558u,     5016456510113118u,                    0u },
+  {  9409926148478635503u,              5016456u,                    0u },
+  {                    1u,                    0u,         171313463296u },
+  {  4307062684900157136u,  5782377197813462996u,         168961261227u },
+  { 15300759383869911853u, 17732139848231399225u,         218196719784u },
+  { 16007534237643445447u,  3628839527415562920u,          35172859354u },
+  {  7138502295759677634u,  3188692267613601003u,         154280164899u },
+  {  8218537071653683708u,  5168130193478377351u,         164680674458u },
+  {  2254219416760329296u, 12556227529405091289u,         216817872804u },
+  {  3057410459568460683u, 15087090312791441191u,          97557377752u },
+  {  8217810929938874370u, 10281804758610642493u,          49771853153u },
+  { 11741126472498340929u, 14238177586158586579u,         238385321521u },
+  {  1175325363726654805u,  7107927498217678127u,         127208482030u },
+  {  9428843070696730900u,  3845814658485364449u,          41038721919u },
+  { 12662500978715131896u,   714293333681725945u,         101908896041u },
+  {  6443045597035184564u, 16766172658649116981u,          21044043621u },
+  {  1921385512639171183u,   812461421432632214u,          60824970773u },
+  { 10469475094355551399u, 15218024718633799195u,          32439687228u },
+  { 14679174489076953574u,  8110797782612805145u,         235864173856u },
+  { 11853074234719825644u, 15941193964933529226u,         104766762987u },
+  {  8270896886596139124u, 14144280602323277932u,          40817076584u },
+  { 16532667046659118126u, 15072402647813125244u,         254586700072u },
+  {   148341279888833483u, 10822706091283369888u,          17822033662u },
+  { 10364629296397276041u, 15163844593710966730u,                   17u },
+  { 14265682585545771671u,         328758493846u,                    0u },
+  { 13991741872911347878u,                  328u,                    0u },
+  {                    1u,                    0u,          63130566656u },
+  { 14029045786848724433u,  2408529687792073669u,          21215793215u },
+  {  4005878521026842341u,  3980682212356510807u,          92227827221u },
+  {  3428326338640386488u,  4202670442792148518u,          64510636636u },
+  {  1010001558294829380u,  9419583343154651921u,         184886832192u },
+  {  2012063724327403418u, 16359166491570434574u,          64681297848u },
+  { 10997154538851372612u, 12567727056384237384u,          96112127552u },
+  {  1917749645489607898u,  2068388267923286638u,         176308408672u },
+  {  9763872523711218805u,  5689135844565021195u,         152168271536u },
+  { 15875699078454059311u,  3104061965171139312u,         164431250840u },
+  { 10966529452671276106u,  7955173880156328015u,          95078343332u },
+  { 18073244132105736913u,  1445179403240833753u,         233679697247u },
+  {  4435241176994913173u, 12538201164459126714u,         173410945513u },
+  {  5464400086219074323u,  7580606719088482666u,          70442805421u },
+  {  2445909179323258812u,  8168318283218819754u,          49284582214u },
+  {   873962058644121211u,  5249615277755961675u,         143342228273u },
+  { 16675872194112650857u,  6312997372068219830u,          58497855631u },
+  { 10680102689274800355u,  9183815417025176702u,          74579172666u },
+  {  2370498083108897524u, 10683849953373876936u,          43931059274u },
+  { 15354400521451334666u, 17175012155615667567u,          49975972139u },
+  {   259991949657381021u, 18003508288378896911u,         112798111281u },
+  { 10335286558772966917u, 14722554560950996950u,              1167984u },
+  { 16337526653906757263u,    21545516652742137u,                    0u },
+  { 12040967163702784894u,             21545516u,                    0u },
+  {                    1u,                    0u,         108816367616u },
+  {  3373309160242342187u, 15059324482416394929u,          62224146796u },
+  { 13639841054510584221u,  4134778595813308311u,          82884769598u },
+  { 15898855427739708031u, 16321118342639660947u,         185082591826u },
+  {  4544387940067005419u,  1523550293123468804u,           7434568377u },
+  {  5281598644835398575u,  8016371634569878508u,         105535824647u },
+  { 13675642405083408835u,  9884220139611134109u,         180391292521u },
+  {  3973392623768015721u,  7218073002727840413u,         243870735540u },
+  {  4491285101509114191u, 16062235669481359232u,          19843403507u },
+  { 15002304272810270500u, 15558048660560338001u,         102455061267u },
+  { 17325098540619893468u,  8394398745765058608u,          14308634214u },
+  {  1137212864974584822u,  5693296366442904273u,            638784526u },
+  {  2619406097224859078u, 11783494675061161357u,          51725184512u },
+  {  8281347529729293732u, 13377293110865447893u,          91696097587u },
+  { 11344719666795450104u, 12840734051093062129u,         218380005723u },
+  { 17283870506679425783u,  7009868331566697504u,         156272117978u },
+  { 11054210518010603775u,  5019690705031194476u,         115466655644u },
+  {  6399455551799092885u,  8608277240439804983u,          68659871603u },
+  { 12930529916573967170u, 12172482590657749221u,          89900618820u },
+  { 14550097052337552404u, 16613484892678771989u,         217310162521u },
+  { 12487632712206414748u,  5721488662757049243u,          81020975577u },
+  {  5791017277843595715u,   386931106438877038u,          76545051729u },
+  { 10227264183449036113u, 10054429752182825658u,                   76u },
+  {  2006055278511721441u,        1412006979354u,                    0u },
+  {   128746359043876333u,                 1412u,                    0u },
+  {                    1u,                    0u,         253468082176u },
+  {  7408146306870995754u,  8634592106137071312u,          97684476157u },
+  {  8299024588195267962u, 12626356501369830730u,         128260389217u },
+  {  1497052939192040881u,  4803333258178976932u,          36737966720u },
+  { 16771714264265803747u, 13613083223558209296u,          63873160484u },
+  {   142988846654429432u, 16106967997237446988u,          43804094271u },
+  { 11839838367716104145u, 14832921244380020169u,          43746691371u },
+  {  6019646776647679765u, 13774024637717231396u,         232524375083u },
+  {  4611972391702034948u,  9673012968505228884u,         233292291816u },
+  { 16447182322205429545u,  5391832334264815666u,         126895249385u },
+  {  2113477168726764245u, 16514436292632703087u,           2651878526u },
+  {  3536261187802311516u, 12025036352783454152u,         135382716162u },
+  { 18444381860986709854u,  7059867105311401049u,         165692220295u },
+  {  4734315730275909838u, 12769210631552594669u,          51451509157u },
+  {  9974936316849658174u,  8328873878884556144u,          72055108147u },
+  { 11864423681540657642u,  1016565892414238684u,         169523831112u },
+  {  8207245621417902667u,  9662978461927250280u,         118744303017u },
+  {  7992526918695295028u, 13729967277551868111u,         237345404790u },
+  {  8679354522130259987u,  6371593776693359474u,         142955030765u },
+  {  6065763799692166461u, 17617208110845643244u,         102811035278u },
+  { 18143341109049024976u, 14960960225633086796u,          94655434598u },
+  { 15242492331283350570u, 12090634301321662557u,         136510113118u },
+  {  9986352353182266963u,  9409926148478635502u,              5016456u },
+  { 17340463289911536077u,    92537289398950870u,                    0u },
+  {  7359344614214233035u,             92537289u,                    0u },
+  {                    1u,                    0u,         212233486336u },
+  {   419091135888749535u,  4307062684900157135u,          57829455828u },
+  {  1073142712661309790u, 15300759383869911852u,         168867770169u },
+  { 11076438902195672286u, 16007534237643445446u,         235386978984u },
+  {  1820390940081322073u,  7138502295759677633u,         135445527787u },
+  { 18417808973944523597u,  8218537071653683707u,         217122201479u },
+  { 10251294197731582957u,  2254219416760329295u,          39165742553u },
+  {  1502394029870156428u,  3057410459568460682u,          61445488423u },
+  {   321014853559106075u,  8217810929938874369u,         211636487741u },
+  {  2390953058510591778u, 11741126472498340928u,          47063714515u },
+  { 10685224265907994087u,  1175325363726654804u,         225511138607u },
+  {  5967405799190505023u,  9428843070696730899u,         249686435553u },
+  { 11210723659228214761u, 12662500978715131895u,          53349278201u },
+  { 12327123641078462773u,  6443045597035184563u,         150104158517u },
+  {  1709976940107894237u,  1921385512639171182u,          27567551382u },
+  { 16607686590938553511u, 10469475094355551398u,          25795759643u },
+  { 18332088094272679457u, 14679174489076953573u,         138642556441u },
+  {  2946170632136780882u, 11853074234719825643u,         108448366218u },
+  {  4824449494694383419u,  8270896886596139123u,         124896237676u },
+  { 17008332258693407134u, 16532667046659118125u,         160008041596u },
+  {  1773419466622750661u,   148341279888833482u,         202561867680u },
+  {  3892343466023784379u, 10364629296397276040u,         150773344202u },
+  { 12001571085575422796u, 14265682585545771670u,          72758493846u },
+  { 12933506765500977582u, 13991741872911347877u,                  328u },
+  { 11884830007749143734u,        6064523798049u,                    0u },
+  {  9662368568096205337u,                 6064u,                    0u },
+  {                    1u,                    0u,         197760516096u },
+  { 16801499925276664442u, 14029045786848724432u,          87217159109u },
+  { 10492407990787637084u,  4005878521026842340u,          38185849943u },
+  {  7673849751013230269u,  3428326338640386487u,          17054752294u },
+  {  6046724489853072367u,  1010001558294829379u,          14109074193u },
+  {  3723941391207507903u,  2012063724327403417u,          72596156942u },
+  { 16844122108860347659u, 10997154538851372611u,         110103961416u },
+  { 10622020182694668027u,  1917749645489607897u,          11529300590u },
+  {  8741198820686854862u,  9763872523711218804u,         240860623371u },
+  {  6855480461211306807u, 15875699078454059310u,          79594496752u },
+  { 10005708458011566304u, 10966529452671276105u,         217979752527u },
+  {  8932093106442919061u, 18073244132105736912u,         186240434905u },
+  {  9062763476260756743u,  4435241176994913172u,         106296225722u },
+  { 13664977682032775521u,  5464400086219074322u,         170132593002u },
+  {  1078499125430623453u,  2445909179323258811u,          75047377578u },
+  {  6554586738078431161u,   873962058644121210u,         182904000843u },
+  { 12177313698643242883u, 16675872194112650856u,         126578969526u },
+  { 16615072271904633953u, 10680102689274800354u,         200128504958u },
+  { 16375404983106569285u,  2370498083108897523u,         111832363720u },
+  { 13552251831473522729u, 15354400521451334665u,          15014094191u },
+  {  8330500218412111874u,   259991949657381020u,         214560277007u },
+  {  7044338079053294004u, 10335286558772966916u,         249885659094u },
+  {  2688849443046530184u, 16337526653906757262u,          44652742137u },
+  {   855940991879596845u, 12040967163702784893u,             21545516u },
+  {  7344363609485825662u,   397444631628981487u,                    0u },
+  { 11602660525134634992u,            397444631u,                    0u },
+  {                    1u,                    0u,         177182867456u },
+  { 16945343208344873835u,  3373309160242342186u,         151739417265u },
+  {  9617992661337889145u, 13639841054510584220u,         147861878679u },
+  { 18280344933262742088u, 15898855427739708030u,           4246351763u },
+  {  5179975582362777795u,  4544387940067005418u,         236286316036u },
+  {  1798918997870037130u,  5281598644835398574u,         157741358060u },
+  {  6327667344756325883u, 13675642405083408834u,         157215398045u },
+  { 18380327574124007701u,  3973392623768015720u,         128243473053u },
+  { 18015447557304295289u,  4491285101509114190u,          81813276544u },
+  { 10315590748073249878u, 15002304272810270499u,          48939195473u },
+  {  7697916092577993382u, 17325098540619893467u,         209061648432u },
+  {  3124132817942110723u,  1137212864974584821u,         141141998289u },
+  {  7448238998520507049u,  2619406097224859077u,         213448932749u },
+  { 13892823322374205297u,  8281347529729293731u,         241614998485u },
+  { 11042137840046332564u, 11344719666795450103u,          32936960497u },
+  { 10513966307445593804u, 17283870506679425782u,         108599249952u },
+  {  9388437460943526958u, 11054210518010603774u,          55346915180u },
+  { 10967228614677896228u,  6399455551799092884u,         229700965431u },
+  {  2310996671540235542u, 12930529916573967169u,          21788762341u },
+  {  4989110555003898587u, 14550097052337552403u,         155676955925u },
+  { 16271452421983657679u, 12487632712206414747u,         110313931675u },
+  {  9523160181437090473u,  5791017277843595714u,         186554421102u },
+  { 13137707423765072250u, 10227264183449036112u,          26108748474u },
+  { 16846859744221860705u,  2006055278511721440u,         132006979354u },
+  {  7767140033449795569u,   128746359043876332u,                 1412u },
+  { 17169456915721160017u,       26046931378436u,                    0u },
+  { 17180899661833327819u,                26046u,                    0u },
+  {                    1u,                    0u,         208401596416u },
+  { 17572520700934791416u,  7408146306870995753u,          74449891024u },
+  { 17968798858233825417u,  8299024588195267961u,         164081155402u },
+  { 15338423313945305609u,  1497052939192040880u,          16909196452u },
+  { 17895321323836726301u, 16771714264265803746u,          76007751440u },
+  {   814069333008965773u,   142988846654429431u,         201641838924u },
+  {  7200328959852723947u, 11839838367716104144u,          36326325705u },
+  {   759884557248133773u,  6019646776647679764u,          84250015524u },
+  { 13410165861863974851u,  4611972391702034947u,          50891603540u },
+  {  6278452420856351570u, 16447182322205429544u,         111114571826u },
+  {  9072115382556676442u,  2113477168726764244u,         200191701103u },
+  {  2755882551854926563u,  3536261187802311515u,          89999871944u },
+  {  8496072611504649269u, 18444381860986709853u,         237256647769u },
+  {  4122009033579215815u,  4734315730275909837u,         112540742381u },
+  { 10222217724450527221u,  9974936316849658173u,         220643171696u },
+  {  2064539481554006325u, 11864423681540657641u,         104444915676u },
+  {  7935605886598063693u,  8207245621417902666u,         207433275752u },
+  {  7805147585347548429u,  7992526918695295027u,         114470508751u },
+  {  5709020905457661273u,  8679354522130259986u,         236328825714u },
+  { 16257370307404906674u,  6065763799692166460u,          76983552492u },
+  { 14971258192939373646u, 18143341109049024975u,          93826297164u },
+  {  1133404845901376390u, 15242492331283350569u,         238541361245u },
+  {  9460827548162822047u,  9986352353182266962u,         214940028398u },
+  {  1273897659779791346u, 17340463289911536076u,         201398950870u },
+  {  7833262224435092783u,  7359344614214233034u,             92537289u },
+  {  3033420566713364587u,  1707011694817242694u,                    0u },
+  { 15075466825360349103u,           1707011694u,                    0u },
+  {                    1u,                    0u,         207022718976u },
+  {  2484134775182816690u,   419091135888749534u,          44058175183u },
+  { 18400539815335991277u,  1073142712661309789u,         198600454956u },
+  {   485494064952118286u, 11076438902195672285u,         193098683590u },
+  { 17577048805241314891u,  1820390940081322072u,         251998431425u },
+  {  2863946907557583807u, 18417808973944523596u,          79555723771u },
+  { 13045307417786230800u, 10251294197731582956u,         138081444943u },
+  { 12032088871615097766u,  1502394029870156427u,           1017402250u },
+  {  8848763446997690580u,   321014853559106074u,          64129613825u },
+  { 10031289150307672684u,  2390953058510591777u,          84579247168u },
+  { 11592215575498656563u, 10685224265907994086u,          19323493716u },
+  { 15894436747956898388u,  5967405799190505022u,         247607734547u },
+  {  2091546719588500923u, 11210723659228214760u,         179668254711u },
+  {  5863809244813756109u, 12327123641078462772u,         110092698035u },
+  { 11303008753675411245u,  1709976940107894236u,         166900304494u },
+  { 13238426537506910532u, 16607686590938553510u,         229993784486u },
+  { 17258458071023005565u, 18332088094272679456u,         235159712229u },
+  {  8385733444777075179u,  2946170632136780881u,         115261533931u },
+  {  9530757096163247300u,  4824449494694383418u,          45922023539u },
+  { 14423000845391072217u, 17008332258693407133u,         202096137261u },
+  { 10953140011159884311u,  1773419466622750660u,         136211004362u },
+  { 12228340237948264127u,  3892343466023784378u,         150650606472u },
+  { 11279134946966259189u, 12001571085575422795u,         165701126806u },
+  { 14640097792684582651u, 12933506765500977581u,          33644277925u },
+  {  6232313315128656728u, 11884830007749143733u,         176523798049u },
+  { 16136121832933322088u,  9662368568096205336u,                 6064u },
+  { 15074767079673358271u,      111870718431542u,                    0u },
+  { 13252722804829281908u,               111870u,                    0u },
+  {                    1u,                    0u,         208910811136u },
+  {  7740175894281560509u, 16801499925276664441u,         228568794576u },
+  { 15670495392425593226u, 10492407990787637083u,         183416000228u },
+  { 15152257626756992778u,  7673849751013230268u,          67327793591u },
+  {  4090073428152440422u,  6046724489853072366u,         153201875267u },
+  { 14450327772834205584u,  3723941391207507902u,          67913121689u },
+  {  4466091895542494216u, 16844122108860347658u,         217575820867u },
+  { 10454115378553795377u, 10622020182694668026u,         116473861337u },
+  {  2267817233475657788u,  8741198820686854861u,          46371636340u },
+  {  5500455702636497521u,  6855480461211306806u,          73542410542u },
+  { 15178768299492252549u, 10005708458011566303u,         208484209737u },
+  {  7062359872332045590u,  8932093106442919060u,         148491293392u },
+  { 12297347290027942576u,  9062763476260756742u,          18740779924u },
+  {  8030124596941085588u, 13664977682032775520u,         187058465554u },
+  {  6526656990996654843u,  1078499125430623452u,         122355324859u },
+  {  6254287345256979850u,  6554586738078431160u,         104660133498u },
+  {  6642007136244870032u, 12177313698643242882u,         226900704872u },
+  {  2027592955437164718u, 16615072271904633952u,         243887712482u },
+  {   942718349157325567u, 16375404983106569284u,           9734669043u },
+  { 14617066671884002278u, 13552251831473522728u,         156451597321u },
+  {  6831631114396133348u,  8330500218412111873u,           4381874332u },
+  { 14603040013386939258u,  7044338079053294003u,         142145762820u },
+  {  9906106765319401103u,  2688849443046530183u,         125046400654u },
+  {  1396179595609933063u,   855940991879596844u,         239398138749u },
+  { 11524884268464976417u,  7344363609485825661u,          23628981487u },
+  {   382929570730827274u, 11602660525134634991u,            397444631u },
+  {  6109721884461301381u,  7331559403129590068u,                    0u },
+  {  2390514825000339691u,           7331559403u,                    0u },
+  {  6116191454763441755u,                    7u,                    0u },
+  {                    1u,                    0u,          42918608896u },
+  { 11598868771099176310u, 16945343208344873834u,         156521392426u },
+  { 14449966445520085105u,  9617992661337889144u,         126990979484u },
+  { 11675595287405614726u, 18280344933262742087u,         234280807038u },
+  { 15860796398550489897u,  5179975582362777794u,         174097519594u },
+  { 16180408435245829662u,  1798918997870037129u,         194343023534u },
+  { 13756992797154950706u,  6327667344756325882u,         104996399554u },
+  {  8830551328786758466u, 18380327574124007700u,          78976619368u },
+  { 16699955256560951264u, 18015447557304295288u,          35559209294u },
+  { 10038983627153402074u, 10315590748073249877u,         219417304867u },
+  { 15085100736692127346u,  7697916092577993381u,         245169359579u },
+  { 10007783780289711125u,  3124132817942110722u,         197403769845u },
+  { 17596907048353602192u,  7448238998520507048u,         163753131461u },
+  { 13530650344896573509u, 13892823322374205296u,         247598595491u },
+  {  6337724853398437005u, 11042137840046332563u,         246569963255u },
+  { 12768885008904063297u, 10513966307445593803u,         254508948214u },
+  {  2759773619512884114u,  9388437460943526957u,         148594534654u },
+  {  8434364600126655292u, 10967228614677896227u,          65125279380u },
+  {  3843827521199949338u,  2310996671540235541u,          19270460225u },
+  {  4661660852957808994u,  4989110555003898586u,         155882077203u },
+  { 15298044134177324417u, 16271452421983657678u,         194516251547u },
+  {  7747773274913338217u,  9523160181437090472u,          80712196546u },
+  { 10348785912020632966u, 13137707423765072249u,         224913270096u },
+  {  4175372293197190170u, 16846859744221860704u,         236421057504u },
+  { 11326064156813083145u,  7767140033449795568u,           4930758124u },
+  {  8100407170505981763u, 17169456915721160016u,         190931378436u },
+  {  1706556116319916846u, 17180899661833327818u,                26046u },
+  { 15028897280749641942u,      480481077043500u,                    0u },
+  {  1421201742071739121u,               480481u,                    0u },
+  {                    1u,                    0u,          41952608256u },
+  {  8480737406125178272u, 17572520700934791415u,         121974090537u },
+  { 10947205650755620361u, 17968798858233825416u,         176831497593u },
+  {   868577942165647781u, 15338423313945305608u,         226970107312u },
+  { 16017710019091388479u, 17895321323836726300u,         247044130786u },
+  {  6610879150827623375u,   814069333008965772u,         208390330615u },
+  { 12110095866223762092u,  7200328959852723946u,          20041193424u },
+  {  7756802952949470775u,   759884557248133772u,           3726966548u },
+  {  2941800790804618759u, 13410165861863974850u,          40340355587u },
+  { 11703600274199927522u,  6278452420856351569u,         212491800360u },
+  {   806737539257940346u,  9072115382556676441u,          91149396692u },
+  { 14579028397110132023u,  2755882551854926562u,          93460573019u },
+  { 14247808875344366934u,  8496072611504649268u,         205223454557u },
+  {  9713379923695279513u,  4122009033579215814u,          61554147533u },
+  {  2246428675703313877u, 10222217724450527220u,         233111918909u },
+  {  3549783776592680620u,  2064539481554006324u,          74430190057u },
+  { 12645029747929213033u,  7935605886598063692u,          51423117898u },
+  { 16279009267476580506u,  7805147585347548428u,          18309486643u },
+  {   343358782242907186u,  5709020905457661272u,          60881313810u },
+  { 10077054739085890321u, 16257370307404906673u,         207811593532u },
+  { 10526715404712173586u, 14971258192939373645u,          41061441999u },
+  { 11438715865125144243u,  1133404845901376389u,          82512872489u },
+  {  5040916178827294801u,  9460827548162822046u,         204069058130u },
+  { 16643761637275849508u,  1273897659779791345u,         202424641996u },
+  {  4852542977279030386u,  7833262224435092782u,          70164442058u },
+  {  7883373066544387129u,  3033420566713364586u,         110817242694u },
+  { 16699064314768500978u, 15075466825360349102u,           1707011694u },
+  {  6805863634444817214u, 13042063791413317777u,                    1u },
+  {  2266540253968903500u,          31488807865u,                    0u },
+  {  9016913589137908810u,                   31u,                    0u },
+  {                    1u,                    0u,         222134665216u },
+  { 11654451024602552034u,  2484134775182816689u,          93997495262u },
+  {  5299013208454526793u, 18400539815335991276u,         221026318685u },
+  { 14918550373926182540u,   485494064952118285u,          88952853725u },
+  {  6225552657491071054u, 17577048805241314890u,          76155254872u },
+  { 10344713496596235785u,  2863946907557583806u,         236707187532u },
+  { 12972405634433280209u, 13045307417786230799u,         139652260844u },
+  { 12911885282402784945u, 12032088871615097765u,          26479692427u },
+  {  6934311832970995868u,  8848763446997690579u,          33543797274u },
+  {  9975729197003430461u, 10031289150307672683u,         230628415265u },
+  {  1982857556803548935u, 11592215575498656562u,          62861639142u },
+  {  2095735223386298223u, 15894436747956898387u,         232113382974u },
+  {  7110931538347639365u,  2091546719588500922u,          52317877736u },
+  { 15822183724630969535u,  5863809244813756108u,         220612737332u },
+  { 16931982690156327501u, 11303008753675411244u,         166717656540u },
+  {  6740069226761666110u, 13238426537506910531u,          32935582886u },
+  {  3138792961008474902u, 17258458071023005564u,          81454591520u },
+  { 12154594426971851390u,  8385733444777075178u,          58516663377u },
+  { 15780127219221910902u,  9530757096163247299u,         157781872442u },
+  { 16421541930960194381u, 14423000845391072216u,         196593770909u },
+  {  7485894627196740576u, 10953140011159884310u,         186662899652u },
+  {  8897269432694476707u, 12228340237948264126u,          75611443130u },
+  { 17189823634941678805u, 11279134946966259188u,         173793641291u },
+  {  9585582064286255216u, 14640097792684582650u,         181337854381u },
+  { 12835472279575022097u,  6232313315128656727u,          24874740917u },
+  {  6776016669542754608u, 16136121832933322087u,          54817204760u },
+  { 18340015775620871027u, 15074767079673358270u,         254718431542u },
+  {  5254188752292365830u, 13252722804829281907u,               111870u },
+  {  6798802596750151183u,     2063650512248692u,                    0u },
+  {  9449320530215272000u,              2063650u,                    0u },
+  {                    1u,                    0u,         121419595776u },
+  { 17110720482574968811u,  7740175894281560508u,          91849499257u },
+  { 16172441693558688213u, 15670495392425593225u,         188821405531u },
+  {  6234654946353717320u, 15152257626756992777u,         238221723324u },
+  { 11180283100679445438u,  4090073428152440421u,         190783353838u },
+  { 14852260031176961272u, 14450327772834205583u,          10242107326u },
+  {  4481533167346438750u,  4466091895542494215u,         250566718730u },
+  {  4269718344362365664u, 10454115378553795376u,         205122938618u },
+  { 11520029752381101466u,  2267817233475657787u,          54298180301u },
+  { 16778682550309368417u,  5500455702636497520u,         223822842678u },
+  {  9687587467301363608u, 15178768299492252548u,         148382851295u },
+  { 10093971076828497318u,  7062359872332045589u,           6666640532u },
+  {  1913763026490934696u, 12297347290027942575u,          96435313926u },
+  { 12701450127613557000u,  8030124596941085587u,         220353810784u },
+  {  8974572160711134644u,  6526656990996654842u,         184339045596u },
+  {  9890000077336694124u,  6254287345256979849u,         130360063928u },
+  {  4292326716201059148u,  6642007136244870031u,          96109916034u },
+  { 14644519175104337420u,  2027592955437164717u,          68051104864u },
+  {  5051178622270136798u,   942718349157325566u,          40792392772u },
+  {   675983118348065839u, 14617066671884002277u,           1370343464u },
+  {  4431647660065117244u,  6831631114396133347u,         179791632385u },
+  {  8316115180008411962u, 14603040013386939257u,         135537011123u },
+  {  9621158095544965602u,  9906106765319401102u,          44075687047u },
+  { 15283478958951102072u,  1396179595609933062u,         125624765228u },
+  { 13981553073094447813u, 11524884268464976416u,         239020758653u },
+  {  4558368743929911607u,   382929570730827273u,          52331208687u },
+  { 15217004469858477791u,  6109721884461301380u,         235129590068u },
+  { 11589190369996515737u,  2390514825000339690u,           7331559403u },
+  {  3670624237398152929u,  6116191454763441754u,                    7u },
+  { 13471713758418039777u,         135243399970u,                    0u },
+  {  4489936967610296411u,                  135u,                    0u },
+  {                    1u,                    0u,         106628775936u },
+  {  9052049303222747950u, 11598868771099176309u,         120783334250u },
+  {  1011330006193020538u, 14449966445520085104u,          71632935288u },
+  { 17412075644359478612u, 11675595287405614725u,         194859815495u },
+  {  6358678384745980468u, 15860796398550489896u,         137877141698u },
+  { 15262353928842850919u, 16180408435245829661u,         250745768073u },
+  { 11145257686438581736u, 13756992797154950705u,          20478705146u },
+  {  1600562031807691890u,  8830551328786758465u,         120905306388u },
+  {  6775147337046626724u, 16699955256560951263u,          85544214392u },
+  { 15772127322106297822u, 10038983627153402073u,         165817764949u },
+  {  4141472200527441474u, 15085100736692127345u,           2542523045u },
+  { 18246007807879281267u, 10007783780289711124u,         168953930242u },
+  {   960746958654787123u, 17596907048353602191u,         112733498024u },
+  { 11355981212264408477u, 13530650344896573508u,         147343568752u },
+  {  1573078209576251481u,  6337724853398437004u,         203692202643u },
+  {  6245294478780491367u, 12768885008904063296u,          45149607627u },
+  {  7523292955659721510u,  2759773619512884113u,          35457227821u },
+  { 14454736751015226505u,  8434364600126655291u,          21208374307u },
+  {  7219786377781411316u,  3843827521199949337u,         218252709141u },
+  { 10597123082209392431u,  4661660852957808993u,         206829308634u },
+  {  6922353544343010714u, 15298044134177324416u,         168420007630u },
+  { 14317523356293377430u,  7747773274913338216u,         121561008808u },
+  {  4057766168681892717u, 10348785912020632965u,          96226347385u },
+  { 15214083611901244045u,  4175372293197190169u,         240613987168u },
+  {  8390569016883950721u, 11326064156813083144u,          80439123952u },
+  { 10680472538208175055u,  8100407170505981762u,         202092512592u },
+  { 12173567833130544927u,  1706556116319916845u,          44814718154u },
+  {  1386341248286610026u, 15028897280749641941u,         225077043500u },
+  { 12487300952797237352u,  1421201742071739120u,               480481u },
+  {  2614759871804869720u,     8863311460481781u,                    0u },
+  {  8494389567327729477u,              8863311u,                    0u },
+  {                    1u,                    0u,         247459741696u },
+  {  6260469580539185878u,  8480737406125178271u,         136593449207u },
+  { 17818573101084525841u, 10947205650755620360u,           8047085704u },
+  {  2201029069927307150u,   868577942165647780u,          28868321800u },
+  { 10397997613804897039u, 16017710019091388478u,         140358376476u },
+  { 14269915965770103741u,  6610879150827623374u,         234656489612u },
+  { 16776139909196366727u, 12110095866223762091u,         140420497130u },
+  {  6246513436385199720u,  7756802952949470774u,         194159475340u },
+  {  2926026498821554288u,  2941800790804618758u,          81634453442u },
+  { 15725499391028340982u, 11703600274199927521u,          89043733329u },
+  {  8576577277771450827u,   806737539257940345u,         226790330713u },
+  { 15523351176022259335u, 14579028397110132022u,          52772375266u },
+  {  4775158829429176134u, 14247808875344366933u,         198526563380u },
+  { 10141817222123532462u,  9713379923695279512u,         244121779142u },
+  { 12847658900242624586u,  2246428675703313876u,          52192434164u },
+  { 13708197964460514655u,  3549783776592680619u,          76685488436u },
+  {  1951540006613246932u, 12645029747929213032u,          12882486860u },
+  {  9979297327280092199u, 16279009267476580505u,          88018613516u },
+  { 15381307706282553684u,   343358782242907185u,         177546278232u },
+  { 10037428657543061177u, 10077054739085890320u,          77570654385u },
+  {  2584877324547208668u, 10526715404712173585u,         133620094029u },
+  {  1126624732730703576u, 11438715865125144242u,         158273268613u },
+  {  1501064139624981020u,  5040916178827294800u,         241902260126u },
+  {  5219661484955306109u, 16643761637275849507u,          46263056881u },
+  {  5336997298570282212u,  4852542977279030385u,         106427358510u },
+  { 12191131175733833362u,  7883373066544387128u,         174905258090u },
+  {  3707068178994436536u, 16699064314768500977u,         145368946606u },
+  {  5045484691732942022u,  6805863634444817213u,         185122869393u },
+  { 14847900542908711232u,  2266540253968903499u,          31488807865u },
+  {  9097257915916965135u,  9016913589137908809u,                   31u },
+  {  2472027983230314217u,         580865979874u,                    0u },
+  { 15974509111133272205u,                  580u,                    0u },
+  {                    1u,                    0u,         177631789056u },
+  { 12099486841948187399u, 11654451024602552033u,         236287260081u },
+  {  5319910566029976328u,  5299013208454526792u,          13808736236u },
+  { 11549214421017285864u, 14918550373926182539u,          74337487885u },
+  {  1998791413186046700u,  6225552657491071053u,         190560788042u },
+  { 17075171930090011210u, 10344713496596235784u,          15703235518u },
+  { 15158296003813501474u, 12972405634433280208u,         165699954703u },
+  {  1360083178079384115u, 12911885282402784944u,         211375909797u },
+  {  6167980558592741158u,  6934311832970995867u,         107540785363u },
+  {  3630180428124865653u,  9975729197003430460u,          50107490923u },
+  {  2276550099763657677u,  1982857556803548934u,          83113610034u },
+  {   407006713016100655u,  2095735223386298222u,         186385484371u },
+  { 14242579061653496002u,  7110931538347639364u,         204857722298u },
+  { 17944493332678643704u, 15822183724630969534u,          44917884620u },
+  {   987185901870869452u, 16931982690156327500u,          67365379884u },
+  {  5578665155415167745u,  6740069226761666109u,         124170154307u },
+  {  4849210377429577536u,  3138792961008474901u,         234658901884u },
+  { 10811995403388891862u, 12154594426971851389u,         195855442410u },
+  {  7051931074990177294u, 15780127219221910901u,         216890213571u },
+  {  2030832259446664275u, 16421541930960194380u,          22405811160u },
+  {  6069512651054767896u,  7485894627196740575u,         190482321942u },
+  { 10608701253763958799u,  8897269432694476706u,         244931862206u },
+  { 15700053443426906717u, 17189823634941678804u,         250519635444u },
+  { 17759719234725541222u,  9585582064286255215u,          87695812346u },
+  { 15187321568916405210u, 12835472279575022096u,         103367328599u },
+  { 11040156458113129594u,  6776016669542754607u,         190994214247u },
+  {  2800727824598008497u, 18340015775620871026u,         115284830142u },
+  {  2997236166375604479u,  5254188752292365829u,         116368563827u },
+  {  6260091886451512841u,  6798802596750151182u,          34512248692u },
+  { 17573059315228347474u,  9449320530215271999u,              2063650u },
+  {  7519453664590169251u,    38067632857031246u,                    0u },
+  { 15809436065653866529u,             38067632u,                    0u },
+  {                    1u,                    0u,         188927574016u },
+  {   228921437623588922u, 17110720482574968810u,         137876709820u },
+  {  2195862230003073884u, 16172441693558688212u,           9337981321u },
+  {   960207412233973688u,  6234654946353717319u,         101606084361u },
+  {  2464387149230492479u, 11180283100679445437u,         143805142629u },
+  {  3631866936444955213u, 14852260031176961271u,           7242944399u },
+  {  1578304441149380227u,  4481533167346438749u,          48231461895u },
+  { 18190538519673445181u,  4269718344362365663u,          59624502064u },
+  {  1271000736479934749u, 11520029752381101465u,         112909574203u },
+  { 18292963032817745634u, 16778682550309368416u,         132525165168u },
+  { 17168014021925537455u,  9687587467301363607u,          21547195268u },
+  { 18046757712870378949u, 10093971076828497317u,         175103745301u },
+  { 14857998893911743220u,  1913763026490934695u,         147688546991u },
+  { 11933607369968684575u, 12701450127613556999u,         250486512531u },
+  {  3483798509902859162u,  8974572160711134643u,         137536137978u },
+  {  7378828438829845831u,  9890000077336694123u,         143232687497u },
+  { 15791137430347699565u,  4292326716201059147u,         173793880975u },
+  { 17044141236829932641u, 14644519175104337419u,         254273824941u },
+  {  9075651910862456484u,  5051178622270136797u,         229036645118u },
+  { 17811207355884564095u,   675983118348065838u,         227240240101u },
+  {  4438638126207305937u,  4431647660065117243u,         121450817507u },
+  { 12507972635512950185u,  8316115180008411961u,         142521564025u },
+  { 14658269128098109408u,  9621158095544965601u,           6828519054u },
+  {  3642436268910286111u, 15283478958951102071u,          32757941510u },
+  {  3783099432964819561u, 13981553073094447812u,           9247109664u },
+  {  9497579866027539638u,  4558368743929911606u,         132824915465u },
+  {  3395179445046271361u, 15217004469858477790u,         234628251268u },
+  {  5938502732309497276u, 11589190369996515736u,          90198984938u },
+  {  5793671185917606255u,  3670624237398152928u,          34730303066u },
+  {   889272970253526588u, 13471713758418039776u,         135243399970u },
+  {  8594177504370135501u,  4489936967610296410u,                  135u },
+  {  7374354721120724712u,        2494800386918u,                    0u },
+  { 14764532643665507567u,                 2494u,                    0u },
+  {                    1u,                    0u,         117490712576u },
+  {  5392404173658087695u,  9052049303222747949u,         112054824309u },
+  {  4976586473237854316u,  1011330006193020537u,         133943910512u },
+  {  6308932742419013569u, 17412075644359478611u,          40344704645u },
+  {  4831846642430703059u,  6358678384745980467u,          29827373864u },
+  { 18139507855949846901u, 15262353928842850918u,          49604185629u },
+  {  4865833876326628410u, 11145257686438581735u,          65086766641u },
+  { 14296661839130179261u,  1600562031807691889u,         223367281473u },
+  {  9254773150378118248u,  6775147337046626723u,         217855008735u },
+  { 12174712433727875143u, 15772127322106297821u,         113224509657u },
+  {   705653145340915199u,  4141472200527441473u,          20989118065u },
+  { 17763928858962481812u, 18246007807879281266u,         143052082196u },
+  {  3982836567612046296u,   960746958654787122u,          68615608975u },
+  { 12730849277561967739u, 11355981212264408476u,         140085276740u },
+  { 17314488764367235908u,  1573078209576251480u,          64338558092u },
+  { 15951418930590301119u,  6245294478780491366u,         145407838528u },
+  {  7193356087283467261u,  7523292955659721509u,          59783592849u },
+  { 17592945625696089446u, 14454736751015226504u,          25391385403u },
+  {  3554461664875361428u,  7219786377781411315u,          97574471193u },
+  {  2213779057785318208u, 10597123082209392430u,         128375261537u },
+  {  3880940796082421148u,  6922353544343010713u,         104776154496u },
+  {  4528237545358141043u, 14317523356293377429u,         133219971944u },
+  { 11681196539088147363u,  4057766168681892716u,          25824757125u },
+  {  9835005502912643017u, 15214083611901244044u,           8454853657u },
+  {  4964088126040986696u,  8390569016883950720u,          66578989576u },
+  {  3355564873147047622u, 10680472538208175054u,          45659930434u },
+  {  1853093467828272927u, 12173567833130544926u,         213075153709u },
+  { 14755341584803008677u,  1386341248286610025u,         240676937941u },
+  {  4701571132542556621u, 12487300952797237351u,         245141746416u },
+  {  6128849686644853851u,  2614759871804869719u,          79460481781u },
+  { 12026867901170202094u,  8494389567327729476u,              8863311u },
+  { 17909760324981426303u,   163499238157084246u,                    0u },
+  {  2897692901883393664u,            163499238u,                    0u },
+  {                    1u,                    0u,         159339380736u },
+  { 12323704802554838154u,  6260469580539185877u,           8965946783u },
+  {  7135886931147821732u, 17818573101084525840u,         164119318024u },
+  { 15341283120292884947u,  2201029069927307149u,          62563676580u },
+  {  3092789040392634166u, 10397997613804897038u,         206773573694u },
+  {  8811761390822097865u, 14269915965770103740u,         171909436366u },
+  { 16870860798610218169u, 16776139909196366726u,          54338624171u },
+  { 17452041453591904833u,  6246513436385199719u,           6158620214u },
+  { 10314783684009874908u,  2926026498821554287u,         225852481030u },
+  {  4932636630789274903u, 15725499391028340981u,         121464937185u },
+  { 18143884346082124480u,  8576577277771450826u,          54841522553u },
+  {  2823209155405527322u, 15523351176022259334u,          85258861878u },
+  { 16195396106620226251u,  4775158829429176133u,         152549789013u },
+  {  1150544491807648944u, 10141817222123532461u,         212696472984u },
+  {  7767455475523884824u, 12847658900242624585u,         171743122900u },
+  { 15204378045683991808u, 13708197964460514654u,         104105793195u },
+  { 17239732561718805622u,  1951540006613246931u,         153540978792u },
+  { 12886430624522800062u,  9979297327280092198u,          49833822361u },
+  { 18162250541178258136u, 15381307706282553683u,          16544130097u },
+  { 17028935366700158084u, 10037428657543061176u,          17140126480u },
+  { 16075467823964198637u,  2584877324547208667u,         178061074449u },
+  {  9803858825574498304u,  1126624732730703575u,          80081372850u },
+  { 17464070808143041817u,  1501064139624981019u,          35282958416u },
+  { 17682703471239266776u,  5219661484955306108u,         113289319203u },
+  { 18147688354161351336u,  5336997298570282211u,          56660882545u },
+  {  6663423873348080051u, 12191131175733833361u,         241200960568u },
+  {  9417270363716235133u,  3707068178994436535u,          61273516273u },
+  {  9295013721571344179u,  5045484691732942021u,          75804906301u },
+  {  6199479138350037783u, 14847900542908711231u,          73493163339u },
+  {   887603005365085688u,  9097257915916965134u,         226134008905u },
+  {   333989628642975696u,  2472027983230314216u,          68865979874u },
+  {  4620735991403939439u, 15974509111133272204u,                  580u },
+  { 12418523063962801201u,       10715086071862u,                    0u },
+  {  1587745622680169419u,                10715u,                    0u },
+  {                    1u,                    0u,         225655914496u },
+  { 10968905082284365638u, 12099486841948187398u,          72288392929u },
+  { 14076907092801977812u,  5319910566029976327u,         139626084168u },
+  {  3438322122816124202u, 11549214421017285863u,          77108354699u },
+  { 14645413324829073676u,  1998791413186046699u,           8925646925u },
+  { 12271281439492289999u, 17075171930090011209u,         208821732872u },
+  {  6233751789862708246u, 15158296003813501473u,         176073730256u },
+  {  1962644459455827991u,  1360083178079384114u,         155334366896u },
+  {  8726934184642952500u,  6167980558592741157u,          60196792475u },
+  {  4531087719737475147u,  3630180428124865652u,           6123412028u },
+  {   481513520412720775u,  2276550099763657676u,         110022063878u },
+  {   992149349835802669u,   407006713016100654u,          68772091758u },
+  { 11165474436676191361u, 14242579061653496001u,         190972772932u },
+  { 10240785855143707184u, 17944493332678643703u,          76053515454u },
+  { 10059329918238932466u,   987185901870869451u,          61302420044u },
+  { 14791716450947031886u,  5578665155415167744u,          21262876221u },
+  { 15378882314737417403u,  4849210377429577535u,         125586119445u },
+  { 14726970229242271128u, 10811995403388891861u,         117382285949u },
+  {  5090110549507128156u,  7051931074990177293u,          76110091637u },
+  { 17185220781106503841u,  2030832259446664274u,         223329028940u },
+  {  9858517691519529306u,  6069512651054767895u,         162575098847u },
+  {  5595905546638020703u, 10608701253763958798u,         212851101602u },
+  { 15555173226968030256u, 15700053443426906716u,         111962756308u },
+  { 10745236628845355771u, 17759719234725541221u,          16823306351u },
+  {  9973314042399760760u, 15187321568916405209u,          47598488080u },
+  {  4374506813558796576u, 11040156458113129593u,         114151827759u },
+  { 15960826480426749933u,  2800727824598008496u,           5162480498u },
+  {  9636454862798615738u,  2997236166375604478u,          14339360261u },
+  { 17973331528911319269u,  6260091886451512840u,          63952637454u },
+  {  7366495200039369602u, 17573059315228347473u,          78407630399u },
+  { 10505831326526933399u,  7519453664590169250u,         176857031246u },
+  {  2803218632575724145u, 15809436065653866528u,             38067632u },
+  {  8425731874431741636u,   702223880805592151u,                    0u },
+  { 14860552245711912111u,            702223880u,                    0u },
+  {                    1u,                    0u,         234012409856u },
+  {  6993664200669526994u,   228921437623588921u,         212119037930u },
+  {  4065363582031999356u,  2195862230003073883u,          71052052948u },
+  {  6899780515342669867u,   960207412233973687u,         189133594695u },
+  { 17713500890201844939u,  2464387149230492478u,         247196883901u },
+  {  6445781125105107086u,  3631866936444955212u,          93085560055u },
+  { 13563044070717478571u,  1578304441149380226u,         223986111069u },
+  { 13167612994149348885u, 18190538519673445180u,         153068901087u },
+  {  5505463469596727288u,  1271000736479934748u,          96991663513u },
+  { 12125446212518819372u, 18292963032817745633u,         151930679904u },
+  { 12537707724735421794u, 17168014021925537454u,         165978316695u },
+  { 15173675086703777069u, 18046757712870378948u,         167805453733u },
+  { 13535510174093048476u, 14857998893911743219u,           7646922151u },
+  { 10698912997087096629u, 11933607369968684574u,         179188857095u },
+  { 16952559548431933861u,  3483798509902859161u,         107400007091u },
+  { 13528255827744249993u,  7378828438829845830u,          75856039275u },
+  { 14122167436324771955u, 15791137430347699564u,          11923964747u },
+  { 13071007137740038297u, 17044141236829932640u,         221491992075u },
+  { 13011887609328904025u,  9075651910862456483u,          46965547485u },
+  {  3116434332871336590u, 17811207355884564094u,          59240619054u },
+  {  9050993820536772770u,  4438638126207305936u,          57678058555u },
+  { 11993719123438634238u, 12507972635512950184u,         225794626361u },
+  {  1414857165879849301u, 14658269128098109407u,         119197456865u },
+  { 13819438220812375094u,  3642436268910286110u,         196205082231u },
+  {  6073063033888264440u,  3783099432964819560u,          54514864836u },
+  {  6828883869150720294u,  9497579866027539637u,         222184053046u },
+  {  4548265621068768345u,  3395179445046271360u,         152321926878u },
+  { 10422524923581371874u,  5938502732309497275u,         224314075544u },
+  {  1858996082510682634u,  5793671185917606254u,         224048207584u },
+  {   890276727450878316u,   889272970253526587u,          90465891296u },
+  {  3886008133802710905u,  8594177504370135500u,         102399764570u },
+  {   612074409233016757u,  7374354721120724711u,         190800386918u },
+  {  3927020336901729264u, 14764532643665507566u,                 2494u },
+  {  5298603480094474942u,       46020944252475u,                    0u },
+  { 17418383752590430025u,                46020u,                    0u },
+  {                    1u,                    0u,          45292322816u },
+  {  8973799690601597929u,  5392404173658087694u,         121269781293u },
+  {  1343055462055792431u,  4976586473237854315u,          83342007929u },
+  { 17425118728683169659u,  6308932742419013568u,          51261934931u },
+  { 18389781726026675967u,  4831846642430703058u,         102983344691u },
+  {   272526939565961561u, 18139507855949846900u,         231263777382u },
+  { 11293026845930963228u,  4865833876326628409u,         113775023591u },
+  { 13997416438903902597u, 14296661839130179260u,         163501702257u },
+  {  6186605805999441184u,  9254773150378118247u,         221659992483u },
+  {  4401776373281836138u, 12174712433727875142u,          65038253533u },
+  { 16338917089754547008u,   705653145340915198u,         114962984513u },
+  { 13337700757935003056u, 17763928858962481811u,          50215910002u },
+  { 14612496890816348693u,  3982836567612046295u,         156690140722u },
+  {  3219935399907691719u, 12730849277561967738u,          88938620316u },
+  { 10887238730052330387u, 17314488764367235907u,         102864728152u },
+  {   360256418697768294u, 15951418930590301118u,          37389952614u },
+  {   321440824631118565u,  7193356087283467260u,         136953715493u },
+  { 10069228080701402580u, 17592945625696089445u,         243192687752u },
+  {  9428069607611622975u,  3554461664875361427u,          46120009203u },
+  { 14736799017468812344u,  2213779057785318207u,         153210386222u },
+  { 10875332567307979280u,  3880940796082421147u,         149245476249u },
+  {  4611492910339012807u,  4528237545358141042u,         108633238933u },
+  { 10743508637597314786u, 11681196539088147362u,         140533156716u },
+  {  9356196315668016028u,  9835005502912643016u,         128269103756u },
+  { 15755598617722189347u,  4964088126040986695u,         206181905536u },
+  {  1275276394173375542u,  3355564873147047621u,          30100456398u },
+  { 12644999363867216251u,  1853093467828272926u,         105799888670u },
+  {  4553830511509832021u, 14755341584803008676u,         103254872681u },
+  {  8869400642218174412u,  4701571132542556620u,          87332245607u },
+  { 16570849151159054040u,  6128849686644853850u,          68651977815u },
+  { 16127119334101797673u, 12026867901170202093u,          86970890052u },
+  {  9686867250420930550u, 17909760324981426302u,         230157084246u },
+  { 10678226869774428035u,  2897692901883393663u,            163499238u },
+  {  7767227962910162068u,  3016028602530220424u,                    0u },
+  {  9780840471948993674u,           3016028602u,                    0u },
+  {                    1u,                    0u,         213668069376u },
+  {  6288709332106746357u, 12323704802554838153u,          16386837205u },
+  {  9066785620141948673u,  7135886931147821731u,         141831652624u },
+  {  8442375916704414909u, 15341283120292884946u,          14167660429u },
+  { 11604629218100425803u,  3092789040392634165u,         188477686542u },
+  {  3877248044010875762u,  8811761390822097864u,         134914571196u },
+  { 16435137704395217283u, 16870860798610218168u,         103946077062u },
+  { 14994442577577813271u, 17452041453591904832u,         111559165543u },
+  {  4410105917142436089u, 10314783684009874907u,         245267398767u },
+  {  4632574728444936970u,  4932636630789274902u,         202983581941u },
+  {  9117147535650050359u, 18143884346082124479u,         134153046474u },
+  {   588939301256904809u,  2823209155405527321u,          69877954182u },
+  {   324393982565305683u, 16195396106620226250u,         173062371141u },
+  {  9380909186923521175u,  1150544491807648943u,          73421074605u },
+  {  4463385697777230217u,  7767455475523884823u,          94824230985u },
+  { 16378985502426333808u, 15204378045683991807u,         211934567774u },
+  { 18210894922387834354u, 17239732561718805621u,          38698574803u },
+  {  1555748035329493205u, 12886430624522800061u,          83984577574u },
+  {  4277055533891898507u, 18162250541178258135u,         184923140435u },
+  { 11574429772510874408u, 17028935366700158083u,         219871452856u },
+  { 17391099253493808815u, 16075467823964198636u,         215531468251u },
+  {  5791212393959129882u,  9803858825574498303u,          27946729175u },
+  { 11254268231455680880u, 17464070808143041816u,         124958581275u },
+  { 16355477587312235322u, 17682703471239266775u,         227983788156u },
+  {  2411485149249320633u, 18147688354161351335u,         145361224931u },
+  { 12763114642070638360u,  6663423873348080050u,         183510511249u },
+  {  1147543073987366419u,  9417270363716235132u,         197503883703u },
+  {  8410777835225272692u,  9295013721571344178u,          63336074437u },
+  {  8134725822306818018u,  6199479138350037782u,          14048117055u },
+  {  8899607004752328377u,   887603005365085687u,         232018105614u },
+  {   690976506652396830u,   333989628642975695u,         140250490600u },
+  { 12281570945595192074u,  4620735991403939438u,          54673209484u },
+  { 12592957291365552899u, 12418523063962801200u,         219086071862u },
+  { 13595807339013970272u,  1587745622680169418u,                10715u },
+  {  9698096389749839992u,      197658450495420u,                    0u },
+  {  8310173728816391804u,               197658u,                    0u },
+};
+
+inline constexpr int __TABLE_SIZE_2 = 69;
+inline constexpr int __ADDITIONAL_BITS_2 = 120;
+
+inline constexpr uint16_t __POW10_OFFSET_2[__TABLE_SIZE_2] = {
+     0,    2,    6,   12,   20,   29,   40,   52,   66,   80,
+    95,  112,  130,  150,  170,  192,  215,  240,  265,  292,
+   320,  350,  381,  413,  446,  480,  516,  552,  590,  629,
+   670,  712,  755,  799,  845,  892,  940,  989, 1040, 1092,
+  1145, 1199, 1254, 1311, 1369, 1428, 1488, 1550, 1613, 1678,
+  1743, 1810, 1878, 1947, 2017, 2088, 2161, 2235, 2311, 2387,
+  2465, 2544, 2625, 2706, 2789, 2873, 2959, 3046, 3133
+};
+
+inline constexpr uint8_t __MIN_BLOCK_2[__TABLE_SIZE_2] = {
+     0,    0,    0,    0,    0,    0,    1,    1,    2,    3,
+     3,    4,    4,    5,    5,    6,    6,    7,    7,    8,
+     8,    9,    9,   10,   11,   11,   12,   12,   13,   13,
+    14,   14,   15,   15,   16,   16,   17,   17,   18,   19,
+    19,   20,   20,   21,   21,   22,   22,   23,   23,   24,
+    24,   25,   26,   26,   27,   27,   28,   28,   29,   29,
+    30,   30,   31,   31,   32,   32,   33,   34,    0
+};
+
+inline constexpr uint64_t __POW10_SPLIT_2[3133][3] = {
+  {                    0u,                    0u,              3906250u },
+  {                    0u,                    0u,         202000000000u },
+  {                    0u, 11153727427136454656u,                   59u },
+  {                    0u,  7205759403792793600u,          59604644775u },
+  {                    0u,                    0u,         167390625000u },
+  {                    0u,                    0u,         232000000000u },
+  {                    0u,    16777216000000000u,                    0u },
+  {                    0u, 12945425605062557696u,               909494u },
+  {                    0u,  4388757836872548352u,         182701772928u },
+  {                    0u,  1152921504606846976u,         128237915039u },
+  {                    0u,                    0u,         159062500000u },
+  {                    0u,                    0u,         160000000000u },
+  {                    0u,         256000000000u,                    0u },
+  {                    0u, 16192327041775828992u,                   13u },
+  {                    0u, 15024075324038053888u,          13877787807u },
+  {                    0u,  5449091666327633920u,         159814456755u },
+  {                    0u,  2494994193563254784u,         179295395851u },
+  {                    0u,  4611686018427387904u,          11135253906u },
+  {                    0u,                    0u,         146250000000u },
+  {                    0u,                    0u,         128000000000u },
+  {                    0u,              3906250u,                    0u },
+  {                    0u,     3906250000000000u,                    0u },
+  {                    0u,  4368439412768899072u,               211758u },
+  {                    0u,  1563676642168012800u,          46236813575u },
+  {                    0u, 11532349341402398720u,           7084767080u },
+  {                    0u,  9048364970084925440u,         104625169910u },
+  {                    0u, 16609275425742389248u,         246490512847u },
+  {                    0u,                    0u,         207900390625u },
+  {                    0u,                    0u,         225000000000u },
+  { 11153727427136454656u,                   59u,                    0u },
+  {  7205759403792793600u,          59604644775u,                    0u },
+  {                    0u,  4264412554261970152u,                    3u },
+  {                    0u, 14485570586272534528u,           3231174267u },
+  {                    0u, 17827675094632103936u,         123785264354u },
+  {                    0u,  7347197909193981952u,         226966440203u },
+  {                    0u, 13677404030777688064u,          11398292396u },
+  {                    0u,  3810326759732150272u,         172741453558u },
+  {                    0u,  9943947977234055168u,         246206558227u },
+  {                    0u,                    0u,          19539062500u },
+  {                    0u,                    0u,         228000000000u },
+  { 12945425605062557696u,               909494u,                    0u },
+  {  4388757836872548352u,      909494701772928u,                    0u },
+  {  1152921504606846976u, 14878706826214591391u,                49303u },
+  {                    0u,  4387341015746028192u,         151806576313u },
+  {                    0u,   651726680428265472u,         185237838233u },
+  {                    0u,  2570638187944738816u,         153035330174u },
+  {                    0u,  7419175577111756800u,         126139354575u },
+  {                    0u, 17299322326264840192u,         207402194313u },
+  {                    0u,  7990511638862102528u,         137937798142u },
+  {                    0u, 16717361816799281152u,         254433166503u },
+  {                    0u,                    0u,         167906250000u },
+  {                    0u,                    0u,          16000000000u },
+  { 16192327041775828992u,                   13u,                    0u },
+  { 15024075324038053888u,          13877787807u,                    0u },
+  {  5449091666327633920u, 13877787807814456755u,                    0u },
+  {  2494994193563254784u,  9707857417284919307u,            752316384u },
+  {  4611686018427387904u,  1844515466944871826u,         224526264005u },
+  {                    0u, 15167599819856275072u,         197099991383u },
+  {                    0u, 14830185305589481472u,          87822237233u },
+  {                    0u,  6163721531743535104u,          49803945956u },
+  {                    0u, 14122847407012052992u,         228334136013u },
+  {                    0u,   335491783960035328u,         205765601092u },
+  {                    0u,   941252322120433664u,          68018187046u },
+  {                    0u, 11529215046068469760u,          38051025390u },
+  {                    0u,                    0u,         238625000000u },
+  {                    0u,                    0u,          64000000000u },
+  {  4368439412768899072u,               211758u,                    0u },
+  {  1563676642168012800u,      211758236813575u,                    0u },
+  { 11532349341402398720u,  8061591463141767016u,                11479u },
+  {  9048364970084925440u, 16628725344207857142u,         215437019748u },
+  { 16609275425742389248u,  3555541870038531535u,         100901445007u },
+  {                    0u, 18316647450161853665u,         143192746310u },
+  {                    0u, 16709574568378075648u,          70992947447u },
+  {                    0u,  7696022835795591168u,         247905827852u },
+  {                    0u, 16664449640376041472u,          12417202233u },
+  {                    0u,  3109186955116544000u,          57903381625u },
+  {                    0u, 10515518101817131008u,         121168549362u },
+  {                    0u,  9961962375743537152u,         242570047378u },
+  {                    0u,  9223372036854775808u,         146540039062u },
+  {                    0u,                    0u,         150500000000u },
+  { 14485570586272534528u,           3231174267u,                    0u },
+  { 17827675094632103936u,  3231174267785264354u,                    0u },
+  {  7347197909193981952u,   748977172262750475u,            175162308u },
+  { 13677404030777688064u, 15965033457315095468u,         196040602133u },
+  {  3810326759732150272u, 16809402149066729206u,          21865466197u },
+  {  9943947977234055168u,  7563769067065700371u,          85911239516u },
+  {                    0u, 13550322810840051428u,          92410032742u },
+  {                    0u,  8663209637545764864u,         102734564471u },
+  {                    0u,  8969247575312957440u,         119469633535u },
+  {                    0u,  6193172891660451840u,         255486223885u },
+  {                    0u,  3427954273864908800u,          13335732575u },
+  {                    0u, 10058367555266936832u,          95185829773u },
+  {                    0u, 13907115649320091648u,         141545265197u },
+  {                    0u,                    0u,          45753906250u },
+  {                    0u,                    0u,          74000000000u },
+  { 14878706826214591391u,                49303u,                    0u },
+  {  4387341015746028192u,       49303806576313u,                    0u },
+  {   651726680428265472u, 14106411361315920281u,                 2672u },
+  {  2570638187944738816u,  3609034283485221502u,         112764710092u },
+  {  7419175577111756800u,  9896072247338192335u,         204195646140u },
+  { 17299322326264840192u,  8889095178479228297u,         188536467151u },
+  {  7990511638862102528u,  3631796911038383102u,         207481878815u },
+  { 16717361816799281152u,   898318840772166823u,          31196880105u },
+  {                    0u, 17293677953982795024u,         233048697961u },
+  {                    0u,  7353628266884669440u,         105937492160u },
+  {                    0u,  2404693032470315008u,         192398640987u },
+  {                    0u,  9191155893041889280u,          91130358670u },
+  {                    0u,  6353946855033798656u,         142498253559u },
+  {                    0u,  3767824038248841216u,         247344448149u },
+  {                    0u,  7205759403792793600u,         149204254150u },
+  {                    0u,                    0u,         198390625000u },
+  {                    0u,                    0u,         232000000000u },
+  {  9707857417284919307u,            752316384u,                    0u },
+  {  1844515466944871826u,   752316384526264005u,                    0u },
+  { 15167599819856275072u, 17063068157692817751u,             40783152u },
+  { 14830185305589481472u,  5385330256507239985u,          48924990778u },
+  {  6163721531743535104u,  3373050282752075748u,          58291939338u },
+  { 14122847407012052992u,  4116064001262906061u,          10182853422u },
+  {   335491783960035328u, 11306582046748043076u,          46223132276u },
+  {   941252322120433664u, 17035410946089626406u,         116612931040u },
+  { 11529215046068469760u, 15618595715183448558u,         224923491477u },
+  {                    0u,  5141740092277295680u,         149846685770u },
+  {                    0u, 16973644291514990592u,          74278734288u },
+  {                    0u, 14625255268443750400u,         208920143100u },
+  {                    0u, 14021170507320131584u,         252792836676u },
+  {                    0u,  4451355232865091584u,          68760089176u },
+  {                    0u, 12891553933348044800u,          88241308450u },
+  {                    0u,  1152921504606846976u,          34698852539u },
+  {                    0u,                    0u,         187062500000u },
+  {                    0u,                    0u,         160000000000u },
+  {  8061591463141767016u,                11479u,                    0u },
+  { 16628725344207857142u,       11479437019748u,                    0u },
+  {  3555541870038531535u,  5562205901560339855u,                  622u },
+  { 18316647450161853665u,  2106077949367544134u,         110301527786u },
+  { 16709574568378075648u,  7496855998374373623u,         234114170714u },
+  {  7696022835795591168u,   229183437194837004u,          90406405378u },
+  { 16664449640376041472u,   465169186276472889u,           2012424059u },
+  {  3109186955116544000u,  2152980561625316473u,         123025216872u },
+  { 10515518101817131008u,  2059790725449340402u,         104116713310u },
+  {  9961962375743537152u, 17891190926410198930u,          94111661478u },
+  {  9223372036854775808u,  9930696175609809814u,         166969883403u },
+  {                    0u,  7276914261609005312u,          11538344118u },
+  {                    0u, 10539762974036983808u,         182394482312u },
+  {                    0u, 12851089458992250880u,         136571361695u },
+  {                    0u,  9449311677678878720u,         159696658955u },
+  {                    0u,  8699564697382289408u,          11512248212u },
+  {                    0u,  4224376450473525248u,         148471604347u },
+  {                    0u,  4611686018427387904u,         123229003906u },
+  {                    0u,                    0u,         130250000000u },
+  {                    0u,                    0u,         128000000000u },
+  {   748977172262750475u,            175162308u,                    0u },
+  { 15965033457315095468u,   175162308040602133u,                    0u },
+  { 16809402149066729206u, 13756840147955779925u,              9495567u },
+  {  7563769067065700371u, 13788447602092505948u,          15745759798u },
+  { 13550322810840051428u,  4972540435632173670u,          54747473242u },
+  {  8663209637545764864u,  2844874687533091959u,          90269561957u },
+  {  8969247575312957440u, 15377573779532804095u,         101154220965u },
+  {  6193172891660451840u, 17824715805091194381u,         165833619944u },
+  {  3427954273864908800u, 18277569135638159711u,         232966279779u },
+  { 10058367555266936832u,  4254645803379752845u,          99990829008u },
+  { 13907115649320091648u,  2933643244178200621u,         208230644811u },
+  {                    0u, 17188148801879487562u,          75159033118u },
+  {                    0u, 11069762501163246592u,          30931771413u },
+  {                    0u, 11676570643941818368u,          21600093027u },
+  {                    0u, 17840016768744030208u,          99632988162u },
+  {                    0u, 16463817321652158464u,           2967109246u },
+  {                    0u,  6954191143357644800u,         126892505325u },
+  {                    0u,  5080060379673919488u,         237376987457u },
+  {                    0u,                    0u,          65275390625u },
+  {                    0u,                    0u,         161000000000u },
+  { 14106411361315920281u,                 2672u,                    0u },
+  {  3609034283485221502u,        2672764710092u,                    0u },
+  {  9896072247338192335u, 16433563478020213436u,                  144u },
+  {  8889095178479228297u,  4194750497955655375u,         144890865261u },
+  {  3631796911038383102u,  2691539602252904735u,         109227397880u },
+  {   898318840772166823u,  3775467271962795241u,         248145908654u },
+  { 17293677953982795024u, 16980212613224918121u,         174204668490u },
+  {  7353628266884669440u,  4172857038337333440u,          74920499170u },
+  {  2404693032470315008u,  5936867627376461659u,         226226211033u },
+  {  9191155893041889280u, 17856837443266866062u,         217321838238u },
+  {  6353946855033798656u,  8956297047799810807u,         158968021097u },
+  {  3767824038248841216u, 15356974049716912789u,         105485521835u },
+  {  7205759403792793600u,  6923608913322982854u,         171832503231u },
+  {                    0u,  4855902993563955944u,         191375329591u },
+  {                    0u, 13835893222288330752u,          55263239028u },
+  {                    0u,  9114973913760137216u,         116750045274u },
+  {                    0u, 17937099003422310400u,          90494123725u },
+  {                    0u,  7007960010734960640u,         205972372085u },
+  {                    0u,  7683422439270776832u,         117379902273u },
+  {                    0u,   720575940379279360u,          65416519165u },
+  {                    0u,                    0u,         253039062500u },
+  {                    0u,                    0u,         228000000000u },
+  { 17063068157692817751u,             40783152u,                    0u },
+  {  5385330256507239985u,    40783152924990778u,                    0u },
+  {  3373050282752075748u,  2768933352715741194u,              2210859u },
+  {  4116064001262906061u, 15201941611824153390u,          43150104177u },
+  { 11306582046748043076u,  1418128541727000180u,         113824098906u },
+  { 17035410946089626406u,  5353350204565757408u,          90076876902u },
+  { 15618595715183448558u,  1721001680354286741u,         102290205696u },
+  {  5141740092277295680u,   637631411660453962u,             93295688u },
+  { 16973644291514990592u,  1630012588870568400u,          72034566068u },
+  { 14625255268443750400u,  9253063571656828156u,         180088363159u },
+  { 14021170507320131584u,  6029146854993203780u,         151501609581u },
+  {  4451355232865091584u, 16987401965352759896u,         109326840705u },
+  { 12891553933348044800u, 14499131620542087970u,         129920888905u },
+  {  1152921504606846976u,  1978417255298660539u,          73785999500u },
+  {                    0u,  5790079354402454176u,         140107250214u },
+  {                    0u, 13748918935842078720u,          38313880830u },
+  {                    0u, 18047438014740692992u,         254745330388u },
+  {                    0u,  3116889656839372800u,         212978353575u },
+  {                    0u, 15995952446606147584u,         167168966926u },
+  {                    0u, 12530140063251562496u,          14867142319u },
+  {                    0u, 16717361816799281152u,         175679260253u },
+  {                    0u,                    0u,          93906250000u },
+  {                    0u,                    0u,          16000000000u },
+  {  5562205901560339855u,                  622u,                    0u },
+  {  2106077949367544134u,         622301527786u,                    0u },
+  {  7496855998374373623u, 13558973353698967386u,                   33u },
+  {   229183437194837004u,  6228991722850501890u,          33735033418u },
+  {   465169186276472889u, 16886831391703377787u,          74337674317u },
+  {  2152980561625316473u,  1181713637872883048u,          77915436964u },
+  {  2059790725449340402u, 12393932434925221726u,         164064060824u },
+  { 17891190926410198930u, 10684799845419711910u,         152671876423u },
+  {  9930696175609809814u,  4590318792215640843u,          71579224160u },
+  {  7276914261609005312u,  6383712187366189238u,          96248841680u },
+  { 10539762974036983808u,  1904270214927675016u,         208346061731u },
+  { 12851089458992250880u,  3711506775113308575u,         163103230695u },
+  {  9449311677678878720u,  8091219444738793995u,         231201201185u },
+  {  8699564697382289408u,    39436684991068052u,          33438625885u },
+  {  4224376450473525248u, 18025182908196512891u,          93002137866u },
+  {  4611686018427387904u,  7853924592034603138u,          10977147123u },
+  {                    0u,  4815749283615688320u,         243425762105u },
+  {                    0u, 14242399906544287744u,          57261062291u },
+  {                    0u,    76242322576113664u,         147772082046u },
+  {                    0u, 10858088421377703936u,         126004133104u },
+  {                    0u, 14293835879041466368u,         240588618152u },
+  {                    0u, 12182236992037191680u,         168774870395u },
+  {                    0u, 11529215046068469760u,         123660400390u },
+  {                    0u,                    0u,           6625000000u },
+  {                    0u,                    0u,          64000000000u },
+  { 13756840147955779925u,              9495567u,                    0u },
+  { 13788447602092505948u,     9495567745759798u,                    0u },
+  {  4972540435632173670u, 14000097438505379162u,               514755u },
+  {  2844874687533091959u, 16451062686452429925u,         195758946802u },
+  { 15377573779532804095u,  4009347599785716645u,         242891813895u },
+  { 17824715805091194381u, 16544162347546196456u,           7217347168u },
+  { 18277569135638159711u, 17674258299745817187u,          96896860837u },
+  {  4254645803379752845u,  5215238411201214416u,         165958123462u },
+  {  2933643244178200621u, 14253990228345322571u,         198282718640u },
+  { 17188148801879487562u, 11214836553940194590u,         176772710358u },
+  { 11069762501163246592u, 14620711348380590101u,         214607957507u },
+  { 11676570643941818368u,  6638710787931587427u,           3792590350u },
+  { 17840016768744030208u, 17320000343692853250u,          14359885232u },
+  { 16463817321652158464u,    75147386268843646u,         176938919100u },
+  {  6954191143357644800u, 17938801582125480173u,         188004073747u },
+  {  5080060379673919488u,  6573358613626446145u,          19972464382u },
+  {                    0u,  8688505427903736481u,         254356342484u },
+  {                    0u,   539870168696556032u,         212471004823u },
+  {                    0u,  9002861336394465280u,         151029266420u },
+  {                    0u, 17989846818158018560u,         244488046090u },
+  {                    0u,  2700938287723315200u,          10975231550u },
+  {                    0u, 17800090499088908288u,          62146418157u },
+  {                    0u,  8809040871136690176u,         237964944839u },
+  {                    0u,  9223372036854775808u,         199477539062u },
+  {                    0u,                    0u,         246500000000u },
+  { 16433563478020213436u,                  144u,                    0u },
+  {  4194750497955655375u,         144890865261u,                    0u },
+  {  2691539602252904735u, 15763656745260536568u,                    7u },
+  {  3775467271962795241u,  8787336846248645550u,           7854549544u },
+  { 16980212613224918121u, 17584084447880694346u,          40476362484u },
+  {  4172857038337333440u, 18041672551129683938u,         244953235127u },
+  {  5936867627376461659u, 14025886302294509785u,         183978041028u },
+  { 17856837443266866062u, 18430498103283160734u,         196760344819u },
+  {  8956297047799810807u,  3292348826238025833u,         243999119304u },
+  { 15356974049716912789u,  9211721212658275243u,         200178478587u },
+  {  6923608913322982854u, 10233245872666307519u,         251499368407u },
+  {  4855902993563955944u,  6200995035623311671u,         215554745370u },
+  { 13835893222288330752u,  8480542380570450804u,          26336156614u },
+  {  9114973913760137216u, 11870363864499900506u,         198459731123u },
+  { 17937099003422310400u,  9301051379839581901u,         179643493714u },
+  {  7007960010734960640u, 11456694803569638005u,          82504211005u },
+  {  7683422439270776832u, 14327208890643983169u,          61621068669u },
+  {   720575940379279360u,  4510081789599866365u,         125776679550u },
+  {                    0u, 13255356976020303332u,         126244492023u },
+  {                    0u,  9658806854127314944u,         247718574341u },
+  {                    0u, 13708435528809971712u,           5523604968u },
+  {                    0u,  1580190652103131136u,         232743135779u },
+  {                    0u, 16557336970347413504u,          35085662306u },
+  {                    0u, 12751520132434493440u,          98897575035u },
+  {                    0u,  9295429630892703744u,         123691261291u },
+  {                    0u,                    0u,         107503906250u },
+  {                    0u,                    0u,         202000000000u },
+  {  2768933352715741194u,              2210859u,                    0u },
+  { 15201941611824153390u,     2210859150104177u,                    0u },
+  {  1418128541727000180u, 16872870088062921306u,               119850u },
+  {  5353350204565757408u,  5112979788807802982u,          42914680120u },
+  {  1721001680354286741u, 13742728082020150272u,          56277175189u },
+  {   637631411660453962u,  2217110934613627976u,         149744994782u },
+  {  1630012588870568400u, 11021433940188610484u,         222120189824u },
+  {  9253063571656828156u,  1713669895470733463u,         128597473131u },
+  {  6029146854993203780u,  3313382510572018285u,         107092898231u },
+  { 16987401965352759896u, 14976595232784069505u,         183179618825u },
+  { 14499131620542087970u,  7213172372862496841u,           9811882854u },
+  {  1978417255298660539u, 15836474542502248588u,         102391026857u },
+  {  5790079354402454176u,  3221099285878340134u,         169858497005u },
+  { 13748918935842078720u,  3265814602578095358u,         237174616142u },
+  { 18047438014740692992u,  6502528252282225364u,          78177040164u },
+  {  3116889656839372800u, 16392476834556790183u,          36352502762u },
+  { 15995952446606147584u, 15167629413417091342u,         234888637949u },
+  { 12530140063251562496u,  1366763272626280111u,         253822238838u },
+  { 16717361816799281152u,  8720523635169216093u,         118074092385u },
+  {                    0u,  9649171375767398672u,          97472740533u },
+  {                    0u,  7647980704001073152u,         181523082628u },
+  {                    0u, 13286434495608651776u,         132414597864u },
+  {                    0u,  4358271637167013888u,         232720259057u },
+  {                    0u, 15954987941890097152u,         241236262378u },
+  {                    0u,  7911135695429697536u,         234864921629u },
+  {                    0u,  7205759403792793600u,          29428863525u },
+  {                    0u,                    0u,          37390625000u },
+  {                    0u,                    0u,         232000000000u },
+  { 13558973353698967386u,                   33u,                    0u },
+  {  6228991722850501890u,          33735033418u,                    0u },
+  { 16886831391703377787u, 15288289344628122701u,                    1u },
+  {  1181713637872883048u,   952589339068938148u,           1828779826u },
+  { 12393932434925221726u, 10058155040190817688u,          50051639971u },
+  { 10684799845419711910u,  5322725640026584391u,         163545253677u },
+  {  4590318792215640843u,  2269982385930389600u,          45288545535u },
+  {  6383712187366189238u, 13216683679976310224u,         255123055991u },
+  {  1904270214927675016u, 17417440642083494819u,         119716477857u },
+  {  3711506775113308575u,  3029180749090900711u,         161944201349u },
+  {  8091219444738793995u,  8315443826261908513u,         133164212217u },
+  {    39436684991068052u,  1488962797247197277u,         249450781113u },
+  { 18025182908196512891u, 18009099634999034122u,         185080716834u },
+  {  7853924592034603138u,  8092455412807497971u,          34976275247u },
+  {  4815749283615688320u, 17808458047236758329u,          47438692886u },
+  { 14242399906544287744u,  3164591817527425171u,          22965398445u },
+  {    76242322576113664u,  3314036340472350590u,         173171552866u },
+  { 10858088421377703936u,    33234902404332784u,          98179654270u },
+  { 14293835879041466368u, 12349284717857274280u,         126001801667u },
+  { 12182236992037191680u, 18209607903013119355u,         195669456065u },
+  { 11529215046068469760u,  7891549145984268038u,         193987144822u },
+  {                    0u,  7703609897518594624u,         118427801736u },
+  {                    0u,  6336912652634587136u,         136417613529u },
+  {                    0u,  4461621834659397632u,         217343524723u },
+  {                    0u,  5484660635557953536u,         115241865004u },
+  {                    0u, 15142619273265938432u,          44297324048u },
+  {                    0u, 12170977992968765440u,          16820883035u },
+  {                    0u,  1152921504606846976u,          91659790039u },
+  {                    0u,                    0u,         215062500000u },
+  {                    0u,                    0u,         160000000000u },
+  { 14000097438505379162u,               514755u,                    0u },
+  { 16451062686452429925u,      514755758946802u,                    0u },
+  {  4009347599785716645u, 17812314011563521031u,                27904u },
+  { 16544162347546196456u,  7684138864490314336u,            965607477u },
+  { 17674258299745817187u,  9740522787420029605u,          53416558002u },
+  {  5215238411201214416u,  6701109407732989894u,         178528034798u },
+  { 14253990228345322571u, 16534886227502443952u,         238363267868u },
+  { 11214836553940194590u,  8908667306968317910u,          28896357978u },
+  { 14620711348380590101u,  7531472173477105155u,          90482939822u },
+  {  6638710787931587427u, 11527371604834801166u,         174408281924u },
+  { 17320000343692853250u, 15688593496691078576u,          68624900066u },
+  {    75147386268843646u, 11394944804253312188u,         226850480357u },
+  { 17938801582125480173u, 11182279880854372627u,         229617721195u },
+  {  6573358613626446145u,   150579373068361470u,         107606192607u },
+  {  8688505427903736481u,  3147220002440857300u,         223008162924u },
+  {   539870168696556032u,  3630514817795505815u,         108170611138u },
+  {  9002861336394465280u, 11708796588334233588u,         194196810602u },
+  { 17989846818158018560u, 16844495466426369546u,         106634735134u },
+  {  2700938287723315200u, 17636655472325475902u,          30913141928u },
+  { 17800090499088908288u, 17038926655686645229u,         168956085008u },
+  {  8809040871136690176u, 15602838456783529415u,          16923682064u },
+  {  9223372036854775808u, 10869815869248876790u,          16845831567u },
+  {                    0u, 18407124180939800832u,         143589253898u },
+  {                    0u,  5705018517251293184u,          10997852201u },
+  {                    0u,  9660452258743058432u,          41309269673u },
+  {                    0u,  5646292272224927744u,         169523694166u },
+  {                    0u,  7410409304047484928u,          86306086117u },
+  {                    0u,  5953758707383795712u,         229401719093u },
+  {                    0u,  4611686018427387904u,          53322753906u },
+  {                    0u,                    0u,         114250000000u },
+  {                    0u,                    0u,         128000000000u },
+  { 15763656745260536568u,                    7u,                    0u },
+  {  8787336846248645550u,           7854549544u,                    0u },
+  { 17584084447880694346u,  7854549544476362484u,                    0u },
+  { 18041672551129683938u,    15035424419724983u,            425795984u },
+  { 14025886302294509785u, 18280822466032836292u,         144000815071u },
+  { 18430498103283160734u, 11524250747302615283u,         223991005371u },
+  {  3292348826238025833u, 15212285943691810760u,         187624730884u },
+  {  9211721212658275243u,  7951804027551297019u,           4824659673u },
+  { 10233245872666307519u,  1706416229965221847u,         217431068160u },
+  {  6200995035623311671u,  3406023111930700826u,             92505009u },
+  {  8480542380570450804u, 16132696204133391302u,         177184640882u },
+  { 11870363864499900506u, 11593846688794356915u,         114874555213u },
+  {  9301051379839581901u,  6875759884161133906u,          77628503688u },
+  { 11456694803569638005u,  3593593325323835965u,         136372735690u },
+  { 14327208890643983169u,  9542049733257388925u,         202194809084u },
+  {  4510081789599866365u,  9926551925937787518u,         252517275552u },
+  { 13255356976020303332u,  3128491553219547895u,         160538119458u },
+  {  9658806854127314944u, 17158408656931354885u,          34169595866u },
+  { 13708435528809971712u,  2065169543154992616u,         218930159197u },
+  {  1580190652103131136u,  4832622393556232739u,          93111953065u },
+  { 16557336970347413504u, 16505930714733656162u,         169261976984u },
+  { 12751520132434493440u, 18270988073492888699u,         152894788296u },
+  {  9295429630892703744u,  2525111411519708523u,         200990472248u },
+  {                    0u, 16728989342518570442u,          56136886563u },
+  {                    0u,  7974052022039438336u,          35906880329u },
+  {                    0u,  5356554962386550784u,          73432274226u },
+  {                    0u,  6693869495028547584u,          50290379426u },
+  {                    0u,  8157517147199766528u,         162362875392u },
+  {                    0u, 12065776720423157760u,            442219890u },
+  {                    0u, 11997589407315001344u,         114654087066u },
+  {                    0u,                    0u,         154650390625u },
+  {                    0u,                    0u,          97000000000u },
+  { 16872870088062921306u,               119850u,                    0u },
+  {  5112979788807802982u,      119850914680120u,                    0u },
+  { 13742728082020150272u,  2418433229320326037u,                 6497u },
+  {  2217110934613627976u,  1143911773589293534u,          97131103528u },
+  { 11021433940188610484u,  9276183703610924928u,          40062011581u },
+  {  1713669895470733463u,  3532180128827684715u,         189502862926u },
+  {  3313382510572018285u,  8563997501322031543u,          78191479868u },
+  { 14976595232784069505u, 14843890409658460681u,          60464255234u },
+  {  7213172372862496841u,  9489417861634552678u,           2804688911u },
+  { 15836474542502248588u,  1113198223322322089u,          15514422373u },
+  {  3221099285878340134u, 11190777557146597869u,         101060346596u },
+  {  3265814602578095358u, 17764553645932638286u,         228606653266u },
+  {  6502528252282225364u, 14900777150991234852u,          82963018382u },
+  { 16392476834556790183u, 17364899863357893610u,         142807772747u },
+  { 15167629413417091342u, 15537570181590167037u,          75941353107u },
+  {  1366763272626280111u,  5558052627121307766u,         147842293367u },
+  {  8720523635169216093u, 12095241565795232609u,         119301302636u },
+  {  9649171375767398672u,  2187936505958366389u,         108655684359u },
+  {  7647980704001073152u, 12009203621325860228u,           7118608275u },
+  { 13286434495608651776u, 14814842834750302952u,         147651020232u },
+  {  4358271637167013888u,  5965296499605198833u,         200803114239u },
+  { 15954987941890097152u,  4051026394962148842u,         255323379371u },
+  {  7911135695429697536u, 16799526299141688349u,         171219606580u },
+  {  7205759403792793600u,  9460214166646215205u,          52910704145u },
+  {                    0u, 10750736995029068008u,          17512839237u },
+  {                    0u,  5377963045376430080u,          69582798620u },
+  {                    0u, 15996910350253424640u,          28291539960u },
+  {                    0u, 13651157529655246848u,         248867194247u },
+  {                    0u,  9771305410219737088u,         135740030732u },
+  {                    0u, 12709439623416250368u,          12529703527u },
+  {                    0u,  9943947977234055168u,         103688980102u },
+  {                    0u,                    0u,         134539062500u },
+  {                    0u,                    0u,         228000000000u },
+  {   952589339068938148u,           1828779826u,                    0u },
+  { 10058155040190817688u,  1828779826051639971u,                    0u },
+  {  5322725640026584391u,   371564423966525229u,             99138353u },
+  {  2269982385930389600u, 14464859121514339583u,          49020142547u },
+  { 13216683679976310224u,  3913119023023056247u,         211784141584u },
+  { 17417440642083494819u,  5493396321716566945u,          16212130607u },
+  {  3029180749090900711u,  5837454566818211973u,          47297797611u },
+  {  8315443826261908513u,  2886670683193253881u,         235316449046u },
+  {  1488962797247197277u,  5504823105587173817u,          22156486731u },
+  { 18009099634999034122u,  9431834277334851106u,          75298417058u },
+  {  8092455412807497971u, 12921661346456247087u,         162511300760u },
+  { 17808458047236758329u,  3643076516404724246u,         152700484665u },
+  {  3164591817527425171u, 12559396953196866477u,          57197491573u },
+  {  3314036340472350590u,  1626880974916825698u,         117680846273u },
+  {    33234902404332784u,  6806994170946429566u,         193088193394u },
+  { 12349284717857274280u,  7596631230206896579u,         114369007893u },
+  { 18209607903013119355u,  3100480253729502401u,          21411814204u },
+  {  7891549145984268038u,  6310570748781063286u,          60168077371u },
+  {  7703609897518594624u, 14251867077375744136u,          59342096725u },
+  {  6336912652634587136u,  6701165793751570137u,          85772595262u },
+  {  4461621834659397632u, 10856833140463959923u,          62363270925u },
+  {  5484660635557953536u, 15867563727561248556u,          13588550103u },
+  { 15142619273265938432u,  5048961008671491600u,         215860182353u },
+  { 12170977992968765440u, 13278183119599849051u,          81273704724u },
+  {  1152921504606846976u,  4547591784941053655u,          20719811749u },
+  {                    0u, 11815437715887182496u,         165246525444u },
+  {                    0u,   398495392178782208u,           4640516162u },
+  {                    0u,  9154841240825495552u,          66021602478u },
+  {                    0u,  1902683298245640192u,         174496284938u },
+  {                    0u,  5081900962138816512u,          10103144668u },
+  {                    0u,  3234710432358858752u,         220275490403u },
+  {                    0u, 16717361816799281152u,          99175354003u },
+  {                    0u,                    0u,         147906250000u },
+  {                    0u,                    0u,          16000000000u },
+  { 17812314011563521031u,                27904u,                    0u },
+  {  7684138864490314336u,       27904965607477u,                    0u },
+  {  9740522787420029605u, 13488568028574514610u,                 1512u },
+  {  6701109407732989894u,   275784718433886190u,         232731216738u },
+  { 16534886227502443952u, 10020568880357102364u,          98014950319u },
+  {  8908667306968317910u,  8876397213146246746u,         175543216127u },
+  {  7531472173477105155u,  2155905919114811310u,         255481190457u },
+  { 11527371604834801166u,  1087100407155601220u,          57116871894u },
+  { 15688593496691078576u,  2903498381705011170u,         214058931831u },
+  { 11394944804253312188u, 12223476257006657765u,         119157398962u },
+  { 11182279880854372627u, 12148657163736735595u,         178662635975u },
+  {   150579373068361470u,  8951241323311673823u,         199658580024u },
+  {  3147220002440857300u,  8463862715901576300u,          56485247764u },
+  {  3630514817795505815u,  3873401978748963266u,          20458826917u },
+  { 11708796588334233588u,   248364795947002730u,         165209977542u },
+  { 16844495466426369546u, 10454378025404001822u,         198013463882u },
+  { 17636655472325475902u,  6574176865628265640u,          74566732968u },
+  { 17038926655686645229u,    16703315293848336u,         168356386842u },
+  { 15602838456783529415u,  9896033222450013456u,          26000905488u },
+  { 10869815869248876790u, 17311376269334085007u,          16536465035u },
+  { 18407124180939800832u, 18378511316495639306u,         139938451587u },
+  {  5705018517251293184u, 15120796393727584297u,         131996301094u },
+  {  9660452258743058432u, 18253447805740347049u,          38819700014u },
+  {  5646292272224927744u,  5842497225601731158u,          46989521388u },
+  {  7410409304047484928u,  4369968404176723173u,         236316722409u },
+  {  5953758707383795712u, 16142207253674488117u,         233236896461u },
+  {  4611686018427387904u, 12124259227391928178u,         205875070808u },
+  {                    0u, 13019483264566077056u,          88657257409u },
+  {                    0u,    74901376448135168u,         193705787602u },
+  {                    0u, 13897060093813325824u,         210004060411u },
+  {                    0u,  4495486210810052608u,         251753361137u },
+  {                    0u, 14885496280087265280u,         241243700795u },
+  {                    0u,  4976477588244398080u,          59806944370u },
+  {                    0u, 11529215046068469760u,         114269775390u },
+  {                    0u,                    0u,          30625000000u },
+  {                    0u,                    0u,          64000000000u },
+  {    15035424419724983u,            425795984u,                    0u },
+  { 18280822466032836292u,   425795984000815071u,                    0u },
+  { 11524250747302615283u, 10043594327130472635u,             23082446u },
+  { 15212285943691810760u,  8336034337032909060u,         206544464339u },
+  {  7951804027551297019u, 16717215784895280857u,         211451897326u },
+  {  1706416229965221847u, 10968831263951212032u,         238906242083u },
+  {  3406023111930700826u,  5536629379734406065u,          35594621534u },
+  { 16132696204133391302u,  1618806894932332402u,          94300141280u },
+  { 11593846688794356915u, 11363331325254998861u,         224087755697u },
+  {  6875759884161133906u,  8775167772751754888u,         177616007425u },
+  {  3593593325323835965u,  2898202945316114122u,           1475702798u },
+  {  9542049733257388925u,  8868842714495185148u,          14157111896u },
+  {  9926551925937787518u, 17052094667531999136u,          88480780926u },
+  {  3128491553219547895u,  3658615537031138594u,         126924395904u },
+  { 17158408656931354885u, 12486952437987190746u,         128198333945u },
+  {  2065169543154992616u,   912079238520577629u,         249676919048u },
+  {  4832622393556232739u, 10960072898031888041u,           8049443914u },
+  { 16505930714733656162u,  6129550094334741912u,          74594146742u },
+  { 18270988073492888699u,  7965724516573729480u,         182332283576u },
+  {  2525111411519708523u,  5801761178810791992u,         184431822791u },
+  { 16728989342518570442u, 13197466483098446115u,         199314514103u },
+  {  7974052022039438336u, 11326268638393107273u,         183715436091u },
+  {  5356554962386550784u,  3597339351794947378u,          59613998253u },
+  {  6693869495028547584u,   353880726151383714u,         173195012157u },
+  {  8157517147199766528u, 11154818162602073600u,          61019183912u },
+  { 12065776720423157760u,  5141043976157511026u,          40604703904u },
+  { 11997589407315001344u,  7188225141808859034u,         160278696552u },
+  {                    0u, 13894168943295705185u,         104389674465u },
+  {                    0u, 12176538069834828288u,         225753204407u },
+  {                    0u,  7994239409235165184u,         183660091451u },
+  {                    0u, 13707777025480065024u,          59433368586u },
+  {                    0u, 10120227247676719104u,          10743100081u },
+  {                    0u,  7358494763030413312u,         177548618618u },
+  {                    0u,  7656119366529843200u,         122398904800u },
+  {                    0u,  9223372036854775808u,         224415039062u },
+  {                    0u,                    0u,          86500000000u },
+  {  2418433229320326037u,                 6497u,                    0u },
+  {  1143911773589293534u,        6497131103528u,                    0u },
+  {  9276183703610924928u,  3877189582299842749u,                  352u },
+  {  3532180128827684715u,  7625565791857948238u,          96210182868u },
+  {  8563997501322031543u, 16568435163612007484u,         212413382749u },
+  { 14843890409658460681u, 17592071940521808130u,          93898176669u },
+  {  9489417861634552678u, 15158637878035490831u,         157953668130u },
+  {  1113198223322322089u, 17789243229146401893u,          34821751405u },
+  { 11190777557146597869u, 14677686051252896484u,         109964356807u },
+  { 17764553645932638286u,  3531237481269211986u,         199795678955u },
+  { 14900777150991234852u,  8074435404989280910u,         235191428767u },
+  { 17364899863357893610u,  7086549341467684427u,         159437716020u },
+  { 15537570181590167037u, 10556134770918626963u,          52384162609u },
+  {  5558052627121307766u, 10772666134712966775u,          49572249212u },
+  { 12095241565795232609u,  6195173298198112620u,         124583987401u },
+  {  2187936505958366389u,  8144773843324250887u,         201335841017u },
+  { 12009203621325860228u, 14144284817150924691u,         249441529074u },
+  { 14814842834750302952u,  6464447844648863176u,         242766763216u },
+  {  5965296499605198833u, 15760468443293179135u,         208350438419u },
+  {  4051026394962148842u,  5172191224908322475u,          19854376706u },
+  { 16799526299141688349u,  2357554307308969012u,           2280385048u },
+  {  9460214166646215205u,  1602046917604361745u,          24127803275u },
+  { 10750736995029068008u,  7830970218109515845u,         139086847137u },
+  {  5377963045376430080u,  2899479134887821084u,         161424517746u },
+  { 15996910350253424640u, 15792042302392017912u,         114157181078u },
+  { 13651157529655246848u, 11286099112296056199u,         150856088328u },
+  {  9771305410219737088u, 15161477829153947404u,           8611820658u },
+  { 12709439623416250368u,   423831848142641767u,         114821905360u },
+  {  9943947977234055168u,  9707413321046312582u,         208022975970u },
+  {                    0u, 10969483299803835620u,         226526239930u },
+  {                    0u,  4326479556120930304u,         186594656881u },
+  {                    0u, 12876227232041795584u,         113234538926u },
+  {                    0u, 16967986827791171584u,         174698021676u },
+  {                    0u,  1288146316538413056u,          44919836409u },
+  {                    0u, 13715290452691779584u,         249069830551u },
+  {                    0u,  4683743612465315840u,         151743507385u },
+  {                    0u,                    0u,         185253906250u },
+  {                    0u,                    0u,          74000000000u },
+  {   371564423966525229u,             99138353u,                    0u },
+  { 14464859121514339583u,    99138353020142547u,                    0u },
+  {  3913119023023056247u, 16344805304534272784u,              5374300u },
+  {  5493396321716566945u,    26429987091348271u,          92886053671u },
+  {  5837454566818211973u,  8691371289609838059u,          39001432772u },
+  {  2886670683193253881u, 12980168378493046550u,         196471160181u },
+  {  5504823105587173817u, 14010125458129496139u,         117703656337u },
+  {  9431834277334851106u, 17061829677031795106u,         145759490422u },
+  { 12921661346456247087u,  2227928323072698520u,         118924923640u },
+  {  3643076516404724246u,  7394752319272287289u,         248120776236u },
+  { 12559396953196866477u,  8805771303577744757u,          44400870326u },
+  {  1626880974916825698u, 16371027194302248385u,         182477361818u },
+  {  6806994170946429566u,  9114324123731231602u,         154887475162u },
+  {  7596631230206896579u, 14468189808746991893u,         218494088500u },
+  {  3100480253729502401u,  2376054557800684348u,          52784322141u },
+  {  6310570748781063286u, 12462238943546048571u,          93128806175u },
+  { 14251867077375744136u, 15334855370842605909u,          31675579326u },
+  {  6701165793751570137u,  7211347914013798462u,         190831304175u },
+  { 10856833140463959923u, 13763642332572548877u,         239390927953u },
+  { 15867563727561248556u, 16868268377740071383u,          81746128545u },
+  {  5048961008671491600u,  1120013377627684177u,         161914430661u },
+  { 13278183119599849051u, 15898107650717274388u,         197060716046u },
+  {  4547591784941053655u, 12281923376333274277u,          14861838142u },
+  { 11815437715887182496u,  6383530489286615044u,          62665804400u },
+  {   398495392178782208u,  4253822060257126466u,         112346051881u },
+  {  9154841240825495552u, 17614372438391501998u,          41230600155u },
+  {  1902683298245640192u,  4309951310554333450u,         219954877043u },
+  {  5081900962138816512u, 13106185988973773020u,         115233642928u },
+  {  3234710432358858752u,  2070134359761960547u,         176710487766u },
+  { 16717361816799281152u,  9399359914137865875u,         214112222208u },
+  {                    0u, 17415053284723541264u,            509540321u },
+  {                    0u,  4840502610448261120u,         225944071930u },
+  {                    0u,  5690599259712258048u,         250262404172u },
+  {                    0u,   114769594245185536u,          76308488004u },
+  {                    0u,  3150620882578178048u,          68006221672u },
+  {                    0u,  5136918324969472000u,         104170795500u },
+  {                    0u,  7205759403792793600u,         236278472900u },
+  {                    0u,                    0u,         196390625000u },
+  {                    0u,                    0u,         232000000000u },
+  { 13488568028574514610u,                 1512u,                    0u },
+  {   275784718433886190u,        1512731216738u,                    0u },
+  { 10020568880357102364u,    98202693831717807u,                   82u },
+  {  8876397213146246746u, 12909287260170414079u,          82005323578u },
+  {  2155905919114811310u, 11728631949380786233u,          58699813864u },
+  {  1087100407155601220u, 18263701925522197718u,         232635810411u },
+  {  2903498381705011170u,  4868886449713321591u,         107990077265u },
+  { 12223476257006657765u,  5870139507184082354u,          81263942863u },
+  { 12148657163736735595u,  5978562500822661575u,         207318220900u },
+  {  8951241323311673823u, 10821136839630268472u,         100324098522u },
+  {  8463862715901576300u,  9490907630136752916u,         218586615003u },
+  {  3873401978748963266u, 10564005678001613989u,         219514503133u },
+  {   248364795947002730u,  5754050547468481222u,         221572675895u },
+  { 10454378025404001822u,  3833909949855542602u,          55311927705u },
+  {  6574176865628265640u, 15446538552665967784u,         153207836674u },
+  {    16703315293848336u, 14924837848804399130u,           2837358532u },
+  {  9896033222450013456u, 18140170340418344208u,         196809077080u },
+  { 17311376269334085007u, 11380424819825208971u,          88983380604u },
+  { 18378511316495639306u, 12416915664152252547u,         124616934065u },
+  { 15120796393727584297u, 17195282241626289958u,         177673122346u },
+  { 18253447805740347049u,  2649541045825281326u,          42932158118u },
+  {  5842497225601731158u, 16577429864268509676u,         166143631907u },
+  {  4369968404176723173u, 12051257060168107241u,          35898664273u },
+  { 16142207253674488117u,  5363884561143470797u,          81653299954u },
+  { 12124259227391928178u, 13054029903083620184u,         242290776764u },
+  { 13019483264566077056u,   566314952158634945u,         188707660379u },
+  {    74901376448135168u,  1329472079642345682u,          91030699995u },
+  { 13897060093813325824u, 15686237486658857211u,         219072070825u },
+  {  4495486210810052608u,  1069073549290598129u,         169850352638u },
+  { 14885496280087265280u,  4323599065125928507u,         254057954593u },
+  {  4976477588244398080u, 17861823329752681586u,          33234382774u },
+  { 11529215046068469760u, 17220149985412802078u,         182968291382u },
+  {                    0u,  4344934572159429184u,          54933506201u },
+  {                    0u,  2252927464837120000u,         153235539375u },
+  {                    0u, 10910018171964489728u,         175122131442u },
+  {                    0u,  3597328585515335680u,         242591433270u },
+  {                    0u,  6972808074239148032u,          54195011573u },
+  {                    0u,  2227030015734710272u,         245377996683u },
+  {                    0u,  1152921504606846976u,         139120727539u },
+  {                    0u,                    0u,         243062500000u },
+  {                    0u,                    0u,         160000000000u },
+  { 10043594327130472635u,             23082446u,                    0u },
+  {  8336034337032909060u,    23082446544464339u,                    0u },
+  { 16717215784895280857u, 17238287503805244910u,              1251301u },
+  { 10968831263951212032u,  1434575446038410275u,         229934489438u },
+  {  5536629379734406065u, 14009569747841241694u,          94077768490u },
+  {  1618806894932332402u, 14938795732275951328u,          42759460297u },
+  { 11363331325254998861u,  6687653542888983473u,         201809833739u },
+  {  8775167772751754888u,    28238723295162625u,          11362538425u },
+  {  2898202945316114122u,  4745270274832691214u,         185001530824u },
+  {  8868842714495185148u,   926478968112308824u,         200257241617u },
+  { 17052094667531999136u,  9213681606604198526u,          17050224525u },
+  {  3658615537031138594u, 13346223820579313024u,         141499474680u },
+  { 12486952437987190746u,   691642518601291257u,         248723500243u },
+  {   912079238520577629u,  1153720150033789192u,         211037494016u },
+  { 10960072898031888041u, 12089015034721780810u,             62543294u },
+  {  6129550094334741912u,  3555868702841788854u,         190655346818u },
+  {  7965724516573729480u, 11708406782758214328u,         130192764028u },
+  {  5801761178810791992u,  9417497762905343943u,         124634714003u },
+  { 13197466483098446115u, 12838336066957615287u,         147510523576u },
+  { 11326268638393107273u, 13737708142128207419u,         184695967592u },
+  {  3597339351794947378u, 11683434809834695853u,         104744722650u },
+  {   353880726151383714u,  2689114340106315837u,         218633360270u },
+  { 11154818162602073600u,  8859225263374261032u,         142145777180u },
+  {  5141043976157511026u, 15761671984578600096u,          28480259563u },
+  {  7188225141808859034u,  7087267079878005352u,         235854441950u },
+  { 13894168943295705185u,  4601291730423121377u,         222384201518u },
+  { 12176538069834828288u,  9559411037059581623u,          46249436524u },
+  {  7994239409235165184u, 12969820289641388091u,         108518216710u },
+  { 13707777025480065024u, 13628239920285957130u,           6703095366u },
+  { 10120227247676719104u,  8049893933765800625u,          70738788366u },
+  {  7358494763030413312u, 10391755948840250234u,          14436385624u },
+  {  7656119366529843200u, 14454650777462444512u,          88563338218u },
+  {  9223372036854775808u, 14244638523341127254u,         234783588188u },
+  {                    0u, 12246016810439753984u,          92772203401u },
+  {                    0u,  9382741764551081984u,         137663857901u },
+  {                    0u,  4608696190291148800u,         237508639450u },
+  {                    0u,  1696483666416369664u,         218249837921u },
+  {                    0u, 15416683541605384192u,          97091966563u },
+  {                    0u,  7683140964294066176u,          99835740089u },
+  {                    0u,  4611686018427387904u,         185416503906u },
+  {                    0u,                    0u,          98250000000u },
+  {                    0u,                    0u,         128000000000u },
+  {  3877189582299842749u,                  352u,                    0u },
+  {  7625565791857948238u,         352210182868u,                    0u },
+  { 16568435163612007484u,  1722045467931902045u,                   19u },
+  { 17592071940521808130u, 16095324008152856733u,          19093352271u },
+  { 15158637878035490831u, 15216188060094280738u,          79872529262u },
+  { 17789243229146401893u, 10793385929903030893u,         110824871207u },
+  { 14677686051252896484u, 12613277226875940039u,          39585110623u },
+  {  3531237481269211986u, 10644539625155600107u,          95683767128u },
+  {  8074435404989280910u,  6181262895644173983u,          88577041649u },
+  {  7086549341467684427u,   148914399627082292u,         241335086933u },
+  { 10556134770918626963u, 14379289774887985969u,          85008072665u },
+  { 10772666134712966775u, 11743339675582627452u,         217779502860u },
+  {  6195173298198112620u,  7841621929809463497u,          12636607719u },
+  {  8144773843324250887u, 11168944680251236601u,         231425095176u },
+  { 14144284817150924691u,  6178560202529287410u,           8605469704u },
+  {  6464447844648863176u, 13295243308201596112u,           8334940419u },
+  { 15760468443293179135u, 17040673746172470291u,           3720736583u },
+  {  5172191224908322475u, 14957442487039409922u,          71923776774u },
+  {  2357554307308969012u, 17778155426506992152u,           6810844581u },
+  {  1602046917604361745u, 14945404984219733899u,         165963755736u },
+  {  7830970218109515845u, 11590754866058681505u,         216810192027u },
+  {  2899479134887821084u,  6020790784469412466u,         155628336080u },
+  { 15792042302392017912u,  7934351824569522326u,         208326387722u },
+  { 11286099112296056199u,  5038361112172116744u,          10430122074u },
+  { 15161477829153947404u,  3305187319649924210u,          90273130103u },
+  {   423831848142641767u, 11470175511099161552u,         119179174563u },
+  {  9707413321046312582u,  7308362160352048610u,         163621799460u },
+  { 10969483299803835620u, 10666410671225576634u,          36396187106u },
+  {  4326479556120930304u,  2181639019945820785u,         226578227281u },
+  { 12876227232041795584u,  4615749499734847918u,          81118266888u },
+  { 16967986827791171584u, 14076159200958497580u,           8250220281u },
+  {  1288146316538413056u,  5470405257862074105u,         249763070119u },
+  { 13715290452691779584u,  4565741478181339543u,         167296551263u },
+  {  4683743612465315840u,  8901832997861862329u,          95247509341u },
+  {                    0u, 14190141170191714122u,          93482569333u },
+  {                    0u,  4240772322245764096u,         117769249094u },
+  {                    0u,  4422842195340951552u,          70229892728u },
+  {                    0u, 15448426386733137920u,         120239762755u },
+  {                    0u,  9203504548935630848u,          67837460872u },
+  {                    0u,  5936377627571912704u,         136498922981u },
+  {                    0u,   468374361246531584u,         229321811676u },
+  {                    0u,                    0u,         220025390625u },
+  {                    0u,                    0u,          33000000000u },
+  { 16344805304534272784u,              5374300u,                    0u },
+  {    26429987091348271u,     5374300886053671u,                    0u },
+  {  8691371289609838059u,  8020875056524075716u,               291341u },
+  { 12980168378493046550u,  1400288714762747253u,          13434812508u },
+  { 14010125458129496139u,  6136037711314764689u,          92075909803u },
+  { 17061829677031795106u, 15735488086392394102u,         171332635270u },
+  {  2227928323072698520u,  7735094782793634552u,         134853022518u },
+  {  7394752319272287289u,  7273689191766726188u,          54419320328u },
+  {  8805771303577744757u,  3410634565056431030u,           8394307481u },
+  { 16371027194302248385u,  4600927904885215898u,         153184890870u },
+  {  9114324123731231602u,  9154871331680374746u,         246249416801u },
+  { 14468189808746991893u,  6117978272461042996u,          97496286569u },
+  {  2376054557800684348u, 13116904339287496285u,         105331656266u },
+  { 12462238943546048571u,   867037205615660831u,          74711068809u },
+  { 15334855370842605909u,  1802487145191504830u,         137047002181u },
+  {  7211347914013798462u, 17242009718457409007u,          69097713023u },
+  { 13763642332572548877u, 13620802355488468049u,         127934691219u },
+  { 16868268377740071383u,  4442227880594435745u,         147738385175u },
+  {  1120013377627684177u, 17354849212854314181u,          23240813655u },
+  { 15898107650717274388u, 18202319179831567886u,          87940808260u },
+  { 12281923376333274277u, 17568634016348874558u,          68986749699u },
+  {  6383530489286615044u,  7496925598312450672u,           3952397558u },
+  {  4253822060257126466u,   601870379496813865u,         246406409151u },
+  { 17614372438391501998u, 11995106565680728027u,         191032627458u },
+  {  4309951310554333450u, 16331071694764184179u,           2650256029u },
+  { 13106185988973773020u,  9665962217000524208u,         157885309170u },
+  {  2070134359761960547u, 13682661374415474390u,         242523992861u },
+  {  9399359914137865875u,  6940361789924260864u,          29741738559u },
+  { 17415053284723541264u,  9658039831644010465u,          63376237766u },
+  {  4840502610448261120u,  6843715893910236922u,         198523563388u },
+  {  5690599259712258048u,    47089792870595660u,         124370998582u },
+  {   114769594245185536u, 14510386192097156932u,          54002552742u },
+  {  3150620882578178048u, 12059931208360040296u,         166786609611u },
+  {  5136918324969472000u, 14877013468459184620u,         203653770180u },
+  {  7205759403792793600u,  2397668560671695044u,         196806484516u },
+  {                    0u,  2195572305559232232u,          36129977873u },
+  {                    0u,  3261686279425953792u,          17119022213u },
+  {                    0u,  9333850662059900928u,         133176816367u },
+  {                    0u,  5036522340217782272u,         239505989058u },
+  {                    0u,  2800120215143186432u,         194273030423u },
+  {                    0u,   441634238459019264u,          23151794821u },
+  {                    0u,   720575940379279360u,         133023941040u },
+  {                    0u,                    0u,         176039062500u },
+  {                    0u,                    0u,         228000000000u },
+  {    98202693831717807u,                   82u,                    0u },
+  { 12909287260170414079u,          82005323578u,                    0u },
+  { 11728631949380786233u,  8218347283861607400u,                    4u },
+  { 18263701925522197718u, 17896200385973633643u,           4445517498u },
+  {  4868886449713321591u, 16333242102094352209u,         186970154966u },
+  {  5870139507184082354u,  9981905728606788815u,         214885426828u },
+  {  5978562500822661575u, 15219470018924839012u,         140541120193u },
+  { 10821136839630268472u, 17152070168529617370u,         193825049122u },
+  {  9490907630136752916u, 17841343440958328027u,          34929815586u },
+  { 10564005678001613989u, 17291078023923990493u,          34967181165u },
+  {  5754050547468481222u, 16744804581790759223u,         109937351217u },
+  {  3833909949855542602u,  5001622214111594905u,          49907737675u },
+  { 15446538552665967784u,  9676746897435398146u,          75271138483u },
+  { 14924837848804399130u,  8109025833995118532u,         179524577500u },
+  { 18140170340418344208u,  5495826424046694744u,         220439591171u },
+  { 11380424819825208971u,  7890288164365705852u,           3297929347u },
+  { 12416915664152252547u,  8616438349039895217u,         131427733378u },
+  { 17195282241626289958u, 15787154801788760618u,         130467098058u },
+  {  2649541045825281326u, 12418659311480782502u,         202855823376u },
+  { 16577429864268509676u,  4486988874116669987u,          16673216870u },
+  { 12051257060168107241u,  4828971301551875409u,         102243240154u },
+  {  5363884561143470797u, 14769106422014442226u,         218261779058u },
+  { 13054029903083620184u,  7763933466423188156u,         114800634863u },
+  {   566314952158634945u, 10449097116253839963u,         239420883676u },
+  {  1329472079642345682u, 12870692502472900571u,         220566446689u },
+  { 15686237486658857211u, 11597479481311003817u,          97697721638u },
+  {  1069073549290598129u,  8294994869530047486u,          38628700622u },
+  {  4323599065125928507u, 16879315829924478241u,         206449672572u },
+  { 17861823329752681586u, 11873324837601439670u,         124915029544u },
+  { 17220149985412802078u,  3277599055636107318u,          40643654229u },
+  {  4344934572159429184u, 15363467897354242201u,          85177679000u },
+  {  2252927464837120000u, 10351182204479784367u,         152832855263u },
+  { 10910018171964489728u, 12811517584931924466u,         223561138711u },
+  {  3597328585515335680u, 16988930699558748726u,          23694513759u },
+  {  6972808074239148032u, 11683499918824718325u,          95920971778u },
+  {  2227030015734710272u, 13119300691281647499u,           2633363799u },
+  {  1152921504606846976u, 10125549106595354099u,          87711198715u },
+  {                    0u, 17505352699870800544u,         251548907116u },
+  {                    0u,  6756039242241163264u,         108948967071u },
+  {                    0u,  3537338758766526464u,         159366245621u },
+  {                    0u,  6522626374119718912u,         245191759518u },
+  {                    0u,  4733294203482669056u,         158353592284u },
+  {                    0u, 16997710893603094528u,         220256592392u },
+  {                    0u, 16717361816799281152u,           8921447753u },
+  {                    0u,                    0u,          73906250000u },
+  {                    0u,                    0u,          16000000000u },
+  { 17238287503805244910u,              1251301u,                    0u },
+  {  1434575446038410275u,     1251301934489438u,                    0u },
+  { 14009569747841241694u,  3943737498063000362u,                67833u },
+  { 14938795732275951328u,  2870731037991212489u,         249213790438u },
+  {  6687653542888983473u,  7389433400402095883u,         230155622641u },
+  {    28238723295162625u,  5675049236146197433u,         241400581987u },
+  {  4745270274832691214u,  9953779846262904264u,          99307645035u },
+  {   926478968112308824u, 12691978937179636241u,         107539595486u },
+  {  9213681606604198526u, 15523327331528198029u,         222688033556u },
+  { 13346223820579313024u, 15722603279568118520u,          20841521260u },
+  {   691642518601291257u, 11838632364171816147u,         108852324031u },
+  {  1153720150033789192u,  7832751832367143680u,         191641773546u },
+  { 12089015034721780810u, 12167724027162940862u,         234424614327u },
+  {  3555868702841788854u,  4108211144748152962u,         183659613641u },
+  { 11708406782758214328u,  7530983398136343676u,         201222706572u },
+  {  9417497762905343943u,  1117587133956542355u,         140408255428u },
+  { 12838336066957615287u, 17134748625149490872u,         196060584519u },
+  { 13737708142128207419u,  4039918359454207848u,          71928876584u },
+  { 11683434809834695853u,  1830218764589441242u,          40219004413u },
+  {  2689114340106315837u,   637895981480825742u,         253099216358u },
+  {  8859225263374261032u,  8246879226348334620u,         230034580410u },
+  { 15761671984578600096u, 12389239568142583275u,         186447064218u },
+  {  7087267079878005352u, 14041257178803154398u,         154671622022u },
+  {  4601291730423121377u, 16312515716494630702u,         134761178076u },
+  {  9559411037059581623u, 17088522799596987756u,         220884303248u },
+  { 12969820289641388091u,  3588932524637852678u,         144926370677u },
+  { 13628239920285957130u,   107218049069817414u,         117194556422u },
+  {  8049893933765800625u,  1596707240462008334u,           6005812302u },
+  { 10391755948840250234u, 17461913142391587672u,          78086557672u },
+  { 14454650777462444512u,  4366474266651610090u,         232946612208u },
+  { 14244638523341127254u,  5539304013194805084u,         240236707044u },
+  { 12246016810439753984u,  4762470619211987849u,         228300286272u },
+  {  9382741764551081984u, 10835638458986644717u,          64258174049u },
+  {  4608696190291148800u, 16141642290510052058u,          97587401137u },
+  {  1696483666416369664u, 17390568670756355425u,         177875040181u },
+  { 15416683541605384192u, 12536768491333867107u,         181942744616u },
+  {  7683140964294066176u, 13145148522871947193u,          40679619581u },
+  {  4611686018427387904u,  5665349945233068642u,         253712599929u },
+  {                    0u, 17074607537751066240u,         121307119235u },
+  {                    0u,  6241525660962062336u,         131925616329u },
+  {                    0u,  1142860629783085056u,         201338353784u },
+  {                    0u, 16287527416870469632u,         120061954598u },
+  {                    0u,  9028002014738513920u,          38882948630u },
+  {                    0u, 16217462258161156096u,          22489408969u },
+  {                    0u, 11529215046068469760u,         201879150390u },
+  {                    0u,                    0u,          54625000000u },
+  {                    0u,                    0u,          64000000000u },
+  {  1722045467931902045u,                   19u,                    0u },
+  { 16095324008152856733u,          19093352271u,                    0u },
+  { 15216188060094280738u,   646608198162977646u,                    1u },
+  { 10793385929903030893u, 12170458846894708007u,           1035052700u },
+  { 12613277226875940039u,  1797330480103086687u,         156659761896u },
+  { 10644539625155600107u, 10332188564497263448u,         232097433480u },
+  {  6181262895644173983u,  7524259485079594225u,         136560109064u },
+  {   148914399627082292u,    62681109059153749u,           8407890924u },
+  { 14379289774887985969u, 13480636451804037081u,         236003397949u },
+  { 11743339675582627452u,  6948168233012789004u,          61730786766u },
+  {  7841621929809463497u, 12015502974041806055u,         206376660954u },
+  { 11168944680251236601u,  7343801660689004040u,         218651361721u },
+  {  6178560202529287410u, 13670580858640731144u,         185398108285u },
+  { 13295243308201596112u,  5605073897566574851u,         125741083673u },
+  { 17040673746172470291u, 15387788940505247559u,          25303851664u },
+  { 14957442487039409922u, 17565181499678113030u,         144834173709u },
+  { 17778155426506992152u,  1893743623847493029u,          13952210397u },
+  { 14945404984219733899u, 10243498996716269784u,         221102660047u },
+  { 11590754866058681505u,  5619675836950314139u,         207555301193u },
+  {  6020790784469412466u, 10224869737511515088u,          73304643237u },
+  {  7934351824569522326u,  2574495974386198538u,         165554291299u },
+  {  5038361112172116744u,  7825756347302873178u,          99139563706u },
+  {  3305187319649924210u, 12071550103794656887u,         186424235101u },
+  { 11470175511099161552u,  7195875213867606691u,          93654400042u },
+  {  7308362160352048610u, 18271364438406891044u,          42390089176u },
+  { 10666410671225576634u, 16966521933952564706u,         216990492650u },
+  {  2181639019945820785u,   289920862029570129u,         234919756997u },
+  {  4615749499734847918u,  7804199568098625032u,         197015716641u },
+  { 14076159200958497580u,  5758118571242446585u,          33423066506u },
+  {  5470405257862074105u,  4030788293606375591u,         138312148233u },
+  {  4565741478181339543u,  4387716460037196127u,           9218509471u },
+  {  8901832997861862329u, 16807506478881285981u,         159237858585u },
+  { 14190141170191714122u, 17033060604413529717u,          25911136751u },
+  {  4240772322245764096u, 10498418508292170054u,         239923364065u },
+  {  4422842195340951552u, 13237752038744465016u,         225569120407u },
+  { 15448426386733137920u, 17737618428304633155u,         151717619975u },
+  {  9203504548935630848u, 13546183833248825736u,           7961558221u },
+  {  5936377627571912704u,   826778452978976229u,         205734340097u },
+  {   468374361246531584u, 13728076626990147292u,           1044819749u },
+  {                    0u,  2794860281883592225u,          37744200525u },
+  {                    0u,  8680705720425908736u,          77151509679u },
+  {                    0u,   731520517439488000u,         175470582000u },
+  {                    0u, 13120812320768917504u,         240039655806u },
+  {                    0u,  2722954908557901824u,         126711280661u },
+  {                    0u,  6860847004205973504u,          21147611681u },
+  {                    0u,  6503197861922996224u,          33371927261u },
+  {                    0u,  9223372036854775808u,         221352539062u },
+  {                    0u,                    0u,         182500000000u },
+  {  8020875056524075716u,               291341u,                    0u },
+  {  1400288714762747253u,      291341434812508u,                    0u },
+  {  6136037711314764689u, 12005656413127238315u,                15793u },
+  { 15735488086392394102u,  4821130826186787462u,         177650827938u },
+  {  7735094782793634552u, 14377899467066168118u,         162261354025u },
+  {  7273689191766726188u, 16575613239625444872u,          41779427491u },
+  {  3410634565056431030u,  4317827099179284377u,         163898565794u },
+  {  4600927904885215898u,  1242354770412171254u,         162234069876u },
+  {  9154871331680374746u,   994838588328896609u,         116067348187u },
+  {  6117978272461042996u, 17283309862013060457u,         219053930307u },
+  { 13116904339287496285u,   124242522249856586u,          67936930105u },
+  {   867037205615660831u, 11564608014666985609u,          57006735200u },
+  {  1802487145191504830u, 12401028575581654085u,          96626918656u },
+  { 17242009718457409007u,  2490725392961465727u,            672261106u },
+  { 13620802355488468049u,  1949482237120640915u,         242135022494u },
+  {  4442227880594435745u, 15410502396166200087u,         158105681643u },
+  { 17354849212854314181u, 15694919529799920727u,         235835405008u },
+  { 18202319179831567886u, 10324869370171768388u,         208850823292u },
+  { 17568634016348874558u,  1631866459122189059u,         124559712290u },
+  {  7496925598312450672u,   172020494461226230u,          34088463658u },
+  {   601870379496813865u, 12734610307908856767u,          42009325249u },
+  { 11995106565680728027u,  1467513250829340930u,         193690344608u },
+  { 16331071694764184179u, 13558759428494307997u,         160079554052u },
+  {  9665962217000524208u,  7915355143999496434u,           4735021821u },
+  { 13682661374415474390u,  2876370200608797469u,         253429092262u },
+  {  6940361789924260864u,   343685370404989503u,         166155928341u },
+  {  9658039831644010465u,  4837266557407634630u,          21018631221u },
+  {  6843715893910236922u,  9622591415747161468u,          53262228745u },
+  {    47089792870595660u, 16503783814424220982u,           9521641725u },
+  { 14510386192097156932u,  5377083431343591334u,         253894671913u },
+  { 12059931208360040296u, 16508482371299291595u,          41291492276u },
+  { 14877013468459184620u, 10515883558812249028u,         180894926622u },
+  {  2397668560671695044u,    63492062913405476u,          30570067190u },
+  {  2195572305559232232u, 11571919759617799697u,         246003441911u },
+  {  3261686279425953792u,  2956602334970088581u,         247627315027u },
+  {  9333850662059900928u, 13604736747717849839u,          83160277733u },
+  {  5036522340217782272u, 16573540719338151362u,         229737514256u },
+  {  2800120215143186432u, 12620703004601168151u,          16898453442u },
+  {   441634238459019264u, 14649407809089591941u,         194684169680u },
+  {   720575940379279360u, 11290375247898624432u,         208794145988u },
+  {                    0u, 11020319450292874212u,         196612052468u },
+  {                    0u,  8754634933362354176u,         244597412714u },
+  {                    0u, 12976319450332528640u,         106474589710u },
+  {                    0u, 17447331119627239424u,          14703447686u },
+  {                    0u,  3665184902673858560u,         134945821715u },
+  {                    0u, 12949678516038795264u,          19198690071u },
+  {                    0u,    72057594037927936u,          23702003479u },
+  {                    0u,                    0u,          23003906250u },
+  {                    0u,                    0u,         202000000000u },
+  {  8218347283861607400u,                    4u,                    0u },
+  { 17896200385973633643u,           4445517498u,                    0u },
+  { 16333242102094352209u,  4445517498970154966u,                    0u },
+  {  9981905728606788815u,  9413159735776077452u,            240991986u },
+  { 15219470018924839012u, 14279163482889998017u,         242510288411u },
+  { 17152070168529617370u,  8693044629541194274u,          27774075003u },
+  { 17841343440958328027u, 11863110253260222498u,         123471250893u },
+  { 17291078023923990493u,  8319293368489531245u,         205643100495u },
+  { 16744804581790759223u,  3376307525676489265u,          79450989797u },
+  {  5001622214111594905u, 13205662254759912523u,         229183029997u },
+  {  9676746897435398146u,  5276250334231686323u,         237715880385u },
+  {  8109025833995118532u, 13790198520922745052u,         193286026103u },
+  {  5495826424046694744u, 14195535250150996227u,         119747568159u },
+  {  7890288164365705852u, 16425228796427004035u,          31769541507u },
+  {  8616438349039895217u,  4295900841296269186u,         131890413437u },
+  { 15787154801788760618u,  4533952595483946442u,         125232881251u },
+  { 12418659311480782502u, 12885038019373447184u,          99245786062u },
+  {  4486988874116669987u, 12140736240487831910u,         206698499310u },
+  {  4828971301551875409u,  6927124077155322074u,         238658150630u },
+  { 14769106422014442226u, 12477788342407819890u,         230375520148u },
+  {  7763933466423188156u,  7980854329409711087u,         148676422261u },
+  { 10449097116253839963u,  2062671021810827996u,         117432642980u },
+  { 12870692502472900571u,  2739521363598172769u,         164111817620u },
+  { 11597479481311003817u, 12897585686593465638u,         148148509750u },
+  {  8294994869530047486u,  1127632646629044686u,          54699179521u },
+  { 16879315829924478241u,  4833775019274666364u,           1061129088u },
+  { 11873324837601439670u, 15867662672939849256u,         128262039468u },
+  {  3277599055636107318u,  2092350330982953557u,         172860187717u },
+  { 15363467897354242201u, 13330062299842493592u,          69113426538u },
+  { 10351182204479784367u,  4479193352178519263u,         106722624125u },
+  { 12811517584931924466u,  3149393938889064983u,         125242817558u },
+  { 16988930699558748726u,  9736379904070620767u,          22170728987u },
+  { 11683499918824718325u,  3816238703055069186u,          27527810212u },
+  { 13119300691281647499u, 11598915938798661975u,         164206878714u },
+  { 10125549106595354099u, 17821633264606555643u,         250628778492u },
+  { 17505352699870800544u,  2514623558764574316u,         252966112675u },
+  {  6756039242241163264u,  4976730480406253215u,         163136318016u },
+  {  3537338758766526464u, 17276563697191611637u,          64269789099u },
+  {  6522626374119718912u, 12524734095940998814u,         171936564394u },
+  {  4733294203482669056u, 15331551308930355164u,         170678967195u },
+  { 16997710893603094528u, 15417115581125943816u,         155831125061u },
+  { 16717361816799281152u,  6010750237807115593u,          69835763510u },
+  {                    0u,  5624630987553628432u,          54325843423u },
+  {                    0u, 14881848243837640704u,         223304911856u },
+  {                    0u, 15281613886881529856u,         240806746609u },
+  {                    0u, 14057902358273196032u,         241828417948u },
+  {                    0u, 16075318494433902592u,         156762080413u },
+  {                    0u, 13891916000577716224u,         157871444761u },
+  {                    0u,  7205759403792793600u,          25753082275u },
+  {                    0u,                    0u,         163390625000u },
+  {                    0u,                    0u,         232000000000u },
+  {  3943737498063000362u,                67833u,                    0u },
+  {  2870731037991212489u,       67833213790438u,                    0u },
+  {  7389433400402095883u,  4535831408134330609u,                 3677u },
+  {  5675049236146197433u,  6204770794376564579u,          93245887913u },
+  {  9953779846262904264u, 13869812122751887467u,         169336361298u },
+  { 12691978937179636241u, 14253229412394467550u,          82751884021u },
+  { 15523327331528198029u, 12776557610216045332u,         245772669114u },
+  { 15722603279568118520u, 16493640728678654060u,         186692618575u },
+  { 11838632364171816147u,  9434398296825833151u,          79894122055u },
+  {  7832751832367143680u,  8773374058285327850u,          71511439756u },
+  { 12167724027162940862u, 12932015276748029367u,         140475605560u },
+  {  4108211144748152962u, 16293958583527755209u,          56701045952u },
+  {  7530983398136343676u, 13511893936143127948u,         192883297264u },
+  {  1117587133956542355u, 18409936402005226436u,         240732481237u },
+  { 17134748625149490872u,  2189663026458466887u,         213998004652u },
+  {  4039918359454207848u,  9497725274248154664u,         172118701870u },
+  {  1830218764589441242u, 14766925481127792125u,          46514872718u },
+  {   637895981480825742u,  6982373971809635814u,         142800516634u },
+  {  8246879226348334620u,  8616702383006884794u,          26378515251u },
+  { 12389239568142583275u,  3059473300040871066u,          51467112372u },
+  { 14041257178803154398u, 17123843157031495558u,         180165854379u },
+  { 16312515716494630702u, 11210627174210626524u,         171928285397u },
+  { 17088522799596987756u, 15868067138625928592u,         213607729316u },
+  {  3588932524637852678u,  4467869511636937589u,         164860209643u },
+  {   107218049069817414u, 10052108125844341766u,         235242203691u },
+  {  1596707240462008334u,  7470588003218451534u,          43544925873u },
+  { 17461913142391587672u,  2613527085490786280u,         177404981387u },
+  {  4366474266651610090u,  3632919450036549616u,         139141679587u },
+  {  5539304013194805084u,   179367907231218916u,         227196940958u },
+  {  4762470619211987849u, 13553068184555874624u,         158009723553u },
+  { 10835638458986644717u,  8798774862365584481u,         161734713298u },
+  { 16141642290510052058u,   910911255817064881u,         210476982541u },
+  { 17390568670756355425u,  2304331144765093813u,          13049380598u },
+  { 12536768491333867107u, 12248937023083640360u,         246124918041u },
+  { 13145148522871947193u, 10206039550662130685u,          25664016206u },
+  {  5665349945233068642u, 12267881323837852537u,          78553270512u },
+  { 17074607537751066240u,  2858642007937891971u,         240665043179u },
+  {  6241525660962062336u, 14171330289750320841u,         235154967293u },
+  {  1142860629783085056u,  6601103619749017720u,         253768229354u },
+  { 16287527416870469632u,  4919573414486739494u,         234357846544u },
+  {  9028002014738513920u,  3401998285294974486u,          16266690609u },
+  { 16217462258161156096u, 10799436256515532233u,          49184422696u },
+  { 11529215046068469760u, 10083786644665753398u,          40585438612u },
+  {                    0u,  6481194517685688896u,         148546643169u },
+  {                    0u, 15104161756860547072u,         225351346258u },
+  {                    0u,  9556039274244079616u,          82818798249u },
+  {                    0u,  1376343134954323968u,         169518033927u },
+  {                    0u, 15682488278596976640u,           7074611710u },
+  {                    0u,  1506454075355430912u,         254850149393u },
+  {                    0u,  1152921504606846976u,          17081665039u },
+  {                    0u,                    0u,          15062500000u },
+  {                    0u,                    0u,         160000000000u },
+  { 12170458846894708007u,           1035052700u,                    0u },
+  {  1797330480103086687u,  1035052700659761896u,                    0u },
+  { 10332188564497263448u,  6172559441576707976u,             56110319u },
+  {  7524259485079594225u, 15083329738554729992u,         239334615117u },
+  {    62681109059153749u, 10013126833549229036u,          77817668943u },
+  { 13480636451804037081u,  5817156823499936061u,          79542812693u },
+  {  6948168233012789004u,  5282692560913632718u,          21315348703u },
+  { 12015502974041806055u, 10252307034225766362u,         223286375337u },
+  {  7343801660689004040u, 17981881283247669689u,         169555778677u },
+  { 13670580858640731144u, 11689290159733383293u,         117974799737u },
+  {  5605073897566574851u,  5530668968487988249u,         121633677689u },
+  { 15387788940505247559u, 10083765740821947024u,         121299818165u },
+  { 17565181499678113030u,  2798423656816843533u,         181546642036u },
+  {  1893743623847493029u,  7614494481582904797u,         116151702850u },
+  { 10243498996716269784u, 17811318500083423695u,          66412782572u },
+  {  5619675836950314139u, 11641467412200329033u,         236965553510u },
+  { 10224869737511515088u, 17733593025296340645u,         102631085212u },
+  {  2574495974386198538u,  3689424000190644835u,         156961340004u },
+  {  7825756347302873178u, 14966634145516728506u,         100200004075u },
+  { 12071550103794656887u, 14171681941562070109u,         235811342862u },
+  {  7195875213867606691u,  8130575762882608170u,          14768248417u },
+  { 18271364438406891044u,  5234550794400656856u,          97440759395u },
+  { 16966521933952564706u,  3020576149360486378u,          99283765567u },
+  {   289920862029570129u,  3038675756589057221u,          63163745761u },
+  {  7804199568098625032u, 15470260187120878369u,         225164726942u },
+  {  5758118571242446585u,  3497929414841828746u,         158838644485u },
+  {  4030788293606375591u,  9935840636861015305u,           5189623133u },
+  {  4387716460037196127u,  3647355485153741471u,          93538623000u },
+  { 16807506478881285981u,   766100215038272793u,          24197723537u },
+  { 17033060604413529717u, 16128087474216800751u,         145041530375u },
+  { 10498418508292170054u, 16216631732633731297u,           7874305373u },
+  { 13237752038744465016u, 13760220872779997335u,          93879105367u },
+  { 17737618428304633155u,  3826276262374222087u,          87745943068u },
+  { 13546183833248825736u, 14938032745839181005u,          28207422851u },
+  {   826778452978976229u, 14479259995009508865u,         131809792377u },
+  { 13728076626990147292u,  2372033248156102437u,         121784922257u },
+  {  2794860281883592225u,   792005346826701645u,         145128588180u },
+  {  8680705720425908736u, 16278924527931792559u,         148042934695u },
+  {   731520517439488000u, 17442516423538940144u,         167882482266u },
+  { 13120812320768917504u,    13844184233048446u,          90945560710u },
+  {  2722954908557901824u, 13486193870480782357u,         134000750494u },
+  {  6860847004205973504u, 11931315179184648737u,         158731088034u },
+  {  6503197861922996224u, 16492562205587485405u,         162646797891u },
+  {  9223372036854775808u, 12128987217680380854u,          67894063588u },
+  {                    0u, 10568123814189138176u,         228657513714u },
+  {                    0u, 17007583519117541376u,         242572899139u },
+  {                    0u,   143791533903052800u,          67921982950u },
+  {                    0u, 12398714235792654336u,         230007794954u },
+  {                    0u,  9659957317919047680u,          10672135645u },
+  {                    0u,  9412523221204336640u,         221523667335u },
+  {                    0u,  4611686018427387904u,         135510253906u },
+  {                    0u,                    0u,          82250000000u },
+  {                    0u,                    0u,         128000000000u },
+  { 12005656413127238315u,                15793u,                    0u },
+  {  4821130826186787462u,       15793650827938u,                    0u },
+  { 14377899467066168118u,  3237900842885170729u,                  856u },
+  { 16575613239625444872u,  7515893506498066595u,          88175526956u },
+  {  4317827099179284377u,  7300206309181072546u,          44407437403u },
+  {  1242354770412171254u,     5999737279837044u,          91395744977u },
+  {   994838588328896609u,  7556839307242450651u,         209000325246u },
+  { 17283309862013060457u, 12946035041643640643u,         126409657079u },
+  {   124242522249856586u, 15885877642352740665u,         247701805965u },
+  { 11564608014666985609u, 10770818348246089568u,         141861175152u },
+  { 12401028575581654085u, 11635415503599551744u,         112583887232u },
+  {  2490725392961465727u,  6248053924100826098u,         128630757138u },
+  {  1949482237120640915u, 16894170802729859998u,          18338707681u },
+  { 15410502396166200087u,  6143589029651889899u,         225915834834u },
+  { 15694919529799920727u, 11812087701837886160u,         210333044628u },
+  { 10324869370171768388u,  7306705080150829180u,         148640334557u },
+  {  1631866459122189059u,  1485332570280714274u,         221396097276u },
+  {   172020494461226230u, 18042602303295630634u,         252080520039u },
+  { 12734610307908856767u, 13397029889257074369u,         103978091430u },
+  {  1467513250829340930u,  9948104869613411488u,         166726254445u },
+  { 13558759428494307997u, 10836066241170646532u,         109539287845u },
+  {  7915355143999496434u, 18330574781234459389u,          37587424327u },
+  {  2876370200608797469u,   666297360208433062u,          71993702450u },
+  {   343685370404989503u,  5035352224889324309u,          50036120052u },
+  {  4837266557407634630u,  1341745796439923765u,         244272966991u },
+  {  9622591415747161468u,  6846932182653803785u,          79072736185u },
+  { 16503783814424220982u,  6727685027257825533u,         185371172937u },
+  {  5377083431343591334u,  2168538874806877737u,          73364708536u },
+  { 16508482371299291595u, 17694936100676971444u,         184117556727u },
+  { 10515883558812249028u,  2163944241059563294u,         247959244408u },
+  {    63492062913405476u,  6727780864524301558u,         120117307652u },
+  { 11571919759617799697u,  8599551977795002615u,           4364713731u },
+  {  2956602334970088581u, 15428264807806859091u,           3466182646u },
+  { 13604736747717849839u,  2126771385339683557u,         246836367911u },
+  { 16573540719338151362u, 15094316562082972944u,          39115292507u },
+  { 12620703004601168151u,  8111300598225956802u,          91818264540u },
+  { 14649407809089591941u,  9481215200564260304u,         220439714486u },
+  { 11290375247898624432u, 16836674128623424708u,         182513977705u },
+  { 11020319450292874212u,  7087243115299722740u,         105912717933u },
+  {  8754634933362354176u,  2343560867338408810u,         109384200219u },
+  { 12976319450332528640u,  3431385749090422286u,          27127044689u },
+  { 17447331119627239424u,  3504545517469224582u,          81186015794u },
+  {  3665184902673858560u,  3333759805712094227u,          50189981793u },
+  { 12949678516038795264u,  3595183476205994775u,          97180723481u },
+  {    72057594037927936u, 14191566632569921303u,          25194895286u },
+  {                    0u, 12917427671358095562u,         182769326368u },
+  {                    0u,  3883793922738316288u,          32700255157u },
+  {                    0u,  7857281689266421760u,         181210540890u },
+  {                    0u, 15987081651486195712u,          90425944093u },
+  {                    0u, 16827562156399525888u,          29866661432u },
+  {                    0u,  7012737938513461248u,          56912223972u },
+  {                    0u,  7385903388887613440u,         228380161285u },
+  {                    0u,                    0u,           5400390625u },
+  {                    0u,                    0u,         225000000000u },
+  {  9413159735776077452u,            240991986u,                    0u },
+  { 14279163482889998017u,   240991986510288411u,                    0u },
+  {  8693044629541194274u, 14135788013842776187u,             13064201u },
+  { 11863110253260222498u, 13284322918167594445u,           9766302603u },
+  {  8319293368489531245u,  7264587765474046287u,         139720144588u },
+  {  3376307525676489265u, 16176482219778368741u,         204393814091u },
+  { 13205662254759912523u,  5401983818872095469u,          75876928858u },
+  {  5276250334231686323u, 11208857446851049921u,          90292842129u },
+  { 13790198520922745052u, 13794690008281035639u,         145607633379u },
+  { 14195535250150996227u, 14519782740993303071u,         227747811643u },
+  { 16425228796427004035u, 10885858587044789123u,          59787118999u },
+  {  4295900841296269186u,  8710500938899914621u,         151590123576u },
+  {  4533952595483946442u,  1284182587483102819u,          56472197202u },
+  { 12885038019373447184u, 10346074482131502030u,          82069615677u },
+  { 12140736240487831910u,  9429804686255246574u,          61560861821u },
+  {  6927124077155322074u,  6412022633845121254u,         125511190736u },
+  { 12477788342407819890u,  8892351297529018260u,         208347596443u },
+  {  7980854329409711087u, 14098160105983060597u,         155482055329u },
+  {  2062671021810827996u, 13793833029739474340u,         161764262790u },
+  {  2739521363598172769u, 16367653765996977044u,         134747765186u },
+  { 12897585686593465638u, 10684788343333772342u,         194887292288u },
+  {  1127632646629044686u, 13272681218705145345u,         128579223536u },
+  {  4833775019274666364u, 11093568615497829248u,         240719513490u },
+  { 15867662672939849256u, 12488220765137758124u,         146601383559u },
+  {  2092350330982953557u,  3727114642519696453u,         135676987804u },
+  { 13330062299842493592u, 11549865375695057514u,         156202047289u },
+  {  4479193352178519263u, 11292809154908783229u,          57626119456u },
+  {  3149393938889064983u, 17723904861837310998u,          32612184410u },
+  {  9736379904070620767u, 14877674388187150875u,          90960814807u },
+  {  3816238703055069186u, 12178961950105734308u,         215806520344u },
+  { 11598915938798661975u,  4540604068069253114u,          24660222850u },
+  { 17821633264606555643u, 13832478722153359868u,         130246146639u },
+  {  2514623558764574316u,  1308046668730371491u,          79749860174u },
+  {  4976730480406253215u, 18400531023544756800u,          78070909351u },
+  { 17276563697191611637u,  9789823458621466539u,         167997494785u },
+  { 12524734095940998814u,  1924870562610267306u,           1530707393u },
+  { 15331551308930355164u,  5290016144582400923u,         193104347442u },
+  { 15417115581125943816u, 15162883663174059077u,          50286772349u },
+  {  6010750237807115593u,  8078086116520046390u,         125821981570u },
+  {  5624630987553628432u, 15731407332173190623u,         130437913925u },
+  { 14881848243837640704u,  5346389182763011056u,          69852801300u },
+  { 15281613886881529856u,  6368422217216252401u,          20289828338u },
+  { 14057902358273196032u,  2961453088119116188u,         242345232860u },
+  { 16075318494433902592u, 10932141691610170525u,         220160540693u },
+  { 13891916000577716224u, 11034016191361782553u,          21592632588u },
+  {  7205759403792793600u,  5455325785621453219u,          12598155216u },
+  {                    0u,  7735615202566149352u,         208295733803u },
+  {                    0u,  7502396497775759360u,          43419348540u },
+  {                    0u,  1601286435751591936u,          60406705729u },
+  {                    0u, 11449383158571597824u,          65086805911u },
+  {                    0u, 13043944595690356736u,         151620672304u },
+  {                    0u,  7773494431818186752u,          48707113653u },
+  {                    0u,  9943947977234055168u,         181421401977u },
+  {                    0u,                    0u,         121539062500u },
+  {                    0u,                    0u,         228000000000u },
+  {  4535831408134330609u,                 3677u,                    0u },
+  {  6204770794376564579u,        3677245887913u,                    0u },
+  { 13869812122751887467u,  6343817245135589714u,                  199u },
+  { 14253229412394467550u, 17549323075660516085u,         199343899021u },
+  { 12776557610216045332u,  3948641822109421754u,         141951350710u },
+  { 16493640728678654060u,  1750739713693534543u,         182214056302u },
+  {  9434398296825833151u,   962163898128633415u,         110094907790u },
+  {  8773374058285327850u,  7967320249386531212u,         142052159009u },
+  { 12932015276748029367u,  3018466665533383224u,          33431909296u },
+  { 16293958583527755209u, 15076865731854945472u,         176163631405u },
+  { 13511893936143127948u,   691187172844604400u,          45817318529u },
+  { 18409936402005226436u, 13274492813370992341u,         129037469331u },
+  {  2189663026458466887u,  6364168818499152300u,         147719611697u },
+  {  9497725274248154664u, 17599380787401914158u,          49345002282u },
+  { 14766925481127792125u,  3782323149461692814u,          42954064344u },
+  {  6982373971809635814u, 14470163442442237466u,         216205040148u },
+  {  8616702383006884794u,   476109872130437939u,          20784429132u },
+  {  3059473300040871066u, 16330548844673355700u,          76025809967u },
+  { 17123843157031495558u, 14089158961463739563u,          47885280826u },
+  { 11210627174210626524u, 13385510793074798805u,          58763774837u },
+  { 15868067138625928592u,  1549401308746959012u,         117725629994u },
+  {  4467869511636937589u,  4607384943843027435u,          42083993213u },
+  { 10052108125844341766u,  5157353797716093483u,         125249766838u },
+  {  7470588003218451534u, 10846828782671550129u,         182279580709u },
+  {  2613527085490786280u,  9915857350819131531u,          37588007766u },
+  {  3632919450036549616u,  1673544973504317923u,          86537539704u },
+  {   179367907231218916u, 14780986291622785694u,         120090723054u },
+  { 13553068184555874624u,  8168111319515466401u,         238801278872u },
+  {  8798774862365584481u, 16345760387859734482u,         152442794201u },
+  {   910911255817064881u,  3177475373321281805u,         217886105446u },
+  {  2304331144765093813u,  2558676822419554038u,         102172251285u },
+  { 12248937023083640360u,  8813474062662382873u,         149138706148u },
+  { 10206039550662130685u,  5426294560236228430u,         228477779386u },
+  { 12267881323837852537u,  9919177474128333040u,         186294160017u },
+  {  2858642007937891971u,  6197383943089627371u,         145537719688u },
+  { 14171330289750320841u, 13673239314867423997u,         136335960856u },
+  {  6601103619749017720u,  9309584098968723946u,          24741227788u },
+  {  4919573414486739494u,  4647101757759615504u,          12504673565u },
+  {  3401998285294974486u,  1405809295505096753u,          29251919891u },
+  { 10799436256515532233u, 11332704079573859112u,          19076209074u },
+  { 10083786644665753398u,  2960072434514044308u,         178614347119u },
+  {  6481194517685688896u,  3887266602785432801u,         111160465848u },
+  { 15104161756860547072u, 14545546084687849554u,         184210729144u },
+  {  9556039274244079616u,  4617763804182385321u,         184788515633u },
+  {  1376343134954323968u,  7857823815580249095u,          49250329477u },
+  { 15682488278596976640u, 10939326736548364798u,         133425973482u },
+  {  1506454075355430912u, 12262012446566951953u,         234593022090u },
+  {  1152921504606846976u, 12555024338687723023u,         138664725026u },
+  {                    0u,  3332969632922829472u,          34680609233u },
+  {                    0u, 15535060143360327680u,         209180680645u },
+  {                    0u, 15794322927987458048u,         197842157297u },
+  {                    0u, 10571474314433921024u,         241856211961u },
+  {                    0u, 16679514427547975680u,         249573080770u },
+  {                    0u, 16925653299565166592u,         194904198288u },
+  {                    0u, 16717361816799281152u,         144917541503u },
+  {                    0u,                    0u,         127906250000u },
+  {                    0u,                    0u,          16000000000u },
+  {  6172559441576707976u,             56110319u,                    0u },
+  { 15083329738554729992u,    56110319334615117u,                    0u },
+  { 10013126833549229036u,  9335385384027907407u,              3041746u },
+  {  5817156823499936061u, 13237828406194798613u,         210506072255u },
+  {  5282692560913632718u, 15667486867836528863u,         191717624115u },
+  { 10252307034225766362u, 17982325043592934313u,          51849336164u },
+  { 17981881283247669689u, 17159117626917379189u,         100974823793u },
+  { 11689290159733383293u,  8336208968408929657u,         113930197630u },
+  {  5530668968487988249u, 12767090573379150201u,         126451906793u },
+  { 10083765740821947024u, 14736070002412246709u,         233692105366u },
+  {  2798423656816843533u,  9697296975344560756u,         150798843955u },
+  {  7614494481582904797u,  7291706381199103298u,          51525691522u },
+  { 17811318500083423695u, 18098546597780825068u,         130395284194u },
+  { 11641467412200329033u,   132913902678533478u,         226981124177u },
+  { 17733593025296340645u,  1879347741692007580u,          81007205277u },
+  {  3689424000190644835u,  4056624629214083684u,         157101879645u },
+  { 14966634145516728506u, 14713227692042795499u,          93219910061u },
+  { 14171681941562070109u,  7366415124022528526u,         173797605671u },
+  {  8130575762882608170u,   825770353378039393u,          39399334164u },
+  {  5234550794400656856u, 10244023944395357795u,          20044765100u },
+  {  3020576149360486378u, 14302658294713551167u,         172555329650u },
+  {  3038675756589057221u, 14246653166206862817u,         114775348659u },
+  { 15470260187120878369u, 12404486258134291102u,         179772312615u },
+  {  3497929414841828746u,  8887442218637942533u,          39672448547u },
+  {  9935840636861015305u,  1186724038081863005u,          35481789208u },
+  {  3647355485153741471u,   211331772484951576u,          24064332439u },
+  {   766100215038272793u,  6311919513247413649u,         151011456318u },
+  { 16128087474216800751u,  8131780018703965703u,          62342169842u },
+  { 16216631732633731297u,  2262544347226725725u,         242440824678u },
+  { 13760220872779997335u, 15318188749880522583u,         102122652774u },
+  {  3826276262374222087u,  1073117094162650652u,         102830400676u },
+  { 14938032745839181005u,  4447950380665871747u,         164058173794u },
+  { 14479259995009508865u,  5373227185066463609u,          98241123873u },
+  {  2372033248156102437u,  6739731406934274193u,          33291283229u },
+  {   792005346826701645u, 12328812617001239444u,          29365361571u },
+  { 16278924527931792559u,  3246111484407310759u,         163668346271u },
+  { 17442516423538940144u,  3250825415176839770u,         159175972056u },
+  {    13844184233048446u, 16146270540000862342u,         216176227598u },
+  { 13486193870480782357u, 15686773375425916830u,          14875291079u },
+  { 11931315179184648737u, 11920791905793880226u,         199850381688u },
+  { 16492562205587485405u,  1853290561644080707u,         120646227424u },
+  { 12128987217680380854u, 12157689141506159076u,         224100467082u },
+  { 10568123814189138176u, 18100318838862562546u,         138659069648u },
+  { 17007583519117541376u,  7171257882533475139u,         208981220250u },
+  {   143791533903052800u, 14477550873015039462u,         154388754668u },
+  { 12398714235792654336u,  8109481182495403274u,         236784829605u },
+  {  9659957317919047680u, 14565395719337663965u,         165439615855u },
+  {  9412523221204336640u,  1860318978161305991u,         111789591684u },
+  {  4611686018427387904u, 16268646275151585618u,         132100848093u },
+  {                    0u, 13759019338835519104u,         221881925081u },
+  {                    0u, 17003783176010661888u,         217745877932u },
+  {                    0u, 18357489540307877888u,         172921776932u },
+  {                    0u,   905481790074912768u,          36995161502u },
+  {                    0u,  3638882110636294144u,         158049086266u },
+  {                    0u,  9011702854368362496u,          58197264194u },
+  {                    0u, 11529215046068469760u,          66488525390u },
+  {                    0u,                    0u,          78625000000u },
+  {                    0u,                    0u,          64000000000u },
+  {  3237900842885170729u,                  856u,                    0u },
+  {  7515893506498066595u,         856175526956u,                    0u },
+  {  7300206309181072546u,  7625299565768063067u,                   46u },
+  {     5999737279837044u, 13889021769065194705u,          46413368317u },
+  {  7556839307242450651u, 14498170692313014398u,         253752925378u },
+  { 12946035041643640643u,  1541631360972245751u,         194785947408u },
+  { 15885877642352740665u,  9903958882920799117u,          16083572003u },
+  { 10770818348246089568u, 15744148547788062576u,          35536894686u },
+  { 11635415503599551744u, 17936061801321712000u,         222853492002u },
+  {  6248053924100826098u,  9986394078324430610u,          34972315858u },
+  { 16894170802729859998u, 13849561248103430369u,         210541363507u },
+  {  6143589029651889899u, 12142378807953854930u,          51750786219u },
+  { 11812087701837886160u,  2513847703931031444u,         171658239674u },
+  {  7306705080150829180u,  1752183758129038045u,         186136275957u },
+  {  1485332570280714274u, 15824833342220556540u,         245094986071u },
+  { 18042602303295630634u,  8168747198299470695u,          87857865934u },
+  { 13397029889257074369u, 17414799840149357478u,         206442828672u },
+  {  9948104869613411488u,    83147520704167789u,         128944058191u },
+  { 10836066241170646532u,  2383542703041471269u,          79004507436u },
+  { 18330574781234459389u, 15540952725549257799u,          44129212108u },
+  {   666297360208433062u,  6949835416232048690u,         204842476735u },
+  {  5035352224889324309u, 15398868937585367540u,         191376751332u },
+  {  1341745796439923765u, 14710915985268256079u,         228834774357u },
+  {  6846932182653803785u,  9665704836873335737u,          85797480353u },
+  {  6727685027257825533u,  2528789298740305993u,         161523978909u },
+  {  2168538874806877737u, 10562914675687726264u,         157137085942u },
+  { 17694936100676971444u, 17671658300096837111u,         246572616751u },
+  {  2163944241059563294u,   356471401631698552u,          47957982516u },
+  {  6727780864524301558u,  7450677157218003204u,          52019324353u },
+  {  8599551977795002615u,   317174560787152643u,         193403902018u },
+  { 15428264807806859091u,  7251937674440720374u,          66017194067u },
+  {  2126771385339683557u,  1252631516699038247u,          83393128329u },
+  { 15094316562082972944u, 10818009768860843867u,         137067905290u },
+  {  8111300598225956802u, 12330114194950162396u,          10586445484u },
+  {  9481215200564260304u, 15826681638261168822u,         172668416829u },
+  { 16836674128623424708u, 14240150078499211625u,          61857966130u },
+  {  7087243115299722740u, 10725372116242125421u,          50771960082u },
+  {  2343560867338408810u,  8434925524647833627u,          18581423587u },
+  {  3431385749090422286u, 17133902668520348241u,         227457258228u },
+  {  3504545517469224582u, 15093996047981365810u,         244928830724u },
+  {  3333759805712094227u,  6187974166976813153u,           4818247165u },
+  {  3595183476205994775u, 13946144707720259865u,         253335450751u },
+  { 14191566632569921303u,  9138079832881862582u,         127756022019u },
+  { 12917427671358095562u,  6600697628576225568u,           3495376300u },
+  {  3883793922738316288u,  8137099536646556597u,         172357824535u },
+  {  7857281689266421760u, 14169855543453903706u,          23441113049u },
+  { 15987081651486195712u,  3706403268650100765u,         217768149408u },
+  { 16827562156399525888u, 14736932266877982264u,         160200924523u },
+  {  7012737938513461248u, 18004795125138956004u,         107798890698u },
+  {  7385903388887613440u,  9068489270661002501u,         202976041899u },
+  {                    0u,  7758835715193269217u,         171491603788u },
+  {                    0u, 16943947811135261184u,          76420607326u },
+  {                    0u,  6745843108403216384u,          94918533251u },
+  {                    0u, 12338229654069444608u,         131365692887u },
+  {                    0u, 14358176069683511296u,         215668856769u },
+  {                    0u,  7083775185760813056u,         193778358284u },
+  {                    0u,  5350276357316149248u,          12384012222u },
+  {                    0u,  9223372036854775808u,         190290039062u },
+  {                    0u,                    0u,          22500000000u },
+  { 14135788013842776187u,             13064201u,                    0u },
+  { 13284322918167594445u,    13064201766302603u,                    0u },
+  {  7264587765474046287u, 14699116688460625612u,               708211u },
+  { 16176482219778368741u,  6684126021499623499u,         115796840712u },
+  {  5401983818872095469u, 12614606079692508506u,           8362347197u },
+  { 11208857446851049921u, 15358270276683001489u,         189683839165u },
+  { 13794690008281035639u, 18077126190953408995u,         189832573499u },
+  { 14519782740993303071u,  7864121581925945659u,          59979962974u },
+  { 10885858587044789123u,  3518026639210514839u,          94426314885u },
+  {  8710500938899914621u,  4698310163811252280u,         133190712606u },
+  {  1284182587483102819u,  6101155398200416338u,          30254695904u },
+  { 10346074482131502030u, 16049178580360033341u,         224330744296u },
+  {  9429804686255246574u,  3167464649127375997u,         232870027714u },
+  {  6412022633845121254u, 12778923935480989904u,         194171708602u },
+  {  8892351297529018260u, 11875553912612980379u,         186692746854u },
+  { 14098160105983060597u, 10628760849351697057u,         102643775067u },
+  { 13793833029739474340u,  3408944711673234310u,          91576186280u },
+  { 16367653765996977044u,  2102091496050506178u,         168184799263u },
+  { 10684788343333772342u,  6254611118630245760u,          31113954608u },
+  { 13272681218705145345u,  2647941151989776368u,          48339063148u },
+  { 11093568615497829248u,  8855437735410157458u,         108143545177u },
+  { 12488220765137758124u, 10184270603132180103u,          89480054241u },
+  {  3727114642519696453u, 12079083162535627164u,         225552090415u },
+  { 11549865375695057514u,  5952952868716156729u,          47654808410u },
+  { 11292809154908783229u, 11958907037815852320u,          90322710221u },
+  { 17723904861837310998u, 10101562137321697626u,         205648293649u },
+  { 14877674388187150875u, 13633527411279258327u,          17547606780u },
+  { 12178961950105734308u, 16555627393501768728u,         252739075001u },
+  {  4540604068069253114u,  6359650463500280706u,         185897482359u },
+  { 13832478722153359868u,  8093923611102181967u,         119344757342u },
+  {  1308046668730371491u,  2848827352928635726u,          94438772478u },
+  { 18400531023544756800u,  4686723431961561511u,         254154435240u },
+  {  9789823458621466539u,  6245554925867652609u,         168254067786u },
+  {  1924870562610267306u, 17527406820792516033u,          74338572210u },
+  {  5290016144582400923u, 12119966834653692210u,         178950162627u },
+  { 15162883663174059077u, 11606502845877928061u,         195657024718u },
+  {  8078086116520046390u,   424311496652297090u,         206629189780u },
+  { 15731407332173190623u,  5977664048034127173u,         148023001972u },
+  {  5346389182763011056u,  6702712461535947028u,         116324049817u },
+  {  6368422217216252401u, 11384349854055020018u,         153363354770u },
+  {  2961453088119116188u,  3782955013294836188u,         146617146842u },
+  { 10932141691610170525u,  3531805968821207061u,         218205074402u },
+  { 11034016191361782553u,  3867566898657193228u,         226191459585u },
+  {  5455325785621453219u, 12688734637425072080u,           1209661221u },
+  {  7735615202566149352u, 18435982764454619691u,          37687857682u },
+  {  7502396497775759360u,  4728836163964677692u,          18999416628u },
+  {  1601286435751591936u,  2120012917348838977u,          52256350722u },
+  { 11449383158571597824u,  9856965465824679831u,           2114926130u },
+  { 13043944595690356736u, 11217197671061248816u,          50534347168u },
+  {  7773494431818186752u,  3840562972677739189u,         160608085504u },
+  {  9943947977234055168u, 17104366978925258617u,            208197335u },
+  {                    0u, 16177877219841993444u,         215927229591u },
+  {                    0u,  7338522384267208704u,         151877004481u },
+  {                    0u, 10935240458612244480u,         193397822095u },
+  {                    0u,  1732868046462124032u,         143592800573u },
+  {                    0u,   557965042578882560u,          61093938965u },
+  {                    0u, 10454684322475540480u,          21030247345u },
+  {                    0u, 13907115649320091648u,         177566749572u },
+  {                    0u,                    0u,         132753906250u },
+  {                    0u,                    0u,          74000000000u },
+  {  6343817245135589714u,                  199u,                    0u },
+  { 17549323075660516085u,         199343899021u,                    0u },
+  {  3948641822109421754u, 14876458284855834550u,                   10u },
+  {  1750739713693534543u, 10450704926982265198u,          10806454419u },
+  {   962163898128633415u,  5385653213018257806u,         147566533849u },
+  {  7967320249386531212u, 12735569669880147489u,         217291956845u },
+  {  3018466665533383224u,  3619762560577729456u,         109690396615u },
+  { 15076865731854945472u, 11123448126624084269u,         199196227721u },
+  {   691187172844604400u,  4072715118852885633u,         137603003331u },
+  { 13274492813370992341u, 18239087231420827283u,         195220782328u },
+  {  6364168818499152300u,   423431461216085297u,         248988742900u },
+  { 17599380787401914158u,  9360976716520160042u,         244022954265u },
+  {  3782323149461692814u, 11655927117263208920u,          25507459564u },
+  { 14470163442442237466u,  2646622721938364948u,         236631869075u },
+  {   476109872130437939u,  4496462484548171852u,         147143473705u },
+  { 16330548844673355700u, 13140258519803350063u,          41243753719u },
+  { 14089158961463739563u, 13089764333320627770u,         247712334841u },
+  { 13385510793074798805u,  6926286827289840501u,         249709597546u },
+  {  1549401308746959012u,  4985580225290866218u,         106375474761u },
+  {  4607384943843027435u, 10478790837359789693u,          73270268845u },
+  {  5157353797716093483u, 10041191967455692214u,         173568056389u },
+  { 10846828782671550129u,  5035461258013813797u,          69544334107u },
+  {  9915857350819131531u, 14208759661559249750u,          27272972901u },
+  {  1673544973504317923u, 12347272163241758840u,         101770258404u },
+  { 14780986291622785694u,  3372534174410277614u,         228669346965u },
+  {  8168111319515466401u, 17226704187274712984u,         149182825443u },
+  { 16345760387859734482u,  4250480179449852121u,         227933861505u },
+  {  3177475373321281805u,  4303723537755414374u,         129230418992u },
+  {  2558676822419554038u,  8680503847344854165u,          48233305320u },
+  {  8813474062662382873u,  8817608623911079652u,         232470571056u },
+  {  5426294560236228430u,  5692030448698539450u,          48478003521u },
+  {  9919177474128333040u, 16908836314686769809u,          65308565588u },
+  {  6197383943089627371u,  6073762347067727240u,          84916629853u },
+  { 13673239314867423997u, 10931066692585106200u,          93329259316u },
+  {  9309584098968723946u, 14466591364061539596u,          52592574312u },
+  {  4647101757759615504u,  4958077340960173341u,         104784235489u },
+  {  1405809295505096753u,  4076890037156765715u,         225268777911u },
+  { 11332704079573859112u, 14083973146609179058u,         183221008651u },
+  {  2960072434514044308u,  2565183738039805295u,          11763493714u },
+  {  3887266602785432801u,  1482420938751351224u,          82139058889u },
+  { 14545546084687849554u,  2151089495335413944u,         201080362200u },
+  {  4617763804182385321u,  3738604531753220913u,         216116610795u },
+  {  7857823815580249095u, 14195686514836005765u,         235202670157u },
+  { 10939326736548364798u, 17808833916231796970u,          77769549707u },
+  { 12262012446566951953u,  1302384553035657354u,         139965418821u },
+  { 12555024338687723023u,  1672033517974833698u,          69070602408u },
+  {  3332969632922829472u, 11673925532927662545u,         168090641118u },
+  { 15535060143360327680u,  3905334232240480709u,         222632844771u },
+  { 15794322927987458048u, 17411087320267472625u,         227211708592u },
+  { 10571474314433921024u, 16573305231063706617u,         176943856934u },
+  { 16679514427547975680u, 15481103236037148354u,          38898440676u },
+  { 16925653299565166592u,   907440704754420880u,         228839232288u },
+  { 16717361816799281152u,  3224970785139077759u,          32049192459u },
+  {                    0u, 10560826509734608144u,          11174826016u },
+  {                    0u,  4700940027512659968u,          32572503552u },
+  {                    0u,  9733694683502084096u,            254838469u },
+  {                    0u,  1995535635724632064u,         197527664646u },
+  {                    0u, 10629833226245373952u,           6108178203u },
+  {                    0u, 15729384648544878592u,          27576244413u },
+  {                    0u,  7205759403792793600u,         189852691650u },
+  {                    0u,                    0u,         194390625000u },
+  {                    0u,                    0u,         232000000000u },
+  {  9335385384027907407u,              3041746u,                    0u },
+  { 13237828406194798613u,     3041746506072255u,                    0u },
+  { 15667486867836528863u,  7535526066623007027u,               164893u },
+  { 17982325043592934313u, 11302146918409311588u,          29408501686u },
+  { 17159117626917379189u,  2480833299122194801u,         182612690612u },
+  {  8336208968408929657u, 11513226205589330558u,         180134486242u },
+  { 12767090573379150201u,  4073957068281936105u,         226624133243u },
+  { 14736070002412246709u,  3729887061093812886u,         123220849655u },
+  {  9697296975344560756u, 13616911779739451443u,         247202197582u },
+  {  7291706381199103298u, 13039053282195777666u,          78738174266u },
+  { 18098546597780825068u, 14490756113210417890u,          58706848494u },
+  {   132913902678533478u, 17432486112977557585u,         238785545462u },
+  {  1879347741692007580u, 14308820825344039837u,         246945016965u },
+  {  4056624629214083684u,  4190949538817536349u,         133775682731u },
+  { 14713227692042795499u, 13616552502810964397u,         171227191829u },
+  {  7366415124022528526u,  4898145803694965031u,          21738154790u },
+  {   825770353378039393u,  1399036321001644308u,          38265529016u },
+  { 10244023944395357795u, 17170331128243738540u,         184075841910u },
+  { 14302658294713551167u, 10641321388205367410u,         118930805515u },
+  { 14246653166206862817u,  6648873641312572851u,          11576867188u },
+  { 12404486258134291102u,  5988456964560374823u,         116360436162u },
+  {  8887442218637942533u,  9972593758348346915u,         194324634902u },
+  {  1186724038081863005u, 16709668921872818968u,          22540615390u },
+  {   211331772484951576u,  6094829131503407767u,         222905832967u },
+  {  6311919513247413649u,  4892016478899926334u,           7330401349u },
+  {  8131780018703965703u, 13150857244079031538u,          69265196744u },
+  {  2262544347226725725u, 12983943395318785894u,         200712909399u },
+  { 15318188749880522583u, 15341644584614757478u,          87703860981u },
+  {  1073117094162650652u,  7507635124856644772u,         245831672219u },
+  {  4447950380665871747u, 11619655367084544354u,         155406989715u },
+  {  5373227185066463609u, 11553116952478783009u,         147629902779u },
+  {  6739731406934274193u, 17392150014233193245u,         187626295724u },
+  { 12328812617001239444u,  8877887560294980515u,         172942830341u },
+  {  3246111484407310759u, 18404180619915609503u,           5481271248u },
+  {  3250825415176839770u, 10079413095288181976u,         208997692630u },
+  { 16146270540000862342u, 14102802966539105550u,         214546406078u },
+  { 15686773375425916830u, 13333966026135891399u,         190764514480u },
+  { 11920791905793880226u, 12344968670173516152u,         176722835746u },
+  {  1853290561644080707u, 10577007819804726752u,          34669222092u },
+  { 12157689141506159076u, 15337041354031088010u,         204573380742u },
+  { 18100318838862562546u, 14333607285614673616u,         134831422677u },
+  {  7171257882533475139u, 17171597563219696538u,         213777026407u },
+  { 14477550873015039462u,  2849642930482147564u,         103930874169u },
+  {  8109481182495403274u, 14791248423979435173u,          57154479452u },
+  { 14565395719337663965u, 13882371364576310127u,          92801835183u },
+  {  1860318978161305991u, 11735995808941329540u,         175752564859u },
+  { 16268646275151585618u, 11376996674339273181u,         123636209607u },
+  { 13759019338835519104u,  9849638057168043481u,         199616748225u },
+  { 17003783176010661888u, 18241520229279361964u,         193533949948u },
+  { 18357489540307877888u,  1865852368526961444u,         252988874793u },
+  {   905481790074912768u, 10601487369276448158u,          41101148059u },
+  {  3638882110636294144u, 15999931310312762170u,         155574707781u },
+  {  9011702854368362496u,  5773775867713013570u,          69867358014u },
+  { 11529215046068469760u, 17726239863982547534u,          62312997016u },
+  {                    0u,  9711316695888316992u,         152960941388u },
+  {                    0u, 17872002620723724288u,          76526451532u },
+  {                    0u,  7429694208660733952u,          76968843203u },
+  {                    0u,  1782821038871019520u,         195402764530u },
+  {                    0u,  3225250234313474048u,         242096646922u },
+  {                    0u, 10009250171830927360u,          10174841165u },
+  {                    0u,  1152921504606846976u,          77542602539u },
+  {                    0u,                    0u,          43062500000u },
+  {                    0u,                    0u,         160000000000u },
+  {  7625299565768063067u,                   46u,                    0u },
+  { 13889021769065194705u,          46413368317u,                    0u },
+  { 14498170692313014398u,  9519880170333822146u,                    2u },
+  {  1541631360972245751u,  2285186318012886800u,           2516073738u },
+  {  9903958882920799117u,  9706420951402272035u,          10123880198u },
+  { 15744148547788062576u,  2369632031840402142u,           6526186134u },
+  { 17936061801321712000u, 15599123897979399458u,         150128458009u },
+  {  9986394078324430610u, 17579576584023912658u,          25845630200u },
+  { 13849561248103430369u,  3480927339588501811u,         248952990756u },
+  { 12142378807953854930u,  3547346616671294635u,          36188701449u },
+  {  2513847703931031444u,  7705317123868384954u,           9192302045u },
+  {  1752183758129038045u,  4969425237478353909u,         221417706078u },
+  { 15824833342220556540u, 17043246700132217175u,          94269393081u },
+  {  8168747198299470695u, 17053788362783499470u,         185923916254u },
+  { 17414799840149357478u, 11102988228454224768u,         222924487719u },
+  {    83147520704167789u, 16944305387801685839u,          39601894197u },
+  {  2383542703041471269u, 11725142977459199276u,          53918552635u },
+  { 15540952725549257799u,  8175984171998533324u,          59635621274u },
+  {  6949835416232048690u,  1372352885142856895u,         154443220990u },
+  { 15398868937585367540u, 17975093466502888164u,         254074395398u },
+  { 14710915985268256079u,  6467823391459085653u,           6974431769u },
+  {  9665704836873335737u, 11319386883146885025u,          25350621408u },
+  {  2528789298740305993u,  9141999262922068637u,         224613625192u },
+  { 10562914675687726264u,  1587330393383478774u,         104495588773u },
+  { 17671658300096837111u,   884187548095712303u,         165086049353u },
+  {   356471401631698552u,   488841225726377268u,          73047931903u },
+  {  7450677157218003204u, 17462624199405856193u,         255026500135u },
+  {   317174560787152643u, 13183677579115583554u,          39946650754u },
+  {  7251937674440720374u, 11645015818917277779u,         130714688593u },
+  {  1252631516699038247u,  8760523002035971977u,          81631277572u },
+  { 10818009768860843867u, 10068817678491468042u,           4474908903u },
+  { 12330114194950162396u,  1273658177787418284u,         231545831700u },
+  { 15826681638261168822u,  3100019384328057661u,          20069045148u },
+  { 14240150078499211625u, 10363063568089458738u,         156168052387u },
+  { 10725372116242125421u, 13030756371481403666u,         163561782801u },
+  {  8434925524647833627u,  6538878900684195299u,          17706398718u },
+  { 17133902668520348241u,  8984884716779098868u,         254354473335u },
+  { 15093996047981365810u,  8728727397070363908u,         119487071576u },
+  {  6187974166976813153u,  6398650562917867005u,          88473185260u },
+  { 13946144707720259865u,  1190873176164938879u,         236346871542u },
+  {  9138079832881862582u,  4383628525805121795u,         246064557364u },
+  {  6600697628576225568u, 10189374699734119852u,          52237636978u },
+  {  8137099536646556597u,  5276291920541626391u,         114552367109u },
+  { 14169855543453903706u,  2692252373800386521u,           5286028358u },
+  {  3706403268650100765u, 11578684995169173920u,          70145947293u },
+  { 14736932266877982264u,  5799408022254132587u,         157627681771u },
+  { 18004795125138956004u, 15548569837712345290u,         235314386538u },
+  {  9068489270661002501u, 15763030464322902955u,         106842889659u },
+  {  7758835715193269217u, 13257749746581255500u,         187854515593u },
+  { 16943947811135261184u, 16152470009188707678u,         137718704053u },
+  {  6745843108403216384u, 13806790848493904003u,         181875627153u },
+  { 12338229654069444608u, 11981226523265951191u,         145748467631u },
+  { 14358176069683511296u,  5133628726077003713u,         175649503591u },
+  {  7083775185760813056u, 16183955741910833164u,         103278294570u },
+  {  5350276357316149248u, 13640425554331371454u,          42877333998u },
+  {  9223372036854775808u, 18108120906868035862u,         238739448950u },
+  {                    0u,  6324011669895037184u,         118981643201u },
+  {                    0u, 10444437689515769856u,         193342825359u },
+  {                    0u, 12324712543665782784u,         143566194101u },
+  {                    0u, 13928941951563857920u,         181668124005u },
+  {                    0u,  3975288688270639104u,         101755089456u },
+  {                    0u, 11141905478114607104u,          48215500831u },
+  {                    0u,  4611686018427387904u,          31604003906u },
+  {                    0u,                    0u,          66250000000u },
+  {                    0u,                    0u,         128000000000u },
+  { 14699116688460625612u,               708211u,                    0u },
+  {  6684126021499623499u,      708211796840712u,                    0u },
+  { 12614606079692508506u,  4398362855256705725u,                38392u },
+  { 15358270276683001489u,  2812083125569302717u,         248238435728u },
+  { 18077126190953408995u, 12868509142973100603u,         144152443331u },
+  {  7864121581925945659u,  8726243776748165726u,         195697603278u },
+  {  3518026639210514839u,   358304413426858117u,         206473050623u },
+  {  4698310163811252280u,  3180720351566429470u,         255019423721u },
+  {  6101155398200416338u, 14053818240400098784u,         233172427195u },
+  { 16049178580360033341u,  7340140541492429288u,         187761859013u },
+  {  3167464649127375997u,  1323571167904965058u,         197397909816u },
+  { 12778923935480989904u, 14463851737583396026u,          56071750936u },
+  { 11875553912612980379u, 15122784818916048486u,          24784086973u },
+  { 10628760849351697057u, 13557974621377508955u,         189819807807u },
+  {  3408944711673234310u, 17525172074563876264u,          63734979276u },
+  {  2102091496050506178u, 15148880683074215967u,         204950041481u },
+  {  6254611118630245760u,  6744828147558597936u,         137821222467u },
+  {  2647941151989776368u,  9799290779647971692u,          67365637866u },
+  {  8855437735410157458u, 11170890203898678105u,         234531220617u },
+  { 10184270603132180103u,  7068779781287527905u,         137605575171u },
+  { 12079083162535627164u, 14474741922505540911u,           3383199319u },
+  {  5952952868716156729u, 17107062680405191514u,          87784677331u },
+  { 11958907037815852320u,  2712598571300237005u,         211927375726u },
+  { 10101562137321697626u,  3767556054903418641u,         110147050263u },
+  { 13633527411279258327u, 18158239681706277628u,          23204239622u },
+  { 16555627393501768728u, 10531652712128330681u,           6984360145u },
+  {  6359650463500280706u,  9548395326934120567u,         209570922037u },
+  {  8093923611102181967u, 15875647850297719390u,          53517619547u },
+  {  2848827352928635726u,  8215825295203192574u,          91860620594u },
+  {  4686723431961561511u, 12747310908260543144u,          50445380781u },
+  {  6245554925867652609u,    77706528053613642u,         173691033109u },
+  { 17527406820792516033u,  6024737704056756146u,          21004212479u },
+  { 12119966834653692210u,  6819452388570089667u,         255326601685u },
+  { 11606502845877928061u, 13695926775373186254u,         213369683254u },
+  {   424311496652297090u,  3746531715392682132u,          54742457678u },
+  {  5977664048034127173u,  4717376233154528116u,          78203099891u },
+  {  6702712461535947028u,   385190957950313369u,         243255729478u },
+  { 11384349854055020018u, 12388374310648616082u,          70020881243u },
+  {  3782955013294836188u,  1078067332084407770u,          91671575117u },
+  {  3531805968821207061u,  3257295319358714850u,          77058442147u },
+  {  3867566898657193228u,  1545453099660723457u,         163176578333u },
+  { 12688734637425072080u,  7495477664653506341u,          29083779180u },
+  { 18435982764454619691u,  7225503732673614354u,         108406330658u },
+  {  4728836163964677692u,  3935478326103643956u,          34391695342u },
+  {  2120012917348838977u, 10082240682742686210u,         238213342707u },
+  {  9856965465824679831u, 10838712705567897138u,         243546559362u },
+  { 11217197671061248816u,  2142546572501643680u,         130587567793u },
+  {  3840562972677739189u,  7893042119150331392u,         177116147682u },
+  { 17104366978925258617u, 12084811642251302615u,         226427882670u },
+  { 16177877219841993444u, 15317234482572954775u,         174655118951u },
+  {  7338522384267208704u,  2283226355108359361u,         103830348945u },
+  { 10935240458612244480u, 13359725152575722127u,         145123773948u },
+  {  1732868046462124032u, 13126551011491594557u,         252724232151u },
+  {   557965042578882560u,  3598021288691861269u,         215711591756u },
+  { 10454684322475540480u, 16462621795896662961u,          76195049124u },
+  { 13907115649320091648u, 14682112756964627332u,         164892440515u },
+  {                    0u,  7174112100896070218u,         195795918927u },
+  {                    0u,  5023109019590616064u,          79388909396u },
+  {                    0u, 10765223023086141440u,          84272303285u },
+  {                    0u,  8228137177297453056u,         181583583909u },
+  {                    0u,  2891199497780592640u,         165446048210u },
+  {                    0u, 15294857653247803392u,         210156732238u },
+  {                    0u, 14303432416528695296u,          78829135894u },
+  {                    0u,                    0u,          22775390625u },
+  {                    0u,                    0u,         161000000000u },
+  { 14876458284855834550u,                   10u,                    0u },
+  { 10450704926982265198u,          10806454419u,                    0u },
+  {  5385653213018257806u, 10806454419566533849u,                    0u },
+  { 12735569669880147489u, 17118225092618494573u,            585819067u },
+  {  3619762560577729456u, 13385738875341807559u,         187927980841u },
+  { 11123448126624084269u,  8272682717439277193u,          41725642358u },
+  {  4072715118852885633u, 13402436483369350083u,         118448463028u },
+  { 18239087231420827283u, 10946328903241612536u,         180726547537u },
+  {   423431461216085297u, 16265808923426731252u,          81593401678u },
+  {  9360976716520160042u, 11080374459871185177u,          78881771268u },
+  { 11655927117263208920u,  1240761893433831916u,           4600668303u },
+  {  2646622721938364948u,   367264070493390483u,         143067261837u },
+  {  4496462484548171852u,  2863675693461092905u,         141019909425u },
+  { 13140258519803350063u,  7511929581752138999u,          49155240170u },
+  { 13089764333320627770u, 11154557789993845753u,         234407222518u },
+  {  6926286827289840501u,  8325416539745948522u,         246604689789u },
+  {  4985580225290866218u, 17745129874679852617u,         125451321734u },
+  { 10478790837359789693u,  1074820986392253357u,         134961965418u },
+  { 10041191967455692214u,  7820952682162838597u,         106058266162u },
+  {  5035461258013813797u,  8215518006273528603u,          50423974694u },
+  { 14208759661559249750u,  9680426791089900133u,          38445364123u },
+  { 12347272163241758840u, 16128495723604797412u,         155524776987u },
+  {  3372534174410277614u,  2264789053583348885u,          27874327505u },
+  { 17226704187274712984u, 11175458488686298083u,         209122774460u },
+  {  4250480179449852121u, 11026777810412287617u,         188605822818u },
+  {  4303723537755414374u, 16199890034895598640u,          98597762822u },
+  {  8680503847344854165u,  9094320719494763752u,           6878197798u },
+  {  8817608623911079652u,  1250835564687222832u,          38493004114u },
+  {  5692030448698539450u, 15362466642459337025u,          82067807931u },
+  { 16908836314686769809u,  7831109835595423828u,         187832800985u },
+  {  6073762347067727240u, 15426237284335022429u,         217424525314u },
+  { 10931066692585106200u, 15636308361455434548u,           2836257998u },
+  { 14466591364061539596u, 13967173875944980328u,         206847645974u },
+  {  4958077340960173341u, 18245979923595824097u,          22757162012u },
+  {  4076890037156765715u, 11335054479675278263u,          28989116553u },
+  { 14083973146609179058u, 11165339882630461707u,         137614474534u },
+  {  2565183738039805295u, 15944437408299395922u,          38605274287u },
+  {  1482420938751351224u, 15806416348777321161u,         175864349683u },
+  {  2151089495335413944u,  4201030477408556248u,         243856867547u },
+  {  3738604531753220913u,  9485474942554588907u,         219227738318u },
+  { 14195686514836005765u, 18238757647663230541u,         206514208626u },
+  { 17808833916231796970u,  4642199687824746379u,         114988725033u },
+  {  1302384553035657354u,  6134575894869364037u,          41251654149u },
+  {  1672033517974833698u, 11524208547121316008u,           5332556025u },
+  { 11673925532927662545u,  2734683241527878366u,         249624728597u },
+  {  3905334232240480709u, 10629223456178675171u,          21148247475u },
+  { 17411087320267472625u,  2788042336985254064u,         179576211358u },
+  { 16573305231063706617u, 17285498758066142502u,         158151140077u },
+  { 15481103236037148354u,  5525538192421886436u,         237937048765u },
+  {   907440704754420880u, 11414325503043801888u,         189299540025u },
+  {  3224970785139077759u,  7246608114685173259u,          57618771825u },
+  { 10560826509734608144u,  1007884269852184608u,         113392839413u },
+  {  4700940027512659968u, 13823717876510029312u,         245054637515u },
+  {  9733694683502084096u, 12487410768239429317u,         203749385247u },
+  {  1995535635724632064u,  3361062421598631942u,          31676943894u },
+  { 10629833226245373952u, 17853337379088328475u,          22182203558u },
+  { 15729384648544878592u, 11551561037491869885u,         166967831358u },
+  {  7205759403792793600u, 11480877996635204802u,          62626211378u },
+  {                    0u,  5527488381934471912u,          50622379643u },
+  {                    0u, 11143438404407726080u,         123299645745u },
+  {                    0u,  6472279730688098304u,          49604087006u },
+  {                    0u,  4561816853579563008u,         222350862987u },
+  {                    0u,  2888714464062865408u,         139247296587u },
+  {                    0u, 16258276129784201216u,          75156597524u },
+  {                    0u,   720575940379279360u,          20881362915u },
+  {                    0u,                    0u,         227039062500u },
+  {                    0u,                    0u,         228000000000u },
+  {  7535526066623007027u,               164893u,                    0u },
+  { 11302146918409311588u,      164893408501686u,                    0u },
+  {  2480833299122194801u, 16409970870640346804u,                 8938u },
+  { 11513226205589330558u,  7721907286269370594u,         234889586303u },
+  {  4073957068281936105u, 14300743897882155131u,         127418605432u },
+  {  3729887061093812886u,  2068482633821123575u,         120775244880u },
+  { 13616911779739451443u,  4922882895416406094u,          80112132668u },
+  { 13039053282195777666u,  9317632875623428410u,          60266870016u },
+  { 14490756113210417890u,  5693844901999766254u,            505109890u },
+  { 17432486112977557585u, 11569484900262102262u,         130308663950u },
+  { 14308820825344039837u,  3138170119352085637u,         142627183033u },
+  {  4190949538817536349u,   950584692575235243u,         185170120543u },
+  { 13616552502810964397u,  8136430299747162645u,          95051531299u },
+  {  4898145803694965031u,  6698711700804594470u,          35441076770u },
+  {  1399036321001644308u, 17401191571004302008u,          34363137888u },
+  { 17170331128243738540u,  4721732028538188150u,          96943320485u },
+  { 10641321388205367410u,  2984214103553086219u,         165255965606u },
+  {  6648873641312572851u, 13128675202005662068u,         166161774570u },
+  {  5988456964560374823u, 14638512997670672834u,         234711706908u },
+  {  9972593758348346915u, 12942085665769692438u,          28793555379u },
+  { 16709668921872818968u, 14131134357119205086u,         179701591869u },
+  {  6094829131503407767u,  8921946894736102919u,          61766050328u },
+  {  4892016478899926334u,  5601522560505809989u,          24483659710u },
+  { 13150857244079031538u,  8602606493507716808u,         190303659146u },
+  { 12983943395318785894u,  8576789731078566487u,         138466348232u },
+  { 15341644584614757478u, 17881118138842658549u,         200464948702u },
+  {  7507635124856644772u, 11624372674432704923u,         222969337356u },
+  { 11619655367084544354u,  6826284072848095635u,          12630158505u },
+  { 11553116952478783009u,  1646466632033733563u,         169370053601u },
+  { 17392150014233193245u, 17871081657060299180u,         225089255134u },
+  {  8877887560294980515u, 15910893124677544709u,         222968793277u },
+  { 18404180619915609503u, 11031217459450580944u,         189862531244u },
+  { 10079413095288181976u, 13554987390037243094u,         172598003496u },
+  { 14102802966539105550u, 15026714590903687870u,          40734817338u },
+  { 13333966026135891399u,  4406379654994689200u,          58814599830u },
+  { 12344968670173516152u, 13596329092861950242u,         150238870319u },
+  { 10577007819804726752u,   284812388227373260u,          47737058477u },
+  { 15337041354031088010u,  9285079159392309382u,         173015439710u },
+  { 14333607285614673616u, 15046108141952711893u,          94503345149u },
+  { 17171597563219696538u, 13795366909944958311u,         253815651156u },
+  {  2849642930482147564u, 12909920641180059961u,          84747848338u },
+  { 14791248423979435173u,  5333762939889788252u,         146699848200u },
+  { 13882371364576310127u,  6411331390005944495u,           8289143868u },
+  { 11735995808941329540u,  1447104583224217723u,          60347558971u },
+  { 11376996674339273181u, 11940049226167932871u,          59078447696u },
+  {  9849638057168043481u,  9772290783590472385u,          80647271365u },
+  { 18241520229279361964u, 16351989577831528444u,         197529756944u },
+  {  1865852368526961444u,  4376738725895725097u,          16886443131u },
+  { 10601487369276448158u, 13851276297739812763u,         123237263481u },
+  { 15999931310312762170u, 12641996203470333509u,         121750879192u },
+  {  5773775867713013570u,  7707081716407945022u,         216685323987u },
+  { 17726239863982547534u,   417638323657040024u,         211417801737u },
+  {  9711316695888316992u, 16438047707692449100u,           9022640218u },
+  { 17872002620723724288u, 14850108107043306316u,          90891108351u },
+  {  7429694208660733952u, 10423290807904720835u,         255805025973u },
+  {  1782821038871019520u, 16951162310302339314u,         181565047726u },
+  {  3225250234313474048u,  2752437506572397322u,         174918924350u },
+  { 10009250171830927360u,  3925815842962784589u,          62149209936u },
+  {  1152921504606846976u,  5274166674003605291u,          80212818903u },
+  {                    0u,  5538963350863452832u,         215285913148u },
+  {                    0u, 16900671634439028736u,          60300267804u },
+  {                    0u,  2326997710751662080u,          28916187245u },
+  {                    0u, 12327726161625874432u,         109126146798u },
+  {                    0u,  5756455743825903616u,         238668287374u },
+  {                    0u,  3018537650245074944u,         142312058091u },
+  {                    0u, 16717361816799281152u,         235163635253u },
+  {                    0u,                    0u,          53906250000u },
+  {                    0u,                    0u,          16000000000u },
+  {  2285186318012886800u,           2516073738u,                    0u },
+  {  9706420951402272035u,  2516073738123880198u,                    0u },
+  {  2369632031840402142u, 11997425759292732054u,            136396630u },
+  { 15599123897979399458u, 11491152661270395161u,          86650381753u },
+  { 17579576584023912658u, 18181063258234881272u,         185622936633u },
+  {  3480927339588501811u,  2466921813123869732u,          57985597414u },
+  {  3547346616671294635u,  8430880678232179465u,         230133732099u },
+  {  7705317123868384954u,  6738034873677997533u,           3457038957u },
+  {  4969425237478353909u,  7678250951042929246u,         109365269602u },
+  { 17043246700132217175u,  1853560606315563193u,          98416238818u },
+  { 17053788362783499470u, 14942676593409905118u,         226100481721u },
+  { 11102988228454224768u,  4909892170837638183u,         185810044121u },
+  { 16944305387801685839u, 16871149368312132405u,         217266165787u },
+  { 11725142977459199276u, 16096130589333770811u,          27914586839u },
+  {  8175984171998533324u, 12512479187631824282u,         215872572987u },
+  {  1372352885142856895u, 16980304980540557310u,          59678302855u },
+  { 17975093466502888164u,  8640919162749295366u,         135920504177u },
+  {  6467823391459085653u,  7862382415464063513u,         113468425166u },
+  { 11319386883146885025u, 14534157903009925344u,         206426220604u },
+  {  9141999262922068637u, 12627464554215107944u,          60787898278u },
+  {  1587330393383478774u,  2456849734836299173u,         166684536225u },
+  {   884187548095712303u, 18428252197697827913u,         161133186090u },
+  {   488841225726377268u,  7244734215936736255u,          42998997553u },
+  { 17462624199405856193u, 14756175050504770087u,          49392737828u },
+  { 13183677579115583554u,  6764116534566945922u,          36799933852u },
+  { 11645015818917277779u,  1588822142405565521u,         156366683492u },
+  {  8760523002035971977u, 17053265624843842052u,         100086130220u },
+  { 10068817678491468042u, 16996891591759999207u,          44924459381u },
+  {  1273658177787418284u,  8565556232370585876u,         117921403339u },
+  {  3100019384328057661u, 14464960359145886620u,         203464339733u },
+  { 10363063568089458738u,  5813189542048784035u,          21784147072u },
+  { 13030756371481403666u,  9739241026882027025u,         128315133636u },
+  {  6538878900684195299u, 18175068535675302910u,         196527965313u },
+  {  8984884716779098868u, 10562697212061761911u,         129985272439u },
+  {  8728727397070363908u,  4264834835660801368u,         119572604963u },
+  {  6398650562917867005u, 13019066443690126316u,          35231197159u },
+  {  1190873176164938879u,  1828040177823321846u,         231705765006u },
+  {  4383628525805121795u, 11240369830376975668u,         142099098256u },
+  { 10189374699734119852u,  8886938465302549874u,         144609341669u },
+  {  5276291920541626391u,  9985240313589688325u,         229481761899u },
+  {  2692252373800386521u,   722909126956573766u,         107541300962u },
+  { 11578684995169173920u,  5493363474638452381u,         226039188982u },
+  {  5799408022254132587u, 12410535279213120491u,         246297795830u },
+  { 15548569837712345290u, 10543108918366869098u,         246672776465u },
+  { 15763030464322902955u, 12953909016524823995u,          17571543079u },
+  { 13257749746581255500u, 16505942145872588169u,          39702232814u },
+  { 16152470009188707678u, 12428594380392015797u,         238894788916u },
+  { 13806790848493904003u,  7528259605829768337u,          52673755451u },
+  { 11981226523265951191u, 18147447600042811311u,          59408107770u },
+  {  5133628726077003713u, 12021069431116183911u,         250983775105u },
+  { 16183955741910833164u, 11819985069665662506u,         129651663479u },
+  { 13640425554331371454u, 10401877114068152814u,         119640762674u },
+  { 18108120906868035862u,  4611631138117837942u,          50563886888u },
+  {  6324011669895037184u, 17200813398607252417u,          40249997024u },
+  { 10444437689515769856u, 14100466137553658767u,         224932457962u },
+  { 12324712543665782784u, 17887776768825509301u,         234764387800u },
+  { 13928941951563857920u, 12632656857970087269u,         216969698321u },
+  {  3975288688270639104u,  8923681664054686256u,          17684817700u },
+  { 11141905478114607104u,  6213926103737837599u,          36483753752u },
+  {  4611686018427387904u,  1233118281776157762u,          24336857609u },
+  {                    0u,    30716279628678784u,           9066847476u },
+  {                    0u, 15775734650898546688u,         244001665132u },
+  {                    0u,   976806005729918976u,         108855204289u },
+  {                    0u, 12460098853279891456u,         193052952759u },
+  {                    0u,  5635665595421687808u,         183675463312u },
+  {                    0u,  1805943450575568896u,         144305510044u },
+  {                    0u, 11529215046068469760u,         156097900390u },
+  {                    0u,                    0u,         102625000000u },
+  {                    0u,                    0u,          64000000000u },
+  {  4398362855256705725u,                38392u,                    0u },
+  {  2812083125569302717u,       38392238435728u,                    0u },
+  { 12868509142973100603u,  4564018338575530435u,                 2081u },
+  {  8726243776748165726u, 16553437246451512014u,          33247415929u },
+  {   358304413426858117u,  4339777136957372927u,         121897363631u },
+  {  3180720351566429470u, 18439463366554654697u,         175235259789u },
+  { 14053818240400098784u,  1370067356680643003u,         141999605312u },
+  {  7340140541492429288u,  4210124040914115013u,          64074271500u },
+  {  1323571167904965058u, 10692225626142609720u,          12228231281u },
+  { 14463851737583396026u, 11592856673895384344u,         113579626712u },
+  { 15122784818916048486u, 10284479231227406269u,         216628450019u },
+  { 13557974621377508955u,  4961071383534266431u,         227557522736u },
+  { 17525172074563876264u, 10960611551445686988u,          48268940218u },
+  { 15148880683074215967u, 14616396723115619209u,         186594175942u },
+  {  6744828147558597936u,  1025604265437492803u,         198792356454u },
+  {  9799290779647971692u, 11711588454892179178u,         102055598118u },
+  { 11170890203898678105u,  5580373263251565705u,          38634886482u },
+  {  7068779781287527905u, 14109334653033148931u,          82302512640u },
+  { 14474741922505540911u,  2899414033769399895u,            764868564u },
+  { 17107062680405191514u, 13233457234892808147u,         212157177549u },
+  {  2712598571300237005u,  3287946691509034862u,         205717387154u },
+  {  3767556054903418641u,  5488480288717445911u,         146178239947u },
+  { 18158239681706277628u, 11687233053874362630u,         203297531112u },
+  { 10531652712128330681u,  6783772100089274577u,         232633566173u },
+  {  9548395326934120567u,  7898291058728402485u,         221367749022u },
+  { 15875647850297719390u,  4423684977486598491u,         158428167216u },
+  {  8215825295203192574u,  2750833684599526706u,          48239808443u },
+  { 12747310908260543144u, 15669689830489025709u,         187149122992u },
+  {    77706528053613642u, 15117307274214954517u,         176849455587u },
+  {  6024737704056756146u,  8148639818575698175u,         227819510869u },
+  {  6819452388570089667u, 13006484426078994901u,          85441738649u },
+  { 13695926775373186254u, 10287496057845513526u,         153705082933u },
+  {  3746531715392682132u, 14159876032966532430u,          53557686278u },
+  {  4717376233154528116u, 15742212196465548019u,           6767608417u },
+  {   385190957950313369u,  2892220461917134150u,          97853387033u },
+  { 12388374310648616082u,  7487151560715393883u,          25156787585u },
+  {  1078067332084407770u,  7245756744165177933u,         129405879299u },
+  {  3257295319358714850u,  3067122860671533987u,           3392793260u },
+  {  1545453099660723457u,  8135043905834122525u,         172166269063u },
+  {  7495477664653506341u, 14730019368921022572u,         135441001613u },
+  {  7225503732673614354u,   495969939682055458u,         141798515950u },
+  {  3935478326103643956u,  5617761407265775598u,         238026886584u },
+  { 10082240682742686210u,  2087044847072781811u,         184304539456u },
+  { 10838712705567897138u, 15929674232061203330u,          64113138927u },
+  {  2142546572501643680u,  8658086469608285873u,         239863549370u },
+  {  7893042119150331392u, 18369871790780313570u,         186469355807u },
+  { 12084811642251302615u,  3545648451947416750u,          31995832745u },
+  { 15317234482572954775u, 13347376792767929959u,         169192209987u },
+  {  2283226355108359361u, 14482164459838203025u,          67723562745u },
+  { 13359725152575722127u,  8899577765623565820u,         249785079708u },
+  { 13126551011491594557u,  7095320096604405719u,         156482447077u },
+  {  3598021288691861269u,  2968593824439315788u,         229384638073u },
+  { 16462621795896662961u, 12621408323612585636u,         121160927793u },
+  { 14682112756964627332u,  3954422936414648259u,          49684207916u },
+  {  7174112100896070218u, 17143730087577690191u,          44214369696u },
+  {  5023109019590616064u,  5033045529399041876u,         160929363470u },
+  { 10765223023086141440u, 15857648521994521781u,          14272841944u },
+  {  8228137177297453056u, 16655573486499109541u,         216859644848u },
+  {  2891199497780592640u, 16652154439190075858u,         176902900447u },
+  { 15294857653247803392u, 18016950600164130638u,         223902715100u },
+  { 14303432416528695296u,  2086292996072613910u,         220976700849u },
+  {                    0u, 17324462585194799521u,         177113098169u },
+  {                    0u, 11079151463184927232u,         185939160998u },
+  {                    0u,  5239846817488961536u,         166600602004u },
+  {                    0u,  2778806963520143360u,         148284052665u },
+  {                    0u,  6240890740138835968u,         185150639427u },
+  {                    0u, 17250651344549707776u,          67338319364u },
+  {                    0u,  4197354852709302272u,           4935159683u },
+  {                    0u,  9223372036854775808u,         131227539062u },
+  {                    0u,                    0u,         118500000000u },
+  { 17118225092618494573u,            585819067u,                    0u },
+  { 13385738875341807559u,   585819067927980841u,                    0u },
+  {  8272682717439277193u,  5654803392547571318u,             31757315u },
+  { 13402436483369350083u,  2931628102185393332u,           3306547506u },
+  { 10946328903241612536u, 15964697617980212305u,          50158923877u },
+  { 16265808923426731252u,   450380868305846606u,         101865447992u },
+  { 11080374459871185177u, 14631133530814566148u,          56024415195u },
+  {  1240761893433831916u,    31969822783742095u,         219793155338u },
+  {   367264070493390483u, 10437269029385743245u,          10001733087u },
+  {  2863675693461092905u, 15196146496377392433u,         223565805487u },
+  {  7511929581752138999u,  4409099735137480938u,         175823784752u },
+  { 11154557789993845753u, 10644987914903248118u,          48239017775u },
+  {  8325416539745948522u,  3154431617534062973u,          47577065951u },
+  { 17745129874679852617u, 11702056331247960454u,         223171002080u },
+  {  1074820986392253357u, 15575315065965259114u,         224634369744u },
+  {  7820952682162838597u, 10759747609480050226u,         208844339521u },
+  {  8215518006273528603u, 12538236653960743718u,          65583287086u },
+  {  9680426791089900133u, 17857942663978005403u,          46679699170u },
+  { 16128495723604797412u, 11443004154750813211u,         226968081011u },
+  {  2264789053583348885u,  4004313188770806737u,         115620326498u },
+  { 11175458488686298083u, 17134872954824183228u,          98217074252u },
+  { 11026777810412287617u,  2659553912986171234u,          76928883324u },
+  { 16199890034895598640u,  9501854300969137926u,         124144174706u },
+  {  9094320719494763752u, 14528169966301018150u,         114515096553u },
+  {  1250835564687222832u, 18172091996515901778u,         233787573671u },
+  { 15362466642459337025u,  1133541705604751035u,         167985111081u },
+  {  7831109835595423828u, 18280349987988641497u,          41061449418u },
+  { 15426237284335022429u,  9936015874712336386u,         202990979758u },
+  { 15636308361455434548u, 15876720399740689614u,         174538632499u },
+  { 13967173875944980328u,  8618117825152456982u,          51860678737u },
+  { 18245979923595824097u,  8085525680745921564u,          81467189103u },
+  { 11335054479675278263u,  8072355444669730953u,         111438317225u },
+  { 11165339882630461707u,  9395030504766848294u,         169437603265u },
+  { 15944437408299395922u,  3537903114058185903u,         193509305624u },
+  { 15806416348777321161u,  2126094743961928691u,          24191790112u },
+  {  4201030477408556248u,   289185362555601115u,          32115255827u },
+  {  9485474942554588907u, 16909937501450129614u,          19015676769u },
+  { 18238757647663230541u, 14449642060360499058u,          97916689548u },
+  {  4642199687824746379u, 12433818908498244393u,         140783316665u },
+  {  6134575894869364037u, 11884444034578008581u,         185674038673u },
+  { 11524208547121316008u,   988625838444140793u,         145644257002u },
+  {  2734683241527878366u,  1675370907158909973u,         234053593514u },
+  { 10629223456178675171u, 15920186275316934067u,         170090822038u },
+  {  2788042336985254064u,  5600921198503757726u,         150863035027u },
+  { 17285498758066142502u, 10457357161776341741u,         147303626546u },
+  {  5525538192421886436u, 12225356765775740093u,          50566894467u },
+  { 11414325503043801888u,  4486633318598164537u,         131662737918u },
+  {  7246608114685173259u, 10302486602879381361u,         254243220879u },
+  {  1007884269852184608u, 15536428611301239541u,         143558498917u },
+  { 13823717876510029312u, 12026126645955462603u,         101842231482u },
+  { 12487410768239429317u, 14877968141142123551u,         186651937631u },
+  {  3361062421598631942u,   734560801645383190u,          95806536269u },
+  { 17853337379088328475u, 15648943144911081638u,          77039820620u },
+  { 11551561037491869885u, 13664182862003235646u,          76848330907u },
+  { 11480877996635204802u,  3895127525902132786u,         155740736837u },
+  {  5527488381934471912u,  5249187334214137467u,          69211155286u },
+  { 11143438404407726080u, 10642260063359027505u,          86284559015u },
+  {  6472279730688098304u,   783598951897779422u,         167576918074u },
+  {  4561816853579563008u,  5538576558607624843u,          58042478984u },
+  {  2888714464062865408u, 15974581187564609611u,         136300246836u },
+  { 16258276129784201216u,  7474269406918257428u,          52865983781u },
+  {   720575940379279360u,  8045286838779138019u,          37405180956u },
+  {                    0u,  8184246376556341732u,          28436135873u },
+  {                    0u,  1493267152679331840u,         193443668885u },
+  {                    0u, 10179074811222818816u,         149080950174u },
+  {                    0u,  3892499202005008384u,         158551808751u },
+  {                    0u, 10341173215925108736u,         239211012804u },
+  {                    0u,  6230307872002015232u,         196560596123u },
+  {                    0u,  9295429630892703744u,         155337745666u },
+  {                    0u,                    0u,           2503906250u },
+  {                    0u,                    0u,         202000000000u },
+  { 16409970870640346804u,                 8938u,                    0u },
+  {  7721907286269370594u,        8938889586303u,                    0u },
+  { 14300743897882155131u, 10665454627995623288u,                  484u },
+  {  2068482633821123575u, 16803537892767562832u,         228578175453u },
+  {  4922882895416406094u,  8099123106849104444u,         221910921614u },
+  {  9317632875623428410u,  7077413686679401728u,         142439054343u },
+  {  5693844901999766254u, 13536636358372449666u,           7383667364u },
+  { 11569484900262102262u,  7280632235418610318u,         164733822527u },
+  {  3138170119352085637u,  6187823673116858809u,          63394683864u },
+  {   950584692575235243u,  8624343686231740255u,         216335442593u },
+  {  8136430299747162645u,   806211610822132771u,         161467526608u },
+  {  6698711700804594470u, 18388078233202190882u,         208043704818u },
+  { 17401191571004302008u,  7628864426595573600u,         242996819718u },
+  {  4721732028538188150u,  4530799784343874981u,           6413561569u },
+  {  2984214103553086219u,  8561580552078486438u,         225245615148u },
+  { 13128675202005662068u, 13349114951221999594u,          44464124211u },
+  { 14638512997670672834u, 10029144738508991772u,          51723656971u },
+  { 12942085665769692438u, 12601907197916268979u,          11543681025u },
+  { 14131134357119205086u,  1329580921391066941u,           1683150758u },
+  {  8921946894736102919u,  3198179786356761112u,         166072076726u },
+  {  5601522560505809989u, 11406753413634654142u,         182173373673u },
+  {  8602606493507716808u, 11131812960525182090u,         233618361341u },
+  {  8576789731078566487u, 14299636753645227208u,         253603456789u },
+  { 17881118138842658549u, 12964114684643663326u,          21775184861u },
+  { 11624372674432704923u,  5019257593846306316u,         221702786065u },
+  {  6826284072848095635u,  6929086798159998121u,          17272094499u },
+  {  1646466632033733563u, 18359765766933703649u,          35375626547u },
+  { 17871081657060299180u,  9993076234752063198u,          51995284896u },
+  { 15910893124677544709u,  3257189215046584509u,         160541725748u },
+  { 11031217459450580944u,  2905234736672690348u,          52176572581u },
+  { 13554987390037243094u, 12064985302079670056u,         165157493090u },
+  { 15026714590903687870u, 14315096064942799930u,          98654044163u },
+  {  4406379654994689200u, 11943971043551974038u,           3776022912u },
+  { 13596329092861950242u, 12472773152119929647u,         128647483967u },
+  {   284812388227373260u,  7791259796982183085u,          63676150387u },
+  {  9285079159392309382u, 16866829442051086686u,         115422365039u },
+  { 15046108141952711893u,  3702498393844653053u,         111914352656u },
+  { 13795366909944958311u,  2057239613841701716u,          16200712840u },
+  { 12909920641180059961u, 17201969976738286226u,         136111523182u },
+  {  5333762939889788252u, 18271566505443461640u,         110932520660u },
+  {  6411331390005944495u, 18368509115417119804u,         212990503604u },
+  {  1447104583224217723u,  7613923684154518587u,         180995758874u },
+  { 11940049226167932871u, 17984805084714865232u,          26412751629u },
+  {  9772290783590472385u,  4220802739051410373u,          13974958237u },
+  { 16351989577831528444u, 17812459042810815760u,         157228810174u },
+  {  4376738725895725097u, 10629526089664605307u,         190965615339u },
+  { 13851276297739812763u, 17437443267816548473u,         235576227763u },
+  { 12641996203470333509u, 12506371893701049304u,         179945285693u },
+  {  7707081716407945022u, 15737221540003030739u,          61677971778u },
+  {   417638323657040024u,  2358380859011605513u,          66853116489u },
+  { 16438047707692449100u, 10042972713837039706u,          73127848082u },
+  { 14850108107043306316u, 13424397272769642495u,         146544430641u },
+  { 10423290807904720835u,  6867102315755663029u,          49727738034u },
+  { 16951162310302339314u,  8690748404825506734u,         178372266362u },
+  {  2752437506572397322u,   956229930815387710u,         122471126415u },
+  {  3925815842962784589u,  7734449506297687888u,         143051837328u },
+  {  5274166674003605291u, 16332184961683848151u,         144419285347u },
+  {  5538963350863452832u, 15580777817612768828u,          99885369520u },
+  { 16900671634439028736u, 17404245271944696092u,         176844635657u },
+  {  2326997710751662080u, 13201420160494469229u,           9943486026u },
+  { 12327726161625874432u, 16511717657124068078u,          74715650420u },
+  {  5756455743825903616u, 14131292492116594062u,         116895102007u },
+  {  3018537650245074944u, 18429136031865875691u,          55766058900u },
+  { 16717361816799281152u,  2563978348305862197u,         148999045466u },
+  {                    0u, 14239974392147482896u,          90138993544u },
+  {                    0u, 11164201396098998272u,         136771950558u },
+  {                    0u,  7116971104932986880u,         222605212570u },
+  {                    0u, 12437629862867369984u,         154385811776u },
+  {                    0u, 16501893821638901760u,          64674245265u },
+  {                    0u, 10649324268870959104u,         145894569456u },
+  {                    0u,  7205759403792793600u,         240577301025u },
+  {                    0u,                    0u,          33390625000u },
+  {                    0u,                    0u,         232000000000u },
+  { 11997425759292732054u,            136396630u,                    0u },
+  { 11491152661270395161u,   136396630650381753u,                    0u },
+  { 18181063258234881272u,  3016823727048309817u,              7394076u },
+  {  2466921813123869732u, 17405973192644624358u,          28163542341u },
+  {  8430880678232179465u,  8937219978302591747u,          69943579697u },
+  {  6738034873677997533u, 15178463196824222317u,          49484487665u },
+  {  7678250951042929246u, 11979404627460330594u,         241822826138u },
+  {  1853560606315563193u,  2006448052689740002u,         154649404826u },
+  { 14942676593409905118u, 16330465320863239865u,         154108769766u },
+  {  4909892170837638183u, 17136208883957646553u,         230885276298u },
+  { 16871149368312132405u,   140455118208931867u,         138928955745u },
+  { 16096130589333770811u,  3964972929179372247u,          97007614087u },
+  { 12512479187631824282u,  3378050330022776379u,         135214941613u },
+  { 16980304980540557310u,  6065353437512901255u,         173183124475u },
+  {  8640919162749295366u, 12768753059854699889u,         251328803468u },
+  {  7862382415464063513u,  6848720690951013326u,         140692195490u },
+  { 14534157903009925344u, 10953228058585475132u,         162371269892u },
+  { 12627464554215107944u, 15539127852083296166u,           4593775682u },
+  {  2456849734836299173u, 14534853647735598497u,          66842377808u },
+  { 18428252197697827913u,  1506909603576368170u,          80787935995u },
+  {  7244734215936736255u,  5475702579938239025u,         251081689733u },
+  { 14756175050504770087u, 12039747373985783332u,         133296838431u },
+  {  6764116534566945922u, 17572399137760898460u,          31652676012u },
+  {  1588822142405565521u,   869552790852091236u,         172952601666u },
+  { 17053265624843842052u,  4549585778048181804u,          66047138551u },
+  { 16996891591759999207u,  4121918231767210357u,         247246633539u },
+  {  8565556232370585876u,  1558397953312543179u,          67223449635u },
+  { 14464960359145886620u,  6067524298738069781u,          35084480922u },
+  {  5813189542048784035u,  5811095224555517056u,         154328921151u },
+  {  9739241026882027025u,  6440894514158997188u,          63315020103u },
+  { 18175068535675302910u,  4612748874388784257u,          71349161591u },
+  { 10562697212061761911u,  9908101430749813367u,         119250057617u },
+  {  4264834835660801368u, 15150017990912190499u,         145537119254u },
+  { 13019066443690126316u, 17470426264690059239u,          22821284120u },
+  {  1828040177823321846u,  9615161096851907726u,          24947073705u },
+  { 11240369830376975668u,  9227932132124142224u,         169521238927u },
+  {  8886938465302549874u,  4794113194321211621u,         143500247203u },
+  {  9985240313589688325u,   391512698859146347u,         163259889397u },
+  {   722909126956573766u, 17209658878068655842u,         245021223945u },
+  {  5493363474638452381u,  3077364726606876150u,           9932937477u },
+  { 12410535279213120491u,  1952989567673965814u,           5166824276u },
+  { 10543108918366869098u, 11172860676923186449u,          84105871776u },
+  { 12953909016524823995u, 17338078544784947239u,         160605681990u },
+  { 16505942145872588169u,  4593380466519703278u,          70939899121u },
+  { 12428594380392015797u,   786884753602720052u,         241249007654u },
+  {  7528259605829768337u, 17848875822468020539u,          38042657107u },
+  { 18147447600042811311u,  2899664567187130618u,          83967589497u },
+  { 12021069431116183911u,  2973178834961857409u,         121157191131u },
+  { 11819985069665662506u, 11117453141176836727u,         219161176347u },
+  { 10401877114068152814u,  7535238370146462002u,          27602678342u },
+  {  4611631138117837942u, 10246175467290865448u,          70408486090u },
+  { 17200813398607252417u,  1203128834127050464u,         202555446285u },
+  { 14100466137553658767u, 14518048959078919658u,          13065221744u },
+  { 17887776768825509301u,  1553474987376920024u,         112787025011u },
+  { 12632656857970087269u, 14956572380830948369u,         115084214047u },
+  {  8923681664054686256u,  7594162606042048292u,          31810797413u },
+  {  6213926103737837599u, 14461296147288811288u,         101411680379u },
+  {  1233118281776157762u, 18305427728131488265u,         123783948434u },
+  {    30716279628678784u, 10253208939347909876u,         146992339225u },
+  { 15775734650898546688u,  6446028915490812012u,          25555827570u },
+  {   976806005729918976u, 12986063676957432257u,         114349439927u },
+  { 12460098853279891456u,  9769714697972762807u,         183703975922u },
+  {  5635665595421687808u,    97429465146664592u,         242529617295u },
+  {  1805943450575568896u, 16395571728207795868u,         143005281661u },
+  { 11529215046068469760u,  6331668478323650406u,         125888805724u },
+  {                    0u, 18129911846294207040u,          92343240435u },
+  {                    0u,  9890094564876124160u,         243982824490u },
+  {                    0u, 12290856656987750400u,          42536143100u },
+  {                    0u,  8498454992640802816u,         252666288674u },
+  {                    0u,  5341660584200896512u,          34460702168u },
+  {                    0u,  9288674231451648000u,         216289572000u },
+  {                    0u,  1152921504606846976u,         160503540039u },
+  {                    0u,                    0u,          71062500000u },
+  {                    0u,                    0u,         160000000000u },
+  {  4564018338575530435u,                 2081u,                    0u },
+  { 16553437246451512014u,        2081247415929u,                    0u },
+  {  4339777136957372927u, 15212079674427582639u,                  112u },
+  { 18439463366554654697u, 10179808126814248333u,         112824648491u },
+  {  1370067356680643003u,  6066766544199222848u,          43551848504u },
+  {  4210124040914115013u,  6625308131806923532u,          56328880073u },
+  { 10692225626142609720u,  9122786786400665713u,         201359158673u },
+  { 11592856673895384344u, 11932880778639151320u,         145494547262u },
+  { 10284479231227406269u,  3884040911779255011u,          62646882763u },
+  {  4961071383534266431u, 13441817515637357872u,         203210554279u },
+  { 10960611551445686988u, 11628577856022352826u,         167728682387u },
+  { 14616396723115619209u, 13296656925520243654u,         147630386468u },
+  {  1025604265437492803u,  5020720704545399398u,          36720813216u },
+  { 11711588454892179178u, 14121973606499014694u,         160272173814u },
+  {  5580373263251565705u,  3642481034345420114u,         246765553723u },
+  { 14109334653033148931u,  9845536238569696768u,          59197459292u },
+  {  2899414033769399895u, 17655403572195686356u,          92533727588u },
+  { 13233457234892808147u,  8377495365136654029u,         100957101345u },
+  {  3287946691509034862u, 13713682649609025426u,          33454144933u },
+  {  5488480288717445911u,  1367709905452854731u,         165743420226u },
+  { 11687233053874362630u,  9981467701727208680u,          66074143702u },
+  {  6783772100089274577u,  6277920117543306205u,         214541096448u },
+  {  7898291058728402485u,  9344111460418701726u,            340326731u },
+  {  4423684977486598491u,  4918507011364617264u,          75506545297u },
+  {  2750833684599526706u,  6554777203830755259u,         145266632799u },
+  { 15669689830489025709u,  4198262173120265648u,          95355335184u },
+  { 15117307274214954517u,  8080325935698446819u,          16227588248u },
+  {  8148639818575698175u, 12797633874200091733u,         152438035346u },
+  { 13006484426078994901u,  8376502502208665497u,         146693761122u },
+  { 10287496057845513526u,  9891973386793349173u,          98454091110u },
+  { 14159876032966532430u, 14877430279003795462u,         102536244951u },
+  { 15742212196465548019u,  8759933935842067041u,         215806507111u },
+  {  2892220461917134150u,  3753418510388703513u,         103474876970u },
+  {  7487151560715393883u,  2961383332545305985u,          42203473225u },
+  {  7245756744165177933u,  2497674184068629507u,          73160536912u },
+  {  3067122860671533987u, 15244544070742305452u,          80135399188u },
+  {  8135043905834122525u,    45953573565810823u,          20826408390u },
+  { 14730019368921022572u,  3960077421351906445u,         198002491148u },
+  {   495969939682055458u,  3173330011013883118u,          12214676227u },
+  {  5617761407265775598u, 11026266219545759160u,           3172026564u },
+  {  2087044847072781811u,  8886757764964685632u,         196597735089u },
+  { 15929674232061203330u, 13952322129918090479u,         177481752103u },
+  {  8658086469608285873u,  4127250666614902202u,          39756356898u },
+  { 18369871790780313570u, 17649958504065306911u,          34223738706u },
+  {  3545648451947416750u, 13269305359002216873u,          82956806167u },
+  { 13347376792767929959u, 16236593433831947843u,          23719330484u },
+  { 14482164459838203025u, 13580930396682424057u,         180880187493u },
+  {  8899577765623565820u,   421976357197961116u,         101736223712u },
+  {  7095320096604405719u,  2962130818798626533u,         224022875384u },
+  {  2968593824439315788u,  8234383947306356345u,         248160577433u },
+  { 12621408323612585636u,  4380469931801381425u,         153446386848u },
+  {  3954422936414648259u, 15279887469027055916u,         160237465750u },
+  { 17143730087577690191u,  8534542821713755552u,         150828324359u },
+  {  5033045529399041876u,  7814613482565088782u,           7462658493u },
+  { 15857648521994521781u, 13771954404705323224u,         189423631045u },
+  { 16655573486499109541u,  4568173274762548144u,         197746579144u },
+  { 16652154439190075858u,  8105292616250821343u,         200247641169u },
+  { 18016950600164130638u,  2923678426777275612u,          81439388793u },
+  {  2086292996072613910u,  1808633176918384049u,         121158492925u },
+  { 17324462585194799521u, 18118642609460438969u,         253098046200u },
+  { 11079151463184927232u, 18138164175864360870u,         248982213583u },
+  {  5239846817488961536u,  4031433690465792404u,         207983271850u },
+  {  2778806963520143360u,  5012226396942308537u,         170218544458u },
+  {  6240890740138835968u,  7889712298793536835u,          74271713337u },
+  { 17250651344549707776u, 13500762396543628804u,          57427702160u },
+  {  4197354852709302272u,   501020624068841347u,         144731877796u },
+  {  9223372036854775808u,  8370653768288261750u,         164027160382u },
+  {                    0u,   647579990023635200u,          62453774050u },
+  {                    0u, 11106569307181154304u,         226035105381u },
+  {                    0u, 10797461613892861952u,         101602088328u },
+  {                    0u, 17627230675448889344u,         136585331566u },
+  {                    0u, 12197735707942322176u,         110955574089u },
+  {                    0u, 12871287735024877568u,          73661240577u },
+  {                    0u,  4611686018427387904u,           1697753906u },
+  {                    0u,                    0u,          50250000000u },
+  {                    0u,                    0u,         128000000000u },
+  {  5654803392547571318u,             31757315u,                    0u },
+  {  2931628102185393332u,    31757315306547506u,                    0u },
+  { 15964697617980212305u,  9451803574512021605u,              1721567u },
+  {   450380868305846606u,  8662766454758138424u,         223512383298u },
+  { 14631133530814566148u,  9207992007314947035u,          66469609510u },
+  {    31969822783742095u, 17118602861291201802u,          38499166246u },
+  { 10437269029385743245u, 11186560605745599967u,          38928001320u },
+  { 15196146496377392433u, 10505549821532796847u,          40606424665u },
+  {  4409099735137480938u, 18133667530488679216u,          89569506996u },
+  { 10644987914903248118u, 10778135771244330799u,         180983028086u },
+  {  3154431617534062973u, 17087985777033767391u,         118584283910u },
+  { 11702056331247960454u,  2639185991757283040u,           6926341565u },
+  { 15575315065965259114u,  5401720287293896400u,         189143070559u },
+  { 10759747609480050226u,  9816495392633895233u,          95292827843u },
+  { 12538236653960743718u, 10042051500090034990u,         195532153281u },
+  { 17857942663978005403u, 11629689537856384738u,         193544380702u },
+  { 11443004154750813211u,  2099086731766010483u,          30630446733u },
+  {  4004313188770806737u, 13665537898516458594u,         141113791719u },
+  { 17134872954824183228u, 16375672064669490764u,         231740810293u },
+  {  2659553912986171234u,  7770550512184564348u,          53887726961u },
+  {  9501854300969137926u,  6197048880720627314u,         113421242387u },
+  { 14528169966301018150u, 17963594118523106281u,          19335942692u },
+  { 18172091996515901778u,  8255454642407818663u,          36973808388u },
+  {  1133541705604751035u, 16744201957549498409u,           4447529092u },
+  { 18280349987988641497u, 17442505417202859722u,         132907705006u },
+  {  9936015874712336386u,  6383975767786687150u,         174945560113u },
+  { 15876720399740689614u, 15245442964998335795u,          49346076019u },
+  {  8618117825152456982u,  2910016124519524433u,         115826457119u },
+  {  8085525680745921564u,  3847913871169988463u,          31157752290u },
+  {  8072355444669730953u, 17210451512590059177u,         226208595828u },
+  {  9395030504766848294u, 17899408909991454145u,         116932980445u },
+  {  3537903114058185903u,  5920601932753251608u,         221970328901u },
+  {  2126094743961928691u, 16521781895108979744u,          69320956473u },
+  {   289185362555601115u,  3697493405554698771u,          57895647591u },
+  { 16909937501450129614u,  2816108280295732065u,         103200441519u },
+  { 14449642060360499058u, 14251078772056398988u,         175152661535u },
+  { 12433818908498244393u,  4543066550096031417u,          31772552528u },
+  { 11884444034578008581u,  3099369389734296977u,          80246280131u },
+  {   988625838444140793u,  5243484113636490986u,         195168017151u },
+  {  1675370907158909973u,  6823370511605197226u,         255284249843u },
+  { 15920186275316934067u, 11396290277624641942u,         243369895656u },
+  {  5600921198503757726u, 15934361408437566099u,         232617794133u },
+  { 10457357161776341741u, 14939272230935131954u,          85863803462u },
+  { 12225356765775740093u,  7500666177940329347u,          70809859570u },
+  {  4486633318598164537u,  4806714453065462270u,         242406611928u },
+  { 10302486602879381361u, 11557851247268441487u,         216260572512u },
+  { 15536428611301239541u, 10655523157206817381u,          96626552371u },
+  { 12026126645955462603u, 14769600176490881210u,          51577637067u },
+  { 14877968141142123551u, 16688495540925795167u,         203800661629u },
+  {   734560801645383190u,   909793965395524173u,         125904685156u },
+  { 15648943144911081638u, 12724590949761703756u,         100049320029u },
+  { 13664182862003235646u, 10810739657314826395u,          93689801457u },
+  {  3895127525902132786u,  2431218615388671301u,         241586051371u },
+  {  5249187334214137467u,  4235001167959059286u,          43131796625u },
+  { 10642260063359027505u,  6253317787396334247u,         145229579873u },
+  {   783598951897779422u,  9534525563070371898u,          97338993036u },
+  {  5538576558607624843u,  8392783992374030728u,         140516867666u },
+  { 15974581187564609611u, 16356257019231647540u,          82454973731u },
+  {  7474269406918257428u, 12896334001521091877u,          35886674469u },
+  {  8045286838779138019u,  1427636373320877084u,          37699111667u },
+  {  8184246376556341732u, 16116755731295043521u,         243077392322u },
+  {  1493267152679331840u, 15945633911163986837u,         194873691078u },
+  { 10179074811222818816u,  7510154241072743838u,         198864414546u },
+  {  3892499202005008384u,  3571560509790395119u,          82407126277u },
+  { 10341173215925108736u,  3576991649007035076u,           5193614683u },
+  {  6230307872002015232u, 15509961892750732443u,          91193909105u },
+  {  9295429630892703744u, 17789791359353349378u,         113840796718u },
+  {                    0u, 18331227331079738314u,          46964386521u },
+  {                    0u, 15386712883100476416u,         217993737824u },
+  {                    0u, 14082462055028752384u,          96834115376u },
+  {                    0u, 12919043128765186048u,          48763411797u },
+  {                    0u,  6125373368465096704u,          85700342731u },
+  {                    0u, 12335992698065387520u,         203332057155u },
+  {                    0u,  2774217370460225536u,          67668735504u },
+  {                    0u,                    0u,          16150390625u },
+  {                    0u,                    0u,          97000000000u },
+  { 10665454627995623288u,                  484u,                    0u },
+  { 16803537892767562832u,         484578175453u,                    0u },
+  {  8099123106849104444u,  4962829537462579598u,                   26u },
+  {  7077413686679401728u,  5711259460785241095u,          26269035528u },
+  { 13536636358372449666u, 13845894607204897444u,           8309607995u },
+  {  7280632235418610318u, 12116633056637003327u,          59750587450u },
+  {  6187823673116858809u,  2965791047992089560u,          58656843994u },
+  {  8624343686231740255u, 16021997451315962529u,         218160775854u },
+  {   806211610822132771u,  3942052271663803856u,         174868554222u },
+  { 18388078233202190882u, 15669876414782439922u,         238213699081u },
+  {  7628864426595573600u, 10594415915406145286u,           9849465702u },
+  {  4530799784343874981u, 10789820553031921377u,         102574324437u },
+  {  8561580552078486438u,  3989990218583987244u,         213584917344u },
+  { 13349114951221999594u,  2937341169808224563u,          96216297803u },
+  { 10029144738508991772u, 16267436558584536843u,          75159233583u },
+  { 12601907197916268979u, 16221580362814625793u,          47881859502u },
+  {  1329580921391066941u,  9695437602320209830u,         174879373633u },
+  {  3198179786356761112u, 10729753156793715126u,          65525590725u },
+  { 11406753413634654142u,  2609241432056861929u,         197581661084u },
+  { 11131812960525182090u,  8462663743997037565u,         156141447261u },
+  { 14299636753645227208u, 14993422143908194069u,          93458761920u },
+  { 12964114684643663326u,  1307443894537745373u,         192812795043u },
+  {  5019257593846306316u, 10017257439419829265u,         163070876675u },
+  {  6929086798159998121u, 16754772009970777891u,           3543036613u },
+  { 18359765766933703649u, 11722573031602862387u,         197908278010u },
+  {  9993076234752063198u,  7363764277467092384u,         250635481957u },
+  {  3257189215046584509u,  6733958494847390772u,         101399190461u },
+  {  2905234736672690348u,  8799796600227451045u,         189365048621u },
+  { 12064985302079670056u, 10512023194742249826u,          45477037929u },
+  { 14315096064942799930u,  4572542132337197059u,         105569857919u },
+  { 11943971043551974038u, 12600500455757416832u,         127247878005u },
+  { 12472773152119929647u,  7873789864743195199u,         117683074498u },
+  {  7791259796982183085u, 15724851676325671539u,         194426839003u },
+  { 16866829442051086686u,  8748017220462413167u,         219852445917u },
+  {  3702498393844653053u, 14172589522760466448u,         221474230963u },
+  {  2057239613841701716u,  9520545591489413768u,         179768297617u },
+  { 17201969976738286226u, 12488551088392570222u,         145516109810u },
+  { 18271566505443461640u,  1135798823651241684u,         242677005711u },
+  { 18368509115417119804u, 11168725610120161972u,         143061571777u },
+  {  7613923684154518587u,  9580104948718508826u,         193605457828u },
+  { 17984805084714865232u, 16638722716909738765u,         164519338529u },
+  {  4220802739051410373u, 15732724012348272797u,          33901986965u },
+  { 17812459042810815760u, 12269722190021214142u,         149852872677u },
+  { 10629526089664605307u, 13110655916311972587u,         229665142972u },
+  { 17437443267816548473u,  6618112997062866867u,         188710730081u },
+  { 12506371893701049304u,  8457936459015989309u,          97358768624u },
+  { 15737221540003030739u,  3329167139937134914u,         240458505654u },
+  {  2358380859011605513u,  5245511557216705097u,         182180474512u },
+  { 10042972713837039706u,  5655931353280440466u,         144284359751u },
+  { 13424397272769642495u,   604622132328697393u,          71306608653u },
+  {  6867102315755663029u,  8673282619234652338u,          13032776631u },
+  {  8690748404825506734u, 16929477433058445690u,         183470179592u },
+  {   956229930815387710u, 11036952409253549455u,           8917748810u },
+  {  7734449506297687888u, 18199392190170386320u,          74598314388u },
+  { 16332184961683848151u,  9683116091880335715u,         148986591027u },
+  { 15580777817612768828u,  2993913337608915120u,          51524922775u },
+  { 17404245271944696092u,  4490779842162392585u,         151162300367u },
+  { 13201420160494469229u,   946849923353644618u,         207243445663u },
+  { 16511717657124068078u,  3613491058474899828u,         159051328837u },
+  { 14131292492116594062u, 14624054199004410935u,          69195887742u },
+  { 18429136031865875691u, 12088470271991908244u,         126792771566u },
+  {  2563978348305862197u, 10071980927725011290u,         238655317286u },
+  { 14239974392147482896u,  2833441711428854664u,          38546003180u },
+  { 11164201396098998272u, 17655572411864340446u,         236153601182u },
+  {  7116971104932986880u,  4997642792058747802u,         158957110498u },
+  { 12437629862867369984u, 11489200787635734848u,         226270922758u },
+  { 16501893821638901760u, 12983586226429536913u,           6622830822u },
+  { 10649324268870959104u, 12311150768725063152u,         230703841619u },
+  {  7205759403792793600u,  8530052476845967905u,          83667388820u },
+  {                    0u,  6282736361499820264u,         148462415071u },
+  {                    0u, 11337164765929082880u,         223340587820u },
+  {                    0u,  8343856200414134272u,          44614588933u },
+  {                    0u, 17889330377156198400u,           5452321350u },
+  {                    0u, 17730714064155312128u,          70969782542u },
+  {                    0u,  7449235258647511040u,          14961183935u },
+  {                    0u,  9943947977234055168u,         191403823852u },
+  {                    0u,                    0u,         236539062500u },
+  {                    0u,                    0u,         228000000000u },
+  {  3016823727048309817u,              7394076u,                    0u },
+  { 17405973192644624358u,     7394076163542341u,                    0u },
+  {  8937219978302591747u, 12396245121240683569u,               400833u },
+  { 15178463196824222317u, 10248996648596888561u,         193672001794u },
+  { 11979404627460330594u, 11257495103713935002u,           2555599221u },
+  {  2006448052689740002u,  7555396579247433114u,         117610270032u },
+  { 16330465320863239865u,  4805022328730367462u,          80409578869u },
+  { 17136208883957646553u,  7056637817080232586u,         117260480782u },
+  {   140455118208931867u, 10811411483818434913u,          14382541102u },
+  {  3964972929179372247u, 16962406704495245447u,          46586087790u },
+  {  3378050330022776379u, 18074517319117194669u,         110919533909u },
+  {  6065353437512901255u,  3702019776117654523u,          85979821547u },
+  { 12768753059854699889u,  3551977551381082764u,         235200686894u },
+  {  6848720690951013326u, 16442608985936005282u,          46192553088u },
+  { 10953228058585475132u,  3580046275479139588u,         128891355619u },
+  { 15539127852083296166u,  8737412692712715330u,         227194074697u },
+  { 14534853647735598497u,  3082033243045084752u,          73473656091u },
+  {  1506909603576368170u, 16401023756841128699u,          27167077356u },
+  {  5475702579938239025u,  7520296082779572869u,         236889101279u },
+  { 12039747373985783332u,  9854104766152464159u,         223407676067u },
+  { 17572399137760898460u, 14169188802648310188u,         163534192089u },
+  {   869552790852091236u,  2018609909210367042u,         217768113264u },
+  {  4549585778048181804u,  8270271948267674359u,         112109429062u },
+  {  4121918231767210357u, 12320338602894572099u,          70448332340u },
+  {  1558397953312543179u, 17538536685990080547u,          52667886893u },
+  {  6067524298738069781u, 15833914616956760474u,          45950765978u },
+  {  5811095224555517056u,  6137696141415969855u,         154858358231u },
+  {  6440894514158997188u,  9757490468419438919u,         215332725174u },
+  {  4612748874388784257u,  3566639201356598903u,         182528954618u },
+  {  9908101430749813367u,  9760900035773954449u,         250193347898u },
+  { 15150017990912190499u,  3873778773990716438u,          58529139451u },
+  { 17470426264690059239u,  2295668377270167832u,         251209997968u },
+  {  9615161096851907726u,  1791721710912807593u,         144124448432u },
+  {  9227932132124142224u, 10571009006922683279u,         176097129428u },
+  {  4794113194321211621u,  9840791932778184867u,         212573055546u },
+  {   391512698859146347u, 11525464956561274613u,          58533470399u },
+  { 17209658878068655842u,  4435781488897895433u,         191624796707u },
+  {  3077364726606876150u,  6395563367070996741u,          35240464196u },
+  {  1952989567673965814u, 15538690795135662932u,          68346704184u },
+  { 11172860676923186449u, 16294558813563371936u,          56842354115u },
+  { 17338078544784947239u,  4942096228426070342u,         195883329803u },
+  {  4593380466519703278u,  6910116424372647153u,          11267911573u },
+  {   786884753602720052u, 17923400669760829478u,         149374598161u },
+  { 17848875822468020539u,  4134686917293039955u,          17971629497u },
+  {  2899664567187130618u, 16857102463116098681u,         185224141826u },
+  {  2973178834961857409u, 11364321508775167451u,           2913825355u },
+  { 11117453141176836727u,  7966947780972783899u,          75616061103u },
+  {  7535238370146462002u, 11261055695926686278u,         175431889104u },
+  { 10246175467290865448u,  9227040437353594058u,         208610463052u },
+  {  1203128834127050464u,  7185344074282882061u,          76500198864u },
+  { 14518048959078919658u, 14197856148610578032u,         208389518282u },
+  {  1553474987376920024u,   885688687260429427u,         202769667324u },
+  { 14956572380830948369u, 17407816160380305183u,         252048013279u },
+  {  7594162606042048292u, 17812728703806357349u,         223943679604u },
+  { 14461296147288811288u, 17120198191964319867u,         116965629957u },
+  { 18305427728131488265u, 12091952048375408786u,           5928087803u },
+  { 10253208939347909876u,   405056939269888281u,         251655506034u },
+  {  6446028915490812012u, 12485440679452408690u,         114021958180u },
+  { 12986063676957432257u,  8394369900823444407u,          36676837095u },
+  {  9769714697972762807u,  2877421667354294258u,         231455059704u },
+  {    97429465146664592u,  2676980714750756239u,         248155985341u },
+  { 16395571728207795868u,  6119309228579057021u,         189145119415u },
+  {  6331668478323650406u, 18203256146533333852u,         183331728417u },
+  { 18129911846294207040u,   351919978865493747u,          33986800493u },
+  {  9890094564876124160u,  5190010931882390570u,         109019077620u },
+  { 12290856656987750400u,  6982466386088036604u,         244281351056u },
+  {  8498454992640802816u,  4707293888784996898u,         144378520261u },
+  {  5341660584200896512u,   690306801165964760u,         197255182913u },
+  {  9288674231451648000u, 12456770961278956704u,          65037421606u },
+  {  1152921504606846976u, 16946092489294063943u,          38675282906u },
+  {                    0u, 11098404173866185376u,         218918649514u },
+  {                    0u, 15152070965853306880u,         170601645695u },
+  {                    0u, 17370091362040414208u,         127821395412u },
+  {                    0u, 10141938552171134976u,         212941634539u },
+  {                    0u, 10586988556645826560u,         235549795590u },
+  {                    0u, 12169852093061922816u,           6573921799u },
+  {                    0u, 16717361816799281152u,           7659729003u },
+  {                    0u,                    0u,         107906250000u },
+  {                    0u,                    0u,          16000000000u },
+  { 15212079674427582639u,                  112u,                    0u },
+  { 10179808126814248333u,         112824648491u,                    0u },
+  {  6066766544199222848u,  2144184049294538808u,                    6u },
+  {  6625308131806923532u,  4108002197393276873u,           6116236450u },
+  {  9122786786400665713u,  6446230217393892753u,         162222695245u },
+  { 11932880778639151320u,  5571068025259989822u,          77349450840u },
+  {  3884040911779255011u, 14804812668872528331u,          88302008202u },
+  { 13441817515637357872u, 17369928488562523047u,         138802570502u },
+  { 11628577856022352826u,  2967474173531035027u,           6941625710u },
+  { 13296656925520243654u,  5291425437992807716u,         110160867097u },
+  {  5020720704545399398u, 14219547193739388064u,          25286848747u },
+  { 14121973606499014694u, 17720313647158217462u,         235770843197u },
+  {  3642481034345420114u, 12334850628290578491u,          61960620127u },
+  {  9845536238569696768u,  7818499847417334620u,          95668673592u },
+  { 17655403572195686356u,   136007040922198372u,          56423841726u },
+  {  8377495365136654029u,  8523477092112604449u,         190007372956u },
+  { 13713682649609025426u,   367934822655966629u,         156462058619u },
+  {  1367709905452854731u, 12964987687054730050u,         123019945786u },
+  {  9981467701727208680u, 15267036012420885462u,          58702833390u },
+  {  6277920117543306205u, 11142900264750765568u,         238827627680u },
+  {  9344111460418701726u, 13680181547777718603u,         160604057833u },
+  {  4918507011364617264u, 13001922925761426065u,         233741604127u },
+  {  6554777203830755259u,  2397730045956515935u,          31704835654u },
+  {  4198262173120265648u,  4482395522588406288u,          70129981206u },
+  {  8080325935698446819u,  3255525722490493080u,          22242991148u },
+  { 12797633874200091733u,   836222287193822098u,          44176482403u },
+  {  8376502502208665497u,   420898743993182306u,          99045331701u },
+  {  9891973386793349173u, 11652649973356574054u,         245022816966u },
+  { 14877430279003795462u, 15058402726661910231u,         198631691420u },
+  {  8759933935842067041u,  9600134495208339559u,         156816317647u },
+  {  3753418510388703513u, 14626343323989004842u,         207520424333u },
+  {  2961383332545305985u,  6813981265331086665u,         141792895660u },
+  {  2497674184068629507u, 10281745288790487888u,         172369386664u },
+  { 15244544070742305452u, 17569829347075761940u,         168557374528u },
+  {    45953573565810823u,  7654580675237889478u,          64952462357u },
+  {  3960077421351906445u, 16194838649686212364u,          21414955649u },
+  {  3173330011013883118u,  6495102772252453635u,         129877923962u },
+  { 11026266219545759160u, 14935159852819761348u,         122352100226u },
+  {  8886757764964685632u, 17381879863441579697u,         130809636637u },
+  { 13952322129918090479u,  9062335510435372583u,          29942273595u },
+  {  4127250666614902202u,  7569219009130126626u,          59491270192u },
+  { 17649958504065306911u, 12652124168176193362u,          48410328184u },
+  { 13269305359002216873u,  8940200224697247767u,         120685873025u },
+  { 16236593433831947843u,  5600570701927432884u,         129484649225u },
+  { 13580930396682424057u,  2018432801986093157u,           9303607546u },
+  {   421976357197961116u,  8235849749361824736u,         250109419461u },
+  {  2962130818798626533u,  9705097287982370040u,         197446466309u },
+  {  8234383947306356345u,  3517483139049842585u,           5526114378u },
+  {  4380469931801381425u,   958281614186777760u,          74190683143u },
+  { 15279887469027055916u,  7336473432636108950u,           7051948550u },
+  {  8534542821713755552u, 12955383920176764423u,           6397711021u },
+  {  7814613482565088782u, 10735469126281273789u,         173702312769u },
+  { 13771954404705323224u,  8637888232514730693u,          65581970947u },
+  {  4568173274762548144u,  6806336737533581000u,           3468260859u },
+  {  8105292616250821343u, 16142569672872330321u,         251368972253u },
+  {  2923678426777275612u,  8141285259947963513u,         221875090455u },
+  {  1808633176918384049u,  5220241098754220797u,          23441339958u },
+  { 18118642609460438969u,   154438799943119608u,          54282989837u },
+  { 18138164175864360870u,  2226876628677628879u,          13008372144u },
+  {  4031433690465792404u, 17219557081221357482u,         176120719223u },
+  {  5012226396942308537u, 15401507148161015114u,         119933474059u },
+  {  7889712298793536835u,  8842629766613985337u,          11834917375u },
+  { 13500762396543628804u,  3180100571546071440u,         255479359920u },
+  {   501020624068841347u,  7740848704392475044u,         176172393597u },
+  {  8370653768288261750u,  2014314126623495998u,         125419632249u },
+  {   647579990023635200u, 11209566016506885858u,         121109196187u },
+  { 11106569307181154304u,  7117166613733441125u,         155607671791u },
+  { 10797461613892861952u,  4197646860931880328u,         239385822375u },
+  { 17627230675448889344u,  5487263271238026094u,         167227554892u },
+  { 12197735707942322176u, 18148076225293562697u,          76297465137u },
+  { 12871287735024877568u,  9127276943027950849u,          49983809183u },
+  {  4611686018427387904u,  9691696125379324722u,         159494790674u },
+  {                    0u, 13102362262487705216u,          18525387899u },
+  {                    0u,  8929385439893192704u,         123710280481u },
+  {                    0u, 11891353410743566336u,          33484062954u },
+  {                    0u,  1587423090877399040u,         234644631560u },
+  {                    0u,  3489137423026225152u,           8086054378u },
+  {                    0u, 13046928120492326912u,         234189146518u },
+  {                    0u, 11529215046068469760u,         150707275390u },
+  {                    0u,                    0u,         126625000000u },
+  {                    0u,                    0u,          64000000000u },
+  {  9451803574512021605u,              1721567u,                    0u },
+  {  8662766454758138424u,     1721567512383298u,                    0u },
+  {  9207992007314947035u,  6674960280855494694u,                93326u },
+  { 17118602861291201802u, 16378845781483497510u,         142361850321u },
+  { 11186560605745599967u, 17606907750956804392u,         209887899008u },
+  { 10505549821532796847u, 13225609159240506969u,         128954472381u },
+  { 18133667530488679216u,  2668084873338435252u,         189716961709u },
+  { 10778135771244330799u, 14802814305275861366u,         173144637170u },
+  { 17087985777033767391u,  8005510553372365574u,         242802462171u },
+  {  2639185991757283040u, 12748500143273514429u,         219433979596u },
+  {  5401720287293896400u, 10393733905569036127u,         204691097577u },
+  {  9816495392633895233u,   603389089974790339u,         233563445444u },
+  { 10042051500090034990u,  2033494532597735873u,         196032709788u },
+  { 11629689537856384738u,  9204796763694620958u,         156110235959u },
+  {  2099086731766010483u,  7826260310402107021u,          55498993032u },
+  { 13665537898516458594u, 10122690201685169383u,         136424262421u },
+  { 16375672064669490764u,  7438455564568110133u,          21548752135u },
+  {  7770550512184564348u,  2805412574380520817u,           7403239484u },
+  {  6197048880720627314u,  7250965427231182867u,          60152081720u },
+  { 17963594118523106281u,  8136242944826085924u,          56393075623u },
+  {  8255454642407818663u, 15357191647956011780u,         167441066613u },
+  { 16744201957549498409u,  7369614426695395460u,         117832515027u },
+  { 17442505417202859722u, 10886957545142526638u,         211399507598u },
+  {  6383975767786687150u,  2030047207417538097u,         142590183151u },
+  { 15245442964998335795u, 11557093828502314355u,         239110049079u },
+  {  2910016124519524433u, 15201062539664128543u,          55626511311u },
+  {  3847913871169988463u,  8846936323343880674u,         207824051251u },
+  { 17210451512590059177u,  1485291750116245364u,          51479593379u },
+  { 17899408909991454145u,  2076024439668322013u,         163080517827u },
+  {  5920601932753251608u,  7029497773682748741u,         195112541510u },
+  { 16521781895108979744u, 16333533921668749881u,          70381069837u },
+  {  3697493405554698771u,  2065057316131928423u,          13885442648u },
+  {  2816108280295732065u,  7800502648925570223u,          88111946981u },
+  { 14251078772056398988u, 17011619967093802015u,         229422866095u },
+  {  4543066550096031417u,  5368819344429198672u,         175922201766u },
+  {  3099369389734296977u, 15598879366754275267u,         166291044279u },
+  {  5243484113636490986u, 16393893486035835647u,         183845616944u },
+  {  6823370511605197226u, 12042046205096920307u,          48888714746u },
+  { 11396290277624641942u, 15437070428008474344u,         250652800632u },
+  { 15934361408437566099u, 13704569163204647509u,         120836845264u },
+  { 14939272230935131954u, 18192483750856993350u,         208742926182u },
+  {  7500666177940329347u,  5152535865317963250u,         102986216520u },
+  {  4806714453065462270u, 17512614083933854680u,          72279319528u },
+  { 11557851247268441487u, 14481918350603613536u,         232949360711u },
+  { 10655523157206817381u, 16124419709964004915u,          71785066366u },
+  { 14769600176490881210u, 18088011566435813579u,         126874106543u },
+  { 16688495540925795167u, 15008862380698848893u,         175980553071u },
+  {   909793965395524173u, 18160498644611827812u,         111813632059u },
+  { 12724590949761703756u,  3604680497457231965u,          59984482604u },
+  { 10810739657314826395u,  5957615565551495921u,          44195410121u },
+  {  2431218615388671301u, 17528455034961565995u,         201322962986u },
+  {  4235001167959059286u,  8503772325120113809u,          42950219451u },
+  {  6253317787396334247u,  8501492578048509537u,         187460990421u },
+  {  9534525563070371898u,  2296237701094386060u,         213460866836u },
+  {  8392783992374030728u,  3753593040591076946u,          20124479295u },
+  { 16356257019231647540u,  8518075399775653155u,          63203482686u },
+  { 12896334001521091877u, 12757855675959554597u,          62461765792u },
+  {  1427636373320877084u,   121631169379748595u,         160691604742u },
+  { 16116755731295043521u, 16679062494579173314u,           6006593638u },
+  { 15945633911163986837u, 10739912744743898054u,         102904173789u },
+  {  7510154241072743838u,  9367340677776287570u,         221582211836u },
+  {  3571560509790395119u, 12227321512794715397u,         252507804555u },
+  {  3576991649007035076u,  7241061891859170651u,         139662844427u },
+  { 15509961892750732443u, 13148571323079237489u,          11392538751u },
+  { 17789791359353349378u, 12509763434355012654u,         127712785479u },
+  { 18331227331079738314u, 11812768946960181977u,          71678155634u },
+  { 15386712883100476416u, 14170358803552564832u,         114640371487u },
+  { 14082462055028752384u, 18179989524780635952u,          31768176689u },
+  { 12919043128765186048u, 17091718978514754901u,          49985539206u },
+  {  6125373368465096704u,  7394768384359232459u,         134926543942u },
+  { 12335992698065387520u,  6778628272692852803u,          70400871197u },
+  {  2774217370460225536u, 18193335045875234320u,          29367470174u },
+  {                    0u,  1378519212560967521u,          94986262669u },
+  {                    0u,  4677732610631043584u,         141074729676u },
+  {                    0u, 17296098591070486528u,         204253580392u },
+  {                    0u,  7343735382392963072u,         104937623383u },
+  {                    0u, 14525996728454217728u,          87398104692u },
+  {                    0u,  9691359370008330240u,         116787455860u },
+  {                    0u,  3044433348102455296u,         116525369644u },
+  {                    0u,  9223372036854775808u,          44165039062u },
+  {                    0u,                    0u,         214500000000u },
+  {  4962829537462579598u,                   26u,                    0u },
+  {  5711259460785241095u,          26269035528u,                    0u },
+  { 13845894607204897444u,  7822291454600056379u,                    1u },
+  { 12116633056637003327u,  8201586317771250746u,           1424047269u },
+  {  2965791047992089560u,  3278889188817135834u,         165444608885u },
+  { 16021997451315962529u,  1710725240251040430u,         117177748939u },
+  {  3942052271663803856u,  1850175733663425006u,         203092738601u },
+  { 15669876414782439922u,  9147599666163914249u,          41100298227u },
+  { 10594415915406145286u, 10221885933644344166u,         243495892371u },
+  { 10789820553031921377u, 14901479793736678101u,         147554129546u },
+  {  3989990218583987244u,  5181831442059703136u,         138807810838u },
+  {  2937341169808224563u,  6396246577759793483u,          22280907645u },
+  { 16267436558584536843u, 14167229556464870447u,         125346741221u },
+  { 16221580362814625793u,  2969982933326311854u,         229768007053u },
+  {  9695437602320209830u,  7892677766222018881u,         141161003097u },
+  { 10729753156793715126u,   798698968922663621u,          89427862919u },
+  {  2609241432056861929u, 15926812109043458972u,         135043297557u },
+  {  8462663743997037565u,  8663842590352697437u,          21863394214u },
+  { 14993422143908194069u, 17093523026636671168u,         166469667847u },
+  {  1307443894537745373u,   839764004742743203u,           7926641740u },
+  { 10017257439419829265u, 16894643909298232323u,          76045523697u },
+  { 16754772009970777891u,  9066702926218949317u,         241915860481u },
+  { 11722573031602862387u,  9119392417260546810u,           1491506950u },
+  {  7363764277467092384u,  9723021096578315109u,           6494363253u },
+  {  6733958494847390772u, 14787464248751217597u,         117527086029u },
+  {  8799796600227451045u,  3733434565920249133u,         205801630043u },
+  { 10512023194742249826u,  6643788868836820841u,          91202389893u },
+  {  4572542132337197059u,  4729646697422664063u,         133360160516u },
+  { 12600500455757416832u,  4090144564201555829u,           4256394661u },
+  {  7873789864743195199u,  2109480737093400002u,         165221727181u },
+  { 15724851676325671539u, 16577155033369419739u,         205114355179u },
+  {  8748017220462413167u,   745377248603805917u,         235898649375u },
+  { 14172589522760466448u, 11305561465807999667u,          31040406981u },
+  {  9520545591489413768u,  2211245518782892177u,         197612875715u },
+  { 12488551088392570222u, 14170095199249735666u,         195119871859u },
+  {  1135798823651241684u, 17849973668116118927u,         115768162399u },
+  { 11168725610120161972u,  9020960204585720001u,          95967649011u },
+  {  9580104948718508826u, 10807134002871850916u,         243489027232u },
+  { 16638722716909738765u,  3925122626254791201u,         160585855908u },
+  { 15732724012348272797u, 17208463291312718997u,         164212781323u },
+  { 12269722190021214142u,  5145077219589447653u,          11932872664u },
+  { 13110655916311972587u, 17602397765035489468u,         216278915194u },
+  {  6618112997062866867u, 16422643262490753377u,         122954227894u },
+  {  8457936459015989309u,  2902509461400906224u,         182890273275u },
+  {  3329167139937134914u,  3422418805967265206u,         251157345353u },
+  {  5245511557216705097u,  4228874576277237392u,          73185529695u },
+  {  5655931353280440466u,  2553488530807495751u,          95229247750u },
+  {   604622132328697393u, 11546099176912486413u,           6138424890u },
+  {  8673282619234652338u, 10460791037534167991u,          58625915290u },
+  { 16929477433058445690u,  8127117908566000904u,         154567080618u },
+  { 11036952409253549455u, 11541304458088287306u,         170440571944u },
+  { 18199392190170386320u,  6249718665174839700u,          40625655368u },
+  {  9683116091880335715u, 13102508413386290995u,          72338797927u },
+  {  2993913337608915120u,  6274675218640661911u,         103710288404u },
+  {  4490779842162392585u,  3404497118599817167u,          20340150825u },
+  {   946849923353644618u, 11258566093988562335u,          41184558158u },
+  {  3613491058474899828u, 16762592482501635397u,          78610328090u },
+  { 14624054199004410935u,  5550125446725071998u,          26908701959u },
+  { 12088470271991908244u,  6370033225258510318u,           7300872903u },
+  { 10071980927725011290u,  1503521728674735398u,         199345320193u },
+  {  2833441711428854664u,  4250415082606384364u,           1081506076u },
+  { 17655572411864340446u,  6020091901030562974u,          28230415463u },
+  {  4997642792058747802u, 16288222967151527138u,         103326349835u },
+  { 11489200787635734848u,  6377016228656203782u,          11882986336u },
+  { 12983586226429536913u,  8378856515587563750u,          96345698742u },
+  { 12311150768725063152u, 15812881490200838483u,         182454218721u },
+  {  8530052476845967905u,  4548570371183413652u,         225857218023u },
+  {  6282736361499820264u, 16731431495283420383u,         231246578493u },
+  { 11337164765929082880u, 14737727629551135532u,          61907012718u },
+  {  8343856200414134272u, 12413722258104293893u,         110798933815u },
+  { 17889330377156198400u,   800899742400762438u,          55672949232u },
+  { 17730714064155312128u,   603197008376033550u,         240043416862u },
+  {  7449235258647511040u,  6380777281587743935u,          30032699375u },
+  {  9943947977234055168u, 10001440249018225388u,         239345902629u },
+  {                    0u,  5505914461980436708u,          37542179162u },
+  {                    0u,  1105464290051876864u,          90298476221u },
+  {                    0u,  4500443576769970176u,         189059927339u },
+  {                    0u,  2843045143185981440u,          43243969535u },
+  {                    0u,   660949699682893824u,         255154121786u },
+  {                    0u,   276549164618219520u,          58035830155u },
+  {                    0u,  4683743612465315840u,         139014991760u },
+  {                    0u,                    0u,         144253906250u },
+  {                    0u,                    0u,          74000000000u },
+  { 12396245121240683569u,               400833u,                    0u },
+  { 10248996648596888561u,      400833672001794u,                    0u },
+  { 11257495103713935002u,  4370024159708535157u,                21729u },
+  {  7555396579247433114u,  7166684413908503888u,         225236899484u },
+  {  4805022328730367462u, 10217286283215687029u,         156388506740u },
+  {  7056637817080232586u,  4767369911989629198u,         116553880199u },
+  { 10811411483818434913u, 14407999214182082862u,         135258439640u },
+  { 16962406704495245447u,  8472271297615317358u,         216781059202u },
+  { 18074517319117194669u,  6236024012584764757u,         130459282747u },
+  {  3702019776117654523u,  1951826556984620523u,          59338055539u },
+  {  3551977551381082764u, 12357130551551830830u,         115105808729u },
+  { 16442608985936005282u,  8927758011099278464u,          89669881389u },
+  {  3580046275479139588u, 10199854049407140323u,          45483974731u },
+  {  8737412692712715330u, 17895455027038549577u,          75552935195u },
+  {  3082033243045084752u, 16539200343720527131u,          27970114560u },
+  { 16401023756841128699u,  3536976106235802604u,            896591847u },
+  {  7520296082779572869u, 16980391644793590751u,         231191739858u },
+  {  9854104766152464159u, 10090294316609084067u,         210920508875u },
+  { 14169188802648310188u, 17603457857266236889u,         203546995950u },
+  {  2018609909210367042u, 11164962743035868272u,         238954285362u },
+  {  8270271948267674359u,  1585686890718568774u,          50605253843u },
+  { 12320338602894572099u, 10882524700472655412u,         211085960258u },
+  { 17538536685990080547u,  2194808754940947757u,          66589942846u },
+  { 15833914616956760474u,   274100791137209242u,          62118980821u },
+  {  6137696141415969855u, 12203404582981010903u,         213014859033u },
+  {  9757490468419438919u,   541940706340938166u,          25661547888u },
+  {  3566639201356598903u, 10305434016011833594u,         112029378664u },
+  {  9760900035773954449u,  7900783531944543546u,         104558658697u },
+  {  3873778773990716438u,  8920818625012419323u,         137428302333u },
+  {  2295668377270167832u, 12532363335400447632u,         253483598546u },
+  {  1791721710912807593u, 13483507182924762800u,         210679380777u },
+  { 10571009006922683279u,   415911049779278804u,          41730942389u },
+  {  9840791932778184867u,  3441628281170127418u,         181022546583u },
+  { 11525464956561274613u, 17830811568183566527u,         151186571042u },
+  {  4435781488897895433u, 17897295813176613411u,          34966610231u },
+  {  6395563367070996741u,  2086148701331574596u,          55970214350u },
+  { 15538690795135662932u, 13015567826878853432u,         206113090347u },
+  { 16294558813563371936u, 12944531121587846595u,          43705575345u },
+  {  4942096228426070342u,  3534180912913737995u,         177701724438u },
+  {  6910116424372647153u,  3447584022400118677u,          22191588331u },
+  { 17923400669760829478u,  6375676813770849297u,         235186893904u },
+  {  4134686917293039955u, 11580694081479200185u,          80345626132u },
+  { 16857102463116098681u,  1872134358882196482u,          20627790684u },
+  { 11364321508775167451u, 17602652840520938059u,          92101488606u },
+  {  7966947780972783899u, 10331040597716338351u,         222954241722u },
+  { 11261055695926686278u,    73785407041056976u,         186560046833u },
+  {  9227040437353594058u, 17166209109167902028u,         241003999914u },
+  {  7185344074282882061u,  8762475644006589904u,         170930582060u },
+  { 14197856148610578032u,  8839001228645872586u,          44475014756u },
+  {   885688687260429427u, 13558262784529110268u,         100479163216u },
+  { 17407816160380305183u,  5640853896420358111u,          80734994898u },
+  { 17812728703806357349u,  8459930353450835572u,         210305791302u },
+  { 17120198191964319867u,  7643830211500171269u,          70458613743u },
+  { 12091952048375408786u,  1308629115231236347u,         239414372866u },
+  {   405056939269888281u,  8957268500971669618u,           2070940926u },
+  { 12485440679452408690u,  7645679094277669412u,         254485574498u },
+  {  8394369900823444407u,  3821107497040617191u,          98414473094u },
+  {  2877421667354294258u,  8847137191985934072u,         134207142652u },
+  {  2676980714750756239u,  3531126524756088253u,         252479604268u },
+  {  6119309228579057021u,  8726915034124352183u,          44191422752u },
+  { 18203256146533333852u, 17611136727168068641u,          32473087011u },
+  {   351919978865493747u, 18017743272784259949u,          35954701634u },
+  {  5190010931882390570u, 18113575006829616116u,          66976743819u },
+  {  6982466386088036604u, 12805550441678740368u,         139981938868u },
+  {  4707293888784996898u,  8061966093393027781u,         180694190280u },
+  {   690306801165964760u, 11954593141554100801u,         200437040057u },
+  { 12456770961278956704u, 14068656112359197734u,         185648059792u },
+  { 16946092489294063943u,   895878255770467290u,         144762663376u },
+  { 11098404173866185376u, 10319906489512197802u,         208048565657u },
+  { 15152070965853306880u, 14551142616794302079u,         153559443251u },
+  { 17370091362040414208u, 15933181735739307476u,          51788819021u },
+  { 10141938552171134976u, 11524527334398983147u,          77863739512u },
+  { 10586988556645826560u, 11828012606225556742u,         120624745878u },
+  { 12169852093061922816u,  3556238869349799431u,         150641197848u },
+  { 16717361816799281152u,  7403090230513381483u,          24192784095u },
+  {                    0u, 10172292854665622800u,         223401322325u },
+  {                    0u, 11240746576366182400u,          85551441100u },
+  {                    0u, 17021927826892259328u,         204609362092u },
+  {                    0u,  9046328496309141504u,         172922760556u },
+  {                    0u,  8038996803112140800u,         108490402450u },
+  {                    0u, 17098478935265509376u,         146435794889u },
+  {                    0u,  7205759403792793600u,         201926910400u },
+  {                    0u,                    0u,         192390625000u },
+  {                    0u,                    0u,         232000000000u },
+  {  2144184049294538808u,                    6u,                    0u },
+  {  4108002197393276873u,           6116236450u,                    0u },
+  {  6446230217393892753u,  6116236450222695245u,                    0u },
+  {  5571068025259989822u,  6240972538554414168u,            331561842u },
+  { 14804812668872528331u,  4356262642990299018u,         114338323799u },
+  { 17369928488562523047u,  1335108558830511366u,          87236153471u },
+  {  2967474173531035027u, 18435704923261947246u,         127072376379u },
+  {  5291425437992807716u,  8395401931972636441u,          59999401566u },
+  { 14219547193739388064u, 12482665946362458347u,          94455115650u },
+  { 17720313647158217462u, 16101242875289374781u,         130676686676u },
+  { 12334850628290578491u,  4708983440241068127u,          84872850125u },
+  {  7818499847417334620u, 14856666972541426744u,         205255274503u },
+  {   136007040922198372u,  6938795288315789246u,           7805381530u },
+  {  8523477092112604449u,  5556307628265073820u,         154376152846u },
+  {   367934822655966629u,  1441404248927865979u,          14301208040u },
+  { 12964987687054730050u, 16710378912353838906u,         232078138680u },
+  { 15267036012420885462u, 18289940136919312110u,          56905871455u },
+  { 11142900264750765568u, 10217414145292657824u,          95991499641u },
+  { 13680181547777718603u, 12461165826430955753u,         121553887130u },
+  { 13001922925761426065u,   662762458988270879u,         154675521153u },
+  {  2397730045956515935u, 16488546856395302470u,         129035928424u },
+  {  4482395522588406288u,  2612816787977180950u,         104893845916u },
+  {  3255525722490493080u, 16446616379327454252u,         156141641081u },
+  {   836222287193822098u,  7842178508581740643u,         121891572860u },
+  {   420898743993182306u, 14779029861369369333u,         124425125348u },
+  { 11652649973356574054u,  2697664446153849542u,         228801172814u },
+  { 15058402726661910231u, 12135106444393649308u,          78146240682u },
+  {  9600134495208339559u,  9550285041205189839u,         170657845438u },
+  { 14626343323989004842u,  8790318168586740109u,         190517721989u },
+  {  6813981265331086665u, 14038474217155846828u,         133476524102u },
+  { 10281745288790487888u,  4263144264274812072u,          70761027212u },
+  { 17569829347075761940u, 11940456333341715520u,         140231105513u },
+  {  7654580675237889478u, 15751110736831573013u,         233647293434u },
+  { 16194838649686212364u, 18384528705472318081u,         250853869423u },
+  {  6495102772252453635u,  2393654818032310394u,         111996627298u },
+  { 14935159852819761348u, 12812209822018626434u,          98129760287u },
+  { 17381879863441579697u,  3110778569433458461u,          31694551286u },
+  {  9062335510435372583u,  2860264756226872891u,         246168635644u },
+  {  7569219009130126626u,  2384146980060315184u,         252155055263u },
+  { 12652124168176193362u, 14117430062880324728u,         159129244866u },
+  {  8940200224697247767u,  3769610173216737153u,         194765307417u },
+  {  5600570701927432884u, 17731974340232672009u,          25204350976u },
+  {  2018432801986093157u,  1971479303384713466u,            961252255u },
+  {  8235849749361824736u,  3449462959779012549u,         159106874107u },
+  {  9705097287982370040u, 13743454852043766533u,         251186995761u },
+  {  3517483139049842585u,  7417711187131879498u,          49745034180u },
+  {   958281614186777760u,  3650992383501007879u,         196402114929u },
+  {  7336473432636108950u, 12838770342493958662u,         113197920693u },
+  { 12955383920176764423u, 16025068246546338477u,         181695991134u },
+  { 10735469126281273789u,  6579965938260177729u,          94868720690u },
+  {  8637888232514730693u,  4742939430174291459u,          50356700668u },
+  {  6806336737533581000u, 13062256857527449083u,         252257115261u },
+  { 16142569672872330321u,  2301174570202439645u,         125708106363u },
+  {  8141285259947963513u,  7638687886069412887u,         123124746923u },
+  {  5220241098754220797u,   936322449610274358u,         171414094100u },
+  {   154438799943119608u, 12926010544311283981u,          20050758141u },
+  {  2226876628677628879u, 12647854908989899184u,         253700720435u },
+  { 17219557081221357482u,  8862093163358513015u,          51685641588u },
+  { 15401507148161015114u,   444784343917630731u,         116480415033u },
+  {  8842629766613985337u, 11033952249213387263u,          57024111807u },
+  {  3180100571546071440u, 18168634046363183536u,         191598151749u },
+  {  7740848704392475044u,  3837904761417065597u,          69984923625u },
+  {  2014314126623495998u,   111459007020906105u,         233208053234u },
+  { 11209566016506885858u, 16191761957496794523u,         242006042204u },
+  {  7117166613733441125u,  9856250800340378607u,          92877757174u },
+  {  4197646860931880328u,  9491800102275105959u,         246534308426u },
+  {  5487263271238026094u, 10777328578953608268u,          74514551514u },
+  { 18148076225293562697u, 17424440628313779505u,         218584240152u },
+  {  9127276943027950849u,  3285814872419755679u,          24944580819u },
+  {  9691696125379324722u,  2824823424107240978u,         211178124381u },
+  { 13102362262487705216u, 12271707680713669755u,          93153133984u },
+  {  8929385439893192704u,  6951481875178001185u,         160665250606u },
+  { 11891353410743566336u, 10202522487003824362u,          46376840587u },
+  {  1587423090877399040u,  4834668463880990728u,         139553079852u },
+  {  3489137423026225152u, 10871520987687904746u,          44262087902u },
+  { 13046928120492326912u, 12057698794225322390u,         222589346333u },
+  { 11529215046068469760u,  7263351819222681214u,          29653649161u },
+  {                    0u,  1778055686910650944u,           9393747091u },
+  {                    0u, 17108187120491986944u,         147096388591u },
+  {                    0u,  3067636961549221888u,         239927436682u },
+  {                    0u, 16702141595163557888u,         138166296932u },
+  {                    0u,  2432053749942845440u,         100905424910u },
+  {                    0u, 17791470327927144448u,          14131841897u },
+  {                    0u,  1152921504606846976u,         105964477539u },
+  {                    0u,                    0u,          99062500000u },
+  {                    0u,                    0u,         160000000000u },
+  {  6674960280855494694u,                93326u,                    0u },
+  { 16378845781483497510u,       93326361850321u,                    0u },
+  { 17606907750956804392u,  4283581425266273664u,                 5059u },
+  { 13225609159240506969u,  6725911039793895357u,         195232213414u },
+  {  2668084873338435252u,  1188689198788975021u,         166364612368u },
+  { 14802814305275861366u, 10825527435847761650u,          16064438970u },
+  {  8005510553372365574u,  3917696829526085083u,         186586853018u },
+  { 12748500143273514429u, 12646861173976387276u,         154212378770u },
+  { 10393733905569036127u, 18398576063183996905u,         146685587717u },
+  {   603389089974790339u, 16919251228485834948u,           5997388806u },
+  {  2033494532597735873u, 17296019588687185052u,           6917194446u },
+  {  9204796763694620958u, 12365301604512770359u,         206937619100u },
+  {  7826260310402107021u,  2814271599679204744u,         156670324343u },
+  { 10122690201685169383u,  2154994415780170517u,         119152561969u },
+  {  7438455564568110133u,  6717373824370072839u,          49116822481u },
+  {  2805412574380520817u, 12709155755801344060u,         209364149564u },
+  {  7250965427231182867u,   826847911966403896u,          60688964714u },
+  {  8136242944826085924u,  2277322703890025383u,         106044823515u },
+  { 15357191647956011780u,  2774508958389496437u,         219123453911u },
+  {  7369614426695395460u,   245697774950120915u,         215150406432u },
+  { 10886957545142526638u,  1268929063431863950u,          32013319303u },
+  {  2030047207417538097u,  6735665673159411439u,         135068788782u },
+  { 11557093828502314355u, 14734771742997073207u,          46365141167u },
+  { 15201062539664128543u, 13683287077957612495u,         175798773576u },
+  {  8846936323343880674u, 15370263741354826803u,          72741772478u },
+  {  1485291750116245364u,    48035913070297507u,         190833223667u },
+  {  2076024439668322013u,  1206547475966802115u,         243002604032u },
+  {  7029497773682748741u, 13512340386605768006u,             65407069u },
+  { 16333533921668749881u,  2325760467700278797u,          93732505440u },
+  {  2065057316131928423u, 10848110652847753816u,          96126079727u },
+  {  7800502648925570223u, 15846378960784301285u,         239588077256u },
+  { 17011619967093802015u, 14121839924449844911u,         200859033924u },
+  {  5368819344429198672u,  5147613424753296550u,          68765546476u },
+  { 15598879366754275267u, 16817040482828810167u,         236279052682u },
+  { 16393893486035835647u,  5773528746119363888u,         138911653591u },
+  { 12042046205096920307u,  8716201595536184826u,         215312983620u },
+  { 15437070428008474344u,  5259122109038474872u,          68472506235u },
+  { 13704569163204647509u, 14744540084230155984u,         123285097580u },
+  { 18192483750856993350u, 10719345477982635878u,         108799303119u },
+  {  5152535865317963250u, 13698037261310555208u,         207581096882u },
+  { 17512614083933854680u, 16141171632951976936u,         178742572087u },
+  { 14481918350603613536u, 10060790174955808839u,          55875014667u },
+  { 16124419709964004915u,  4250043307981877118u,          11545396528u },
+  { 18088011566435813579u,  7075646198054337199u,          48230395309u },
+  { 15008862380698848893u, 18141738384245531503u,         173383571548u },
+  { 18160498644611827812u,  8174370508376809531u,          92983465608u },
+  {  3604680497457231965u,  3581964982731575596u,         136443133513u },
+  {  5957615565551495921u, 14798509948722114761u,          73194178710u },
+  { 17528455034961565995u, 14713923334885122090u,         150802228831u },
+  {  8503772325120113809u,  5042978054260414139u,          95797643382u },
+  {  8501492578048509537u,  2052996319372883413u,         118273380388u },
+  {  2296237701094386060u,  8825683007899981588u,          36111293153u },
+  {  3753593040591076946u,  9992196755378745151u,         225478441234u },
+  {  8518075399775653155u,  9301073417573669950u,          18541678071u },
+  { 12757855675959554597u,  5331614769144850592u,         247504212200u },
+  {   121631169379748595u, 14354009428310052102u,         232289027415u },
+  { 16679062494579173314u,  5581221063029119078u,          87778132410u },
+  { 10739912744743898054u,  1529260335339476189u,         186302558600u },
+  {  9367340677776287570u, 16483061525949201148u,         136082901368u },
+  { 12227321512794715397u, 14431217812333089675u,         120893548555u },
+  {  7241061891859170651u,  3452349151135392267u,          11782317885u },
+  { 13148571323079237489u,  9075317899834447999u,          61187152222u },
+  { 12509763434355012654u,  2764331337978901575u,          94491973969u },
+  { 11812768946960181977u,  1942890683708857202u,          81149854702u },
+  { 14170358803552564832u,   165089169728028447u,         238105324315u },
+  { 18179989524780635952u, 15193620741871233073u,          27008949501u },
+  { 17091718978514754901u, 14995000835194145926u,         253823647830u },
+  {  7394768384359232459u,  1788823614552255558u,          86812880624u },
+  {  6778628272692852803u,  8384901184618498845u,         240096972322u },
+  { 18193335045875234320u,   405511217862281310u,          34454546404u },
+  {  1378519212560967521u,  3111530463755196557u,         228021982807u },
+  {  4677732610631043584u,  7893558450035460812u,          87168676404u },
+  { 17296098591070486528u,   156573858237402216u,          52427910661u },
+  {  7343735382392963072u, 15915324019419451223u,           5008487885u },
+  { 14525996728454217728u, 16293363012778802804u,         205862771443u },
+  {  9691359370008330240u, 14342105318291351412u,         243883264978u },
+  {  3044433348102455296u,  3788398842525387052u,         210777487087u },
+  {  9223372036854775808u, 14118764407048307670u,         239205369512u },
+  {                    0u,  2705021334614720768u,         168765379752u },
+  {                    0u,  7017988973805568000u,         168146639500u },
+  {                    0u, 10956732053634154496u,         140380445944u },
+  {                    0u, 14657517938546835456u,         248593965634u },
+  {                    0u, 11268868284797157376u,          66794585639u },
+  {                    0u, 14600669991935148032u,          39610886573u },
+  {                    0u,  4611686018427387904u,         173791503906u },
+  {                    0u,                    0u,          34250000000u },
+  {                    0u,                    0u,         128000000000u },
+  {  8201586317771250746u,           1424047269u,                    0u },
+  {  3278889188817135834u,  1424047269444608885u,                    0u },
+  {  1710725240251040430u,  3001188830946823627u,             77197757u },
+  {  1850175733663425006u,  9732296932705387049u,         189162694772u },
+  {  9147599666163914249u, 16337535782679529459u,         116527588873u },
+  { 10221885933644344166u,  7969742269895046547u,           9885659589u },
+  { 14901479793736678101u,  2923592083903829642u,         197432040594u },
+  {  5181831442059703136u,  8144196241160608534u,         146158488244u },
+  {  6396246577759793483u, 16431078457793424253u,         180441497762u },
+  { 14167229556464870447u,   202362949592775653u,         162890730548u },
+  {  2969982933326311854u,  8835125248522947981u,          52010970117u },
+  {  7892677766222018881u,  7959873808777345113u,           5478953099u },
+  {   798698968922663621u, 14929747122315126151u,         139431505623u },
+  { 15926812109043458972u,  4310328817360515349u,         215809343213u },
+  {  8663842590352697437u,  7294899422760201126u,         237233663393u },
+  { 17093523026636671168u,  2047461597291187207u,         161395457290u },
+  {   839764004742743203u, 10942374468813517900u,          10110993115u },
+  { 16894643909298232323u, 10364795403063433969u,         219593187308u },
+  {  9066702926218949317u, 12330859528790939137u,         236561876684u },
+  {  9119392417260546810u,  8973160144879916806u,         204668457234u },
+  {  9723021096578315109u,  2895354388547509877u,          18486435986u },
+  { 14787464248751217597u, 16766844772497556429u,         146156957475u },
+  {  3733434565920249133u,  7442407174620948827u,          35908932476u },
+  {  6643788868836820841u,  6683013428676659077u,         124403453701u },
+  {  4729646697422664063u, 16713703375071907588u,           5362286883u },
+  {  4090144564201555829u,  8791044883080637861u,          35906051675u },
+  {  2109480737093400002u,   602844107089214413u,          91476563498u },
+  { 16577155033369419739u,  9754832281172880875u,          42032680244u },
+  {   745377248603805917u, 10587846778003503903u,          52528810517u },
+  { 11305561465807999667u, 17206244172922947013u,          21573968323u },
+  {  2211245518782892177u, 11620628420699303875u,         195932752365u },
+  { 14170095199249735666u, 17864732368219338611u,         237629955528u },
+  { 17849973668116118927u,  4146383014621345887u,         200968449082u },
+  {  9020960204585720001u, 11445705075042688243u,          58224775873u },
+  { 10807134002871850916u,  7369147888966546592u,         193620472915u },
+  {  3925122626254791201u,  9762476865090597796u,          83399482307u },
+  { 17208463291312718997u,  5507001428194242827u,         195529224931u },
+  {  5145077219589447653u, 11371471148365328344u,         227298535145u },
+  { 17602397765035489468u,  3148788104946538618u,         233616448686u },
+  { 16422643262490753377u,  3762722308424507574u,         174170696145u },
+  {  2902509461400906224u,  1156171244825745915u,         209203977585u },
+  {  3422418805967265206u, 14208921674868257865u,         113062676168u },
+  {  4228874576277237392u,  7903080886897905503u,         200770267187u },
+  {  2553488530807495751u,  6367240794154270982u,          51428426873u },
+  { 11546099176912486413u,  1623672396662369850u,         121345168815u },
+  { 10460791037534167991u, 18323231215381674394u,         175088019456u },
+  {  8127117908566000904u,  9842279843006544554u,            993304354u },
+  { 11541304458088287306u,  7376839231308610600u,          34533551059u },
+  {  6249718665174839700u,   609751749293657672u,         211399899256u },
+  { 13102508413386290995u, 10386457966860989799u,         120033054708u },
+  {  6274675218640661911u, 11160336020836149780u,         244563051014u },
+  {  3404497118599817167u, 17947559933847409193u,           6605003027u },
+  { 11258566093988562335u, 10229787001712704590u,          19972939173u },
+  { 16762592482501635397u, 10441677090043619866u,         165554557864u },
+  {  5550125446725071998u,  4996681336392922375u,         168566044449u },
+  {  6370033225258510318u,   124497102381021895u,          33270870638u },
+  {  1503521728674735398u,  8180812057779384577u,         110006749001u },
+  {  4250415082606384364u,  5294232873532946716u,          73443482710u },
+  {  6020091901030562974u,  2885620189169448039u,          86287000939u },
+  { 16288222967151527138u, 16662526875008170507u,         107156429783u },
+  {  6377016228656203782u, 15663095032402672480u,         215903277391u },
+  {  8378856515587563750u,  1824281504410546614u,          79849098083u },
+  { 15812881490200838483u,  9506565509584809953u,          99098894498u },
+  {  4548570371183413652u, 16941136942345070055u,         162515351948u },
+  { 16731431495283420383u, 15924115693705937725u,         140918380873u },
+  { 14737727629551135532u,  9247807690406628462u,          73863248041u },
+  { 12413722258104293893u,  7993916633864834871u,         169501324659u },
+  {   800899742400762438u,  1018504409177639408u,         115433351089u },
+  {   603197008376033550u, 12097800686634130718u,         177055213234u },
+  {  6380777281587743935u,  6221488888422637551u,         178655823089u },
+  { 10001440249018225388u,  8229322865256080421u,         241337267588u },
+  {  5505914461980436708u,  7927745108183101786u,         132446112486u },
+  {  1105464290051876864u,  8488683721235326653u,         230429763923u },
+  {  4500443576769970176u, 11165516518170922283u,          83460172466u },
+  {  2843045143185981440u,  5463648141113596927u,         178605283863u },
+  {   660949699682893824u,  3958440403860778042u,          23296184959u },
+  {   276549164618219520u,  5091534813990256011u,         127214587484u },
+  {  4683743612465315840u,  6100166970623291280u,          92276012655u },
+  {                    0u,  1913011027739012426u,         111330690714u },
+  {                    0u, 11310957650604221440u,         154103704535u },
+  {                    0u, 16303817257009020928u,         215613168242u },
+  {                    0u,  9090406322154766336u,         114883831704u },
+  {                    0u,  3003279315069566976u,         152492791914u },
+  {                    0u, 16582887146675765248u,         106162808097u },
+  {                    0u,  9691746398101307392u,          33898960113u },
+  {                    0u,                    0u,         241525390625u },
+  {                    0u,                    0u,          33000000000u },
+};
+
+_LIBCPP_END_NAMESPACE_STD
+
+// clang-format on
+
+#endif // _LIBCPP_SRC_INCLUDE_RYU_D2FIXED_FULL_TABLE_H
diff --git a/src/include/ryu/d2s.h b/src/include/ryu/d2s.h
new file mode 100644
index 0000000..15d50fd
--- /dev/null
+++ b/src/include/ryu/d2s.h
@@ -0,0 +1,62 @@
+//===----------------------------------------------------------------------===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+
+// Copyright (c) Microsoft Corporation.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+
+// Copyright 2018 Ulf Adams
+// Copyright (c) Microsoft Corporation. All rights reserved.
+
+// Boost Software License - Version 1.0 - August 17th, 2003
+
+// Permission is hereby granted, free of charge, to any person or organization
+// obtaining a copy of the software and accompanying documentation covered by
+// this license (the "Software") to use, reproduce, display, distribute,
+// execute, and transmit the Software, and to prepare derivative works of the
+// Software, and to permit third-parties to whom the Software is furnished to
+// do so, all subject to the following:
+
+// The copyright notices in the Software and this entire statement, including
+// the above license grant, this restriction and the following disclaimer,
+// must be included in all copies of the Software, in whole or in part, and
+// all derivative works of the Software, unless such copies or derivative
+// works are solely in the form of machine-executable object code generated by
+// a source language processor.
+
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT
+// SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE
+// FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,
+// ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+// DEALINGS IN THE SOFTWARE.
+
+#ifndef _LIBCPP_SRC_INCLUDE_RYU_DS2_H
+#define _LIBCPP_SRC_INCLUDE_RYU_DS2_H
+
+// Avoid formatting to keep the changes with the original code minimal.
+// clang-format off
+
+#include "__config"
+
+_LIBCPP_BEGIN_NAMESPACE_STD
+
+inline constexpr int __DOUBLE_MANTISSA_BITS = 52;
+inline constexpr int __DOUBLE_EXPONENT_BITS = 11;
+inline constexpr int __DOUBLE_BIAS = 1023;
+
+inline constexpr int __DOUBLE_POW5_INV_BITCOUNT = 122;
+inline constexpr int __DOUBLE_POW5_BITCOUNT = 121;
+
+[[nodiscard]] to_chars_result __d2s_buffered_n(char* const _First, char* const _Last, const double __f, const chars_format _Fmt);
+
+_LIBCPP_END_NAMESPACE_STD
+
+// clang-format on
+
+#endif // _LIBCPP_SRC_INCLUDE_RYU_DS2_H
diff --git a/src/include/ryu/d2s_full_table.h b/src/include/ryu/d2s_full_table.h
new file mode 100644
index 0000000..106fef0
--- /dev/null
+++ b/src/include/ryu/d2s_full_table.h
@@ -0,0 +1,368 @@
+//===----------------------------------------------------------------------===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+
+// Copyright (c) Microsoft Corporation.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+
+// Copyright 2018 Ulf Adams
+// Copyright (c) Microsoft Corporation. All rights reserved.
+
+// Boost Software License - Version 1.0 - August 17th, 2003
+
+// Permission is hereby granted, free of charge, to any person or organization
+// obtaining a copy of the software and accompanying documentation covered by
+// this license (the "Software") to use, reproduce, display, distribute,
+// execute, and transmit the Software, and to prepare derivative works of the
+// Software, and to permit third-parties to whom the Software is furnished to
+// do so, all subject to the following:
+
+// The copyright notices in the Software and this entire statement, including
+// the above license grant, this restriction and the following disclaimer,
+// must be included in all copies of the Software, in whole or in part, and
+// all derivative works of the Software, unless such copies or derivative
+// works are solely in the form of machine-executable object code generated by
+// a source language processor.
+
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT
+// SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE
+// FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,
+// ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+// DEALINGS IN THE SOFTWARE.
+
+#ifndef _LIBCPP_SRC_INCLUDE_RYU_D2S_FULL_TABLE_H
+#define _LIBCPP_SRC_INCLUDE_RYU_D2S_FULL_TABLE_H
+
+// Avoid formatting to keep the changes with the original code minimal.
+// clang-format off
+
+#include "__config"
+
+_LIBCPP_BEGIN_NAMESPACE_STD
+
+inline constexpr uint64_t __DOUBLE_POW5_INV_SPLIT[292][2] = {
+  {                    1u, 288230376151711744u }, {  3689348814741910324u, 230584300921369395u },
+  {  2951479051793528259u, 184467440737095516u }, { 17118578500402463900u, 147573952589676412u },
+  { 12632330341676300947u, 236118324143482260u }, { 10105864273341040758u, 188894659314785808u },
+  { 15463389048156653253u, 151115727451828646u }, { 17362724847566824558u, 241785163922925834u },
+  { 17579528692795369969u, 193428131138340667u }, {  6684925324752475329u, 154742504910672534u },
+  { 18074578149087781173u, 247588007857076054u }, { 18149011334012135262u, 198070406285660843u },
+  {  3451162622983977240u, 158456325028528675u }, {  5521860196774363583u, 253530120045645880u },
+  {  4417488157419490867u, 202824096036516704u }, {  7223339340677503017u, 162259276829213363u },
+  {  7867994130342094503u, 259614842926741381u }, {  2605046489531765280u, 207691874341393105u },
+  {  2084037191625412224u, 166153499473114484u }, { 10713157136084480204u, 265845599156983174u },
+  { 12259874523609494487u, 212676479325586539u }, { 13497248433629505913u, 170141183460469231u },
+  { 14216899864323388813u, 272225893536750770u }, { 11373519891458711051u, 217780714829400616u },
+  {  5409467098425058518u, 174224571863520493u }, {  4965798542738183305u, 278759314981632789u },
+  {  7661987648932456967u, 223007451985306231u }, {  2440241304404055250u, 178405961588244985u },
+  {  3904386087046488400u, 285449538541191976u }, { 17880904128604832013u, 228359630832953580u },
+  { 14304723302883865611u, 182687704666362864u }, { 15133127457049002812u, 146150163733090291u },
+  { 16834306301794583852u, 233840261972944466u }, {  9778096226693756759u, 187072209578355573u },
+  { 15201174610838826053u, 149657767662684458u }, {  2185786488890659746u, 239452428260295134u },
+  {  5437978005854438120u, 191561942608236107u }, { 15418428848909281466u, 153249554086588885u },
+  {  6222742084545298729u, 245199286538542217u }, { 16046240111861969953u, 196159429230833773u },
+  {  1768945645263844993u, 156927543384667019u }, { 10209010661905972635u, 251084069415467230u },
+  {  8167208529524778108u, 200867255532373784u }, { 10223115638361732810u, 160693804425899027u },
+  {  1599589762411131202u, 257110087081438444u }, {  4969020624670815285u, 205688069665150755u },
+  {  3975216499736652228u, 164550455732120604u }, { 13739044029062464211u, 263280729171392966u },
+  {  7301886408508061046u, 210624583337114373u }, { 13220206756290269483u, 168499666669691498u },
+  { 17462981995322520850u, 269599466671506397u }, {  6591687966774196033u, 215679573337205118u },
+  { 12652048002903177473u, 172543658669764094u }, {  9175230360419352987u, 276069853871622551u },
+  {  3650835473593572067u, 220855883097298041u }, { 17678063637842498946u, 176684706477838432u },
+  { 13527506561580357021u, 282695530364541492u }, {  3443307619780464970u, 226156424291633194u },
+  {  6443994910566282300u, 180925139433306555u }, {  5155195928453025840u, 144740111546645244u },
+  { 15627011115008661990u, 231584178474632390u }, { 12501608892006929592u, 185267342779705912u },
+  {  2622589484121723027u, 148213874223764730u }, {  4196143174594756843u, 237142198758023568u },
+  { 10735612169159626121u, 189713759006418854u }, { 12277838550069611220u, 151771007205135083u },
+  { 15955192865369467629u, 242833611528216133u }, {  1696107848069843133u, 194266889222572907u },
+  { 12424932722681605476u, 155413511378058325u }, {  1433148282581017146u, 248661618204893321u },
+  { 15903913885032455010u, 198929294563914656u }, {  9033782293284053685u, 159143435651131725u },
+  { 14454051669254485895u, 254629497041810760u }, { 11563241335403588716u, 203703597633448608u },
+  { 16629290697806691620u, 162962878106758886u }, {   781423413297334329u, 260740604970814219u },
+  {  4314487545379777786u, 208592483976651375u }, {  3451590036303822229u, 166873987181321100u },
+  {  5522544058086115566u, 266998379490113760u }, {  4418035246468892453u, 213598703592091008u },
+  { 10913125826658934609u, 170878962873672806u }, { 10082303693170474728u, 273406340597876490u },
+  {  8065842954536379782u, 218725072478301192u }, { 17520720807854834795u, 174980057982640953u },
+  {  5897060404116273733u, 279968092772225526u }, {  1028299508551108663u, 223974474217780421u },
+  { 15580034865808528224u, 179179579374224336u }, { 17549358155809824511u, 286687326998758938u },
+  {  2971440080422128639u, 229349861599007151u }, { 17134547323305344204u, 183479889279205720u },
+  { 13707637858644275364u, 146783911423364576u }, { 14553522944347019935u, 234854258277383322u },
+  {  4264120725993795302u, 187883406621906658u }, { 10789994210278856888u, 150306725297525326u },
+  {  9885293106962350374u, 240490760476040522u }, {   529536856086059653u, 192392608380832418u },
+  {  7802327114352668369u, 153914086704665934u }, {  1415676938738538420u, 246262538727465495u },
+  {  1132541550990830736u, 197010030981972396u }, { 15663428499760305882u, 157608024785577916u },
+  { 17682787970132668764u, 252172839656924666u }, { 10456881561364224688u, 201738271725539733u },
+  { 15744202878575200397u, 161390617380431786u }, { 17812026976236499989u, 258224987808690858u },
+  {  3181575136763469022u, 206579990246952687u }, { 13613306553636506187u, 165263992197562149u },
+  { 10713244041592678929u, 264422387516099439u }, { 12259944048016053467u, 211537910012879551u },
+  {  6118606423670932450u, 169230328010303641u }, {  2411072648389671274u, 270768524816485826u },
+  { 16686253377679378312u, 216614819853188660u }, { 13349002702143502650u, 173291855882550928u },
+  { 17669055508687693916u, 277266969412081485u }, { 14135244406950155133u, 221813575529665188u },
+  {   240149081334393137u, 177450860423732151u }, { 11452284974360759988u, 283921376677971441u },
+  {  5472479164746697667u, 227137101342377153u }, { 11756680961281178780u, 181709681073901722u },
+  {  2026647139541122378u, 145367744859121378u }, { 18000030682233437097u, 232588391774594204u },
+  { 18089373360528660001u, 186070713419675363u }, {  3403452244197197031u, 148856570735740291u },
+  { 16513570034941246220u, 238170513177184465u }, { 13210856027952996976u, 190536410541747572u },
+  {  3189987192878576934u, 152429128433398058u }, {  1414630693863812771u, 243886605493436893u },
+  {  8510402184574870864u, 195109284394749514u }, { 10497670562401807014u, 156087427515799611u },
+  {  9417575270359070576u, 249739884025279378u }, { 14912757845771077107u, 199791907220223502u },
+  {  4551508647133041040u, 159833525776178802u }, { 10971762650154775986u, 255733641241886083u },
+  { 16156107749607641435u, 204586912993508866u }, {  9235537384944202825u, 163669530394807093u },
+  { 11087511001168814197u, 261871248631691349u }, { 12559357615676961681u, 209496998905353079u },
+  { 13736834907283479668u, 167597599124282463u }, { 18289587036911657145u, 268156158598851941u },
+  { 10942320814787415393u, 214524926879081553u }, { 16132554281313752961u, 171619941503265242u },
+  { 11054691591134363444u, 274591906405224388u }, { 16222450902391311402u, 219673525124179510u },
+  { 12977960721913049122u, 175738820099343608u }, { 17075388340318968271u, 281182112158949773u },
+  {  2592264228029443648u, 224945689727159819u }, {  5763160197165465241u, 179956551781727855u },
+  {  9221056315464744386u, 287930482850764568u }, { 14755542681855616155u, 230344386280611654u },
+  { 15493782960226403247u, 184275509024489323u }, {  1326979923955391628u, 147420407219591459u },
+  {  9501865507812447252u, 235872651551346334u }, { 11290841220991868125u, 188698121241077067u },
+  {  1653975347309673853u, 150958496992861654u }, { 10025058185179298811u, 241533595188578646u },
+  {  4330697733401528726u, 193226876150862917u }, { 14532604630946953951u, 154581500920690333u },
+  {  1116074521063664381u, 247330401473104534u }, {  4582208431592841828u, 197864321178483627u },
+  { 14733813189500004432u, 158291456942786901u }, { 16195403473716186445u, 253266331108459042u },
+  {  5577625149489128510u, 202613064886767234u }, {  8151448934333213131u, 162090451909413787u },
+  { 16731667109675051333u, 259344723055062059u }, { 17074682502481951390u, 207475778444049647u },
+  {  6281048372501740465u, 165980622755239718u }, {  6360328581260874421u, 265568996408383549u },
+  {  8777611679750609860u, 212455197126706839u }, { 10711438158542398211u, 169964157701365471u },
+  {  9759603424184016492u, 271942652322184754u }, { 11497031554089123517u, 217554121857747803u },
+  { 16576322872755119460u, 174043297486198242u }, { 11764721337440549842u, 278469275977917188u },
+  { 16790474699436260520u, 222775420782333750u }, { 13432379759549008416u, 178220336625867000u },
+  {  3045063541568861850u, 285152538601387201u }, { 17193446092222730773u, 228122030881109760u },
+  { 13754756873778184618u, 182497624704887808u }, { 18382503128506368341u, 145998099763910246u },
+  {  3586563302416817083u, 233596959622256395u }, {  2869250641933453667u, 186877567697805116u },
+  { 17052795772514404226u, 149502054158244092u }, { 12527077977055405469u, 239203286653190548u },
+  { 17400360011128145022u, 191362629322552438u }, {  2852241564676785048u, 153090103458041951u },
+  { 15631632947708587046u, 244944165532867121u }, {  8815957543424959314u, 195955332426293697u },
+  { 18120812478965698421u, 156764265941034957u }, { 14235904707377476180u, 250822825505655932u },
+  {  4010026136418160298u, 200658260404524746u }, { 17965416168102169531u, 160526608323619796u },
+  {  2919224165770098987u, 256842573317791675u }, {  2335379332616079190u, 205474058654233340u },
+  {  1868303466092863352u, 164379246923386672u }, {  6678634360490491686u, 263006795077418675u },
+  {  5342907488392393349u, 210405436061934940u }, {  4274325990713914679u, 168324348849547952u },
+  { 10528270399884173809u, 269318958159276723u }, { 15801313949391159694u, 215455166527421378u },
+  {  1573004715287196786u, 172364133221937103u }, { 17274202803427156150u, 275782613155099364u },
+  { 17508711057483635243u, 220626090524079491u }, { 10317620031244997871u, 176500872419263593u },
+  { 12818843235250086271u, 282401395870821749u }, { 13944423402941979340u, 225921116696657399u },
+  { 14844887537095493795u, 180736893357325919u }, { 15565258844418305359u, 144589514685860735u },
+  {  6457670077359736959u, 231343223497377177u }, { 16234182506113520537u, 185074578797901741u },
+  {  9297997190148906106u, 148059663038321393u }, { 11187446689496339446u, 236895460861314229u },
+  { 12639306166338981880u, 189516368689051383u }, { 17490142562555006151u, 151613094951241106u },
+  {  2158786396894637579u, 242580951921985771u }, { 16484424376483351356u, 194064761537588616u },
+  {  9498190686444770762u, 155251809230070893u }, { 11507756283569722895u, 248402894768113429u },
+  { 12895553841597688639u, 198722315814490743u }, { 17695140702761971558u, 158977852651592594u },
+  { 17244178680193423523u, 254364564242548151u }, { 10105994129412828495u, 203491651394038521u },
+  {  4395446488788352473u, 162793321115230817u }, { 10722063196803274280u, 260469313784369307u },
+  {  1198952927958798777u, 208375451027495446u }, { 15716557601334680315u, 166700360821996356u },
+  { 17767794532651667857u, 266720577315194170u }, { 14214235626121334286u, 213376461852155336u },
+  {  7682039686155157106u, 170701169481724269u }, {  1223217053622520399u, 273121871170758831u },
+  { 15735968901865657612u, 218497496936607064u }, { 16278123936234436413u, 174797997549285651u },
+  {   219556594781725998u, 279676796078857043u }, {  7554342905309201445u, 223741436863085634u },
+  {  9732823138989271479u, 178993149490468507u }, {   815121763415193074u, 286389039184749612u },
+  { 11720143854957885429u, 229111231347799689u }, { 13065463898708218666u, 183288985078239751u },
+  {  6763022304224664610u, 146631188062591801u }, {  3442138057275642729u, 234609900900146882u },
+  { 13821756890046245153u, 187687920720117505u }, { 11057405512036996122u, 150150336576094004u },
+  {  6623802375033462826u, 240240538521750407u }, { 16367088344252501231u, 192192430817400325u },
+  { 13093670675402000985u, 153753944653920260u }, {  2503129006933649959u, 246006311446272417u },
+  { 13070549649772650937u, 196805049157017933u }, { 17835137349301941396u, 157444039325614346u },
+  {  2710778055689733971u, 251910462920982955u }, {  2168622444551787177u, 201528370336786364u },
+  {  5424246770383340065u, 161222696269429091u }, {  1300097203129523457u, 257956314031086546u },
+  { 15797473021471260058u, 206365051224869236u }, {  8948629602435097724u, 165092040979895389u },
+  {  3249760919670425388u, 264147265567832623u }, {  9978506365220160957u, 211317812454266098u },
+  { 15361502721659949412u, 169054249963412878u }, {  2442311466204457120u, 270486799941460606u },
+  { 16711244431931206989u, 216389439953168484u }, { 17058344360286875914u, 173111551962534787u },
+  { 12535955717491360170u, 276978483140055660u }, { 10028764573993088136u, 221582786512044528u },
+  { 15401709288678291155u, 177266229209635622u }, {  9885339602917624555u, 283625966735416996u },
+  {  4218922867592189321u, 226900773388333597u }, { 14443184738299482427u, 181520618710666877u },
+  {  4175850161155765295u, 145216494968533502u }, { 10370709072591134795u, 232346391949653603u },
+  { 15675264887556728482u, 185877113559722882u }, {  5161514280561562140u, 148701690847778306u },
+  {   879725219414678777u, 237922705356445290u }, {   703780175531743021u, 190338164285156232u },
+  { 11631070584651125387u, 152270531428124985u }, {   162968861732249003u, 243632850284999977u },
+  { 11198421533611530172u, 194906280227999981u }, {  5269388412147313814u, 155925024182399985u },
+  {  8431021459435702103u, 249480038691839976u }, {  3055468352806651359u, 199584030953471981u },
+  { 17201769941212962380u, 159667224762777584u }, { 16454785461715008838u, 255467559620444135u },
+  { 13163828369372007071u, 204374047696355308u }, { 17909760324981426303u, 163499238157084246u },
+  {  2830174816776909822u, 261598781051334795u }, {  2264139853421527858u, 209279024841067836u },
+  { 16568707141704863579u, 167423219872854268u }, {  4373838538276319787u, 267877151796566830u },
+  {  3499070830621055830u, 214301721437253464u }, {  6488605479238754987u, 171441377149802771u },
+  {  3003071137298187333u, 274306203439684434u }, {  6091805724580460189u, 219444962751747547u },
+  { 15941491023890099121u, 175555970201398037u }, { 10748990379256517301u, 280889552322236860u },
+  {  8599192303405213841u, 224711641857789488u }, { 14258051472207991719u, 179769313486231590u }
+};
+
+inline constexpr uint64_t __DOUBLE_POW5_SPLIT[326][2] = {
+  {                    0u,  72057594037927936u }, {                    0u,  90071992547409920u },
+  {                    0u, 112589990684262400u }, {                    0u, 140737488355328000u },
+  {                    0u,  87960930222080000u }, {                    0u, 109951162777600000u },
+  {                    0u, 137438953472000000u }, {                    0u,  85899345920000000u },
+  {                    0u, 107374182400000000u }, {                    0u, 134217728000000000u },
+  {                    0u,  83886080000000000u }, {                    0u, 104857600000000000u },
+  {                    0u, 131072000000000000u }, {                    0u,  81920000000000000u },
+  {                    0u, 102400000000000000u }, {                    0u, 128000000000000000u },
+  {                    0u,  80000000000000000u }, {                    0u, 100000000000000000u },
+  {                    0u, 125000000000000000u }, {                    0u,  78125000000000000u },
+  {                    0u,  97656250000000000u }, {                    0u, 122070312500000000u },
+  {                    0u,  76293945312500000u }, {                    0u,  95367431640625000u },
+  {                    0u, 119209289550781250u }, {  4611686018427387904u,  74505805969238281u },
+  { 10376293541461622784u,  93132257461547851u }, {  8358680908399640576u, 116415321826934814u },
+  {   612489549322387456u,  72759576141834259u }, { 14600669991935148032u,  90949470177292823u },
+  { 13639151471491547136u, 113686837721616029u }, {  3213881284082270208u, 142108547152020037u },
+  {  4314518811765112832u,  88817841970012523u }, {   781462496279003136u, 111022302462515654u },
+  { 10200200157203529728u, 138777878078144567u }, { 13292654125893287936u,  86736173798840354u },
+  {  7392445620511834112u, 108420217248550443u }, {  4628871007212404736u, 135525271560688054u },
+  { 16728102434789916672u,  84703294725430033u }, {  7075069988205232128u, 105879118406787542u },
+  { 18067209522111315968u, 132348898008484427u }, {  8986162942105878528u,  82718061255302767u },
+  {  6621017659204960256u, 103397576569128459u }, {  3664586055578812416u, 129246970711410574u },
+  { 16125424340018921472u,  80779356694631608u }, {  1710036351314100224u, 100974195868289511u },
+  { 15972603494424788992u, 126217744835361888u }, {  9982877184015493120u,  78886090522101180u },
+  { 12478596480019366400u,  98607613152626475u }, { 10986559581596820096u, 123259516440783094u },
+  {  2254913720070624656u,  77037197775489434u }, { 12042014186943056628u,  96296497219361792u },
+  { 15052517733678820785u, 120370621524202240u }, {  9407823583549262990u,  75231638452626400u },
+  { 11759779479436578738u,  94039548065783000u }, { 14699724349295723422u, 117549435082228750u },
+  {  4575641699882439235u,  73468396926392969u }, { 10331238143280436948u,  91835496157991211u },
+  {  8302361660673158281u, 114794370197489014u }, {  1154580038986672043u, 143492962746861268u },
+  {  9944984561221445835u,  89683101716788292u }, { 12431230701526807293u, 112103877145985365u },
+  {  1703980321626345405u, 140129846432481707u }, { 17205888765512323542u,  87581154020301066u },
+  { 12283988920035628619u, 109476442525376333u }, {  1519928094762372062u, 136845553156720417u },
+  { 12479170105294952299u,  85528470722950260u }, { 15598962631618690374u, 106910588403687825u },
+  {  5663645234241199255u, 133638235504609782u }, { 17374836326682913246u,  83523897190381113u },
+  {  7883487353071477846u, 104404871487976392u }, {  9854359191339347308u, 130506089359970490u },
+  { 10770660513014479971u,  81566305849981556u }, { 13463325641268099964u, 101957882312476945u },
+  {  2994098996302961243u, 127447352890596182u }, { 15706369927971514489u,  79654595556622613u },
+  {  5797904354682229399u,  99568244445778267u }, {  2635694424925398845u, 124460305557222834u },
+  {  6258995034005762182u,  77787690973264271u }, {  3212057774079814824u,  97234613716580339u },
+  { 17850130272881932242u, 121543267145725423u }, { 18073860448192289507u,  75964541966078389u },
+  {  8757267504958198172u,  94955677457597987u }, {  6334898362770359811u, 118694596821997484u },
+  { 13182683513586250689u,  74184123013748427u }, { 11866668373555425458u,  92730153767185534u },
+  {  5609963430089506015u, 115912692208981918u }, { 17341285199088104971u,  72445432630613698u },
+  { 12453234462005355406u,  90556790788267123u }, { 10954857059079306353u, 113195988485333904u },
+  { 13693571323849132942u, 141494985606667380u }, { 17781854114260483896u,  88434366004167112u },
+  {  3780573569116053255u, 110542957505208891u }, {   114030942967678664u, 138178696881511114u },
+  {  4682955357782187069u,  86361685550944446u }, { 15077066234082509644u, 107952106938680557u },
+  {  5011274737320973344u, 134940133673350697u }, { 14661261756894078100u,  84337583545844185u },
+  {  4491519140835433913u, 105421979432305232u }, {  5614398926044292391u, 131777474290381540u },
+  { 12732371365632458552u,  82360921431488462u }, {  6692092170185797382u, 102951151789360578u },
+  { 17588487249587022536u, 128688939736700722u }, { 15604490549419276989u,  80430587335437951u },
+  { 14893927168346708332u, 100538234169297439u }, { 14005722942005997511u, 125672792711621799u },
+  { 15671105866394830300u,  78545495444763624u }, {  1142138259283986260u,  98181869305954531u },
+  { 15262730879387146537u, 122727336632443163u }, {  7233363790403272633u,  76704585395276977u },
+  { 13653390756431478696u,  95880731744096221u }, {  3231680390257184658u, 119850914680120277u },
+  {  4325643253124434363u,  74906821675075173u }, { 10018740084832930858u,  93633527093843966u },
+  {  3300053069186387764u, 117041908867304958u }, { 15897591223523656064u,  73151193042065598u },
+  { 10648616992549794273u,  91438991302581998u }, {  4087399203832467033u, 114298739128227498u },
+  { 14332621041645359599u, 142873423910284372u }, { 18181260187883125557u,  89295889943927732u },
+  {  4279831161144355331u, 111619862429909666u }, { 14573160988285219972u, 139524828037387082u },
+  { 13719911636105650386u,  87203017523366926u }, {  7926517508277287175u, 109003771904208658u },
+  {   684774848491833161u, 136254714880260823u }, {  7345513307948477581u,  85159196800163014u },
+  { 18405263671790372785u, 106448996000203767u }, { 18394893571310578077u, 133061245000254709u },
+  { 13802651491282805250u,  83163278125159193u }, {  3418256308821342851u, 103954097656448992u },
+  {  4272820386026678563u, 129942622070561240u }, {  2670512741266674102u,  81214138794100775u },
+  { 17173198981865506339u, 101517673492625968u }, {  3019754653622331308u, 126897091865782461u },
+  {  4193189667727651020u,  79310682416114038u }, { 14464859121514339583u,  99138353020142547u },
+  { 13469387883465536574u, 123922941275178184u }, {  8418367427165960359u,  77451838296986365u },
+  { 15134645302384838353u,  96814797871232956u }, {   471562554271496325u, 121018497339041196u },
+  {  9518098633274461011u,  75636560836900747u }, {  7285937273165688360u,  94545701046125934u },
+  { 18330793628311886258u, 118182126307657417u }, {  4539216990053847055u,  73863828942285886u },
+  { 14897393274422084627u,  92329786177857357u }, {  4786683537745442072u, 115412232722321697u },
+  { 14520892257159371055u,  72132645451451060u }, { 18151115321449213818u,  90165806814313825u },
+  {  8853836096529353561u, 112707258517892282u }, {  1843923083806916143u, 140884073147365353u },
+  { 12681666973447792349u,  88052545717103345u }, {  2017025661527576725u, 110065682146379182u },
+  { 11744654113764246714u, 137582102682973977u }, {   422879793461572340u,  85988814176858736u },
+  {   528599741826965425u, 107486017721073420u }, {   660749677283706782u, 134357522151341775u },
+  {  7330497575943398595u,  83973451344588609u }, { 13774807988356636147u, 104966814180735761u },
+  {  3383451930163631472u, 131208517725919702u }, { 15949715511634433382u,  82005323578699813u },
+  {  6102086334260878016u, 102506654473374767u }, {  3015921899398709616u, 128133318091718459u },
+  { 18025852251620051174u,  80083323807324036u }, {  4085571240815512351u, 100104154759155046u },
+  { 14330336087874166247u, 125130193448943807u }, { 15873989082562435760u,  78206370905589879u },
+  { 15230800334775656796u,  97757963631987349u }, {  5203442363187407284u, 122197454539984187u },
+  {   946308467778435600u,  76373409087490117u }, {  5794571603150432404u,  95466761359362646u },
+  { 16466586540792816313u, 119333451699203307u }, {  7985773578781816244u,  74583407312002067u },
+  {  5370530955049882401u,  93229259140002584u }, {  6713163693812353001u, 116536573925003230u },
+  { 18030785363914884337u,  72835358703127018u }, { 13315109668038829614u,  91044198378908773u },
+  {  2808829029766373305u, 113805247973635967u }, { 17346094342490130344u, 142256559967044958u },
+  {  6229622945628943561u,  88910349979403099u }, {  3175342663608791547u, 111137937474253874u },
+  { 13192550366365765242u, 138922421842817342u }, {  3633657960551215372u,  86826513651760839u },
+  { 18377130505971182927u, 108533142064701048u }, {  4524669058754427043u, 135666427580876311u },
+  {  9745447189362598758u,  84791517238047694u }, {  2958436949848472639u, 105989396547559618u },
+  { 12921418224165366607u, 132486745684449522u }, { 12687572408530742033u,  82804216052780951u },
+  { 11247779492236039638u, 103505270065976189u }, {   224666310012885835u, 129381587582470237u },
+  {  2446259452971747599u,  80863492239043898u }, { 12281196353069460307u, 101079365298804872u },
+  { 15351495441336825384u, 126349206623506090u }, { 14206370669262903769u,  78968254139691306u },
+  {  8534591299723853903u,  98710317674614133u }, { 15279925143082205283u, 123387897093267666u },
+  { 14161639232853766206u,  77117435683292291u }, { 13090363022639819853u,  96396794604115364u },
+  { 16362953778299774816u, 120495993255144205u }, { 12532689120651053212u,  75309995784465128u },
+  { 15665861400813816515u,  94137494730581410u }, { 10358954714162494836u, 117671868413226763u },
+  {  4168503687137865320u,  73544917758266727u }, {   598943590494943747u,  91931147197833409u },
+  {  5360365506546067587u, 114913933997291761u }, { 11312142901609972388u, 143642417496614701u },
+  {  9375932322719926695u,  89776510935384188u }, { 11719915403399908368u, 112220638669230235u },
+  { 10038208235822497557u, 140275798336537794u }, { 10885566165816448877u,  87672373960336121u },
+  { 18218643725697949000u, 109590467450420151u }, { 18161618638695048346u, 136988084313025189u },
+  { 13656854658398099168u,  85617552695640743u }, { 12459382304570236056u, 107021940869550929u },
+  {  1739169825430631358u, 133777426086938662u }, { 14922039196176308311u,  83610891304336663u },
+  { 14040862976792997485u, 104513614130420829u }, {  3716020665709083144u, 130642017663026037u },
+  {  4628355925281870917u,  81651261039391273u }, { 10397130925029726550u, 102064076299239091u },
+  {  8384727637859770284u, 127580095374048864u }, {  5240454773662356427u,  79737559608780540u },
+  {  6550568467077945534u,  99671949510975675u }, {  3576524565420044014u, 124589936888719594u },
+  {  6847013871814915412u,  77868710555449746u }, { 17782139376623420074u,  97335888194312182u },
+  { 13004302183924499284u, 121669860242890228u }, { 17351060901807587860u,  76043662651806392u },
+  {  3242082053549933210u,  95054578314757991u }, { 17887660622219580224u, 118818222893447488u },
+  { 11179787888887237640u,  74261389308404680u }, { 13974734861109047050u,  92826736635505850u },
+  {  8245046539531533005u, 116033420794382313u }, { 16682369133275677888u,  72520887996488945u },
+  {  7017903361312433648u,  90651109995611182u }, { 17995751238495317868u, 113313887494513977u },
+  {  8659630992836983623u, 141642359368142472u }, {  5412269370523114764u,  88526474605089045u },
+  { 11377022731581281359u, 110658093256361306u }, {  4997906377621825891u, 138322616570451633u },
+  { 14652906532082110942u,  86451635356532270u }, {  9092761128247862869u, 108064544195665338u },
+  {  2142579373455052779u, 135080680244581673u }, { 12868327154477877747u,  84425425152863545u },
+  {  2250350887815183471u, 105531781441079432u }, {  2812938609768979339u, 131914726801349290u },
+  {  6369772649532999991u,  82446704250843306u }, { 17185587848771025797u, 103058380313554132u },
+  {  3035240737254230630u, 128822975391942666u }, {  6508711479211282048u,  80514359619964166u },
+  { 17359261385868878368u, 100642949524955207u }, { 17087390713908710056u, 125803686906194009u },
+  {  3762090168551861929u,  78627304316371256u }, {  4702612710689827411u,  98284130395464070u },
+  { 15101637925217060072u, 122855162994330087u }, { 16356052730901744401u,  76784476871456304u },
+  {  1998321839917628885u,  95980596089320381u }, {  7109588318324424010u, 119975745111650476u },
+  { 13666864735807540814u,  74984840694781547u }, { 12471894901332038114u,  93731050868476934u },
+  {  6366496589810271835u, 117163813585596168u }, {  3979060368631419896u,  73227383490997605u },
+  {  9585511479216662775u,  91534229363747006u }, {  2758517312166052660u, 114417786704683758u },
+  { 12671518677062341634u, 143022233380854697u }, {  1002170145522881665u,  89388895863034186u },
+  { 10476084718758377889u, 111736119828792732u }, { 13095105898447972362u, 139670149785990915u },
+  {  5878598177316288774u,  87293843616244322u }, { 16571619758500136775u, 109117304520305402u },
+  { 11491152661270395161u, 136396630650381753u }, {   264441385652915120u,  85247894156488596u },
+  {   330551732066143900u, 106559867695610745u }, {  5024875683510067779u, 133199834619513431u },
+  { 10058076329834874218u,  83249896637195894u }, {  3349223375438816964u, 104062370796494868u },
+  {  4186529219298521205u, 130077963495618585u }, { 14145795808130045513u,  81298727184761615u },
+  { 13070558741735168987u, 101623408980952019u }, { 11726512408741573330u, 127029261226190024u },
+  {  7329070255463483331u,  79393288266368765u }, { 13773023837756742068u,  99241610332960956u },
+  { 17216279797195927585u, 124052012916201195u }, {  8454331864033760789u,  77532508072625747u },
+  {  5956228811614813082u,  96915635090782184u }, {  7445286014518516353u, 121144543863477730u },
+  {  9264989777501460624u,  75715339914673581u }, { 16192923240304213684u,  94644174893341976u },
+  {  1794409976670715490u, 118305218616677471u }, {  8039035263060279037u,  73940761635423419u },
+  {  5437108060397960892u,  92425952044279274u }, { 16019757112352226923u, 115532440055349092u },
+  {   788976158365366019u,  72207775034593183u }, { 14821278253238871236u,  90259718793241478u },
+  {  9303225779693813237u, 112824648491551848u }, { 11629032224617266546u, 141030810614439810u },
+  { 11879831158813179495u,  88144256634024881u }, {  1014730893234310657u, 110180320792531102u },
+  { 10491785653397664129u, 137725400990663877u }, {  8863209042587234033u,  86078375619164923u },
+  {  6467325284806654637u, 107597969523956154u }, { 17307528642863094104u, 134497461904945192u },
+  { 10817205401789433815u,  84060913690590745u }, { 18133192770664180173u, 105076142113238431u },
+  { 18054804944902837312u, 131345177641548039u }, { 18201782118205355176u,  82090736025967524u },
+  {  4305483574047142354u, 102613420032459406u }, { 14605226504413703751u, 128266775040574257u },
+  {  2210737537617482988u,  80166734400358911u }, { 16598479977304017447u, 100208418000448638u },
+  { 11524727934775246001u, 125260522500560798u }, {  2591268940807140847u,  78287826562850499u },
+  { 17074144231291089770u,  97859783203563123u }, { 16730994270686474309u, 122324729004453904u },
+  { 10456871419179046443u,  76452955627783690u }, {  3847717237119032246u,  95566194534729613u },
+  {  9421332564826178211u, 119457743168412016u }, {  5888332853016361382u,  74661089480257510u },
+  { 16583788103125227536u,  93326361850321887u }, { 16118049110479146516u, 116657952312902359u },
+  { 16991309721690548428u,  72911220195563974u }, { 12015765115258409727u,  91139025244454968u },
+  { 15019706394073012159u, 113923781555568710u }, {  9551260955736489391u, 142404726944460888u },
+  {  5969538097335305869u,  89002954340288055u }, {  2850236603241744433u, 111253692925360069u }
+};
+
+_LIBCPP_END_NAMESPACE_STD
+
+// clang-format on
+
+#endif // _LIBCPP_SRC_INCLUDE_RYU_D2S_FULL_TABLE_H
diff --git a/src/include/ryu/d2s_intrinsics.h b/src/include/ryu/d2s_intrinsics.h
new file mode 100644
index 0000000..9f6632e
--- /dev/null
+++ b/src/include/ryu/d2s_intrinsics.h
@@ -0,0 +1,257 @@
+//===----------------------------------------------------------------------===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+
+// Copyright (c) Microsoft Corporation.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+
+// Copyright 2018 Ulf Adams
+// Copyright (c) Microsoft Corporation. All rights reserved.
+
+// Boost Software License - Version 1.0 - August 17th, 2003
+
+// Permission is hereby granted, free of charge, to any person or organization
+// obtaining a copy of the software and accompanying documentation covered by
+// this license (the "Software") to use, reproduce, display, distribute,
+// execute, and transmit the Software, and to prepare derivative works of the
+// Software, and to permit third-parties to whom the Software is furnished to
+// do so, all subject to the following:
+
+// The copyright notices in the Software and this entire statement, including
+// the above license grant, this restriction and the following disclaimer,
+// must be included in all copies of the Software, in whole or in part, and
+// all derivative works of the Software, unless such copies or derivative
+// works are solely in the form of machine-executable object code generated by
+// a source language processor.
+
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT
+// SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE
+// FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,
+// ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+// DEALINGS IN THE SOFTWARE.
+
+#ifndef _LIBCPP_SRC_INCLUDE_RYU_DS2_INTRINSICS_H
+#define _LIBCPP_SRC_INCLUDE_RYU_DS2_INTRINSICS_H
+
+// Avoid formatting to keep the changes with the original code minimal.
+// clang-format off
+
+#include "__config"
+
+_LIBCPP_BEGIN_NAMESPACE_STD
+
+#if defined(_M_X64) && defined(_MSC_VER)
+#define _LIBCPP_INTRINSIC128 1
+[[nodiscard]] _LIBCPP_HIDE_FROM_ABI inline uint64_t __ryu_umul128(const uint64_t __a, const uint64_t __b, uint64_t* const __productHi) {
+  return _umul128(__a, __b, __productHi);
+}
+
+[[nodiscard]] _LIBCPP_HIDE_FROM_ABI inline uint64_t __ryu_shiftright128(const uint64_t __lo, const uint64_t __hi, const uint32_t __dist) {
+  // For the __shiftright128 intrinsic, the shift value is always
+  // modulo 64.
+  // In the current implementation of the double-precision version
+  // of Ryu, the shift value is always < 64.
+  // (The shift value is in the range [49, 58].)
+  // Check this here in case a future change requires larger shift
+  // values. In this case this function needs to be adjusted.
+  _LIBCPP_ASSERT(__dist < 64, "");
+  return __shiftright128(__lo, __hi, static_cast<unsigned char>(__dist));
+}
+
+// ^^^ intrinsics available ^^^ / vvv __int128 available vvv
+#elif defined(__SIZEOF_INT128__) && ( \
+    (defined(__clang__) && !defined(_MSC_VER)) || \
+    (defined(__GNUC__) && !defined(__clang__) && !defined(__CUDACC__)))
+#define _LIBCPP_INTRINSIC128 1
+  // We have __uint128 support in clang or gcc
+[[nodiscard]] _LIBCPP_HIDE_FROM_ABI inline uint64_t __ryu_umul128(const uint64_t __a, const uint64_t __b, uint64_t* const __productHi) {
+  auto __temp = __a * (unsigned __int128)__b;
+  *__productHi = __temp >> 64;
+  return static_cast<uint64_t>(__temp);
+}
+
+[[nodiscard]] _LIBCPP_HIDE_FROM_ABI inline uint64_t __ryu_shiftright128(const uint64_t __lo, const uint64_t __hi, const uint32_t __dist) {
+  // In the current implementation of the double-precision version
+  // of Ryu, the shift value is always < 64.
+  // (The shift value is in the range [49, 58].)
+  // Check this here in case a future change requires larger shift
+  // values. In this case this function needs to be adjusted.
+  _LIBCPP_ASSERT(__dist < 64, "");
+  auto __temp = __lo | ((unsigned __int128)__hi << 64);
+  // For x64 128-bit shfits using the `shrd` instruction and two 64-bit
+  // registers, the shift value is modulo 64.  Thus the `& 63` is free.
+  return static_cast<uint64_t>(__temp >> (__dist & 63));
+}
+#else // ^^^ __int128 available ^^^ / vvv intrinsics unavailable vvv
+
+[[nodiscard]] _LIBCPP_HIDE_FROM_ABI inline _LIBCPP_ALWAYS_INLINE uint64_t __ryu_umul128(const uint64_t __a, const uint64_t __b, uint64_t* const __productHi) {
+  // TRANSITION, VSO-634761
+  // The casts here help MSVC to avoid calls to the __allmul library function.
+  const uint32_t __aLo = static_cast<uint32_t>(__a);
+  const uint32_t __aHi = static_cast<uint32_t>(__a >> 32);
+  const uint32_t __bLo = static_cast<uint32_t>(__b);
+  const uint32_t __bHi = static_cast<uint32_t>(__b >> 32);
+
+  const uint64_t __b00 = static_cast<uint64_t>(__aLo) * __bLo;
+  const uint64_t __b01 = static_cast<uint64_t>(__aLo) * __bHi;
+  const uint64_t __b10 = static_cast<uint64_t>(__aHi) * __bLo;
+  const uint64_t __b11 = static_cast<uint64_t>(__aHi) * __bHi;
+
+  const uint32_t __b00Lo = static_cast<uint32_t>(__b00);
+  const uint32_t __b00Hi = static_cast<uint32_t>(__b00 >> 32);
+
+  const uint64_t __mid1 = __b10 + __b00Hi;
+  const uint32_t __mid1Lo = static_cast<uint32_t>(__mid1);
+  const uint32_t __mid1Hi = static_cast<uint32_t>(__mid1 >> 32);
+
+  const uint64_t __mid2 = __b01 + __mid1Lo;
+  const uint32_t __mid2Lo = static_cast<uint32_t>(__mid2);
+  const uint32_t __mid2Hi = static_cast<uint32_t>(__mid2 >> 32);
+
+  const uint64_t __pHi = __b11 + __mid1Hi + __mid2Hi;
+  const uint64_t __pLo = (static_cast<uint64_t>(__mid2Lo) << 32) | __b00Lo;
+
+  *__productHi = __pHi;
+  return __pLo;
+}
+
+[[nodiscard]] _LIBCPP_HIDE_FROM_ABI inline uint64_t __ryu_shiftright128(const uint64_t __lo, const uint64_t __hi, const uint32_t __dist) {
+  // We don't need to handle the case __dist >= 64 here (see above).
+  _LIBCPP_ASSERT(__dist < 64, "");
+#ifdef _LIBCPP_64_BIT
+  _LIBCPP_ASSERT(__dist > 0, "");
+  return (__hi << (64 - __dist)) | (__lo >> __dist);
+#else // ^^^ 64-bit ^^^ / vvv 32-bit vvv
+  // Avoid a 64-bit shift by taking advantage of the range of shift values.
+  _LIBCPP_ASSERT(__dist >= 32, "");
+  return (__hi << (64 - __dist)) | (static_cast<uint32_t>(__lo >> 32) >> (__dist - 32));
+#endif // ^^^ 32-bit ^^^
+}
+
+#endif // ^^^ intrinsics unavailable ^^^
+
+#ifndef _LIBCPP_64_BIT
+
+// Returns the high 64 bits of the 128-bit product of __a and __b.
+[[nodiscard]] _LIBCPP_HIDE_FROM_ABI inline uint64_t __umulh(const uint64_t __a, const uint64_t __b) {
+  // Reuse the __ryu_umul128 implementation.
+  // Optimizers will likely eliminate the instructions used to compute the
+  // low part of the product.
+  uint64_t __hi;
+  (void) __ryu_umul128(__a, __b, &__hi);
+  return __hi;
+}
+
+// On 32-bit platforms, compilers typically generate calls to library
+// functions for 64-bit divisions, even if the divisor is a constant.
+//
+// TRANSITION, LLVM-37932
+//
+// The functions here perform division-by-constant using multiplications
+// in the same way as 64-bit compilers would do.
+//
+// NB:
+// The multipliers and shift values are the ones generated by clang x64
+// for expressions like x/5, x/10, etc.
+
+[[nodiscard]] _LIBCPP_HIDE_FROM_ABI inline uint64_t __div5(const uint64_t __x) {
+  return __umulh(__x, 0xCCCCCCCCCCCCCCCDu) >> 2;
+}
+
+[[nodiscard]] _LIBCPP_HIDE_FROM_ABI inline uint64_t __div10(const uint64_t __x) {
+  return __umulh(__x, 0xCCCCCCCCCCCCCCCDu) >> 3;
+}
+
+[[nodiscard]] _LIBCPP_HIDE_FROM_ABI inline uint64_t __div100(const uint64_t __x) {
+  return __umulh(__x >> 2, 0x28F5C28F5C28F5C3u) >> 2;
+}
+
+[[nodiscard]] _LIBCPP_HIDE_FROM_ABI inline uint64_t __div1e8(const uint64_t __x) {
+  return __umulh(__x, 0xABCC77118461CEFDu) >> 26;
+}
+
+[[nodiscard]] _LIBCPP_HIDE_FROM_ABI inline uint64_t __div1e9(const uint64_t __x) {
+  return __umulh(__x >> 9, 0x44B82FA09B5A53u) >> 11;
+}
+
+[[nodiscard]] _LIBCPP_HIDE_FROM_ABI inline uint32_t __mod1e9(const uint64_t __x) {
+  // Avoid 64-bit math as much as possible.
+  // Returning static_cast<uint32_t>(__x - 1000000000 * __div1e9(__x)) would
+  // perform 32x64-bit multiplication and 64-bit subtraction.
+  // __x and 1000000000 * __div1e9(__x) are guaranteed to differ by
+  // less than 10^9, so their highest 32 bits must be identical,
+  // so we can truncate both sides to uint32_t before subtracting.
+  // We can also simplify static_cast<uint32_t>(1000000000 * __div1e9(__x)).
+  // We can truncate before multiplying instead of after, as multiplying
+  // the highest 32 bits of __div1e9(__x) can't affect the lowest 32 bits.
+  return static_cast<uint32_t>(__x) - 1000000000 * static_cast<uint32_t>(__div1e9(__x));
+}
+
+#else // ^^^ 32-bit ^^^ / vvv 64-bit vvv
+
+[[nodiscard]] _LIBCPP_HIDE_FROM_ABI inline uint64_t __div5(const uint64_t __x) {
+  return __x / 5;
+}
+
+[[nodiscard]] _LIBCPP_HIDE_FROM_ABI inline uint64_t __div10(const uint64_t __x) {
+  return __x / 10;
+}
+
+[[nodiscard]] _LIBCPP_HIDE_FROM_ABI inline uint64_t __div100(const uint64_t __x) {
+  return __x / 100;
+}
+
+[[nodiscard]] _LIBCPP_HIDE_FROM_ABI inline uint64_t __div1e8(const uint64_t __x) {
+  return __x / 100000000;
+}
+
+[[nodiscard]] _LIBCPP_HIDE_FROM_ABI inline uint64_t __div1e9(const uint64_t __x) {
+  return __x / 1000000000;
+}
+
+[[nodiscard]] _LIBCPP_HIDE_FROM_ABI inline uint32_t __mod1e9(const uint64_t __x) {
+  return static_cast<uint32_t>(__x - 1000000000 * __div1e9(__x));
+}
+
+#endif // ^^^ 64-bit ^^^
+
+[[nodiscard]] _LIBCPP_HIDE_FROM_ABI inline uint32_t __pow5Factor(uint64_t __value) {
+  uint32_t __count = 0;
+  for (;;) {
+    _LIBCPP_ASSERT(__value != 0, "");
+    const uint64_t __q = __div5(__value);
+    const uint32_t __r = static_cast<uint32_t>(__value) - 5 * static_cast<uint32_t>(__q);
+    if (__r != 0) {
+      break;
+    }
+    __value = __q;
+    ++__count;
+  }
+  return __count;
+}
+
+// Returns true if __value is divisible by 5^__p.
+[[nodiscard]] _LIBCPP_HIDE_FROM_ABI inline bool __multipleOfPowerOf5(const uint64_t __value, const uint32_t __p) {
+  // I tried a case distinction on __p, but there was no performance difference.
+  return __pow5Factor(__value) >= __p;
+}
+
+// Returns true if __value is divisible by 2^__p.
+[[nodiscard]] _LIBCPP_HIDE_FROM_ABI inline bool __multipleOfPowerOf2(const uint64_t __value, const uint32_t __p) {
+  _LIBCPP_ASSERT(__value != 0, "");
+  _LIBCPP_ASSERT(__p < 64, "");
+  // __builtin_ctzll doesn't appear to be faster here.
+  return (__value & ((1ull << __p) - 1)) == 0;
+}
+
+_LIBCPP_END_NAMESPACE_STD
+
+// clang-format on
+
+#endif // _LIBCPP_SRC_INCLUDE_RYU_DS2_INTRINSICS_H
diff --git a/src/include/ryu/digit_table.h b/src/include/ryu/digit_table.h
new file mode 100644
index 0000000..3962f66
--- /dev/null
+++ b/src/include/ryu/digit_table.h
@@ -0,0 +1,68 @@
+//===----------------------------------------------------------------------===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+
+// Copyright (c) Microsoft Corporation.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+
+// Copyright 2018 Ulf Adams
+// Copyright (c) Microsoft Corporation. All rights reserved.
+
+// Boost Software License - Version 1.0 - August 17th, 2003
+
+// Permission is hereby granted, free of charge, to any person or organization
+// obtaining a copy of the software and accompanying documentation covered by
+// this license (the "Software") to use, reproduce, display, distribute,
+// execute, and transmit the Software, and to prepare derivative works of the
+// Software, and to permit third-parties to whom the Software is furnished to
+// do so, all subject to the following:
+
+// The copyright notices in the Software and this entire statement, including
+// the above license grant, this restriction and the following disclaimer,
+// must be included in all copies of the Software, in whole or in part, and
+// all derivative works of the Software, unless such copies or derivative
+// works are solely in the form of machine-executable object code generated by
+// a source language processor.
+
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT
+// SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE
+// FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,
+// ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+// DEALINGS IN THE SOFTWARE.
+
+#ifndef _LIBCPP_SRC_INCLUDE_RYU_DIGIT_TABLE_H
+#define _LIBCPP_SRC_INCLUDE_RYU_DIGIT_TABLE_H
+
+// Avoid formatting to keep the changes with the original code minimal.
+// clang-format off
+
+#include "__config"
+
+_LIBCPP_BEGIN_NAMESPACE_STD
+
+// A table of all two-digit numbers. This is used to speed up decimal digit
+// generation by copying pairs of digits into the final output.
+inline constexpr char __DIGIT_TABLE[200] = {
+  '0','0','0','1','0','2','0','3','0','4','0','5','0','6','0','7','0','8','0','9',
+  '1','0','1','1','1','2','1','3','1','4','1','5','1','6','1','7','1','8','1','9',
+  '2','0','2','1','2','2','2','3','2','4','2','5','2','6','2','7','2','8','2','9',
+  '3','0','3','1','3','2','3','3','3','4','3','5','3','6','3','7','3','8','3','9',
+  '4','0','4','1','4','2','4','3','4','4','4','5','4','6','4','7','4','8','4','9',
+  '5','0','5','1','5','2','5','3','5','4','5','5','5','6','5','7','5','8','5','9',
+  '6','0','6','1','6','2','6','3','6','4','6','5','6','6','6','7','6','8','6','9',
+  '7','0','7','1','7','2','7','3','7','4','7','5','7','6','7','7','7','8','7','9',
+  '8','0','8','1','8','2','8','3','8','4','8','5','8','6','8','7','8','8','8','9',
+  '9','0','9','1','9','2','9','3','9','4','9','5','9','6','9','7','9','8','9','9'
+};
+
+_LIBCPP_END_NAMESPACE_STD
+
+// clang-format on
+
+#endif // _LIBCPP_SRC_INCLUDE_RYU_DIGIT_TABLE_H
diff --git a/src/include/ryu/f2s.h b/src/include/ryu/f2s.h
new file mode 100644
index 0000000..80fdcd4
--- /dev/null
+++ b/src/include/ryu/f2s.h
@@ -0,0 +1,55 @@
+//===----------------------------------------------------------------------===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+
+// Copyright (c) Microsoft Corporation.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+
+// Copyright 2018 Ulf Adams
+// Copyright (c) Microsoft Corporation. All rights reserved.
+
+// Boost Software License - Version 1.0 - August 17th, 2003
+
+// Permission is hereby granted, free of charge, to any person or organization
+// obtaining a copy of the software and accompanying documentation covered by
+// this license (the "Software") to use, reproduce, display, distribute,
+// execute, and transmit the Software, and to prepare derivative works of the
+// Software, and to permit third-parties to whom the Software is furnished to
+// do so, all subject to the following:
+
+// The copyright notices in the Software and this entire statement, including
+// the above license grant, this restriction and the following disclaimer,
+// must be included in all copies of the Software, in whole or in part, and
+// all derivative works of the Software, unless such copies or derivative
+// works are solely in the form of machine-executable object code generated by
+// a source language processor.
+
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT
+// SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE
+// FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,
+// ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+// DEALINGS IN THE SOFTWARE.
+
+#ifndef _LIBCPP_SRC_INCLUDE_RYU_FS2_H
+#define _LIBCPP_SRC_INCLUDE_RYU_FS2_H
+
+// Avoid formatting to keep the changes with the original code minimal.
+// clang-format off
+
+#include "__config"
+
+_LIBCPP_BEGIN_NAMESPACE_STD
+
+[[nodiscard]] to_chars_result __f2s_buffered_n(char* const _First, char* const _Last, const float __f, const chars_format _Fmt);
+
+_LIBCPP_END_NAMESPACE_STD
+
+// clang-format on
+
+#endif // _LIBCPP_SRC_INCLUDE_RYU_FS2_H
diff --git a/src/include/ryu/ryu.h b/src/include/ryu/ryu.h
new file mode 100644
index 0000000..9c4025f
--- /dev/null
+++ b/src/include/ryu/ryu.h
@@ -0,0 +1,148 @@
+// -*- C++ -*-
+//===----------------------------------------------------------------------===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+
+// Copyright (c) Microsoft Corporation.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+
+
+// Copyright 2018 Ulf Adams
+// Copyright (c) Microsoft Corporation. All rights reserved.
+
+// Boost Software License - Version 1.0 - August 17th, 2003
+
+// Permission is hereby granted, free of charge, to any person or organization
+// obtaining a copy of the software and accompanying documentation covered by
+// this license (the "Software") to use, reproduce, display, distribute,
+// execute, and transmit the Software, and to prepare derivative works of the
+// Software, and to permit third-parties to whom the Software is furnished to
+// do so, all subject to the following:
+
+// The copyright notices in the Software and this entire statement, including
+// the above license grant, this restriction and the following disclaimer,
+// must be included in all copies of the Software, in whole or in part, and
+// all derivative works of the Software, unless such copies or derivative
+// works are solely in the form of machine-executable object code generated by
+// a source language processor.
+
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT
+// SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE
+// FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,
+// ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+// DEALINGS IN THE SOFTWARE.
+
+#ifndef _LIBCPP_SRC_INCLUDE_RYU_RYU_H
+#define _LIBCPP_SRC_INCLUDE_RYU_RYU_H
+
+// Avoid formatting to keep the changes with the original code minimal.
+// clang-format off
+
+#include "__charconv/chars_format.h"
+#include "__charconv/to_chars_result.h"
+#include "__config"
+#include "__debug"
+#include "__errc"
+#include "cstdint"
+#include "cstring"
+#include "type_traits"
+#include "include/ryu/f2s.h"
+#include "include/ryu/d2s.h"
+#include "include/ryu/d2fixed.h"
+
+#if defined(_M_X64) && defined(_LIBCPP_COMPILER_MSVC)
+#include <intrin0.h> // for _umul128() and __shiftright128()
+#endif // defined(_M_X64) && defined(_LIBCPP_COMPILER_MSVC)
+
+#if defined(_WIN64) || defined(_M_AMD64) || defined(__x86_64__) ||  defined(__aarch64__)
+#define _LIBCPP_64_BIT
+#endif
+
+_LIBCPP_BEGIN_NAMESPACE_STD
+
+// https://github.com/ulfjack/ryu/tree/59661c3/ryu
+
+#if !defined(_LIBCPP_COMPILER_MSVC)
+_LIBCPP_HIDE_FROM_ABI inline unsigned char _BitScanForward64(unsigned long* __index, unsigned long long __mask) {
+  if (__mask == 0) {
+    return false;
+  }
+  *__index = __builtin_ctzll(__mask);
+  return true;
+}
+
+_LIBCPP_HIDE_FROM_ABI inline unsigned char _BitScanForward(unsigned long* __index, unsigned int __mask) {
+  if (__mask == 0) {
+    return false;
+  }
+  *__index = __builtin_ctz(__mask);
+  return true;
+}
+#endif  // _LIBCPP_COMPILER_MSVC
+
+template <class _Floating>
+[[nodiscard]] to_chars_result _Floating_to_chars_ryu(
+    char* const _First, char* const _Last, const _Floating _Value, const chars_format _Fmt) noexcept {
+    if constexpr (_IsSame<_Floating, float>::value) {
+        return __f2s_buffered_n(_First, _Last, _Value, _Fmt);
+    } else {
+        return __d2s_buffered_n(_First, _Last, _Value, _Fmt);
+    }
+}
+
+template <class _Floating>
+[[nodiscard]] _LIBCPP_HIDE_FROM_ABI to_chars_result _Floating_to_chars_scientific_precision(
+    char* const _First, char* const _Last, const _Floating _Value, int _Precision) noexcept {
+
+    // C11 7.21.6.1 "The fprintf function"/5:
+    // "A negative precision argument is taken as if the precision were omitted."
+    // /8: "e,E [...] if the precision is missing, it is taken as 6"
+
+    if (_Precision < 0) {
+        _Precision = 6;
+    } else if (_Precision < 1'000'000'000) { // Match ' to fix compilation with GCC in C++11 mode
+        // _Precision is ok.
+    } else {
+        // Avoid integer overflow.
+        // (This defensive check is slightly nonconformant; it can be carefully improved in the future.)
+        return {_Last, errc::value_too_large};
+    }
+
+    return __d2exp_buffered_n(_First, _Last, _Value, static_cast<uint32_t>(_Precision));
+}
+
+template <class _Floating>
+[[nodiscard]] _LIBCPP_HIDE_FROM_ABI to_chars_result _Floating_to_chars_fixed_precision(
+    char* const _First, char* const _Last, const _Floating _Value, int _Precision) noexcept {
+
+    // C11 7.21.6.1 "The fprintf function"/5:
+    // "A negative precision argument is taken as if the precision were omitted."
+    // /8: "f,F [...] If the precision is missing, it is taken as 6"
+
+    if (_Precision < 0) {
+        _Precision = 6;
+    } else if (_Precision < 1'000'000'000) { // Match ' to fix compilation with GCC in C++11 mode
+        // _Precision is ok.
+    } else {
+        // Avoid integer overflow.
+        // (This defensive check is slightly nonconformant; it can be carefully improved in the future.)
+        return {_Last, errc::value_too_large};
+    }
+
+    return __d2fixed_buffered_n(_First, _Last, _Value, static_cast<uint32_t>(_Precision));
+}
+
+#undef _LIBCPP_64_BIT
+#undef _LIBCPP_INTRINSIC128
+
+_LIBCPP_END_NAMESPACE_STD
+
+// clang-format on
+
+#endif // _LIBCPP_SRC_INCLUDE_RYU_RYU_H
diff --git a/src/include/to_chars_floating_point.h b/src/include/to_chars_floating_point.h
new file mode 100644
index 0000000..081d671
--- /dev/null
+++ b/src/include/to_chars_floating_point.h
@@ -0,0 +1,1076 @@
+//===----------------------------------------------------------------------===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+
+// Copyright (c) Microsoft Corporation.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+
+// This implementation is dedicated to the memory of Mary and Thavatchai.
+
+#ifndef _LIBCPP_SRC_INCLUDE_TO_CHARS_FLOATING_POINT_H
+#define _LIBCPP_SRC_INCLUDE_TO_CHARS_FLOATING_POINT_H
+
+// Avoid formatting to keep the changes with the original code minimal.
+// clang-format off
+
+#include "__algorithm/find.h"
+#include "__algorithm/find_if.h"
+#include "__algorithm/lower_bound.h"
+#include "__algorithm/min.h"
+#include "__config"
+#include "__iterator/access.h"
+#include "__iterator/size.h"
+#include "bit"
+#include "cfloat"
+#include "climits"
+#include "include/ryu/ryu.h"
+
+_LIBCPP_BEGIN_NAMESPACE_STD
+
+namespace __itoa {
+inline constexpr char _Charconv_digits[] = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e',
+    'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z'};
+static_assert(_VSTD::size(_Charconv_digits) == 36);
+} // __itoa
+
+// vvvvvvvvvv DERIVED FROM corecrt_internal_fltintrn.h vvvvvvvvvv
+
+template <class _FloatingType>
+struct _Floating_type_traits;
+
+template <>
+struct _Floating_type_traits<float> {
+    static constexpr int32_t _Mantissa_bits = FLT_MANT_DIG;
+    static constexpr int32_t _Exponent_bits = sizeof(float) * CHAR_BIT - FLT_MANT_DIG;
+
+    static constexpr int32_t _Maximum_binary_exponent = FLT_MAX_EXP - 1;
+    static constexpr int32_t _Minimum_binary_exponent = FLT_MIN_EXP - 1;
+
+    static constexpr int32_t _Exponent_bias = 127;
+
+    static constexpr int32_t _Sign_shift     = _Exponent_bits + _Mantissa_bits - 1;
+    static constexpr int32_t _Exponent_shift = _Mantissa_bits - 1;
+
+    using _Uint_type = uint32_t;
+
+    static constexpr uint32_t _Exponent_mask             = (1u << _Exponent_bits) - 1;
+    static constexpr uint32_t _Normal_mantissa_mask      = (1u << _Mantissa_bits) - 1;
+    static constexpr uint32_t _Denormal_mantissa_mask    = (1u << (_Mantissa_bits - 1)) - 1;
+    static constexpr uint32_t _Special_nan_mantissa_mask = 1u << (_Mantissa_bits - 2);
+    static constexpr uint32_t _Shifted_sign_mask         = 1u << _Sign_shift;
+    static constexpr uint32_t _Shifted_exponent_mask     = _Exponent_mask << _Exponent_shift;
+};
+
+template <>
+struct _Floating_type_traits<double> {
+    static constexpr int32_t _Mantissa_bits = DBL_MANT_DIG;
+    static constexpr int32_t _Exponent_bits = sizeof(double) * CHAR_BIT - DBL_MANT_DIG;
+
+    static constexpr int32_t _Maximum_binary_exponent = DBL_MAX_EXP - 1;
+    static constexpr int32_t _Minimum_binary_exponent = DBL_MIN_EXP - 1;
+
+    static constexpr int32_t _Exponent_bias = 1023;
+
+    static constexpr int32_t _Sign_shift     = _Exponent_bits + _Mantissa_bits - 1;
+    static constexpr int32_t _Exponent_shift = _Mantissa_bits - 1;
+
+    using _Uint_type = uint64_t;
+
+    static constexpr uint64_t _Exponent_mask             = (1ULL << _Exponent_bits) - 1;
+    static constexpr uint64_t _Normal_mantissa_mask      = (1ULL << _Mantissa_bits) - 1;
+    static constexpr uint64_t _Denormal_mantissa_mask    = (1ULL << (_Mantissa_bits - 1)) - 1;
+    static constexpr uint64_t _Special_nan_mantissa_mask = 1ULL << (_Mantissa_bits - 2);
+    static constexpr uint64_t _Shifted_sign_mask         = 1ULL << _Sign_shift;
+    static constexpr uint64_t _Shifted_exponent_mask     = _Exponent_mask << _Exponent_shift;
+};
+
+// ^^^^^^^^^^ DERIVED FROM corecrt_internal_fltintrn.h ^^^^^^^^^^
+
+// FUNCTION to_chars (FLOATING-POINT TO STRING)
+template <class _Floating>
+[[nodiscard]] _LIBCPP_HIDE_FROM_ABI
+to_chars_result _Floating_to_chars_hex_precision(
+    char* _First, char* const _Last, const _Floating _Value, int _Precision) noexcept {
+
+    // * Determine the effective _Precision.
+    // * Later, we'll decrement _Precision when printing each hexit after the decimal point.
+
+    // The hexits after the decimal point correspond to the explicitly stored fraction bits.
+    // float explicitly stores 23 fraction bits. 23 / 4 == 5.75, which is 6 hexits.
+    // double explicitly stores 52 fraction bits. 52 / 4 == 13, which is 13 hexits.
+    constexpr int _Full_precision         = _IsSame<_Floating, float>::value ? 6 : 13;
+    constexpr int _Adjusted_explicit_bits = _Full_precision * 4;
+
+    if (_Precision < 0) {
+        // C11 7.21.6.1 "The fprintf function"/5: "A negative precision argument is taken as if the precision were
+        // omitted." /8: "if the precision is missing and FLT_RADIX is a power of 2, then the precision is sufficient
+        // for an exact representation of the value"
+        _Precision = _Full_precision;
+    }
+
+    // * Extract the _Ieee_mantissa and _Ieee_exponent.
+    using _Traits    = _Floating_type_traits<_Floating>;
+    using _Uint_type = typename _Traits::_Uint_type;
+
+    const _Uint_type _Uint_value    = _VSTD::bit_cast<_Uint_type>(_Value);
+    const _Uint_type _Ieee_mantissa = _Uint_value & _Traits::_Denormal_mantissa_mask;
+    const int32_t _Ieee_exponent    = static_cast<int32_t>(_Uint_value >> _Traits::_Exponent_shift);
+
+    // * Prepare the _Adjusted_mantissa. This is aligned to hexit boundaries,
+    // * with the implicit bit restored (0 for zero values and subnormal values, 1 for normal values).
+    // * Also calculate the _Unbiased_exponent. This unifies the processing of zero, subnormal, and normal values.
+    _Uint_type _Adjusted_mantissa;
+
+    if constexpr (_IsSame<_Floating, float>::value) {
+        _Adjusted_mantissa = _Ieee_mantissa << 1; // align to hexit boundary (23 isn't divisible by 4)
+    } else {
+        _Adjusted_mantissa = _Ieee_mantissa; // already aligned (52 is divisible by 4)
+    }
+
+    int32_t _Unbiased_exponent;
+
+    if (_Ieee_exponent == 0) { // zero or subnormal
+        // implicit bit is 0
+
+        if (_Ieee_mantissa == 0) { // zero
+            // C11 7.21.6.1 "The fprintf function"/8: "If the value is zero, the exponent is zero."
+            _Unbiased_exponent = 0;
+        } else { // subnormal
+            _Unbiased_exponent = 1 - _Traits::_Exponent_bias;
+        }
+    } else { // normal
+        _Adjusted_mantissa |= _Uint_type{1} << _Adjusted_explicit_bits; // implicit bit is 1
+        _Unbiased_exponent = _Ieee_exponent - _Traits::_Exponent_bias;
+    }
+
+    // _Unbiased_exponent is within [-126, 127] for float, [-1022, 1023] for double.
+
+    // * Decompose _Unbiased_exponent into _Sign_character and _Absolute_exponent.
+    char _Sign_character;
+    uint32_t _Absolute_exponent;
+
+    if (_Unbiased_exponent < 0) {
+        _Sign_character    = '-';
+        _Absolute_exponent = static_cast<uint32_t>(-_Unbiased_exponent);
+    } else {
+        _Sign_character    = '+';
+        _Absolute_exponent = static_cast<uint32_t>(_Unbiased_exponent);
+    }
+
+    // _Absolute_exponent is within [0, 127] for float, [0, 1023] for double.
+
+    // * Perform a single bounds check.
+    {
+        int32_t _Exponent_length;
+
+        if (_Absolute_exponent < 10) {
+            _Exponent_length = 1;
+        } else if (_Absolute_exponent < 100) {
+            _Exponent_length = 2;
+        } else if constexpr (_IsSame<_Floating, float>::value) {
+            _Exponent_length = 3;
+        } else if (_Absolute_exponent < 1000) {
+            _Exponent_length = 3;
+        } else {
+            _Exponent_length = 4;
+        }
+
+        // _Precision might be enormous; avoid integer overflow by testing it separately.
+        ptrdiff_t _Buffer_size = _Last - _First;
+
+        if (_Buffer_size < _Precision) {
+            return {_Last, errc::value_too_large};
+        }
+
+        _Buffer_size -= _Precision;
+
+        const int32_t _Length_excluding_precision = 1 // leading hexit
+                                                    + static_cast<int32_t>(_Precision > 0) // possible decimal point
+                                                    // excluding `+ _Precision`, hexits after decimal point
+                                                    + 2 // "p+" or "p-"
+                                                    + _Exponent_length; // exponent
+
+        if (_Buffer_size < _Length_excluding_precision) {
+            return {_Last, errc::value_too_large};
+        }
+    }
+
+    // * Perform rounding when we've been asked to omit hexits.
+    if (_Precision < _Full_precision) {
+        // _Precision is within [0, 5] for float, [0, 12] for double.
+
+        // _Dropped_bits is within [4, 24] for float, [4, 52] for double.
+        const int _Dropped_bits = (_Full_precision - _Precision) * 4;
+
+        // Perform rounding by adding an appropriately-shifted bit.
+
+        // This can propagate carries all the way into the leading hexit. Examples:
+        // "0.ff9" rounded to a precision of 2 is "1.00".
+        // "1.ff9" rounded to a precision of 2 is "2.00".
+
+        // Note that the leading hexit participates in the rounding decision. Examples:
+        // "0.8" rounded to a precision of 0 is "0".
+        // "1.8" rounded to a precision of 0 is "2".
+
+        // Reference implementation with suboptimal codegen:
+        // bool _Should_round_up(bool _Lsb_bit, bool _Round_bit, bool _Has_tail_bits) {
+        //    // If there are no insignificant set bits, the value is exactly-representable and should not be rounded.
+        //    //
+        //    // If there are insignificant set bits, we need to round according to round_to_nearest.
+        //    // We need to handle two cases: we round up if either [1] the value is slightly greater
+        //    // than the midpoint between two exactly-representable values or [2] the value is exactly the midpoint
+        //    // between two exactly-representable values and the greater of the two is even (this is "round-to-even").
+        //    return _Round_bit && (_Has_tail_bits || _Lsb_bit);
+        //}
+        // const bool _Lsb_bit       = (_Adjusted_mantissa & (_Uint_type{1} << _Dropped_bits)) != 0;
+        // const bool _Round_bit     = (_Adjusted_mantissa & (_Uint_type{1} << (_Dropped_bits - 1))) != 0;
+        // const bool _Has_tail_bits = (_Adjusted_mantissa & ((_Uint_type{1} << (_Dropped_bits - 1)) - 1)) != 0;
+        // const bool _Should_round = _Should_round_up(_Lsb_bit, _Round_bit, _Has_tail_bits);
+        // _Adjusted_mantissa += _Uint_type{_Should_round} << _Dropped_bits;
+
+        // Example for optimized implementation: Let _Dropped_bits be 8.
+        //          Bit index: ...[8]76543210
+        // _Adjusted_mantissa: ...[L]RTTTTTTT (not depicting known details, like hexit alignment)
+        // By focusing on the bit at index _Dropped_bits, we can avoid unnecessary branching and shifting.
+
+        // Bit index: ...[8]76543210
+        //  _Lsb_bit: ...[L]RTTTTTTT
+        const _Uint_type _Lsb_bit = _Adjusted_mantissa;
+
+        //  Bit index: ...9[8]76543210
+        // _Round_bit: ...L[R]TTTTTTT0
+        const _Uint_type _Round_bit = _Adjusted_mantissa << 1;
+
+        // We can detect (without branching) whether any of the trailing bits are set.
+        // Due to _Should_round below, this computation will be used if and only if R is 1, so we can assume that here.
+        //      Bit index: ...9[8]76543210
+        //     _Round_bit: ...L[1]TTTTTTT0
+        // _Has_tail_bits: ....[H]........
+
+        // If all of the trailing bits T are 0, then `_Round_bit - 1` will produce 0 for H (due to R being 1).
+        // If any of the trailing bits T are 1, then `_Round_bit - 1` will produce 1 for H (due to R being 1).
+        const _Uint_type _Has_tail_bits = _Round_bit - 1;
+
+        // Finally, we can use _Should_round_up() logic with bitwise-AND and bitwise-OR,
+        // selecting just the bit at index _Dropped_bits. This is the appropriately-shifted bit that we want.
+        const _Uint_type _Should_round = _Round_bit & (_Has_tail_bits | _Lsb_bit) & (_Uint_type{1} << _Dropped_bits);
+
+        // This rounding technique is dedicated to the memory of Peppermint. =^..^=
+        _Adjusted_mantissa += _Should_round;
+    }
+
+    // * Print the leading hexit, then mask it away.
+    {
+        const uint32_t _Nibble = static_cast<uint32_t>(_Adjusted_mantissa >> _Adjusted_explicit_bits);
+        _LIBCPP_ASSERT(_Nibble < 3, "");
+        const char _Leading_hexit = static_cast<char>('0' + _Nibble);
+
+        *_First++ = _Leading_hexit;
+
+        constexpr _Uint_type _Mask = (_Uint_type{1} << _Adjusted_explicit_bits) - 1;
+        _Adjusted_mantissa &= _Mask;
+    }
+
+    // * Print the decimal point and trailing hexits.
+
+    // C11 7.21.6.1 "The fprintf function"/8:
+    // "if the precision is zero and the # flag is not specified, no decimal-point character appears."
+    if (_Precision > 0) {
+        *_First++ = '.';
+
+        int32_t _Number_of_bits_remaining = _Adjusted_explicit_bits; // 24 for float, 52 for double
+
+        for (;;) {
+            _LIBCPP_ASSERT(_Number_of_bits_remaining >= 4, "");
+            _LIBCPP_ASSERT(_Number_of_bits_remaining % 4 == 0, "");
+            _Number_of_bits_remaining -= 4;
+
+            const uint32_t _Nibble = static_cast<uint32_t>(_Adjusted_mantissa >> _Number_of_bits_remaining);
+            _LIBCPP_ASSERT(_Nibble < 16, "");
+            const char _Hexit = __itoa::_Charconv_digits[_Nibble];
+
+            *_First++ = _Hexit;
+
+            // _Precision is the number of hexits that still need to be printed.
+            --_Precision;
+            if (_Precision == 0) {
+                break; // We're completely done with this phase.
+            }
+            // Otherwise, we need to keep printing hexits.
+
+            if (_Number_of_bits_remaining == 0) {
+                // We've finished printing _Adjusted_mantissa, so all remaining hexits are '0'.
+                _VSTD::memset(_First, '0', static_cast<size_t>(_Precision));
+                _First += _Precision;
+                break;
+            }
+
+            // Mask away the hexit that we just printed, then keep looping.
+            // (We skip this when breaking out of the loop above, because _Adjusted_mantissa isn't used later.)
+            const _Uint_type _Mask = (_Uint_type{1} << _Number_of_bits_remaining) - 1;
+            _Adjusted_mantissa &= _Mask;
+        }
+    }
+
+    // * Print the exponent.
+
+    // C11 7.21.6.1 "The fprintf function"/8: "The exponent always contains at least one digit, and only as many more
+    // digits as necessary to represent the decimal exponent of 2."
+
+    // Performance note: We should take advantage of the known ranges of possible exponents.
+
+    *_First++ = 'p';
+    *_First++ = _Sign_character;
+
+    // We've already printed '-' if necessary, so uint32_t _Absolute_exponent avoids testing that again.
+    return _VSTD::to_chars(_First, _Last, _Absolute_exponent);
+}
+
+template <class _Floating>
+[[nodiscard]] _LIBCPP_HIDE_FROM_ABI
+to_chars_result _Floating_to_chars_hex_shortest(
+    char* _First, char* const _Last, const _Floating _Value) noexcept {
+
+    // This prints "1.728p+0" instead of "2.e5p-1".
+    // This prints "0.000002p-126" instead of "1p-149" for float.
+    // This prints "0.0000000000001p-1022" instead of "1p-1074" for double.
+    // This prioritizes being consistent with printf's de facto behavior (and hex-precision's behavior)
+    // over minimizing the number of characters printed.
+
+    using _Traits    = _Floating_type_traits<_Floating>;
+    using _Uint_type = typename _Traits::_Uint_type;
+
+    const _Uint_type _Uint_value = _VSTD::bit_cast<_Uint_type>(_Value);
+
+    if (_Uint_value == 0) { // zero detected; write "0p+0" and return
+        // C11 7.21.6.1 "The fprintf function"/8: "If the value is zero, the exponent is zero."
+        // Special-casing zero is necessary because of the exponent.
+        const char* const _Str = "0p+0";
+        const size_t _Len      = 4;
+
+        if (_Last - _First < static_cast<ptrdiff_t>(_Len)) {
+            return {_Last, errc::value_too_large};
+        }
+
+        _VSTD::memcpy(_First, _Str, _Len);
+
+        return {_First + _Len, errc{}};
+    }
+
+    const _Uint_type _Ieee_mantissa = _Uint_value & _Traits::_Denormal_mantissa_mask;
+    const int32_t _Ieee_exponent    = static_cast<int32_t>(_Uint_value >> _Traits::_Exponent_shift);
+
+    char _Leading_hexit; // implicit bit
+    int32_t _Unbiased_exponent;
+
+    if (_Ieee_exponent == 0) { // subnormal
+        _Leading_hexit     = '0';
+        _Unbiased_exponent = 1 - _Traits::_Exponent_bias;
+    } else { // normal
+        _Leading_hexit     = '1';
+        _Unbiased_exponent = _Ieee_exponent - _Traits::_Exponent_bias;
+    }
+
+    // Performance note: Consider avoiding per-character bounds checking when there's plenty of space.
+
+    if (_First == _Last) {
+        return {_Last, errc::value_too_large};
+    }
+
+    *_First++ = _Leading_hexit;
+
+    if (_Ieee_mantissa == 0) {
+        // The fraction bits are all 0. Trim them away, including the decimal point.
+    } else {
+        if (_First == _Last) {
+            return {_Last, errc::value_too_large};
+        }
+
+        *_First++ = '.';
+
+        // The hexits after the decimal point correspond to the explicitly stored fraction bits.
+        // float explicitly stores 23 fraction bits. 23 / 4 == 5.75, so we'll print at most 6 hexits.
+        // double explicitly stores 52 fraction bits. 52 / 4 == 13, so we'll print at most 13 hexits.
+        _Uint_type _Adjusted_mantissa;
+        int32_t _Number_of_bits_remaining;
+
+        if constexpr (_IsSame<_Floating, float>::value) {
+            _Adjusted_mantissa        = _Ieee_mantissa << 1; // align to hexit boundary (23 isn't divisible by 4)
+            _Number_of_bits_remaining = 24; // 23 fraction bits + 1 alignment bit
+        } else {
+            _Adjusted_mantissa        = _Ieee_mantissa; // already aligned (52 is divisible by 4)
+            _Number_of_bits_remaining = 52; // 52 fraction bits
+        }
+
+        // do-while: The condition _Adjusted_mantissa != 0 is initially true - we have nonzero fraction bits and we've
+        // printed the decimal point. Each iteration, we print a hexit, mask it away, and keep looping if we still have
+        // nonzero fraction bits. If there would be trailing '0' hexits, this trims them. If there wouldn't be trailing
+        // '0' hexits, the same condition works (as we print the final hexit and mask it away); we don't need to test
+        // _Number_of_bits_remaining.
+        do {
+            _LIBCPP_ASSERT(_Number_of_bits_remaining >= 4, "");
+            _LIBCPP_ASSERT(_Number_of_bits_remaining % 4 == 0, "");
+            _Number_of_bits_remaining -= 4;
+
+            const uint32_t _Nibble = static_cast<uint32_t>(_Adjusted_mantissa >> _Number_of_bits_remaining);
+            _LIBCPP_ASSERT(_Nibble < 16, "");
+            const char _Hexit = __itoa::_Charconv_digits[_Nibble];
+
+            if (_First == _Last) {
+                return {_Last, errc::value_too_large};
+            }
+
+            *_First++ = _Hexit;
+
+            const _Uint_type _Mask = (_Uint_type{1} << _Number_of_bits_remaining) - 1;
+            _Adjusted_mantissa &= _Mask;
+
+        } while (_Adjusted_mantissa != 0);
+    }
+
+    // C11 7.21.6.1 "The fprintf function"/8: "The exponent always contains at least one digit, and only as many more
+    // digits as necessary to represent the decimal exponent of 2."
+
+    // Performance note: We should take advantage of the known ranges of possible exponents.
+
+    // float: _Unbiased_exponent is within [-126, 127].
+    // double: _Unbiased_exponent is within [-1022, 1023].
+
+    if (_Last - _First < 2) {
+        return {_Last, errc::value_too_large};
+    }
+
+    *_First++ = 'p';
+
+    if (_Unbiased_exponent < 0) {
+        *_First++          = '-';
+        _Unbiased_exponent = -_Unbiased_exponent;
+    } else {
+        *_First++ = '+';
+    }
+
+    // We've already printed '-' if necessary, so static_cast<uint32_t> avoids testing that again.
+    return _VSTD::to_chars(_First, _Last, static_cast<uint32_t>(_Unbiased_exponent));
+}
+
+// For general precision, we can use lookup tables to avoid performing trial formatting.
+
+// For a simple example, imagine counting the number of digits D in an integer, and needing to know
+// whether D is less than 3, equal to 3/4/5/6, or greater than 6. We could use a lookup table:
+// D | Largest integer with D digits
+// 2 |      99
+// 3 |     999
+// 4 |   9'999
+// 5 |  99'999
+// 6 | 999'999
+// 7 | table end
+// Looking up an integer in this table with lower_bound() will work:
+// * Too-small integers, like 7, 70, and 99, will cause lower_bound() to return the D == 2 row. (If all we care
+//   about is whether D is less than 3, then it's okay to smash the D == 1 and D == 2 cases together.)
+// * Integers in [100, 999] will cause lower_bound() to return the D == 3 row, and so forth.
+// * Too-large integers, like 1'000'000 and above, will cause lower_bound() to return the end of the table. If we
+//   compute D from that index, this will be considered D == 7, which will activate any "greater than 6" logic.
+
+// Floating-point is slightly more complicated.
+
+// The ordinary lookup tables are for X within [-5, 38] for float, and [-5, 308] for double.
+// (-5 absorbs too-negative exponents, outside the P > X >= -4 criterion. 38 and 308 are the maximum exponents.)
+// Due to the P > X condition, we can use a subset of the table for X within [-5, P - 1], suitably clamped.
+
+// When P is small, rounding can affect X. For example:
+// For P == 1, the largest double with X == 0 is: 9.4999999999999982236431605997495353221893310546875
+// For P == 2, the largest double with X == 0 is: 9.949999999999999289457264239899814128875732421875
+// For P == 3, the largest double with X == 0 is: 9.9949999999999992184029906638897955417633056640625
+
+// Exponent adjustment is a concern for P within [1, 7] for float, and [1, 15] for double (determined via
+// brute force). While larger values of P still perform rounding, they can't trigger exponent adjustment.
+// This is because only values with repeated '9' digits can undergo exponent adjustment during rounding,
+// and floating-point granularity limits the number of consecutive '9' digits that can appear.
+
+// So, we need special lookup tables for small values of P.
+// These tables have varying lengths due to the P > X >= -4 criterion. For example:
+// For P == 1, need table entries for X: -5, -4, -3, -2, -1, 0
+// For P == 2, need table entries for X: -5, -4, -3, -2, -1, 0, 1
+// For P == 3, need table entries for X: -5, -4, -3, -2, -1, 0, 1, 2
+// For P == 4, need table entries for X: -5, -4, -3, -2, -1, 0, 1, 2, 3
+
+// We can concatenate these tables for compact storage, using triangular numbers to access them.
+// The table for P begins at index (P - 1) * (P + 10) / 2 with length P + 5.
+
+// For both the ordinary and special lookup tables, after an index I is returned by lower_bound(), X is I - 5.
+
+// We need to special-case the floating-point value 0.0, which is considered to have X == 0.
+// Otherwise, the lookup tables would consider it to have a highly negative X.
+
+// Finally, because we're working with positive floating-point values,
+// representation comparisons behave identically to floating-point comparisons.
+
+// The following code generated the lookup tables for the scientific exponent X. Don't remove this code.
+#if 0
+// cl /EHsc /nologo /W4 /MT /O2 /std:c++17 generate_tables.cpp && generate_tables
+
+#include <algorithm>
+#include <assert.h>
+#include <charconv>
+#include <cmath>
+#include <limits>
+#include <map>
+#include <stdint.h>
+#include <stdio.h>
+#include <system_error>
+#include <type_traits>
+#include <vector>
+using namespace std;
+
+template <typename UInt, typename Pred>
+[[nodiscard]] UInt uint_partition_point(UInt first, const UInt last, Pred pred) {
+    // Find the beginning of the false partition in [first, last).
+    // [first, last) is partitioned when all of the true values occur before all of the false values.
+
+    static_assert(is_unsigned_v<UInt>);
+    assert(first <= last);
+
+    for (UInt n = last - first; n > 0;) {
+        const UInt n2  = n / 2;
+        const UInt mid = first + n2;
+
+        if (pred(mid)) {
+            first = mid + 1;
+            n     = n - n2 - 1;
+        } else {
+            n = n2;
+        }
+    }
+
+    return first;
+}
+
+template <typename Floating>
+[[nodiscard]] int scientific_exponent_X(const int P, const Floating flt) {
+    char buf[400]; // more than enough
+
+    // C11 7.21.6.1 "The fprintf function"/8 performs trial formatting with scientific precision P - 1.
+    const auto to_result = to_chars(buf, end(buf), flt, chars_format::scientific, P - 1);
+    assert(to_result.ec == errc{});
+
+    const char* exp_ptr = find(buf, to_result.ptr, 'e');
+    assert(exp_ptr != to_result.ptr);
+
+    ++exp_ptr; // advance past 'e'
+
+    if (*exp_ptr == '+') {
+        ++exp_ptr; // advance past '+' which from_chars() won't parse
+    }
+
+    int X;
+    const auto from_result = from_chars(exp_ptr, to_result.ptr, X);
+    assert(from_result.ec == errc{});
+    return X;
+}
+
+template <typename UInt>
+void print_table(const vector<UInt>& v, const char* const name) {
+    constexpr const char* UIntName = _IsSame<UInt, uint32_t>::value ? "uint32_t" : "uint64_t";
+
+    printf("static constexpr %s %s[%zu] = {\n", UIntName, name, v.size());
+
+    for (const auto& val : v) {
+        if constexpr (_IsSame<UInt, uint32_t>::value) {
+            printf("0x%08Xu,\n", val);
+        } else {
+            printf("0x%016llXu,\n", val);
+        }
+    }
+
+    printf("};\n");
+}
+
+enum class Mode { Tables, Tests };
+
+template <typename Floating>
+void generate_tables(const Mode mode) {
+    using Limits = numeric_limits<Floating>;
+    using UInt   = conditional_t<_IsSame<Floating, float>::value, uint32_t, uint64_t>;
+
+    map<int, map<int, UInt>> P_X_LargestValWithX;
+
+    constexpr int MaxP = Limits::max_exponent10 + 1; // MaxP performs no rounding during trial formatting
+
+    for (int P = 1; P <= MaxP; ++P) {
+        for (int X = -5; X < P; ++X) {
+            constexpr Floating first = static_cast<Floating>(9e-5); // well below 9.5e-5, otherwise arbitrary
+            constexpr Floating last  = Limits::infinity(); // one bit above Limits::max()
+
+            const UInt val_beyond_X = uint_partition_point(reinterpret_cast<const UInt&>(first),
+                reinterpret_cast<const UInt&>(last),
+                [P, X](const UInt u) { return scientific_exponent_X(P, reinterpret_cast<const Floating&>(u)) <= X; });
+
+            P_X_LargestValWithX[P][X] = val_beyond_X - 1;
+        }
+    }
+
+    constexpr const char* FloatingName = _IsSame<Floating, float>::value ? "float" : "double";
+
+    constexpr int MaxSpecialP = _IsSame<Floating, float>::value ? 7 : 15; // MaxSpecialP is affected by exponent adjustment
+
+    if (mode == Mode::Tables) {
+        printf("template <>\n");
+        printf("struct _General_precision_tables<%s> {\n", FloatingName);
+
+        printf("static constexpr int _Max_special_P = %d;\n", MaxSpecialP);
+
+        vector<UInt> special;
+
+        for (int P = 1; P <= MaxSpecialP; ++P) {
+            for (int X = -5; X < P; ++X) {
+                const UInt val = P_X_LargestValWithX[P][X];
+                special.push_back(val);
+            }
+        }
+
+        print_table(special, "_Special_X_table");
+
+        for (int P = MaxSpecialP + 1; P < MaxP; ++P) {
+            for (int X = -5; X < P; ++X) {
+                const UInt val = P_X_LargestValWithX[P][X];
+                assert(val == P_X_LargestValWithX[MaxP][X]);
+            }
+        }
+
+        printf("static constexpr int _Max_P = %d;\n", MaxP);
+
+        vector<UInt> ordinary;
+
+        for (int X = -5; X < MaxP; ++X) {
+            const UInt val = P_X_LargestValWithX[MaxP][X];
+            ordinary.push_back(val);
+        }
+
+        print_table(ordinary, "_Ordinary_X_table");
+
+        printf("};\n");
+    } else {
+        printf("==========\n");
+        printf("Test cases for %s:\n", FloatingName);
+
+        constexpr int Hexits         = _IsSame<Floating, float>::value ? 6 : 13;
+        constexpr const char* Suffix = _IsSame<Floating, float>::value ? "f" : "";
+
+        for (int P = 1; P <= MaxP; ++P) {
+            for (int X = -5; X < P; ++X) {
+                if (P <= MaxSpecialP || P == 25 || P == MaxP || X == P - 1) {
+                    const UInt val1   = P_X_LargestValWithX[P][X];
+                    const Floating f1 = reinterpret_cast<const Floating&>(val1);
+                    const UInt val2   = val1 + 1;
+                    const Floating f2 = reinterpret_cast<const Floating&>(val2);
+
+                    printf("{%.*a%s, chars_format::general, %d, \"%.*g\"},\n", Hexits, f1, Suffix, P, P, f1);
+                    if (isfinite(f2)) {
+                        printf("{%.*a%s, chars_format::general, %d, \"%.*g\"},\n", Hexits, f2, Suffix, P, P, f2);
+                    }
+                }
+            }
+        }
+    }
+}
+
+int main() {
+    printf("template <class _Floating>\n");
+    printf("struct _General_precision_tables;\n");
+    generate_tables<float>(Mode::Tables);
+    generate_tables<double>(Mode::Tables);
+    generate_tables<float>(Mode::Tests);
+    generate_tables<double>(Mode::Tests);
+}
+#endif // 0
+
+template <class _Floating>
+struct _General_precision_tables;
+
+template <>
+struct _General_precision_tables<float> {
+    static constexpr int _Max_special_P = 7;
+
+    static constexpr uint32_t _Special_X_table[63] = {0x38C73ABCu, 0x3A79096Bu, 0x3C1BA5E3u, 0x3DC28F5Cu, 0x3F733333u,
+        0x4117FFFFu, 0x38D0AAA7u, 0x3A826AA8u, 0x3C230553u, 0x3DCBC6A7u, 0x3F7EB851u, 0x411F3333u, 0x42C6FFFFu,
+        0x38D19C3Fu, 0x3A8301A7u, 0x3C23C211u, 0x3DCCB295u, 0x3F7FDF3Bu, 0x411FEB85u, 0x42C7E666u, 0x4479DFFFu,
+        0x38D1B468u, 0x3A8310C1u, 0x3C23D4F1u, 0x3DCCCA2Du, 0x3F7FFCB9u, 0x411FFDF3u, 0x42C7FD70u, 0x4479FCCCu,
+        0x461C3DFFu, 0x38D1B6D2u, 0x3A831243u, 0x3C23D6D4u, 0x3DCCCC89u, 0x3F7FFFACu, 0x411FFFCBu, 0x42C7FFBEu,
+        0x4479FFAEu, 0x461C3FCCu, 0x47C34FBFu, 0x38D1B710u, 0x3A83126Au, 0x3C23D704u, 0x3DCCCCC6u, 0x3F7FFFF7u,
+        0x411FFFFAu, 0x42C7FFF9u, 0x4479FFF7u, 0x461C3FFAu, 0x47C34FF9u, 0x497423F7u, 0x38D1B716u, 0x3A83126Eu,
+        0x3C23D709u, 0x3DCCCCCCu, 0x3F7FFFFFu, 0x411FFFFFu, 0x42C7FFFFu, 0x4479FFFFu, 0x461C3FFFu, 0x47C34FFFu,
+        0x497423FFu, 0x4B18967Fu};
+
+    static constexpr int _Max_P = 39;
+
+    static constexpr uint32_t _Ordinary_X_table[44] = {0x38D1B717u, 0x3A83126Eu, 0x3C23D70Au, 0x3DCCCCCCu, 0x3F7FFFFFu,
+        0x411FFFFFu, 0x42C7FFFFu, 0x4479FFFFu, 0x461C3FFFu, 0x47C34FFFu, 0x497423FFu, 0x4B18967Fu, 0x4CBEBC1Fu,
+        0x4E6E6B27u, 0x501502F8u, 0x51BA43B7u, 0x5368D4A5u, 0x551184E7u, 0x56B5E620u, 0x58635FA9u, 0x5A0E1BC9u,
+        0x5BB1A2BCu, 0x5D5E0B6Bu, 0x5F0AC723u, 0x60AD78EBu, 0x6258D726u, 0x64078678u, 0x65A96816u, 0x6753C21Bu,
+        0x69045951u, 0x6AA56FA5u, 0x6C4ECB8Fu, 0x6E013F39u, 0x6FA18F07u, 0x7149F2C9u, 0x72FC6F7Cu, 0x749DC5ADu,
+        0x76453719u, 0x77F684DFu, 0x799A130Bu, 0x7B4097CEu, 0x7CF0BDC2u, 0x7E967699u, 0x7F7FFFFFu};
+};
+
+template <>
+struct _General_precision_tables<double> {
+    static constexpr int _Max_special_P = 15;
+
+    static constexpr uint64_t _Special_X_table[195] = {0x3F18E757928E0C9Du, 0x3F4F212D77318FC5u, 0x3F8374BC6A7EF9DBu,
+        0x3FB851EB851EB851u, 0x3FEE666666666666u, 0x4022FFFFFFFFFFFFu, 0x3F1A1554FBDAD751u, 0x3F504D551D68C692u,
+        0x3F8460AA64C2F837u, 0x3FB978D4FDF3B645u, 0x3FEFD70A3D70A3D7u, 0x4023E66666666666u, 0x4058DFFFFFFFFFFFu,
+        0x3F1A3387ECC8EB96u, 0x3F506034F3FD933Eu, 0x3F84784230FCF80Du, 0x3FB99652BD3C3611u, 0x3FEFFBE76C8B4395u,
+        0x4023FD70A3D70A3Du, 0x4058FCCCCCCCCCCCu, 0x408F3BFFFFFFFFFFu, 0x3F1A368D04E0BA6Au, 0x3F506218230C7482u,
+        0x3F847A9E2BCF91A3u, 0x3FB99945B6C3760Bu, 0x3FEFFF972474538Eu, 0x4023FFBE76C8B439u, 0x4058FFAE147AE147u,
+        0x408F3F9999999999u, 0x40C387BFFFFFFFFFu, 0x3F1A36DA54164F19u, 0x3F506248748DF16Fu, 0x3F847ADA91B16DCBu,
+        0x3FB99991361DC93Eu, 0x3FEFFFF583A53B8Eu, 0x4023FFF972474538u, 0x4058FFF7CED91687u, 0x408F3FF5C28F5C28u,
+        0x40C387F999999999u, 0x40F869F7FFFFFFFFu, 0x3F1A36E20F35445Du, 0x3F50624D49814ABAu, 0x3F847AE09BE19D69u,
+        0x3FB99998C2DA04C3u, 0x3FEFFFFEF39085F4u, 0x4023FFFF583A53B8u, 0x4058FFFF2E48E8A7u, 0x408F3FFEF9DB22D0u,
+        0x40C387FF5C28F5C2u, 0x40F869FF33333333u, 0x412E847EFFFFFFFFu, 0x3F1A36E2D51EC34Bu, 0x3F50624DC5333A0Eu,
+        0x3F847AE136800892u, 0x3FB9999984200AB7u, 0x3FEFFFFFE5280D65u, 0x4023FFFFEF39085Fu, 0x4058FFFFEB074A77u,
+        0x408F3FFFE5C91D14u, 0x40C387FFEF9DB22Du, 0x40F869FFEB851EB8u, 0x412E847FE6666666u, 0x416312CFEFFFFFFFu,
+        0x3F1A36E2E8E94FFCu, 0x3F50624DD191D1FDu, 0x3F847AE145F6467Du, 0x3FB999999773D81Cu, 0x3FEFFFFFFD50CE23u,
+        0x4023FFFFFE5280D6u, 0x4058FFFFFDE7210Bu, 0x408F3FFFFD60E94Eu, 0x40C387FFFE5C91D1u, 0x40F869FFFDF3B645u,
+        0x412E847FFD70A3D7u, 0x416312CFFE666666u, 0x4197D783FDFFFFFFu, 0x3F1A36E2EAE3F7A7u, 0x3F50624DD2CE7AC8u,
+        0x3F847AE14782197Bu, 0x3FB9999999629FD9u, 0x3FEFFFFFFFBB47D0u, 0x4023FFFFFFD50CE2u, 0x4058FFFFFFCA501Au,
+        0x408F3FFFFFBCE421u, 0x40C387FFFFD60E94u, 0x40F869FFFFCB923Au, 0x412E847FFFBE76C8u, 0x416312CFFFD70A3Du,
+        0x4197D783FFCCCCCCu, 0x41CDCD64FFBFFFFFu, 0x3F1A36E2EB16A205u, 0x3F50624DD2EE2543u, 0x3F847AE147A9AE94u,
+        0x3FB9999999941A39u, 0x3FEFFFFFFFF920C8u, 0x4023FFFFFFFBB47Du, 0x4058FFFFFFFAA19Cu, 0x408F3FFFFFF94A03u,
+        0x40C387FFFFFBCE42u, 0x40F869FFFFFAC1D2u, 0x412E847FFFF97247u, 0x416312CFFFFBE76Cu, 0x4197D783FFFAE147u,
+        0x41CDCD64FFF99999u, 0x4202A05F1FFBFFFFu, 0x3F1A36E2EB1BB30Fu, 0x3F50624DD2F14FE9u, 0x3F847AE147ADA3E3u,
+        0x3FB9999999990CDCu, 0x3FEFFFFFFFFF5014u, 0x4023FFFFFFFF920Cu, 0x4058FFFFFFFF768Fu, 0x408F3FFFFFFF5433u,
+        0x40C387FFFFFF94A0u, 0x40F869FFFFFF79C8u, 0x412E847FFFFF583Au, 0x416312CFFFFF9724u, 0x4197D783FFFF7CEDu,
+        0x41CDCD64FFFF5C28u, 0x4202A05F1FFF9999u, 0x42374876E7FF7FFFu, 0x3F1A36E2EB1C34C3u, 0x3F50624DD2F1A0FAu,
+        0x3F847AE147AE0938u, 0x3FB9999999998B86u, 0x3FEFFFFFFFFFEE68u, 0x4023FFFFFFFFF501u, 0x4058FFFFFFFFF241u,
+        0x408F3FFFFFFFEED1u, 0x40C387FFFFFFF543u, 0x40F869FFFFFFF294u, 0x412E847FFFFFEF39u, 0x416312CFFFFFF583u,
+        0x4197D783FFFFF2E4u, 0x41CDCD64FFFFEF9Du, 0x4202A05F1FFFF5C2u, 0x42374876E7FFF333u, 0x426D1A94A1FFEFFFu,
+        0x3F1A36E2EB1C41BBu, 0x3F50624DD2F1A915u, 0x3F847AE147AE135Au, 0x3FB9999999999831u, 0x3FEFFFFFFFFFFE3Du,
+        0x4023FFFFFFFFFEE6u, 0x4058FFFFFFFFFEA0u, 0x408F3FFFFFFFFE48u, 0x40C387FFFFFFFEEDu, 0x40F869FFFFFFFEA8u,
+        0x412E847FFFFFFE52u, 0x416312CFFFFFFEF3u, 0x4197D783FFFFFEB0u, 0x41CDCD64FFFFFE5Cu, 0x4202A05F1FFFFEF9u,
+        0x42374876E7FFFEB8u, 0x426D1A94A1FFFE66u, 0x42A2309CE53FFEFFu, 0x3F1A36E2EB1C4307u, 0x3F50624DD2F1A9E4u,
+        0x3F847AE147AE145Eu, 0x3FB9999999999975u, 0x3FEFFFFFFFFFFFD2u, 0x4023FFFFFFFFFFE3u, 0x4058FFFFFFFFFFDCu,
+        0x408F3FFFFFFFFFD4u, 0x40C387FFFFFFFFE4u, 0x40F869FFFFFFFFDDu, 0x412E847FFFFFFFD5u, 0x416312CFFFFFFFE5u,
+        0x4197D783FFFFFFDEu, 0x41CDCD64FFFFFFD6u, 0x4202A05F1FFFFFE5u, 0x42374876E7FFFFDFu, 0x426D1A94A1FFFFD7u,
+        0x42A2309CE53FFFE6u, 0x42D6BCC41E8FFFDFu, 0x3F1A36E2EB1C4328u, 0x3F50624DD2F1A9F9u, 0x3F847AE147AE1477u,
+        0x3FB9999999999995u, 0x3FEFFFFFFFFFFFFBu, 0x4023FFFFFFFFFFFDu, 0x4058FFFFFFFFFFFCu, 0x408F3FFFFFFFFFFBu,
+        0x40C387FFFFFFFFFDu, 0x40F869FFFFFFFFFCu, 0x412E847FFFFFFFFBu, 0x416312CFFFFFFFFDu, 0x4197D783FFFFFFFCu,
+        0x41CDCD64FFFFFFFBu, 0x4202A05F1FFFFFFDu, 0x42374876E7FFFFFCu, 0x426D1A94A1FFFFFBu, 0x42A2309CE53FFFFDu,
+        0x42D6BCC41E8FFFFCu, 0x430C6BF52633FFFBu};
+
+    static constexpr int _Max_P = 309;
+
+    static constexpr uint64_t _Ordinary_X_table[314] = {0x3F1A36E2EB1C432Cu, 0x3F50624DD2F1A9FBu, 0x3F847AE147AE147Au,
+        0x3FB9999999999999u, 0x3FEFFFFFFFFFFFFFu, 0x4023FFFFFFFFFFFFu, 0x4058FFFFFFFFFFFFu, 0x408F3FFFFFFFFFFFu,
+        0x40C387FFFFFFFFFFu, 0x40F869FFFFFFFFFFu, 0x412E847FFFFFFFFFu, 0x416312CFFFFFFFFFu, 0x4197D783FFFFFFFFu,
+        0x41CDCD64FFFFFFFFu, 0x4202A05F1FFFFFFFu, 0x42374876E7FFFFFFu, 0x426D1A94A1FFFFFFu, 0x42A2309CE53FFFFFu,
+        0x42D6BCC41E8FFFFFu, 0x430C6BF52633FFFFu, 0x4341C37937E07FFFu, 0x4376345785D89FFFu, 0x43ABC16D674EC7FFu,
+        0x43E158E460913CFFu, 0x4415AF1D78B58C3Fu, 0x444B1AE4D6E2EF4Fu, 0x4480F0CF064DD591u, 0x44B52D02C7E14AF6u,
+        0x44EA784379D99DB4u, 0x45208B2A2C280290u, 0x4554ADF4B7320334u, 0x4589D971E4FE8401u, 0x45C027E72F1F1281u,
+        0x45F431E0FAE6D721u, 0x46293E5939A08CE9u, 0x465F8DEF8808B024u, 0x4693B8B5B5056E16u, 0x46C8A6E32246C99Cu,
+        0x46FED09BEAD87C03u, 0x4733426172C74D82u, 0x476812F9CF7920E2u, 0x479E17B84357691Bu, 0x47D2CED32A16A1B1u,
+        0x48078287F49C4A1Du, 0x483D6329F1C35CA4u, 0x48725DFA371A19E6u, 0x48A6F578C4E0A060u, 0x48DCB2D6F618C878u,
+        0x4911EFC659CF7D4Bu, 0x49466BB7F0435C9Eu, 0x497C06A5EC5433C6u, 0x49B18427B3B4A05Bu, 0x49E5E531A0A1C872u,
+        0x4A1B5E7E08CA3A8Fu, 0x4A511B0EC57E6499u, 0x4A8561D276DDFDC0u, 0x4ABABA4714957D30u, 0x4AF0B46C6CDD6E3Eu,
+        0x4B24E1878814C9CDu, 0x4B5A19E96A19FC40u, 0x4B905031E2503DA8u, 0x4BC4643E5AE44D12u, 0x4BF97D4DF19D6057u,
+        0x4C2FDCA16E04B86Du, 0x4C63E9E4E4C2F344u, 0x4C98E45E1DF3B015u, 0x4CCF1D75A5709C1Au, 0x4D03726987666190u,
+        0x4D384F03E93FF9F4u, 0x4D6E62C4E38FF872u, 0x4DA2FDBB0E39FB47u, 0x4DD7BD29D1C87A19u, 0x4E0DAC74463A989Fu,
+        0x4E428BC8ABE49F63u, 0x4E772EBAD6DDC73Cu, 0x4EACFA698C95390Bu, 0x4EE21C81F7DD43A7u, 0x4F16A3A275D49491u,
+        0x4F4C4C8B1349B9B5u, 0x4F81AFD6EC0E1411u, 0x4FB61BCCA7119915u, 0x4FEBA2BFD0D5FF5Bu, 0x502145B7E285BF98u,
+        0x50559725DB272F7Fu, 0x508AFCEF51F0FB5Eu, 0x50C0DE1593369D1Bu, 0x50F5159AF8044462u, 0x512A5B01B605557Au,
+        0x516078E111C3556Cu, 0x5194971956342AC7u, 0x51C9BCDFABC13579u, 0x5200160BCB58C16Cu, 0x52341B8EBE2EF1C7u,
+        0x526922726DBAAE39u, 0x529F6B0F092959C7u, 0x52D3A2E965B9D81Cu, 0x53088BA3BF284E23u, 0x533EAE8CAEF261ACu,
+        0x53732D17ED577D0Bu, 0x53A7F85DE8AD5C4Eu, 0x53DDF67562D8B362u, 0x5412BA095DC7701Du, 0x5447688BB5394C25u,
+        0x547D42AEA2879F2Eu, 0x54B249AD2594C37Cu, 0x54E6DC186EF9F45Cu, 0x551C931E8AB87173u, 0x5551DBF316B346E7u,
+        0x558652EFDC6018A1u, 0x55BBE7ABD3781ECAu, 0x55F170CB642B133Eu, 0x5625CCFE3D35D80Eu, 0x565B403DCC834E11u,
+        0x569108269FD210CBu, 0x56C54A3047C694FDu, 0x56FA9CBC59B83A3Du, 0x5730A1F5B8132466u, 0x5764CA732617ED7Fu,
+        0x5799FD0FEF9DE8DFu, 0x57D03E29F5C2B18Bu, 0x58044DB473335DEEu, 0x583961219000356Au, 0x586FB969F40042C5u,
+        0x58A3D3E2388029BBu, 0x58D8C8DAC6A0342Au, 0x590EFB1178484134u, 0x59435CEAEB2D28C0u, 0x59783425A5F872F1u,
+        0x59AE412F0F768FADu, 0x59E2E8BD69AA19CCu, 0x5A17A2ECC414A03Fu, 0x5A4D8BA7F519C84Fu, 0x5A827748F9301D31u,
+        0x5AB7151B377C247Eu, 0x5AECDA62055B2D9Du, 0x5B22087D4358FC82u, 0x5B568A9C942F3BA3u, 0x5B8C2D43B93B0A8Bu,
+        0x5BC19C4A53C4E697u, 0x5BF6035CE8B6203Du, 0x5C2B843422E3A84Cu, 0x5C6132A095CE492Fu, 0x5C957F48BB41DB7Bu,
+        0x5CCADF1AEA12525Au, 0x5D00CB70D24B7378u, 0x5D34FE4D06DE5056u, 0x5D6A3DE04895E46Cu, 0x5DA066AC2D5DAEC3u,
+        0x5DD4805738B51A74u, 0x5E09A06D06E26112u, 0x5E400444244D7CABu, 0x5E7405552D60DBD6u, 0x5EA906AA78B912CBu,
+        0x5EDF485516E7577Eu, 0x5F138D352E5096AFu, 0x5F48708279E4BC5Au, 0x5F7E8CA3185DEB71u, 0x5FB317E5EF3AB327u,
+        0x5FE7DDDF6B095FF0u, 0x601DD55745CBB7ECu, 0x6052A5568B9F52F4u, 0x60874EAC2E8727B1u, 0x60BD22573A28F19Du,
+        0x60F2357684599702u, 0x6126C2D4256FFCC2u, 0x615C73892ECBFBF3u, 0x6191C835BD3F7D78u, 0x61C63A432C8F5CD6u,
+        0x61FBC8D3F7B3340Bu, 0x62315D847AD00087u, 0x6265B4E5998400A9u, 0x629B221EFFE500D3u, 0x62D0F5535FEF2084u,
+        0x630532A837EAE8A5u, 0x633A7F5245E5A2CEu, 0x63708F936BAF85C1u, 0x63A4B378469B6731u, 0x63D9E056584240FDu,
+        0x64102C35F729689Eu, 0x6444374374F3C2C6u, 0x647945145230B377u, 0x64AF965966BCE055u, 0x64E3BDF7E0360C35u,
+        0x6518AD75D8438F43u, 0x654ED8D34E547313u, 0x6583478410F4C7ECu, 0x65B819651531F9E7u, 0x65EE1FBE5A7E7861u,
+        0x6622D3D6F88F0B3Cu, 0x665788CCB6B2CE0Cu, 0x668D6AFFE45F818Fu, 0x66C262DFEEBBB0F9u, 0x66F6FB97EA6A9D37u,
+        0x672CBA7DE5054485u, 0x6761F48EAF234AD3u, 0x679671B25AEC1D88u, 0x67CC0E1EF1A724EAu, 0x680188D357087712u,
+        0x6835EB082CCA94D7u, 0x686B65CA37FD3A0Du, 0x68A11F9E62FE4448u, 0x68D56785FBBDD55Au, 0x690AC1677AAD4AB0u,
+        0x6940B8E0ACAC4EAEu, 0x6974E718D7D7625Au, 0x69AA20DF0DCD3AF0u, 0x69E0548B68A044D6u, 0x6A1469AE42C8560Cu,
+        0x6A498419D37A6B8Fu, 0x6A7FE52048590672u, 0x6AB3EF342D37A407u, 0x6AE8EB0138858D09u, 0x6B1F25C186A6F04Cu,
+        0x6B537798F428562Fu, 0x6B88557F31326BBBu, 0x6BBE6ADEFD7F06AAu, 0x6BF302CB5E6F642Au, 0x6C27C37E360B3D35u,
+        0x6C5DB45DC38E0C82u, 0x6C9290BA9A38C7D1u, 0x6CC734E940C6F9C5u, 0x6CFD022390F8B837u, 0x6D3221563A9B7322u,
+        0x6D66A9ABC9424FEBu, 0x6D9C5416BB92E3E6u, 0x6DD1B48E353BCE6Fu, 0x6E0621B1C28AC20Bu, 0x6E3BAA1E332D728Eu,
+        0x6E714A52DFFC6799u, 0x6EA59CE797FB817Fu, 0x6EDB04217DFA61DFu, 0x6F10E294EEBC7D2Bu, 0x6F451B3A2A6B9C76u,
+        0x6F7A6208B5068394u, 0x6FB07D457124123Cu, 0x6FE49C96CD6D16CBu, 0x7019C3BC80C85C7Eu, 0x70501A55D07D39CFu,
+        0x708420EB449C8842u, 0x70B9292615C3AA53u, 0x70EF736F9B3494E8u, 0x7123A825C100DD11u, 0x7158922F31411455u,
+        0x718EB6BAFD91596Bu, 0x71C33234DE7AD7E2u, 0x71F7FEC216198DDBu, 0x722DFE729B9FF152u, 0x7262BF07A143F6D3u,
+        0x72976EC98994F488u, 0x72CD4A7BEBFA31AAu, 0x73024E8D737C5F0Au, 0x7336E230D05B76CDu, 0x736C9ABD04725480u,
+        0x73A1E0B622C774D0u, 0x73D658E3AB795204u, 0x740BEF1C9657A685u, 0x74417571DDF6C813u, 0x7475D2CE55747A18u,
+        0x74AB4781EAD1989Eu, 0x74E10CB132C2FF63u, 0x75154FDD7F73BF3Bu, 0x754AA3D4DF50AF0Au, 0x7580A6650B926D66u,
+        0x75B4CFFE4E7708C0u, 0x75EA03FDE214CAF0u, 0x7620427EAD4CFED6u, 0x7654531E58A03E8Bu, 0x768967E5EEC84E2Eu,
+        0x76BFC1DF6A7A61BAu, 0x76F3D92BA28C7D14u, 0x7728CF768B2F9C59u, 0x775F03542DFB8370u, 0x779362149CBD3226u,
+        0x77C83A99C3EC7EAFu, 0x77FE494034E79E5Bu, 0x7832EDC82110C2F9u, 0x7867A93A2954F3B7u, 0x789D9388B3AA30A5u,
+        0x78D27C35704A5E67u, 0x79071B42CC5CF601u, 0x793CE2137F743381u, 0x79720D4C2FA8A030u, 0x79A6909F3B92C83Du,
+        0x79DC34C70A777A4Cu, 0x7A11A0FC668AAC6Fu, 0x7A46093B802D578Bu, 0x7A7B8B8A6038AD6Eu, 0x7AB137367C236C65u,
+        0x7AE585041B2C477Eu, 0x7B1AE64521F7595Eu, 0x7B50CFEB353A97DAu, 0x7B8503E602893DD1u, 0x7BBA44DF832B8D45u,
+        0x7BF06B0BB1FB384Bu, 0x7C2485CE9E7A065Eu, 0x7C59A742461887F6u, 0x7C9008896BCF54F9u, 0x7CC40AABC6C32A38u,
+        0x7CF90D56B873F4C6u, 0x7D2F50AC6690F1F8u, 0x7D63926BC01A973Bu, 0x7D987706B0213D09u, 0x7DCE94C85C298C4Cu,
+        0x7E031CFD3999F7AFu, 0x7E37E43C8800759Bu, 0x7E6DDD4BAA009302u, 0x7EA2AA4F4A405BE1u, 0x7ED754E31CD072D9u,
+        0x7F0D2A1BE4048F90u, 0x7F423A516E82D9BAu, 0x7F76C8E5CA239028u, 0x7FAC7B1F3CAC7433u, 0x7FE1CCF385EBC89Fu,
+        0x7FEFFFFFFFFFFFFFu};
+};
+
+template <class _Floating>
+[[nodiscard]] _LIBCPP_HIDE_FROM_ABI
+to_chars_result _Floating_to_chars_general_precision(
+    char* _First, char* const _Last, const _Floating _Value, int _Precision) noexcept {
+
+    using _Traits    = _Floating_type_traits<_Floating>;
+    using _Uint_type = typename _Traits::_Uint_type;
+
+    const _Uint_type _Uint_value = _VSTD::bit_cast<_Uint_type>(_Value);
+
+    if (_Uint_value == 0) { // zero detected; write "0" and return; _Precision is irrelevant due to zero-trimming
+        if (_First == _Last) {
+            return {_Last, errc::value_too_large};
+        }
+
+        *_First++ = '0';
+
+        return {_First, errc{}};
+    }
+
+    // C11 7.21.6.1 "The fprintf function"/5:
+    // "A negative precision argument is taken as if the precision were omitted."
+    // /8: "g,G [...] Let P equal the precision if nonzero, 6 if the precision is omitted,
+    // or 1 if the precision is zero."
+
+    // Performance note: It's possible to rewrite this for branchless codegen,
+    // but profiling will be necessary to determine whether that's faster.
+    if (_Precision < 0) {
+        _Precision = 6;
+    } else if (_Precision == 0) {
+        _Precision = 1;
+    } else if (_Precision < 1'000'000) {
+        // _Precision is ok.
+    } else {
+        // Avoid integer overflow.
+        // Due to general notation's zero-trimming behavior, we can simply clamp _Precision.
+        // This is further clamped below.
+        _Precision = 1'000'000;
+    }
+
+    // _Precision is now the Standard's P.
+
+    // /8: "Then, if a conversion with style E would have an exponent of X:
+    // - if P > X >= -4, the conversion is with style f (or F) and precision P - (X + 1).
+    // - otherwise, the conversion is with style e (or E) and precision P - 1."
+
+    // /8: "Finally, [...] any trailing zeros are removed from the fractional portion of the result
+    // and the decimal-point character is removed if there is no fractional portion remaining."
+
+    using _Tables = _General_precision_tables<_Floating>;
+
+    const _Uint_type* _Table_begin;
+    const _Uint_type* _Table_end;
+
+    if (_Precision <= _Tables::_Max_special_P) {
+        _Table_begin = _Tables::_Special_X_table + (_Precision - 1) * (_Precision + 10) / 2;
+        _Table_end   = _Table_begin + _Precision + 5;
+    } else {
+        _Table_begin = _Tables::_Ordinary_X_table;
+        _Table_end   = _Table_begin + _VSTD::min(_Precision, _Tables::_Max_P) + 5;
+    }
+
+    // Profiling indicates that linear search is faster than binary search for small tables.
+    // Performance note: lambda captures may have a small performance cost.
+    const _Uint_type* const _Table_lower_bound = [=] {
+        if constexpr (!_IsSame<_Floating, float>::value) {
+            if (_Precision > 155) { // threshold determined via profiling
+                return _VSTD::lower_bound(_Table_begin, _Table_end, _Uint_value, less{});
+            }
+        }
+
+        return _VSTD::find_if(_Table_begin, _Table_end, [=](const _Uint_type _Elem) { return _Uint_value <= _Elem; });
+    }();
+
+    const ptrdiff_t _Table_index     = _Table_lower_bound - _Table_begin;
+    const int _Scientific_exponent_X = static_cast<int>(_Table_index - 5);
+    const bool _Use_fixed_notation   = _Precision > _Scientific_exponent_X && _Scientific_exponent_X >= -4;
+
+    // Performance note: it might (or might not) be faster to modify Ryu Printf to perform zero-trimming.
+    // Such modifications would involve a fairly complicated state machine (notably, both '0' and '9' digits would
+    // need to be buffered, due to rounding), and that would have performance costs due to increased branching.
+    // Here, we're using a simpler approach: writing into a local buffer, manually zero-trimming, and then copying into
+    // the output range. The necessary buffer size is reasonably small, the zero-trimming logic is simple and fast,
+    // and the final copying is also fast.
+
+    constexpr int _Max_output_length =
+        _IsSame<_Floating, float>::value ? 117 : 773; // cases: 0x1.fffffep-126f and 0x1.fffffffffffffp-1022
+    constexpr int _Max_fixed_precision =
+        _IsSame<_Floating, float>::value ? 37 : 66; // cases: 0x1.fffffep-14f and 0x1.fffffffffffffp-14
+    constexpr int _Max_scientific_precision =
+        _IsSame<_Floating, float>::value ? 111 : 766; // cases: 0x1.fffffep-126f and 0x1.fffffffffffffp-1022
+
+    // Note that _Max_output_length is determined by scientific notation and is more than enough for fixed notation.
+    // 0x1.fffffep+127f is 39 digits, plus 1 for '.', plus _Max_fixed_precision for '0' digits, equals 77.
+    // 0x1.fffffffffffffp+1023 is 309 digits, plus 1 for '.', plus _Max_fixed_precision for '0' digits, equals 376.
+
+    char _Buffer[_Max_output_length];
+    const char* const _Significand_first = _Buffer; // e.g. "1.234"
+    const char* _Significand_last        = nullptr;
+    const char* _Exponent_first          = nullptr; // e.g. "e-05"
+    const char* _Exponent_last           = nullptr;
+    int _Effective_precision; // number of digits printed after the decimal point, before trimming
+
+    // Write into the local buffer.
+    // Clamping _Effective_precision allows _Buffer to be as small as possible, and increases efficiency.
+    if (_Use_fixed_notation) {
+        _Effective_precision = _VSTD::min(_Precision - (_Scientific_exponent_X + 1), _Max_fixed_precision);
+        const to_chars_result _Buf_result =
+            _Floating_to_chars_fixed_precision(_Buffer, _VSTD::end(_Buffer), _Value, _Effective_precision);
+        _LIBCPP_ASSERT(_Buf_result.ec == errc{}, "");
+        _Significand_last = _Buf_result.ptr;
+    } else {
+        _Effective_precision = _VSTD::min(_Precision - 1, _Max_scientific_precision);
+        const to_chars_result _Buf_result =
+            _Floating_to_chars_scientific_precision(_Buffer, _VSTD::end(_Buffer), _Value, _Effective_precision);
+        _LIBCPP_ASSERT(_Buf_result.ec == errc{}, "");
+        _Significand_last = _VSTD::find(_Buffer, _Buf_result.ptr, 'e');
+        _Exponent_first   = _Significand_last;
+        _Exponent_last    = _Buf_result.ptr;
+    }
+
+    // If we printed a decimal point followed by digits, perform zero-trimming.
+    if (_Effective_precision > 0) {
+        while (_Significand_last[-1] == '0') { // will stop at '.' or a nonzero digit
+            --_Significand_last;
+        }
+
+        if (_Significand_last[-1] == '.') {
+            --_Significand_last;
+        }
+    }
+
+    // Copy the significand to the output range.
+    const ptrdiff_t _Significand_distance = _Significand_last - _Significand_first;
+    if (_Last - _First < _Significand_distance) {
+        return {_Last, errc::value_too_large};
+    }
+    _VSTD::memcpy(_First, _Significand_first, static_cast<size_t>(_Significand_distance));
+    _First += _Significand_distance;
+
+    // Copy the exponent to the output range.
+    if (!_Use_fixed_notation) {
+        const ptrdiff_t _Exponent_distance = _Exponent_last - _Exponent_first;
+        if (_Last - _First < _Exponent_distance) {
+            return {_Last, errc::value_too_large};
+        }
+        _VSTD::memcpy(_First, _Exponent_first, static_cast<size_t>(_Exponent_distance));
+        _First += _Exponent_distance;
+    }
+
+    return {_First, errc{}};
+}
+
+enum class _Floating_to_chars_overload { _Plain, _Format_only, _Format_precision };
+
+template <_Floating_to_chars_overload _Overload, class _Floating>
+[[nodiscard]] _LIBCPP_HIDE_FROM_ABI
+to_chars_result _Floating_to_chars(
+    char* _First, char* const _Last, _Floating _Value, const chars_format _Fmt, const int _Precision) noexcept {
+
+    if constexpr (_Overload == _Floating_to_chars_overload::_Plain) {
+        _LIBCPP_ASSERT(_Fmt == chars_format{}, ""); // plain overload must pass chars_format{} internally
+    } else {
+        _LIBCPP_ASSERT(_Fmt == chars_format::general || _Fmt == chars_format::scientific || _Fmt == chars_format::fixed
+                         || _Fmt == chars_format::hex,
+            "invalid format in to_chars()");
+    }
+
+    using _Traits    = _Floating_type_traits<_Floating>;
+    using _Uint_type = typename _Traits::_Uint_type;
+
+    _Uint_type _Uint_value = _VSTD::bit_cast<_Uint_type>(_Value);
+
+    const bool _Was_negative = (_Uint_value & _Traits::_Shifted_sign_mask) != 0;
+
+    if (_Was_negative) { // sign bit detected; write minus sign and clear sign bit
+        if (_First == _Last) {
+            return {_Last, errc::value_too_large};
+        }
+
+        *_First++ = '-';
+
+        _Uint_value &= ~_Traits::_Shifted_sign_mask;
+        _Value = _VSTD::bit_cast<_Floating>(_Uint_value);
+    }
+
+    if ((_Uint_value & _Traits::_Shifted_exponent_mask) == _Traits::_Shifted_exponent_mask) {
+        // inf/nan detected; write appropriate string and return
+        const char* _Str;
+        size_t _Len;
+
+        const _Uint_type _Mantissa = _Uint_value & _Traits::_Denormal_mantissa_mask;
+
+        if (_Mantissa == 0) {
+            _Str = "inf";
+            _Len = 3;
+        } else if (_Was_negative && _Mantissa == _Traits::_Special_nan_mantissa_mask) {
+            // When a NaN value has the sign bit set, the quiet bit set, and all other mantissa bits cleared,
+            // the UCRT interprets it to mean "indeterminate", and indicates this by printing "-nan(ind)".
+            _Str = "nan(ind)";
+            _Len = 8;
+        } else if ((_Mantissa & _Traits::_Special_nan_mantissa_mask) != 0) {
+            _Str = "nan";
+            _Len = 3;
+        } else {
+            _Str = "nan(snan)";
+            _Len = 9;
+        }
+
+        if (_Last - _First < static_cast<ptrdiff_t>(_Len)) {
+            return {_Last, errc::value_too_large};
+        }
+
+        _VSTD::memcpy(_First, _Str, _Len);
+
+        return {_First + _Len, errc{}};
+    }
+
+    if constexpr (_Overload == _Floating_to_chars_overload::_Plain) {
+        return _Floating_to_chars_ryu(_First, _Last, _Value, chars_format{});
+    } else if constexpr (_Overload == _Floating_to_chars_overload::_Format_only) {
+        if (_Fmt == chars_format::hex) {
+            return _Floating_to_chars_hex_shortest(_First, _Last, _Value);
+        }
+
+        return _Floating_to_chars_ryu(_First, _Last, _Value, _Fmt);
+    } else if constexpr (_Overload == _Floating_to_chars_overload::_Format_precision) {
+        switch (_Fmt) {
+        case chars_format::scientific:
+            return _Floating_to_chars_scientific_precision(_First, _Last, _Value, _Precision);
+        case chars_format::fixed:
+            return _Floating_to_chars_fixed_precision(_First, _Last, _Value, _Precision);
+        case chars_format::general:
+            return _Floating_to_chars_general_precision(_First, _Last, _Value, _Precision);
+        case chars_format::hex:
+        default: // avoid MSVC warning C4715: not all control paths return a value
+            return _Floating_to_chars_hex_precision(_First, _Last, _Value, _Precision);
+        }
+    }
+}
+
+// clang-format on
+
+_LIBCPP_END_NAMESPACE_STD
+
+#endif // _LIBCPP_SRC_INCLUDE_TO_CHARS_FLOATING_POINT_H
diff --git a/src/ryu/README.txt b/src/ryu/README.txt
new file mode 100644
index 0000000..e3d1746
--- /dev/null
+++ b/src/ryu/README.txt
@@ -0,0 +1,11 @@
+The code in this directory is based on Ulf Adams's work. The upstream for the
+code is:
+
+https://github.com/ulfjack/ryu/tree/59661c3/ryu
+
+The code has been adapted by Stephan T. Lavavej of Microsoft for usage in
+std::to_chars. This code has been contributed by Microsoft for inclusion in
+libc++.
+
+The code in this directory has a different coding style than other parts to
+minimize the number of changes by both upstream sources.
diff --git a/src/ryu/d2fixed.cpp b/src/ryu/d2fixed.cpp
new file mode 100644
index 0000000..699f915
--- /dev/null
+++ b/src/ryu/d2fixed.cpp
@@ -0,0 +1,669 @@
+//===----------------------------------------------------------------------===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+
+// Copyright (c) Microsoft Corporation.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+
+// Copyright 2018 Ulf Adams
+// Copyright (c) Microsoft Corporation. All rights reserved.
+
+// Boost Software License - Version 1.0 - August 17th, 2003
+
+// Permission is hereby granted, free of charge, to any person or organization
+// obtaining a copy of the software and accompanying documentation covered by
+// this license (the "Software") to use, reproduce, display, distribute,
+// execute, and transmit the Software, and to prepare derivative works of the
+// Software, and to permit third-parties to whom the Software is furnished to
+// do so, all subject to the following:
+
+// The copyright notices in the Software and this entire statement, including
+// the above license grant, this restriction and the following disclaimer,
+// must be included in all copies of the Software, in whole or in part, and
+// all derivative works of the Software, unless such copies or derivative
+// works are solely in the form of machine-executable object code generated by
+// a source language processor.
+
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT
+// SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE
+// FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,
+// ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+// DEALINGS IN THE SOFTWARE.
+
+// Avoid formatting to keep the changes with the original code minimal.
+// clang-format off
+
+#include "__config"
+#include "charconv"
+#include "cstring"
+#include "system_error"
+
+#include "include/ryu/common.h"
+#include "include/ryu/d2fixed.h"
+#include "include/ryu/d2fixed_full_table.h"
+#include "include/ryu/d2s.h"
+#include "include/ryu/d2s_intrinsics.h"
+#include "include/ryu/digit_table.h"
+
+_LIBCPP_BEGIN_NAMESPACE_STD
+
+inline constexpr int __POW10_ADDITIONAL_BITS = 120;
+
+#ifdef _LIBCPP_INTRINSIC128
+// Returns the low 64 bits of the high 128 bits of the 256-bit product of a and b.
+[[nodiscard]] _LIBCPP_HIDE_FROM_ABI inline uint64_t __umul256_hi128_lo64(
+  const uint64_t __aHi, const uint64_t __aLo, const uint64_t __bHi, const uint64_t __bLo) {
+  uint64_t __b00Hi;
+  const uint64_t __b00Lo = __ryu_umul128(__aLo, __bLo, &__b00Hi);
+  uint64_t __b01Hi;
+  const uint64_t __b01Lo = __ryu_umul128(__aLo, __bHi, &__b01Hi);
+  uint64_t __b10Hi;
+  const uint64_t __b10Lo = __ryu_umul128(__aHi, __bLo, &__b10Hi);
+  uint64_t __b11Hi;
+  const uint64_t __b11Lo = __ryu_umul128(__aHi, __bHi, &__b11Hi);
+  (void) __b00Lo; // unused
+  (void) __b11Hi; // unused
+  const uint64_t __temp1Lo = __b10Lo + __b00Hi;
+  const uint64_t __temp1Hi = __b10Hi + (__temp1Lo < __b10Lo);
+  const uint64_t __temp2Lo = __b01Lo + __temp1Lo;
+  const uint64_t __temp2Hi = __b01Hi + (__temp2Lo < __b01Lo);
+  return __b11Lo + __temp1Hi + __temp2Hi;
+}
+
+[[nodiscard]] _LIBCPP_HIDE_FROM_ABI inline uint32_t __uint128_mod1e9(const uint64_t __vHi, const uint64_t __vLo) {
+  // After multiplying, we're going to shift right by 29, then truncate to uint32_t.
+  // This means that we need only 29 + 32 = 61 bits, so we can truncate to uint64_t before shifting.
+  const uint64_t __multiplied = __umul256_hi128_lo64(__vHi, __vLo, 0x89705F4136B4A597u, 0x31680A88F8953031u);
+
+  // For uint32_t truncation, see the __mod1e9() comment in d2s_intrinsics.h.
+  const uint32_t __shifted = static_cast<uint32_t>(__multiplied >> 29);
+
+  return static_cast<uint32_t>(__vLo) - 1000000000 * __shifted;
+}
+#endif // ^^^ intrinsics available ^^^
+
+[[nodiscard]] _LIBCPP_HIDE_FROM_ABI inline uint32_t __mulShift_mod1e9(const uint64_t __m, const uint64_t* const __mul, const int32_t __j) {
+  uint64_t __high0;                                               // 64
+  const uint64_t __low0 = __ryu_umul128(__m, __mul[0], &__high0); // 0
+  uint64_t __high1;                                               // 128
+  const uint64_t __low1 = __ryu_umul128(__m, __mul[1], &__high1); // 64
+  uint64_t __high2;                                               // 192
+  const uint64_t __low2 = __ryu_umul128(__m, __mul[2], &__high2); // 128
+  const uint64_t __s0low = __low0;                  // 0
+  (void) __s0low; // unused
+  const uint64_t __s0high = __low1 + __high0;       // 64
+  const uint32_t __c1 = __s0high < __low1;
+  const uint64_t __s1low = __low2 + __high1 + __c1; // 128
+  const uint32_t __c2 = __s1low < __low2; // __high1 + __c1 can't overflow, so compare against __low2
+  const uint64_t __s1high = __high2 + __c2;         // 192
+  _LIBCPP_ASSERT(__j >= 128, "");
+  _LIBCPP_ASSERT(__j <= 180, "");
+#ifdef _LIBCPP_INTRINSIC128
+  const uint32_t __dist = static_cast<uint32_t>(__j - 128); // __dist: [0, 52]
+  const uint64_t __shiftedhigh = __s1high >> __dist;
+  const uint64_t __shiftedlow = __ryu_shiftright128(__s1low, __s1high, __dist);
+  return __uint128_mod1e9(__shiftedhigh, __shiftedlow);
+#else // ^^^ intrinsics available ^^^ / vvv intrinsics unavailable vvv
+  if (__j < 160) { // __j: [128, 160)
+    const uint64_t __r0 = __mod1e9(__s1high);
+    const uint64_t __r1 = __mod1e9((__r0 << 32) | (__s1low >> 32));
+    const uint64_t __r2 = ((__r1 << 32) | (__s1low & 0xffffffff));
+    return __mod1e9(__r2 >> (__j - 128));
+  } else { // __j: [160, 192)
+    const uint64_t __r0 = __mod1e9(__s1high);
+    const uint64_t __r1 = ((__r0 << 32) | (__s1low >> 32));
+    return __mod1e9(__r1 >> (__j - 160));
+  }
+#endif // ^^^ intrinsics unavailable ^^^
+}
+
+void __append_n_digits(const uint32_t __olength, uint32_t __digits, char* const __result) {
+  uint32_t __i = 0;
+  while (__digits >= 10000) {
+#ifdef __clang__ // TRANSITION, LLVM-38217
+    const uint32_t __c = __digits - 10000 * (__digits / 10000);
+#else
+    const uint32_t __c = __digits % 10000;
+#endif
+    __digits /= 10000;
+    const uint32_t __c0 = (__c % 100) << 1;
+    const uint32_t __c1 = (__c / 100) << 1;
+    _VSTD::memcpy(__result + __olength - __i - 2, __DIGIT_TABLE + __c0, 2);
+    _VSTD::memcpy(__result + __olength - __i - 4, __DIGIT_TABLE + __c1, 2);
+    __i += 4;
+  }
+  if (__digits >= 100) {
+    const uint32_t __c = (__digits % 100) << 1;
+    __digits /= 100;
+    _VSTD::memcpy(__result + __olength - __i - 2, __DIGIT_TABLE + __c, 2);
+    __i += 2;
+  }
+  if (__digits >= 10) {
+    const uint32_t __c = __digits << 1;
+    _VSTD::memcpy(__result + __olength - __i - 2, __DIGIT_TABLE + __c, 2);
+  } else {
+    __result[0] = static_cast<char>('0' + __digits);
+  }
+}
+
+_LIBCPP_HIDE_FROM_ABI inline void __append_d_digits(const uint32_t __olength, uint32_t __digits, char* const __result) {
+  uint32_t __i = 0;
+  while (__digits >= 10000) {
+#ifdef __clang__ // TRANSITION, LLVM-38217
+    const uint32_t __c = __digits - 10000 * (__digits / 10000);
+#else
+    const uint32_t __c = __digits % 10000;
+#endif
+    __digits /= 10000;
+    const uint32_t __c0 = (__c % 100) << 1;
+    const uint32_t __c1 = (__c / 100) << 1;
+    _VSTD::memcpy(__result + __olength + 1 - __i - 2, __DIGIT_TABLE + __c0, 2);
+    _VSTD::memcpy(__result + __olength + 1 - __i - 4, __DIGIT_TABLE + __c1, 2);
+    __i += 4;
+  }
+  if (__digits >= 100) {
+    const uint32_t __c = (__digits % 100) << 1;
+    __digits /= 100;
+    _VSTD::memcpy(__result + __olength + 1 - __i - 2, __DIGIT_TABLE + __c, 2);
+    __i += 2;
+  }
+  if (__digits >= 10) {
+    const uint32_t __c = __digits << 1;
+    __result[2] = __DIGIT_TABLE[__c + 1];
+    __result[1] = '.';
+    __result[0] = __DIGIT_TABLE[__c];
+  } else {
+    __result[1] = '.';
+    __result[0] = static_cast<char>('0' + __digits);
+  }
+}
+
+_LIBCPP_HIDE_FROM_ABI inline void __append_c_digits(const uint32_t __count, uint32_t __digits, char* const __result) {
+  uint32_t __i = 0;
+  for (; __i < __count - 1; __i += 2) {
+    const uint32_t __c = (__digits % 100) << 1;
+    __digits /= 100;
+    _VSTD::memcpy(__result + __count - __i - 2, __DIGIT_TABLE + __c, 2);
+  }
+  if (__i < __count) {
+    const char __c = static_cast<char>('0' + (__digits % 10));
+    __result[__count - __i - 1] = __c;
+  }
+}
+
+void __append_nine_digits(uint32_t __digits, char* const __result) {
+  if (__digits == 0) {
+    _VSTD::memset(__result, '0', 9);
+    return;
+  }
+
+  for (uint32_t __i = 0; __i < 5; __i += 4) {
+#ifdef __clang__ // TRANSITION, LLVM-38217
+    const uint32_t __c = __digits - 10000 * (__digits / 10000);
+#else
+    const uint32_t __c = __digits % 10000;
+#endif
+    __digits /= 10000;
+    const uint32_t __c0 = (__c % 100) << 1;
+    const uint32_t __c1 = (__c / 100) << 1;
+    _VSTD::memcpy(__result + 7 - __i, __DIGIT_TABLE + __c0, 2);
+    _VSTD::memcpy(__result + 5 - __i, __DIGIT_TABLE + __c1, 2);
+  }
+  __result[0] = static_cast<char>('0' + __digits);
+}
+
+[[nodiscard]] _LIBCPP_HIDE_FROM_ABI inline uint32_t __indexForExponent(const uint32_t __e) {
+  return (__e + 15) / 16;
+}
+
+[[nodiscard]] _LIBCPP_HIDE_FROM_ABI inline uint32_t __pow10BitsForIndex(const uint32_t __idx) {
+  return 16 * __idx + __POW10_ADDITIONAL_BITS;
+}
+
+[[nodiscard]] _LIBCPP_HIDE_FROM_ABI inline uint32_t __lengthForIndex(const uint32_t __idx) {
+  // +1 for ceil, +16 for mantissa, +8 to round up when dividing by 9
+  return (__log10Pow2(16 * static_cast<int32_t>(__idx)) + 1 + 16 + 8) / 9;
+}
+
+[[nodiscard]] to_chars_result __d2fixed_buffered_n(char* _First, char* const _Last, const double __d,
+  const uint32_t __precision) {
+  char* const _Original_first = _First;
+
+  const uint64_t __bits = __double_to_bits(__d);
+
+  // Case distinction; exit early for the easy cases.
+  if (__bits == 0) {
+    const int32_t _Total_zero_length = 1 // leading zero
+      + static_cast<int32_t>(__precision != 0) // possible decimal point
+      + static_cast<int32_t>(__precision); // zeroes after decimal point
+
+    if (_Last - _First < _Total_zero_length) {
+      return { _Last, errc::value_too_large };
+    }
+
+    *_First++ = '0';
+    if (__precision > 0) {
+      *_First++ = '.';
+      _VSTD::memset(_First, '0', __precision);
+      _First += __precision;
+    }
+    return { _First, errc{} };
+  }
+
+  // Decode __bits into mantissa and exponent.
+  const uint64_t __ieeeMantissa = __bits & ((1ull << __DOUBLE_MANTISSA_BITS) - 1);
+  const uint32_t __ieeeExponent = static_cast<uint32_t>(__bits >> __DOUBLE_MANTISSA_BITS);
+
+  int32_t __e2;
+  uint64_t __m2;
+  if (__ieeeExponent == 0) {
+    __e2 = 1 - __DOUBLE_BIAS - __DOUBLE_MANTISSA_BITS;
+    __m2 = __ieeeMantissa;
+  } else {
+    __e2 = static_cast<int32_t>(__ieeeExponent) - __DOUBLE_BIAS - __DOUBLE_MANTISSA_BITS;
+    __m2 = (1ull << __DOUBLE_MANTISSA_BITS) | __ieeeMantissa;
+  }
+
+  bool __nonzero = false;
+  if (__e2 >= -52) {
+    const uint32_t __idx = __e2 < 0 ? 0 : __indexForExponent(static_cast<uint32_t>(__e2));
+    const uint32_t __p10bits = __pow10BitsForIndex(__idx);
+    const int32_t __len = static_cast<int32_t>(__lengthForIndex(__idx));
+    for (int32_t __i = __len - 1; __i >= 0; --__i) {
+      const uint32_t __j = __p10bits - __e2;
+      // Temporary: __j is usually around 128, and by shifting a bit, we push it to 128 or above, which is
+      // a slightly faster code path in __mulShift_mod1e9. Instead, we can just increase the multipliers.
+      const uint32_t __digits = __mulShift_mod1e9(__m2 << 8, __POW10_SPLIT[__POW10_OFFSET[__idx] + __i],
+        static_cast<int32_t>(__j + 8));
+      if (__nonzero) {
+        if (_Last - _First < 9) {
+          return { _Last, errc::value_too_large };
+        }
+        __append_nine_digits(__digits, _First);
+        _First += 9;
+      } else if (__digits != 0) {
+        const uint32_t __olength = __decimalLength9(__digits);
+        if (_Last - _First < static_cast<ptrdiff_t>(__olength)) {
+          return { _Last, errc::value_too_large };
+        }
+        __append_n_digits(__olength, __digits, _First);
+        _First += __olength;
+        __nonzero = true;
+      }
+    }
+  }
+  if (!__nonzero) {
+    if (_First == _Last) {
+      return { _Last, errc::value_too_large };
+    }
+    *_First++ = '0';
+  }
+  if (__precision > 0) {
+    if (_First == _Last) {
+      return { _Last, errc::value_too_large };
+    }
+    *_First++ = '.';
+  }
+  if (__e2 < 0) {
+    const int32_t __idx = -__e2 / 16;
+    const uint32_t __blocks = __precision / 9 + 1;
+    // 0 = don't round up; 1 = round up unconditionally; 2 = round up if odd.
+    int __roundUp = 0;
+    uint32_t __i = 0;
+    if (__blocks <= __MIN_BLOCK_2[__idx]) {
+      __i = __blocks;
+      if (_Last - _First < static_cast<ptrdiff_t>(__precision)) {
+        return { _Last, errc::value_too_large };
+      }
+      _VSTD::memset(_First, '0', __precision);
+      _First += __precision;
+    } else if (__i < __MIN_BLOCK_2[__idx]) {
+      __i = __MIN_BLOCK_2[__idx];
+      if (_Last - _First < static_cast<ptrdiff_t>(9 * __i)) {
+        return { _Last, errc::value_too_large };
+      }
+      _VSTD::memset(_First, '0', 9 * __i);
+      _First += 9 * __i;
+    }
+    for (; __i < __blocks; ++__i) {
+      const int32_t __j = __ADDITIONAL_BITS_2 + (-__e2 - 16 * __idx);
+      const uint32_t __p = __POW10_OFFSET_2[__idx] + __i - __MIN_BLOCK_2[__idx];
+      if (__p >= __POW10_OFFSET_2[__idx + 1]) {
+        // If the remaining digits are all 0, then we might as well use memset.
+        // No rounding required in this case.
+        const uint32_t __fill = __precision - 9 * __i;
+        if (_Last - _First < static_cast<ptrdiff_t>(__fill)) {
+          return { _Last, errc::value_too_large };
+        }
+        _VSTD::memset(_First, '0', __fill);
+        _First += __fill;
+        break;
+      }
+      // Temporary: __j is usually around 128, and by shifting a bit, we push it to 128 or above, which is
+      // a slightly faster code path in __mulShift_mod1e9. Instead, we can just increase the multipliers.
+      uint32_t __digits = __mulShift_mod1e9(__m2 << 8, __POW10_SPLIT_2[__p], __j + 8);
+      if (__i < __blocks - 1) {
+        if (_Last - _First < 9) {
+          return { _Last, errc::value_too_large };
+        }
+        __append_nine_digits(__digits, _First);
+        _First += 9;
+      } else {
+        const uint32_t __maximum = __precision - 9 * __i;
+        uint32_t __lastDigit = 0;
+        for (uint32_t __k = 0; __k < 9 - __maximum; ++__k) {
+          __lastDigit = __digits % 10;
+          __digits /= 10;
+        }
+        if (__lastDigit != 5) {
+          __roundUp = __lastDigit > 5;
+        } else {
+          // Is m * 10^(additionalDigits + 1) / 2^(-__e2) integer?
+          const int32_t __requiredTwos = -__e2 - static_cast<int32_t>(__precision) - 1;
+          const bool __trailingZeros = __requiredTwos <= 0
+            || (__requiredTwos < 60 && __multipleOfPowerOf2(__m2, static_cast<uint32_t>(__requiredTwos)));
+          __roundUp = __trailingZeros ? 2 : 1;
+        }
+        if (__maximum > 0) {
+          if (_Last - _First < static_cast<ptrdiff_t>(__maximum)) {
+            return { _Last, errc::value_too_large };
+          }
+          __append_c_digits(__maximum, __digits, _First);
+          _First += __maximum;
+        }
+        break;
+      }
+    }
+    if (__roundUp != 0) {
+      char* _Round = _First;
+      char* _Dot = _Last;
+      while (true) {
+        if (_Round == _Original_first) {
+          _Round[0] = '1';
+          if (_Dot != _Last) {
+            _Dot[0] = '0';
+            _Dot[1] = '.';
+          }
+          if (_First == _Last) {
+            return { _Last, errc::value_too_large };
+          }
+          *_First++ = '0';
+          break;
+        }
+        --_Round;
+        const char __c = _Round[0];
+        if (__c == '.') {
+          _Dot = _Round;
+        } else if (__c == '9') {
+          _Round[0] = '0';
+          __roundUp = 1;
+        } else {
+          if (__roundUp == 1 || __c % 2 != 0) {
+            _Round[0] = __c + 1;
+          }
+          break;
+        }
+      }
+    }
+  } else {
+    if (_Last - _First < static_cast<ptrdiff_t>(__precision)) {
+      return { _Last, errc::value_too_large };
+    }
+    _VSTD::memset(_First, '0', __precision);
+    _First += __precision;
+  }
+  return { _First, errc{} };
+}
+
+[[nodiscard]] to_chars_result __d2exp_buffered_n(char* _First, char* const _Last, const double __d,
+  uint32_t __precision) {
+  char* const _Original_first = _First;
+
+  const uint64_t __bits = __double_to_bits(__d);
+
+  // Case distinction; exit early for the easy cases.
+  if (__bits == 0) {
+    const int32_t _Total_zero_length = 1 // leading zero
+      + static_cast<int32_t>(__precision != 0) // possible decimal point
+      + static_cast<int32_t>(__precision) // zeroes after decimal point
+      + 4; // "e+00"
+    if (_Last - _First < _Total_zero_length) {
+      return { _Last, errc::value_too_large };
+    }
+    *_First++ = '0';
+    if (__precision > 0) {
+      *_First++ = '.';
+      _VSTD::memset(_First, '0', __precision);
+      _First += __precision;
+    }
+    _VSTD::memcpy(_First, "e+00", 4);
+    _First += 4;
+    return { _First, errc{} };
+  }
+
+  // Decode __bits into mantissa and exponent.
+  const uint64_t __ieeeMantissa = __bits & ((1ull << __DOUBLE_MANTISSA_BITS) - 1);
+  const uint32_t __ieeeExponent = static_cast<uint32_t>(__bits >> __DOUBLE_MANTISSA_BITS);
+
+  int32_t __e2;
+  uint64_t __m2;
+  if (__ieeeExponent == 0) {
+    __e2 = 1 - __DOUBLE_BIAS - __DOUBLE_MANTISSA_BITS;
+    __m2 = __ieeeMantissa;
+  } else {
+    __e2 = static_cast<int32_t>(__ieeeExponent) - __DOUBLE_BIAS - __DOUBLE_MANTISSA_BITS;
+    __m2 = (1ull << __DOUBLE_MANTISSA_BITS) | __ieeeMantissa;
+  }
+
+  const bool __printDecimalPoint = __precision > 0;
+  ++__precision;
+  uint32_t __digits = 0;
+  uint32_t __printedDigits = 0;
+  uint32_t __availableDigits = 0;
+  int32_t __exp = 0;
+  if (__e2 >= -52) {
+    const uint32_t __idx = __e2 < 0 ? 0 : __indexForExponent(static_cast<uint32_t>(__e2));
+    const uint32_t __p10bits = __pow10BitsForIndex(__idx);
+    const int32_t __len = static_cast<int32_t>(__lengthForIndex(__idx));
+    for (int32_t __i = __len - 1; __i >= 0; --__i) {
+      const uint32_t __j = __p10bits - __e2;
+      // Temporary: __j is usually around 128, and by shifting a bit, we push it to 128 or above, which is
+      // a slightly faster code path in __mulShift_mod1e9. Instead, we can just increase the multipliers.
+      __digits = __mulShift_mod1e9(__m2 << 8, __POW10_SPLIT[__POW10_OFFSET[__idx] + __i],
+        static_cast<int32_t>(__j + 8));
+      if (__printedDigits != 0) {
+        if (__printedDigits + 9 > __precision) {
+          __availableDigits = 9;
+          break;
+        }
+        if (_Last - _First < 9) {
+          return { _Last, errc::value_too_large };
+        }
+        __append_nine_digits(__digits, _First);
+        _First += 9;
+        __printedDigits += 9;
+      } else if (__digits != 0) {
+        __availableDigits = __decimalLength9(__digits);
+        __exp = __i * 9 + static_cast<int32_t>(__availableDigits) - 1;
+        if (__availableDigits > __precision) {
+          break;
+        }
+        if (__printDecimalPoint) {
+          if (_Last - _First < static_cast<ptrdiff_t>(__availableDigits + 1)) {
+            return { _Last, errc::value_too_large };
+          }
+          __append_d_digits(__availableDigits, __digits, _First);
+          _First += __availableDigits + 1; // +1 for decimal point
+        } else {
+          if (_First == _Last) {
+            return { _Last, errc::value_too_large };
+          }
+          *_First++ = static_cast<char>('0' + __digits);
+        }
+        __printedDigits = __availableDigits;
+        __availableDigits = 0;
+      }
+    }
+  }
+
+  if (__e2 < 0 && __availableDigits == 0) {
+    const int32_t __idx = -__e2 / 16;
+    for (int32_t __i = __MIN_BLOCK_2[__idx]; __i < 200; ++__i) {
+      const int32_t __j = __ADDITIONAL_BITS_2 + (-__e2 - 16 * __idx);
+      const uint32_t __p = __POW10_OFFSET_2[__idx] + static_cast<uint32_t>(__i) - __MIN_BLOCK_2[__idx];
+      // Temporary: __j is usually around 128, and by shifting a bit, we push it to 128 or above, which is
+      // a slightly faster code path in __mulShift_mod1e9. Instead, we can just increase the multipliers.
+      __digits = (__p >= __POW10_OFFSET_2[__idx + 1]) ? 0 : __mulShift_mod1e9(__m2 << 8, __POW10_SPLIT_2[__p], __j + 8);
+      if (__printedDigits != 0) {
+        if (__printedDigits + 9 > __precision) {
+          __availableDigits = 9;
+          break;
+        }
+        if (_Last - _First < 9) {
+          return { _Last, errc::value_too_large };
+        }
+        __append_nine_digits(__digits, _First);
+        _First += 9;
+        __printedDigits += 9;
+      } else if (__digits != 0) {
+        __availableDigits = __decimalLength9(__digits);
+        __exp = -(__i + 1) * 9 + static_cast<int32_t>(__availableDigits) - 1;
+        if (__availableDigits > __precision) {
+          break;
+        }
+        if (__printDecimalPoint) {
+          if (_Last - _First < static_cast<ptrdiff_t>(__availableDigits + 1)) {
+            return { _Last, errc::value_too_large };
+          }
+          __append_d_digits(__availableDigits, __digits, _First);
+          _First += __availableDigits + 1; // +1 for decimal point
+        } else {
+          if (_First == _Last) {
+            return { _Last, errc::value_too_large };
+          }
+          *_First++ = static_cast<char>('0' + __digits);
+        }
+        __printedDigits = __availableDigits;
+        __availableDigits = 0;
+      }
+    }
+  }
+
+  const uint32_t __maximum = __precision - __printedDigits;
+  if (__availableDigits == 0) {
+    __digits = 0;
+  }
+  uint32_t __lastDigit = 0;
+  if (__availableDigits > __maximum) {
+    for (uint32_t __k = 0; __k < __availableDigits - __maximum; ++__k) {
+      __lastDigit = __digits % 10;
+      __digits /= 10;
+    }
+  }
+  // 0 = don't round up; 1 = round up unconditionally; 2 = round up if odd.
+  int __roundUp = 0;
+  if (__lastDigit != 5) {
+    __roundUp = __lastDigit > 5;
+  } else {
+    // Is m * 2^__e2 * 10^(__precision + 1 - __exp) integer?
+    // __precision was already increased by 1, so we don't need to write + 1 here.
+    const int32_t __rexp = static_cast<int32_t>(__precision) - __exp;
+    const int32_t __requiredTwos = -__e2 - __rexp;
+    bool __trailingZeros = __requiredTwos <= 0
+      || (__requiredTwos < 60 && __multipleOfPowerOf2(__m2, static_cast<uint32_t>(__requiredTwos)));
+    if (__rexp < 0) {
+      const int32_t __requiredFives = -__rexp;
+      __trailingZeros = __trailingZeros && __multipleOfPowerOf5(__m2, static_cast<uint32_t>(__requiredFives));
+    }
+    __roundUp = __trailingZeros ? 2 : 1;
+  }
+  if (__printedDigits != 0) {
+    if (_Last - _First < static_cast<ptrdiff_t>(__maximum)) {
+      return { _Last, errc::value_too_large };
+    }
+    if (__digits == 0) {
+      _VSTD::memset(_First, '0', __maximum);
+    } else {
+      __append_c_digits(__maximum, __digits, _First);
+    }
+    _First += __maximum;
+  } else {
+    if (__printDecimalPoint) {
+      if (_Last - _First < static_cast<ptrdiff_t>(__maximum + 1)) {
+        return { _Last, errc::value_too_large };
+      }
+      __append_d_digits(__maximum, __digits, _First);
+      _First += __maximum + 1; // +1 for decimal point
+    } else {
+      if (_First == _Last) {
+        return { _Last, errc::value_too_large };
+      }
+      *_First++ = static_cast<char>('0' + __digits);
+    }
+  }
+  if (__roundUp != 0) {
+    char* _Round = _First;
+    while (true) {
+      if (_Round == _Original_first) {
+        _Round[0] = '1';
+        ++__exp;
+        break;
+      }
+      --_Round;
+      const char __c = _Round[0];
+      if (__c == '.') {
+        // Keep going.
+      } else if (__c == '9') {
+        _Round[0] = '0';
+        __roundUp = 1;
+      } else {
+        if (__roundUp == 1 || __c % 2 != 0) {
+          _Round[0] = __c + 1;
+        }
+        break;
+      }
+    }
+  }
+
+  char _Sign_character;
+
+  if (__exp < 0) {
+    _Sign_character = '-';
+    __exp = -__exp;
+  } else {
+    _Sign_character = '+';
+  }
+
+  const int _Exponent_part_length = __exp >= 100
+    ? 5 // "e+NNN"
+    : 4; // "e+NN"
+
+  if (_Last - _First < _Exponent_part_length) {
+    return { _Last, errc::value_too_large };
+  }
+
+  *_First++ = 'e';
+  *_First++ = _Sign_character;
+
+  if (__exp >= 100) {
+    const int32_t __c = __exp % 10;
+    _VSTD::memcpy(_First, __DIGIT_TABLE + 2 * (__exp / 10), 2);
+    _First[2] = static_cast<char>('0' + __c);
+    _First += 3;
+  } else {
+    _VSTD::memcpy(_First, __DIGIT_TABLE + 2 * __exp, 2);
+    _First += 2;
+  }
+
+  return { _First, errc{} };
+}
+
+_LIBCPP_END_NAMESPACE_STD
+
+// clang-format on
diff --git a/src/ryu/d2s.cpp b/src/ryu/d2s.cpp
new file mode 100644
index 0000000..510b4b8
--- /dev/null
+++ b/src/ryu/d2s.cpp
@@ -0,0 +1,782 @@
+//===----------------------------------------------------------------------===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+
+// Copyright (c) Microsoft Corporation.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+
+// Copyright 2018 Ulf Adams
+// Copyright (c) Microsoft Corporation. All rights reserved.
+
+// Boost Software License - Version 1.0 - August 17th, 2003
+
+// Permission is hereby granted, free of charge, to any person or organization
+// obtaining a copy of the software and accompanying documentation covered by
+// this license (the "Software") to use, reproduce, display, distribute,
+// execute, and transmit the Software, and to prepare derivative works of the
+// Software, and to permit third-parties to whom the Software is furnished to
+// do so, all subject to the following:
+
+// The copyright notices in the Software and this entire statement, including
+// the above license grant, this restriction and the following disclaimer,
+// must be included in all copies of the Software, in whole or in part, and
+// all derivative works of the Software, unless such copies or derivative
+// works are solely in the form of machine-executable object code generated by
+// a source language processor.
+
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT
+// SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE
+// FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,
+// ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+// DEALINGS IN THE SOFTWARE.
+
+// Avoid formatting to keep the changes with the original code minimal.
+// clang-format off
+
+#include "__config"
+#include "charconv"
+
+#include "include/ryu/common.h"
+#include "include/ryu/d2fixed.h"
+#include "include/ryu/d2s.h"
+#include "include/ryu/d2s_full_table.h"
+#include "include/ryu/d2s_intrinsics.h"
+#include "include/ryu/digit_table.h"
+#include "include/ryu/ryu.h"
+
+_LIBCPP_BEGIN_NAMESPACE_STD
+
+// We need a 64x128-bit multiplication and a subsequent 128-bit shift.
+// Multiplication:
+//   The 64-bit factor is variable and passed in, the 128-bit factor comes
+//   from a lookup table. We know that the 64-bit factor only has 55
+//   significant bits (i.e., the 9 topmost bits are zeros). The 128-bit
+//   factor only has 124 significant bits (i.e., the 4 topmost bits are
+//   zeros).
+// Shift:
+//   In principle, the multiplication result requires 55 + 124 = 179 bits to
+//   represent. However, we then shift this value to the right by __j, which is
+//   at least __j >= 115, so the result is guaranteed to fit into 179 - 115 = 64
+//   bits. This means that we only need the topmost 64 significant bits of
+//   the 64x128-bit multiplication.
+//
+// There are several ways to do this:
+// 1. Best case: the compiler exposes a 128-bit type.
+//    We perform two 64x64-bit multiplications, add the higher 64 bits of the
+//    lower result to the higher result, and shift by __j - 64 bits.
+//
+//    We explicitly cast from 64-bit to 128-bit, so the compiler can tell
+//    that these are only 64-bit inputs, and can map these to the best
+//    possible sequence of assembly instructions.
+//    x64 machines happen to have matching assembly instructions for
+//    64x64-bit multiplications and 128-bit shifts.
+//
+// 2. Second best case: the compiler exposes intrinsics for the x64 assembly
+//    instructions mentioned in 1.
+//
+// 3. We only have 64x64 bit instructions that return the lower 64 bits of
+//    the result, i.e., we have to use plain C.
+//    Our inputs are less than the full width, so we have three options:
+//    a. Ignore this fact and just implement the intrinsics manually.
+//    b. Split both into 31-bit pieces, which guarantees no internal overflow,
+//       but requires extra work upfront (unless we change the lookup table).
+//    c. Split only the first factor into 31-bit pieces, which also guarantees
+//       no internal overflow, but requires extra work since the intermediate
+//       results are not perfectly aligned.
+#ifdef _LIBCPP_INTRINSIC128
+
+[[nodiscard]] _LIBCPP_HIDE_FROM_ABI inline uint64_t __mulShift(const uint64_t __m, const uint64_t* const __mul, const int32_t __j) {
+  // __m is maximum 55 bits
+  uint64_t __high1;                                               // 128
+  const uint64_t __low1 = __ryu_umul128(__m, __mul[1], &__high1); // 64
+  uint64_t __high0;                                               // 64
+  (void) __ryu_umul128(__m, __mul[0], &__high0);                  // 0
+  const uint64_t __sum = __high0 + __low1;
+  if (__sum < __high0) {
+    ++__high1; // overflow into __high1
+  }
+  return __ryu_shiftright128(__sum, __high1, static_cast<uint32_t>(__j - 64));
+}
+
+[[nodiscard]] _LIBCPP_HIDE_FROM_ABI inline uint64_t __mulShiftAll(const uint64_t __m, const uint64_t* const __mul, const int32_t __j,
+  uint64_t* const __vp, uint64_t* const __vm, const uint32_t __mmShift) {
+  *__vp = __mulShift(4 * __m + 2, __mul, __j);
+  *__vm = __mulShift(4 * __m - 1 - __mmShift, __mul, __j);
+  return __mulShift(4 * __m, __mul, __j);
+}
+
+#else // ^^^ intrinsics available ^^^ / vvv intrinsics unavailable vvv
+
+[[nodiscard]] _LIBCPP_HIDE_FROM_ABI inline _LIBCPP_ALWAYS_INLINE uint64_t __mulShiftAll(uint64_t __m, const uint64_t* const __mul, const int32_t __j,
+  uint64_t* const __vp, uint64_t* const __vm, const uint32_t __mmShift) { // TRANSITION, VSO-634761
+  __m <<= 1;
+  // __m is maximum 55 bits
+  uint64_t __tmp;
+  const uint64_t __lo = __ryu_umul128(__m, __mul[0], &__tmp);
+  uint64_t __hi;
+  const uint64_t __mid = __tmp + __ryu_umul128(__m, __mul[1], &__hi);
+  __hi += __mid < __tmp; // overflow into __hi
+
+  const uint64_t __lo2 = __lo + __mul[0];
+  const uint64_t __mid2 = __mid + __mul[1] + (__lo2 < __lo);
+  const uint64_t __hi2 = __hi + (__mid2 < __mid);
+  *__vp = __ryu_shiftright128(__mid2, __hi2, static_cast<uint32_t>(__j - 64 - 1));
+
+  if (__mmShift == 1) {
+    const uint64_t __lo3 = __lo - __mul[0];
+    const uint64_t __mid3 = __mid - __mul[1] - (__lo3 > __lo);
+    const uint64_t __hi3 = __hi - (__mid3 > __mid);
+    *__vm = __ryu_shiftright128(__mid3, __hi3, static_cast<uint32_t>(__j - 64 - 1));
+  } else {
+    const uint64_t __lo3 = __lo + __lo;
+    const uint64_t __mid3 = __mid + __mid + (__lo3 < __lo);
+    const uint64_t __hi3 = __hi + __hi + (__mid3 < __mid);
+    const uint64_t __lo4 = __lo3 - __mul[0];
+    const uint64_t __mid4 = __mid3 - __mul[1] - (__lo4 > __lo3);
+    const uint64_t __hi4 = __hi3 - (__mid4 > __mid3);
+    *__vm = __ryu_shiftright128(__mid4, __hi4, static_cast<uint32_t>(__j - 64));
+  }
+
+  return __ryu_shiftright128(__mid, __hi, static_cast<uint32_t>(__j - 64 - 1));
+}
+
+#endif // ^^^ intrinsics unavailable ^^^
+
+[[nodiscard]] _LIBCPP_HIDE_FROM_ABI inline uint32_t __decimalLength17(const uint64_t __v) {
+  // This is slightly faster than a loop.
+  // The average output length is 16.38 digits, so we check high-to-low.
+  // Function precondition: __v is not an 18, 19, or 20-digit number.
+  // (17 digits are sufficient for round-tripping.)
+  _LIBCPP_ASSERT(__v < 100000000000000000u, "");
+  if (__v >= 10000000000000000u) { return 17; }
+  if (__v >= 1000000000000000u) { return 16; }
+  if (__v >= 100000000000000u) { return 15; }
+  if (__v >= 10000000000000u) { return 14; }
+  if (__v >= 1000000000000u) { return 13; }
+  if (__v >= 100000000000u) { return 12; }
+  if (__v >= 10000000000u) { return 11; }
+  if (__v >= 1000000000u) { return 10; }
+  if (__v >= 100000000u) { return 9; }
+  if (__v >= 10000000u) { return 8; }
+  if (__v >= 1000000u) { return 7; }
+  if (__v >= 100000u) { return 6; }
+  if (__v >= 10000u) { return 5; }
+  if (__v >= 1000u) { return 4; }
+  if (__v >= 100u) { return 3; }
+  if (__v >= 10u) { return 2; }
+  return 1;
+}
+
+// A floating decimal representing m * 10^e.
+struct __floating_decimal_64 {
+  uint64_t __mantissa;
+  int32_t __exponent;
+};
+
+[[nodiscard]] _LIBCPP_HIDE_FROM_ABI inline __floating_decimal_64 __d2d(const uint64_t __ieeeMantissa, const uint32_t __ieeeExponent) {
+  int32_t __e2;
+  uint64_t __m2;
+  if (__ieeeExponent == 0) {
+    // We subtract 2 so that the bounds computation has 2 additional bits.
+    __e2 = 1 - __DOUBLE_BIAS - __DOUBLE_MANTISSA_BITS - 2;
+    __m2 = __ieeeMantissa;
+  } else {
+    __e2 = static_cast<int32_t>(__ieeeExponent) - __DOUBLE_BIAS - __DOUBLE_MANTISSA_BITS - 2;
+    __m2 = (1ull << __DOUBLE_MANTISSA_BITS) | __ieeeMantissa;
+  }
+  const bool __even = (__m2 & 1) == 0;
+  const bool __acceptBounds = __even;
+
+  // Step 2: Determine the interval of valid decimal representations.
+  const uint64_t __mv = 4 * __m2;
+  // Implicit bool -> int conversion. True is 1, false is 0.
+  const uint32_t __mmShift = __ieeeMantissa != 0 || __ieeeExponent <= 1;
+  // We would compute __mp and __mm like this:
+  // uint64_t __mp = 4 * __m2 + 2;
+  // uint64_t __mm = __mv - 1 - __mmShift;
+
+  // Step 3: Convert to a decimal power base using 128-bit arithmetic.
+  uint64_t __vr, __vp, __vm;
+  int32_t __e10;
+  bool __vmIsTrailingZeros = false;
+  bool __vrIsTrailingZeros = false;
+  if (__e2 >= 0) {
+    // I tried special-casing __q == 0, but there was no effect on performance.
+    // This expression is slightly faster than max(0, __log10Pow2(__e2) - 1).
+    const uint32_t __q = __log10Pow2(__e2) - (__e2 > 3);
+    __e10 = static_cast<int32_t>(__q);
+    const int32_t __k = __DOUBLE_POW5_INV_BITCOUNT + __pow5bits(static_cast<int32_t>(__q)) - 1;
+    const int32_t __i = -__e2 + static_cast<int32_t>(__q) + __k;
+    __vr = __mulShiftAll(__m2, __DOUBLE_POW5_INV_SPLIT[__q], __i, &__vp, &__vm, __mmShift);
+    if (__q <= 21) {
+      // This should use __q <= 22, but I think 21 is also safe. Smaller values
+      // may still be safe, but it's more difficult to reason about them.
+      // Only one of __mp, __mv, and __mm can be a multiple of 5, if any.
+      const uint32_t __mvMod5 = static_cast<uint32_t>(__mv) - 5 * static_cast<uint32_t>(__div5(__mv));
+      if (__mvMod5 == 0) {
+        __vrIsTrailingZeros = __multipleOfPowerOf5(__mv, __q);
+      } else if (__acceptBounds) {
+        // Same as min(__e2 + (~__mm & 1), __pow5Factor(__mm)) >= __q
+        // <=> __e2 + (~__mm & 1) >= __q && __pow5Factor(__mm) >= __q
+        // <=> true && __pow5Factor(__mm) >= __q, since __e2 >= __q.
+        __vmIsTrailingZeros = __multipleOfPowerOf5(__mv - 1 - __mmShift, __q);
+      } else {
+        // Same as min(__e2 + 1, __pow5Factor(__mp)) >= __q.
+        __vp -= __multipleOfPowerOf5(__mv + 2, __q);
+      }
+    }
+  } else {
+    // This expression is slightly faster than max(0, __log10Pow5(-__e2) - 1).
+    const uint32_t __q = __log10Pow5(-__e2) - (-__e2 > 1);
+    __e10 = static_cast<int32_t>(__q) + __e2;
+    const int32_t __i = -__e2 - static_cast<int32_t>(__q);
+    const int32_t __k = __pow5bits(__i) - __DOUBLE_POW5_BITCOUNT;
+    const int32_t __j = static_cast<int32_t>(__q) - __k;
+    __vr = __mulShiftAll(__m2, __DOUBLE_POW5_SPLIT[__i], __j, &__vp, &__vm, __mmShift);
+    if (__q <= 1) {
+      // {__vr,__vp,__vm} is trailing zeros if {__mv,__mp,__mm} has at least __q trailing 0 bits.
+      // __mv = 4 * __m2, so it always has at least two trailing 0 bits.
+      __vrIsTrailingZeros = true;
+      if (__acceptBounds) {
+        // __mm = __mv - 1 - __mmShift, so it has 1 trailing 0 bit iff __mmShift == 1.
+        __vmIsTrailingZeros = __mmShift == 1;
+      } else {
+        // __mp = __mv + 2, so it always has at least one trailing 0 bit.
+        --__vp;
+      }
+    } else if (__q < 63) { // TRANSITION(ulfjack): Use a tighter bound here.
+      // We need to compute min(ntz(__mv), __pow5Factor(__mv) - __e2) >= __q - 1
+      // <=> ntz(__mv) >= __q - 1 && __pow5Factor(__mv) - __e2 >= __q - 1
+      // <=> ntz(__mv) >= __q - 1 (__e2 is negative and -__e2 >= __q)
+      // <=> (__mv & ((1 << (__q - 1)) - 1)) == 0
+      // We also need to make sure that the left shift does not overflow.
+      __vrIsTrailingZeros = __multipleOfPowerOf2(__mv, __q - 1);
+    }
+  }
+
+  // Step 4: Find the shortest decimal representation in the interval of valid representations.
+  int32_t __removed = 0;
+  uint8_t __lastRemovedDigit = 0;
+  uint64_t _Output;
+  // On average, we remove ~2 digits.
+  if (__vmIsTrailingZeros || __vrIsTrailingZeros) {
+    // General case, which happens rarely (~0.7%).
+    for (;;) {
+      const uint64_t __vpDiv10 = __div10(__vp);
+      const uint64_t __vmDiv10 = __div10(__vm);
+      if (__vpDiv10 <= __vmDiv10) {
+        break;
+      }
+      const uint32_t __vmMod10 = static_cast<uint32_t>(__vm) - 10 * static_cast<uint32_t>(__vmDiv10);
+      const uint64_t __vrDiv10 = __div10(__vr);
+      const uint32_t __vrMod10 = static_cast<uint32_t>(__vr) - 10 * static_cast<uint32_t>(__vrDiv10);
+      __vmIsTrailingZeros &= __vmMod10 == 0;
+      __vrIsTrailingZeros &= __lastRemovedDigit == 0;
+      __lastRemovedDigit = static_cast<uint8_t>(__vrMod10);
+      __vr = __vrDiv10;
+      __vp = __vpDiv10;
+      __vm = __vmDiv10;
+      ++__removed;
+    }
+    if (__vmIsTrailingZeros) {
+      for (;;) {
+        const uint64_t __vmDiv10 = __div10(__vm);
+        const uint32_t __vmMod10 = static_cast<uint32_t>(__vm) - 10 * static_cast<uint32_t>(__vmDiv10);
+        if (__vmMod10 != 0) {
+          break;
+        }
+        const uint64_t __vpDiv10 = __div10(__vp);
+        const uint64_t __vrDiv10 = __div10(__vr);
+        const uint32_t __vrMod10 = static_cast<uint32_t>(__vr) - 10 * static_cast<uint32_t>(__vrDiv10);
+        __vrIsTrailingZeros &= __lastRemovedDigit == 0;
+        __lastRemovedDigit = static_cast<uint8_t>(__vrMod10);
+        __vr = __vrDiv10;
+        __vp = __vpDiv10;
+        __vm = __vmDiv10;
+        ++__removed;
+      }
+    }
+    if (__vrIsTrailingZeros && __lastRemovedDigit == 5 && __vr % 2 == 0) {
+      // Round even if the exact number is .....50..0.
+      __lastRemovedDigit = 4;
+    }
+    // We need to take __vr + 1 if __vr is outside bounds or we need to round up.
+    _Output = __vr + ((__vr == __vm && (!__acceptBounds || !__vmIsTrailingZeros)) || __lastRemovedDigit >= 5);
+  } else {
+    // Specialized for the common case (~99.3%). Percentages below are relative to this.
+    bool __roundUp = false;
+    const uint64_t __vpDiv100 = __div100(__vp);
+    const uint64_t __vmDiv100 = __div100(__vm);
+    if (__vpDiv100 > __vmDiv100) { // Optimization: remove two digits at a time (~86.2%).
+      const uint64_t __vrDiv100 = __div100(__vr);
+      const uint32_t __vrMod100 = static_cast<uint32_t>(__vr) - 100 * static_cast<uint32_t>(__vrDiv100);
+      __roundUp = __vrMod100 >= 50;
+      __vr = __vrDiv100;
+      __vp = __vpDiv100;
+      __vm = __vmDiv100;
+      __removed += 2;
+    }
+    // Loop iterations below (approximately), without optimization above:
+    // 0: 0.03%, 1: 13.8%, 2: 70.6%, 3: 14.0%, 4: 1.40%, 5: 0.14%, 6+: 0.02%
+    // Loop iterations below (approximately), with optimization above:
+    // 0: 70.6%, 1: 27.8%, 2: 1.40%, 3: 0.14%, 4+: 0.02%
+    for (;;) {
+      const uint64_t __vpDiv10 = __div10(__vp);
+      const uint64_t __vmDiv10 = __div10(__vm);
+      if (__vpDiv10 <= __vmDiv10) {
+        break;
+      }
+      const uint64_t __vrDiv10 = __div10(__vr);
+      const uint32_t __vrMod10 = static_cast<uint32_t>(__vr) - 10 * static_cast<uint32_t>(__vrDiv10);
+      __roundUp = __vrMod10 >= 5;
+      __vr = __vrDiv10;
+      __vp = __vpDiv10;
+      __vm = __vmDiv10;
+      ++__removed;
+    }
+    // We need to take __vr + 1 if __vr is outside bounds or we need to round up.
+    _Output = __vr + (__vr == __vm || __roundUp);
+  }
+  const int32_t __exp = __e10 + __removed;
+
+  __floating_decimal_64 __fd;
+  __fd.__exponent = __exp;
+  __fd.__mantissa = _Output;
+  return __fd;
+}
+
+[[nodiscard]] _LIBCPP_HIDE_FROM_ABI inline to_chars_result __to_chars(char* const _First, char* const _Last, const __floating_decimal_64 __v,
+  chars_format _Fmt, const double __f) {
+  // Step 5: Print the decimal representation.
+  uint64_t _Output = __v.__mantissa;
+  int32_t _Ryu_exponent = __v.__exponent;
+  const uint32_t __olength = __decimalLength17(_Output);
+  int32_t _Scientific_exponent = _Ryu_exponent + static_cast<int32_t>(__olength) - 1;
+
+  if (_Fmt == chars_format{}) {
+    int32_t _Lower;
+    int32_t _Upper;
+
+    if (__olength == 1) {
+      // Value | Fixed   | Scientific
+      // 1e-3  | "0.001" | "1e-03"
+      // 1e4   | "10000" | "1e+04"
+      _Lower = -3;
+      _Upper = 4;
+    } else {
+      // Value   | Fixed       | Scientific
+      // 1234e-7 | "0.0001234" | "1.234e-04"
+      // 1234e5  | "123400000" | "1.234e+08"
+      _Lower = -static_cast<int32_t>(__olength + 3);
+      _Upper = 5;
+    }
+
+    if (_Lower <= _Ryu_exponent && _Ryu_exponent <= _Upper) {
+      _Fmt = chars_format::fixed;
+    } else {
+      _Fmt = chars_format::scientific;
+    }
+  } else if (_Fmt == chars_format::general) {
+    // C11 7.21.6.1 "The fprintf function"/8:
+    // "Let P equal [...] 6 if the precision is omitted [...].
+    // Then, if a conversion with style E would have an exponent of X:
+    // - if P > X >= -4, the conversion is with style f [...].
+    // - otherwise, the conversion is with style e [...]."
+    if (-4 <= _Scientific_exponent && _Scientific_exponent < 6) {
+      _Fmt = chars_format::fixed;
+    } else {
+      _Fmt = chars_format::scientific;
+    }
+  }
+
+  if (_Fmt == chars_format::fixed) {
+    // Example: _Output == 1729, __olength == 4
+
+    // _Ryu_exponent | Printed  | _Whole_digits | _Total_fixed_length  | Notes
+    // --------------|----------|---------------|----------------------|---------------------------------------
+    //             2 | 172900   |  6            | _Whole_digits        | Ryu can't be used for printing
+    //             1 | 17290    |  5            | (sometimes adjusted) | when the trimmed digits are nonzero.
+    // --------------|----------|---------------|----------------------|---------------------------------------
+    //             0 | 1729     |  4            | _Whole_digits        | Unified length cases.
+    // --------------|----------|---------------|----------------------|---------------------------------------
+    //            -1 | 172.9    |  3            | __olength + 1        | This case can't happen for
+    //            -2 | 17.29    |  2            |                      | __olength == 1, but no additional
+    //            -3 | 1.729    |  1            |                      | code is needed to avoid it.
+    // --------------|----------|---------------|----------------------|---------------------------------------
+    //            -4 | 0.1729   |  0            | 2 - _Ryu_exponent    | C11 7.21.6.1 "The fprintf function"/8:
+    //            -5 | 0.01729  | -1            |                      | "If a decimal-point character appears,
+    //            -6 | 0.001729 | -2            |                      | at least one digit appears before it."
+
+    const int32_t _Whole_digits = static_cast<int32_t>(__olength) + _Ryu_exponent;
+
+    uint32_t _Total_fixed_length;
+    if (_Ryu_exponent >= 0) { // cases "172900" and "1729"
+      _Total_fixed_length = static_cast<uint32_t>(_Whole_digits);
+      if (_Output == 1) {
+        // Rounding can affect the number of digits.
+        // For example, 1e23 is exactly "99999999999999991611392" which is 23 digits instead of 24.
+        // We can use a lookup table to detect this and adjust the total length.
+        static constexpr uint8_t _Adjustment[309] = {
+          0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,1,1,0,1,0,1,1,1,0,1,1,1,0,0,0,0,0,
+          1,1,0,0,1,0,1,1,1,0,0,0,0,1,1,1,1,0,0,0,1,1,1,1,0,0,0,1,1,1,1,0,1,0,1,0,1,1,0,0,0,0,1,1,1,
+          1,0,0,0,0,0,0,0,1,1,0,1,1,0,0,1,0,1,0,1,0,1,1,0,0,0,0,0,1,1,1,0,0,1,1,1,1,1,0,1,0,1,1,0,1,
+          1,0,0,0,0,0,0,0,0,0,1,1,1,0,0,1,0,0,1,0,0,1,1,1,1,0,0,1,1,0,1,1,0,1,1,0,1,0,0,0,1,0,0,0,1,
+          0,1,0,1,0,1,1,1,0,0,0,0,0,0,1,1,1,1,0,0,1,0,1,1,1,0,0,0,1,0,1,1,1,1,1,1,0,1,0,1,1,0,0,0,1,
+          1,1,0,1,1,0,0,0,1,0,0,0,1,0,1,0,0,0,0,0,0,0,1,0,1,1,0,0,1,1,1,0,0,0,1,0,1,0,0,0,0,0,1,1,0,
+          0,1,0,1,1,1,0,0,1,0,0,0,0,1,0,1,0,0,0,0,0,1,0,1,0,1,1,0,1,0,0,0,0,0,1,1,0,1,0 };
+        _Total_fixed_length -= _Adjustment[_Ryu_exponent];
+        // _Whole_digits doesn't need to be adjusted because these cases won't refer to it later.
+      }
+    } else if (_Whole_digits > 0) { // case "17.29"
+      _Total_fixed_length = __olength + 1;
+    } else { // case "0.001729"
+      _Total_fixed_length = static_cast<uint32_t>(2 - _Ryu_exponent);
+    }
+
+    if (_Last - _First < static_cast<ptrdiff_t>(_Total_fixed_length)) {
+      return { _Last, errc::value_too_large };
+    }
+
+    char* _Mid;
+    if (_Ryu_exponent > 0) { // case "172900"
+      bool _Can_use_ryu;
+
+      if (_Ryu_exponent > 22) { // 10^22 is the largest power of 10 that's exactly representable as a double.
+        _Can_use_ryu = false;
+      } else {
+        // Ryu generated X: __v.__mantissa * 10^_Ryu_exponent
+        // __v.__mantissa == 2^_Trailing_zero_bits * (__v.__mantissa >> _Trailing_zero_bits)
+        // 10^_Ryu_exponent == 2^_Ryu_exponent * 5^_Ryu_exponent
+
+        // _Trailing_zero_bits is [0, 56] (aside: because 2^56 is the largest power of 2
+        // with 17 decimal digits, which is double's round-trip limit.)
+        // _Ryu_exponent is [1, 22].
+        // Normalization adds [2, 52] (aside: at least 2 because the pre-normalized mantissa is at least 5).
+        // This adds up to [3, 130], which is well below double's maximum binary exponent 1023.
+
+        // Therefore, we just need to consider (__v.__mantissa >> _Trailing_zero_bits) * 5^_Ryu_exponent.
+
+        // If that product would exceed 53 bits, then X can't be exactly represented as a double.
+        // (That's not a problem for round-tripping, because X is close enough to the original double,
+        // but X isn't mathematically equal to the original double.) This requires a high-precision fallback.
+
+        // If the product is 53 bits or smaller, then X can be exactly represented as a double (and we don't
+        // need to re-synthesize it; the original double must have been X, because Ryu wouldn't produce the
+        // same output for two different doubles X and Y). This allows Ryu's output to be used (zero-filled).
+
+        // (2^53 - 1) / 5^0 (for indexing), (2^53 - 1) / 5^1, ..., (2^53 - 1) / 5^22
+        static constexpr uint64_t _Max_shifted_mantissa[23] = {
+          9007199254740991u, 1801439850948198u, 360287970189639u, 72057594037927u, 14411518807585u,
+          2882303761517u, 576460752303u, 115292150460u, 23058430092u, 4611686018u, 922337203u, 184467440u,
+          36893488u, 7378697u, 1475739u, 295147u, 59029u, 11805u, 2361u, 472u, 94u, 18u, 3u };
+
+        unsigned long _Trailing_zero_bits;
+#ifdef _LIBCPP_HAS_BITSCAN64
+        (void) _BitScanForward64(&_Trailing_zero_bits, __v.__mantissa); // __v.__mantissa is guaranteed nonzero
+#else // ^^^ 64-bit ^^^ / vvv 32-bit vvv
+        const uint32_t _Low_mantissa = static_cast<uint32_t>(__v.__mantissa);
+        if (_Low_mantissa != 0) {
+          (void) _BitScanForward(&_Trailing_zero_bits, _Low_mantissa);
+        } else {
+          const uint32_t _High_mantissa = static_cast<uint32_t>(__v.__mantissa >> 32); // nonzero here
+          (void) _BitScanForward(&_Trailing_zero_bits, _High_mantissa);
+          _Trailing_zero_bits += 32;
+        }
+#endif // ^^^ 32-bit ^^^
+        const uint64_t _Shifted_mantissa = __v.__mantissa >> _Trailing_zero_bits;
+        _Can_use_ryu = _Shifted_mantissa <= _Max_shifted_mantissa[_Ryu_exponent];
+      }
+
+      if (!_Can_use_ryu) {
+        // Print the integer exactly.
+        // Performance note: This will redundantly perform bounds checking.
+        // Performance note: This will redundantly decompose the IEEE representation.
+        return __d2fixed_buffered_n(_First, _Last, __f, 0);
+      }
+
+      // _Can_use_ryu
+      // Print the decimal digits, left-aligned within [_First, _First + _Total_fixed_length).
+      _Mid = _First + __olength;
+    } else { // cases "1729", "17.29", and "0.001729"
+      // Print the decimal digits, right-aligned within [_First, _First + _Total_fixed_length).
+      _Mid = _First + _Total_fixed_length;
+    }
+
+    // We prefer 32-bit operations, even on 64-bit platforms.
+    // We have at most 17 digits, and uint32_t can store 9 digits.
+    // If _Output doesn't fit into uint32_t, we cut off 8 digits,
+    // so the rest will fit into uint32_t.
+    if ((_Output >> 32) != 0) {
+      // Expensive 64-bit division.
+      const uint64_t __q = __div1e8(_Output);
+      uint32_t __output2 = static_cast<uint32_t>(_Output - 100000000 * __q);
+      _Output = __q;
+
+      const uint32_t __c = __output2 % 10000;
+      __output2 /= 10000;
+      const uint32_t __d = __output2 % 10000;
+      const uint32_t __c0 = (__c % 100) << 1;
+      const uint32_t __c1 = (__c / 100) << 1;
+      const uint32_t __d0 = (__d % 100) << 1;
+      const uint32_t __d1 = (__d / 100) << 1;
+
+      _VSTD::memcpy(_Mid -= 2, __DIGIT_TABLE + __c0, 2);
+      _VSTD::memcpy(_Mid -= 2, __DIGIT_TABLE + __c1, 2);
+      _VSTD::memcpy(_Mid -= 2, __DIGIT_TABLE + __d0, 2);
+      _VSTD::memcpy(_Mid -= 2, __DIGIT_TABLE + __d1, 2);
+    }
+    uint32_t __output2 = static_cast<uint32_t>(_Output);
+    while (__output2 >= 10000) {
+#ifdef __clang__ // TRANSITION, LLVM-38217
+      const uint32_t __c = __output2 - 10000 * (__output2 / 10000);
+#else
+      const uint32_t __c = __output2 % 10000;
+#endif
+      __output2 /= 10000;
+      const uint32_t __c0 = (__c % 100) << 1;
+      const uint32_t __c1 = (__c / 100) << 1;
+      _VSTD::memcpy(_Mid -= 2, __DIGIT_TABLE + __c0, 2);
+      _VSTD::memcpy(_Mid -= 2, __DIGIT_TABLE + __c1, 2);
+    }
+    if (__output2 >= 100) {
+      const uint32_t __c = (__output2 % 100) << 1;
+      __output2 /= 100;
+      _VSTD::memcpy(_Mid -= 2, __DIGIT_TABLE + __c, 2);
+    }
+    if (__output2 >= 10) {
+      const uint32_t __c = __output2 << 1;
+      _VSTD::memcpy(_Mid -= 2, __DIGIT_TABLE + __c, 2);
+    } else {
+      *--_Mid = static_cast<char>('0' + __output2);
+    }
+
+    if (_Ryu_exponent > 0) { // case "172900" with _Can_use_ryu
+      // Performance note: it might be more efficient to do this immediately after setting _Mid.
+      _VSTD::memset(_First + __olength, '0', static_cast<size_t>(_Ryu_exponent));
+    } else if (_Ryu_exponent == 0) { // case "1729"
+      // Done!
+    } else if (_Whole_digits > 0) { // case "17.29"
+      // Performance note: moving digits might not be optimal.
+      _VSTD::memmove(_First, _First + 1, static_cast<size_t>(_Whole_digits));
+      _First[_Whole_digits] = '.';
+    } else { // case "0.001729"
+      // Performance note: a larger memset() followed by overwriting '.' might be more efficient.
+      _First[0] = '0';
+      _First[1] = '.';
+      _VSTD::memset(_First + 2, '0', static_cast<size_t>(-_Whole_digits));
+    }
+
+    return { _First + _Total_fixed_length, errc{} };
+  }
+
+  const uint32_t _Total_scientific_length = __olength + (__olength > 1) // digits + possible decimal point
+    + (-100 < _Scientific_exponent && _Scientific_exponent < 100 ? 4 : 5); // + scientific exponent
+  if (_Last - _First < static_cast<ptrdiff_t>(_Total_scientific_length)) {
+    return { _Last, errc::value_too_large };
+  }
+  char* const __result = _First;
+
+  // Print the decimal digits.
+  uint32_t __i = 0;
+  // We prefer 32-bit operations, even on 64-bit platforms.
+  // We have at most 17 digits, and uint32_t can store 9 digits.
+  // If _Output doesn't fit into uint32_t, we cut off 8 digits,
+  // so the rest will fit into uint32_t.
+  if ((_Output >> 32) != 0) {
+    // Expensive 64-bit division.
+    const uint64_t __q = __div1e8(_Output);
+    uint32_t __output2 = static_cast<uint32_t>(_Output) - 100000000 * static_cast<uint32_t>(__q);
+    _Output = __q;
+
+    const uint32_t __c = __output2 % 10000;
+    __output2 /= 10000;
+    const uint32_t __d = __output2 % 10000;
+    const uint32_t __c0 = (__c % 100) << 1;
+    const uint32_t __c1 = (__c / 100) << 1;
+    const uint32_t __d0 = (__d % 100) << 1;
+    const uint32_t __d1 = (__d / 100) << 1;
+    _VSTD::memcpy(__result + __olength - __i - 1, __DIGIT_TABLE + __c0, 2);
+    _VSTD::memcpy(__result + __olength - __i - 3, __DIGIT_TABLE + __c1, 2);
+    _VSTD::memcpy(__result + __olength - __i - 5, __DIGIT_TABLE + __d0, 2);
+    _VSTD::memcpy(__result + __olength - __i - 7, __DIGIT_TABLE + __d1, 2);
+    __i += 8;
+  }
+  uint32_t __output2 = static_cast<uint32_t>(_Output);
+  while (__output2 >= 10000) {
+#ifdef __clang__ // TRANSITION, LLVM-38217
+    const uint32_t __c = __output2 - 10000 * (__output2 / 10000);
+#else
+    const uint32_t __c = __output2 % 10000;
+#endif
+    __output2 /= 10000;
+    const uint32_t __c0 = (__c % 100) << 1;
+    const uint32_t __c1 = (__c / 100) << 1;
+    _VSTD::memcpy(__result + __olength - __i - 1, __DIGIT_TABLE + __c0, 2);
+    _VSTD::memcpy(__result + __olength - __i - 3, __DIGIT_TABLE + __c1, 2);
+    __i += 4;
+  }
+  if (__output2 >= 100) {
+    const uint32_t __c = (__output2 % 100) << 1;
+    __output2 /= 100;
+    _VSTD::memcpy(__result + __olength - __i - 1, __DIGIT_TABLE + __c, 2);
+    __i += 2;
+  }
+  if (__output2 >= 10) {
+    const uint32_t __c = __output2 << 1;
+    // We can't use memcpy here: the decimal dot goes between these two digits.
+    __result[2] = __DIGIT_TABLE[__c + 1];
+    __result[0] = __DIGIT_TABLE[__c];
+  } else {
+    __result[0] = static_cast<char>('0' + __output2);
+  }
+
+  // Print decimal point if needed.
+  uint32_t __index;
+  if (__olength > 1) {
+    __result[1] = '.';
+    __index = __olength + 1;
+  } else {
+    __index = 1;
+  }
+
+  // Print the exponent.
+  __result[__index++] = 'e';
+  if (_Scientific_exponent < 0) {
+    __result[__index++] = '-';
+    _Scientific_exponent = -_Scientific_exponent;
+  } else {
+    __result[__index++] = '+';
+  }
+
+  if (_Scientific_exponent >= 100) {
+    const int32_t __c = _Scientific_exponent % 10;
+    _VSTD::memcpy(__result + __index, __DIGIT_TABLE + 2 * (_Scientific_exponent / 10), 2);
+    __result[__index + 2] = static_cast<char>('0' + __c);
+    __index += 3;
+  } else {
+    _VSTD::memcpy(__result + __index, __DIGIT_TABLE + 2 * _Scientific_exponent, 2);
+    __index += 2;
+  }
+
+  return { _First + _Total_scientific_length, errc{} };
+}
+
+[[nodiscard]] _LIBCPP_HIDE_FROM_ABI inline bool __d2d_small_int(const uint64_t __ieeeMantissa, const uint32_t __ieeeExponent,
+  __floating_decimal_64* const __v) {
+  const uint64_t __m2 = (1ull << __DOUBLE_MANTISSA_BITS) | __ieeeMantissa;
+  const int32_t __e2 = static_cast<int32_t>(__ieeeExponent) - __DOUBLE_BIAS - __DOUBLE_MANTISSA_BITS;
+
+  if (__e2 > 0) {
+    // f = __m2 * 2^__e2 >= 2^53 is an integer.
+    // Ignore this case for now.
+    return false;
+  }
+
+  if (__e2 < -52) {
+    // f < 1.
+    return false;
+  }
+
+  // Since 2^52 <= __m2 < 2^53 and 0 <= -__e2 <= 52: 1 <= f = __m2 / 2^-__e2 < 2^53.
+  // Test if the lower -__e2 bits of the significand are 0, i.e. whether the fraction is 0.
+  const uint64_t __mask = (1ull << -__e2) - 1;
+  const uint64_t __fraction = __m2 & __mask;
+  if (__fraction != 0) {
+    return false;
+  }
+
+  // f is an integer in the range [1, 2^53).
+  // Note: __mantissa might contain trailing (decimal) 0's.
+  // Note: since 2^53 < 10^16, there is no need to adjust __decimalLength17().
+  __v->__mantissa = __m2 >> -__e2;
+  __v->__exponent = 0;
+  return true;
+}
+
+[[nodiscard]] to_chars_result __d2s_buffered_n(char* const _First, char* const _Last, const double __f,
+  const chars_format _Fmt) {
+
+  // Step 1: Decode the floating-point number, and unify normalized and subnormal cases.
+  const uint64_t __bits = __double_to_bits(__f);
+
+  // Case distinction; exit early for the easy cases.
+  if (__bits == 0) {
+    if (_Fmt == chars_format::scientific) {
+      if (_Last - _First < 5) {
+        return { _Last, errc::value_too_large };
+      }
+
+      _VSTD::memcpy(_First, "0e+00", 5);
+
+      return { _First + 5, errc{} };
+    }
+
+    // Print "0" for chars_format::fixed, chars_format::general, and chars_format{}.
+    if (_First == _Last) {
+      return { _Last, errc::value_too_large };
+    }
+
+    *_First = '0';
+
+    return { _First + 1, errc{} };
+  }
+
+  // Decode __bits into mantissa and exponent.
+  const uint64_t __ieeeMantissa = __bits & ((1ull << __DOUBLE_MANTISSA_BITS) - 1);
+  const uint32_t __ieeeExponent = static_cast<uint32_t>(__bits >> __DOUBLE_MANTISSA_BITS);
+
+  if (_Fmt == chars_format::fixed) {
+    // const uint64_t _Mantissa2 = __ieeeMantissa | (1ull << __DOUBLE_MANTISSA_BITS); // restore implicit bit
+    const int32_t _Exponent2 = static_cast<int32_t>(__ieeeExponent)
+      - __DOUBLE_BIAS - __DOUBLE_MANTISSA_BITS; // bias and normalization
+
+    // Normal values are equal to _Mantissa2 * 2^_Exponent2.
+    // (Subnormals are different, but they'll be rejected by the _Exponent2 test here, so they can be ignored.)
+
+    // For nonzero integers, _Exponent2 >= -52. (The minimum value occurs when _Mantissa2 * 2^_Exponent2 is 1.
+    // In that case, _Mantissa2 is the implicit 1 bit followed by 52 zeros, so _Exponent2 is -52 to shift away
+    // the zeros.) The dense range of exactly representable integers has negative or zero exponents
+    // (as positive exponents make the range non-dense). For that dense range, Ryu will always be used:
+    // every digit is necessary to uniquely identify the value, so Ryu must print them all.
+
+    // Positive exponents are the non-dense range of exactly representable integers. This contains all of the values
+    // for which Ryu can't be used (and a few Ryu-friendly values). We can save time by detecting positive
+    // exponents here and skipping Ryu. Calling __d2fixed_buffered_n() with precision 0 is valid for all integers
+    // (so it's okay if we call it with a Ryu-friendly value).
+    if (_Exponent2 > 0) {
+      return __d2fixed_buffered_n(_First, _Last, __f, 0);
+    }
+  }
+
+  __floating_decimal_64 __v;
+  const bool __isSmallInt = __d2d_small_int(__ieeeMantissa, __ieeeExponent, &__v);
+  if (__isSmallInt) {
+    // For small integers in the range [1, 2^53), __v.__mantissa might contain trailing (decimal) zeros.
+    // For scientific notation we need to move these zeros into the exponent.
+    // (This is not needed for fixed-point notation, so it might be beneficial to trim
+    // trailing zeros in __to_chars only if needed - once fixed-point notation output is implemented.)
+    for (;;) {
+      const uint64_t __q = __div10(__v.__mantissa);
+      const uint32_t __r = static_cast<uint32_t>(__v.__mantissa) - 10 * static_cast<uint32_t>(__q);
+      if (__r != 0) {
+        break;
+      }
+      __v.__mantissa = __q;
+      ++__v.__exponent;
+    }
+  } else {
+    __v = __d2d(__ieeeMantissa, __ieeeExponent);
+  }
+
+  return __to_chars(_First, _Last, __v, _Fmt, __f);
+}
+
+_LIBCPP_END_NAMESPACE_STD
+
+// clang-format on
diff --git a/src/ryu/f2s.cpp b/src/ryu/f2s.cpp
new file mode 100644
index 0000000..7e10b49
--- /dev/null
+++ b/src/ryu/f2s.cpp
@@ -0,0 +1,715 @@
+//===----------------------------------------------------------------------===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+
+// Copyright (c) Microsoft Corporation.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+
+// Copyright 2018 Ulf Adams
+// Copyright (c) Microsoft Corporation. All rights reserved.
+
+// Boost Software License - Version 1.0 - August 17th, 2003
+
+// Permission is hereby granted, free of charge, to any person or organization
+// obtaining a copy of the software and accompanying documentation covered by
+// this license (the "Software") to use, reproduce, display, distribute,
+// execute, and transmit the Software, and to prepare derivative works of the
+// Software, and to permit third-parties to whom the Software is furnished to
+// do so, all subject to the following:
+
+// The copyright notices in the Software and this entire statement, including
+// the above license grant, this restriction and the following disclaimer,
+// must be included in all copies of the Software, in whole or in part, and
+// all derivative works of the Software, unless such copies or derivative
+// works are solely in the form of machine-executable object code generated by
+// a source language processor.
+
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT
+// SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE
+// FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,
+// ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+// DEALINGS IN THE SOFTWARE.
+
+// Avoid formatting to keep the changes with the original code minimal.
+// clang-format off
+
+#include "__config"
+#include "charconv"
+
+#include "include/ryu/common.h"
+#include "include/ryu/d2fixed.h"
+#include "include/ryu/d2s_intrinsics.h"
+#include "include/ryu/digit_table.h"
+#include "include/ryu/f2s.h"
+#include "include/ryu/ryu.h"
+
+_LIBCPP_BEGIN_NAMESPACE_STD
+
+inline constexpr int __FLOAT_MANTISSA_BITS = 23;
+inline constexpr int __FLOAT_EXPONENT_BITS = 8;
+inline constexpr int __FLOAT_BIAS = 127;
+
+inline constexpr int __FLOAT_POW5_INV_BITCOUNT = 59;
+inline constexpr uint64_t __FLOAT_POW5_INV_SPLIT[31] = {
+  576460752303423489u, 461168601842738791u, 368934881474191033u, 295147905179352826u,
+  472236648286964522u, 377789318629571618u, 302231454903657294u, 483570327845851670u,
+  386856262276681336u, 309485009821345069u, 495176015714152110u, 396140812571321688u,
+  316912650057057351u, 507060240091291761u, 405648192073033409u, 324518553658426727u,
+  519229685853482763u, 415383748682786211u, 332306998946228969u, 531691198313966350u,
+  425352958651173080u, 340282366920938464u, 544451787073501542u, 435561429658801234u,
+  348449143727040987u, 557518629963265579u, 446014903970612463u, 356811923176489971u,
+  570899077082383953u, 456719261665907162u, 365375409332725730u
+};
+inline constexpr int __FLOAT_POW5_BITCOUNT = 61;
+inline constexpr uint64_t __FLOAT_POW5_SPLIT[47] = {
+  1152921504606846976u, 1441151880758558720u, 1801439850948198400u, 2251799813685248000u,
+  1407374883553280000u, 1759218604441600000u, 2199023255552000000u, 1374389534720000000u,
+  1717986918400000000u, 2147483648000000000u, 1342177280000000000u, 1677721600000000000u,
+  2097152000000000000u, 1310720000000000000u, 1638400000000000000u, 2048000000000000000u,
+  1280000000000000000u, 1600000000000000000u, 2000000000000000000u, 1250000000000000000u,
+  1562500000000000000u, 1953125000000000000u, 1220703125000000000u, 1525878906250000000u,
+  1907348632812500000u, 1192092895507812500u, 1490116119384765625u, 1862645149230957031u,
+  1164153218269348144u, 1455191522836685180u, 1818989403545856475u, 2273736754432320594u,
+  1421085471520200371u, 1776356839400250464u, 2220446049250313080u, 1387778780781445675u,
+  1734723475976807094u, 2168404344971008868u, 1355252715606880542u, 1694065894508600678u,
+  2117582368135750847u, 1323488980084844279u, 1654361225106055349u, 2067951531382569187u,
+  1292469707114105741u, 1615587133892632177u, 2019483917365790221u
+};
+
+[[nodiscard]] _LIBCPP_HIDE_FROM_ABI inline uint32_t __pow5Factor(uint32_t __value) {
+  uint32_t __count = 0;
+  for (;;) {
+    _LIBCPP_ASSERT(__value != 0, "");
+    const uint32_t __q = __value / 5;
+    const uint32_t __r = __value % 5;
+    if (__r != 0) {
+      break;
+    }
+    __value = __q;
+    ++__count;
+  }
+  return __count;
+}
+
+// Returns true if __value is divisible by 5^__p.
+[[nodiscard]] _LIBCPP_HIDE_FROM_ABI inline bool __multipleOfPowerOf5(const uint32_t __value, const uint32_t __p) {
+  return __pow5Factor(__value) >= __p;
+}
+
+// Returns true if __value is divisible by 2^__p.
+[[nodiscard]] _LIBCPP_HIDE_FROM_ABI inline bool __multipleOfPowerOf2(const uint32_t __value, const uint32_t __p) {
+  _LIBCPP_ASSERT(__value != 0, "");
+  _LIBCPP_ASSERT(__p < 32, "");
+  // __builtin_ctz doesn't appear to be faster here.
+  return (__value & ((1u << __p) - 1)) == 0;
+}
+
+[[nodiscard]] _LIBCPP_HIDE_FROM_ABI inline uint32_t __mulShift(const uint32_t __m, const uint64_t __factor, const int32_t __shift) {
+  _LIBCPP_ASSERT(__shift > 32, "");
+
+  // The casts here help MSVC to avoid calls to the __allmul library
+  // function.
+  const uint32_t __factorLo = static_cast<uint32_t>(__factor);
+  const uint32_t __factorHi = static_cast<uint32_t>(__factor >> 32);
+  const uint64_t __bits0 = static_cast<uint64_t>(__m) * __factorLo;
+  const uint64_t __bits1 = static_cast<uint64_t>(__m) * __factorHi;
+
+#ifndef _LIBCPP_64_BIT
+  // On 32-bit platforms we can avoid a 64-bit shift-right since we only
+  // need the upper 32 bits of the result and the shift value is > 32.
+  const uint32_t __bits0Hi = static_cast<uint32_t>(__bits0 >> 32);
+  uint32_t __bits1Lo = static_cast<uint32_t>(__bits1);
+  uint32_t __bits1Hi = static_cast<uint32_t>(__bits1 >> 32);
+  __bits1Lo += __bits0Hi;
+  __bits1Hi += (__bits1Lo < __bits0Hi);
+  const int32_t __s = __shift - 32;
+  return (__bits1Hi << (32 - __s)) | (__bits1Lo >> __s);
+#else // ^^^ 32-bit ^^^ / vvv 64-bit vvv
+  const uint64_t __sum = (__bits0 >> 32) + __bits1;
+  const uint64_t __shiftedSum = __sum >> (__shift - 32);
+  _LIBCPP_ASSERT(__shiftedSum <= UINT32_MAX, "");
+  return static_cast<uint32_t>(__shiftedSum);
+#endif // ^^^ 64-bit ^^^
+}
+
+[[nodiscard]] _LIBCPP_HIDE_FROM_ABI inline uint32_t __mulPow5InvDivPow2(const uint32_t __m, const uint32_t __q, const int32_t __j) {
+  return __mulShift(__m, __FLOAT_POW5_INV_SPLIT[__q], __j);
+}
+
+[[nodiscard]] _LIBCPP_HIDE_FROM_ABI inline uint32_t __mulPow5divPow2(const uint32_t __m, const uint32_t __i, const int32_t __j) {
+  return __mulShift(__m, __FLOAT_POW5_SPLIT[__i], __j);
+}
+
+// A floating decimal representing m * 10^e.
+struct __floating_decimal_32 {
+  uint32_t __mantissa;
+  int32_t __exponent;
+};
+
+[[nodiscard]] _LIBCPP_HIDE_FROM_ABI inline __floating_decimal_32 __f2d(const uint32_t __ieeeMantissa, const uint32_t __ieeeExponent) {
+  int32_t __e2;
+  uint32_t __m2;
+  if (__ieeeExponent == 0) {
+    // We subtract 2 so that the bounds computation has 2 additional bits.
+    __e2 = 1 - __FLOAT_BIAS - __FLOAT_MANTISSA_BITS - 2;
+    __m2 = __ieeeMantissa;
+  } else {
+    __e2 = static_cast<int32_t>(__ieeeExponent) - __FLOAT_BIAS - __FLOAT_MANTISSA_BITS - 2;
+    __m2 = (1u << __FLOAT_MANTISSA_BITS) | __ieeeMantissa;
+  }
+  const bool __even = (__m2 & 1) == 0;
+  const bool __acceptBounds = __even;
+
+  // Step 2: Determine the interval of valid decimal representations.
+  const uint32_t __mv = 4 * __m2;
+  const uint32_t __mp = 4 * __m2 + 2;
+  // Implicit bool -> int conversion. True is 1, false is 0.
+  const uint32_t __mmShift = __ieeeMantissa != 0 || __ieeeExponent <= 1;
+  const uint32_t __mm = 4 * __m2 - 1 - __mmShift;
+
+  // Step 3: Convert to a decimal power base using 64-bit arithmetic.
+  uint32_t __vr, __vp, __vm;
+  int32_t __e10;
+  bool __vmIsTrailingZeros = false;
+  bool __vrIsTrailingZeros = false;
+  uint8_t __lastRemovedDigit = 0;
+  if (__e2 >= 0) {
+    const uint32_t __q = __log10Pow2(__e2);
+    __e10 = static_cast<int32_t>(__q);
+    const int32_t __k = __FLOAT_POW5_INV_BITCOUNT + __pow5bits(static_cast<int32_t>(__q)) - 1;
+    const int32_t __i = -__e2 + static_cast<int32_t>(__q) + __k;
+    __vr = __mulPow5InvDivPow2(__mv, __q, __i);
+    __vp = __mulPow5InvDivPow2(__mp, __q, __i);
+    __vm = __mulPow5InvDivPow2(__mm, __q, __i);
+    if (__q != 0 && (__vp - 1) / 10 <= __vm / 10) {
+      // We need to know one removed digit even if we are not going to loop below. We could use
+      // __q = X - 1 above, except that would require 33 bits for the result, and we've found that
+      // 32-bit arithmetic is faster even on 64-bit machines.
+      const int32_t __l = __FLOAT_POW5_INV_BITCOUNT + __pow5bits(static_cast<int32_t>(__q - 1)) - 1;
+      __lastRemovedDigit = static_cast<uint8_t>(__mulPow5InvDivPow2(__mv, __q - 1,
+        -__e2 + static_cast<int32_t>(__q) - 1 + __l) % 10);
+    }
+    if (__q <= 9) {
+      // The largest power of 5 that fits in 24 bits is 5^10, but __q <= 9 seems to be safe as well.
+      // Only one of __mp, __mv, and __mm can be a multiple of 5, if any.
+      if (__mv % 5 == 0) {
+        __vrIsTrailingZeros = __multipleOfPowerOf5(__mv, __q);
+      } else if (__acceptBounds) {
+        __vmIsTrailingZeros = __multipleOfPowerOf5(__mm, __q);
+      } else {
+        __vp -= __multipleOfPowerOf5(__mp, __q);
+      }
+    }
+  } else {
+    const uint32_t __q = __log10Pow5(-__e2);
+    __e10 = static_cast<int32_t>(__q) + __e2;
+    const int32_t __i = -__e2 - static_cast<int32_t>(__q);
+    const int32_t __k = __pow5bits(__i) - __FLOAT_POW5_BITCOUNT;
+    int32_t __j = static_cast<int32_t>(__q) - __k;
+    __vr = __mulPow5divPow2(__mv, static_cast<uint32_t>(__i), __j);
+    __vp = __mulPow5divPow2(__mp, static_cast<uint32_t>(__i), __j);
+    __vm = __mulPow5divPow2(__mm, static_cast<uint32_t>(__i), __j);
+    if (__q != 0 && (__vp - 1) / 10 <= __vm / 10) {
+      __j = static_cast<int32_t>(__q) - 1 - (__pow5bits(__i + 1) - __FLOAT_POW5_BITCOUNT);
+      __lastRemovedDigit = static_cast<uint8_t>(__mulPow5divPow2(__mv, static_cast<uint32_t>(__i + 1), __j) % 10);
+    }
+    if (__q <= 1) {
+      // {__vr,__vp,__vm} is trailing zeros if {__mv,__mp,__mm} has at least __q trailing 0 bits.
+      // __mv = 4 * __m2, so it always has at least two trailing 0 bits.
+      __vrIsTrailingZeros = true;
+      if (__acceptBounds) {
+        // __mm = __mv - 1 - __mmShift, so it has 1 trailing 0 bit iff __mmShift == 1.
+        __vmIsTrailingZeros = __mmShift == 1;
+      } else {
+        // __mp = __mv + 2, so it always has at least one trailing 0 bit.
+        --__vp;
+      }
+    } else if (__q < 31) { // TRANSITION(ulfjack): Use a tighter bound here.
+      __vrIsTrailingZeros = __multipleOfPowerOf2(__mv, __q - 1);
+    }
+  }
+
+  // Step 4: Find the shortest decimal representation in the interval of valid representations.
+  int32_t __removed = 0;
+  uint32_t _Output;
+  if (__vmIsTrailingZeros || __vrIsTrailingZeros) {
+    // General case, which happens rarely (~4.0%).
+    while (__vp / 10 > __vm / 10) {
+#ifdef __clang__ // TRANSITION, LLVM-23106
+      __vmIsTrailingZeros &= __vm - (__vm / 10) * 10 == 0;
+#else
+      __vmIsTrailingZeros &= __vm % 10 == 0;
+#endif
+      __vrIsTrailingZeros &= __lastRemovedDigit == 0;
+      __lastRemovedDigit = static_cast<uint8_t>(__vr % 10);
+      __vr /= 10;
+      __vp /= 10;
+      __vm /= 10;
+      ++__removed;
+    }
+    if (__vmIsTrailingZeros) {
+      while (__vm % 10 == 0) {
+        __vrIsTrailingZeros &= __lastRemovedDigit == 0;
+        __lastRemovedDigit = static_cast<uint8_t>(__vr % 10);
+        __vr /= 10;
+        __vp /= 10;
+        __vm /= 10;
+        ++__removed;
+      }
+    }
+    if (__vrIsTrailingZeros && __lastRemovedDigit == 5 && __vr % 2 == 0) {
+      // Round even if the exact number is .....50..0.
+      __lastRemovedDigit = 4;
+    }
+    // We need to take __vr + 1 if __vr is outside bounds or we need to round up.
+    _Output = __vr + ((__vr == __vm && (!__acceptBounds || !__vmIsTrailingZeros)) || __lastRemovedDigit >= 5);
+  } else {
+    // Specialized for the common case (~96.0%). Percentages below are relative to this.
+    // Loop iterations below (approximately):
+    // 0: 13.6%, 1: 70.7%, 2: 14.1%, 3: 1.39%, 4: 0.14%, 5+: 0.01%
+    while (__vp / 10 > __vm / 10) {
+      __lastRemovedDigit = static_cast<uint8_t>(__vr % 10);
+      __vr /= 10;
+      __vp /= 10;
+      __vm /= 10;
+      ++__removed;
+    }
+    // We need to take __vr + 1 if __vr is outside bounds or we need to round up.
+    _Output = __vr + (__vr == __vm || __lastRemovedDigit >= 5);
+  }
+  const int32_t __exp = __e10 + __removed;
+
+  __floating_decimal_32 __fd;
+  __fd.__exponent = __exp;
+  __fd.__mantissa = _Output;
+  return __fd;
+}
+
+[[nodiscard]] _LIBCPP_HIDE_FROM_ABI inline to_chars_result _Large_integer_to_chars(char* const _First, char* const _Last,
+  const uint32_t _Mantissa2, const int32_t _Exponent2) {
+
+  // Print the integer _Mantissa2 * 2^_Exponent2 exactly.
+
+  // For nonzero integers, _Exponent2 >= -23. (The minimum value occurs when _Mantissa2 * 2^_Exponent2 is 1.
+  // In that case, _Mantissa2 is the implicit 1 bit followed by 23 zeros, so _Exponent2 is -23 to shift away
+  // the zeros.) The dense range of exactly representable integers has negative or zero exponents
+  // (as positive exponents make the range non-dense). For that dense range, Ryu will always be used:
+  // every digit is necessary to uniquely identify the value, so Ryu must print them all.
+
+  // Positive exponents are the non-dense range of exactly representable integers.
+  // This contains all of the values for which Ryu can't be used (and a few Ryu-friendly values).
+
+  // Performance note: Long division appears to be faster than losslessly widening float to double and calling
+  // __d2fixed_buffered_n(). If __f2fixed_buffered_n() is implemented, it might be faster than long division.
+
+  _LIBCPP_ASSERT(_Exponent2 > 0, "");
+  _LIBCPP_ASSERT(_Exponent2 <= 104, ""); // because __ieeeExponent <= 254
+
+  // Manually represent _Mantissa2 * 2^_Exponent2 as a large integer. _Mantissa2 is always 24 bits
+  // (due to the implicit bit), while _Exponent2 indicates a shift of at most 104 bits.
+  // 24 + 104 equals 128 equals 4 * 32, so we need exactly 4 32-bit elements.
+  // We use a little-endian representation, visualized like this:
+
+  // << left shift <<
+  // most significant
+  // _Data[3] _Data[2] _Data[1] _Data[0]
+  //                   least significant
+  //                   >> right shift >>
+
+  constexpr uint32_t _Data_size = 4;
+  uint32_t _Data[_Data_size]{};
+
+  // _Maxidx is the index of the most significant nonzero element.
+  uint32_t _Maxidx = ((24 + static_cast<uint32_t>(_Exponent2) + 31) / 32) - 1;
+  _LIBCPP_ASSERT(_Maxidx < _Data_size, "");
+
+  const uint32_t _Bit_shift = static_cast<uint32_t>(_Exponent2) % 32;
+  if (_Bit_shift <= 8) { // _Mantissa2's 24 bits don't cross an element boundary
+    _Data[_Maxidx] = _Mantissa2 << _Bit_shift;
+  } else { // _Mantissa2's 24 bits cross an element boundary
+    _Data[_Maxidx - 1] = _Mantissa2 << _Bit_shift;
+    _Data[_Maxidx] = _Mantissa2 >> (32 - _Bit_shift);
+  }
+
+  // If Ryu hasn't determined the total output length, we need to buffer the digits generated from right to left
+  // by long division. The largest possible float is: 340'282346638'528859811'704183484'516925440
+  uint32_t _Blocks[4];
+  int32_t _Filled_blocks = 0;
+  // From left to right, we're going to print:
+  // _Data[0] will be [1, 10] digits.
+  // Then if _Filled_blocks > 0:
+  // _Blocks[_Filled_blocks - 1], ..., _Blocks[0] will be 0-filled 9-digit blocks.
+
+  if (_Maxidx != 0) { // If the integer is actually large, perform long division.
+                      // Otherwise, skip to printing _Data[0].
+    for (;;) {
+      // Loop invariant: _Maxidx != 0 (i.e. the integer is actually large)
+
+      const uint32_t _Most_significant_elem = _Data[_Maxidx];
+      const uint32_t _Initial_remainder = _Most_significant_elem % 1000000000;
+      const uint32_t _Initial_quotient = _Most_significant_elem / 1000000000;
+      _Data[_Maxidx] = _Initial_quotient;
+      uint64_t _Remainder = _Initial_remainder;
+
+      // Process less significant elements.
+      uint32_t _Idx = _Maxidx;
+      do {
+        --_Idx; // Initially, _Remainder is at most 10^9 - 1.
+
+        // Now, _Remainder is at most (10^9 - 1) * 2^32 + 2^32 - 1, simplified to 10^9 * 2^32 - 1.
+        _Remainder = (_Remainder << 32) | _Data[_Idx];
+
+        // floor((10^9 * 2^32 - 1) / 10^9) == 2^32 - 1, so uint32_t _Quotient is lossless.
+        const uint32_t _Quotient = static_cast<uint32_t>(__div1e9(_Remainder));
+
+        // _Remainder is at most 10^9 - 1 again.
+        // For uint32_t truncation, see the __mod1e9() comment in d2s_intrinsics.h.
+        _Remainder = static_cast<uint32_t>(_Remainder) - 1000000000u * _Quotient;
+
+        _Data[_Idx] = _Quotient;
+      } while (_Idx != 0);
+
+      // Store a 0-filled 9-digit block.
+      _Blocks[_Filled_blocks++] = static_cast<uint32_t>(_Remainder);
+
+      if (_Initial_quotient == 0) { // Is the large integer shrinking?
+        --_Maxidx; // log2(10^9) is 29.9, so we can't shrink by more than one element.
+        if (_Maxidx == 0) {
+          break; // We've finished long division. Now we need to print _Data[0].
+        }
+      }
+    }
+  }
+
+  _LIBCPP_ASSERT(_Data[0] != 0, "");
+  for (uint32_t _Idx = 1; _Idx < _Data_size; ++_Idx) {
+    _LIBCPP_ASSERT(_Data[_Idx] == 0, "");
+  }
+
+  const uint32_t _Data_olength = _Data[0] >= 1000000000 ? 10 : __decimalLength9(_Data[0]);
+  const uint32_t _Total_fixed_length = _Data_olength + 9 * _Filled_blocks;
+
+  if (_Last - _First < static_cast<ptrdiff_t>(_Total_fixed_length)) {
+    return { _Last, errc::value_too_large };
+  }
+
+  char* _Result = _First;
+
+  // Print _Data[0]. While it's up to 10 digits,
+  // which is more than Ryu generates, the code below can handle this.
+  __append_n_digits(_Data_olength, _Data[0], _Result);
+  _Result += _Data_olength;
+
+  // Print 0-filled 9-digit blocks.
+  for (int32_t _Idx = _Filled_blocks - 1; _Idx >= 0; --_Idx) {
+    __append_nine_digits(_Blocks[_Idx], _Result);
+    _Result += 9;
+  }
+
+  return { _Result, errc{} };
+}
+
+[[nodiscard]] _LIBCPP_HIDE_FROM_ABI inline to_chars_result __to_chars(char* const _First, char* const _Last, const __floating_decimal_32 __v,
+  chars_format _Fmt, const uint32_t __ieeeMantissa, const uint32_t __ieeeExponent) {
+  // Step 5: Print the decimal representation.
+  uint32_t _Output = __v.__mantissa;
+  int32_t _Ryu_exponent = __v.__exponent;
+  const uint32_t __olength = __decimalLength9(_Output);
+  int32_t _Scientific_exponent = _Ryu_exponent + static_cast<int32_t>(__olength) - 1;
+
+  if (_Fmt == chars_format{}) {
+    int32_t _Lower;
+    int32_t _Upper;
+
+    if (__olength == 1) {
+      // Value | Fixed   | Scientific
+      // 1e-3  | "0.001" | "1e-03"
+      // 1e4   | "10000" | "1e+04"
+      _Lower = -3;
+      _Upper = 4;
+    } else {
+      // Value   | Fixed       | Scientific
+      // 1234e-7 | "0.0001234" | "1.234e-04"
+      // 1234e5  | "123400000" | "1.234e+08"
+      _Lower = -static_cast<int32_t>(__olength + 3);
+      _Upper = 5;
+    }
+
+    if (_Lower <= _Ryu_exponent && _Ryu_exponent <= _Upper) {
+      _Fmt = chars_format::fixed;
+    } else {
+      _Fmt = chars_format::scientific;
+    }
+  } else if (_Fmt == chars_format::general) {
+    // C11 7.21.6.1 "The fprintf function"/8:
+    // "Let P equal [...] 6 if the precision is omitted [...].
+    // Then, if a conversion with style E would have an exponent of X:
+    // - if P > X >= -4, the conversion is with style f [...].
+    // - otherwise, the conversion is with style e [...]."
+    if (-4 <= _Scientific_exponent && _Scientific_exponent < 6) {
+      _Fmt = chars_format::fixed;
+    } else {
+      _Fmt = chars_format::scientific;
+    }
+  }
+
+  if (_Fmt == chars_format::fixed) {
+    // Example: _Output == 1729, __olength == 4
+
+    // _Ryu_exponent | Printed  | _Whole_digits | _Total_fixed_length  | Notes
+    // --------------|----------|---------------|----------------------|---------------------------------------
+    //             2 | 172900   |  6            | _Whole_digits        | Ryu can't be used for printing
+    //             1 | 17290    |  5            | (sometimes adjusted) | when the trimmed digits are nonzero.
+    // --------------|----------|---------------|----------------------|---------------------------------------
+    //             0 | 1729     |  4            | _Whole_digits        | Unified length cases.
+    // --------------|----------|---------------|----------------------|---------------------------------------
+    //            -1 | 172.9    |  3            | __olength + 1        | This case can't happen for
+    //            -2 | 17.29    |  2            |                      | __olength == 1, but no additional
+    //            -3 | 1.729    |  1            |                      | code is needed to avoid it.
+    // --------------|----------|---------------|----------------------|---------------------------------------
+    //            -4 | 0.1729   |  0            | 2 - _Ryu_exponent    | C11 7.21.6.1 "The fprintf function"/8:
+    //            -5 | 0.01729  | -1            |                      | "If a decimal-point character appears,
+    //            -6 | 0.001729 | -2            |                      | at least one digit appears before it."
+
+    const int32_t _Whole_digits = static_cast<int32_t>(__olength) + _Ryu_exponent;
+
+    uint32_t _Total_fixed_length;
+    if (_Ryu_exponent >= 0) { // cases "172900" and "1729"
+      _Total_fixed_length = static_cast<uint32_t>(_Whole_digits);
+      if (_Output == 1) {
+        // Rounding can affect the number of digits.
+        // For example, 1e11f is exactly "99999997952" which is 11 digits instead of 12.
+        // We can use a lookup table to detect this and adjust the total length.
+        static constexpr uint8_t _Adjustment[39] = {
+          0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,1,0,1,1,1,0,0,1,1,0,1,0,1,1,0,0,1,0,1,1,0,1,1,1 };
+        _Total_fixed_length -= _Adjustment[_Ryu_exponent];
+        // _Whole_digits doesn't need to be adjusted because these cases won't refer to it later.
+      }
+    } else if (_Whole_digits > 0) { // case "17.29"
+      _Total_fixed_length = __olength + 1;
+    } else { // case "0.001729"
+      _Total_fixed_length = static_cast<uint32_t>(2 - _Ryu_exponent);
+    }
+
+    if (_Last - _First < static_cast<ptrdiff_t>(_Total_fixed_length)) {
+      return { _Last, errc::value_too_large };
+    }
+
+    char* _Mid;
+    if (_Ryu_exponent > 0) { // case "172900"
+      bool _Can_use_ryu;
+
+      if (_Ryu_exponent > 10) { // 10^10 is the largest power of 10 that's exactly representable as a float.
+        _Can_use_ryu = false;
+      } else {
+        // Ryu generated X: __v.__mantissa * 10^_Ryu_exponent
+        // __v.__mantissa == 2^_Trailing_zero_bits * (__v.__mantissa >> _Trailing_zero_bits)
+        // 10^_Ryu_exponent == 2^_Ryu_exponent * 5^_Ryu_exponent
+
+        // _Trailing_zero_bits is [0, 29] (aside: because 2^29 is the largest power of 2
+        // with 9 decimal digits, which is float's round-trip limit.)
+        // _Ryu_exponent is [1, 10].
+        // Normalization adds [2, 23] (aside: at least 2 because the pre-normalized mantissa is at least 5).
+        // This adds up to [3, 62], which is well below float's maximum binary exponent 127.
+
+        // Therefore, we just need to consider (__v.__mantissa >> _Trailing_zero_bits) * 5^_Ryu_exponent.
+
+        // If that product would exceed 24 bits, then X can't be exactly represented as a float.
+        // (That's not a problem for round-tripping, because X is close enough to the original float,
+        // but X isn't mathematically equal to the original float.) This requires a high-precision fallback.
+
+        // If the product is 24 bits or smaller, then X can be exactly represented as a float (and we don't
+        // need to re-synthesize it; the original float must have been X, because Ryu wouldn't produce the
+        // same output for two different floats X and Y). This allows Ryu's output to be used (zero-filled).
+
+        // (2^24 - 1) / 5^0 (for indexing), (2^24 - 1) / 5^1, ..., (2^24 - 1) / 5^10
+        static constexpr uint32_t _Max_shifted_mantissa[11] = {
+          16777215, 3355443, 671088, 134217, 26843, 5368, 1073, 214, 42, 8, 1 };
+
+        unsigned long _Trailing_zero_bits;
+        (void) _BitScanForward(&_Trailing_zero_bits, __v.__mantissa); // __v.__mantissa is guaranteed nonzero
+        const uint32_t _Shifted_mantissa = __v.__mantissa >> _Trailing_zero_bits;
+        _Can_use_ryu = _Shifted_mantissa <= _Max_shifted_mantissa[_Ryu_exponent];
+      }
+
+      if (!_Can_use_ryu) {
+        const uint32_t _Mantissa2 = __ieeeMantissa | (1u << __FLOAT_MANTISSA_BITS); // restore implicit bit
+        const int32_t _Exponent2 = static_cast<int32_t>(__ieeeExponent)
+          - __FLOAT_BIAS - __FLOAT_MANTISSA_BITS; // bias and normalization
+
+        // Performance note: We've already called Ryu, so this will redundantly perform buffering and bounds checking.
+        return _Large_integer_to_chars(_First, _Last, _Mantissa2, _Exponent2);
+      }
+
+      // _Can_use_ryu
+      // Print the decimal digits, left-aligned within [_First, _First + _Total_fixed_length).
+      _Mid = _First + __olength;
+    } else { // cases "1729", "17.29", and "0.001729"
+      // Print the decimal digits, right-aligned within [_First, _First + _Total_fixed_length).
+      _Mid = _First + _Total_fixed_length;
+    }
+
+    while (_Output >= 10000) {
+#ifdef __clang__ // TRANSITION, LLVM-38217
+      const uint32_t __c = _Output - 10000 * (_Output / 10000);
+#else
+      const uint32_t __c = _Output % 10000;
+#endif
+      _Output /= 10000;
+      const uint32_t __c0 = (__c % 100) << 1;
+      const uint32_t __c1 = (__c / 100) << 1;
+      _VSTD::memcpy(_Mid -= 2, __DIGIT_TABLE + __c0, 2);
+      _VSTD::memcpy(_Mid -= 2, __DIGIT_TABLE + __c1, 2);
+    }
+    if (_Output >= 100) {
+      const uint32_t __c = (_Output % 100) << 1;
+      _Output /= 100;
+      _VSTD::memcpy(_Mid -= 2, __DIGIT_TABLE + __c, 2);
+    }
+    if (_Output >= 10) {
+      const uint32_t __c = _Output << 1;
+      _VSTD::memcpy(_Mid -= 2, __DIGIT_TABLE + __c, 2);
+    } else {
+      *--_Mid = static_cast<char>('0' + _Output);
+    }
+
+    if (_Ryu_exponent > 0) { // case "172900" with _Can_use_ryu
+      // Performance note: it might be more efficient to do this immediately after setting _Mid.
+      _VSTD::memset(_First + __olength, '0', static_cast<size_t>(_Ryu_exponent));
+    } else if (_Ryu_exponent == 0) { // case "1729"
+      // Done!
+    } else if (_Whole_digits > 0) { // case "17.29"
+      // Performance note: moving digits might not be optimal.
+      _VSTD::memmove(_First, _First + 1, static_cast<size_t>(_Whole_digits));
+      _First[_Whole_digits] = '.';
+    } else { // case "0.001729"
+      // Performance note: a larger memset() followed by overwriting '.' might be more efficient.
+      _First[0] = '0';
+      _First[1] = '.';
+      _VSTD::memset(_First + 2, '0', static_cast<size_t>(-_Whole_digits));
+    }
+
+    return { _First + _Total_fixed_length, errc{} };
+  }
+
+  const uint32_t _Total_scientific_length =
+    __olength + (__olength > 1) + 4; // digits + possible decimal point + scientific exponent
+  if (_Last - _First < static_cast<ptrdiff_t>(_Total_scientific_length)) {
+    return { _Last, errc::value_too_large };
+  }
+  char* const __result = _First;
+
+  // Print the decimal digits.
+  uint32_t __i = 0;
+  while (_Output >= 10000) {
+#ifdef __clang__ // TRANSITION, LLVM-38217
+    const uint32_t __c = _Output - 10000 * (_Output / 10000);
+#else
+    const uint32_t __c = _Output % 10000;
+#endif
+    _Output /= 10000;
+    const uint32_t __c0 = (__c % 100) << 1;
+    const uint32_t __c1 = (__c / 100) << 1;
+    _VSTD::memcpy(__result + __olength - __i - 1, __DIGIT_TABLE + __c0, 2);
+    _VSTD::memcpy(__result + __olength - __i - 3, __DIGIT_TABLE + __c1, 2);
+    __i += 4;
+  }
+  if (_Output >= 100) {
+    const uint32_t __c = (_Output % 100) << 1;
+    _Output /= 100;
+    _VSTD::memcpy(__result + __olength - __i - 1, __DIGIT_TABLE + __c, 2);
+    __i += 2;
+  }
+  if (_Output >= 10) {
+    const uint32_t __c = _Output << 1;
+    // We can't use memcpy here: the decimal dot goes between these two digits.
+    __result[2] = __DIGIT_TABLE[__c + 1];
+    __result[0] = __DIGIT_TABLE[__c];
+  } else {
+    __result[0] = static_cast<char>('0' + _Output);
+  }
+
+  // Print decimal point if needed.
+  uint32_t __index;
+  if (__olength > 1) {
+    __result[1] = '.';
+    __index = __olength + 1;
+  } else {
+    __index = 1;
+  }
+
+  // Print the exponent.
+  __result[__index++] = 'e';
+  if (_Scientific_exponent < 0) {
+    __result[__index++] = '-';
+    _Scientific_exponent = -_Scientific_exponent;
+  } else {
+    __result[__index++] = '+';
+  }
+
+  _VSTD::memcpy(__result + __index, __DIGIT_TABLE + 2 * _Scientific_exponent, 2);
+  __index += 2;
+
+  return { _First + _Total_scientific_length, errc{} };
+}
+
+[[nodiscard]] to_chars_result __f2s_buffered_n(char* const _First, char* const _Last, const float __f,
+  const chars_format _Fmt) {
+
+  // Step 1: Decode the floating-point number, and unify normalized and subnormal cases.
+  const uint32_t __bits = __float_to_bits(__f);
+
+  // Case distinction; exit early for the easy cases.
+  if (__bits == 0) {
+    if (_Fmt == chars_format::scientific) {
+      if (_Last - _First < 5) {
+        return { _Last, errc::value_too_large };
+      }
+
+      _VSTD::memcpy(_First, "0e+00", 5);
+
+      return { _First + 5, errc{} };
+    }
+
+    // Print "0" for chars_format::fixed, chars_format::general, and chars_format{}.
+    if (_First == _Last) {
+      return { _Last, errc::value_too_large };
+    }
+
+    *_First = '0';
+
+    return { _First + 1, errc{} };
+  }
+
+  // Decode __bits into mantissa and exponent.
+  const uint32_t __ieeeMantissa = __bits & ((1u << __FLOAT_MANTISSA_BITS) - 1);
+  const uint32_t __ieeeExponent = __bits >> __FLOAT_MANTISSA_BITS;
+
+  // When _Fmt == chars_format::fixed and the floating-point number is a large integer,
+  // it's faster to skip Ryu and immediately print the integer exactly.
+  if (_Fmt == chars_format::fixed) {
+    const uint32_t _Mantissa2 = __ieeeMantissa | (1u << __FLOAT_MANTISSA_BITS); // restore implicit bit
+    const int32_t _Exponent2 = static_cast<int32_t>(__ieeeExponent)
+      - __FLOAT_BIAS - __FLOAT_MANTISSA_BITS; // bias and normalization
+
+    // Normal values are equal to _Mantissa2 * 2^_Exponent2.
+    // (Subnormals are different, but they'll be rejected by the _Exponent2 test here, so they can be ignored.)
+
+    if (_Exponent2 > 0) {
+      return _Large_integer_to_chars(_First, _Last, _Mantissa2, _Exponent2);
+    }
+  }
+
+  const __floating_decimal_32 __v = __f2d(__ieeeMantissa, __ieeeExponent);
+  return __to_chars(_First, _Last, __v, _Fmt, __ieeeMantissa, __ieeeExponent);
+}
+
+_LIBCPP_END_NAMESPACE_STD
+
+// clang-format on